SlideShare a Scribd company logo
1 of 59
Download to read offline
本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6
本当はこわい
エンコーディングの話
とみたまさひろ
東京Ruby会議10
2013-01-13
本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6
自己紹介
とみた まさひろ
http://tmtms.hatenablog.com
https://twitter.com/tmtms
好きなもの/環境
Ruby, Rabbit, MySQL, Emacs, Git,
Ubuntu, ThinkPad
所属など
長野県北部在住 / 某社プログラマー / 日本
MySQLユーザ会 / 長野ソフトウェア技術者
グループ(NSEG)
本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6
エンコーディング
本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6
エンコーディングとは
文字符号化方式
文字をどのようなバイト列で表現するか
UTF-8 とか EUC-JP とか SHIFT_JIS と
かそーゆー奴
「charset」とか呼ばれたりする
「文字コード」とか呼ばれたりする
本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6
同じバイト列でも別の文字
0xC2 0xA9 の2バイトは
UTF-8 では「©」1文字
EUC-JP では「息」1文字
SHIFT_JIS では「ツゥ」2文字
本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6
Ruby 1.8
"xC2xA9" という文字列は Ruby 的に
はただのバイト列
エンコーディング情報を持たない
"©"(UTF-8) として扱うか "息"(EUC-JP)
として扱うかはプログラム次第
正規表現にはエンコーディングあり
/〜/n /〜/s /〜/u /〜/e
本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6
Ruby 1.9
文字列のエンコーディングは文字列自身が
知っている
"©"(UTF-8) と "息"(EUC-JP) は同じバイ
ト列だけど異なる文字列
"あ"(UTF-8) と "あ"(EUC-JP) は同じ文
字を表してるけど等しくない
同じプログラム中で複数のエンコーディ
ングの文字列を同時に扱える(珍しいかも)
正規表現にもエンコーディングあり
本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6
エンコーディング一覧(1.9.3)
Ruby 自身が持ってるので環境に依存しない
ASCII-8BIT Big5 Big5-HKSCS Big5-UAO CP50220 CP50221 CP51932 CP850
CP852 CP855 CP949 CP950 CP951 EUC-JP EUC-KR EUC-TW Emacs-Mule
GB12345 GB18030 GB1988 GB2312 GBK IBM437 IBM737 IBM775 IBM852
IBM855 IBM857 IBM860 IBM861 IBM862 IBM863 IBM864 IBM865 IBM866
IBM869 ISO-2022-JP ISO-2022-JP-2 ISO-2022-JP-KDDI ISO-8859-1
ISO-8859-10 ISO-8859-11 ISO-8859-13 ISO-8859-14 ISO-8859-15
ISO-8859-16 ISO-8859-2 ISO-8859-3 ISO-8859-4 ISO-8859-5 ISO-8859-6
ISO-8859-7 ISO-8859-8 ISO-8859-9 KOI8-R KOI8-U MacJapanese
SJIS-DoCoMo SJIS-KDDI SJIS-SoftBank Shift_JIS TIS-620 US-ASCII
UTF-16 UTF-16BE UTF-16LE UTF-32 UTF-32BE UTF-32LE UTF-7 UTF-8
UTF8-DoCoMo UTF8-KDDI UTF8-MAC UTF8-SoftBank Windows-1250
Windows-1251 Windows-1252 Windows-1253 Windows-1254 Windows-1255
Windows-1256 Windows-1257 Windows-1258 Windows-31J Windows-874
eucJP-ms macCentEuro macCroatian macCyrillic macGreek macIceland
macRoman macRomania macThai macTurkish macUkraine
stateless-ISO-2022-JP stateless-ISO-2022-JP-KDDI
本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6
うれしいこと
本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6
1.8ではバイト単位
"あいう".size #=> 9
"あいう".bytesize #=> 9
"あいう".chars{|c| ... }
#=> "xE3","x81","x82", ...
"あいう"[0] #=> 0xE3
"あいう".reverse
#=> "x86x81xE3x84x81xE3x82x81xE3"
本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6
1.9では文字単位
"あいう".size #=> 3
"あいう".bytesize #=> 9
"あいう".chars{|c| ... }
#=> "あ", "い", "う"
"あいう"[0] #=> "あ"
"あいう".reverse #=> "ういあ"
本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6
エンコーディング変換
# -*- coding: utf-8 -*-
s = "あいう"
#=> "xE3x81x82xE3x81x84xE3x81x86"
s.encoding #=> #<Encoding:UTF-8>
s2 = s.encode("CP932")
#=> "x82xA0x82xA2x82xA4"
s2.encoding #=> #<Encoding:Windows-31J>
本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6
IOで変換してくれる
File.open("cp932.txt", "r:CP932").read
#=> CP932 文字列
File.open("cp932.txt", "r:CP932:UTF-8").read
#=> UTF-8 文字列
File.open("cp932.txt").read
#=> 環境依存
本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6
うれしいことばかりじゃない
本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6
変換先にない文字
# -*- coding: utf-8 -*-
"あ♥".encode("CP932")
#=> Encoding::UndefinedConversionError
本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6
変換元にない文字
# -*- coding: utf-8 -*-
"あxFF".encode("CP932")
#=> Encoding::InvalidByteSequenceError
本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6
エンコーディングがあっても
変換できるとは限らない
# -*- coding: utf-8 -*-
"あいう".encode("UTF-7")
#=> Encoding::ConverterNotFoundError
本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6
エンコーディングの不一致
utf8 = "あいう"
cp932 = "あ".encode("CP932")
utf8.start_with?(cp932)
#=> Encoding::CompatibilityError
本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6
文字列と正規表現の
エンコーディングの不一致
utf8 = "あいう"
re = /./s
utf8 =~ re
#=> Encoding::CompatibilityError
本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6
エンコーディングが同じでも
不正な文字を含んでいる
utf8 = "あxFF"
utf8 =~ /./
#=> invalid byte sequence in UTF-8
# (ArgumentError)
本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6
IO
本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6
メソッドによって
エンコーディングが異なる
テキスト読み込み(エンコードあり)
IO#gets
IO#getc
IO#lines
IO#read 等
バイナリ読み込み(ASCII-8BIT固定)
IO#read(n)
IO#sysread 等
本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6
IO#read
IO#read(size) は ASCII-8BIT
IO#read() は外部エンコーディング依存
引数の有無によって結果のエンコーディ
ングが異なる!
なにそれこわい
本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6
外部エンコーディング
ファイル自身は自分の内容のエンコーデ
ィングを知らない
ファイルから読み込んだ文字列の Ruby
内でのエンコーディングは何らかの方法
で指定する必要がある
本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6
引数で指定
File.open(filename, "r:UTF-8")
File.read(filename, :encoding=>"UTF-8")
本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6
環境変数
引数で指定されてない場合は環境変数が参照
される
LC_ALL
LC_CTYPE
LANG
本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6
環境変数による違い
% cat utf-8.txt
あいうえお
% export LC_ALL=C
% ruby -e 'p File.read("utf-8.txt").size'
16
% export LC_ALL=ja_JP.UTF-8
% ruby -e 'p File.read("utf-8.txt").size'
6
環境変数によって動きが変わっちゃう!こわい
本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6
入力時にはエラーにならない
utf8 = File.read("utf8.txt", :encoding=>"UTF-8")
# 実は UTF-8 として不正な文字が含まれていて
〜〜〜〜〜〜
# ずっと後で別のメソッドでエラーになったり
utf8 =~ /./
#=> invalid byte sequence in UTF-8 (ArgumentError)
本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6
CGI
require "cgi"
cgi = CGI.new
不正な文字のパラメータを渡すとエラー
GET http://example.com/hoge.cgi?fuga=%FF
#=> Accept-Charset encoding error (CGI::InvalidEncoding)
本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6
Rails
不正な文字のパラメータを渡すとエラー
POST http://example.com/posts
post[title]=%FF
#=> ArgumentError (invalid byte sequence in UTF-8)
本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6
エラーになりすぎこわい!
本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6
対処
本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6
変換先にない文字を置換
"あ♥".encode("CP932")
#=> Encoding::UndefinedConversionError
"あ♥".encode("CP932", :undef=>:replace)
#=> "あ?"
本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6
変換元にない文字を置換
"あxFF".encode("CP932")
#=> Encoding::InvalidByteSequenceError
"あxFF".encode("CP932", :invalid=>:replace)
#=> "あ?"
本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6
置換文字の指定
"あ♥".encode("CP932", :undef=>:replace, :replace=>"〓")
#=> CP932 で "あ〓"
本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6
そもそも変換が必要になるような
ことをしないのが吉
本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6
UTF-8に統一すれば
たいていは問題ない
本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6
UTF-8に統一したつもりでも
他のエンコーディングが現れるこ
とも
File.open(filename, "r:UTF-8").read
#=> UTF-8 文字列
File.open(filename).read
#=> 環境依存
本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6
いちいち引数で指定する?
本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6
デフォルト値を指定する
プログラムで使用するファイルのエンコーディ
ングがすべて同一であれば
Encoding.default_external = "UTF-8"
File.read(filename) #=> UTF-8文字列
本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6
これで問題ない?
本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6
ASCII-8BIT
本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6
メソッドによっては ASCII-8BIT
f = File.open(filename, "r:UTF-8")
f.gets #=> UTF-8
f.read(10) #=> ASCII-8BIT
本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6
ソケットは ASCII-8BIT
require 'socket'
Encoding.default_external = "UTF-8"
TCPSocket.new('127.0.0.1', 25).gets
#=> ASCII-8BIT
本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6
気をつけるしかない
本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6
不正な文字
本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6
エンコーディングがUTF-8でも
データがUTF-8とは限らない
f = File.open("/dev/urandom", "r:UTF-8")
str = f.gets
str.encoding #=> #<Encoding:UTF-8>
str =~ /./
#=> invalid byte sequence in UTF-8 (ArgumentError)
本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6
事前に判定
String#valid_encoding?
f = File.open("/dev/urandom", "r:UTF-8")
str = f.gets
str.valid_encoding? #=> false
本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6
不正な文字を置換したい
簡単な方法はない
String#encode は変換元と変換先が同じ
場合は何もしない
# -*- coding: utf-8 -*-
"あxFF".encode("CP932", :invalid=>:replace)
#=> "あ?"
"あxFF".encode("UTF-8", :invalid=>:replace)
#=> "あxFF"
本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6
Iconv ではできたけど…
require "iconv"
src = "あいxFFうえ"
dst = ""
iconv = Iconv.new("utf-8", "utf-8")
begin
dst.concat iconv.iconv(src)
rescue Iconv::IllegalSequence => e
dst.concat e.success
dst.concat "〓"
src = e.failed[1..-1]
retry
end
dst #=> "あい〓うえ"
Iconv は 2.0 で廃止
本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6
同じ文字群を持つ
別のエンコーディングを経由
"あxFF".
encode("UTF-16", :invalid=>:replace).
encode("UTF-8")
#=> "あ�"
本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6
2.0.xだとできるようになる?
本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6
CGI や Rails
本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6
パラメータが不正な文字で
エラー
放置でいいんじゃない?
外部からの不正なデータは最前線でエラー
になってくれた方がありがたかったり
後の処理に渡されても扱いに困るだけ
実害はログが鬱陶しいくらい?
本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6
CGIで頑張るなら
require 'cgi'
# 一旦 ASCII-8BIT で受けて
cgi = CGI.new :accept_charset=>"ASCII-8BIT"
# パラメータ毎にどうにかする
hoge = cgi['hoge'].encode("UTF-8", "UTF-8")
unless hoge.valid_encoding?
...
本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6
Railsは...
よくわかりません (><)
本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6
おまけ
本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6
ASCII文字だけなら
異なるエンコーディングでも
エラーにならない
# -*- coding: utf-8 -*-
"あ" =~ /./s #=> Encoding::CompatibilityError
"ABC" =~ /./s #=> エラーにならない
ASCII文字だけでテストしてると本番でエラー
になったりこわい
本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6
まとめ
内部のエンコーディングは UTF-8 に統一
しよう
IO 読み込みで ASCII-8BIT になってるこ
とがある
外部からのデータは不正な文字が入ってる
ことがある
ちゃんと気をつければそんなにこわくない

More Related Content

What's hot

Scapyで作る・解析するパケット
Scapyで作る・解析するパケットScapyで作る・解析するパケット
Scapyで作る・解析するパケットTakaaki Hoyo
 
本当にわかる Spectre と Meltdown
本当にわかる Spectre と Meltdown本当にわかる Spectre と Meltdown
本当にわかる Spectre と MeltdownHirotaka Kawata
 
野良ビルドから見たGentoo
野良ビルドから見たGentoo野良ビルドから見たGentoo
野良ビルドから見たGentooNaohiro Aota
 
ZabbixのAPIを使って運用を楽しくする話
ZabbixのAPIを使って運用を楽しくする話ZabbixのAPIを使って運用を楽しくする話
ZabbixのAPIを使って運用を楽しくする話Masahito Zembutsu
 
Python Kyoto study
Python Kyoto studyPython Kyoto study
Python Kyoto studyNaoya Inada
 
Scapy presentation Remake(訂正)
Scapy presentation Remake(訂正)Scapy presentation Remake(訂正)
Scapy presentation Remake(訂正)ashigirl ZareGoto
 
Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Ransui Iso
 
HDFSネームノードのHAについて #hcj13w
HDFSネームノードのHAについて #hcj13wHDFSネームノードのHAについて #hcj13w
HDFSネームノードのHAについて #hcj13wCloudera Japan
 
mod_auth_ticket - Bringing Single-Sign-On to lighttpd
mod_auth_ticket - Bringing Single-Sign-On to lighttpdmod_auth_ticket - Bringing Single-Sign-On to lighttpd
mod_auth_ticket - Bringing Single-Sign-On to lighttpdTaisuke Yamada
 
golang binary hacks
golang binary hacksgolang binary hacks
golang binary hacksyaegashi
 
import dpkt したよ #ssmjp 2014/02/28
import dpkt したよ #ssmjp 2014/02/28import dpkt したよ #ssmjp 2014/02/28
import dpkt したよ #ssmjp 2014/02/28th0x0472
 
tse - Pythonによるテキスト整形ユーティリティ
tse - Pythonによるテキスト整形ユーティリティtse - Pythonによるテキスト整形ユーティリティ
tse - Pythonによるテキスト整形ユーティリティAtsuo Ishimoto
 
signal の話 或いは Zend Signals とは何か
signal の話 或いは Zend Signals とは何かsignal の話 或いは Zend Signals とは何か
signal の話 或いは Zend Signals とは何かdo_aki
 
サバフェスLT(元うなぎ屋)
サバフェスLT(元うなぎ屋)サバフェスLT(元うなぎ屋)
サバフェスLT(元うなぎ屋)snicker_jp
 
SDN Lab環境でのRobotFramework実践活用
SDN Lab環境でのRobotFramework実践活用SDN Lab環境でのRobotFramework実践活用
SDN Lab環境でのRobotFramework実践活用Toshiki Tsuboi
 
PECL を数えてみた
PECL を数えてみたPECL を数えてみた
PECL を数えてみたy-uti
 

What's hot (20)

Scapyで作る・解析するパケット
Scapyで作る・解析するパケットScapyで作る・解析するパケット
Scapyで作る・解析するパケット
 
本当にわかる Spectre と Meltdown
本当にわかる Spectre と Meltdown本当にわかる Spectre と Meltdown
本当にわかる Spectre と Meltdown
 
野良ビルドから見たGentoo
野良ビルドから見たGentoo野良ビルドから見たGentoo
野良ビルドから見たGentoo
 
ZabbixのAPIを使って運用を楽しくする話
ZabbixのAPIを使って運用を楽しくする話ZabbixのAPIを使って運用を楽しくする話
ZabbixのAPIを使って運用を楽しくする話
 
Python Kyoto study
Python Kyoto studyPython Kyoto study
Python Kyoto study
 
Scapy presentation
Scapy presentationScapy presentation
Scapy presentation
 
Scapy presentation Remake(訂正)
Scapy presentation Remake(訂正)Scapy presentation Remake(訂正)
Scapy presentation Remake(訂正)
 
Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6
 
HDFSネームノードのHAについて #hcj13w
HDFSネームノードのHAについて #hcj13wHDFSネームノードのHAについて #hcj13w
HDFSネームノードのHAについて #hcj13w
 
mod_auth_ticket - Bringing Single-Sign-On to lighttpd
mod_auth_ticket - Bringing Single-Sign-On to lighttpdmod_auth_ticket - Bringing Single-Sign-On to lighttpd
mod_auth_ticket - Bringing Single-Sign-On to lighttpd
 
PGroongaの実装
PGroongaの実装PGroongaの実装
PGroongaの実装
 
Groonga族2015
Groonga族2015Groonga族2015
Groonga族2015
 
golang binary hacks
golang binary hacksgolang binary hacks
golang binary hacks
 
Free bsd jail入門
Free bsd jail入門Free bsd jail入門
Free bsd jail入門
 
import dpkt したよ #ssmjp 2014/02/28
import dpkt したよ #ssmjp 2014/02/28import dpkt したよ #ssmjp 2014/02/28
import dpkt したよ #ssmjp 2014/02/28
 
tse - Pythonによるテキスト整形ユーティリティ
tse - Pythonによるテキスト整形ユーティリティtse - Pythonによるテキスト整形ユーティリティ
tse - Pythonによるテキスト整形ユーティリティ
 
signal の話 或いは Zend Signals とは何か
signal の話 或いは Zend Signals とは何かsignal の話 或いは Zend Signals とは何か
signal の話 或いは Zend Signals とは何か
 
サバフェスLT(元うなぎ屋)
サバフェスLT(元うなぎ屋)サバフェスLT(元うなぎ屋)
サバフェスLT(元うなぎ屋)
 
SDN Lab環境でのRobotFramework実践活用
SDN Lab環境でのRobotFramework実践活用SDN Lab環境でのRobotFramework実践活用
SDN Lab環境でのRobotFramework実践活用
 
PECL を数えてみた
PECL を数えてみたPECL を数えてみた
PECL を数えてみた
 

Similar to 本当はこわいエンコーディングの話

nadoka さんの m17n 対応のベストプラクティス
nadoka さんの m17n 対応のベストプラクティスnadoka さんの m17n 対応のベストプラクティス
nadoka さんの m17n 対応のベストプラクティスKazuhiro Nishiyama
 
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成Izumi Tsutsui
 
Linux Kernel Seminar in tripodworks
Linux Kernel Seminar in tripodworksLinux Kernel Seminar in tripodworks
Linux Kernel Seminar in tripodworkstripodworks
 
Exgettextの話
Exgettextの話Exgettextの話
Exgettextの話k1complete
 
ツイートID生成とツイッターリアルタイム検索システムの話
ツイートID生成とツイッターリアルタイム検索システムの話ツイートID生成とツイッターリアルタイム検索システムの話
ツイートID生成とツイッターリアルタイム検索システムの話Preferred Networks
 
Amazon EKS によるスマホゲームのバックエンド運用事例
Amazon EKS によるスマホゲームのバックエンド運用事例Amazon EKS によるスマホゲームのバックエンド運用事例
Amazon EKS によるスマホゲームのバックエンド運用事例gree_tech
 
インフラエンジニアがk8sでアプリを作って見えた今後のインフラ
インフラエンジニアがk8sでアプリを作って見えた今後のインフラインフラエンジニアがk8sでアプリを作って見えた今後のインフラ
インフラエンジニアがk8sでアプリを作って見えた今後のインフラsusumu tanaka
 
Node予備校 vol.1 名古屋
Node予備校 vol.1 名古屋Node予備校 vol.1 名古屋
Node予備校 vol.1 名古屋Mori Shingo
 
OSC2011 Tokyo/Spring 自宅SAN友の会(前半)
OSC2011 Tokyo/Spring 自宅SAN友の会(前半)OSC2011 Tokyo/Spring 自宅SAN友の会(前半)
OSC2011 Tokyo/Spring 自宅SAN友の会(前半)Satoshi Shimazaki
 
ゆるふわLinux-HA 〜PostgreSQL編〜
ゆるふわLinux-HA 〜PostgreSQL編〜ゆるふわLinux-HA 〜PostgreSQL編〜
ゆるふわLinux-HA 〜PostgreSQL編〜Taro Matsuzawa
 
Using Kubernetes on Google Container Engine
Using Kubernetes on Google Container EngineUsing Kubernetes on Google Container Engine
Using Kubernetes on Google Container EngineEtsuji Nakai
 
泥臭い運用から、プログラマブルインフラ構築(に行きたい)
泥臭い運用から、プログラマブルインフラ構築(に行きたい) 泥臭い運用から、プログラマブルインフラ構築(に行きたい)
泥臭い運用から、プログラマブルインフラ構築(に行きたい) Akihiro Kuwano
 
1st OCDET Baremetal MTG OpenStack baremetal compute by GMO AppsCloud
1st OCDET Baremetal MTG OpenStack baremetal compute by GMO AppsCloud1st OCDET Baremetal MTG OpenStack baremetal compute by GMO AppsCloud
1st OCDET Baremetal MTG OpenStack baremetal compute by GMO AppsCloudNaoto Gohko
 
SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム
SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテムSmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム
SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテムSmartNews, Inc.
 
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力ThinReports
 

Similar to 本当はこわいエンコーディングの話 (20)

文字化け
文字化け文字化け
文字化け
 
nadoka さんの m17n 対応のベストプラクティス
nadoka さんの m17n 対応のベストプラクティスnadoka さんの m17n 対応のベストプラクティス
nadoka さんの m17n 対応のベストプラクティス
 
文字化け
文字化け文字化け
文字化け
 
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成
 
Linux Kernel Seminar in tripodworks
Linux Kernel Seminar in tripodworksLinux Kernel Seminar in tripodworks
Linux Kernel Seminar in tripodworks
 
Exgettextの話
Exgettextの話Exgettextの話
Exgettextの話
 
ツイートID生成とツイッターリアルタイム検索システムの話
ツイートID生成とツイッターリアルタイム検索システムの話ツイートID生成とツイッターリアルタイム検索システムの話
ツイートID生成とツイッターリアルタイム検索システムの話
 
NodeFest2014 - Transpiler
NodeFest2014 - TranspilerNodeFest2014 - Transpiler
NodeFest2014 - Transpiler
 
Amazon EKS によるスマホゲームのバックエンド運用事例
Amazon EKS によるスマホゲームのバックエンド運用事例Amazon EKS によるスマホゲームのバックエンド運用事例
Amazon EKS によるスマホゲームのバックエンド運用事例
 
インフラエンジニアがk8sでアプリを作って見えた今後のインフラ
インフラエンジニアがk8sでアプリを作って見えた今後のインフラインフラエンジニアがk8sでアプリを作って見えた今後のインフラ
インフラエンジニアがk8sでアプリを作って見えた今後のインフラ
 
Node予備校 vol.1 名古屋
Node予備校 vol.1 名古屋Node予備校 vol.1 名古屋
Node予備校 vol.1 名古屋
 
OSC2011 Tokyo/Spring 自宅SAN友の会(前半)
OSC2011 Tokyo/Spring 自宅SAN友の会(前半)OSC2011 Tokyo/Spring 自宅SAN友の会(前半)
OSC2011 Tokyo/Spring 自宅SAN友の会(前半)
 
ゆるふわLinux-HA 〜PostgreSQL編〜
ゆるふわLinux-HA 〜PostgreSQL編〜ゆるふわLinux-HA 〜PostgreSQL編〜
ゆるふわLinux-HA 〜PostgreSQL編〜
 
システムコール
システムコールシステムコール
システムコール
 
Using Kubernetes on Google Container Engine
Using Kubernetes on Google Container EngineUsing Kubernetes on Google Container Engine
Using Kubernetes on Google Container Engine
 
泥臭い運用から、プログラマブルインフラ構築(に行きたい)
泥臭い運用から、プログラマブルインフラ構築(に行きたい) 泥臭い運用から、プログラマブルインフラ構築(に行きたい)
泥臭い運用から、プログラマブルインフラ構築(に行きたい)
 
1st OCDET Baremetal MTG OpenStack baremetal compute by GMO AppsCloud
1st OCDET Baremetal MTG OpenStack baremetal compute by GMO AppsCloud1st OCDET Baremetal MTG OpenStack baremetal compute by GMO AppsCloud
1st OCDET Baremetal MTG OpenStack baremetal compute by GMO AppsCloud
 
SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム
SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテムSmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム
SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム
 
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
 
MongoDB on AWS
MongoDB on AWSMongoDB on AWS
MongoDB on AWS
 

More from Masahiro Tomita

お前の罪を数えろ
お前の罪を数えろお前の罪を数えろ
お前の罪を数えろMasahiro Tomita
 
本当はこわいMySQLプロトコル
本当はこわいMySQLプロトコル本当はこわいMySQLプロトコル
本当はこわいMySQLプロトコルMasahiro Tomita
 
ネットワークこわい
ネットワークこわいネットワークこわい
ネットワークこわいMasahiro Tomita
 
MySQLの文字コード事情 2017春版
MySQLの文字コード事情 2017春版MySQLの文字コード事情 2017春版
MySQLの文字コード事情 2017春版Masahiro Tomita
 
MySQLの文字コード事情 2017版
MySQLの文字コード事情 2017版MySQLの文字コード事情 2017版
MySQLの文字コード事情 2017版Masahiro Tomita
 
MySQLの文字コード事情
MySQLの文字コード事情MySQLの文字コード事情
MySQLの文字コード事情Masahiro Tomita
 
「理論から学ぶデータベース実践入門」読書会スペシャル
「理論から学ぶデータベース実践入門」読書会スペシャル「理論から学ぶデータベース実践入門」読書会スペシャル
「理論から学ぶデータベース実践入門」読書会スペシャルMasahiro Tomita
 
アジャイルジャパン長野サテライト
アジャイルジャパン長野サテライトアジャイルジャパン長野サテライト
アジャイルジャパン長野サテライトMasahiro Tomita
 
MySQLのプロトコル解説
MySQLのプロトコル解説MySQLのプロトコル解説
MySQLのプロトコル解説Masahiro Tomita
 

More from Masahiro Tomita (20)

お前の罪を数えろ
お前の罪を数えろお前の罪を数えろ
お前の罪を数えろ
 
Ruby 2.5
Ruby 2.5Ruby 2.5
Ruby 2.5
 
本当はこわいMySQLプロトコル
本当はこわいMySQLプロトコル本当はこわいMySQLプロトコル
本当はこわいMySQLプロトコル
 
ネットワークこわい
ネットワークこわいネットワークこわい
ネットワークこわい
 
CSV
CSVCSV
CSV
 
MySQLの文字コード事情 2017春版
MySQLの文字コード事情 2017春版MySQLの文字コード事情 2017春版
MySQLの文字コード事情 2017春版
 
MySQLの文字コード事情 2017版
MySQLの文字コード事情 2017版MySQLの文字コード事情 2017版
MySQLの文字コード事情 2017版
 
Ruby24
Ruby24Ruby24
Ruby24
 
MySQLの文字コード事情
MySQLの文字コード事情MySQLの文字コード事情
MySQLの文字コード事情
 
進捗と品質
進捗と品質進捗と品質
進捗と品質
 
MySQLを拡張する
MySQLを拡張するMySQLを拡張する
MySQLを拡張する
 
「理論から学ぶデータベース実践入門」読書会スペシャル
「理論から学ぶデータベース実践入門」読書会スペシャル「理論から学ぶデータベース実践入門」読書会スペシャル
「理論から学ぶデータベース実践入門」読書会スペシャル
 
MyNAができるまで
MyNAができるまでMyNAができるまで
MyNAができるまで
 
Crystal
CrystalCrystal
Crystal
 
メールの暗号化
メールの暗号化メールの暗号化
メールの暗号化
 
進捗と品質
進捗と品質進捗と品質
進捗と品質
 
アジャイルジャパン長野サテライト
アジャイルジャパン長野サテライトアジャイルジャパン長野サテライト
アジャイルジャパン長野サテライト
 
🍣=🍺
🍣=🍺🍣=🍺
🍣=🍺
 
Sequelのすすめ
SequelのすすめSequelのすすめ
Sequelのすすめ
 
MySQLのプロトコル解説
MySQLのプロトコル解説MySQLのプロトコル解説
MySQLのプロトコル解説
 

Recently uploaded

TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 

Recently uploaded (9)

TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 

本当はこわいエンコーディングの話