!kiyoka.blog RSSPLAIN

Related pages: !kiyoka.blog.2005_04 !kiyoka.blog.2005_03 !kiyoka.blog.2005_02 !kiyoka.blog.2005_01 !kiyoka.blog.2004_12 !kiyoka.blog.2004_11 !kiyoka.blog.2004_10 !kiyoka.blog.2004_09 !kiyoka.blog.2004_08 !kiyoka.blog.2004_07
555555500000000000000000000000000000000000000000000000000000000001111111111111111111111111111111222222222222222222222222222222222333333333333333335555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555444444444444444444555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555
5

kiyoka日記。NendoSekkaの開発や、最近思うことなど

5

最新10件!kiyoka.blog   過去記事一覧!kiyoka.blog.list

5

kiyoka.blog_header 

5

このブログを書いている人: 西山 清香(kiyoka) - twitter: @kiyokaEXT

5

5

 

5

 

0

kiyoka.2014_09_03[LLVM][実験] LLVMが楽しい

0
 LLVM-Logo-Derivative-2
0

 

0

LLVMが普及しつつあるけど実際どうなのか

0

ふと思いついてLLVMについて調べ始めた。

0

世間ではGoogle ChromeのPNaCLとかemscriptenやasm.jsが実用的に使われる気配が見えてきた。

0

AppleのMacOS XやFreeBSDのLLVMへの傾倒を見ると、そろそろどんなものか知りたくなってきた。

0

なぜか昔から自分はCross Platformの話題が好きなようで、i386で動くLinuxのエミュレーターをJavaで書いたこともある。(完全に黒歴史…)

0

 

0

LLVM-IR

0

Cross Platformerとしての興味の対象はLLVM-IREXTなので、まずはここから。

0

LLVM-IRの言語仕様を調べたりclangの出力するLLVM-IRのコードを眺めてみたりした。

0

clangの最適化オプションを -O0 から -O3 にしてどれくらい最適化されるのかを眺めたり。

0

LLVM-IRの抽象度は非常に高く読みやすく(読むものでは無いだろが)Cross Platformな話題が好きな自分にはかなり楽しそう。

0

挙句の果てには、LLVM-IRのコードをEmacsLispで動かせないかと実験をしてみたりした。

0

 

0

LLVM-IRをEmacsLispに翻訳

0

可能性を探るためにちょっとやってみたのだが、LLVM-IRのインタプリタlliコマンド の 約1000倍の実行時間がかかることがわかった。

0

ということでこれで思考実験は終わり。

0

 

0

このようなCプログラムをclangでコンパイルし、LLVM-IRを翻訳したEmacsLispで動かしてみた。

0
#include <stdio.h>
0
0
int main(void)
0
{
0
  int total = 0;
0
  volatile int i;
0
  for( i = 0 ; i < (1000000 * 1000) ; i++ ) {
0
    total += i+1;
0
  }
0
  printf( "total = %d\n", total );
0
  return 0;
0
}
0

 

0

"clang -O0 -S -emit-llvm loop.c" で出力したLLVM-IRコードもあわせて見るにはこちら。

0
 simple loop program.EXT
0

 

0

つぎに愚直にEmacsLispに翻訳してみたのが loop1.el 

0

手でちょっとだけ最適化してみたのが loop2.el 

0
 Translate to Elisp from LLVM-IR codeEXT
0

 

0

LLVM-IRをSchemeに翻訳

0

愚直にSchemeに翻訳してGaucheで動かしてみたのがこちら。

0

lliの100倍の時間がかかる。しかしGaucheは速い。

0
 Translate to Scheme from LLVM-IR codeEXT
0

 

0

cmigemoをEmacsLispで走らせられないか(妄想)

0

cmigemoを1000倍非力なCPUで動かすとどれくらい使えないかを測ってみた。

0

cmigemoの検索クエリから正規表現への展開は1000回実行しても100ms程度で、実用的な範囲。

0

しかし、mcigemoが辞書をロードする時間は1000回実行すると3分もかかる。これは実用にならない。

0

 

0

っと、ここで夢から覚めて我に返った(←イマココ)

0

いやー妄想って楽しいもんです。

0

 

0

comment please => kiyoka.2014_09_03

0

0

 

0

 

1

kiyoka.2014_07_16[Sekka] sekka.elからpure emacsでhttp通信しようするも断念

1
 iStock_000016378483XSmall
1

Emacsも年々進化していることだし、もうそろそろcurlコマンドを使わなくてもEmacsだけでHTTP通信できるのでは?と思ってチャレンジしてみた。

1

今回はあきらめたのだが、理由を忘れそうなのでここにメモしておく。

1

gibthubのSekka作業ブランチは "http_pure_elisp" 。

1
  https://github.com/kiyoka/sekka/tree/http_pure_elisp
1

 

1

url.elのリクエストが不正?な問題

1

Emacs-24に入っている url.elを使ってsekka-serverにアクセスするも、webrickが400 Bad Requestを返す。

1

url-retrieve-synchronously関数の返却バッファには、200 OKのレスポンスの後ろに、400 Bad Requestのレスポンスがくっついてくるので原因がよくわからない。

1

curlコマンドからWebrickにリクエストした時は発生しないので、url.elのリクエストがRFCに準拠していないのか、Webrickの潜在バグを突いているのか…

1

 

1

url.elからのリクエスト中にEmacsのキーイベントが消費される問題

1

url-retrieve-synchronously関数を実行している間にCtrl-jを押しても効かない。

1

キーイベントがどこかで消費されているのかもしれない。

1

curlコマンドをプロセス起動した場合にはそのような現象は発生しないので、url.elの作りの問題なのかもしれない。

1

url*.elで "discard" や "event"  などで検索したがあやしい処理は見つからず…

1

 

1

Webrickの代替が見つからない問題

1

Webrickの代わりに別のRackドライバを探したが、thinくらいしか見つからなかった。

1

thinを使ってみるも、Segmentation Faultで動かず断念。

1

 

1

こんな感じで、あまり時間をかけていないが、一旦断念。

1

また一年後くらいに再チャレンジするかも。

1

ただ、curlが非常に安定していることもあって、EmacsからHTTPリクエストする場合はcurlがデファクトスタンダードになっているようだ。

1

いっそEmacs本家にcurlをリンクしてくれたりいいのにと思うんだけどなぁ。

1

 

1

comment please => kiyoka.2014_07_16

1

1

 

1

 

2

kiyoka.2014_03_15[PasteHub] PasteHub.netは「コピペをいろんなWebサービスのハブにする」

2
 iStock_000019296334XSmall
2

PasteHub.netの大改造中。

2

 

2

コンセプト

2

コンセプトは「コピペをいろんなWebサービスのハブにする」にしようかと考えている。

2

もう、サーバーサイドのコードはgitのmasterからきれいに削除し、Dropbox必須とした。

2

おかげでクライアント側のコードも半分以上は不要となった。

2

それでも「コピペを同期する」という本来の機能の利便性と安定性が上がった。

2

 

2

大改造のきっかけ

2

きっかけは自分がスマートフォン(iPod touchなんだけど)を買っていろんなアプリが動くようになったことだろう。

2

 

2

今迄使っていたiPod touchはとても古く、iOS 4.2までしかインストールできなかった。なにせ2014年におけるiOS 4.2というのは、とんでもない時代遅れのシロモノなのだ。

2

どんなアプリ作者もiOS 6.0以上で動くアプリしか作らない(当然か…)。iOS 4.2ではTwitterクライアントはなぜか起動せず、Feedly、Safari to go 、Kindle、Evernoteは非対応だ。

2

 

2

それが一変した。

2

最新のiPod touchを買ってiOS 7.xが使えるようになり、EvernoteやTwitterクライアント、Feedly、Safari to go、Kindleが動くようになった。

2

今までスマートフォンのサービスがここまで便利になっているとは知らずに来たもんだから、その進化には正直たまげた。

2

EvernoteもブラウザベースのWebサービスとして使っていると、それほど便利さは実感できない、なので使う意味はほとんど無い。おまけに古いiPod touchにはカメラさえ付いていないので、写真でメモを取るということもできなかった。それはEvernoteと言えるのか?…

2

 

2

時代の流れとDropboxの普及

2

2012年に作り始めたPasteHubというプログラムは、当初、コピペ情報を仲介するためのサーバーサイドを時前で持っていた。

2

2014年の今ではDropboxが事実上の標準となり、使っていない人はいないというところまで来た。(Google DriveとかOneDriveも含めたクラウドストレージというくくりで見ると、ほぼ100%だろう)

2

そんな背景もあり、Dropboxに完全依存することに決めた。

2

 

2

というわけで、ぼちぼち使えるプログラムとして生まれ変わる最中です。応援よろしく。

2
 kiyoka/pastehub · GitHubEXT
2

 

2

comment please => kiyoka.2014_03_15

2

2

 

2

 

3

kiyoka.2014_02_25[PasteHub] 新PasteHub.netは何を優先するか

3
 iStock_000019296334XSmall
3

自分用メモ。

3
インストールが簡単(設定なし)
3
Mac/Windowsはインストーラーにてインストールするだけ。
3
Linuxはrpm/debをインストールするだけ。
3
Emacsはmelpaからelispをインストールするだけ。
3

※ 但し、Dropbox以外のストレージサービスを使っている場合は、設定値変更が必要。

3

 

3

最後のEmacsクライアントは実装がけっこう大変そうな気がするが、やってやれないことは無い。

3

使うのが簡単なものほど作るのは大変というのはよくある話。

3

実装が多くなるという意味で当然といえば当然なのだが…

3

 

3

comment please => kiyoka.2014_02_25

3

3

 

3

 

5

kiyoka.2014_02_22[PasteHub] 大きなピボット

5
 iStock_000019296334XSmall
5

PasteHub.netというコピーペーストを複数のマシンで共有するサービスを作った。

5

しかし、ここへきてPasteHub.netの「コレジャナイ感」が大きくなってきた。

5

自分が欲しいのは、複数のOS、複数のマシンでコピーペーストが同期されるシステムだ。

5

PasteHub.netではそれだけのために、次のような手順を踏む必要があった。

5
サイトを用意
5
ユーザーアカウントを登録
5
アプリケーションをインストール
5

 

5

これはなかなか敷居が高い。

5

サービスを提供する側にとっても、ユーザーにとっても。

5

実際にこの敷居の高さのせいか、ツールを使う人は皆無に近かった。

5

 

5

そんなわけで、しきり直しをします。

5

 

5

PasteHub.netを使うには、

5
アプリケーションをインストール
5

だけでいけるようにしたい。

5

 

5

自分でサイトを構築・維持するのではなく、Dropboxのような共有ストレージサービスを利用しようと考えている。

5

Dropboxのような共有ストレージは既に誰もが使っているだろう。

5

有名なドリルの喩えでいうと、「ドリルを買う理由は"穴"が必要だからである。ドリルが無くても、穴が得られれば良いのである。」ということだ。

5

自分も"穴"だけが欲しいので、ここいらでピボット(方針変更)しよう思う。

5

 

5

共有ストレージも、同期のタイムラグの問題などいろいろ課題は出るだろうが、それを解決できれば簡単に使えるものになるだろう。

5

仕組みが単純になる分、Dropboxと連携するIFTTTなどのサービスとも連携できるなど、価値も増える。

5

というわけで、いろいろ実験しながら可能性を探っていきます。

5

 

5

comment please => kiyoka.2014_02_22

5

5

 

5

 

5

kiyoka.2014_02_12[Ruby][Nendo] CRuby 2.1.0の非互換性-Symbolクラスにモンキーパッチできなくなった件

5
 iStock_000019986662XSmall
5

忘れないうちにNendoをCRuby 2.1.0で動かすのに苦労した話を書いておこう。

5

多分、SymbolにモンキーパッチしているプログラムはCRuby 2.1.0で動かなくなるので、その時に誰かの役に立つかもしれない。

5

 

5

CRuby 2.1.0に持ち込まれた非互換

5

 

5

.以下は、CRuby 2.0.0で動いて、CRuby 2.1.0で動かないコード

5
# Symbolへのモンキーパッチ
5
class Symbol
5
  def set_lineno(value)
5
    @lineno = value
5
  end
5
  def lineno
5
    return @lineno
5
  end
5
end
5
5
sym1 = :a
5
sym1.set_lineno( 10 )
5
p sym1.lineno
5
5
sym2 = :a
5
sym2.set_lineno( 20 )
5
p sym2.lineno
5

 

5
結果(ruby-2.0.0-p353)
5
$ ruby symbol.rb
5
10
5
20
5

 

5
結果(ruby-2.1.0)
5
$ ruby symbol.rb 
5
symbol.rb:5:in `set_lineno': can't modify frozen Symbol (RuntimeError)
5
        from symbol.rb:13:in `<main>'
5

 

5

何がしたかったのか

5

NendoはRubyで実装したScheme処理系(サブセット)である。

5

Nendo 0.6.6ではSchemeのソースコードをパースしたツリーの内部で、SchemeのシンボルはRubyのSymbol型に変換して保持していた。

5

そうするメリットは絶大で、Schemeの処理系の中で:quoteのようなRubyのSymbolと == 演算子で比較できる。

5

また、同時にそのシンボルがSchemeプログラムのソースコードのどの位置(ファイル名、行番号)に出現したかを保持したい。

5

つまり、同じSymbol型でも、位置情報を持っているものと持っていないものがあり、かつ、同じSymbol型として操作できる。

5

Ruby 2.0.0までは、乱暴だが上のようなモンキーパッチを使うことで、このトリックを実現していた。

5

 

5

Ruby 2.1.0

5

Ruby 2.1.0では上記のようなモンキーパッチは許されなくなった。

5

最適化のためか、はたまた安全性のためか、その両方かもしれないが、そのような挙動になった。

5

puppetも同様の問題でひっかかってpuppet側で対応したようだ。

5
 (maint) Fix can't modify frozen Symbol error on Ruby 2.1.0 by jeffmccune · Pull Request #2184 · puppetlabs/puppet · GitHubEXT
5

 

5

Nendo 0.6.8

5

Nendoも同様に0.6.8で地道に対応した。

5

Symbolへのモンキーパッチをやめて、ParsedSymbolという型を新規に作り、RubyのビルトインSymbolとの比較箇所などを地道に修正していった。

5

影響範囲は大きく、なかなか骨の折れる作業だった。

5

 

5

感想

5

本来はモンキーパッチは良くないコーディングだとわかっていたが、このような逃げを許してくれるのがRubyの良いところかと思っていた。

5

多分、モンキーパッチを許さないことで最適化しやすくなり実行効率は高まりそうな気がするので、CRubyの進化として良いことだろう。

5

ただ、ちょっと固くるしいなぁと思わなくもない。

5

言語が洗練するとはこういうことなのかなぁ。

5

 

4

追記 ( 2/23 )

4

SymbolもGCできるようにする改善だったようだ。それなら従おう。

4
 Feature #8906: Freeze Symbols - ruby-trunk - Ruby Issue Tracking SystemEXT
4
  Now, Integer and Float objects are frozen objects.
4
  How about to freeze Symbol objects, too?
4
  I think Symbol is friend of Integer.
4

...

4
  Background of this proposal:
4
  
4
  Now, I'm working on "GC-able Symbols" feature.
4
  Freezing symbols make this feature easier.
4
  
4
  for example:
4
  (1) set an instance variable @iv for symbol s
4
  (2) collect s
4
  (3) generate s
4
  (4) what value of @iv for s returns?
4

 

5

comment please => kiyoka.2014_02_12

5

5

 

5

 

5

kiyoka.2014_01_26[Sekka] Sekka 1.5.0 リリース

5

SKKライクな日本語入力メソッド Sekka 1.5.0をリリースしました。(リリースノート Sekka.ReleaseNote)

5
 iStock_000016378483XSmall
5

 

5

ついにWindowsでも動くようになりました。

5

Cygwinは不要で、RubyInstaller.org 1.9.3 上で動きます。

5

 

5

comment please => kiyoka.2014_01_26

5

5

 

5

 

5

kiyoka.2013_11_02[Nendo] 静的型チェックの設計メモ(1)

5
 iStock_000019986662XSmall
5

自分用備忘録。

5

 

5

型付けと、型チェックは2フェーズにする必要あり

5

 

5

理由は、再帰的に定義された関数は自身を定義するまで自身の型が不明なので、1パス目ではチェックできない。

5

 

5
 サンプルコード
5
;; fact
5
(define (fact n)
5
  (if (zero? n)
5
      1
5
      (* n (fact (- n 1)))))
5

 

5

このコードは、コンパイルフェーズで以下のようにマクロ展開される。

5
(define fact
5
  (lambda (n)
5
    (if (zero? n)
5
        1
5
        (%tailcall (* n (fact (- n 1)))))))
5

 

5

上のコードで使われている関数群 zero? %tailcall * - と フォーム (if a b c) が全て副作用なしとして型付けされていたとする。

5

ここで、変数factの型を1パス目で型チェックしようすると、factの型が未定義なので失敗する。

5

従って、1パス目でfactの型を決定してから、2パス目で型チェックをする必要がある。

5

 

5

応用編

5

次のようなletrecで定義された束縛変数においても同様。

5
(define (append a b)
5
  (letrec ((append-reverse
5
            (lambda (a b)
5
              (if (pair? a)
5
                  (append-reverse (cdr a) (cons (car a) b))
5
                  b))))
5
    (append-reverse (reverse a) b)))
5

 

5

それにしてもこのappendの定義ってよくできているなぁ。

5

誰が書いたのだろう… Chibi-Schemeから持ってきたハズ…

5

 

5

comment please => kiyoka.2013_11_02

5

5

 

5

 

5

kiyoka.2013_10_24[MacOS] MavericksにバージョンアップしてもX11を使う

5

 

5

無料と聞いて、MacBook ProのOSをLionからMavericksにバージョンを上げた。

5

「タダより高いものはない」というわけで、それなりの手間賃を払うことになった。

5

X11 serverがMountain Lionから非標準になって当然Mavericksでも動かなくなっているので、復活するところからスタートした。

5

 

5

普段は、X11プロトコルをsshで転送して北海道のDebianマシンと手元のMacOSXとを繋いでいる。

5
 
5
 X11 server                           X11 client
5
 
5
  [MacOSX]  ----- Internet -------  Debian/GNU Linux
5
 
5

 

5

用意するソフトウェア

5

XQuartzEXT 2.7.4 のdmgファイル。Lion付属のX11の代わりとして使える。

5
 ※ MacOSXのマシンからリモートのLinuxマシンには ssh でログインできる状態であること。
5

 

5

環境設定

5
XQuartzEXT 2.7.4をインストールする。
5

 

5
XQuartzを起動し、設定を行う。
5

 

5
 認証の設定
5

XQuartz_input

5

 

5
 キーボードの設定
5

XQuartz_security

5

 

5

 

5
XQuartzを再起動する(これで設定値が反映される)
5

 

5
MacOS X側の ~/.ssh/config に1行追加する
5
ForwardX11 yes
5

 

5
MacOS X側の ~/.bashrc に1行追加する
5
export DISPLAY=localhost:0.0
5

 

5

 

5

起動

5
XQuartzが起動していることを確認する
5

 

5
ssh -Y オプションを付けてログインする
5
$ ssh -Y remote_host_name
5
$ xterm &
5
 → xterm が起動する
5

 

5

キーボードの調整も完璧だし、やはりX11 serverはMacOS Xの上が一番良い。

5

 

5

comment please => kiyoka.2013_10_24

5

5

 

5

 

5

kiyoka.2013_10_18[TaPL] 演習問題をやってみた

5

4274069117 型システム入門(TaPL)

5

TaPL読書会に向けて11章の演習問題をやってみた。

5
 TaPL_exercise 
5

TaPLの演習問題をまじめにやるのは結構大変だ。

5

 

5

どの演習問題も証明せよと書いてあるのだが、証明しようとするとけっこう時間がかかる。

5

付録の模範解答ページには証明の流れは書いておらず、例えば「構造的帰納法」を使うとしか書いてなかったりする。

5

ああでもない、こうでもないと寄り道してなんとか証明した気になっているが、これで合っているのかどうか。

5

 

5

読書会での答え合わせの場があるのが幸いです。

5

 

5

自分としては11章を読み終わったら、この本を卒業して、Nendoに型検査を実装する作業に時間を使いたいなぁと考えているんだけど…

5

 

5

comment please => kiyoka.2013_10_18

5