OITA: Oika's Information Technological Activities

@oika 情報技術的活動日誌。

C# HostToNetworkOrderとNetworkToHostOrderの違い

C#では、リトルエンディアンとビッグエンディアンの
バイト変換用メソッドとして、System.Net.IPAddressクラスに
HostToNetworkOrderNetworkToHostOrderを持っている。

コンピューターの配列順からネットワーク用の配列順(ビッグエンディアン)に
数値を変換するのがHostToNetworkOrder、
ネットワーク用の配列順からコンピューター用の配列順に
値を変換するのがNetworkToHostOrder、ということになっている。

これらのメソッドが、実行環境のコンピューターがリトルエンディアンなら
変換を実行し、そうでない場合は何もしないようになっているものなのか、
あるいはコンピューターがリトルエンディアンの場合にだけ
これらのメソッドを呼び出せというものなのか、
MSDNの説明を読んだ限りではいまいちわからなかった。

ただいずれにせよ、Windows環境では常にリトルエンディアンになる
BitConverter.IsLittleEndianは常にTrueを返す)ので、
実際にはこれらのメソッドを呼び出すと、常にバイト順の変換された値が返ってくる。

ところで、考えてみると、ホスト順→ネットワーク順であろうが、
ネットワーク順→ホスト順であろうが、バイトオーダーを逆にするという意味では、
処理内容は全く同じになるはずじゃないか。

そう思って、ILSpyを使って逆コンパイルしたソースを覗いてみた。

まずは、HostToNetworkOrder(short host)の中身。

public static short HostToNetworkOrder(short host)  
{  
 return (short)((int)(host & 255) << 8 | (host >> 8 & 255));  
}  

続きまして、NetworkToHostOrder(short network)がこれ。

public static short NetworkToHostOrder(short network)  
{  
 return IPAddress.HostToNetworkOrder(network);  
}  

Oh...文句なしで一緒ですねこれは。

そんなわけで、この2つのメソッドは同じ結果を返すけど、
使用目的がわかるように使い分けろよというもののようだ。

今回は以上。

オープンソースカンファレンス2013 Hokkaidoに参加しました

2013.09.14、お邪魔してきました。OSC2013@北海道
朝から参加したセッションの内容と感想まとめ。

「オープンソースソフトウェアの翻訳をやらないか」

@okano_tさん。
LibreOfficeを例に、オープンソースソフトウェアの
翻訳活動についての紹介とライブコミット。
翻訳作業はどこも人手が足りていないので、
興味がある人はどんどん参加してくださいとおっしゃっていた。

LibreOfficeの翻訳作業はPootleというツールで
Webブラウザから行っていた。
ずいぶんとカジュアルなUIだなぁという印象。
なるほど、見ず知らずの善意の人たちに、軽い気持ちで参加してもらうためには
作業画面のわかりやすさは絶対の条件だよなーなどと考えたのでした。

「みんなで同時プレイするクイズWebアプリで、CodeQuizに挑戦!  - オープンソースライブラリで実現するリアルタイムWebアプリを作る!」

@jsakamotoさん。
SignalRという、ASP.NETでの双方向通信のためのライブラリの紹介と
ライブコーディング。
サーバからブラウザへのpush通信を、通信技術を意識することなく
簡単にコーディングできるということだった。
確かに見ていた限り非常にシンプルに書けそう。

ASP.NETって今までほとんど使ったことがなかったけど、
Azure以外にもAppHarborっていう無料で始められるPaaSがあったりもするらしく、
これを期にちょっと勉強してみようかなと思いました。

「アセンブラ短歌 ~アセンブラで短歌を書いてみよう~」

@kozossakaiさん。
今日拝聴した中で一番ぶっとんでた。
アセンブリ言語で書いたコードを機械語にアセンブルしたときに
機械語コードが5バイト・7バイト・5バイト・7バイト・7バイトで
区切れるようなコードを書いて、その味わい深さを競うのが
アセンブラ短歌というものらしいです。

各句がどれも"40"で終了していて韻を踏んでいるだとか、
レジスタの値を水が流れるようにincしながら取り出しつつ
一方ではpush-pop-pushのかろやかなリズムも感じられて
小川のせせらぎの横で子供がスキップしている風景が浮かぶだとか、
この業界にはまだまだ知らない世界がたくさんあるなぁと思いました。

「僕達の自由、これからの自由」

@koiwaさん。
知性と自由に関する、大変ためになるお話。
ストールマンのフリーソフトウェア活動がどうだとか、
フリーは自由の意味のフリーだとか言われても、
いままでどうもピンときていなかったのだけど、
そもそも自由ってなんで必要なんだろうねというところから
話を始めていただけたおかげで、なんだか胸にストンと落ちた。

でも自由にこだわり続けるって、決して楽な道ではないな。
例えば講義の中でも、AppleのAppStoreには審査があるから自由でなくて、
Google PlayのAndroidアプリには審査がないので自由はあるが
悪意あるソフトからの自己防衛は各自で行う必要があるという話があった。
自由を投げうって楽しちゃいたい瞬間って絶対あるだろうなぁ。

ちょうど1つ目のソフト翻訳の話で岡野さんが、翻訳チェックについての文脈だけど、
「『目玉の数さえ十分にあればどんなバグも深刻ではない』といいますけど、
 全然目玉の数が足りてないわけですよ」的なことをおっしゃってたのを
思い出したりしていました。

「『さくらのクラウド』を、さくらの社長と所長が使ってみた~in北海道編~」

さくらインターネット社長@kunihirotanakaさん。
所長は飛行機の部品故障で終了5分前くらいに到着した笑
さくらのクラウドの紹介とデモ。
内容よりも、さくらの社長って若いんだな、
そして話が面白いなというのが印象に残った。

「中身の見えるクラウド」を目指してるっていうのは
逆説的だけど面白いなと思った。
なかなか個人で利用することはないかもしれないですが。

「HTML5とMonacaで作る!簡単ハイブリッドスマートフォンアプリ」

@Hikaru_Itouさん。高校生だって!
若いのにというべきか、若いからこそというべきか、
堂々とした力のあるプレゼンでした。
これからのスマホアプリはネイティブアプリでもなく
モバイルウェブアプリでもなく、ハイブリッドアプリだ!という話。
そしてそのためのブラウザ開発環境、Monacaが紹介されていた。

html,cssとjsで書いたアプリを普通にストアから配布できるというのは
確かに魅力的だ。iOSとAndroid両対応。
どちらかというとWebの人向けに、
「慣れ親しんだhtmlで書けるんですよ!」というのを強調していたけど、
正直htmlに慣れ親しんでない自分でもちょっと気になる内容でした。

「初めてのFacebookアプリの開発 C#+Windows Azure編」

@furuya02さん。
C#でのFacebookアプリの開発、および公開の方法を
はじめからていねいに説明されていた。
Facebook連動の外部アプリではなくて、
Facebookのページで表示する埋め込みアプリ。

Facebookをあまりアクティブに使っていないので
どんなアプリがあるものなのかもあまり知らないのだけど、
ちょっといじってみるのも面白そうだ。
しかしやっぱりAzure的なものが必要になりますね。ううむ。

「ライトニングトーク&閉会式」

LTは今年も圧倒的eject感だった。
そして再登場のアセンブラ短歌、正規表現雑技団など、
笑わせてもらいました。

全体を通して

意図せずか意図してか、Web系のセッション参加が比較的多くなった。
やっぱなー、Webもできるようになりたいもんですね。
というわけで、鉄が熱いうちに何かしら始めよう。
今回知ったツールなどをいじってみたりしようかなまずは。

そんな感じで、今年も大変楽しめました。
会場のコンベンションセンターやっぱ綺麗だったな。
スタッフの皆様、大変お疲れさまでした。
 

「汝は人狼なりや? for Windows desktop」公開

パソコンとモニタを使って人狼を遊ぶためのWindowsデスクトップアプリです。

もともと自分が人狼という遊びをやってみたくて作って内輪で遊んでたものなんですが、
テレビ番組にもなってなんだか人気沸騰中の人狼ゲームなので
いくらか需要もあるかなと思って、公開してみます。
無料ソフトです。

iPhoneとかだともうアプリもあったり、
オンラインでチャット的に遊ぶサイトもけっこうあるようだったんですが、
大画面でモニタに映しておどろおどろしいBGMを流して遊ぶ、みたいなことがやりたかったので、
自作したのです。

 

※「窓の杜」様にてご紹介いただきました。
オフラインでの“人狼ゲーム”をサポート「汝は人狼なりや? for Windows desktop」

概要

人狼(「汝は人狼なりや?」「嘘つき人狼」などと呼ぶもの)を
複数人で集まって遊ぶためのデスクトップ・アプリケーションです。

役割の決定や勝敗の判定を自動で行います。
また、プレイヤー全員の画像をモニターに映し出し、
任意のBGMを使用して、臨場感のあるゲーム環境を作り出すことができます。

推奨人数は7人~12人程度です。
最低4人から、試していないですが20人程度までプレイ可能なはずです。

動作環境

基本的に.NET Framework 4.0が動く環境であれば動くはずなので、
Windows XP,Vista,7等で実行できると思いますが、
動作確認はWindows 7でしか行っていません。

ダウンロード

こちらからどうぞ。Werewolf.zip

※お使いのブラウザによっては、ダウンロード時に
 「このファイルは危険かもしれません」といった警告が表示される場合がありますが、
 心配には及ばねぇ、続行だ。

BGM用の音声ファイルは含まれていないので、
BGMがほしいときは自分でwavファイルを用意していただく必要があります。
昼用の音楽、夜用の音楽等、何種類か設定できます(詳しくはreadme.txtに書いた)。

自分で遊ぶときは、かまいたちの夜 サウンドトラックをBGMに使ったりしたんですが
なかなか雰囲気が出て良いのです。

その他

配布させてくれる曲作ってくれる人などいらっしゃらないですかねぇ。
あとイラスト描いてくれる人とか、デザイン作ってくれる人とか…。
なんせ自分だけではセンスが足りないわけですほんと。
あと、これを使って人狼イベントやりたい!とかあればお知らせください。
むしろ呼んでください。

WPF 特定のリソースの組み合わせでビルドが通らなくなるバグ

よっぽど変な勘違いをしていなければ、VisualStudio(MSBuild?)のバグだと思われる話。
再現環境は.NET 4.0, VS2010のC# Express。
あと.NET 4.5, VS Express 2012のfor Desktopでもやっぱり再現した。

正常に動作していたコードで、唐突にビルドが通らなくなったのです。
MainWindowのクラスで、
「名前 'InitializeComponent' は現在のコンテキスト内に存在しません。」
そんなばかなと思ってobjフォルダを開いたら、
MainWindowのbamlファイルもg.csも生成されていなかった。

で、いろいろ試してみたら、どうもMainWindow.xamlの
Resoucesに指定した内容が原因らしいとわかった。

とりあえず最小の再現コードを載せてしまう。

<Window x:Class="MainWindowBamlLostSample.MainWindow"  
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
        xmlns:local="clr-namespace:MainWindowBamlLostSample"  
        Title="MainWindow" Height="350" Width="525">  
  
    <Window.Resources>  
        <local:Class1 x:Key="class1"/>  
        <x:Array Type="Brush" x:Key="array1" />  
      
    </Window.Resources>  
</Window>  

適当な自作クラスのオブジェクトと、
適当な型の配列オブジェクトを同時にリソースに入れると
突然ビルドが通らなくなる。

見つけられた限りではこの組み合わせだけで、
以下のような組み合わせでは全て問題なくビルドできた。

<SolidColorBrush x:Key="brush1"/>  
<x:Array Type="Brush" x:Key="array1" />  
<x:Array Type="Brush" x:Key="array1" />  
<x:Array Type="Brush" x:Key="array2" />  
<sys:String x:Key="str1" xmlns:sys="clr-namespace:System;assembly=mscorlib" />  
<x:Array Type="Brush" x:Key="array1" />  
<local:Class1 x:Key="class1"/>  
<SolidColorBrush x:Key="brush1"/>  

あるいはマークアップ拡張の使い方がまずかったりするんだろうか…。

C# リフレクションによるメンバの列挙順を指定する

先日Enumeratorを使って自前オブジェクトのメンバを列挙するという話をしていたが、
この中の、リフレクションを使ってメンバを自動で列挙しようという話、
実は、列挙されるメンバの順序が不定だという問題がある。
以下はMSDNの記述。

GetProperties メソッドから返されるプロパティは、アルファベット順や宣言順などの特定の順序で返されるわけではありません。 したがって、プロパティが返される順序に依存するようなコードは避ける必要があります。

というわけで今回は、列挙するメンバの順番を指定したい場合にどうするかという話。
さほど意味のないことに無駄に深入りしているなと思われるかもしれませんが
人生に無駄なことなどないのです。

続きを読む

Enumeratorを使って自前オブジェクトのメンバを列挙する

javaでのtoString()って、C#のToString()よりもデバッグ用的な意味合いが
強いのかなという感じがする。

javadocを見ると、以下のように書いてある。

通常、toString メソッドはこのオブジェクトを「テキストで表現する」文字列を返します。この結果は、人間が読める簡潔で有益な情報であるべきです。

そしてjavaではすべてのオブジェクトでtoString()を実装することが
推奨されているらしーんだけども、同じようなことはきっとC#であっても
やっておいたほうがいいんだと思います。

続きを読む