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
ブログを支える技術
Search
Takashi Masuda
February 17, 2017
Technology
4.5k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ブログを支える技術
社内勉強会の発表資料です。
https://tech.feedforce.jp/vue-elasticsearch.html
Takashi Masuda
February 17, 2017
More Decks by Takashi Masuda
See All by Takashi Masuda
マスタカネットの紹介 〜悠久なる変更履歴〜
masutaka
0
13
最近の情報収集方法 2025
masutaka
0
90
自分のブログをCloudFront+HerokuからCloud Runに移行した
masutaka
0
190
BigQuery経由で使うGoogleスプレッドシートのスキーマ管理
masutaka
0
370
本を聴く毎日を送っています
masutaka
0
110
ボッチLookML開発者兼データ整備人を連れてきたよ!
masutaka
0
150
ここがつらいよ普段使いのLinux
masutaka
0
380
4月から取り組んできたLookerの導入から実装までのお話
masutaka
0
190
HerokuでSidekiqを監視する方法を確立した
masutaka
0
660
Other Decks in Technology
See All in Technology
名刺メーカーDevグループ 紹介資料
sansan33
PRO
0
1.2k
Agent 時代の Kaggle 展望 / kaggle-in-the-agentic-era
upura
1
750
ガバメント AI 源内を地方自治体は活用できるのか可能性と課題、期待について
takeda_h
1
410
え?フロントエンドエンジニアの ワイがインフラも!?
puku0x
1
580
システム思考で問題に対処する
yussak
0
290
その“隠したつもり”が命取り ── 自前と平文をやめて「正解」に委ねる
kuroneko13
0
120
【CEDEC2026】『ウマ娘 プリティーダービー』 英語版のキャラクターの方言や口調をローカライズするための創造的アプローチ
cygames
PRO
2
980
第3回しろおびセキュリティスポンサーセッション
log0417
0
200
Goでデータパイプラインを作ろう
sansantech
PRO
1
460
【AG-UI × A2UI × MCP Apps】Generative UIをやさしく解説する
nrinetcom
PRO
1
120
『三匹の子ぶた』から学ぶネットワークセキュリティの昔と今 / Network Security: Then and Now Through the Lens of The Three Little Pigs
nttcom
1
6k
Service Connect 上のサービスに ECS Service の外側から到達できなかった話
ota1022
1
250
Featured
See All Featured
Java REST API Framework Comparison - PWX 2021
mraible
34
9.6k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
630
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
280
Fireside Chat
paigeccino
42
4k
What does AI have to do with Human Rights?
axbom
PRO
1
2.3k
How to Ace a Technical Interview
jacobian
281
24k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2.1k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
A Soul's Torment
seathinner
6
3.4k
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
Transcript
εϥΠυதͷॖURL (goo.gl) Speaker DeckରࡦͰ͢ɻ KeynoteͩͱURL͕ΫϦοΧϒϧʹͳΒͳ͍ͨΊɻ
͋ͷʰ̋̋Λࢧ͑Δٕज़ʱ͔Β10ϲ݄ https://goo.gl/XUlD4p
ύϫʔΞοϓͯ͠ؼͬͯࢀΓ·ͨ͠ʂ
̋̋̋Λࢧ͑Δٕज़ 2017.02.17 ૿ాو࢜(@masutaka) 1.5ഒʂ
̋ϩ̋Λࢧ͑Δٕज़ 2017.02.17 ૿ాو࢜(@masutaka)
̋ϩάΛࢧ͑Δٕज़ 2017.02.17 ૿ాو࢜(@masutaka)
ϒϩάΛࢧ͑Δٕज़ 2017.02.17 ૿ాو࢜(@masutaka)
https://masutaka.net/chalow/
࣮ԋ
None
ࠓճͷݕࡧͷΈ ਓ → search.masutaka.net → nginx → elasticsearch
ͬ͘͟Γઆ໌ • ϑϩϯτΤϯυ͔Βɺmasutaka.netʹ͋Δ ElasticsearchͷAPIΛୟ͍ͯϒϩάهࣄΛݕࡧ • ElasticsearchͷهࣄσʔλσϓϩΠͷͨͼʹ ߋ৽͞ΕΔ • ANDݕࡧͱNOTݕࡧ͚࣮ͩͨ͠
Ϟνϕʔγϣϯ
• ιʔγϟϧPLUSͷސ٬͚ϚχϡΞϧΛ HTMLԽͨ࣌͠ʹɺElasticsearchΛશจݕࡧ Τϯδϯͱͯ͑͠Δ͔ʁͷݕূ • ػೳͱ࣮͢͠͞ • ElasticsearchΛϩάͷՄࢹԽ͚ͩͰͳ ͘ɺશจݕࡧΤϯδϯͱ͍͍ͯͨ͠
ͦͦ ϚελΧωοτͱ https://masutaka.net
https://masutaka.net/chalow/
• ͘͞ΒͷVPS্ͰࣗυϝΠϯΛӡ༻ • ٕज़ϝϞͷެ։ॴ • ֤छٕज़ͷ࣮ݧ • fluentd, Elasticsearch, Kibana,
BigQuery, http2, Mackerel, New Relic, Datadog, Vue.js,…
ߏਤ
σϓϩΠ 1. GitHubͷmasterʹcommit͕Ճ͞ΕΔͱɺ CircleCI͕capistranoΛͬͯࣗಈσϓϩΠ 1. HTMLͷੜͱElasticsearchͷೖ 2. pushoverͰiPhoneʹ௨
• 1ͭͷʮChangeLogϝϞʯϑΝΠϧ͔ΒϒϩάΛੜ • chalowͱ͍͏PerlͷHTMLδΣωϨʔλΛΧελ ϚΠζ • 2001-12-30͔Βॻ͖࢝Ίͨ • 2008-09-25ʹWebαΠτͱͯ͠ެ։ •
2009-05-17͔Βmasutaka.netͱͯ͠Քಇத • 2017-02-17ݱࡏɺ37,268ߦ 1,245هࣄ http://chalow.org
ϚελΧͷChangeLogϝϞʢ࣮ମʣ
ChangeLogϝϞͱ
• Unix Magazine 20021݄߸ʰUnixͷϝϞٕज़ʱͰੈʹΒ ΕΔ • ChangeLogܗࣜΛ࠾༻ͨ͠1ͭͷςΩετϑΝΠϧ • ใ͕1ͭͷϑΝΠϧʹ·ͱ·Δɻϙέοτ1ͭݪଇ •
৽͍͠ϝϞඞͣҰ൪্ʹͳΔͨΊɺཧͷඞཁ͕ͳ ͍ • ςΩετϑΝΠϧͳͷͰɺ͍׳ΕͨΤσΟλͰૉૣ͘ ฤूͰ͖ΔɻকདྷʹͬͯσʔλͷҠߦΛ৺͢Δඞ ཁͳ͍ http://0xcc.net/unimag/1/
ͲͷΑ͏ʹ࣮͔ͨ͠
࠾༻ͨ͠πʔϧ • Vue.js-2.1.10 + axios-0.15.3 • nginx-1.11.3 • Elasticsearch-5.1.1 •
Oga-2.8
JavaScript • ҙ֎ͱΔ͜ͱ͕ଟ͔ͬͨ • FlameworkʢVue.jsʣ • HTTP request with Ajaxʢaxiosʣ
• ݕࡧΫΤϦΈཱͯʢࣗલʣ • Paginationʢࣗલʣ • Routingʢࣗલʣ
• ർΕͨͷͰɺޙURL͚ͩͰࣦྱ͠·͢ • https://masutaka.net/chalow/search.html • https://masutaka.net/chalow/search.js
ElasticsearchͷݕࡧΫΤϦ https://www.elastic.co/guide/en/elasticsearch/reference/5.1/ query-dsl-bool-query.html https://goo.gl/WVxFGo
“ָ͍͠” { "query": { "bool": { "should": [ { "term":
{ "title": "ָ͍͠" } }, { "term": { "body": "ָ͍͠" } } ], "minimum_should_match": 1 } } } OR هࣄλΠτϧ هࣄຊจ
“ָ͍͠ emacs” { "query": { "bool": { "must": [ {
"bool": { "should": [ { "term": { "title": "ָ͍͠" } }, { "term": { "body": "ָ͍͠" } } ], "minimum_should_match": 1 } }, { "bool": { "should": [ { "term": { "title": "emacs" } }, { "term": { "body": "emacs" } } ], "minimum_should_match": 1 } } ] } } } AND
ָ͍͠ -emacs { "query": { "bool": { "must": [ {
"bool": { "should": [ { "term": { "title": "ָ͍͠" } }, { "term": { "body": "ָ͍͠" } } ], "minimum_should_match": 1 } } ], "must_not": [ { "bool": { "should": [ { "term": { "title": "emacs" } }, { "term": { "body": "emacs" } } ], "minimum_should_match": 1 } } ] } } } NOT
nginxͷઃఆ upstream application-elasticsearch { server 0.0.0.0:9200; } server { listen
443 ssl http2; server_name search.masutaka.net; # (snip) location / { add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Headers Content-Type; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $host; proxy_pass http://application-elasticsearch/chalow/article/_search; } } ElasticsearchΛ·Δ͝ͱެ։ ͍ͯ͠ͳ͍͔Βେৎͩ ͱࢥ͏ɻ
kuromoji pluginͷΠϯετʔϧ $ cd /usr/share/elasticsearch $ sudo bin/elasticsearch-plugin install analysis-kuromoji
$ sudo service elasticsearch restart
ςϯϓϨʔτͷೖ $ curl -X PUT 'http://localhost:9200/_template/chalow' -d ' { "template"
: "chalow", "settings": { "index": { "analysis": { "tokenizer": { "kuromoji_user_dict": { "type": "kuromoji_tokenizer", "mode": "search" } } } } }, "mappings": { "article": { "properties": { "title": { "type": "string", "analyzer": "kuromoji", "fielddata": true, "fields": { "keyword": { "type": "keyword" } } }, "body": { "type": "string", "analyzer": "kuromoji", "fielddata": true, "fields": { "keyword": { "type": "keyword" } } } } } } } '
هࣄσʔλͷೖ #!/bin/sh -eu TMP_JSON=chalow-es.json ES_URL=http://localhost:9200 ./script/html2json > $TMP_JSON curl -s
-X DELETE $ES_URL/chalow curl -s -X POST $ES_URL/_bulk --data-binary @$TMP_JSON > /dev/null ※ σϓϩΠ࣌ʹ࣮ߦ͞ΕΔɻ./script/html2jsonOga gemΛͬͯHTMLͳهࣄΛύʔ ε͠ɺElasticsearch Bulk POSTͷͨΊͷjsonΛ࡞Δɻίʔυ https://goo.gl/atnXVm
None
Vue.jsͱͷग़ձ͍ • ReactɺAngularʹͳ͡Ίͳ ͔ͬͨʹखΛࠩ͠৳ ͯ͘ΕͨVue.js - Qiita [^1] • ࢲͨͪͳͥReactͰͳ
͘Vue.jsΛબΜͩͷ͔ | ϓ ϩάϥϛϯά | POSTD [^2] [^1]: https://goo.gl/kNE5If, [^2]: https://goo.gl/bB5Ej5
ྑ͍ͱ͜Ζ • ϋʔυϧͷ͞ • JSͷϏϧυڥΛߏஙͤͣʹ࢝ΊΒΕΔ • jQueryͰࢭ·͍ͬͯΔਓͰϦΞΫςΟϒϓ ϩάϥϛϯάΛ࢝ΊΒΕΔ • ຊޠΨΠυΛ1Εɺಈ͘ͷΛ࡞ΕΔ
https://goo.gl/mkDKpE
Elasticsearchʹอଘͨ͠ͱ͍͏ ͜ͱʁ
KibanaͰՄࢹԽग़དྷΔʂ
࣮ԋ
None
None
ࣗݾຬ͕ಘΒΕ·ͨ͠ɾɾɾʂ
݁ہͷͱ͜ΖɺElasticsearch ݕࡧʹ͑Δʁ
• ֶशίετߴ͍͕ɺݕࡧΤϯδϯͱͯ͠ ༏लͩͱࢥͬͨɻΓKuromoji͕σΧΠ • ॳظઃఆͰͦͦ͑͜͜ΔɻΘ͔ͪॻ͖ ͷνϡʔχϯάඞཁͦ͏ • όοΫΤϯυ͔Β͑ɺΞΫηεݖΛߟ ྀͨ͠ݕࡧͰ͖Δͣ •
ֶशίετߴ͍ͳʔʢΈʣ
ͱ͜ΖͰݕࡧͱ͍͑ʁ
None
Google Custom SearchͰ ࣮ͯ͠Έͨ
None
࣮ԋ
None
Google Custom Search • GoogleͷΤϯδϯΛͬͯɺҙͷαΠτΛݕࡧͰ͖ΔαʔϏε • GCP্͔ΒAPI KEYͱENGINE IDΛൃߦ͢Ε͑Δ •
ແྉͷར༻੍ݶ100 queries/day • https://goo.gl/DgHyop • ࠷ྉۚ100USDʢ20,000 queries/yearʣ • https://goo.gl/wdxEXx
ײ • ͕͢͞ੈք࠷ڧͷϚωʔδυݕࡧαʔϏε • GETϦΫΤετͰ؆୯ʹ͑ͨ • ͋ΕɺݸਓαΠτఔͳΒ͜ͷར༻੍ݶͰେৎ͔ • Elasticsearchͱҧͬͯɺࡉ͔ͳௐͰ͖ͳ͍ •
ϖʔδͷݕࡧίϯςϯπΛࢦఆ͢Δͱ͔
ճސ
͘Β͍͔Βߏ͕ݻ·Γ ࢝ΊΔ
(´-`).oO(Elasticsearch࠷৽ʹ͠ ͓͔ͯ͘)
https://goo.gl/hfXBZe
• ʗ(^o^)ʘ Elasticsearch 3ͷσʔλΛશ ͯϩετ • ʗ(^o^)ʘ ϚΠάϨʔγϣϯΨΠυʹ ै͍·͠ΐ͏ https://goo.gl/VY62Hh
(´-`).oO(SSLূ໌ॻʹ search.masutaka.netͷՃ͕ඞཁͩͳ)
https://goo.gl/liOdYN
• ʗ(^o^)ʘ StartSSL͕ೝূہͱͯ͠ऴΘͬ ͯͨɻ͔͠͠·ͩൢച͍ͯ͠Δͱ͍͏ҋ • ʗ(^o^)ʘ ࣝෆ͔Βແବʹ՝ۚͨ͠ • Let’s EncryptʹҠߦ
(´-`).oO(Vue.jsͷྑ͞ΛΠϯϑ ϥͷਓʹͬͯΒΘͶ)
ʗ(^o^)ʘ ̏िʹͬͯհ 1. հฤ 2. Ajaxฤ 3. jQueryͱͷҧ͍ฤ
(´-`).oO(ٱʑʹ͘͘ձʹ ग़ͯΈΔ͔)
None
• ʗ(^o^)ʘ ։ళ࣌ؒΛա͔͗ͯΒɺ߄ͨ ͩ͘͠ళͷਓ͕͖ͬͯͨɻ൪ͷਓ͕ ৸ʁ • ʗ(^o^)ʘ ॳΊͯߦͬͨίϫʔΩϯάε ϖʔεͩͬͨͷͰɺ͏Ζͨ͑ͨ
(´-`).oO(͘͘ձͷՌΛ ͨͯ͘͠ํ͕ͳ͍)
ʗ(^o^)ʘ ͘͘ձͷ࠷ޙ ͰωλόϨ
ࠓޙͱϚελΧωοτΛ ΑΖ͓͘͠ئ͍͠·͢ɻ