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.6k
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
16
最近の情報収集方法 2025
masutaka
0
94
自分のブログを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
670
Other Decks in Technology
See All in Technology
module Synths; end
asonas
1
120
IoTハンズオンの舞台裏
shirouz
2
160
Nav2、Nav3 ... はたまた自作?〜 作って理解する Nav3 の設計意図 〜 / Nav2, Nav3 ... or Build Your Own? — Understanding Nav3's design intent by building it from scratch
yanzm
0
260
SQL文一行も書けない人事がCortexもろもろを使って人事業務を楽にしてみる
ponponmikankan
0
110
Multica × 長期記憶:40個のミニプロジェクト管理
eiei114
0
190
多層防御と最⼩権限で実現する、安全なAIエージェント設計パターン
lycorptech_jp
PRO
0
210
AndroidでHDRメディアを「壊さずに」扱う
chigichan24
0
410
AI時代におけるプロダクト横断勉強会の設計
zozotech
PRO
0
160
Genie Code ワークショップ 応用編 / Genie-Code-Workshop-advanced
databricksjapan
PRO
0
360
Redmine 7.0で私が開発した新機能の狙いと背景
vividtone
1
110
Bet AI Day 2026丨Agentは、「金融」という巨大産業の何を変えられるのか
layerx
PRO
0
1.1k
Driving AI Adoption Using In-House GPUs to Serve Qwen
po3rin
2
460
Featured
See All Featured
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
320
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.4k
The Mindset for Success: Future Career Progression
greggifford
PRO
0
490
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
200
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
3k
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.4k
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
710
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
690
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
340
Why Our Code Smells
bkeepers
PRO
340
58k
30 Presentation Tips
portentint
PRO
1
390
[SF Ruby Conf 2025] Rails X
palkan
2
1.3k
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^)ʘ ͘͘ձͷ࠷ޙ ͰωλόϨ
ࠓޙͱϚελΧωοτΛ ΑΖ͓͘͠ئ͍͠·͢ɻ