Archive for 2月 2013
駅ナンバリング
うちの田舎のどローカル私鉄が駅ナンバリングを導入したらしい。
外国人どころか地元民でさえ乗ることが少ないのに。
ところでこの駅ナンバリング、JR東日本ではまだ導入されていないが、
導入されるとおもしろいことが起きる。
山手線で
山手線で導入されるとなると、おそらく01番は東京駅
のはずなのだが、知ってる人は知ってるとおり路線の戸籍上は
東京駅は山手線ではなく東海道本線の駅である。
戸籍上の山手線は品川駅から時計回りに田端まで。
なので、戸籍上山手線にない駅が山手線の01番になってしまうのである。
だからといって、山手線の01番を東京駅以外にしてしまうとそれはそれで問題
日本の中央駅が01ではないというのはどう考えてもおかしい。
戸籍上は正しくても一般の利用者から見ると変なことになってしまう。
さて、どうするJR東日本?
スタードライバー THE MOVIE
ぽか~ん...
...あれ?
...ひょっとして?
単なる総集編!?
冒頭の新宿で戦ってたやつは何なの?
可愛い声でしゃべってたザメクは?
マッハ3.いくつでF-22の横を飛んでたタクトは?
SVGをコンテナにしてラs(ry ver.1.1
変更点
1.出力されるJavascriptが不正な処理を行っていたのを修正
2.参照ボタンの追加
3.タブオーダーの修正
UriBuilderにdynamicなクエリを追加してみるテスト
職場でURLのクエリ文字列を作るのに
"http://www.hogehoge.orz/fuga/?a=" + a + "&b=" + b + "&c=" + c
みたいなことをやってるソースを見て、
「dynamicにクエリデータをばかばか入れていって結合した文字列を自動的に作成できたら楽じゃね?」
と思ったので早速作ってみた。
public class UriBuilder2 : UriBuilder
{
private dynamic queries = new DynamicQueries();
public UriBuilder2(string uriString)
: base(uriString)
{
var queryItems = base.Query.Split(new char[] { ‘&’, ‘?’ },StringSplitOptions.RemoveEmptyEntries)
.Select(_ => _.Split(‘=’));
foreach (var query in queryItems)
{
this.queries[query[0]] = query.Length > 1 ? query[1] : default(object);
}
}
public dynamic Queries
{
get { return this.queries; }
}
public new string Query
{
get { return this.RefreshQuery(); }
}
public new Uri Uri
{
get
{
this.RefreshQuery();
return base.Uri;
}
}
public override string ToString()
{
this.RefreshQuery();
return base.ToString();
}
private string RefreshQuery()
{
return (base.Query = this.queries.ToString());
}
internal class DynamicQueries : DynamicObject
{
private Dictionary<string, object> values = null;
public DynamicQueries()
{
this.values = new Dictionary<string, object>(StringComparer.InvariantCultureIgnoreCase);
}
public override bool TrySetMember(SetMemberBinder binder, object value)
{
this.values[binder.Name] = value;
return true;
}
public object this[string key]
{
get { return this.values[key]; }
set { this.values[key] = value; }
}
public bool Remove(string key)
{
return this.values.Remove(key);
}
public override string ToString()
{
return string.Join("&", values.Select(_ => _.Key + "=" + (_.Value ?? string.Empty).ToString()));
}
}
}
クラス名は適当
これの呼び出しサンプルが以下
var uriBuilder = new UriBuilder2("http://www.hogehoge.orz/piyo/?page=1&num=10");
uriBuilder.Port = -1;
uriBuilder.Queries.id = 1;
uriBuilder.Queries.username = "scott";
uriBuilder.Queries.password = "tiger";
で、実行して
http://www.hogehoge.orz/piyo/?page=1&num=10&id=1&username=scott&password=tiger
という結果が得られた。
うむ、だいぶ楽だ。
はりトル PRO
中綴じの雑誌バラすのに使ってたホチキス針のリムーバーがどっか行ったので新しいのを買おうと
東急ハンズに行ったら売ってた。
で、使ってみたらこれがまあサクサク取れるの。
今までリムーバーで針先を起こしてひっくり返して外して、ってのが1回でできる。
テレビ見ながら30分くらいで40冊以上の本をバラせた。
こりゃいいや。
ただ惜しむらくは、オイラの手にはかなり小さい。
SVGをコンテナにしてラスタアニメーションを作成してみるツール
職場で仕事をするふりをしながら考えた。
「SVGでアニメーションできるけど、ラスタ画像ファイル突っ込んだらアニメーションGIFみたいなことできんじゃね?」
そんなわけで、いろいろ調査した結果、アニメーションを作ることに成功した。
その顛末をここに書こうとしたのだが、Windows Live WriterとWordPress.comの制限でうまく書けなかった。
それでムカついてざっけんなこらみたいな記事を書いてすぐ消した。
ま、それはいいとして。
SVGをコンテナにしてラスタ画像からアニメーションを作成するツールです。
画像ファイル(JPEG、GIF、PNG)からアニメーションを作成することができます。
作成したファイルはSVGファイルとして1つのファイルにまとめられます。
幅:出力されるSVGイメージの幅です。
高さ:出力されるSVGイメージの高さです。
フレーム書き換え間隔(ミリ秒):イメージフレーム書き換えの間隔です。
ループする:チェックを入れるとループします。
一覧:使用する画像の一覧です。上から順番に使用します。
ドラッグアンドドロップでファイルを追加します。
「↑」、「↓」ボタン:選択されているファイルを移動します。
作成:ファイルを作成します。
保存ダイアログが表示されるので適切なファイル名を指定して保存します。
終了:アプリを終了します。
※注意事項
・IE10、IE9、Firefox(18.0.1)、Chrome(24.0.1312.57 m)で動作を確認しています(Safariはそのうちやります)
IE8以前では動作しません。
・作成したファイルは内部でJavascriptを使用しているので、ローカルで表示しようとするとIEでは警告が出ます。
・ファイルサイズは元の4/3倍+αになります。
圧縮してsvgzにするという手もあるのですが、動作確認の環境をうまく作れなかったので断念しました。とてもダンネンです。
・結構力づくで実行させてます。SVGの中身を見て笑ってやってください。
あと、アニメーションGIFとだいたい同じ重ね合わせ方法を使用してるはずです。
指定された回数だけ処理を行う拡張メソッド
指定された回数だけ処理を行いたい場合、たいていfor、foreachなんかのループ処理を使用するわけだけど、
それすらめんどくさい時がある。
宣言されたループ変数を使用しない場合は特に。
で、こういう拡張メソッドを作ってみた
public static class IntRepeaterExtension
{
public static void Times(this int count, Action action)
{
for (int i = 0; i < count; i++) { action(); }
}
public static IEnumerable<TResult> Times<TResult>(this int count, Func<TResult> func)
{
return Enumerable.Range(0, count).Select(_ => func());
}
}
この拡張メソッドで
10.Times(() => { ほげほげ });
みたいな書き方ができる。
for (var i = 0; i < 10; i++)
{
ほげほげ
}
や
foreach (var i in Enumerable.Range(0, 10))
{
ほげほげ
}
よりもだいぶ簡単。
これを実際に使用したのが以下
var r = new Random();
var seed = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
var passwords = 100.Times(() => string.Concat(r.Next(8, 16).Times(() => seed[r.Next(seed.Length)])));
8~16文字のランダムなパスワードが100個作成された。