コードから管理者権限でスクリプトを実行する

VistaではUACが有効だと何でもかんでも止められてしまう。

そういえばバッチファイルやWSHでサービスとかレジストリとかいじるのはどうなるのか、と思ったら案の定アクセス拒否される。

管理者コマンドプロンプトを自分で開くと言う手はあるが、面倒。プログラムなりコマンドなりで昇格できないのか……と思ったが、簡単な手はないようだ。

一応最後のblog記事にサンプルがある。Vistaの場合は昇格状態でスクリプトを起動し直す、という流れのようだ。

というわけでJScript大好きな私もちょっと書いてみた。こちらはVistaで動かすのが前提なので手抜き。

実行すると指定のサービスのon/offを行う。ポイントは2点。

  1. ShellExecute関数の第4引数は動詞(verb)なのだが、これにrunasを指定するとUACが起動する。しかしMSDNには記述がない。
  2. ShellExecuteで余分な引数を追加し、その直後にQuitすることで2度目のスクリプト実行に処理を引き継ぐ。
if(WScript.Arguments.length == 0) {
	var sh = WScript.CreateObject("Shell.Application")
	sh.ShellExecute("wscript.exe", "\"" + WScript.ScriptFullName + "\"" + " uac", "", "runas", 1);
	WScript.Quit(0);
}

var ADS_SERVICE_STOPPED = 1;
var ADS_SERVICE_RUNNING = 4;

var computer = GetObject("WinNT://computerName, computer");
var service = computer.GetObject("Service", "serviceName");
if(service.Status == ADS_SERVICE_STOPPED){
	WScript.Echo("サービスを開始します");
	service.Start();
} else if (service.Status == ADS_SERVICE_RUNNING) {
	WScript.Echo("サービスを終了します");
	service.Stop();
} else {
	WScript.Echo("サービス状態が不明です");
}

サービス上げ下げの処理はこちらを参考にした。

http://support.microsoft.com/kb/247557/ja

IronRuby0.9をためしてみた

※(8/8)いろいろ事実誤認があったので訂正しています。

(批判とかではなく単なる報告なので、どうか誤解なきよう……)

IronRuby0.9が出た件。

http://blog.jimmy.schementi.com/2009/08/ironruby-09-released.html


0.4や0.5のときにちょっとためしてそれっきりだったけど、Win32OLEが動くと聞いてちょっと食指が動く。


で、ためしてみた。しかしかゆいところが未実装、というのが少なからずあり。

やってみたこと

System.Data.SqlClientが使えた

mscorlib、System.Data、System.Data.SqlClientをrequireするだけ。

あとはSqlConnection - SqlCommand - SqlDataAdapter - DataSetという超基本コンボ。

やはり生で使うと面倒くさい。これならWin32OLE+ADOでいいんじゃないか。あるいはActiveRecord

でも動くことに意義がある。

System.Data.OracleClientが使えなかった使えた

System.Data.OracleClientをrequireしても「ファイルがない」と言われる。OledbClientも不可。なんじゃろ。

→require 'System.Data.OracleClient, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' と書けばよい。

System.Data.OleDbはSystem.DataをIncludeすれば使える。ていうかOleDbClientなんてないよ! アホか俺!


System.Dataが一発でrequireできるのは、lib/IronRuby/System.Data.rbというショートカットが作られているためだった。

httpでダウンロードできた

open-uriで1行コード。

open("url"){|f| f.line {|line| puts line}}

普通に動く。

文字コードが変換できない

utf-8のwebページを出力すると化けるので、変換しようと思ったらKConvが動かない。

irb(main):002:0> require 'kconv'
=> true
irb(main):003:0> 'あいうえお'.tosjis
NoMethodError: undefined method `nkf' for NKF:Module

なぜかと思ったらNKFがスタブだった。定数しか定義されていない。


実装した、みたいなMLの投稿も見かけたが、「プラットフォーム依存になるけどどうする?」と但し書きがあった。

http://rubyforge.org/pipermail/ironruby-core/2008-May/001834.html

Iconvも期待通りに動かない。

irb(main):006:0* require 'iconv'
=> true
irb(main):007:0> Iconv.iconv('SHIFT_JIS', 'UTF-8', 'あいうえお')
=> nil

文字コード周りはまだまだ、ということか。フィードバックはどうすればいいんだろう。

System.Text.Encodingを使えと? あるいはUTF-8で通すか?


→ildasmでIronRuby.Libraries.dllをのぞいてみたら、一応Iconvクラスの中にEncoder/Decoderを使った処理が入っているようだった。じゃあ動きそうなものだが……

gemがうまく動かない。

igem(IronRuby版gem)でもろもろインストールしてみた。前のリリースではgemそのものも普通rubyから持ってくる必要があったが、今回は同梱。

で、activerecordの導入中にriのインストールがこける。

Installing ri documentation for activerecord-2.1.1...
ERROR:  While executing gem ... (NoMethodError)
   undefined method `<<' for nil:NilClass

install successfulとはいうものの、igem listしてもlocal gemsが認識されない。

IronRuby側のgemフォルダをGEM_PATHを設定してみるが、だめ。

ふつうrubyのほうを設定する(つまりgemをrubyと共有)すると、igemでもリストされるようになった。


ただiirbからrequireすると「ファイルが見つからない」といわれる。

irb(main):001:0> require 'activerecord'
LoadError: no such file to load -- activerecord
       from :0:in `require'
       from (irb):1
       from :0:in `eval'

何がいけないんだ…

ExcelをWin32OLEで操作できた

るびまのサンプルが動いた。

http://jp.rubyist.net/magazine/?0004-Win32OLE


ただole_method_helpやole_obj_helpは未実装でした。irbでちくちくやるのには向かない。

IronRubyでSilverlightに挑戦してみた


Visual Web Developer SP1 + Silverlight Tools RC0でSilverlight開発ができるようになった、というのであれこれ試している。コンパイルが面倒なのでC#をすっとばしてDLR。

クライアント(Webだけど)からCLRを直接たたけるというので夢が広がりまくるわけだが、なかなか敷居が高い。


Javascriptならそこそこ知識があるので楽なんだけど、なんとなく新しいものにチャレンジしたいということでRubyに挑戦しているが、いろいろ面倒な点がある。どうもDLRはManaged JScriptを前提に作られている節があって、SDKドキュメントにもRubyPythonでの作り方は書かれていない。

Dynamic Languages SDKのサイトにも特に注意書きがない。おかげで迷うこと甚だしい。


現時点で引っかかった点のまとめ。

  • VWDでXAMLGUI編集ができない>ソースをいじるとGUIプレビュー画面には反映されるけど、GUI側に部品を配置することができない。そういうものか?
  • SilverlightAPIRubyで呼ぶときはAPI名が変わる
    • FindName→find_name、GetValue→get_value、GetPosition→get_position等
  • Rubyの変数をHtmlPage.Window.Alertに渡すとき、いちいちto_sしないとエラーになる。自動で型変換してほしい。
  • XAML要素の色を変えるとき、JScriptならxxxx.Fill = "色名"で変えられるのだが、Rubyだと色名が受け入れられない。Brushオブジェクトを直接代入する必要がある。
    • xxxx.Fill = SolidColorBrush.new(Colors.Green)
  • ドラッグアンドドロップを実装しようとしたが、サンプルではXAML要素の座標をxxxx.Canvas.Top/Leftで操作している。しかしRubyでは「Canvasメソッドがない」がないと言われて呼べない。
  • GetValueメソッドを使えば読むことはできた。→xxxx.get_value(Canvas.TopProperty)
    • しかしSetValueメソッドがMethodAccessExceptionで止まる


座標を読めても書けないということがわかって、もうお手上げ。テキストの修正とかはRubyでもよくサンプルを見かけるけど、そのくらいしかできないということなのか。


UI操作はあきらめてロジック記述に集中するか……

FP法:実践編

ケーススタディをやったのだが、その中で指摘された注意点をピックアップ。

  • 必ず「アプリケーション境界の確定>データファンクションの識別>トランザクションファンクションの識別」の順で分析する
  • 100FPの規模を1時間で見積もりできれば上等
  • DETは境界を越えなくてはいけない
  • マスタからリストを取得するような処理を複数機能で使っている場合、取得処理をEQとして切り出せば他で重複して計上する必要はない。(再利用)

FP法:詳細編

FP法の勉強まとめ、その2。

FP法とは

FP法の目的

  • ユーザの求める・受け取る機能に基づいて計測する
  • 使用する技術とは関係なく計測する
  • 組織を超えて一貫した、規模見積もりの手法を定義
  • 計測の手間を最小限にするシンプルな手法

ユーザとは何か

※ユーザとは洗練されたユーザを指す。エンドユーザではない。

※ユーザはロジックを理解するが、技術者ではない

  • 要件を与える立場 技術とは独立している
  • 受け入れテストに参加する
  • 情報の流れを理解している
  • 担当分野についてのエキスパートである

計測手順

  • 計測するアプリケーションを決める
  • 開発種別(新規開発か改版か)、アプリケーション境界を決める
  • 構成要素をテーブル(データファンクション)とプログラム(トランザクションファンクション)に分ける
  • 各ファンクションの機能数を分析し、未調整ファンクションポイント数を得る
  • 非機能要件を分析し、調整係数を得る
  • 未調整FP数に調整係数をかけて、最終FP数を得る

新規開発においてFP計測が完了すると、アプリケーションのFP数が決まる。

改版が行われるたびに、アプリケーションのFP数は変化する。

アプリケーション境界とは何か

プログラムの内部と、外界を分けるもの。

トランザクションの識別(受信・送信)、データの識別(内部・外部テーブル)に使う。

  • アプリケーションのスコープを確定する
  • 入力は境界の外から入ってくる
  • 出力は境界の外へ出て行く

''境界の中のものだけを見積もること''

ファンクションタイプ

テーブルの種類、プログラムの種類がそれぞれ二つある。

  • テーブル
    • 1)あなたが使用・維持するもの
    • 2)他者が使用していて、あなたが参照するもの
  • プログラム
    • 1)入力
    • 2)レポート(出力)

データファンクション(DBのテーブルに相当)

  • 内部論理ファイル(internal logical file)>複雑
    • select/insert/update/delete可能
  • 外部インタフェースファイル(external interface file)>単純
    • select操作しか行えない


トランザクションファンクション(プログラムに相当)

  • 外部入力(external input)
  • 外部出力(external output)
  • 外部問い合わせ(external query)

この結果をすべて合計すると未調整FP数(unadjusted FP count)が得られる。

調整係数

調整係数(Value Adjustment Factor)を求め、未調整FP数にかけることで調整済みFP数が得られる。

  • 14の項目で算出
  • 統計に基づいている
  • 非機能要件をカバーする(非科学的要件)

開発種別による計測方法の違い

  • 新規開発→言うまでもなし
  • 機能追加(既存機能の変更)→機能が増減する場合は見積もり可能
  • 保守(バグ修正、予防的修正等)→機能に変化がない場合はFP法は不適

データファンクションタイプ

※ユーザのデータ要件を満たす機能

2種類に分かれる。

  • 内部論理ファイル(ILF)
  • 外部インタフェースファイル(EIF)

複雑度をDET/RETによって計測する

  • DET:データ要素型(Data Element Type)
  • RET:レコード要素型(Record Element Type)

データ要素型

以下の条件を満たすフィールド

  • ユニーク
  • ユーザによって識別可能(ユーザと開発者両方が合意していること)
  • 繰り返し項目ではない

一つのフィールドは1DETに相当する

※複数のアプリがILFを共有している場合は、自分が使うDETだけをカウントする

(他のアプリが使っていても自分のカウントには含めない)

  • 履歴を保持する等で、変更前のイメージをそのまま持っている場合は繰り返しと見なす。(=1DET)
  • 複数テーブル間で主キー・外部キーの関係が成り立つ場合、同一のキーはまとめて1DETと数える。

レコード要素型

以下の条件を満たすフィールド

  • ユニーク
  • ユーザによって識別可能(ユーザと開発者両方が合意していること)
  • サブグループ
  • 二つの種類がある(必須または任意)
    • 必須=必ず指定 任意=1以上

DET-RETの関係は親子関係に似ている。通常はILF/EIF内の再帰データに相当する

  • ILF/EIFのサブグループごとにRETを一つ数える
  • サブグループがない場合、ILF/EIFそのものを1RETと数える

ILFとRETの使い分け

エンティティが2つある時、2ILFとするのか? 1ILF/2RETとするのか?

  • プロセスがエンティティを操作するプロセスに注目する
  • Create/Delete処理に着目すると考えやすい
    • 複数のエンティティがまとめて生成・削除される場合は、おそらく1論理ファイルにまとめて扱うのが適切
  • RETは少なくともDETを一つ必要とする

複雑度マトリクス

マトリクスに従い、DETやRETの数から、機能の複雑度を低・中・高に分類する。

DETやRETがいくらあっても、複雑度の上限は「高」である。

※DETやRETが多すぎるような設計をしないこと。


複雑度マトリクスについてはこちらを参照

http://cafe.eyln.com/cgi-bin/wiki/wiki.cgi?page=FP%CB%A1%A4%CB%A4%C4%A4%A4%A4%C6#p18

トランザクションファンクションタイプ

3種類ある

    • EI:外部入力(external input)
    • EO:外部出力(external output)
    • EQ:外部問い合わせ(external query)


定義:アプリケーションがユーザに提供する、データ処理のための機能


処理ロジックとは:単純な操作を完了するためのユーザ要件

例:

  • 入力値検証
  • 演算・計算の実行
  • 値の変換
  • 1以上のILF更新
  • 1以上のILF/EIF参照
  • データや制御情報の取得


複雑度マトリクスについてはこちらを参照

http://cafe.eyln.com/cgi-bin/wiki/wiki.cgi?page=FP%CB%A1%A4%CB%A4%C4%A4%A4%A4%C6#p21


FP数カウントはこちらを参照

http://cafe.eyln.com/cgi-bin/wiki/wiki.cgi?page=FP%CB%A1%A4%CB%A4%C4%A4%A4%A4%C6#p27

外部入力

アプリケーション境界の外から来るデータを処理する。(ユーザや外部アプリからの入力)


基本的な意図:ILFの維持(書き込み)あるいはシステムの挙動変更(例:侵入検知やセキュリティ)

数え方:

  • データを外から受け取る処理
  • データは単純な操作で維持する
  • Insert/Update/Delete操作はそれぞれ別に数える
    • 追加・変更・削除といった単語に注意すること

外部出力

アプリケーション境界の外にデータを送る。

基本的な意図:データをユーザに提示する


数え方:

  • データを外に送る処理
  • データは単純な操作で送る
  • 最低一つの算術式、計算、派生データを含む
    • ※一つも含まない場合、それはEQになる
  • 途中の処理系が出力に見える必要はない
  • 1以上のILFを保守、またはシステムの挙動を変更してもよい

注意点:

  • バッチ処理(例:日次でテーブルをクリアするような処理)は、ユーザが明示的に要求していなければトランザクションとして計上しない
    • こうした処理は非機能要件として数える。調整係数でカバーする。
  • EOはILFを維持したり、システムの挙動を変えたりすることもある
    • 出力ではあるが、データ更新を行うことも出来る→EI同様入力を受け取ることもある

外部問い合わせ

基本機能:

  • データをアプリケーション境界の外に送る。
  • 情報をユーザに提示する
    • データの加工を一切行わない

数え方:

  • ILF/EIFからデータまたは制御情報を取得する
  • この処理ロジックは演算・計算処理を一切含まず、派生データも生成しない
  • ILFの更新やシステムの挙動の変更は発生しない

注意点:

  • ※ILFを更新することはできない

FTR(ファイル型参照)

FTRとは:

  • ファンクションタイプによって参照・維持されるILF
  • ファンクションタイプによって参照されるEIF
  • EIがILF/EIFをさわるごとに、それぞれFTRx1とカウントする
  • EIがあるILFを同時に参照・更新する場合、FTRは1とする(2ではない)

DET(データ要素型)

DETとは:ユーザが認識可能な、非繰り返し項目

EI/EO/EQについて

  • 入力
    • ユーザが認識するデータ入力項目一つにつきDETx1とカウントする
    • アプリケーション境界を越えないフィールドはカウントしない
    • データ選択要件を定義するフィールドは1とカウントする
  • 出力
    • ユーザが認識する出力項目一つにつきDETx1とカウントする
    • 項目が入力・出力両方に現れる場合は、1回だけカウントする
    • リテラルはDETに数えない
    • ページング変数はDETに数えない
    • 物理的には複数のフィールドだが、ユーザ要件上は一つの情報の塊である場合、1とカウントする

GUIへの適用

マスタデータでの考慮

ただのコード一覧はDETに数えない

調整係数

FP数の調整に用いる。14の「一般システム特性」を元にして算出。


プラスマイナス35%の範囲内。

調整係数=(TDI x 0.01) + 0.65

最終的な工数

言語・プラットフォームに応じてFPごとの工数は変化する。

FP数x単位工数x管理係数(1.xx)=総工数

適用範囲

変換機能や導入時の処理は開発FPに追加する

バグ修正や予防修正にはFPは使えない

リファクタリングにもFPは使えない

FP法:前提編

見積もり手法としてのFP法について講義を受けたので、メモその1。

普段どうやって見積もりをしている?

  • 過去の経験
  • 仕事を細分化・ブレークダウンする
  • グループに分けて見積もる
  • 推定する

計測できないものは見積もれない!

人間は数字に動かされる。

よくある手法

帽子(Hat)メソッド>適当なやりかた 科学的ではない

楽観主義や偏向

誰しも楽観的に考える(『人月の神話』より)

=みんな過小に見積もる>工数オーバー

なぜ見積もりが正しくならないか

  • 要件が不明確
  • 見積もり基準がない
  • 見積もり経験がない
  • 科学的・標準的な見積もり手法の知識がない
  • 時間がない
  • 出来レース(ケツが決まっている)
  • レビューが不適切

よくある問題

  • 品質で妥協
  • 顧客との関係悪化
  • 見積もりが過小
  • 新規案件か、メンテナンスか
  • 顧客不満
  • コスト増大
  • スケジュール超過
  • 要件の見落とし
  • 締め切りが固定
  • コストが固定
  • 工数やコストについて顧客理解を得られず、失注
  • 見積もり超過による利益率低下
  • 労働時間増>士気の低下

じゃあどうするのか

すべてのステークホルダーにとってメリットのある、堅牢な見積もり手法を定義する

  • 顧客メリット:透明性、金銭的な計測可能性
  • 開発者メリット:顧客交渉に有利、利益率改善、品質・生産性改善
  • 管理者メリット:プロジェクトをよりよくコントロールできる
  • 対象:あらゆる種類のプロジェクト管理、広範なプラットフォーム・アーキテクチャ

計測単位

コストではなく規模ではかる。しかしステップ数や画面数、人月などでは不十分。


労力・工数ではなく、規模に注目する。

  • 規模とは:技術を元に計測した工数
  • 規模=工数ではない!

機能的な規模とは

ユーザの機能要件を量的に計測する

  • ユーザが求める機能が何か、を計測する(実現手法を問うているのではない)
  • 技術的要件や設計とは独立
  • 類例:家の面積

なぜ規模ではかるのか?

答え:パフォーマンス指標は規模から導かれるから。

  • 生産性=規模/工数
  • 進捗率=規模/期間
  • 障害密度=障害数/規模

典型的な見積もり

RFP>規模>工数>期間・スケジュール>コスト

他のモデル:COCOMO-2、UCPなど

そのほか

言語によって生産性は異なる

  • C:11FP/月
  • VB:21FP/月

IFPUG(国際ファンクションポイントユーザ会)の掲示板が非常に参考になる。

http://www.ifpug.org/discus/messages/1779/1779.html?1223293206

自己表現

Articulation Skill(自己表現)の研修を受けたので、復習をかねてまとめ。

コミュニケーションの構造

  • 送り手と
  • 受け手が
  • 共有する関係枠の中で
  • 媒体に乗せて
  • メッセージをやりとりする

自己表現の要点

  • 能動的に聞く
  • 反応する/相手の反応を探る/相手の意見を言い換える
  • 主張を論理的に構造化する>自分の主張を事前に計画する
  • 単純な言葉を選ぶ
  • 媒体とその影響(言葉:声:非言語要素=7:38:55)>メラビアンの法則……

非言語要素の注意点

聞き手(聴衆)の注目を維持するためのアクション

  • 笑顔は重要。聴衆の緊張を和らげる。
  • 声は大きく。ゆっくり話す。
  • 手振りを適宜交える。まったく手を動かさないのはマイナス。
    • 手はみぞおちのあたりで組んでおく。
  • アイコンタクトをまんべんなく行う。視線を聴衆全体に向ける。
  • 自信を示すことが重要
    • 立っているときの姿勢に注意。背筋を伸ばす。体を揺らさない。

聴衆を引き込む

かならず立ち止まって質問を受ける。疑問点はないかと尋ねる。