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 +1 -0
- data/README.rd +24 -0
- data/Rakefile +10 -0
- data/config.yaml +17 -0
- data/nadoka-m17n.rab +196 -0
- data/nadoka-safari.png +0 -0
- data/nadoka.png +0 -0
- data/nadoka.svg +40 -0
- data/pdf/SapporoRubyKaigi2012-nadoka-m17n.pdf +0 -0
- metadata +71 -0
data/.rabbit
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
nadoka-m17n.rab
|
data/README.rd
ADDED
@@ -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
|
+
|
data/Rakefile
ADDED
@@ -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
|
data/config.yaml
ADDED
@@ -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:
|
data/nadoka-m17n.rab
ADDED
@@ -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 にするかどうかは未定
|
data/nadoka-safari.png
ADDED
Binary file
|
data/nadoka.png
ADDED
Binary file
|
data/nadoka.svg
ADDED
@@ -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 <-> nadoka <-> Clients;
|
12
|
+
group {
|
13
|
+
orientation = portrait
|
14
|
+
nadoka <-> 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>
|
Binary file
|
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: []
|