SlideShare a Scribd company logo
Inquisitor
-Common Lispに文字コード判定を-
自己紹介
●
なまえ:ぐれー
– Twitter: sin_clav
– Github: t-sin
●
昼はSE、夜はLisper
– 9月よりPythonistaに
● Common Lisp、Clojure使い
●
前回:Meetupデビュー
●
今回:LTデビュー
– (((( ;゚Д゚)))ガクガクブルブル
As known as...
●
「口にマクロを(ry」の人です
今日は、
膝にマクロを受けにきました
今日は、
膝にマクロを受けにきました
つくったものを紹介します
lnquisitorとは
●
文字コード/改行コード判定ライブラリ
●
機能
– 文字コード判定
– 改行コード判定
– external-formatの処理系差を吸収
– ベクタ、ストリーム、pathnameから
external-format生成
lnquisitorとは
●
たとえばこれ(SBCL)が
(labels ((nkf (path)
(let ((ret (with-output-to-string (out)
(uiop:run-program
`("nkf" "-g" ,(format nil "~a" path))
:output out))))
(first (split-sequence:split-sequence #newline ret))))
(detect (path)
(let ((enc (nkf path)))
(cond ((string= "Shift_JIS" enc) :sjis)
((string= "EUC-JP" enc) :euc-jp)
(t :utf-8)))))
(let ((file #P"/path/to/iamacat.txt"))
(with-open-file (in file :external-format (detect file))
(read-line in))))
=>" 我輩は猫である。名前はまだない。"
lnquisitorとは
●
こう書けるようになる
(let* ((p #P"/path/to/iamacat.txt")
(ef (inquisitor:detect-external-format p :jp)))
(with-open-file (in p :external-format ef)
(read-line in)))
=>" 我輩は猫である。名前はまだない。"
Inquisitor以前
●
文字コードの判定ライブラリ自体はあった
● Onjoさんのguess [2007]
– Gaucheの文字コード判定処理のCommon Lisp移植
– http://lispuser.net/commonlisp/japanese.html#sec-2.1
● Zqwellさんのguess [2011]
– 上記guessの多言語対応版
– https://github.com/zqwell/guess
Inquisitor以前
●
でも…
●
対応している処理系が少ない
– 例)CCLに対応していなかった
●
改行コード判定してくれない
– そもそも改行コードを扱えない処理系もある
●
SBCL、おまえのことだ!
● external-formatが処理系でまったく異なる
– SBCL: :UTF-8 --- ただのキーワード
– CCL: #<EXTERNAL-FORMAT :UTF-8/:UNIX #xxxxx> --- オブジェクト
– ECL: (:UTF-8 :CRLF) --- リスト
●
いちいちベクタをつくらないと判定できない
ないので…
\自分でつくるしかないじゃない!/
 *     +    巛 ヽ
            〒 !   +    。     +    。     *   
  。
      +    。  |  |
   *     +   / /   イヤッッホォォォオオォオウ!
       ∧_∧ / /
      (´∀` / / +    。     +    。   *     。
      ,-     f
      / ュヘ    | *     +    。     +   。 +
     〈_} )   |
        /    ! +    。     +    +     *
       ./  ,ヘ  |
 ガタン ||| j  / |  | |||
――――――――――――
Inquisitor
●
文字コード判定
●
改行コード判定 new!
● external-formatの処理系差を吸収 new!
●
ベクタ、ストリーム、pathnameから
external-format生成 new!
●
パッケージ構造をちょっぴり整理… new!
Inquisitorひとめぐり with CCL
●
文字コード判定
– 言語圏たち
●
改行コード判定
– 改行コードを扱える処理系か?
● external-formatづくり
– ベクタから
– ストリームから
– pathnameから
Inquisitorひとめぐり with CCL
●
文字コード判定
(with-open-file (in "/path/to/utf8-lf.ja"
:direction :input
:element-type '(unsigned-byte 8))
(inquisitor:detect-encoding in :jp))
=>:UTF-8
Inquisitorひとめぐり with CCL
●
文字コード判定
●
言語圏たち
(with-open-file (in "/path/to/utf8-lf.ja"
:direction :input
:element-type '(unsigned-byte 8))
(inquisitor:detect-encoding in :jp))
=>:UTF-8
:jp 日本語 :tw 台湾語
:cn 中国語 :kr 韓国語
:ru ロシア語 :ar アラビア語
:tr トルコ語 :gr ギリシア語
:hw ヘブライ語 :pl ポーランド語
:bl バルト語 - -
Inquisitorひとめぐり with CCL
●
改行コード判定
(with-open-file (in "/path/to/utf8-lf.ja"
:direction :input
:element-type '(unsigned-byte 8))
(inquisitor:detect-end-of-line in))
=>:LF
Inquisitorひとめぐり with CCL
●
改行コード判定
●
改行コードを扱える処理系か?
(with-open-file (in "/path/to/utf8-lf.ja"
:direction :input
:element-type '(unsigned-byte 8))
(inquisitor:detect-end-of-line in))
=>:LF
(inquisitor.eol:eol-available-p)
=>T ; on CCL
=>NIL ; on SBCL
Inquisitorひとめぐり with CCL
● external-formatづくり --- ベクタ
(let ((str (ccl:encode-string-to-octets
"公的な捜索係、調査官がいる。")))
(inquisitor:detect-external-format str :jp))
=>#<EXTERNAL-FORMAT :UTF-8/:UNIX #xxxxxxxxxx>
Inquisitorひとめぐり with CCL
● external-formatづくり --- ストリーム
(with-open-file (in "/path/to/utf8-lf.ja"
:direction :input
:element-type '(unsigned-byte 8))
(inquisitor:detect-external-format in :jp))
=>#<EXTERNAL-FORMAT :UTF-8/:UNIX #xxxxxxxxxx>
Inquisitorひとめぐり with CCL
● external-formatづくり --- pathname
(inquisitor:detect-external-format
#P"/path/to/utf8-lf.ja" :jp)
=>#<EXTERNAL-FORMAT :UTF-8/:UNIX #xxxxxxxxxx>
LTでなにを話せば……
LTでなにを話せば……
_人人人人人人人人人人人人_
> 技術的に面白いところ <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄
苦労話
●
技術的に面白いところはありません
– 泥くさいだけでした
●
ある文字コードについて、各処理系で違う名前が…
– 実質的に同じ? それとも別名?
– マニュアルを見比べWikipediaを見続け、ゲシュタルト崩壊
●
文字コードの闇の深さ
– 一般には普及していない文字コード(CNS 11643)
– 各種規格のマイク○ソフト拡張たち(CP932, etc…)
●
誤判定の原因か?
『深淵をのぞく時、深淵もまたこちらをのぞいているのだ』
--- フリードリヒ・ニーチェ
それって…
はい。
Inquisitorの現状
●
誤判定多し
– UTF16とUCS2とか(サロゲートペア)
●
そもそも文字コードの境界テストがない
●
テストにはTravisCIとRoswell
– 複数の処理系でのテストが楽チン
● ECLで動かない
– ECL本体のバグ
– 次回リリースでなんとかなる
● Quicklispに申請してみた
– まだ反応なし
今後のinquisitor
●
誤判定減らしたい
– 各文字コードについて更に調べる?
●
深淵がこちらを見ています。仲間にしますか?
● babelとの親和性
– 独自のexternal-format持つ
– 対応したほうがいいのかなあー
Inquisitorをどうぞよろしく
https://github.com/t-sin/inquisitor
以下、おまけ
SBCL(Linux)にCRLF突っ込んだら
● CRが読み込まれてしまいました
(let ((f "iamacat.txt")
(ef (inquisitor:detect-external-format
#P"iamacat.txt" :jp)))
(with-open-file (in f :external-format ef)
(read-line in)))
" 我輩は猫である。名前はまだない。^M"
命名inquisitor
●
ホルヘ・ルイス・ボルヘス『バベルの図書館』
– 本の詰まった書架からなる宇宙のお話
– 真理の書かれた本を探す役人:捜査官 (inquisitor)
● babel (Common Lisp)
– 文字列エンコーダ/デコーダ
●
文字コードは闇が深そうだなあ
– 文字コードの深淵を探る
●
そうだ、捜査官にしよう!

More Related Content

What's hot

Python 3.6 リリースパーティー 発表資料
Python 3.6 リリースパーティー 発表資料Python 3.6 リリースパーティー 発表資料
Python 3.6 リリースパーティー 発表資料
Atsuo Ishimoto
 
ひのきのぼうだけで全クリ目指す
ひのきのぼうだけで全クリ目指すひのきのぼうだけで全クリ目指す
ひのきのぼうだけで全クリ目指す
AromaBlack
 
すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!Genya Murakami
 
Boost tour 1.60.0 merge
Boost tour 1.60.0 mergeBoost tour 1.60.0 merge
Boost tour 1.60.0 merge
Akira Takahashi
 
pecoを使おう
pecoを使おうpecoを使おう
pecoを使おう
Hideaki Miyake
 
Constexpr 中3女子テクニック
Constexpr 中3女子テクニックConstexpr 中3女子テクニック
Constexpr 中3女子テクニックGenya Murakami
 
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだconstexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだGenya Murakami
 
Bitbucket Pull Request 練習帳
Bitbucket Pull Request 練習帳Bitbucket Pull Request 練習帳
Bitbucket Pull Request 練習帳
Hiramatsu Ryosuke
 
Altanative macro
Altanative macroAltanative macro
Altanative macro
Motohiro KOSAKI
 
GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法博文 斉藤
 
F#+Erlangで簡単なシューティングゲームを作ってみている
F#+Erlangで簡単なシューティングゲームを作ってみているF#+Erlangで簡単なシューティングゲームを作ってみている
F#+Erlangで簡単なシューティングゲームを作ってみているpocketberserker
 
Find(1)
Find(1)Find(1)
Find(1)
akitsukada
 
Glibc malloc internal
Glibc malloc internalGlibc malloc internal
Glibc malloc internal
Motohiro KOSAKI
 
SECDマシン 実装と動きとその他もろもろについて
SECDマシン 実装と動きとその他もろもろについてSECDマシン 実装と動きとその他もろもろについて
SECDマシン 実装と動きとその他もろもろについて
t-sin
 
Python 機械学習プログラミング データ分析ライブラリー解説編
Python 機械学習プログラミング データ分析ライブラリー解説編Python 機械学習プログラミング データ分析ライブラリー解説編
Python 機械学習プログラミング データ分析ライブラリー解説編
Etsuji Nakai
 
Boost tour 1_40_0
Boost tour 1_40_0Boost tour 1_40_0
Boost tour 1_40_0
Akira Takahashi
 
菩薩でもわかる!Rで動かすExcelアドインの作り方
 菩薩でもわかる!Rで動かすExcelアドインの作り方  菩薩でもわかる!Rで動かすExcelアドインの作り方
菩薩でもわかる!Rで動かすExcelアドインの作り方
Nagi Teramo
 

What's hot (20)

Python 3.6 リリースパーティー 発表資料
Python 3.6 リリースパーティー 発表資料Python 3.6 リリースパーティー 発表資料
Python 3.6 リリースパーティー 発表資料
 
ひのきのぼうだけで全クリ目指す
ひのきのぼうだけで全クリ目指すひのきのぼうだけで全クリ目指す
ひのきのぼうだけで全クリ目指す
 
すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!
 
Boost tour 1.60.0 merge
Boost tour 1.60.0 mergeBoost tour 1.60.0 merge
Boost tour 1.60.0 merge
 
Boost Tour 1.48.0 diff
Boost Tour 1.48.0 diffBoost Tour 1.48.0 diff
Boost Tour 1.48.0 diff
 
pecoを使おう
pecoを使おうpecoを使おう
pecoを使おう
 
Constexpr 中3女子テクニック
Constexpr 中3女子テクニックConstexpr 中3女子テクニック
Constexpr 中3女子テクニック
 
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだconstexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
 
Bitbucket Pull Request 練習帳
Bitbucket Pull Request 練習帳Bitbucket Pull Request 練習帳
Bitbucket Pull Request 練習帳
 
Altanative macro
Altanative macroAltanative macro
Altanative macro
 
GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法
 
F#+Erlangで簡単なシューティングゲームを作ってみている
F#+Erlangで簡単なシューティングゲームを作ってみているF#+Erlangで簡単なシューティングゲームを作ってみている
F#+Erlangで簡単なシューティングゲームを作ってみている
 
Find(1)
Find(1)Find(1)
Find(1)
 
Glibc malloc internal
Glibc malloc internalGlibc malloc internal
Glibc malloc internal
 
SECDマシン 実装と動きとその他もろもろについて
SECDマシン 実装と動きとその他もろもろについてSECDマシン 実装と動きとその他もろもろについて
SECDマシン 実装と動きとその他もろもろについて
 
Python 機械学習プログラミング データ分析ライブラリー解説編
Python 機械学習プログラミング データ分析ライブラリー解説編Python 機械学習プログラミング データ分析ライブラリー解説編
Python 機械学習プログラミング データ分析ライブラリー解説編
 
Rでreproducible research
Rでreproducible researchRでreproducible research
Rでreproducible research
 
Boost Tour 1_58_0 merge
Boost Tour 1_58_0 mergeBoost Tour 1_58_0 merge
Boost Tour 1_58_0 merge
 
Boost tour 1_40_0
Boost tour 1_40_0Boost tour 1_40_0
Boost tour 1_40_0
 
菩薩でもわかる!Rで動かすExcelアドインの作り方
 菩薩でもわかる!Rで動かすExcelアドインの作り方  菩薩でもわかる!Rで動かすExcelアドインの作り方
菩薩でもわかる!Rで動かすExcelアドインの作り方
 

Similar to Inquisitor -Common Lispに文字コード判定を-

Code Reading at Security and Programming camp 2011
Code Reading at Security and Programming camp 2011 Code Reading at Security and Programming camp 2011
Code Reading at Security and Programming camp 2011
Hiro Yoshioka
 
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
Hirotaka Kawata
 
Programming camp 2008, Codereading
Programming camp 2008, CodereadingProgramming camp 2008, Codereading
Programming camp 2008, Codereading
Hiro Yoshioka
 
Programming camp code reading
Programming camp code readingProgramming camp code reading
Programming camp code reading
Hiro Yoshioka
 
Rubyの御先祖CLUのお話(OSC 2011 Shimane LT 資料)
Rubyの御先祖CLUのお話(OSC 2011 Shimane LT 資料)Rubyの御先祖CLUのお話(OSC 2011 Shimane LT 資料)
Rubyの御先祖CLUのお話(OSC 2011 Shimane LT 資料)
洋史 東平
 
Pythonista による Pythonista のための Scala 紹介 in BPStudy #49
Pythonista による Pythonista のための Scala 紹介 in BPStudy #49Pythonista による Pythonista のための Scala 紹介 in BPStudy #49
Pythonista による Pythonista のための Scala 紹介 in BPStudy #49shoma h
 
Rubyの御先祖CLUのお話(原本)
Rubyの御先祖CLUのお話(原本)Rubyの御先祖CLUのお話(原本)
Rubyの御先祖CLUのお話(原本)
洋史 東平
 
Ctb57 with god7
Ctb57 with god7Ctb57 with god7
Ctb57 with god7
kingtomo
 
20130824 Lightweight Language "Go" @LL matsuri
20130824 Lightweight Language "Go" @LL matsuri20130824 Lightweight Language "Go" @LL matsuri
20130824 Lightweight Language "Go" @LL matsuri
Yoshifumi Yamaguchi
 
~knitr+pandocではじめる~『R MarkdownでReproducible Research』
~knitr+pandocではじめる~『R MarkdownでReproducible Research』~knitr+pandocではじめる~『R MarkdownでReproducible Research』
~knitr+pandocではじめる~『R MarkdownでReproducible Research』
Nagi Teramo
 
Security.gs fes 2010 in tokyo
Security.gs fes 2010 in tokyoSecurity.gs fes 2010 in tokyo
Security.gs fes 2010 in tokyo
Ren Sakamoto
 
clu2cは64ビットOSでも使えます (OSC 2012 Hiroshima LT用資料)
clu2cは64ビットOSでも使えます (OSC 2012 Hiroshima LT用資料)clu2cは64ビットOSでも使えます (OSC 2012 Hiroshima LT用資料)
clu2cは64ビットOSでも使えます (OSC 2012 Hiroshima LT用資料)洋史 東平
 
ECMAScript没proposal追悼式
ECMAScript没proposal追悼式ECMAScript没proposal追悼式
ECMAScript没proposal追悼式
京大 マイコンクラブ
 
Fluentd+elasticsearch+kibana(fluentd編)
Fluentd+elasticsearch+kibana(fluentd編)Fluentd+elasticsearch+kibana(fluentd編)
Fluentd+elasticsearch+kibana(fluentd編)
Daisuke Kikuchi
 
@nukokusa_botを支える技術
@nukokusa_botを支える技術@nukokusa_botを支える技術
@nukokusa_botを支える技術
Joe_noh
 
「Python言語」はじめの一歩 / First step of Python / 2016 Jan 12
「Python言語」はじめの一歩 / First step of Python / 2016 Jan 12「Python言語」はじめの一歩 / First step of Python / 2016 Jan 12
「Python言語」はじめの一歩 / First step of Python / 2016 Jan 12
Takanori Suzuki
 
Pyconjp2014_implementations
Pyconjp2014_implementationsPyconjp2014_implementations
Pyconjp2014_implementations
masahitojp
 
LKFT作ってみた
LKFT作ってみたLKFT作ってみた
LKFT作ってみた
sirrow
 
第2回勉強会スライド
第2回勉強会スライド第2回勉強会スライド
第2回勉強会スライド
koturn 0;
 

Similar to Inquisitor -Common Lispに文字コード判定を- (20)

Code Reading at Security and Programming camp 2011
Code Reading at Security and Programming camp 2011 Code Reading at Security and Programming camp 2011
Code Reading at Security and Programming camp 2011
 
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
 
Programming camp 2008, Codereading
Programming camp 2008, CodereadingProgramming camp 2008, Codereading
Programming camp 2008, Codereading
 
Programming camp code reading
Programming camp code readingProgramming camp code reading
Programming camp code reading
 
Rubyの御先祖CLUのお話(OSC 2011 Shimane LT 資料)
Rubyの御先祖CLUのお話(OSC 2011 Shimane LT 資料)Rubyの御先祖CLUのお話(OSC 2011 Shimane LT 資料)
Rubyの御先祖CLUのお話(OSC 2011 Shimane LT 資料)
 
Pythonista による Pythonista のための Scala 紹介 in BPStudy #49
Pythonista による Pythonista のための Scala 紹介 in BPStudy #49Pythonista による Pythonista のための Scala 紹介 in BPStudy #49
Pythonista による Pythonista のための Scala 紹介 in BPStudy #49
 
Rubyの御先祖CLUのお話(原本)
Rubyの御先祖CLUのお話(原本)Rubyの御先祖CLUのお話(原本)
Rubyの御先祖CLUのお話(原本)
 
Ctb57 with god7
Ctb57 with god7Ctb57 with god7
Ctb57 with god7
 
20130824 Lightweight Language "Go" @LL matsuri
20130824 Lightweight Language "Go" @LL matsuri20130824 Lightweight Language "Go" @LL matsuri
20130824 Lightweight Language "Go" @LL matsuri
 
~knitr+pandocではじめる~『R MarkdownでReproducible Research』
~knitr+pandocではじめる~『R MarkdownでReproducible Research』~knitr+pandocではじめる~『R MarkdownでReproducible Research』
~knitr+pandocではじめる~『R MarkdownでReproducible Research』
 
Security.gs fes 2010 in tokyo
Security.gs fes 2010 in tokyoSecurity.gs fes 2010 in tokyo
Security.gs fes 2010 in tokyo
 
clu2cは64ビットOSでも使えます (OSC 2012 Hiroshima LT用資料)
clu2cは64ビットOSでも使えます (OSC 2012 Hiroshima LT用資料)clu2cは64ビットOSでも使えます (OSC 2012 Hiroshima LT用資料)
clu2cは64ビットOSでも使えます (OSC 2012 Hiroshima LT用資料)
 
ECMAScript没proposal追悼式
ECMAScript没proposal追悼式ECMAScript没proposal追悼式
ECMAScript没proposal追悼式
 
らくちん Go言語
らくちん Go言語らくちん Go言語
らくちん Go言語
 
Fluentd+elasticsearch+kibana(fluentd編)
Fluentd+elasticsearch+kibana(fluentd編)Fluentd+elasticsearch+kibana(fluentd編)
Fluentd+elasticsearch+kibana(fluentd編)
 
@nukokusa_botを支える技術
@nukokusa_botを支える技術@nukokusa_botを支える技術
@nukokusa_botを支える技術
 
「Python言語」はじめの一歩 / First step of Python / 2016 Jan 12
「Python言語」はじめの一歩 / First step of Python / 2016 Jan 12「Python言語」はじめの一歩 / First step of Python / 2016 Jan 12
「Python言語」はじめの一歩 / First step of Python / 2016 Jan 12
 
Pyconjp2014_implementations
Pyconjp2014_implementationsPyconjp2014_implementations
Pyconjp2014_implementations
 
LKFT作ってみた
LKFT作ってみたLKFT作ってみた
LKFT作ってみた
 
第2回勉強会スライド
第2回勉強会スライド第2回勉強会スライド
第2回勉強会スライド
 

Inquisitor -Common Lispに文字コード判定を-