NetflixでDeath Noteを見ていた際に「L is dead」というメッセージが見えた。Lが実際に死んでからしばらく時間が立っているので、実は他にも「L is alive」等のメッセージが存在し現在のLの状況を伝えたという感じだったのだろうか。
「Death」「die」「dead」は全て英語で死を表すがそれぞれ、名詞、動詞、形容詞(または副詞)になる。北斗の拳の有名な台詞の一つである、「お前はもう死んでいる」は英語にすると「You are already dead」になる(と思う)が、「You are dying」 にはならない。もし上記のLの死亡を伝えるメッセージが、Lの現在の状態を表すものではないのであれば「L has died」の方がいい気がする。
形容詞としての「dead」対応する日本語の単語は存在するのだろうか?形容詞として「死んでいる状態」を表す単語というのを実は知らない。複数言語(といっても三つだけだが)を扱えるようになると、言語Aにはあるが言語Bに対応する単語がないということがままある。例えば「おにぎり」をずばり表す英訳や蘭訳はない気がする。逆に、蘭語の「beleg」のズバリは日本語にない気がする。(そういえば「忖度」という言葉の訳はドイツ語にズバリで「vorauseilender Gehorsam」とか「unausgesprochene Anweisung」とかいうそうだ。)
多言語を扱う際にはこういった「ある言語にはある概念」を扱う必要がでてくる。二言語だと言語Aで考えて言語Bに翻訳するみたいになる気がする。これが面倒になると最初から言語Bで考えるという風になる気がする(余談だが、この状態になると、酔っ払っていても言語Bで会話できる)。僕はこの状態で言語Cが入ってきた。言語Cの習熟度は他の二言語に比べると遥かに低いのだが、不思議なことに言語Cで話しているときは言語Cで考えているのである(もちろん、足りていない部分は先の二言語で補っているが)。これは一体どういうことなのだろうか?
思考という部分は置き換え可能なパーツでできているとすると割と理解できる動作なのかぁという気がする。脳内モデルが「入出力-思考-抽象概念」みたいな三層でできているとするのである。二言語を扱っていた最初期では「思考」の部分が母語になっていたが、これが徐々に第二言語に置き換えることが可能になった。そして、新たに覚えた言語は基本的な部分ができるようになると、置き換えの動作がスムーズにいき、習熟度が低くても置き換えられるようになったと仮定できる。
なんかこういったのを何度もブログに書いてる気がするなぁ、なんでだろ?自分のメンタルモデルを言語化するのが好きなのかね?
Syntax highlighter
2018-02-26
2018-02-24
MSYS2サポート 2
前回の続きと僕なりの回答。
前回MSYS2上でのシンボリックリンクの話とSagittarius上でどうするかというのを書いた。書いた後に助言やMSYSがどのようにシンボリックリンクを扱っているかというののヒント(調べた結果Qiitaの記事が古いのか現状の挙動と違った)をもらったのでそれを踏まえて実装してみた、という話。
ソースも確認したのでこれであっているはず。ちなみに上記は
とりあえずこれで、
前回MSYS2上でのシンボリックリンクの話とSagittarius上でどうするかというのを書いた。書いた後に助言やMSYSがどのようにシンボリックリンクを扱っているかというののヒント(調べた結果Qiitaの記事が古いのか現状の挙動と違った)をもらったのでそれを踏まえて実装してみた、という話。
【MSYS2上でのシンボリックリンク】
MSYS2上ではシンボリックリンクはデフォルトでは作られず、ファイルのコピーとなる。この挙動を制御するためには環境変数MSYS
を適切に設定する必要がある。2018年現在では以下の表のようになる。
値 | 挙動 |
---|---|
|
ショートカットを作成する。 MSYS2上からはシンボリックリンクとして見える、かつWindows上ではショートカットになる。 |
|
シンボリックリンクを作成する。 Windows上でもシンボリックリンクになるが、管理者権限またはWindows 10かつDeveloper modeである必要がある。 失敗した場合は単にコピーになるか、作成されない。 |
|
ファイルをコピーする。 |
symlink(2)
の挙動なので、ln -s
は多少違うかもしれない(たぶんあってると思うけど)。【Sagittarius上ではどうしたか】
シンボリックリンクの作成を失敗したくないというのが大前提としてあったので、最低でもショートカットにフォールバックするようにしたかった。ということで、Sagittarius上では以下のフローでシンボリックリンクの作成をする。- 環境変数のチェック
- コピー以外のいずれかならば
symlink(2)
を使用する - コピーならばWindows上のシンボリックリンクを試す
- ファイルが作成されているかチェック
- 作成されているなら終了
- 作成されていないなら、環境変数
MSYS
にwinsymlinks:lnk
を設定し#1へ
とりあえずこれで、
create-symbolic-link
手続きがMSYS上では何かしらシンボリックリンクっぽいものを作成することになる。いつも思うがサポートする環境を増やすときはこうい環境特有の workaround が必要になるの辛い。
2018-02-16
MSYS2サポート
Sagittarius 0.9.0からはMSYS2が実験的にサポートされる。実験的と書いているのは単にまだ安定しないのと、他のPOSIX環境と多少挙動が異なる点があるというところからである。挙動に関しては積極的に変えていく可能性があるので、WindowsかつMSYS2を使っている方がにフィードバックを送ってくれると反映される可能性が高い。
MSYS2という環境はCygwinに比べるとWindowsとの互換性を重要視したPOSIXエミュレーターに見える(あまり使っていないのでぱっと見の感想)。現状で一番困っているのはシンボリックリンクの扱いで、例えばPOSIXのsymlink(2)は必ず失敗する。失敗してエラーを投げられると困るので、現状はシンボリックリンク関係の部分はWin32APIのCreateSymbolicLinkを使って凌いでいるが、このAPIは管理者権限を要求するので普通にSagittariusを起動して使用すると失敗する(何も作ってくれない)。
個人的にWindows上で使うPOSIXエミュレータを以下の理由からMSYS2に乗り換えようかなと思っている:
代替案としては
個人的には管理者権限を要求してもいいかとは思うが、もしそれができない状態かつMSYS2上で
MSYS2という環境はCygwinに比べるとWindowsとの互換性を重要視したPOSIXエミュレーターに見える(あまり使っていないのでぱっと見の感想)。現状で一番困っているのはシンボリックリンクの扱いで、例えばPOSIXのsymlink(2)は必ず失敗する。失敗してエラーを投げられると困るので、現状はシンボリックリンク関係の部分はWin32APIのCreateSymbolicLinkを使って凌いでいるが、このAPIは管理者権限を要求するので普通にSagittariusを起動して使用すると失敗する(何も作ってくれない)。
個人的にWindows上で使うPOSIXエミュレータを以下の理由からMSYS2に乗り換えようかなと思っている:
- プロセスの作成が失敗しない
- メモリの制限がない
代替案としては
- ショートカットを使う
- ハードリンクとジャンクションポイントを使う
.lnk
拡張子がネックになる。二つ目はボリューム跨ぎができない、ジャンクションポイントは絶対パスが必要になるとう結構制限がある。個人的には管理者権限を要求してもいいかとは思うが、もしそれができない状態かつMSYS2上で
scheme-env
を使いたいという状況が出てきた場合に困りそうである。いろいろな意見がほしいところである。
2018-02-09
TLS実装2(完)
Sagittarius上にビルトインなTLSを実装し終えた。POSIXな環境(Linux、OSX)ではOpenSSLをWindowsな環境ではSchennal、CygwinとMSYS2上ではあればOpenSSL、なければSchannelを使うという感じになっている。
今までPure SchemeだったのがCでの実装になったのだから性能にもなにかしら影響があるだろうと思ってベンチマークを取ってみた。
意外にも有意な差がない。Schemeの性能が高いんだと喜びたいところだが、以下のような理由だろう:
一応2月のリリースには間に合ったということで。
今までPure SchemeだったのがCでの実装になったのだから性能にもなにかしら影響があるだろうと思ってベンチマークを取ってみた。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!read-macro=sagittarius/bv-string | |
(import (rnrs) | |
(time) | |
(sagittarius control) | |
(sagittarius socket) | |
(rfc tls)) | |
(define *poor-victim* "www.google.com") | |
(define iteration 100) | |
(let ((sock (make-client-tls-socket *poor-victim* "443")) | |
(buf (make-bytevector 1024))) | |
(time (dotimes (i iteration) | |
(tls-socket-send sock #*"GET / HTTP/1.1\r\n\r\n") | |
(tls-socket-recv! sock buf 0 1024))) | |
(tls-socket-shutdown sock SHUT_RDWR) | |
(tls-socket-close sock)) | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
$ SAGITTARIUS_CACHE_DIR=/tmp sash bench.scm | |
;; (dotimes (i iteration) (tls-socket-send sock #vu8(71 69 84 32 47 32 72 84 84 80 47 49 46 49 13 10 13 10)) (tls-socket-recv! sock buf 0 1024)) | |
;; 1.847038 real 0.008000 user 0.008000 sys | |
$ SAGITTARIUS_CACHE_DIR=/tmp SCHEME_ENV_REPOSITORY=~/projects/scheme-env scheme-env run bench.scm | |
;; (dotimes (i iteration) (tls-socket-send sock #vu8(71 69 84 32 47 32 72 84 84 80 47 49 46 49 13 10 13 10)) (tls-socket-recv! sock buf 0 1024)) | |
;; 1.989803 real 0.064000 user 0.000000 sys |
意外にも有意な差がない。Schemeの性能が高いんだと喜びたいところだが、以下のような理由だろう:
- 暗号、復号及びMACは元々Cでやられている
- TLSパケットの送受信は上記がメイン
- (おそらく)OpenSSLはスタックの破棄みたいなセキュリティ上のオーバーヘッドがある
一応2月のリリースには間に合ったということで。
2018-02-01
TLS実装
Scheme環境ツールでTLS実装をOpenSSLかSSPIに切り替えると書いて、実際にそうしているのだが、SSPI(正確にはSchannel)の実装が辛い。何が辛いか?
これこの後後方互換を保つとかの作業もあるのだが、2月のリリースに間に合うのかね?不安になってきた。
- ドキュメントが飛び飛び
- MSDNにAPIの説明はあるんだけど、フローの説明がない
- 例えばX.509証明書と秘密鍵をメモリ上から読み取り、紐付けるということが(今のところ)ドキュメントから読み取れない
- サンプルが少ない
- Schannel SSL辺りでぐぐっても片手で数えられるくらいしか見つからない
- それらのサンプルもあんまり使い込まれてないらしく、普通の用途しかサポートしてない
- X.509証明書はファイルから読むとか
- だめならSchannelでセルフ署名を作るとか
これこの後後方互換を保つとかの作業もあるのだが、2月のリリースに間に合うのかね?不安になってきた。
Subscribe to:
Posts (Atom)