アジョブジ星通信

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

ツイートの新構造対応のメモ

これです。

CoreTweet 0.6.3API の変更には対応したのでその使い方について説明を書いておこうと思います。

1. とりあえず tweet_mode=extended をつけておく

新構造のデータを受信するには tweet_mode=extended を指定する必要があります。 CoreTweet でこれをやるには、各 API 呼び出しで、 tweet_mode 引数に TweetMode.extended を指定します。

サンプルコード

t.Statuses.HomeTimeline(tweet_mode: TweetMode.extended); // TweetMode 列挙体を使用
t.Statuses.HomeTimeline(tweet_mode => "extended"); // string で

で、このパラメータを指定すると、 text ではなく full_text フィールドにツイートの中身が入ってくるようになります。 CoreTweet では FullText プロパティになっています。

続きを読む

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 でも使い物になります。たぶん。