コードから管理者権限でスクリプトを実行する
VistaではUACが有効だと何でもかんでも止められてしまう。
そういえばバッチファイルやWSHでサービスとかレジストリとかいじるのはどうなるのか、と思ったら案の定アクセス拒否される。
管理者コマンドプロンプトを自分で開くと言う手はあるが、面倒。プログラムなりコマンドなりで昇格できないのか……と思ったが、簡単な手はないようだ。
- http://technet.microsoft.com/en-us/magazine/2007.06.utilityspotlight.aspx
- http://technet.microsoft.com/en-us/magazine/2008.06.elevation.aspx
- http://ebi.dyndns.biz/diary/20080813.html
一応最後のblog記事にサンプルがある。Vistaの場合は昇格状態でスクリプトを起動し直す、という流れのようだ。
というわけでJScript大好きな私もちょっと書いてみた。こちらはVistaで動かすのが前提なので手抜き。
実行すると指定のサービスのon/offを行う。ポイントは2点。
- ShellExecute関数の第4引数は動詞(verb)なのだが、これにrunasを指定するとUACが起動する。しかしMSDNには記述がない。
- 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("サービス状態が不明です"); }
サービス上げ下げの処理はこちらを参考にした。
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というショートカットが作られているためだった。
文字コードが変換できない
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ドキュメントにもRubyやPythonでの作り方は書かれていない。
Dynamic Languages SDKのサイトにも特に注意書きがない。おかげで迷うこと甚だしい。
現時点で引っかかった点のまとめ。
- VWDでXAMLのGUI編集ができない>ソースをいじるとGUIプレビュー画面には反映されるけど、GUI側に部品を配置することができない。そういうものか?
- SilverlightのAPIをRubyで呼ぶときは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法:詳細編
FP法の勉強まとめ、その2。
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を保守、またはシステムの挙動を変更してもよい
注意点:
外部問い合わせ
基本機能:
- データをアプリケーション境界の外に送る。
- 情報をユーザに提示する
- データの加工を一切行わない
数え方:
- 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とカウントする
マスタデータでの考慮
ただのコード一覧はDETに数えない
調整係数
FP数の調整に用いる。14の「一般システム特性」を元にして算出。
プラスマイナス35%の範囲内。
調整係数=(TDI x 0.01) + 0.65
FP法:前提編
見積もり手法としてのFP法について講義を受けたので、メモその1。
普段どうやって見積もりをしている?
- 過去の経験
- 仕事を細分化・ブレークダウンする
- グループに分けて見積もる
- 推定する
計測できないものは見積もれない!
人間は数字に動かされる。
よくある手法
帽子(Hat)メソッド>適当なやりかた 科学的ではない
なぜ見積もりが正しくならないか
- 要件が不明確
- 見積もり基準がない
- 見積もり経験がない
- 科学的・標準的な見積もり手法の知識がない
- 時間がない
- 出来レース(ケツが決まっている)
- レビューが不適切
よくある問題
- 品質で妥協
- 顧客との関係悪化
- 見積もりが過小
- 新規案件か、メンテナンスか
- 顧客不満
- コスト増大
- スケジュール超過
- 要件の見落とし
- 締め切りが固定
- コストが固定
- 工数やコストについて顧客理解を得られず、失注
- 見積もり超過による利益率低下
- 労働時間増>士気の低下
じゃあどうするのか
すべてのステークホルダーにとってメリットのある、堅牢な見積もり手法を定義する
機能的な規模とは
ユーザの機能要件を量的に計測する
- ユーザが求める機能が何か、を計測する(実現手法を問うているのではない)
- 技術的要件や設計とは独立
- 類例:家の面積
そのほか
言語によって生産性は異なる
- C:11FP/月
- VB:21FP/月
IFPUG(国際ファンクションポイントユーザ会)の掲示板が非常に参考になる。
http://www.ifpug.org/discus/messages/1779/1779.html?1223293206
自己表現
Articulation Skill(自己表現)の研修を受けたので、復習をかねてまとめ。
コミュニケーションの構造
- 送り手と
- 受け手が
- 共有する関係枠の中で
- 媒体に乗せて
- メッセージをやりとりする
自己表現の要点
- 能動的に聞く
- 反応する/相手の反応を探る/相手の意見を言い換える
- 主張を論理的に構造化する>自分の主張を事前に計画する
- 単純な言葉を選ぶ
- 媒体とその影響(言葉:声:非言語要素=7:38:55)>メラビアンの法則……
非言語要素の注意点
聞き手(聴衆)の注目を維持するためのアクション
- 笑顔は重要。聴衆の緊張を和らげる。
- 声は大きく。ゆっくり話す。
- 手振りを適宜交える。まったく手を動かさないのはマイナス。
- 手はみぞおちのあたりで組んでおく。
- アイコンタクトをまんべんなく行う。視線を聴衆全体に向ける。
- 自信を示すことが重要
- 立っているときの姿勢に注意。背筋を伸ばす。体を揺らさない。
聴衆を引き込む
かならず立ち止まって質問を受ける。疑問点はないかと尋ねる。