Quantcast
Channel: クエリな午後

16歳の決心


MSILでアセンブラ短歌に挑戦した

$
0
0
セキュリティキャンプの課題で、アセンブラ短歌というものに挑戦してみました。
アセンブラ短歌とは
アセンブラ短歌とは、サイボウズのセキュリティキャンプグループに川合さんがされた投稿によると、
(1) アプリケーションヘッダ的なものは基本的に31バイトに加算されない。OSECPUでいえば、最初の 05 E1 はノーカウント。
(2) 31バイトはすべてCPUによって詠まれる(=実行される)必要がある。
つまり文字列データを31バイト内のどこかに置いて、それを1バイトずつ読みながら文字表示するなんていうのはルール違反。
メモリを確保して、そこへ機械語でデータを書き込んで、そのデータを使って表示させるのはOK。
(3) 機械語命令は、5,7,5,7,7の区切りで切れなければいけない。つまり8バイト命令とかは使用不能。
7のところに3+2+2を詰め込むことはOK。
というものらしいです。
それで、私は「lambdaliceさんはILでやってね」と言われてしまったので、ECMA-335を読みあさり、なんとか書いてみました。
やってみたよ!
HeaderやMetadataは加えなくて良いということなので、純粋に自分の書いたコードの部分だけです。
16 0a 17 0b 06
28 01 00 00 0a 06 07
58 0c 07 0a 08
0b 07 20 e8 03 00 00
2f 02 2b e8 2a 00 00
ILAsmで書いた実際のコードは、
.method static void main()
{
ldc.i4.0
stloc.0
ldc.i4.1
stloc.1
lb: ldloc.0
call void[mscorlib]System.Console::WriteLine(int32)
ldloc.0
ldloc.1
add
stloc.2
ldloc.1
stloc.0
ldloc.2
stloc.1
ldloc.1
ldc.i4 0x3e8
bge.s ex
br.s lb
ex: ret
}
です。ILDASMにかけると、
IL_0000:  /* 16   |                  */ ldc.i4.0
IL_0001: /* 0A | */ stloc.0
IL_0002: /* 17 | */ ldc.i4.1
IL_0003: /* 0B | */ stloc.1
IL_0004: /* 06 | */ ldloc.0
IL_0005: /* 28 | 0A000001 */ call void [mscorlib]System.Console::WriteLine(int32)
IL_000a: /* 06 | */ ldloc.0
IL_000b: /* 07 | */ ldloc.1
IL_000c: /* 58 | */ add
IL_000d: /* 0C | */ stloc.2
IL_000e: /* 07 | */ ldloc.1
IL_000f: /* 0A | */ stloc.0
IL_0010: /* 08 | */ ldloc.2
IL_0011: /* 0B | */ stloc.1
IL_0012: /* 07 | */ ldloc.1
IL_0013: /* 20 | E8030000 */ ldc.i4 0x3e8
IL_0018: /* 2F | 02 */ bge.s IL_001c
IL_001a: /* 2B | E8 */ br.s IL_0004
IL_001c: /* 2A | */ ret
となります。最後のNOP(0x00)2つは許してください。
そして、実行すると、
0
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
と、0x3e8より小さいフィボナッチ数をぜんぶ表示します。

セキュリティ・キャンプ中央大会2013に参加しました。

$
0
0

↑をBGMにご覧ください。

セキュリティ・キャンプ中央大会2013 セキュアなシステムクラス セキュアなOSを作ろうゼミに参加してきました。

僕は、OSECPUのための高級関数型言語、Fulynを開発してきました。

行ってから知ったのですが、僕が今回の最年少だったようです。

セキュキャンで、たくさんの同世代の友人、素晴らしいチューター、そして日本でもトップクラスの講師陣の皆様と知り合うことが出来て、本当によかったです。

また、CTFやグループワークなどで下記の各種景品を頂きました。






高すぎて僕には手の出ないような、それで喉から手が出るようなものをもらってしまって、本当に申し訳ない思い出いっぱいです。

協賛企業の皆様、実行委員会の皆様、IPAの皆様、その他セキュキャンに関わったすべての方々に、厚くお礼を申し上げます。

さて、今回の成果物である関数型言語Fulynは、上のリンクにて絶賛開発中()です。

FulynをU-20プログラミングコンテストに応募する予定なので、そちらもよろしくおねがいします。

以下、ログっぽいやつです。

セキュキャン一日目


一日目は、東京駅の銀の鈴の前に友達と集合し、みんなで海浜幕張に向かいました。

会場近くのファミマでレッドブルを六本購入し、会場に向かいました。

行って初めて分かったのですが、僕が最年少だったようで、周りに年上しかいませんでした。

着いてすぐ、昼食前にラウンジで名刺交換をしました。

それから昼食を食べました。カレーだったので昼食には重く、少し残しました。

それから全体講義を聴きました。

Winnyの話や、サイバー攻撃の視覚化の話、「ハッカー検事」さんの(数年前の2chネタ満載の)ネット犯罪についての話などを聴きました。

夕食前に、NHKのおじさんに物陰に連れ込まれてあんなこと(インタビュー)やこんなこと(取材)をされました。

夕食はとんかつでした。やっぱり少し残しました。

夕食後はグループワークの課題を決めました。われら「]-[4+ (/-\-|-」チームは、「ストーキング・エンジニアリング」というテーマで進めることにしました。

グループワークの後は、お風呂に入って、ネットをして、寝ました。

夜中に有線LANが突然死んだりしておもしろかったです。

二日目

二日目は、朝から晩まで専門講義の時間でした。

セキュキャン前に作ってきたコンパイラが全く動かなかったので、午前中になんとか動くようにしました。

午後はAPIの呼び出しと、ラムダ式(クロージャ)の実装をしていました。

実装は講義時間の終了間際に間に合い、自作言語「Fulyn」は本格的に関数型言語というようになってきました。

今日は日経と共同通信社の人から取材を受けました。

読売新聞の人ともおしゃべりしました。

こわかったです。

朝ごはんは寝坊してしまったせいで食べませんでした。

昼ごはんはチャーハンなどの中華でした。ウェイパーの味がしました。

夜ご飯は鳥のステーキでした。おいしかったです。

夜は、シャワーを浴びて、Gitにコミットして、Twitterをして寝ました。

三日目

今日はきちんと起きて、午前中は企業見学に行きました。

六本木にバスで行って、Yahoo! Japanの見学をしました。

Yahoo!がどんな企業か、Yahoo!がどんなセキュリティ対策をしているか、という話を聞きました。

部外秘なので書けませんが、とてもおもしろい話が聞けました。

それから、Yahoo!でも実際にやっているという、「Ideathon」(idea+marathon)というものをやりました。

これは、グループでアイデアを拡散させて、収束して、形にする、という作業を1時間でやるものです。

みんなで、複数のID:PASS管理について、アイデアを出し合って、発表しました。

とても楽しかったです。

それから、Yahoo!の社内見学に行きました。

おしゃれで、きれいで、楽しそうな職場でした。

何人かがカフェみたいなところでスマフォアプリを作っていたり、インターンの学生さんが働いていたりしました。

途中で「Life is Tech」(小中高生向けのアプリ開発キャンプ)の会場がちらっと見えました。

僕より若い子たちがMacBookでiPhoneアプリを作っていて、いろいろと格差と劣等感を感じました。

最後に、アンケートを書いて、帰りました。

午後は、Fulynの標準ライブラリと、サンプルを書きました。

文字の入出力を実装したり、コンパイラのバグをいくつか潰したりしました。

それから、FizzBuzzや、フィボナッチなどのサンプルや、水玉模様を書くサンプルを書きました。

関数型らしい美しいサンプルが書けたと思います。

今日も取材を受けて、緊張しました。

夜は、BoFをやりました。

僕たちは、アセンブラ短歌をやりました。

僕は、MSILでフィボナッチをする歌を詠んで、みんなの前で発表しました。

それから、チューターさんのプレゼンを聴きました。

CTFを作ったり、Windowsカーネルを監視したりしていて、すごいなーと思いました。

それから、グループワークをして、スライドを少し作りました。

朝ごはんはサラダだけ食べました。

昼ごはんは天丼で、けっこうおいしかったです。

夜ごはんは豚のしょうが焼きで、七分の三くらい残しました。

豚肉が硬かったです。

グループワークのあとは、シャワーを浴びて、作業をして寝ました。

四日目

四日目は、午前中は専門クラスの作業をしました。

Fulynに末尾再帰最適化を実装して、再帰関数がいくら再帰してもスタックを食いつぶさないようにしました。

これで、やりたいことが全て実現出来ました。

それから、昨日の夜作ったスライドを少し書き足しました。

それから、クラス内で成果発表をしました。

僕は、Fulynにどんな機能をつけたか、Fulynがどれだけ美しいかをプレゼンしました。

他の人の発表は、みんなすごいことをしていて、すごいと思いました。

例えば、組み込みのセキュリティについて研究した人や、mrubyの実行をサンドボックスで行うようにした人がいました。

午後は、CTFをしました。

8086プロセッサのNOPについての問題や、XSSの問題などが、全部で40問以上出てきました。

難しい問題ばっかりで、わからないものが多かったですが、Google先生に聞きまくりながら、なんとかわかるものだけ解いていきました。

チームメイトに凄い人がいて、一人で2500Ptくらい稼いでいました。

僕は結局、800Ptくらいしか稼げませんでした。

しかしなんと優勝してしまい、人生初の囲み取材を受けました。

とても緊張しました。

でも、優勝できてよかったです。

朝ごはんはサラダだけ食べました。

昼ごはんは、鳥の南蛮焼きで、とてもおいしかったです。

夜ごはんは、ハヤシライスで、食べられませんでした。

CTFのあとは、シャワーを浴びて、グループワークの資料を作りました。

五日目

五日目は、最終日でした。

午前中は、グループワークの発表をしました。

「ストーキング・エンジニアリング」は、成功はしましたが、特定された側のまっちゃだいふくさんは「僕の手の中で踊らされてただけ」とおっしゃっており、少し悔しかったです。

「宅配テロ」についての発表がとてもおもしろく、最優秀賞を取っていました。

我々も優秀賞をとることができ、CTFでもグループワークでも賞を取った唯一のチームになりました。

それから、クラスの発表会をしました。

どこのクラスもすごいことをやっていて、すごいなーと思いました。

それから、閉校式でした。

疲れていたので、あんまり覚えてません。

表彰の時に、CTFとグループワークの賞品をもらいました。

なんと、HHKB Proでした。

本当によかったです。

最後にみんなで写真撮影をして、おひらきとなりました。

それから、みんなで秋葉原に行って、ゲーセンに行って、帰りました。

Markdown HereがBloggerでの不具合を解決したようです

$
0
0

Blogger で Markdown!

見出しサンプル

Blogger behaviour is greatly improved now.
void Foo()
{
Console.WriteLine("foo");
}
Github に issue を投げてから二か月、ついに修正されました。完璧です。
adam-p氏によるサンプルもご覧ください。
シンタックスハイライト、リスト表記、見出し、その他Markdownでできることすべてブログでできます。
もうインストールが面倒なSyntaxHighlighterを使う必要はなさそうですね。
adam-p氏によると次のリリースで使用可能になるようです。

U-20プログラミングコンテストで経済産業大臣賞を受賞しました

$
0
0
僕が開発した関数型言語Fulynが、U-20プログラミングコンテストにて経済産業大臣賞を受賞しました。
正直このようなニッチでマニアックなプログラミング言語がこのような名誉ある賞をいただけることに、嬉しいというよりかは驚いています。
最終審査会では、出会った多くの同年代の開発者の方々、また現役開発者の方々とお話し、とても勉強になりました。
Fulynが美しいプログラミング言語であるのは、ひとえにアドバイスを下さった現役開発者の方々、セキュリティ・キャンプの講師やチューターの方々、セキュリティ・キャンプの同級生の方々、
そしてなにより、OSECPUの開発者かつセキュアなOSを作ろうゼミ講師の、川合秀実氏のおかげです。この場を借りてお礼申し上げます。
しかし僕はまだ現状のFulynにまだ満足していません。現在開発中のv1.1以降では型推論の強化や構文のさらなる改良、他のプラットフォームへの対応を目指しています。
来年度は、まだ経験のない集団開発やスマートフォンアプリ開発に挑戦し、自分たちの理想を突き詰めたアプリケーションを開発したいと思っています。そして、再び経済産業大臣賞をいただくことができれば幸いです。
main

write("Thanks!")

end

Dentoo.LT #5でしゃべってきました

$
0
0
11/10に電気通信大学で行われたDentoo.LT #5に参加してきました。
masawadaさんに「しゃべってよ」と言われてしまい、初参加なのにしゃべることになってしまいました。
自作言語の設計、コンパイラの構築、最適化の手法などについて話してきました。
ほかの人の講演はとてもおもしろく、勉強になりました。
まわりに年上の人しかいなかったのでこわかったです。
終了後にみんなで食べに行ったごはんがおいしかったです。

Linux で C# を書かない人にはわからないこと

$
0
0
当たり前だけど、Monoでのコードの動作はオリジナルの.NETと微妙に差異があったりする。例えば、
A default installation of Mono doesn't trust anyone!
要するに、Monoで
WebRequest.Create ("https://hoge.jp/");
は例外を吐く。
これはMonoがデフォルト状態でルート証明書をひとつもインストールしていないからである。

解決法1

Monoにルート証明書をインストールするには certmgr コマンドを用いる。また、 mozroots コマンドでMozillaの使っているルート証明書を持ってこれる。これは、mono-develパッケージに同梱されている。
ただ当然これは環境を汚すし、どこでも同じように動くというわけにはいかない。

解決法2

ソースコード側で対応することもできる。

雑な対応

無視する。
ServicePointManager.ServerCertificateValidationCallback = (_, __, ___, ____) => true;

マシな対応

警告を出す。
ServicePointManager.ServerCertificateValidationCallback = (_, certificate, __, err) => 
{
if(err == 0) returntrue;
elseif(err == -2146762486) // trust failure
{

Console.WriteLine("Do you trust this certificate? [subject: " + certificate.Subject + ", issuer: " + certificate.Issuer);
return Console.ReadLine ().ToLower () == "y";

}
elsereturnfalse;
};

おまけ

Nobody has shown enough interest in the following:
  • PowerShell
とMonoのCompatibilityのページにある。かわいそう。

0.02秒届かない話

$
0
0
0.02mmではありません。

例の新入女子社員ハッカソンで、C#の最速スコアが0.03秒だったのですが、僕が0.04秒から0.01秒削減しようとあがいている間にhaxeさんが0.02を出していましたという話。
下手にメモ化すると逆に重くなるし、クイックソートでもインサートソートでも全く速度が変わらない(=ケース数が少ない?)し、もうよくわかりません。
とりあえず、 using System.Linq; がないというC#ではないなにかになってしまいました。
結果はこちら。Sランクだって、やったね。
using System;

class Poh
{
constint Switch = 32;

staticvoid Sort(int[] arr)
{
QuickSort(arr, 0, arr.Length - 1);
}

staticvoid InsertSort(int[] arr, int s, int e)
{
var _ = 0;
for (var i = s + 1; i <= e; i++)
for (var j = i; j > s && arr[j - 1] > arr[j]; j--)
{
_ = arr[j]; arr[j] = arr[j - 1]; arr[j - 1] = _;
}
}

staticvoid QuickSort(int[] arr, int s, int e)
{
if(e - s < Switch)
{
InsertSort(arr, s, e);
}
else
{
var l = s;
var r = e;
var _ = 0;
var p = arr[s];
while(l <= r)
{
while(l < e && arr[l] < p) l++;
while(r > s && arr[r] > p) r--;
if(l > r) break;
_ = arr[l]; arr[l] = arr[r]; arr[r] = _;
l++; r--;
}
QuickSort(arr, s, l - 1);
QuickSort(arr, l, e);
}
}

staticvoid Main()
{
// read s, n
var s = Console.ReadLine().Split('');
var n = int.Parse(s[0]); var d = int.Parse(s[1]);

// initalize
var p = newint[n]; var m = newint[d];

// read p, m
var _ = 0; var __ = 0;
for(_ = 0; _ < n; _++)
p[_] = int.Parse(Console.ReadLine());
for(_ = 0; _ < d; _++)
m[_] = int.Parse(Console.ReadLine());

// sort descending
Sort(p);

// tmp variables
var max = 0;
foreach(var i in m)
{
var start = -1;
for(_ = n - 1; _ >= 0; _--)
if(p[_] < i) { start = _; break; }
if(start < 0)
Console.WriteLine(0);
else
{
if(p[n - 1] * 2< i)
continue;
max = 0;
// search maximum
for(_ = start; _ >= 0; _--)
for(__ = start; __ >= 0; __--)
{
if(_ == __) continue;
var r = p[_] + p[__];
max = (r <= i && r > max) ? r : max;
if(max == i) goto exit;
}
exit:
Console.WriteLine(max);
}
}
}
}

NemerleのマクロでBrainfuckをコンパイルしてみた

$
0
0
TwitterでBrainfuck処理系の話題になってたので、勉強中のNemerleのマクロでコンパイル時にコンパイルしてやろうじゃないのと思ってやってみた。
リポジトリはこちら
using System;
using System.Linq;
using System.Collections.Generic;
using System.Console;
using Nemerle;
using Nemerle.Imperative;
using Nemerle.Compiler;

macro bf(s : string)
mutable exps = [ <[def buf = array(30000)]>, <[mutable p = 0]> ]
def parse (str : array[char])
mutable expslocal = [ <[ ]> ]
for(mutable i = 0; i < str.Length; i++)
def c = str[i];
match(c)
| '>' => expslocal += [ <[ p++; ]> ]
| '<' => expslocal += [ <[ p-- ]> ]
| '+' => expslocal += [ <[ buf[p] = buf[p] + 1 ]> ]
| '-' => expslocal += [ <[ buf[p] = buf[p] - 1 ]> ]
| '.' => expslocal += [ <[ Write(buf[p] :> char) ]> ]
| ',' => expslocal += [ <[ buf[p] = Read() ]> ]
| '[' =>
{
mutable nest = 1; mutable count = 0;
while(nest > 0)
{
count++;
if(str[i + count] == '[')
nest++;
else when(str[i + count] == ']')
nest--;
}
mutable code = array(count);
Array.Copy(str, i + 1, code, 0, count - 1);
def parsedcode = parse(code);
expslocal += [ <[ while(buf[p] > 0){ $parsedcode }]> ];
i += count;
}
| _ => {}
<[ { .. $expslocal } ]>
exps += [parse(s.ToCharArray())]
<[ { .. $exps } ]>
これをコンパイルしてできたマクロライブラリを参照に加えて、Nemerleで以下のようなコードを書く。
bf("+++++++++[>++++++++>+++++++++++>+++++<<<-]>.>++.+++++++..+++.>-.------------.<++++++++.--------.+++.------.--------.>+.")
すると、コンパイル時にBrainfuckコードが解釈されてNemerleのコードに置き換わり、コンパイルされる。
それをILSpyとかでC#にしてみるとこんな感じ。
publicstaticvoid Main ()
{
int[] array = newint[30000];
int num = 0;
checked
{
array [num]++;
array [num]++;
array [num]++;
array [num]++;
array [num]++;
array [num]++;
array [num]++;
array [num]++;
array [num]++;
while (array [num] > 0)
{
num++;
array [num]++;
array [num]++;
array [num]++;
array [num]++;
array [num]++;
array [num]++;
array [num]++;
array [num]++;
num++;
array [num]++;
array [num]++;
array [num]++;
array [num]++;
array [num]++;
array [num]++;
array [num]++;
array [num]++;
array [num]++;
array [num]++;
array [num]++;
num++;
array [num]++;
array [num]++;
array [num]++;
array [num]++;
array [num]++;
num--;
num--;
num--;
array [num]--;
}
num++;
Console.Write ((char)array [num]);
num++;
array [num]++;
array [num]++;
Console.Write ((char)array [num]);
array [num]++;
array [num]++;
array [num]++;
array [num]++;
array [num]++;
array [num]++;
array [num]++;
Console.Write ((char)array [num]);
Console.Write ((char)array [num]);
array [num]++;
array [num]++;
array [num]++;
Console.Write ((char)array [num]);
num++;
array [num]--;
Console.Write ((char)array [num]);
array [num]--;
array [num]--;
array [num]--;
array [num]--;
array [num]--;
array [num]--;
array [num]--;
array [num]--;
array [num]--;
array [num]--;
array [num]--;
array [num]--;
Console.Write ((char)array [num]);
num--;
array [num]++;
array [num]++;
array [num]++;
array [num]++;
array [num]++;
array [num]++;
array [num]++;
array [num]++;
Console.Write ((char)array [num]);
array [num]--;
array [num]--;
array [num]--;
array [num]--;
array [num]--;
array [num]--;
array [num]--;
array [num]--;
Console.Write ((char)array [num]);
array [num]++;
array [num]++;
array [num]++;
Console.Write ((char)array [num]);
array [num]--;
array [num]--;
array [num]--;
array [num]--;
array [num]--;
array [num]--;
Console.Write ((char)array [num]);
array [num]--;
array [num]--;
array [num]--;
array [num]--;
array [num]--;
array [num]--;
array [num]--;
array [num]--;
Console.Write ((char)array [num]);
num++;
array [num]++;
Console.Write ((char)array [num]);
}
}
FizzBuzzも
bf("++++++[->++++>>+>+>-<<<<<]>[<++++>>+++>++++>>+++>+++++>+++++>>>>>>++>>++<<<<<<<<<<<<<<-]<++++>+++>-->+++>->>--->++>>>+++++[->++>++<<]<<<<<<<<<<[->-[>>>>>>>]>[<+++>.>.>>>>..>>>+<]<<<<<-[>>>>]>[<+++++>.>.>..>>>+<]>>>>+<-[<<<]<[[-<<+>>]>>>+>+<<<<<<[->>+>+>-<<<<]<]>>[[-]<]>[>>>[>.<<.<<<]<[.<<<<]>]>.<<<<<<<<<<<]")
でいける。
なぜか100までの素数を表示するやつ
bf(">++++[<++++++++>-]>++++++++[<++++++>-]<++.<.>+.<.>++.<.>++.<.>>++[<--->-]<..<.>.++.<.>--.>++[<+++>-]<.<.>>++[<--->-]<.>++[<++++>-]<.<.>>++[<--->-]<-.+.<.>-.>+++[<++>-]<+.<.>>++[<--->-]<.--.<.>++.++++.<.>---.---.<.>++.-.<.>+.+++.<.>--.--.<.>++.++++.<.>---.-----.<.>+++++.+.<.>.>++[<--->-]<.<.>>++[<+++>-]<.----.<.>++++.++.<.>-.-----.<.>+++++.+.<.>.--.")
はコンパイラがStackOverFlow吐いてコンパイルできなかった。うむむ。

JOI 予選の入出力についてについて

$
0
0
こちらの方の記事も触れられている通り、JOI予選の入出力にはリダイレクトを活用しましょう。
ただ、
./a.out < 2013-yo-t$1-in1.txt > 2013-yo-t$1-out1.txt
./a.out < 2013-yo-t$1-in2.txt > 2013-yo-t$1-out2.txt
./a.out < 2013-yo-t$1-in3.txt > 2013-yo-t$1-out3.txt
./a.out < 2013-yo-t$1-in4.txt > 2013-yo-t$1-out4.txt
./a.out < 2013-yo-t$1-in5.txt > 2013-yo-t$1-out5.txt
は少し年ごとの変更や、違う言語でのコーディング、万が一入力ファイルの数が増加した時の変更が面倒なので、
for i in `seq 15`
do ./$1< 2014-yo-t$2-in$i.txt > 2014-yo-t$2-out$i.txt
done
という風にすると良いと思います。
また、bashでは
for i in {1..5}; do
./
$1< 2014-yo-t$2-in$i.txt > 2014-yo-t$2-out$i.txt
done
とできます。
使い方は、これを「run.sh」という名前で保存した場合、第一問を実行する場合、
./run.sh a.out 1
という感じとなります。問題ごとに出力するバイナリの名前を変更している場合や、そもそもexeだったりする場合も、a.outの部分を指定することで対応できます。

Xなしで暮らす方法

$
0
0
Xなしで暮らす方法を書こうと思う。

zsh

CUI環境には強力なシェルが必要である。
zshはシェルの中でも1、2を争う強力なシェルである。
補完の強力さ(コマンドラインオプションまで補完してくれる)、優秀なフレームワークの存在、まさに「Z」の名にふさわしいシェルである。

fbterm

何より、日本語が表示出来なくてはならない。
X無しで日本語を表示するには、fbtermという、フレームバッファを使って高速に描画できる端末エミュレータを用いる。
fbtermは描画も美しく、なによりフォントを変更することができる。ちなみにjfbtermというものもあるが、こちらはより古く動作が不安定らしい。
fbtermは、たいていのディストリビューションならリポジトリに標準で含まれているのでインストールも簡単である。ただし、使用するユーザがvideoグループに含まれていないとフレームバッファが使用できない制約があるので注意すること。

uim-fep

次に、日本語入力をできるようにする。
Xなしでの日本語入力はuim-fepが可能にする。fbterm用のibusフロントエンドibus-fbtermも存在するが、ibusはXを必要とするのでここでは取り上げない。
uim-fepはuimのCUI用フロントエンドであり、MozcやAnthyなどの著名な変換エンジンを利用できる。これもまた、たいていのディストリビューションならリポジトリに含まれている。
/usr/share/uim/generic-key-custom.scm を編集してキーバインドを変えることを推奨する(そのままではうまく動かない場合がある)。

tmux

tmuxは最高の端末エミュレータである。ペインの分割、ウィンドウの作成、リサイズ、入れ替え、自由自在だ。だが、GNU Screenから移行した方にはとっつきにくいかもしれない。
有名なソフトウェアゆえ説明はいらないと思うので割愛する。
fbterm上でtmuxを走らせることで基本的なCUI環境は完成する。

lynx / w3m

好みのCUIのウェブブラウザを挙げる時に、よくlynxw3mでの対立が見られる(私はどちらかと言えばlynxが好き)。
lynxはデフォルトでクッキーを受け付けるかどうかをいちいち聞いてくるので、「o」キーを押して設定を変更するべきだ。「Save to a local file」にチェックを入れないと保存されないので注意。
w3mは全体的に使いやすいブラウザだが、特筆すべきはw3m-imgの存在だ。w3m-imgの有効化によりw3mは「テキストブラウザ」から「グラフィカルブラウザ」に変貌を遂げる。
lynxはメッセージがいちいち愉快(「そう来なくっちゃ!」や、「キャンセルしました!!!!」など)。

vim / emacs / nano

特定宗教する気はないのでまとめて紹介する。
ぶっちゃけCUIのテキストエディタならなんでも良いとも言える。それこそedでも。
ただ、X無しで暮らすには、やはりvimやemacsなどプラグインが充実していてIDE並みの使用感を得られるエディタを使うべきではある。
ちなみに、私はvimを使っている。

mplayer2 / cmus

ここまで来たら、動画や音楽だってXを起動せずに鑑賞したい。
mplayer2は、コマンドラインで操作する典型的な動画プレイヤーだが、アウトプットオプションに「aa」というのがあり、アスキーアートで動画を鑑賞することができる。
CUIから動画の再生位置や音量などを変更できるし、軽快に動作する。
Xなしで使える音楽プレイヤーは数多くあるが、私はcmusをおすすめする。
軽量で、対応するフォーマット数がそれなりに多いし、巻き戻しやリピートの際に音のギャップが生じない。見た目もカスタマイズ可能だし、さらにいいことに、vi風キーバインド対応である。

ged

XなしでTwitterもしたい。
gedは、何を隠そう、私が作ったコマンドライン用のTwitterクライアントである。
Nemerleという強力な言語で書かれており、cursesを必要とせず、Mono Runtime上で動作する。
gedの特徴は、ツイートを一意な64進数で表現するため非常にツイートの指定がしやすい(他のCUIクライアントだとそのプロセス限りのIDを使用する場合が多い)ことと、ストリーミングが可能なこと、さらにリプライの送信時にツイートIDからメンション先を補完してくれることである。
また、まともなメールでのツイートサービスがない現状を憂い、メールでツイートをするためのサーバとして機能するモードを搭載している。

注意

vimやemacsユーザ、zshユーザの方は特にtmuxの設定ファイルをいじる際には時計をよく見ること。止まらなくなる。

マイナー言語 Advent Calendar 2013 #16: Nemerle について

$
0
0
この記事はマイナー言語 Advent Calender 2013の16日めの記事です。
本当は Nemerle を使って他のマイナー言語を実装してみようと思ったのですが、めんどくさくなっちゃったので Brainfuck でお茶を濁します。

Nemerle の紹介

Nemerle とは、 .NET Framework 上で動作する静的型付けのマルチパラダイム言語です。
端的に表現するなら、C# と Lisp と ML を足して3で割らない感じです。
(私含め)ユーザも多いですが、「マイナー言語」の条件が「邦訳の書籍が出ていない」という条件だったので紹介しています。

Nemerle のかんたんな歴史

Nemerle は、2003年頃にポーランドにある Wrocław Universityの Kamil Skalski ら四人によって開発されました。
メイン開発者が Microsoft に引きぬかれてしまい、死んだかと思われていましたが、最近はロシアの開発コミュニティである RSDNが中心となって開発しています。

Nemerle の特徴

  • C# に似た構文
  • よくできた型推論
  • 強力なマクロ
  • 関数型諸機能

Nemerle の例

Nemerle では、C# と同じように名前空間やクラスを使ってプログラムを書くことが出来ます。
static classがmoduleと書かれるなど相違点はありますが、C#をやっていればなんとなく読めるのではないでしょうか。
using System;
namespace Example
{
module Hello
{
Main() : void
{
Console.WriteLine("Hello!");
}
}
}
また、Nemerleではmodule(つまり、static class)を名前空間のようにオープンすることができます。
using System.Console;
namespace Example
{
module Hello
{
Main() : void
{
WriteLine("Hello!");
}
}
}
また、インデント記法を用いることもできます。
using System.Console
namespace Example
module Hello
Main() : void
WriteLine("Hello!")
最後に、クラスなどの記述を省略することも出来ます。
using System.Console;
WriteLine("");

Nemerle のマクロ

Nemerle のマクロは非常に強力で、構文木をいじることが可能です。
Nemerle で式をクォートするには、<[]>で囲みます。
<[ WriteLine("Hello") ]>
マクロは、このクォートされた式を返す関数として実装することができ、コンパイル時に置き換えられます。
macro Hello()
{
WriteLine("Hello on compiling!");
<[ WriteLine("Hello on executing!") ]>;
}
というマクロを定義すると、
Hello();
という Nemerle プログラムは、コンパイル時に「Hello on compiling!」と表示され、
WriteLine("Hello on executing!");
に置き換えられます。
また、クォートの外の変数を、 $ をつけることで利用することも出来ます。
macro Plus(a : int, b : int)
{
def x = a + b;
<[ $x ]>
}
というマクロは、 Plus(3, 4) という式を単純に7に置換します。

複雑なマクロ

Nemerle のマクロはコンパイル時に「なんでも」行うことが出来ます。
そう、例えば、 Brainfuck コードを処理したり・・・
using System;
using System.Linq;
using System.Collections.Generic;
using System.Console;
using Nemerle;
using Nemerle.Imperative;
using Nemerle.Compiler;

macro bf(s : string)
mutable exps = [ <[def buf = array(30000)]>, <[mutable p = 0]> ]
def parse (str : array[char])
mutable expslocal = [ <[ ]> ]
for(mutable i = 0; i < str.Length; i++)
def c = str[i];
match(c)
| '>' => expslocal += [ <[ p++; ]> ]
| '<' => expslocal += [ <[ p-- ]> ]
| '+' => expslocal += [ <[ buf[p] = buf[p] + 1 ]> ]
| '-' => expslocal += [ <[ buf[p] = buf[p] - 1 ]> ]
| '.' => expslocal += [ <[ Write(buf[p] :> char) ]> ]
| ',' => expslocal += [ <[ buf[p] = Read() ]> ]
| '[' =>
{
mutable nest = 1; mutable count = 0;
while(nest > 0)
{
count++;
if(str[i + count] == '[')
nest++;
else when(str[i + count] == ']')
nest--;
}
mutable code = array(count);
Array.Copy(str, i + 1, code, 0, count - 1);
def parsedcode = parse(code);
expslocal += [ <[ while(buf[p] > 0){ .. $parsedcode } ]> ];
i += count;
}
| _ => {}
expslocal
exps += parse(s.ToCharArray())
<[ { .. $exps } ]>
ここで解説しておかないといけないのは、 Nemerle の配列についてです。
Nemerle の配列は、 [] で囲った中に , で区切って記述します。
また、配列を初期化するには、 array(index) とします。その後の利用状況から推論されるので、型を書かない(書けない)のが素晴らしいですね!
また、 <[ ]> で囲ったコードを配列に入れ、他の <[ ]> の中で
<[ ..$array ]>
とすることで、配列の中のコードを全て連結できます。
さて、先ほどのコードが何をやっているかというと、
bf("+++++++++[>++++++++>+++++++++++>+++++<<<-]>.>++.+++++++..+++.>-.------------.<++++++++.--------.+++.------.--------.>+.")
というような Brainfuck コードを一文字ずつ読み取り、対応する Nemerle コード片にコンパイル時に置き換えます。
高度なメタプログラミングができる .NET 言語、それが Nemerle なのです。

おわりに

Nemerle は Visual Studio 統合がリリースされており、 IntelliSense を使って補完しながらコードを書くことが出来ます。
Nemerle の日本語情報は、 kos59125さんのブログが詳しいです。
そんなにマイナーでもない Nemerle で是非プログラミングしてみませんか?

つらぽよ Advent Calendar 2013 Final - 僕のマシン

$
0
0
この記事はつらぽよ Advent Calendar 2013の25日目の記事です。
僕の趣味はプログラミングですが、僕の家庭はパソコンが禁止です。そのため、今まで数々の過酷な開発環境を経験してきました。
低スペックすぎて最近のスマートフォンに負けるのは当然として、そこら辺の仮想マシンにすら負けるのはつらみしかありません。
今日はその、僕が今まで使ってきたマシンについて話します。

EeePC (型番不明)

スペック不明
部活のマシンです。
Visual Studio 2010が全く動かず、2008も動作がもっさりするようなマシンです。
まだゲームを作っていた頃はこれで満足していました。

Dell Latitude X300

CPU: Intel Pentium M 738 1.40GHz (だったと思う)
RAM: 640MB(128 + 増設512)
HDD: 60GB
僕の最初のマシンです。
僕が中学生の時に、秋葉原の中古ショップでお金を貯めて買いました。
OSはWindows XPで、Visual Studio 2008 Expressを入れて開発していました。
バッテリと電源ユニットがイカレており、電源に接続しながら必死こいてコードを書いていたのが思い出されます。
この頃開発したソフトウェアに、「マリアリ大陸」や「Alicium」があります(コードの汚さが黒歴史レベルだったゆえ現存しません)。昔の僕をご存じの方はご存知かもしれません。

QEMU on SHARP Brain

CPU: 不明
RAM: 不明
HDD: 不明
中学生の時に電子辞書を買ってもらったのですが、この電子辞書はWindows CEが動いており、僕はすぐに夢中になりました。
QEMUのWinCEビルドを使ってMinixを走らせて、viとccでコードを書いていました。
QEMUがロックできたRAMは50MBくらいしかなかったと記憶しています。

VersaPro VY93M/C-4

CPU: Intel Celeron M 523 933MHz
RAM: 1024MB
HDD: 40GB
僕が中学三年生から高校一年生の夏あたりまで使っていたマシンです。
中学二年の後半辺りからUbuntuに傾倒していたのもあって、OSはUbuntuでした。
軽くて丈夫で、持ち歩きやすいマシンでした。速度面では、Celeronにしては速いなーと思いました。
今年の7月末頃、グラボがお亡くなりになり、手放しました。
このマシンで作られたソフトウェアには、.NET用のTwitterライブラリCoreTweet(コミットログがカオスだったため最近リポジトリを作り直しました)や、
U-20プログラミングコンテストで経済産業大臣賞を受賞したりしたプログラミング言語Fulynのコンパイラなどがあります。

まとめ

低スペックなマシンで作業することは別に苦ではありませんが、やる気は削がれます。
IDEは使わなくなりますし(重い)、GUIアプリやゲームは作る気が起きず(最悪重くて動かない)、スマートフォンアプリなんてもってのほか、CUIのソフトウェアやコンパイラばかり作る、僕のような人間になってしまいます。
僕のような人間を増やさないために、親の方は子供にマシンを買ってあげましょう。
MacBookください

あけましておめでとうございます。

$
0
0


あけましておめでとうございます。
パリにいます。
今年もよろしくおねがいします。

今年の抱負は、知らないことを知りたいです。

checkinstall と GitHub Pages で始めるお手軽APTリポジトリ

$
0
0

PPA is 超めんどくさい

PPAってご存知ですか?Ubuntuの、オレオレAPTリポジトリを手軽に提供できるアレです.
PPAを使うと,
$ sudo apt-add-repository ppa:someone/hoge
って感じで手軽にリポジトリを追加できます.
しかし、作る側は大変です.
  • いちいちdebianパッケージを作らないといけない
dh_make して, debian フォルダ以下のファイルをいちいち編集しないといけません.
  • 公開鍵を作らないといけない
keyserver.ubuntu.com に投げるのですが,超遅くて30分くらいかかります.
  • めっちゃ reject される
changelog に unstable とか書いてあると速攻で落とされます.
  • 更新が超遅い
サーバー上でビルドするので超遅いです.
これら全ての問題を解決する方法があります; checkinstall と GitHub Pages です.

checkinstall を使う

checkinstall は超簡単に debian などのパッケージを作成できるユーティリティです.
どのくらい簡単かというと,
$ ./configure
$ make
$ checkinstall
でパッケージが生えてきます.
make install の代わりに checkinstall ( もちろん, prefix が root 権限を必要とする場所なら sudo が要ります ) を叩き,ちょっとした情報を入力するだけです.
ね,簡単でしょ?

GitHub Pages 上に APT リポジトリを構築する

こちらが本編です.
GitHub Pages は実際ただの静的 Web ページならなんでもいいので, APT リポジトリも設置できます.
ぼくが作ったものはこれです: http://lambdalice.github.io/repo/
APT には apt-ftparchive というコマンドがあり,これを使うことで複数の deb ファイルから APT リポジトリに必要な Contents, Packages, Release などのファイルを生成してくれます.
apt-ftparchive は, apt-utils パッケージに含まれています.

1. GitHub Pages を作成する

・・・方法は,インターネット上にたくさんエントリが書かれているのでそれを見てください.

2. パッケージを配置する

例えば, availables ディレクトリに deb ファイルを配置します.

3. apt-ftparchive を使用してリポジトリに必要なファイルを作成する

$ apt-ftparchive sources availables > Sources
$ apt-ftparchive packages availables > Packages
$ apt-ftparchive contents . > Contents
$ apt-ftparchive release . > Release
とすることで, deb ファイルから必要な情報を生成します.

4. gzip 圧縮をかける (必要ならば)

$ gzip -c9 Sources > Sources.gz
$ gzip -c9 Packages > Packages.gz
$ gzip -c9 Contents > Contents.gz
小規模なリポジトリなら,しなくても大丈夫です.

5. コミットしてプッシュする

GitHub サーバ側での jekyll レンダリングを伴わない場合, GitHub Pages の更新は一瞬で完了します (おそらく).
これで, GitHub Pages は完全に APT リポジトリとして機能します.
このリポジトリを追加するには,
$ sudo apt-add-repository "deb http://your.github.io/repodir/ ./"
とします( Release ファイルがリポジトリのルートフォルダにあるため ).

おめでとう!

これであなたは自分自身のリポジトリを手に入れました.
ちなみにぼくは,パッケージに署名をするために普通に debian パッケージを作成しています ( これに要する努力は, PPA を使うのとそこまで変わりません ).

apt-cyg を2倍くらい高速化してみた

$
0
0

apt-cyg は便利

最近 Windows 8.1 を手に入れたので、とりあえず Cygwinを入れた(Z Shell が入ってないと死んでしまう病気なので)。
あの悪名高き setup.exe にイラつきながらなんとか apt-cygを導入した。
速い検索。APT ライクな操作。コマンドラインでソフトウェアを導入できるようになるとやっぱり便利。

apt-cyg はクソい

しかし、apt-cyg も使っているうちに不満点がたくさん出てきた。

遅い

apt-cyg はめっちゃ遅い。特に回線がゴミだと悲惨である。
しかもソースコードを見てみると、依存パッケージをインストールするのにいちいち自分自身を呼び出してるじゃないか!
Cygwin の API エミュレーションは基本的に遅いらしいので、大量の fork() があるとやっぱり遅くなるっぽい。

途中で止まると死ぬ

apt-cyg でインストール中に間違って C-c などしようものなら、インストールはそこで中断されてしまう。
このとき、すでにインストールされたパッケージはインストール済としてマークされてしまい、依存関係が壊れたままになってしまう。
これを直すには、手動で正常にインストールされたパッケージを全部削除してからもう一回インストールするしかない。
ダウンロード中に突然回線が死んだり、MD5 が合ってなくて終了した時には
Warning: some required packages did not install, continuing
とか親切に言ってくれるんだけど、大量にログが流れていく中どのパッケージを再インストールしたらいいのか洗い出すのはめんどくさい。

remove の時に依存関係を解決してくれない

rdepends コマンドでそのパッケージに依存しているパッケージを列挙してくれるんだけど、消すのは手動でやらないといけないのでめんどくさい。

cyg-fast を作った

そこで、kou1okada さんの apt-cygから fork して改造をし始めた。
名前は同様に aria2 で並列ダウンロードを行う apt-fast をリスペクトして cyg-fast
  • 依存関係をインストール前に解決
apt-get 風に、依存関係をダウンロード前にすべて解決してからダウンロードするようにした。
また、これまた apt-get 風に、どのパッケージがインストールされるのか事前に確認してからダウンロードを開始できるので安心。
  • aria2 で並列ダウンロード
aria2 でファイルを複数同時にダウンロードするようにしてみた。
  • 自分自身の呼び出しを単純なループに置換
これで無駄な fork() によるオーバーヘッドを避けられる気がする。
  • remove 時に依存関係を解決
cyg-fast の古いバージョンは依存関係ツリーを生成していた(めっちゃ遅い)が、最近書きなおしてみたところ rdepends の awk コードを利用してすぐできた。
  • 中断・再開
ダウンロード中に C-c を押しても、
cyg-fast resume-install
コマンドで再開できるようにした。
途中でちょっと一休みとかできる。
  • —force install, —force remove
  • —yes-to-all
  • MD5 非一致の時に自動で再ダウンロード
これらはオマケ的機能。

実測

$ time apt-cyg install vim emacs git zsh | tee log.txt
$ time cyg-fast --yes-to-all install vim emacs git zsh | tee log.txt
apt-cyg は
real 5m40.403s
user 0m19.963s
sys 0m26.451s
cyg-fast は
real 2m53.876s
user 0m18.659s
sys 0m24.587s
だった。多分2倍くらい速くなってる。

問題点

  • x86 の aria2 が何故か古くて、 conditional get が使えなかった。これがあれば upgrade 的な機能も付けられそうな気がしたけど断念。
  • 再帰呼び出しについては、スペックがそこそこある PC だとオーバーヘッドが微々たるものになるのでそこまで変わらないと思う。

まとめ

Cygwin (というか、Windows) はつらい。
cyg-fast は apt-cyg に比べて多少速くなった。
(最近は Debian に引きこもっててあんまり Windows を使ってないので Cygwin もあんまり使ってない…)

MonoDevelop 5.x レビュー

$
0
0
先日 MonoDevelop を make したら、いつもと何かが違う。

ヴァージョンを確認してみたところ…

5.1!?!?!?
GitHub のリポジトリの Releases/Tagsにもない…
というわけで、使ってみます。

NuGet 統合!


これはすごいぞ!
サードパーティの拡張機能は前からあったんだけど、それとは別物っぽくて、きちんとソリューションエクスプローラと統合されている(普通の参照と分かれてるので、Visual Studio よりわかりやすいかも?)。
リポジトリ設定は、Preferences から行えるようになっている。
あと、ソリューションを開いた時に、自動でパッケージを復元してくれるようになった。

ステータスバーのアニメーションの変更

四角い箱が組み立てられるようなアニメーションに変更されている。

あれ?

これしかないかな?
リリースされてないということは、これから機能がもっと付くでしょう。
追いかけながら使い倒してみます。

余談

MonoDevelop の Release Noteは… 3.1 で止まってる…

Windows をインストールした

$
0
0
中学生くらいの頃にブラッディマンデイを読んで、ハッカー気取りで Ubuntu を使い始めたあの日から何年経っただろうか。
今、僕は Debian jessie という人柱専用の最新で自由な環境を愛用しており、Windows だとか MacOS X だとか、そのような不自由なOSとは無縁で生きてきた。
しかし、Windows を使わざるを得ない状況は容赦なく訪れる。docx しかない某プログラミングコンテストの応募用紙、Windows でしかコンパイルが通らないコンパイラ、エトセトラエトセトラ…
そこで、少し前にやっとこさ VirtualBox に Dreamspark で入手した Windows Embedded 8.1 Industry Pro をインストールした。

(ちなみに、少し前の cyg-fast の記事も、この環境でいろいろ試す過程に書かれたものである)

以下に、 Windows を使い始めて気づいたこと・困ったことを書いていこうと思う。

Hao123 と愉快な仲間たち

まともなパッケージ管理システムを積んでないのはまだいい。
インストーラなる実行ファイルをネットから探してこなければならないのも、野良 deb をダウンロードしに行くようなものだと思えば苦にはならない。
しかし、インストールし終わってほっと一息、ブラウザを開くと、ギャーッなんだこれは
Windows ユーザの皆様にはきっとお馴染み、 Hao123 である。
このインストーラなるもの、何も読まずにポチポチエンターキーを連打すると Hao123 なるウェブページをホームに設定してしまう愉快な仕様となっていたのだ。
それに、こいつをダウンロードした Softonic なるサイト、バイナリを無断で転載することで有名な邪悪なサイトだったらしい。
なんと Windows では信頼できるインストーラを自力で探さないといけないようだ。
このトラップはよく襲ってくる割には難易度高いのではないだろうか。なによりインストーラの文面をきちんと読まなかった自分が実に情けない。
ちなみに、OS ごと入れなおした。

PowerShell すげえ

Windows のターミナルである cmd.exe を触っていてキレてしまい、Google(最近検閲で話題になった)に cmd sucks とか打ち込んだところ reddit に素晴らしい解説を発見し、嬉々として PowerShell をいじりだした。
最初は妙な構文に全く慣れなかったが、なにより標準で IDE までついていて、コマンドのみならずディレクトリ名まで補完してくれる。
コマンドラインオプションを扱う方法が統一されていたり、オブジェクトをパイプできたり。その素晴らしさにむせび泣いた。
Microsoft が本気でシェルをつくるとこうにまでなるのか。これが自由ならなあ。
欠点としては、ひたすら重い。

ヴィデュアルストゥーディオ

Microsoft はかなり太っ腹で、Dreamspark で OS だけでなく高価で専門的なソフトウェアかつ遠隔ウィルス作成ソフトとして名高い Visual Studio も無償で提供している。
C# の IDE と言えば MonoDevelop!と常識のように思っていたけど、Visual Studio はやはりよくできていた。
ただ、MonoDevelop の方が使いやすいなあと思うところは結構あって、例えばプロジェクトごとにコードフォーマッティングやヘッダーを設定できたりする機能は Visual Studio にもあったらいいなあと思った。

でもやっぱりパッケージ管理システムは欲しい

Chocolatey は 4000 個くらいしかパッケージがなくて、しかもちょっと寂れ気味で寂しい。
Ubuntu のソフトウェアセンター的なものは Windows Store という名前であったが、あちらは GUI しかない上、更にソフトウェアが少ないように見えた。

まとめ

今回は Dreamspark で開発に必要なツールを OS から IDE まですべて無償で入手できたので、Microsoft の太っ腹に感謝しなければならない。
UNIX コマンド群をまともに扱う手段が Windows には存在しない(Cygwin はまともとは言い難かった)ので、仮想マシンに入れるという選択は正しかった。
仮想マシンのはずがかなり起動が速かった。10秒あれば起動する。
環境のよさや仮想化支援もあるだろうけど、非仮想化環境と比べても遜色ない速度で動作していると思う。
あとフラットデザインが格好良い。フォントレンダリングはもうちょっと綺麗な方が好き。

ブログが 10000 views を超えた

$
0
0
ブログが 10000 views を超えた。

炎上することもないし、あまり書くこともなく一ヶ月に1エントリ書ければ良い方だが、一年近く続けていればこれくらいにはなるようだ。

しかし、ちょっと友達の多い高校生のブログでも一年あれば 100000 views くらいは行ってるのではないだろうか。怖くてならない。
さて、Blogger には統計機能というものがあって、閲覧者に関する色々と面白いデータを見ることができる。

別にこのデータを公開するなとかそういうことは書いてないようなので、早速見ていこう。

閲覧者の国

このブログの閲覧者の住んでいる国のランキングは次の通り。
アクセス数
日本7657 views
アメリカ合衆国1563 views
ウクライナ79 views
ロシア58 views
ドイツ46 views
中国35 views
イギリス31 views
インドネシア24 views
カナダ22 views
イラン21 views
このブログは日本語でしか書いていないので、日本とアメリカの一部以外はほとんど bot と見て差し支えないだろう。

閲覧者の OS

サムライファクトリー株式会社さんが毎月発表していた「OS・ブラウザー国内シェア調査」(終了してしまったようで残念だ)によると、日本における PC 用 OS のシェアは次の通りだ。
OS割合
Windows88.91%
Mac OS X4.9%
Linux0.90%
その他0.05%
(iOS・不明は除外、大まかな区分ごとに合計済)
ところが、このブログの訪問者ではこのようになっている。
OSアクセス数割合
Windows4457 views44%
Macintosh1846 views18%
Linux1089 views10%
Other Unix300 views3%
(携帯用OS・不明を除外)
Windows の割合が全国シェアと比べてかなり低いのが見て取れる。
最も全国シェアとの差が激しいのが非 Linux の UNIX 互換 OS で、「その他」がすべてそれらだと仮定しても、このブログの閲覧者の間でのシェアは全国平均の60倍を誇ることになる。
実際は「その他」に含まれる UNIX はもっと少ないだろうので、差は跳ね上がるだろう。

閲覧者のブラウザ

先ほどと同じサムライファクトリーのデータによると、ブラウザの日本でのシェアは下のようになる。
ブラウザ割合
Internet Explorer52.59%
Chrome18.02%
Firefox13.62%
Safari7.50%
Sleipnir1.48%
Opera1.31%
Lunascape0.22%
その他0.22%
(不明は除外、種類ごとに合計済)
このブログの閲覧者データではこうなる。
ブラウザアクセス数割合
Chrome4250 views42%
Firefox2689 views27%
Safari887 views8%
Internet Explorer719 views7%
Opera138 views1%
(携帯用ブラウザ・1%未満・不明を除外)
Chrome が圧倒的に多い。Firefox が Chrome より少ないのは全国シェアの傾向と同じだ。
IE は日本でのシェアの多さにかかわらず 7% というSafari より少ない数値を叩き出している。
また、Sleipnir や Lunascape はこのブログでのアクセス履歴では 1% 未満にすら出現せず、見る影もなかった。

某技術書風の年賀状を作った

$
0
0
この方の記事にインスパイアされて、私も某オライリー風の年賀状を作ってみた。
こんな感じになった。

使用フォントは Liberation Serif (ttf-liberation) と M+ Fonts (fonts-mplus)。
羊の元画像はこちら。Flickr で CC ライセンスのものを探して使用した。
元画像が CC BY-NC-SA のため、この年賀状も同じ CC BY-NC-SA で公開する。
余白3mmで、フチ無し拡大印刷を使用することを想定している。

Twitter でベータ簡約するBOTを作った

$
0
0


Nemerle で書いた。

(ab)cabcλx.λy.Eλxy.Eと書ける。λとして \ と ^ も使える。

正規形を持たないλ式のうちあるパターンで簡約が繰り返されるものを検出できる。

ソースコードはこちら




Latest Images