アジョブジ星通信

進捗が出た頃に更新されるブログ。

Unicode正規化を実装する (2) 正規分解・互換分解

前回: Unicode正規化を実装する (1) UCDにふれる - アジョブジ星通信

さて、前回 UnicodeData.txt の読み方をやりましたので、これを使って実際に正規分解・互換分解を実装してみましょう。

サンプルコードと見比べながら説明を読んでいただければと思います。

続きを読む

ルータを新調した

買いました。

前のルータの無線が 11g で、 torne でアニメ見てると動きの多いシーンでフリーズしていました。
参考:

で、新調した結果ですが・・・変わりませんでした!だって PS3 が 11g しか対応してない上、 11g の速度はそんなに変わらなかったんだもん!

というわけでスマホだけ高速化しましたとさ、おしまい。

ここで終わらないのが今日の僕(と父)。テレビに有線で LAN ケーブルがつながってるので、それを前のルータにつなぎ変えて、テレビとPS3に有線で接続で接続することで、 PS3 の通信速度が 60Mbps になりました。めでたしめでたし。

Unicode正規化を実装する (1) UCDにふれる

前回の記事のライブラリを発展させた ToriatamaText というライブラリをリリースしました。

これを作るにあたって Unicode 正規化 Form C を実装したので、ブログに仕様とかを書いておこうという思いです。サンプルコードは C# で書いていきますが、 C# に限った話ではないので、これから Unicode 正規化を実装しようとする人には参考になると思います。というか日本語情報なさすぎでしょ。

注意

この記事に間違ったことが書いてあり、それにより読者に何らかの損害があったとしても、「知らんがな」としか言いようがないです。英語力が足りなさすぎて、 Unicode の仕様をすべて読み込むことができなかったので、動かばいいや(= テストが通ればいいや)というスタンスでやっていっています。

C#er「String.Normalize使えばいいじゃん」

PCL も .NET Core も扱ったこと無い甘ちゃんが!!いいか! String.Normalize は Windows API に依存してるからあんまりポートされてないんやで!!

続きを読む

ツイートに含まれるURLを高速に抽出するライブラリ、つくりました

2016/03/13 お知らせ: このライブラリの内容を含めて twitter-text 完全互換のライブラリを作りました。こっちがメインになります。

お知らせ終わり。

URI教の皆さんへ: Twitter が URL って言ってるからこっちに統一しました。許して。

はい、タイトルの通りです。言いたいことは以上です。

twitter-text 問題

神(Twitter)は言われた。「ライブラリあれ。」こうして、 twitter-text があった。神は twitter-text を見て、良しとされた。

「よくねーよ C# 版出してくれよ!」

こんな声にお答えしたライブラリは数あれど(メンテナンスされてるとは言ってない)、そもそも twitter-text の Extractor(URLとかハッシュタグとか抽出してくるやつ)は正規表現頼りで、連続して動かすと非常に遅いわけです。

そもそも、 Twitter クライアント作者(僕は違う、よね)が twitter-text を求めるのは、あのクソみたいな t.co とかいうやつを考慮してツイートの文字数を計算し、 140 文字をオーバーしていないかをチェックするためですよね。つまりこのクソ長い正規表現を 1 文字入力するたびに走らせなければなりません。おえー

正規表現は文字列を順番に読み進み、一致しなければ少し戻り、をマッチする/しないが確定するまで繰り返します。単純な文字列ならいいんですけどね、 t.co の判定基準とかだるすぎるし、人間にとってだるいんだから、コンピュータにとってはつらすぎますよね。知らんけど。

そこで、つくりました

Azyobuzi.TwitterUrlExtractor(かっこいい名前が思いつかなかった)は、最も効率的な方法(だと僕が思っている方法)で URL を抽出します。これでツイート内容のテキストボックスに「ああああああああああああ(x1000くらい)」と無駄に入力しても重くならないようになりますね!

仕組みは簡単(ではない)。

  1. 「.」を探す (http://twitter.(←)com/azyobuzin)
  2. 逆戻りしてドメインとして有効な部分と「http://」があるかないかを探す ((→)http://twitter.com/azyobuzin)
  3. 「.」の後ろもドメインとして有効な部分を探す (http://twitter.com(←)/azyobuzin)
  4. 有効な TLD かどうかチェック
  5. ポート・パス・クエリを読み取る
  6. 完了!

と書くのは簡単だけど、イレギュラーな判定基準が多すぎて死にそうになりましたが、見事 twitter-text に入ってる extract.yml のテストを全部通過させることができました!

まとめ

(たぶん)twitter-text 互換の URL 検出を結構高速(twitter-text-csの17倍, Releaseビルドだともっとやばい)に行うことができます。強い!

感想


追記


ASP.NET 5アプリをUpstartでデーモン化してnginxでリバースプロキシするお話

タイトルで内容が全部終わった。要するに「もう Hello, World だけして満足する時代は終わった。Linuxの本番環境に乗せるぞ」ということです。

dnu publish

合言葉は

dnu publish --configuration Release --no-source --framework dnxcore50

これで CoreCLR 向けにリリースビルドされます。 --no-source を指定することで実行時にソースコードを利用せずコンパイル済みアセンブリを使用するのでパフォーマンスもメモリ使用量も削れるはず。

Upstart スクリプト

start on runlevel [2345]
stop on runlevel [016]

exec DNXのパス/runtimes/dnx-coreclr-linux-x64.1.0.0-rc1-update1/bin/dnx \
    -p ソースコード/src/アプリ名/bin/output/approot/packages/アプリ名/バージョン/root \
    web \
    --server.urls http://localhost:ポート/

respawn

KestrelHttpServer なら Unix ドメインソケットにも対応してます。

nginx

server {
    listen 80;

    location / {
        proxy_pass http://localhost:ポート/;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Host $http_host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Connection "keep-alive";
    }
}

Microsoft.AspNet.HttpOverrides パッケージを使うと X-Forwarded ヘッダーをうまいこと使ってくれます。

Connection: keep-alive は指定しておかないと chunked なレスポンスが返ってこなくなります。謎い。

詳しい話

dnu publish することで、パッケージが全コピーされるので、ユーザーにかかわらず実行できるようになります。そもそも publish は別のマシンでやって、それを本番環境にコピーするのが一番いい方法ですね。ただし、 Windows でやって Linux で動かすとなると、 OS 依存のパッケージが違ってくるので死ぬかも。

まとめ

とりあえずこれで https://twpollapi.azyobuzi.net/ は動いているので、 ASP.NET 5 は Linux でも使い物になります。たぶん。

ICompileModule でメタプログラミングするやつ

あけましておめでとうございます。今週のお題「今年こそは」だそうですが、今年こそは強い人間になりたいですね。というのも最近どんどん挑戦することが嫌になってきて……。

本題行きます。ASP.NET タグが指定してあることからわかるように、今回も DNX の話です。DNX には C#コンパイル時にコードを書き換えることができる機能があります。一時期 Yeoman の吐くテンプレートで Razor の事前コンパイルに使われていたようですが、今試したところなくなっていましたね。。というわけでこれの使い方を紹介していきます。

  • 注意
  • プリプロセスの仕組み
  • project.json の準備
  • ICompileModule を実装する
  • 実際に使ってみた例

注意

ASP.NET5 RC1-final 時点での情報です。将来 Roslyn 自体にこの機能がぶちこまれて DNX 側の機能ではなくなる可能性もあります。

続きを読む