rabbit-slide-znz-SapporoRubyKaigi2012 2012.09.15

Sign up to get free protection for your applications and to get access to all the features.
data/.rabbit ADDED
@@ -0,0 +1 @@
1
+ nadoka-m17n.rab
@@ -0,0 +1,24 @@
1
+ = nadoka さんの m17n 対応のベストプラクティス
2
+
3
+ IRCnet の日本語チャンネルでは iso-2022-jp が使われていて、 iso-2022-jp は ascii compatible ではありません。 そのことが様々な問題を引き起こします。 その問題をどう解決したのか、 nadoka さんでの m17n 対応の最善の方法は何なのか、 ということについて話をする予定です。
4
+
5
+ == 作者向け
6
+
7
+ === 表示
8
+
9
+ rake
10
+
11
+ === 公開
12
+
13
+ rake publish
14
+
15
+ == 閲覧者向け
16
+
17
+ === インストール
18
+
19
+ gem install rabbit-slide--SapporoRubyKaigi2012
20
+
21
+ === 表示
22
+
23
+ rabbit rabbit-slide--SapporoRubyKaigi2012.gem
24
+
@@ -0,0 +1,10 @@
1
+ require "rabbit/task/slide"
2
+
3
+ # Edit ./config.yaml to customize meta data
4
+
5
+ Rabbit::Task::Slide.new do |task|
6
+ # task.spec.licenses = ["CC BY-SA 3.0"]
7
+ # task.spec.files += Dir.glob("doc/**/*.*")
8
+ # task.spec.files -= Dir.glob("private/**/*.*")
9
+ # task.spec.add_runtime_dependency("YOUR THEME")
10
+ end
@@ -0,0 +1,17 @@
1
+ ---
2
+ id: SapporoRubyKaigi2012
3
+ base_name: nadoka-m17n
4
+ tags:
5
+ - nadoka
6
+ - m17n
7
+ - ruby1.9
8
+ presentation_date: 2012/09/15
9
+ version: 2012.09.15
10
+ licenses: []
11
+ author:
12
+ markup_language: :rd
13
+ name: Kazuhiro NISHIYAMA
14
+ email: zn@mbf.nifty.com
15
+ rubygems_user: znz
16
+ slideshare_user: znzjp
17
+ speaker_deck_user:
@@ -0,0 +1,196 @@
1
+ = nadoka の ruby 1.9 対応
2
+
3
+ # : subtitle
4
+ # サブタイトル
5
+ : author
6
+ 西山和広
7
+ # : institution
8
+ # 所属
9
+ # : content-source
10
+ # イベント名
11
+ : date
12
+ 2012/09/15
13
+ : allotted-time
14
+ 5m
15
+ # : theme
16
+ # default
17
+ : theme
18
+ lightning-simple
19
+
20
+ = 自己紹介
21
+
22
+ * CRuby のコミッターのひとり
23
+ * https://github.com/nadoka のメンバー
24
+ * 大阪から来ました
25
+ * 札幌は涼しいかと思いきや...
26
+
27
+ = IRC とは?
28
+
29
+ * インターネット経由の複数人での((*チャット*))
30
+ * 1対1ではない
31
+ * IRC = Internet Relay Chat
32
+ * 古くからあるのでいろいろな環境で使える
33
+ * Ruby の開発でも使われている
34
+ * IRCnet の #ruby-ja (日本語)
35
+ * freenode の #ruby-core (英語)
36
+
37
+ = nadoka とは?
38
+
39
+ * 正式名称は nadoka さん
40
+ * IRC Client Server Program
41
+ * ((*proxy のようなもの*))
42
+ # * IRCサーバのクライアントプログラム(って何?)ではない
43
+ * plugins (bot) 対応
44
+
45
+ # image
46
+ # src = nadoka-safari.png
47
+ # relative_height = 150
48
+
49
+ == blockdiag
50
+ {
51
+ Server <-> nadoka <-> Clients;
52
+ group {
53
+ orientation = portrait
54
+ nadoka <-> plugins
55
+ }
56
+ }
57
+
58
+ = plugins (bot) の例
59
+
60
+ * 自動応答系
61
+ * Google 検索
62
+ * ((*URL からタイトル取得*))
63
+ * 天気情報取得
64
+ * 人工無能
65
+ * 自動発言系
66
+ * RSS の情報通知
67
+ * ((*挨拶*))
68
+ * 時報
69
+
70
+ = ruby 1.9 での問題
71
+
72
+ * 発言がみえなかった
73
+ * 発言ができなかった
74
+ * など
75
+
76
+ = ここから本題
77
+
78
+ = 使用 encoding
79
+
80
+ * 日本語圏では主に以下の encoding を使用
81
+ * ((*IRCnet : いわゆる JIS コード (ISO-2022-JP)*))
82
+ * freenode : UTF-8
83
+ * 問題
84
+ * ((*valid (valid_encoding? が真) とは限らない*))
85
+ * クライアントの設定ミス
86
+ * いわゆる半角カナの扱い
87
+ # * FULLWIDTH TILDE / WAVE DASH 問題
88
+ # * BACKSLASH / YEN SIGN 問題
89
+
90
+ = nadoka 本体への入出力
91
+
92
+ * server や client との送受信
93
+ # * valid な encoding とは仮定できない
94
+ * invalid なものもそのまま通したい
95
+ * ((*エラー処理は server や client に任せたい*))
96
+ * 文字化けの原因になりたくない
97
+ * 内部処理や plugins との入出力
98
+ * 元のバイト列そのまま
99
+ * ((*必要なら plugins で変換*))
100
+
101
+ = nadoka 本体での扱い
102
+
103
+ * 方針 : nadoka 本体では ASCII-8BIT で扱う
104
+ * force_encoding(Encoding::ASCII_8BIT) で((*バイナリ文字列扱い*))
105
+ * 文字列の内容は((*変換しない*))
106
+ * ruby 1.8 との互換性も考慮したため
107
+
108
+ == ログの encoding
109
+
110
+ * ログは元のバイト列そのまま保存する
111
+ * 無難な対応
112
+ * どの encoding にするのか悩まなくてすむ
113
+ * 問題があったときに調査しやすい
114
+ * どこが文字化けの原因か調べやすい
115
+ * 文字化けしていた時になんとかなる
116
+ * 設定ミスしたクライアントからの発言も (nkf とかで) がんばれば読める
117
+
118
+ = plugins の encoding 問題
119
+
120
+ * encoding の扱いが
121
+ * plugin によってバラバラ
122
+ * ruby 1.8 では((*適当でも動いた*))
123
+ * ruby 1.9 では
124
+ * Encoding::CompatibilityError ((*例外頻出*))
125
+ * たとえば
126
+ * 複数回 nkf を通していたり
127
+ * ISO-2022-JP と正規表現マッチしていたり
128
+
129
+ = plugins の encoding 方針
130
+
131
+ * ((*受信時に*))
132
+ * ((*一回だけ UTF-8 に変換*))
133
+ * ((*内部処理*))
134
+ * ((*UTF-8 で統一*))
135
+ * EUC-JP や Shift_JIS で扱っていた plugin も変更
136
+ * /re/e や /re/s で混在していた
137
+ * ((*送信時に*))
138
+ * ((*一回だけ server encoding に変換*))
139
+ # * 変換の指定方法はバラバラなまま...
140
+
141
+ = 問題例 (1)
142
+
143
+ * String#force_encoding(enc) を((*定義*))
144
+ * self を返すだけ
145
+ * ruby 1.8 + 別のライブラリ (nokogiri-1.5.2) の内部で((*謎のエラー*))
146
+ * uninitialized constant Nokogiri::XML::Node::Encoding
147
+ * 実は ::Encoding を参照しようとしていた
148
+ * respond_to?(:force_encoding) で((*確認してから使うように変更*))
149
+
150
+ = 問題例 (2)
151
+
152
+ * nadoka 本体
153
+ * サーバーへ送信する文字列を作成する部分
154
+ * チャンネル名 (ASCII-8BIT) + 発言内容 (JIS)
155
+ * ruby 1.8 だと気にせず結合できていた
156
+ * ruby 1.9 だと((*両方 ASCII only でも例外*)) Encoding::CompatibilityError
157
+ * ISO-2022-JP が ascii_compatible? ではないため
158
+ * 発言内容を force_encoding して解決
159
+ # * チャンネル名が ASCII only だと気付きにくい問題も事前に防げた
160
+
161
+ = 問題例 (3)
162
+
163
+ * plugin からの発言例
164
+ * bot 名: "hello bot: "
165
+ * 発言内容: "こんにちは"
166
+ * bot名 (UTF-8) + 発言内容 (JIS)
167
+ * 発言内容生成時に tojis で変換済み
168
+ * ((*結合時に例外*)) Encoding::CompatibilityError
169
+ * 結合後にも tojis で変換
170
+ * ruby 1.8 だと nkf の自動認識で問題なし
171
+ * ruby 1.9 だと結合後の tojis まで来ない
172
+
173
+ = 問題例 (3) の解決方法
174
+
175
+ * bot名 (UTF-8) + 発言内容 (UTF-8)
176
+ * 発言内容生成時には((*変換しない*))
177
+ * tojis で((*全体を変換*))
178
+ * nadoka 本体に渡す直前で((*一度だけ*))変換すべき
179
+
180
+ = まとめ
181
+
182
+ * String#force_encoding を定義して((*手抜き*)) 1.8/1.9 両対応は((*不幸の元*))
183
+ * ISO-2022-JP が US-ASCII 互換ではないのでバグが発見できた
184
+ * 無駄に複数回変換しない
185
+ * それぞれの((*入力、出力部分だけ*))で変換すべき
186
+ * nkf 便利
187
+
188
+ = おまけ
189
+
190
+ * trunk で動かしたら問題発生
191
+
192
+ = ruby 2.0 対応
193
+
194
+ * ((*iconv*)) がなくなっている
195
+ * 1.8 も考慮して nkf で置き換える?
196
+ * String#encode にするかどうかは未定
Binary file
Binary file
@@ -0,0 +1,40 @@
1
+ <?xml version='1.0' encoding='UTF-8'?>
2
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
3
+ <svg viewBox="0 0 640 200" xmlns="http://www.w3.org/2000/svg" xmlns:inkspace="http://www.inkscape.org/namespaces/inkscape" xmlns:xlink="http://www.w3.org/1999/xlink">
4
+ <defs id="defs_block">
5
+ <filter height="1.504" id="filter_blur" inkspace:collect="always" width="1.1575" x="-0.07875" y="-0.252">
6
+ <feGaussianBlur id="feGaussianBlur3780" inkspace:collect="always" stdDeviation="4.2" />
7
+ </filter>
8
+ </defs>
9
+ <title>blockdiag</title>
10
+ <desc>{
11
+ Server &lt;-&gt; nadoka &lt;-&gt; Clients;
12
+ group {
13
+ orientation = portrait
14
+ nadoka &lt;-&gt; plugins
15
+ }
16
+ }
17
+ </desc>
18
+ <rect fill="rgb(243,152,0)" height="140" style="filter:url(#filter_blur)" width="144" x="248" y="30" />
19
+ <rect fill="rgb(0,0,0)" height="40" stroke="rgb(0,0,0)" style="filter:url(#filter_blur);opacity:0.7;fill-opacity:1" width="128" x="67" y="46" />
20
+ <rect fill="rgb(0,0,0)" height="40" stroke="rgb(0,0,0)" style="filter:url(#filter_blur);opacity:0.7;fill-opacity:1" width="128" x="259" y="46" />
21
+ <rect fill="rgb(0,0,0)" height="40" stroke="rgb(0,0,0)" style="filter:url(#filter_blur);opacity:0.7;fill-opacity:1" width="128" x="259" y="126" />
22
+ <rect fill="rgb(0,0,0)" height="40" stroke="rgb(0,0,0)" style="filter:url(#filter_blur);opacity:0.7;fill-opacity:1" width="128" x="451" y="46" />
23
+ <rect fill="rgb(255,255,255)" height="40" stroke="rgb(0,0,0)" width="128" x="64" y="40" />
24
+ <text fill="rgb(0,0,0)" font-family="sansserif" font-size="11" font-style="normal" font-weight="normal" x="110" y="66">Server</text>
25
+ <rect fill="rgb(255,255,255)" height="40" stroke="rgb(0,0,0)" width="128" x="256" y="40" />
26
+ <text fill="rgb(0,0,0)" font-family="sansserif" font-size="11" font-style="normal" font-weight="normal" x="302" y="66">nadoka</text>
27
+ <rect fill="rgb(255,255,255)" height="40" stroke="rgb(0,0,0)" width="128" x="256" y="120" />
28
+ <text fill="rgb(0,0,0)" font-family="sansserif" font-size="11" font-style="normal" font-weight="normal" x="299" y="146">plugins</text>
29
+ <rect fill="rgb(255,255,255)" height="40" stroke="rgb(0,0,0)" width="128" x="448" y="40" />
30
+ <text fill="rgb(0,0,0)" font-family="sansserif" font-size="11" font-style="normal" font-weight="normal" x="491" y="66">Clients</text>
31
+ <path d="M 200 60 L 248 60" fill="none" stroke="rgb(0,0,0)" />
32
+ <polygon fill="rgb(0,0,0)" points="193,60 200,56 200,64 193,60" stroke="rgb(0,0,0)" />
33
+ <polygon fill="rgb(0,0,0)" points="255,60 248,56 248,64 255,60" stroke="rgb(0,0,0)" />
34
+ <path d="M 320 88 L 320 112" fill="none" stroke="rgb(0,0,0)" />
35
+ <polygon fill="rgb(0,0,0)" points="320,81 316,88 324,88 320,81" stroke="rgb(0,0,0)" />
36
+ <polygon fill="rgb(0,0,0)" points="320,119 316,112 324,112 320,119" stroke="rgb(0,0,0)" />
37
+ <path d="M 392 60 L 440 60" fill="none" stroke="rgb(0,0,0)" />
38
+ <polygon fill="rgb(0,0,0)" points="385,60 392,56 392,64 385,60" stroke="rgb(0,0,0)" />
39
+ <polygon fill="rgb(0,0,0)" points="447,60 440,56 440,64 447,60" stroke="rgb(0,0,0)" />
40
+ </svg>
metadata ADDED
@@ -0,0 +1,71 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rabbit-slide-znz-SapporoRubyKaigi2012
3
+ version: !ruby/object:Gem::Version
4
+ version: 2012.09.15
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Kazuhiro NISHIYAMA
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-09-16 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rabbit
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 2.0.2
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: 2.0.2
30
+ description: IRCnet の日本語チャンネルでは iso-2022-jp が使われていて、 iso-2022-jp は ascii compatible
31
+ ではありません。 そのことが様々な問題を引き起こします。 その問題をどう解決したのか、 nadoka さんでの m17n 対応の最善の方法は何なのか、 ということについて話をする予定です。
32
+ email:
33
+ - zn@mbf.nifty.com
34
+ executables: []
35
+ extensions: []
36
+ extra_rdoc_files: []
37
+ files:
38
+ - .rabbit
39
+ - config.yaml
40
+ - Rakefile
41
+ - README.rd
42
+ - nadoka.svg
43
+ - nadoka-safari.png
44
+ - nadoka.png
45
+ - nadoka-m17n.rab
46
+ - pdf/SapporoRubyKaigi2012-nadoka-m17n.pdf
47
+ homepage: http://slide.rabbit-shocker.org/authors/znz/SapporoRubyKaigi2012/
48
+ licenses: []
49
+ post_install_message:
50
+ rdoc_options: []
51
+ require_paths:
52
+ - lib
53
+ required_ruby_version: !ruby/object:Gem::Requirement
54
+ none: false
55
+ requirements:
56
+ - - ! '>='
57
+ - !ruby/object:Gem::Version
58
+ version: '0'
59
+ required_rubygems_version: !ruby/object:Gem::Requirement
60
+ none: false
61
+ requirements:
62
+ - - ! '>='
63
+ - !ruby/object:Gem::Version
64
+ version: '0'
65
+ requirements: []
66
+ rubyforge_project:
67
+ rubygems_version: 1.8.23
68
+ signing_key:
69
+ specification_version: 3
70
+ summary: nadoka さんの m17n 対応のベストプラクティス
71
+ test_files: []