Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Elasticsearch 日本語スキーマレス環境構築と、ついでに多言語対応
Search
Kunihiko Kido
September 16, 2014
Technology
5
7.9k
Elasticsearch 日本語スキーマレス環境構築と、ついでに多言語対応
第6回elasticsearch勉強会「Elasticsearch 日本語スキーマレス環境構築と、ついでに多言語対応」資料
Kunihiko Kido
September 16, 2014
Tweet
Share
More Decks by Kunihiko Kido
See All by Kunihiko Kido
Elasticsearchで作るメディアサイト
kunihikokido
7
2.4k
emo.travel の紹介と Elasticsearch の活用について
kunihikokido
1
2.1k
VELTRA - Elastic{ON} Tour Tokyo 2017
kunihikokido
0
1.6k
Elasticsearch 勉強会 2/2
kunihikokido
1
1.5k
Elasticsearch 勉強会 1/2
kunihikokido
4
5.5k
Developers.IO 2016 C-2 「Elasticsearchで自由自在に検索・分析できるようになるためのヒント」
kunihikokido
7
2.1k
開発効率アップ!Elasticsearch Client Tool 作ってみた
kunihikokido
0
1.7k
はじめての Elasticsearch
kunihikokido
1
1.4k
Other Decks in Technology
See All in Technology
AWSで作るセキュアな認証基盤with OAuth mTLS / Secure Authentication Infrastructure with OAuth mTLS on AWS
kaminashi
0
190
OPENLOGI Company Profile for engineer
hr01
1
24k
Mastraに入門してみた ~AWS CDKを添えて~
tsukuboshi
0
340
Bazel for Ruby (RubyKaigi 2025)
p0deje
0
130
3月のAWSアップデートを5分間でざっくりと!
kubomasataka
0
130
新卒エンジニアがCICDをモダナイズしてみた話
akashi_sn
2
260
React ABC Questions
hirotomoyamada
0
560
Goの組織でバックエンドTypeScriptを採用してどうだったか / How was adopting backend TypeScript in a Golang company
kaminashi
12
8.8k
LiteXとオレオレCPUで作る自作SoC奮闘記
msyksphinz
0
810
アジャイル脅威モデリング#1(脅威モデリングナイト#8)
masakane55
3
240
持続可能なドキュメント運用のリアル: 1年間の成果とこれから
akitok_
1
230
10ヶ月かけてstyled-components v4からv5にアップデートした話
uhyo
5
360
Featured
See All Featured
Building a Modern Day E-commerce SEO Strategy
aleyda
40
7.2k
The Straight Up "How To Draw Better" Workshop
denniskardys
232
140k
Visualization
eitanlees
146
16k
Building Flexible Design Systems
yeseniaperezcruz
329
39k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.2k
BBQ
matthewcrist
88
9.6k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
Building Adaptive Systems
keathley
41
2.5k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
331
21k
Navigating Team Friction
lara
185
15k
GraphQLとの向き合い方2022年版
quramy
46
14k
Fontdeck: Realign not Redesign
paulrobertlloyd
84
5.5k
Transcript
&MBTUJDTFBSDIຊޠεΩʔϚϨ εڥߏஙͱɺ͍ͭͰʹଟݴޠରԠ ୈճ ษڧձ
ࣗݾհ ށࠃ ,6/*)*,0,*%0 ! φϨοδϫʔΫεגࣜձࣾ φϨοδϫʔΫεגࣜձࣾͰݕࡧˍΫϥυࣄۀؔ࿈ͷϚωʔδϝϯτͯ͠·͢ɻ &MBTUJDTFBSDIؔ࿈Ͱɻɻ ϒϩάʮ)FMMP&MBTUJDTFBSDIʯͱ͔ &MBTUJDTFBSDIBTBTFSWJDFʮ4JCB γʔό
ʯͷ اըɾӡӦͯ͠·͢ɻ “Hello! Elasticsearch” “ݕࡧBaaS” ͖ͭͮ8FCͰˠ
Ϛοϐϯάఆٛ ΊΜͲ͘͘͞ͳ͍Ͱ͔͢ʁ Ϛοϐϯάఆٛͱత ͪΐͬͱͨ͠σʔλͰઃܭඞཁͩ͠ɺ ਓʹΑͬͯશવҧ͏ઃܭʹͳͬͪΌ͏͠ɻɻ
Ϛοϐϯάఆٛʹʮతʯ͕͋Δ ㅟ ㅟ Ϛοϐϯάఆٛͱత ͦΕΘ͔Δ͚Ͳɻɻ
Ϛοϐϯάఆٛͱత ̍ ̎ ̏ ̐ ̑ ̒ ద߹Λ ্͍ͨ͠ ࠶ݱΛ
্͍ͨ͠ ਖ਼֬ʹ ߜΓࠐΈ͍ͨ ूܭ͍ͨ͠ ද͍ࣔͨ͠ BOENPSF ͔͠ϑΟʔϧυຖʹɻɻɻ ߟ͑Δ͜ͱ͕͍ͬͺ͍ʂ
Ϛοϐϯάఆٛͱత ̍ ̎ ̏ ̐ ̑ ̒ શҰகͰ ݕࡧɾूܭ͍ͨ͠ ʮʯʮʯʮݝʯ
Λলུͯ͠ݕࡧ͍ͨ͠ ϤϛͰݕࡧ͍ͨ͠ ಓݝίʔυ ॱͰιʔτ͍ͨ͠ ʮؔ౦ʯͳͲ ผ໊Ͱݕࡧɾूܭ͍ͨ͠ BOENPSFʜ ྫ͑ɺಓݝ໊ϑΟʔϧυ̍ͭͱͬͯ
Ϛοϐϯάఆٛͱత ঢ়گʹΑͬͯมԽ͢Δʮతʯ తʹΑͬͯมԽ͢ΔʮϚοϐϯάఆٛʯ Ϛοϐϯάͷઃܭॏཁ͚ͩͲʜ ʮతʯͷมԽΛఆͨ͠ઃܭʮܦݧʯ ݕࡧΤϯδϯͷςΫϊϩδʔͷཧղʮεΩϧʯ ͕ඞཁͬͯ͜ͱͳ͔ʁ ! ຖճઃܭ͢ΔͷΊΜͲ͏ͩ͠ɺٕज़ऀҭͯΔͷେม
Ϛοϐϯάఆٛͱత ຖճϚοϐϯάͷઃܭ͠ͳͯ͘ ಉ͡ઃܭࢥͰࣗಈతʹϚοϐϯάఆ͍ٛͨ͠ʂ ಉ͡ࢥ͍ͷਓ͖ͬͱ͍Δͣʂ ຖճʮFMBTUJDTFBSDINBQQJOHʯͰ άάΔͷݮΒ͍ͨͬ͢͠ɻɻ
Ϛοϐϯάఆٛͱత ͦͷΈ ͢Ͱʹ&MBTUJDTFBSDIʹ͋Γ·͢ʂ
%FNP %FNP
%FNP DELETE /myindex! ! PUT /myindex/mytype/1! ! {! "title": "Elasticsearch
ಛ·ͱΊ",! "description": "Elasticsearch Features — ओʹγεςϜΛத৺ͱͨ͠ಛ·ͱΊ",! "author": "Kunihiko Kido",! "link": "https://medium.com/hello-elasticsearch/elasticsearch-500996e47c70",! "tags": ["Elasticsearch"],! "pubDate": "2014-03-12T11:09"! } ͍ͭ௨Γɺ͜Μͳײ͡Ͱσʔλొ͢Δ͚ͩͰɺ ϑΟʔϧυຖʹඞཁͳϚοϐϯάఆ͕ٛग़དྷ্͕Δ
%FNP {! ...! "title" : {! "type" : "string",! "fields"
: {! "keyword" : {! "type" : "string",! "analyzer" : "keyword_analyzer"! },! "raw" : {! "type" : "string",! "index" : "not_analyzed"! },! "substring" : {! "type" : "string",! "analyzer" : "cjk"! },! "yomi" : {! "type" : "string",! "analyzer" : "katakana"! }! }! }! ...! }! UJUMFϑΟʔϧυͷϚοϐϯάఆٛ ˞ಈతʹ࡞͞ΕͨϚοϐϯάఆٛ
%FNP {! ...! "description" : {! "type" : "string",! "fields"
: {! "substring" : {! "type" : "string",! "analyzer" : "cjk"! }! }! },! ...! } ˞ಈతʹ࡞͞ΕͨϚοϐϯάఆٛ EFTDSJQUJPOϑΟʔϧυͷϚοϐϯάఆٛ
%FNP {! ...! "author" : {! "type" : "string",! "fields"
: {! "keyword" : {! "type" : "string",! "analyzer" : "keyword_analyzer"! },! "raw" : {! "type" : "string",! "index" : "not_analyzed"! },! "substring" : {! "type" : "string",! "analyzer" : "cjk"! },! "yomi" : {! "type" : "string",! "analyzer" : "katakana"! }! }! }! ...! }! BVUIPSϑΟʔϧυͷϚοϐϯάఆٛ ˞ಈతʹ࡞͞ΕͨϚοϐϯάఆٛ
%FNP {! ...! "link" : {! "type" : "string",! "index"
: "not_analyzed",! "fields" : {! "domain" : {! "type" : "string",! "analyzer" : "domain_analyzer"! },! "keyword" : {! "type" : "string",! "analyzer" : "keyword_analyzer"! },! "substring" : {! "type" : "string",! "analyzer" : "standard"! }! }! },! ...! } ˞ಈతʹ࡞͞ΕͨϚοϐϯάఆٛ MJOLϑΟʔϧυͷϚοϐϯάఆٛ
%FNP {! ...! "tags" : {! "type" : "string",! "fields"
: {! "keyword" : {! "type" : "string",! "analyzer" : "keyword_analyzer"! },! "raw" : {! "type" : "string",! "index" : "not_analyzed"! },! "substring" : {! "type" : "string",! "analyzer" : "cjk"! }! }! },! ...! }! ˞ಈతʹ࡞͞ΕͨϚοϐϯάఆٛ UBHTϑΟʔϧυͷϚοϐϯάఆٛ
%FNP ϚοϐϯάఆٛͰ໌ࣔతʹΞφϥΠβʔΛࢦఆ͠ͳ͍ͱ͍͏ҙຯ ㅟ ㅟ ㅟ ㅟ ㅟ TUBOEBSEΛ͏ͱݴ͏ҙຯͰͳ͍ͷͰҙ ଟݴޠରԠʮσϑΥϧτͷΞφϥΠβʔʯΛ͏
PUT /myindex/mytype/1! ! {! "title": "Elasticsearch Overview",! "description": "Elasticsearch Features —
System Overview",! "author": "Kunihiko Kido",! "link": "https://medium.com/hello-elasticsearch/elasticsearch-500996e47c70",! "tags": ["Elasticsearch"],! "pubDate": “2014-03-12T11:09”,! "language": “en",! } %FNP ʮӳޠʯͷจষͱͯ͠ΠϯσοΫε͍ͨ͠߹ ͜Ε͚ͩ
PUT /myindex/mytype/1! ! {! "title": "Elasticsearch ѐਃ",! "description": "Elasticsearch Features —
दझమ ѐਃ",! "author": "Kunihiko Kido",! "link": "https://medium.com/hello-elasticsearch/elasticsearch-500996e47c70",! "tags": ["Elasticsearch"],! "pubDate": “2014-03-12T11:09”,! "language": “ko",! } %FNP ʮؖࠃޠʯͷจষͱͯ͠ΠϯσοΫε͍ͨ͠߹ ͍͕͍ͱ؆୯ʂ
PUT /myindex/mytype/1! ! {! "title": "Elasticsearch Überblick",! "description": "Elasticsearch Features —
Systemübersicht",! "author": "Kunihiko Kido",! "link": "https://medium.com/hello-elasticsearch/elasticsearch-500996e47c70",! "tags": ["Elasticsearch"],! "pubDate": “2014-03-12T11:09”,! "language": “de",! } %FNP ʮυΠπޠʯͷจষͱͯ͠ΠϯσοΫε͍ͨ͠߹ ศར͔ʂ
%FNP ͋ͱɺଞͷϝϯόʔʹ ʮਖ਼֬ʹߜΓࠐΈ͍ͨ࣌ɺ SBXϑΟʔϧυ͏ʯ ͱ͔ɺ ʮݕࡧ࿙ΕΛগͳ͍ͨ͘͠߹ɺ TVCTUSJOH͏ʯ ͱ͔ڞ༗͢Εྑ͍͔ͳʁ
ϧʔϧԽͱద༻ͷࣗಈԽ ϧʔϧԽͱద༻ͷࣗಈԽ
ϧʔϧԽͱద༻ͷࣗಈԽ EZOBNJDUFNQMBUFT ʮϧʔϧԽʯ ϑΟʔϧυ໊ͷύλʔϯܕͷछྨʹΑͬͯ ϑΟʔϧυͷఆٛΛϧʔϧԽ͢ΔΈ JOEFYUFNQMBUF ʮద༻ͷࣗಈԽʯ ΠϯσοΫε࡞࣌ʹద༻͢ΔϧʔϧΛఆٛ ͓͚ͯ͠ΔΈ %FNPͷ༰Λ࣮ݱ͍ͯ͠ΔओͳΈ
EZOBNJDUFNQMBUFT EZOBNJDUFNQMBUFT
EZOBNJDUFNQMBUFT ʲEZOBNJDUFNQMBUFTʳͱ ϑΟʔϧυ໊ͷύλʔϯɾܕຖʹϚοϐϯάఆٛͷς ϯϓϨʔτ༻ҙ͓͚ͯ͠ΔΈ
EZOBNJDUFNQMBUFT {! ...! "dynamic_templates": [! {! "my_field": {! "match": "*",
/* ᶃ ϑΟʔϧυ໊ͷύλʔϯ */! "match_pattern": "regex", /* ᶄ matchͷϚονϯάํࣜ ʢলུՄʣ*/! "match_mapping_type": "string", /* ᶅ JSONϑΥʔϚοτͷλΠϓ */! "mapping": {...} /* ᶆ Ϛοϐϯάఆٛ */! }! },! ...(ෳఆٛͰ͖Δ)! ],! ...! }! ! جຊతͳઃఆ
EZOBNJDUFNQMBUFT {! "url_fields": {! "match": ".*url|.*link",! "match_pattern": "regex",! "match_mapping_type": "string",!
"mapping": {! "type": "string",! "index": "not_analyzed",! "fields": {! "keyword": {! "type": "string",! "analyzer": "keyword_analyzer"! },! "substring": {! "type": "string",! "analyzer": "standard"! },! "domain": {! "type": "string",! "analyzer": "domain_analyzer"! }! }! }! }! }! ྫʣ63-ϑΟʔϧυ͚
EZOBNJDUFNQMBUFT {! "special_string_fields": {! "match": ".*title.*|.*name.*|.*author.*",! "match_pattern": "regex",! "match_mapping_type": "string",!
"mapping": {! "type": "string",! "fields": {! "raw": {! "type": "string",! "index": "not_analyzed"! },! "keyword": {! "type": "string",! "analyzer": "keyword_analyzer"! },! "substring": {! "type": "string",! "analyzer": "ja-substring"! },! "yomi": {! "type": "string",! "analyzer": "katakana"! }! }! }! }! } ྫʣ໊শॏཁͳϑΟʔϧυ
EZOBNJDUFNQMBUFT {! "long_string_fields": {! "match": ".*message.*|.*content.*|.*description.*| .*text.*|.*body.*|.*note.*|.*memo.*",! "match_pattern": "regex",! "match_mapping_type":
"string",! "mapping": {! "type": "string",! "fields": {! "substring": {! "type": "string",! "analyzer": "ja-substring"! }! }! }! }! } ྫʣจϑΟʔϧυ
EZOBNJDUFNQMBUFT {! "short_string_fields": {! "match": "*",! "match_mapping_type": "string",! "mapping": {!
"type": "string",! "fields": {! "raw": {! "type": "string",! "index": "not_analyzed"! },! "keyword": {! "type": "string",! "analyzer": "keyword_analyzer"! },! "substring": {! "type": "string",! "analyzer": "ja-substring"! }! }! }! }! } ྫʣͦͷଞϑΟʔϧυ
EZOBNJDUFNQMBUFT {! ...! "dynamic_templates": [! {! “url_field": {…}! },! {!
"special_string_fields": {…}! },! {! "long_string_fields": {…}! },! {! "short_string_fields": {…}! },! ],! ...! } ࠷ॳʹύλʔϯʹϚονͨ͠Ϛο ϐϯά͕ఆٛ͞ΕΔ
JOEFYUFNQMBUF JOEFYUFNQMBUF
JOEFYUFNQMBUF ʲJOEFYUFNQMBUFʳͱʁ ΠϯσοΫε໊ͷύλʔϯຖʹΠϯσοΫεఆٛͷς ϯϓϨʔτΛ༻ҙ͓͚ͯ͠ΔΈ
JOEFYUFNQMBUF DPOpHUFNQMBUFTԼʹอଘ͢Δ͚ͩͰ४උ0, ˝FMBTUJDTFBSDI ˝DPOpH ˝UFNQMBUFT CBTFKTPO DVTUPN@BOBMZ[FSTKTPO KBQBOFTF@BOBMZ[FSTKTPO MBOHVBHF@BOBMZ[FSTKTPO TUSJOH@pFMETKTPO
%FNPͰ͍ͬͯΔJOEFY UFNQMBUFϑΝΠϧͨͪ ˡ ɾϊʔυͷ࠶ىಈඞཁͳ͍ ɾ৽نͰ࡞ͨ͠ΠϯσοΫεͷΈʹద༻͞ΕΔ ɾςϯϓϨʔτෳ࡞ΕΔ ɾ"1*ͰઃఆͰ͖Δ ɾEZOBNJDUFNQMBUFTͷఆؚٛΊΒΕΔ
JOEFYUFNQMBUF {! "my_template":{ /* ςϯϓϨʔτͷ໊લ */! "template": "*", /* ςϯϓϨʔτΛద༻͢ΔΠϯσΫε໊ͷύλʔϯ
*/! "order": 0, /* ςϯϓϨʔτΛద༻͢Δ༏ઌॱҐ */! "settings": {...}, /* γϟʔυͷͱ͔ɺAnalysis ͷઃఆΠϯσοΫεఆٛʹؔΘΔઃఆ */! "mappings": {...} /* Ϛοϐϯάఆٛͷઃఆɻdynamic templates͜͜Ͱઃఆ */! . . .! }! }! ! ! ! ! ! ϑΝΠϧ໊ͱςϯϓϨʔτ໊ͱΓ͋͑ͣಉ͡ʹ͓͚ͯ͠ྑ͍͔ͳʁ جຊతͳઃఆ
JOEFYUFNQMBUF {! "base": {! "template": "*",! "order": 1,! "mappings": {!
"_default_": {! "_timestamp" : {! "enabled" : true,! "store" : true! },! "_analyzer": {! "path": "language"! },! "_id": {! "path": "id"! },! "_source": {! "excludes" : ["attachment_file"]! }! }! }! }! }! UFNQMBUFTCBTFKTPO σϑΥϧτͷΞφϥΠβʔมߋ͢ΔͨΊͷMBOHVBHFϑΟʔϧυͷఆٛͳͲ
JOEFYUFNQMBUF {! "language_analyzers": {! "template": "*",! "order": 2,! "settings": {!
"analysis": {! "filter": {! "arabic_stop": {! "type": "stop",! "stopwords": "_arabic_"! },! "arabic_stemmer": {! "type": "stemmer",! "language": "arabic"! },! "armenian_stop": {! "type": "stop",! "stopwords": "_armenian_"! },! "armenian_stemmer": {! "type": "stemmer",! "language": "armenian"! },! "basque_stop": {! "type": "stop",! "stopwords": "_basque_"! },! "basque_stemmer": {! "type": "stemmer",! "language": "basque"! },! "brazilian_stop": {! "type": "stop",! "stopwords": "_brazilian_"! },! "brazilian_stemmer": {! "type": "stemmer",! "language": "brazilian"! },! "bulgarian_stop": {! "type": "stop",! "stopwords": "_bulgarian_"! },! "bulgarian_stemmer": {! "type": "stemmer",! "language": "bulgarian"! },! "catalan_elision": {! UFNQMBUFTMBOHVBHF@BOBMZ[FSTKTPO ֤ࠃݴޠຖͷϑΟϧλʔΞφϥΠβʔͷఆٛͳͲ
JOEFYUFNQMBUF {! "japanese_analyzers": {! "template": "*",! "order": 2,! "settings": {!
"analysis": {! "char_filter": {! "japanese_normalization": {! "type": "kuromoji_iteration_mark",! "normalize_kanji": true,! "normalize_kana": true! }! },! "filter": {! "romaji_readingform": {! "type": "kuromoji_readingform",! "use_romaji": true! },! "katakana_readingform": {! "type": "kuromoji_readingform",! "use_romaji": false! },! "katakana_stemmer": {! "type": "kuromoji_stemmer",! "minimum_length": 4! },! "japanese_stop": {! "type": "kuromoji_part_of_speech"! }! },! "tokenizer": {! "japanese_tokenizer": {! "type": "kuromoji_tokenizer",! "mode": "search"! }! },! "analyzer": {! "default": {! "alias": ["japanese", "ja"],! "type": "custom",! "char_filter": [! "html_strip",! "japanese_normalization"! ],! "tokenizer": "japanese_tokenizer",! "filter": [! "cjk_width",! "lowercase",! UFNQMBUFTKBQBOFTF@BOBMZ[FSTKTPO ຊޠؔ࿈ͷϑΟϧλʔΞφϥΠβʔͷఆٛͳͲ
JOEFYUFNQMBUF {! "custom_analyzers": {! "template": "*",! "order": 2,! "settings": {!
"analysis": {! "filter": {! "domain_extractor" : {! "type" : "pattern_replace",! "preserve_original": false,! "pattern" : "https?://([^/]+).*",! "replacement": "$1"! }! },! "tokenizer": {! "comma_tokenizer": {! "type": "pattern",! "pattern":"[,ɺ]+"! }! },! "analyzer": {! "domain_analyzer" : {! "alias": ["domain"],! "tokenizer" : "uax_url_email",! "filter" : [ "domain_extractor", "lowercase", "unique" ]! },! "comma_analyzer":{! "alias": ["comma"],! "type": "custom",! "tokenizer": "comma_tokenizer",! "filter": ["cjk_width", "lowercase", "trim", "unique"]! },! "keyword_analyzer": {! "type": "custom",! "tokenizer": "keyword",! "filter": ["cjk_width", "lowercase", "trim"]! }! }! }! }! }! } UFNQMBUFTDVTUPN@BOBMZ[FSTKTPO 63-͔ΒυϝΠϯ໊Λநग़ͨ͠Γݴޠʹґଘ͠ͳ͍ΞφϥΠβʔͷఆٛ
JOEFYUFNQMBUF {! "string_fields": {! "template": "*",! "order": 10,! "mappings": {!
"_default_": {! "dynamic_templates": [! {! "not_analyzed_fields": {! "match": "method|charSet|mimeType| content_type|language",! "match_pattern": "regex",! "match_mapping_type": "string",! "mapping": {! "type": "string",! "index": "not_analyzed"! }! }! },! {! "url_fields": {! "match": ".*url|.*link",! "match_pattern": "regex",! "match_mapping_type": "string",! "mapping": {! "type": "string",! "index": "not_analyzed",! "fields": {! "keyword": {! "type": "string",! "analyzer": "keyword_analyzer"! },! "substring": {! "type": "string",! "analyzer": "standard"! },! "domain": {! "type": "string",! "analyzer": "domain_analyzer"! }! }! }! }! },! {! "comma_separated_fields": {! "match": "meta_keywords",! "match_pattern": "regex",! "match_mapping_type": "string",! "mapping": {! UFNQMBUFTTUSJOH@pFMETKTPO TUSJOHܕϑΟʔϧυͷμΠφϛοΫςϯϓϨʔτఆٛ
JOEFYUFNQMBUF ˝ΠϯσοΫε࡞ TFUUJOHTཁૉͷద༻ ˝λΠϓͷ࡞ NBQQJOHTཁૉͷద༻ ˝ϑΟʔϧυσʔλͷՃ EZOBNJDUFNQMBUFTͷద༻ γϟʔυͷઃఆͱ͔"OBMZTJTͷఆٛ ͳͲ͜ͷλΠϛϯάͰద༻ɻ ݻఆͷϑΟʔϧυͷఆٛͳͲ͜ͷλ
ΠϛϯάͰద༻ɻ EZOBNJDUFNQMBUFTͷఆٛ͜ͷλΠ ϛϯάͰద༻ɻ ˡ ˡ ˡ ద༻ͷྲྀΕ ✔️ ✔️ ✔️
JOEFYUFNQMBUF ͞Βʹ ΠϨΪϡϥʔͳରԠͰ͖Δ ॊೈੑ݉Ͷඋ͑ͯ·͢ʂ ㅟ ㅟ ㅟ ͓͓ɺͦΕಋೖ͍͢͠ɻ
JOEFYUFNQMBUF ˝ΠϯσοΫε࡞ TFUUJOHTཁૉͷద༻ NBQQJOHTཁૉͷద༻ ˝ϑΟʔϧυσʔλͷՃ EZOBNJDUFNQMBUFTͷద༻ ΠϨΪϡϥʔͳରԠ͍ͨ͠߹ ✔️ ✔️ ✔️
ରͷϑΟʔϧυఆ͕ٛଘࡏ͠ͳ͍ ㅟ ㅟ ㅟ ㅟ ㅟ ㅟ ߹ɺEZOBNJDUFNQMBUFTͷఆٛ͜ͷ ㅟ λΠϛϯάͰద༻ɻ ˡ ΠϨΪϡϥʔͳϚοϐϯάఆٛΛ͍ͨ͠ ߹͜ͷλΠϛϯάͰఆٛ͢Ε0, ˝λΠϓͷ࡞
࠷ޙʹ ࠷ޙʹ
࠷ޙʹ ͜ΕͰ୭Ͱ؆୯ʹ &MBTUJDTFBSDIΛ͍͜ͳͤΔʂ ʜͨͿΜɺ͓ͦΒ͘ɺ͖ͬͱ ! ˞%FNPͷΈ4JCB IUUQTJCBUPLZP ʹಋೖ͍ͯ͠·͢ɻ ڵຯͷ͋ΔํɺͥͻΞΧϯτొͯ͠ಈ࡞Λ֬ೝͯ͠Έ͍ͯͩ͘͞ɻ վળͷཁɺ!·Ͱ͓͖͕Δʹʂ
࠷ޙʹ ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠
φϨοδϫʔΫε͔Β େͳ͓Βͤ
ʮୈճ&MBTUJDTFBSDIษڧձʯࢀՃऀݶఆ 4JCBͷແྉΛ υΩϡϝϯτʹ֦େ͠·͢ʂ Ξϯέʔτʹ͝ڠྗ͍ͩ͘͞ɻ ˞Ξϯέʔτʹ͝ճ͍͔ͨͩͳͯ͘4JCB͍͍ͨʂͱݴ͏߹0, ! ! ͥͻ͜ͷػձʹ4JCBΛͬͯΈ͍ͯͩ͘͞N @@ N
http://siba.tokyo