parkの雑記帳
2009-09-04 [Fri]
・ [プログラミング] Mono 2.4.2.3 にバグ?
C#には ?? 演算子という便利な物があって、こいつは前者が左辺を評価し、nullでなければ左辺を値とし、nullであれば右辺を評価して値とする。
元々はC# 2.0でNullable型が導入された際に追加された演算子で、Nullable型を非Nullable型に代入する際にデフォルト値を与えるために使うものだけれど、何かと他の場所でも使える。
例えば
string var = SomeFunction() ?? "failed";
みたいな使い方ができたりする。
プログラミングをしているときにこれを使おうとしていたんだが、「左辺が非nullなら右辺は評価されないんだっけ?」と疑問を持った。ちなみに正解は「評価されない」であっていた。そこで、試すのにFreeBSDのmonoを使おうとしたのが間違いの始まりだった。
using System;
public class NullCoalescing
{
public static void SuppressWarnings(params object[] o) { }
public static void Main()
{
string a, b;
a = "not changed";
b = null ?? (a = "changed");
Console.WriteLine("a = \"not changed\";");
Console.WriteLine("b = null ?? (a = \"changed\");");
Console.WriteLine("result: a == \"" + a + "\"");
Console.WriteLine();
a = "not changed";
b = "" ?? (a = "changed");
Console.WriteLine("a = \"not changed\";");
Console.WriteLine("b = \"\" ?? (a = \"changed\");");
Console.WriteLine("result: a == \"" + a + "\"");
SuppressWarnings(a, b);
}
}
試しにこんなコードを書いてみたらとんでもないことが起こった。
$ gmcs NullCoalescing.cs $ ./NullCoalescing.exe a = "not changed"; b = null ?? (a = "changed"); result: a == "changed" a = "not changed"; b = "" ?? (a = "changed"); result: a == "changed"
え?右辺評価されてる!?
おかしいなと思ってVisual C#で確認してみる
>csc NullCoalescing.cs >NullCoalescing.exe a = "not changed"; b = null ?? (a = "changed"); result: a == "changed" a = "not changed"; b = "" ?? (a = "changed"); result: a == "not changed"
え?評価されてない!?
あまりにもおかしいので別の型で試したら右辺は評価されないし、a, bをobject型として宣言したら右辺評価されなくなるし。
結局、string型かつ左辺が定数の場合には再現したけれどそれ以外では再現しなかったという。最適化関係でバグってるのかしら。
ちなみにおかしかったのはgmcsで、cscでコンパイルしたバイナリは.NET Frameworkでもmonoでも正常に動いた。
2009-09-07 [Mon]
・ [プログラミング] LEDClock
Twitterで信頼できないexeファイル開くなとかたいそうなことを言ってしまったので貼ったexeファイルをソースコード付きで公開してみる。
ledclock.zip MD5: 3097c35a1e5067cdee61c09fdcaf73c5
まあどうせHTTPSじゃないからMD5書いてもあまり意味はないんだけれど。信頼するか否かの判断は慎重にどうぞ。
2009-09-17 [Thu]
・ [プログラミング] C#でTwitterライブラリ (OAuth対応)
タイトルのとおり、C#でTwitterライブラリのような物を書いてみた。OAuthにもいちおう対応させてみたり。
ろくにテストをしていないです。
- Account Methods
- Notification Methods
- Block Methods
- Saved Searches Methods
このへんはまだ書いていない。
TwitterOAuth oAuth = new TwitterOAuth(consumerKey, consumerSecret);
string authUrl = oAuth.GetAuthLink();
string code = "hoge";// (本当はユーザに authUrl にアクセスしてもらって、認証コードを入れてもらう);
oAuth.VerifyOAuthByPinCode(authUrl, code);
// oAuth.Token, oAuth.TokenSecret を保存。
// 次回は new TwitterOAuth(consumerKey, consumerSecret, token, tokenSecret)
TwitterApi api = new TwitterApi(oAuth);
とかやればTwitter APIが使えるようになって、
TwitterStatus[] timeline = api.GetFriendsTimeLine();
foreach (TwitterStatus tweet in timeline)
System.Console.WriteLine(tweet);
みたいに使えるんじゃないだろうか。
これを使うような危篤、じゃない奇特な人はいないだろうけれど、無保証なので注意。あと英語が間違っていても笑って赦して。