ARPテーブルの取得(F#) おまけもあるよ。
元ネタ:ARPテーブルの取得 (C#)(F#) - SIN@SAPPOROWORKSの覚書
http://d.hatena.ne.jp/spw0022/20111108/1320700838
SINさんがF#を書きまくっている今日この頃。F#の街札幌のF#りょくの高まりを感じざるを得ない。
F#らしい書き方かどうかはわかりませんが、SINさんのコードをベースにあまり深く考えずに。
コメント欄にお邪魔するには長いのでこちらで。
ARP(Address Resolution Protocol)テーブルの取得
#nowarn "9" "51" open System open System.Runtime.InteropServices open System.Linq [<DllImport("iphlpapi.dll")>] extern int GetIpNetTable(IntPtr pTcpTable, int *pdwSize, bool bOrder); [<Struct; StructLayout(LayoutKind.Sequential)>] type MIB_IPNETROW = val Index:int val PhysAddrLen:int [<MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)>] val PhysAddr:byte [] val Addr:int val Type:int let ipstr(addr:int)= let b = BitConverter.GetBytes(addr) sprintf "%d.%d.%d.%d" b.[0] b.[1] b.[2] b.[3] let macstr(m:byte []) = sprintf "%02x-%02x-%02x-%02x-%02x-%02x" m.[0] m.[1] m.[2] m.[3] m.[4] m.[5] let typeStr = ["";"その他";"無効";"動的";"静的"] //取得部分 let ar = let mutable size = 0 GetIpNetTable(IntPtr.Zero, &&size, true) |> ignore let p = Marshal.AllocHGlobal(size) if GetIpNetTable(p, &&size, true) = 0 then let end' = Marshal.ReadInt32(p) - 1 let result = let step = Marshal.SizeOf(typeof<MIB_IPNETROW>) let getPtr = let ptr' = ref (IntPtr.Add(p, 4)) (fun num -> if num=0 then !ptr' else ptr':=IntPtr.Add(!ptr',step); !ptr') [0..end'] |> List.map (fun x -> getPtr x) |> List.map (fun ptr -> Marshal.PtrToStructure(ptr, typeof<MIB_IPNETROW>) :?> MIB_IPNETROW) Marshal.FreeHGlobal(p) result else [] //出力部分 printfn "インデックス\tインターネット アドレス\t物理アドレス\t種類" ar |> List.toSeq |> Seq.groupBy (fun n -> n.Index) |> Seq.iter (fun (i,ms) -> printfn "\nインターフェース:0x%x\n インターネット アドレス\t物理アドレス\t種類" i ms |> Seq.iter (fun m -> printfn " %-15s\t%s\t%s" <| ipstr(m.Addr) <| macstr(m.PhysAddr) <| typeStr.[m.Type])) printfn "何かのキーを押してください。" Console.ReadKey() |> ignore
■主な変更点とかモロモロ
- ワーニングの波線が残り続けるのは、精神衛生上アレなので #nowarn で非表示に。
- 取得部分をひとまとめの関数に。
- なるべく、みゅーたぶり(mutableを使い)たくはないので、そのあたりをいじる。
- 「for 〜 in 〜 do 〜」を利用することは、決してわるいことではありません。が、F#ではSeqモジュールを利用してLINQのノリで書ける。
- 元ネタ「ar.Where(fun (x:MIB_IPNETROW) -> x.Index=i.Key)」で再度絞り込みする必要はなく、arのGroupByした結果をそのまま利用して結果を出力する。
- 前方パイプライン演算子には負けますが、後方パイプライン演算子もなかなかかわいいです。
- ふつうのF#erなので、奇をてらったへんたいコードは書きません。
おまけ
趣旨からはだいぶズレますが、コマンドラインからコマンドを実行して取得した値をそのまま書き出すズルしてみたり:p
open System let filename = Environment.GetEnvironmentVariable("ComSpec") let arguments = @"/c arp -a" let psi = new Diagnostics.ProcessStartInfo(filename, arguments, CreateNoWindow = true, UseShellExecute = false, RedirectStandardInput = false, RedirectStandardOutput = true) let p = Diagnostics.Process.Start(psi) p.WaitForExit() let results = p.StandardOutput.ReadToEnd() printfn "%s" results Console.ReadKey () |> ignore
これはひどいw
吸い込んで確かめて 最先端未来の空気を
東京事変 - 21世紀宇宙の子
You've got my heart in you hands. You'er the only one who gets me.
Kylee - You Get Me
観たやつ
#552. チャットルーム
中田秀夫監督作品。実際にはネット越しでチャットしている様子を、
直接会話しているようなビジュアルで表現されている。最初分かりにくかった(ぇ
あまり見どころもない割に最後の後味もよくない。ん〜。
#553. アヒルと鴨のコインロッカー
途中でトリックに気づいてしまいましたが、まあ最後まで観れた。
観ないとタイトルがイミフすぎますw 瑛太って割となんでもできる役者っぽい感じなんだけど、
印象強い役とかないかもなー。濱田岳って独特だよなあとかとか。
#554. インシテミル
この手の設定の作品はもう珍しくないですからねぇ...。
#555. ザ・シューター/極大射撃
B級ではありますが、細かいことはキニシナイ。スナイパーかっけー
#556. 悪人
吉田修一の話題作を、妻夫木聡と深津絵里主演で映画化。いずれも体当たり演技で好演。
別段むずかしい話はない。単純でもありそうでなかったお話(?)
あ。かつてはFolder5、満島ひかりもすっかりいい女優となったなあ。
#557. ストレンジャーコール
ストーキングの怖さ不気味さこそ感じられるものの、
ストーリーは単調で少し退屈。というかラストが普通すぎる...。
でも、主演のカミーラ・ベルは美人さんでよいですね。
#558. 腑抜けども悲しみの愛を見せろ
なにこのひどい映画wwwクソワロタwww、という表現が合いそう。
「お姉ちゃんは最高に面白いよ」まさにこれに尽きる。
そして、家族の恥でも描かずにはいられない妹のクリエーターとしての業の深さ。
でも、扇風機が回っちゃうのはなんだったの?永作博美若けぇなあ。
#559. 孤高のメス
医者ものはドラマにしろ映画にしろ結構好きだったりする。こんなカッコイイ医者いるんですかねえ。
堤真一の孤高の医者ぶりもよかったですが、それを引き立てていた夏川結衣がいい仕事しました。
#560. コドモのコドモ
コドモがSEXしてコドモ作る映画。"これはひどい"タグが似合う作品。
#561. アンフェア the movie
雪村って苗字いいよな(何
#562. ダークネス
スペイン映画。ちょっと怖いサスペンスホラー。
ラストで明かされる首謀者がふつう(笑
#563. インビジブル2
お色気シーンはサービースサービスってゆーけど...
一作目がB級ながらも楽しめたのに対して、これはつまんない。どうしてこうなった。
#564. リトル・ミス・サンシャイン
「ヤッてヤッてヤリまくれ」が印象的すぎる(ぇ
すばらしきロードムービー。映画好きなら見ておきたい一本ですな。
#565. キューティーブロンドハッピーMAX
結構クセはあるけど、これはパワーもらえますよ!
#566. ドット・ジ・アイ
いろいろ濃い。んだけど、自分には響かなかったなー
#567. クロサギ
ドラマぜんぜん見てないのに観たんだけど、まぁ観れた。
とりあえず、いろんな意味で山Pファンのための作品ですね。
#568. アフタースクール
「運命じゃない人」でカンヌ4冠を獲得した内田けんじ監督の作品。
これも「やられた」って感じ。おもしろいなー
#569. 図鑑に載ってない虫
仮死体験ができるという“死にモドキ”を探すお話。期待せずに観たが、意外や意外…。
まじめな部分は何一つなく、非常にクダラナーイ話のみで構成されているが、笑って見れる昭和テイストのロードムービー。
キャストも、伊勢谷友介、松尾スズキ、菊地凛子と一癖もふた癖ある人たちで観ててあきません。
いやしかし、冒頭の水野美紀…、女優とは大変なお仕事なのですねwww
#570. 叫
役所広司や小西真奈美はともかく、葉月里緒奈が...(笑
葉月里緒奈がでてくるたびに吹きそうになって、ぜんぜん恐怖を感じなかった。
ああいう役は、もっと名の売れていない女優さんが演じた方がいいと思うんだ。