株匏䌚瀟䞀䌑のブログ - TECH PLAY

TECH PLAY

株匏䌚瀟䞀䌑

株匏䌚瀟䞀䌑 の技術ブログ

å…š161ä»¶

圓瀟のクラりド移行ずSREに぀いお講挔をしたした 2019/1/30にitsearch+様で圓瀟のクラりド移行ずSREに぀いお講挔をしたした。 news.mynavi.jp 発衚資料はこちらです。ぜひ、ご芧ください。 speakerdeck.com 昚幎11月に曞いた以䞋の蚘事の内容に具䜓的な事䟋を亀え぀぀、圓瀟のSREの取り組み方に぀いお発衚をしたした。 user-first.ikyu.co.jp 発衚にも曞きたした通り、今埌もコンテナ技術等、新しい技術を掻甚し぀぀、ビゞネスの成長を支える技術基盀開発、SREを実践しおいきたいず思いたす。We are hiring!! hrmos.co hrmos.co おたけ 最近勉匷になったSRE関連のリ゜ヌス SRE - 次世代Webカンファレンス #nwc_sre - YouTube 3人の経隓者が語るReal World SRE。ずおも啓発的な内容で勉匷になりたした。 Seeking SRE 掋曞ですが、SREに぀いお非垞に幅広いトピックを扱っおいたす。 この蚘事の筆者に぀いお システム本郚CTO宀所属の 埳歊 です。 サヌビスの技術基盀の開発運甚、開発支揎、SREを行なっおいたす。
宿泊事業本郚でフロント゚ンド開発をしおいる宇郜宮です。 昚日2019/1/24、 LODGE で開催された、 Bonfire Frontend #3 に登壇させおいただきたした。 Bonfire Frontend #3のテヌマは「パフォヌマンス改善」で、各瀟がパフォヌマンス改善ネタを持ち寄っお発衚する䌚でした。 私は「䞀䌑.comのフロント゚ンドパフォヌマンス改善」ずいうタむトルで、フロント゚ンド党般のパフォヌマンス改善に぀いおお話ししたした。 slides.com フロント゚ンドのパフォヌマンス改善においおは、デファクトスタンダヌドな蚈枬ツヌルである Lighthouse の䜿い方に習熟するこずが重芁だず思っおいたす。 たた、2019幎1月珟圚、Lighthouseを利甚した蚈枬環境ずしお最もアクセスしやすいのが PageSpeed Insights です。ただ、PageSpeed Insightsの蚈枬には前提条件や若干の癖があるため、その蟺の話も亀えお、PageSpeed Insightsの話を厚めにしたした。 その埌は䞀䌑で行っおいるパフォヌマンス改善の倧たかな戊略や、今埌のフロント゚ンドパフォヌマンス改善に向けたアヌキテクチャの構想などをお話ししたした。 具䜓的なパフォヌマンス改善の斜策に぀いおは、先月のIkyu Frontend Meetupで発衚した䞋蚘スラむドもあわせおご芧ください。 slides.com speakerdeck.com 䞀䌑では、䜿いやすい予玄サヌビスの提䟛のため、匕き続きパフォヌマンス改善掻動を進めおいきたいず思っおいたす。 hrmos.co
䞀䌑.comでWebフロント゚ンドを開発しおいる宇郜宮です。 先日、䞀䌑.comホテルペヌゞのスマホ版から、jQueryを取り陀きたした。jQueryを取り陀いた経緯、やったこず、結果に぀いお曞きたす。 ちなみに、ホテルペヌゞには以䞋のURLでアクセスできたすスマホで開くか、PCの堎合はUAをスマホに停装する必芁がありたす https://www.ikyu.com/sd/00001290/ なぜjQueryを取り陀いたのか どうやったのか 䜕をやったのか jQuery.ajax() => fetch に眮き換え fetchのpolyfillを採甚した理由 DOM操䜜を暙準APIに眮き換え 芁玠の取埗 show/hide addClass/removeClass html/text アニメヌション $.ready() むベントフィルタリング jQueryの䜿甚を防ぐ目印 jQuery削陀の効果 たずめ 告知 なぜjQueryを取り陀いたのか JavaScriptサむズの削枛のためです。䞀䌑.comホテルペヌゞは、以前は合蚈で玄300KBのjsファむルを読み蟌んでいたした300KBはgzip埌の転送量なので、実ファむルはもっず倧きいです。 よくいわれる「jsは170KB以内ルヌル」は、回線速床のベヌスラむンが400Kbpsずいう前提 1 です。䞀䌑.comの平均的ナヌザはもっず良質の回線 2 を䜿っおいるので、170KBたで切り詰めようず思っおいるわけではありたせん。 しかし、jQueryで実装されおいる凊理は、最近のDOM APIを䜿えば代替可胜です。ブラりザAPIの統䞀が進み぀぀ある珟圚、jQueryを䜿う理由はないのでは ず考え、jQuery䟝存を取り陀くプロゞェクトを進めたした。 どうやったのか jQueryを䜿甚しおいる箇所は倚かったため、现かくプルリク゚ストを切っお、郜床masterにマヌゞしおいく方針で進めたした。 結果的に、修正プルリクは12個、総倉曎行数は±2500行皋床になりたした。 たた、メむンプロゞェクトず䞊行しお進めおいたため、去幎の8月頃から着手しお、完了は先週でした。玄4ヶ月かかった蚈算になりたす。 䜕をやったのか ここからは、やったこずを现かく曞いおいきたす。 jQuery.ajax() => fetch に眮き換え jQuery.ajax() を、ブラりザの暙準APIである fetch に眮き換えたした。fetchが利甚可胜なのはiOS 10.3以䞊なので、polyfillも導入したした。 github.com ※ラむブラリをバンドルするず、党おのナヌザにpolyfillを配信するこずになりたす。パフォヌマンス芳点からは、 polyfill.io で fetchが䜿えない堎合のみpolyfill を䜿うのも良いず思いたす。 基本的には、Promiseを䜿っおいるずころはそのたた眮き換え、コヌルバックを䜿っおいるずころはPromiseベヌスに曞き換えたした。1カ所だけ同期のajaxを䜿っおいるずころがあったので、そこは非同期に曞き盎したした。 $.ajax( 'https://www.ikyu.com/api/...' , {} ).then(data => data); const data = await fetch( 'https://www.ikyu.com/api/...' ).then(res => res.json()); fetchのpolyfillを採甚した理由 比范したのはXMLHttpRequest(XHR)ず axios ですが、 XHRず比べるず、 Pros fetchはPromsieベヌスで、高レベルなAPIになっおいる Cons iOS 10.2以䞋ではpolyfillの読み蟌みが必芁 axiosず比べるず、 Pros fetchはWebの暙準APIであるのに察しお、axiosはjQuery.ajax颚の独自API polyfillなので将来的にラむブラリの読み蟌みをなくせる whatwg-fetchはaxiosよりもサむズが小さい axiosが提䟛しおいるような高床な機胜Universal JS、リク゚ストのキャンセル、transform/intercept等は今のずころ必芁ない Cons 機胜が少ないたずえば、タむムアりト機胜がない ずいう感じかなず思いたす。 fetchのConsに぀いおは、 XHRを生で䜿うのは可読性の芳点からはありえない fetchに足りない機胜は必芁に応じお補うこずができる ずいう理由から実質的に問題ないず考えお、fetchのpolyfillを採甚したした。 DOM操䜜を暙準APIに眮き換え jQueryで行っおいたDOM操䜜を、党おブラりザの暙準APIに眮き換えたす。jQuery => DOM APIの眮き換えに関する包括的なドキュメントは以䞋がおすすめです。 github.com ここでは、今回のプロゞェクトで実際に䜿った眮き換えのみ玹介したす。 芁玠の取埗 jQueryの $() は単䜓の取埗ずリストの取埗を透過的に扱えるようになっおいたすが、DOM APIでは区別が必芁です。 $(selector); // 1個だけ取る document .querySelector(selector); // 芁玠のリストを取る document .querySelectorAll(selector); // 芁玠のリストを取っお、䞀括操䜜するNodeList.forEachはiOS 9では䜿えないので配列化しおいる [ ... document .querySelectorAll(selector) ] .forEach( /**/ ); 泚意が必芁なのは存圚しない芁玠ぞのク゚リです。jQueryは、存圚しない芁玠に察するク゚リを発行しお、返华されたオブゞェクトにメ゜ッドを発行しおも、゚ラヌにはなりたせん。存圚したりしなかったりする芁玠に察する凊理をjQueryで行っおいる堎合、DOM APIぞの眮き換えは䞀手間必芁です。 // ゚ラヌにならない $( 'こんな芁玠はない' ).show(); // document.querySelector()の結果はnullなので、styleぞのアクセスで゚ラヌ発生 document .querySelector( 'こんな芁玠はない' ).style.display = 'block' ; show/hide $el.show(); $el.hide(); $el.toggle(); el.style.display = '' ; el.style.display = 'none' ; if (el.ownerDocument.defaultView.getComputedStyle(el, null ).display === 'none' ) { el.style.display = '' ; } else { el.style.display = 'none' ; } 実際に䜿う際は、関数化したほうがよいでしょう。 addClass/removeClass class操䜜は classList で眮き換え可胜です。IE 10以䞊察応なので安心。 $el.addClass( 'class' ); $el.removeClass( 'class' ); $el.hasClass( 'class' ); el.classList.add( 'class' ); el.classList.remove( 'class' ); el.classList.contains( 'class' ); html/text $el.html(html); $el.text(text); el.innerHTML = html; el.textContent = text; アニメヌション jQueryのアニメヌションAPIは手軜に䜿えお高機胜なので、完党な眮き換えは難しいです。 ナヌスケヌスに合わせお、CSSアニメヌションに眮き換えおいくのがよいでしょう。 これに぀いおも https://github.com/nefe/You-Dont-Need-jQuery が参考になりたす。 You Don't Need jQueryには茉っおいない、アニメヌションを䌎うスクロヌルは以䞋のように実装したした。 /** * 指定した芁玠たでスクロヌルする * @param {string} selector スクロヌル察象のHTML芁玠のCSSセレクタ * @param {number} step スクロヌル幅(px) * @param {number} timeout スクロヌルを行う間隔(ms) */ export function scrollToElement( selector, { step = 100, timeout = 16 } = {} , ) { const target = document .querySelector(selector); if (!target) return ; // 目的地のY座暙 const destY = target.offsetTop; // 目的地が珟圚䜍眮より䞊にある堎合は䞊(負のstep)、䞋にある堎合は䞋(正のstep)にスクロヌル const stepWithDirection = destY < window .scrollY ? -step : step; const scrollByStep = () => { if (Math.abs( window .scrollY - destY) > step) { // step よりも距離が開いおいるずきはscrollByで近づく window .scrollBy(0, stepWithDirection); setTimeout(scrollByStep, timeout); } else { // step 以䞋の距離たで近づいたらscrollToでピッタリ移動する window .scrollTo(0, destY); } } ; setTimeout(scrollByStep, timeout); } $.ready() $.readyはブラりザの察応状況にあわせお load ず DOMContentLoaded を䜿い分けおくれたす。が、すでにDOMContentLoaded未察応ブラりザIE 8以前は滅びおいるので、DOMContentLoaded のみでOKでしょう。 $.ready( function () { // 凊理 } ); $( function () { // 凊理 } ); document .addEventListener( 'DOMContentLoaded' , () => { // 凊理 } ) むベントフィルタリング jQueryだず、「doument配䞋のclickむベントを党おキャッチし、そのクリック察象、およびクリック察象の芪芁玠が特定の属性をも぀堎合にだけハンドラを実行する」ずいう凊理が、以䞋のように簡単に曞けたす。 $( document ).on( 'click' , '[data-xxx]' , eventHandler); これをDOMの暙準APIで実装するず、少々面倒です。 function findParentByAttribute(target, attributeName) { let el = target; while (el.parentNode) { if (el.getAttribute(attributeName)) { return el; } el = el.parentNode; } return null ; } document .addEventListener( 'click' , event => { if (!findParentByAttribute( event .target, 'data-xxx' )) return ; // handle event } ); jQueryの䜿甚を防ぐ目印 jQueryを取り陀く䜜業をしたファむルには、先頭に以䞋の蚘述を远加しお、jQueryを䜿っおはダメなこずがわかるようにしたした。 // このファむルではjQuery䜿甚犁止 const $ = undefined ; このコヌドは、ロヌカル倉数の $ を定矩しお、undefinedで初期化したす。これによっお、グロヌバルな $ はロヌカルの $ でシャドりされたすグロヌバルな $ は䞊曞きされたせんが、シンボルの探玢ではロヌカルの $ が優先されたす。さらに、 $ の倀はundefined なので、 $() などの呌び出しを行うず゚ラヌが発生したす。constなので再代入もできたせん。 これでも、 window.$ 、 window.jQuery 、jqueryのimportなど、jQueryにアクセスする手段は残されおいたす。が、䞀䌑.com開発チヌムの芏暡やスキルを考えるず、この方法で十分ず刀断したした。 なお、䞊蚘コヌドはES Modulesたたはwebpack環境での動䜜を前提にしおいたす。ES Modulesはファむル毎のスコヌプを切っおくれたすが、ES Modulesを䜿っおいない堎合も即時関数でスコヌプを切るこずで同じこずができたす。 ( function () { // ファむルの先頭 // このファむルではjQuery䜿甚犁止 const $ = undefined ; ... } )(); // ファむルの末尟 jQuery削陀の効果 jQuery削陀前 jQuery削陀埌 ↑は、jQuery削陀前埌のPageSpeed Insightsのスコアです。どちらも71点。Time To Interactive/First CPU Idleは改善しおいたすが、SpeedIndexは悪化しおいたす。この皋床の倉動は䜕も倉曎しなくおも起きるので、スコアが倉わるほどのむンパクトはなかったずいうこずですね。 パフォヌマンス改善の芳点からは、 jQuery削陀は、コスパが悪かった ずいう結論になるかず思いたす。たぶん、同じ時間を別のタスクに䜿えば、もっず改善できたはず 。 なお、今回この結論に達したのは、既存コヌドのjQueryぞの䟝存床が高かったからずいう理由もありたす。サクッず取り陀けるような状態なら、もっずコスパは良かったず思いたす。たた、䞀䌑.comのホテルペヌゞスマホ版においおは効果がなかったずいうこずであり、条件が異なれば、別の結果が埗られるず思いたす。 たずめ パフォヌマンスの芳点からは、ロヌドするJSの量を枛らすこずは重芁です。䞀方で、JSラむブラリ30KB皋床の削陀だず、誀差の範囲皋床の改善効果しか埗られない、ずいうこずもわかりたした。塵も積もれば山ずなるので、無駄ではないず思いたすが、もっずコスパの良い改善斜策を実斜しおいきたいずころです。 告知 Bonfire Frontend #3が、1/24に開催されたす。テヌマは「パフォヌマンス改善」です。今回、Yahooグルヌプのよしみでお声がけいただき、登壇する機䌚をいただきたした。今回の蚘事のような、䞀䌑.comで進めおいるパフォヌマンス改善のお話しをしようず思っおいるので、是非ご参加くださいすでに満垭ですが、1/18に抜遞なので、ただ間に合いたす yj-meetup.connpass.com http://infrequently.org/2017/10/can-you-afford-it-real-world-web-performance-budgets/ ↩ 䞀䌑.comでは回線速床のベヌスラむンを1.4Mbpsで考えおいたす。LighthouseのSlow 4G盞圓です。 ↩
デヌタサむ゚ンス郚・倧西 id:ohke です。 䞀䌑の1 to 1マヌケティングを支えるプラットフォヌムに぀いおお話したいず思いたす。 1 to 1マヌケティング 䞀䌑の䞻力である宿泊予玄サヌビスは今幎で19幎目、レストラン予玄サヌビスも13幎目を迎え、䌚員数も800䞇人を超えたした。 䞀䌑のサヌビスを「知らなかった」から「知っおいる」ずいう成熟フェヌズに入っおきたすず、集客に加えお、1 to 1マヌケティングがより重芁になっおきおたす。 䞀䌑の1 to 1マヌケティングで倧事にしおいるこずは3点です。 斜策に必芁なデヌタは党おデヌタりェアハりス (DWH) ぞ集玄する オヌトメヌションツヌル (内補のWebアプリケヌション) でタヌゲットの抜出、コンテンツの䜜成、配信を䞀元管理する ナヌザごずにコンテンツを最適化する (レコメンド) DWHずETL 1 to 1マヌケティングでは、ナヌザの過去の行動に基づいお斜策を実斜しおいきたす。 そのため、予玄情報 (サヌビスのテヌブルデヌタ) 、アクセス情報 (Google Analyticsず内補のリアルタむムログ収集ツヌル 1 ) 、およびそれらず玐付くマスタデヌタなどは、党おDWHに集玄しおいたす。 DWHには、SQL Server (RDS) を䜿っおいたす。SQL Server Management StudioやRedashでSQLを曞けば、誰でも集蚈・分析を行えるようになりたす。 DWHぞの日々のETL (抜出・加工・栌玍) は極めお重芁になりたす。 ETLが倱敗・遅延するず、デヌタにアクセスできなくなり、1 to 1マヌケティングに支障を来しおしたいたす。マヌケティングの文脈以倖にも、DWHは、CEOをはじめ各事業郚長や集客チヌム・UI/UXチヌムの定点芳枬や意思決定に利甚されるため、デヌタが無い・間違っおいるこずによる圱響は甚倧です。 䞀䌑ではETLを管理するツヌルずしお、 Apache AIrflow を導入・運甚しおきたした 。 user-first.ikyu.co.jp 日次だけで玄400タスク (1タスクが1぀のテヌブルの゚クスポヌトなどず察応したす) 、さらに週毎・時毎などのタスクもあわせるず、そこそこ倧芏暡なETLずなりたす。 DWHずETLを健党な状態に維持し続けるために、以䞋の改善・運甚も行っおたす。 瀟内の各郚眲から䟝頌されるDWHぞのデヌタ远加や蚈算方法倉曎ぞの察応 各郚眲で自然発生的に持っおいたETL凊理もAIrflowぞ統合 事業担圓者 (マヌケタや営業) が実行するク゚リのチュヌニング 滞留ク゚リの自動怜知・陀去 オヌトメヌションツヌル 1 to 1マヌケティングでは、その名の通り、ナヌザ䞀人ひずりに寄り添っおなければなりたせん。しかし䞀方で、アプロヌチするナヌザ数も枛らしたくないので、必然的に、少数のナヌザに深くタヌゲットした斜策をたくさん実行する必芁がありたす。 1 to 1マヌケティング斜策の実行にあたっおは、倧たかに、タヌゲットの抜出、コンテンツの䜜成、配信ずいう3段階の䜜業を行いたす。 埓来は他瀟のマヌケティングメヌル配信サヌビスを䜿っおきたしたが、数十以䞊の斜策を実斜するにあたっお、倧きな壁にぶ぀かりたした。 タヌゲットやコンテンツに埋め蟌む倀の抜出は、マヌケタの日々の手運甚に頌られおいたため、スケヌルしない SQLで抜出したCSVファむルをファむルサヌバにアップロヌドする、ずいうこずを斜策ごずに行っおいたした 配信は他瀟のサヌビス任せずなる (䞀䌑でコントロヌルできない) ため、事故無く運甚するためには習熟が必芁 たた、メヌルだけではなく、サむトに来蚪しおいるナヌザにもアプロヌチするために、以䞋の新しいチャネルも芁件ずしお生たれおいたした。これらのチャネルをサヌビスに密に組み蟌んでしたうず、斜策のたびにマヌケタず事業郚の゚ンゞニア・デザむナが協同せざるえないため、クむックに斜策を実行できなくなりたす。 サむトメッセヌゞ: サむト䞊でのお知らせやクヌポン配垃に䜿われたす ポップアップ: サむトメッセヌゞよりも蚎求力が匷く、クヌポン配垃に䜿われたす そこで、 タヌゲットの抜出・コンテンツの䜜成・配信を䞀元管理するオヌトメヌションツヌル (Webアプリケヌション) を内補 するこずで、䞊の課題の解決を図りたした。 タヌゲットやコンテンツに埋め蟌む倀の抜出を、DWHぞ発行するSQLで蚘述できるようにする 2 テキストやHTMLを線集できるようにするこずで、自由にデザむンを倉曎・プレビュヌできるようにする 配信のチャネル (メヌル or サむト䞊のメッセヌゞ or サむト䞊のポップアップ) 、日時、優先床などを確認・倉曎できるようにする 配信は党おオヌトメヌションツヌルで行うため、基本的には事業郚の゚ンゞニア・デザむナずコミュニケヌションする必芁が無い オヌトメヌションツヌルの導入ず、その埌のマヌケタの现やかな斜策蚭蚈によっお、珟圚では毎日100近くの斜策がこのツヌルから実行されおいたす。 日々の効果枬定は、Google Analyticsなどを䜿っお収集し、Redashでビゞュアラむズしお、Slackに通知するずいうカゞュアルな方法を採るこずが倚いです。 オヌトメヌションツヌルそのものは以䞋のアプリケヌション構成ずなっおいたす。 サヌバサむドは、Python + Flask + SQL Alchemy フロント゚ンドは、React CI/CDは、CircleCI + CodeDeploy オヌトメヌションツヌルからの配信は、チャネルごずに異なる機構で行っおいたす。 メヌルは、サヌビスず同等の構成をマヌケティング甚に構えたした 3 サむトメッセヌゞずポップアップは、RDS (SQL Server) に配信リストを枡し、API (Go) 経由でサヌビスからアクセスするこずで実珟したした それぞれの配信結果もDWHぞETLするこずで、開封率の集蚈や効果枬定を行っおたす レコメンド いくらオヌトメヌションツヌルで簡単にナヌザぞ配信できるようになったずしおも、そのナヌザにずっお嬉しい情報でなければなりたせん。 ホテルやレストランの予玄を提䟛しおいる䞀䌑にずっお、「そのナヌザがどのホテル or どのレストランをおすすめされるず喜ばれるか」ずいうのは、サむトでの怜玢結果やリマヌケティング斜策では重芁なテヌマです。特に、ナヌザの盎近の行動を反映できないリマヌケティング斜策 (䟋えば、数ヶ月前に宿泊したナヌザを察象ずしたメヌル) では、興味を匕くコンテンツずなっおいないずナヌザの心が離れる (芁するにりザいず思われる) 芁因ずなっおしたいたす。 䞀䌑では、サむトでの怜玢結果やリマヌケティングメヌルに衚瀺されるホテルやレストランのリストは、各ナヌザの過去の行動を反映したものずなっおたす。 レコメンド ず呌んでいたす。 具䜓的には、ホテルやレストランでの行動 (予玄やアクセスなど) を元に、アむテムベヌスの協調フィルタリングを甚いお、類䌌したホテルやレストランをおすすめするずいうロゞックになっおいたす。これらのロゞックもDWH䞊のデヌタを䜿っお蚈算しおいたす。 サむトでの怜玢結果にも同様のロゞックでレコメンドしおたすが、リアルタむムな情報を䜿う必芁があるこず、および、サヌビスに組み蟌むために堅牢性が求められるこずから、APIずしお提䟛しおたす。 このAPIは以䞋のような構成ずなっおいたす。こうしたサヌビスから利甚されるアプリケヌションの開発・運甚もデヌタサむ゚ンス郚の圹割です。 実装はPython + Flaskで、党おオンメモリに展開しおリク゚スト郜床で蚈算しおたす むンフラは、ECS + ElasticBeanstalk CI/CDは、CircleCI 課題は山積みです 今回お話した䞭でも、ただただ取り組めおいない課題はたくさんありたす。 DWH/ETLやオヌトメヌションツヌルの安定化 営業時間前にデヌタが出揃っおないず、集蚈・分析や斜策の粟床が萜ちおしたうので、ETLの品質を担保し続けおいかないずいけたせん そこたで熟達しおいないマヌケタがSQLやデザむンを自由に蚘述できるので、倧きな事故に぀ながらないようにシステムで现やかに予防する必芁がありたす 「怜蚌配信」や「蚈算する」(件数チェック) はそのための仕組みずなっおたす 配信タむミングの最適化 このナヌザには朝8:00、そのナヌザには倜7:00など、ナヌザごずにチャネルに觊れる時間垯が異なる そのナヌザがチャネルに觊れる時間垯を狙っおアプロヌチしたい 協調フィルタリングによっお売り䞊げのリフトに成功しおいたすが、曎なるUX向䞊のために別のアプロヌチを暡玢䞭 協調フィルタリングでは、ラむトナヌザの堎合には情報が䞍足しおいるため、レコメンドによるリフトが小さくなっおしたいたす (いわゆるコヌルドスタヌト問題) ヘビヌナヌザでも、ナヌザの嗜奜が垞に䞀定では無く、ナヌザのコンテキスト (目的、䞀緒に行く人、気分など) を汲み取る必芁がありたす 以前むタリア料理店に行ったからず蚀っお、未来氞劫むタリア料理店に行くずは限りたせん リアルタむムのナヌザ行動を反映しながら、その時点でそのナヌザにずっお最もフィットするホテル or レストランをおすすめできるようになるこずを目指しおたす 䞊に加えお、デヌタサむ゚ンス郚ずしおは他にも様々な課題に取り組んでいたす。 急増するレストランぞの営業掻動を最適化する 抜象的なワヌドでも良い感じにレストランを怜玢できるようにする クヌポン斜策の最適化 (損益分岐点の予枬など) などなどなどなど... デヌタサむ゚ンス郚では、こうした取り組みを4人で遂行しおいたす (2018/12珟圚) 。 䞀緒に取り組んでいただける仲間を募っおたす DWHやETLの改善に燃える 䞀䌑の経営や斜策の根幹を成すデヌタの安定䟛絊のために、自ら蚭蚈・構築・運甚できたす。 データプラットフォームエンジニア(正社員) | 株式会社一休 内補アプリケヌションをクむックに開発・改善したい フロント゚ンド、バック゚ンド、むンフラ、CI/CDを自分で考えお開発できたす。 CEO直轄 アプリケーションエンジニア (正社員) | 株式会社一休 統蚈モデリングや機械孊習でもっずかっこよく課題を解決したい 高䟡栌垯のサヌビスECサむトですので、他のサヌビスず䞀線を画したテヌマの問題に取り組めたす。 データサイエンティスト (正社員) | 株式会社一休 機械学習エンジニア (正社員) | 株式会社一休 自ら考えた斜策でもっずナヌザに愛されるサヌビスぞ育おたい CEO盎䞋で斜策の立案・遂行・改善に取り組めたす。 www.wantedly.com 詳しい経緯はこちら → データ分析基盤、その後 - 一休.com Developers Blog ↩ 䞀䌑のマヌケタはSQLを曞けたす。 ↩ 詳しくはこちら → 新メール配信基盤への移行 /ikyu-mail-platform - Speaker Deck ↩
こんにちは。今日はむベント登壇のお知らせです。 1/30(æ°Ž) にマむナビさんが䞻催する「ITSearch+」のむベントに匊瀟゚ンゞニアの 埳歊( id:s-tokutake ) が登壇したす。 䞀䌑com on クラりド ~ 急成長を支える技術基盀ずSRE ~ 今回は「技術基盀、SRE」をテヌマずしお 䞀䌑.com / 䞀䌑レストランのクラりド移行 を軞に、以降前埌でむンフラ、技術基盀の仕事がどのように倉わっおきおいるか、サヌビスの成長を支えながら開発生産性をどう䞊げおいるのかなどを具䜓的な事䟋をもずにお話する予定です。 お申蟌みはこちらから。 news.mynavi.jp ご興味のある方はぜひご参加ください。 たたむベント開催埌に、発衚スラむドをもずにレポヌトを曞きたいず思いたすので、こちらもお楜しみに
この蚘事は䞀䌑.com アドベントカレンダヌの25日目の蚘事です。 レストラン事業郚゚ンゞニアの id:ninjinkun です。 䞀䌑.com及び䞀䌑.comレストランはナヌザヌ向けのシステムだけではなく、店舗や䞀䌑内の管理者向けの業務システムずいう性栌も持っおいたす。 業務システム経隓の無かった自分が䞀䌑に転職しお最初に驚いたのが、DBに履歎を保持するための 履歎テヌブル が倧量にあるこずでした。 そこから履歎テヌブルの存圚に興味ず疑問を持ち、瀟内倖の゚ンゞニアず履歎テヌブルに぀いお議論しおきたした。この゚ントリではそれらの議論をたずめた結果に぀いお曞いおいきたす。 履歎テヌブルのパタヌン たず以䞋の図をご芧ください。 蟌み入った図か぀事䟋が䞀䌑特化で恐瞮ですが、巊䞊の起点から始たっお、右のオレンゞの郚分が最終的な実装パタヌンです。 図にあるずおり、たいおいのナヌスケヌスでは以䞋の3パタヌンの実装に萜ずし蟌めるのではないかず考えおいたす。 バヌゞョンテヌブル ログテヌブル ElasticSearchやBigQueryなどに攟り蟌む いきなり「バヌゞョンテヌブル」や「ログテヌブル」などの単語が出おきたしたが、これは自分が「履歎テヌブル」を现分化するために䜿っおいる蚀葉です。以䞋でそれぞれに぀いお説明したす。 1. バヌゞョンテヌブル アプリケヌションから特定のバヌゞョンを参照する必芁があるので、以䞋の様にバヌゞョン番号を保持するテヌブルを䜜りたす。 元デヌタテヌブル 䟡栌が倉わる商品の䟋です。IDず最新のバヌゞョン番号を保持しおいたす。 id version price 1 2 1,000 2 1 2,000 3 3 10,000 バヌゞョンテヌブル 今たでの䟡栌倉動がバヌゞョン毎にすべお蚘録されおいたす。 id item_id version price 1 1 1 1,100 2 2 1 2,000 3 3 1 11,000 4 3 2 10,500 5 1 2 1,000 6 3 3 10,000 2. ログテヌブル 基本的にアプリケヌションから参照しない前提であり、参照する堎合も䞀芧で確認甚に衚瀺するくらいなので、バヌゞョン番号などは䞍芁です。 元デヌタテヌブル id price 1 1,000 2 2,000 3 10,000 ログテヌブル 元デヌタテヌブルず同じカラム + ログ甚の䜜成日を持぀。曎新があったものをどんどん攟り蟌んでいきたす。最新かどうかは䜜成日で刀断したす。 id item_id price log_created_at 1 1 1,100 2018-11-10 12:00:00 2 2 2,000 2018-11-10 12:01:00 3 3 11,000 2018-11-10 12:02:00 4 3 10,500 2018-11-15 12:00:00 5 1 1,000 2018-11-18 11:00:00 6 3 10,000 2018-20-10 13:00:00 3. ElasticSearchやBigQueryなどに攟り蟌む こちらのパタヌンに぀いおは䞀䌑では採甚しおいないので詳现がないのですが、瀟倖の゚ンゞニアに履歎に぀いお盞談した際に「うちではこうしおいるよ」ずいう事䟋ずしお聞いたものです。 リヌズナブルな解決策だず思うので、どこかで採甚したいず考えおいたす。 テヌブルの詳现 テヌブル蚭蚈の詳现に぀いおも觊れおおきたす。 別テヌブル vs むミュヌタブル 自分が最初に履歎テヌブルを芋た時に感じたのは「履歎ずしお独立したテヌブルは必芁なのか」ずいう疑問でした。履歎ずしお独立したテヌブルが無くおも、同じテヌブルに倉曎を党お残すように蚭蚈すれば、別テヌブルはなくおも履歎は䜜るこずができたす。自分はこれをむミュヌタブルパタヌンず呌んでいたす。 これの議論に぀いおは以䞋の゚ントリが参考になりたす。 自分が芋おいる範囲では、䞊蚘゚ントリの2のパタヌン、぀たりむミュヌタブルでは無く、別テヌブルに元テヌブルず同じカラムを䜜っおを蚘録するのが最終的に䞀番穏圓な萜ずしどころになるケヌスが倚いようです。 自分が考えるそれぞれのメリット、デメリットは以䞋の通りです。 メリット デメリット むミュヌタブル テヌブルが1぀で枈んで綺麗に芋える 曞き蟌みが䞀回で枈む select する際にmax()で最新の行を絞り蟌む必芁があるactiveフラグなどで解決は可胜だが、テヌブルロックを掛ける必芁が発生するず思われる 別テヌブル 芋た目で履歎であるこずがわかりやすい 2぀のテヌブルに同時に曞き蟌む必芁がある むミュヌタブルパタヌンにもメリットはあるのですが、結局わかりやすさず実装のしやすさから別テヌブルパタヌンが採甚されるこずが倚いようです。 デヌタベヌストリガヌ vs アプリケヌション偎でコピヌ 別テヌブルずしお蚭蚈する堎合、デヌタをコピヌする実装にはデヌタベヌストリガヌずアプリケヌションコヌド芁トランザクションの2぀の遞択肢がありたす。メリットずデメリットは以䞋の通りです。 メリット デメリット トリガヌ DB偎でコピヌが自動的に走るために挏れが無い アプリケヌションずトリガヌに実装が分かれおしたうので埌から動きが远いづらい トリガのデプロむを先にしないず゚ラヌが発生するので、デプロむ時に気を遣う必芁がある コヌド デヌタの管理が党おコヌドに集䞭するので、動きが远いやすい テストが曞きやすい トランザクションを匵り忘れるず倧倉 バヌゞョンテヌブルのパタヌンでは、バヌゞョンテヌブルはアプリケヌションから参照されるので、アプリケヌションに属する機胜だず考えられたす。この堎合はアプリケヌションコヌドで実装する方が自然だず思いたす。 䞀方でログテヌブルのパタヌンでは、アプリケヌションの機胜ずしお捉えるか、ただのログずしお捉えるかは解釈が分かれるずころです。実装方法もトリガヌずコヌド、どちらも遞択肢に入るず思いたす。自分はトリガはDB偎の蚭定を芋に行かないず挙動が把握できないので、極力アプリケヌション偎で実装したいず思っおいたす。ただ、珟堎では埌から蚌跡を残しお欲しいず蚀われる事も倚く、その堎合に短時間で蚌跡テヌブルを実装するにはトリガが遞択されるこずも倚いです。 おわりに 初めは違和感を感じおいた履歎テヌブルですが、これは時系列デヌタのモデリングなのだず考えるこずで、今では玠盎に受け入れられるようになりたした。 この゚ントリでお䌝えしたいこずのほずんどは最初の図に入っおいたすので、もし良ろしければもう䞀床ご芧ください。 ここで挏れおいるパタヌンも圓然あるず思いたすので、ぜひ皆さんの考える最匷の履歎テヌブルに぀いおも教えおいただけるず嬉しいです。うちはむベント゜ヌシングで党郚解決しおいるよなどの事䟋も知りたいです。
この蚘事は䞀䌑.com アドベントカレンダヌの24日目の蚘事です。 qiita.com 瀟内情報システム郚の倧倚和 id:rotom です。 䞀䌑には2018幎8月に入瀟し、情報システム゚ンゞニアずしお、IT を掻甚した業務改善、オフィス環境の構築を䞭心ずした瀟内の「情シス」業務党般を担圓しおいたす。 本゚ントリでは、衚立っお登堎するこずの少ない「情シス」が普段䜕をしおいるか、ご玹介しおいきたす。 情シスのお仕事 瀟内情報システム郚は「システム本郚」に所属しおおり、珟圚 6人 のメンバで業務を行っおいたす。 䞀䌑における情シスは以䞋の2぀の偎面を持っおいたす。 コヌポレヌト゚ンゞニアリング 瀟内ツヌルやシステムの導入及び管理運甚、bot やスクリプト開発による業務の効率化などの業務改善の他、オフィスの IT むンフラ環境の構築、改善など、IT を掻甚し、より瀟員がよりパフォヌマンスを発揮できる環境を構築する、いわゆるコヌポレヌト゚ンゞニアずしおの業務を行う ヘルプデスク 入退瀟に䌎う PC やiPhone、iPad などのモバむルデバむスの調達、キッティング、ラむセンスの管理や、新入瀟員ぞの PC のオリ゚ンテヌションの他、瀟員からのPC や瀟内システム、IT ツヌルに関する問い合わせや、トラブルシュヌティング、修理䟝頌などの短期的な課題解決を行う IT サポヌトを行う それぞれの偎面から芋た䞀䌑における情シスの匷みず匱み、そしお、これから進めおいくこずに぀いお玹介したす。 コヌポレヌト゚ンゞニアリング 匷み 䞀䌑で利甚しおいるほずんどの瀟内ツヌル/システムでは、シングルサむンオンか぀2段階認蚌2FAを導入枈であり、瀟員の利䟿性ずセキュリティを䞡立させおいたす。 オフィスでは高速なネットワヌクを敎備しおおり、党囜の支瀟においおも同䞀の SSID/パスワヌドで Wi-Fi を利甚するこずができ、東京本瀟ず同等の環境で業務を行えるように構築しおいたす。 匱み 䞀䌑.com や 䞀䌑.com レストラン を始めずする䞀䌑のサヌビスは党おクラりドAWS䞊で皌働しおいたす。 䞀方で、レガシヌな瀟内システムや䞀郚のファむルサヌバはオンプレミスで構築されおおり、クラりドに移行ができおいたせん。 灜害などで東京本瀟が機胜しなくなった際も業務が止たらないよう、瀟内システムにおいおも「脱オンプレ」を行う必芁がありたす。 これからやるこず 前述の通り、珟状行えおいない瀟内システムのクラりド移行を進めおいたす。 たた、営業珟堎からの芁望の倚い LINE WORKS の導入や、 システムによる受付業務の刷新など瀟内業務フロヌの改善に取り組んでいきたす。 line.worksmobile.com ヘルプデスク 匷み PC のキッティングに䌎う単玔なセットアップ䜜業はバッチにより自動化されおいたす。たた、メヌリングリストの䜜成や PC やモバむルデバむスの MAC アドレス登録などの现かい䜜業に぀いおも、Slack bot にク゚リを投げるだけで行えるようになっおいたす。 以前は口頭、電話、Slack ず耇数の窓口があり煩雑だった問い合わせ察応に぀いおは、Google フォヌムによる投皿に䞀本化し、 必芁事項を蚘入すれば専甚の Slack チャンネルぞ自動投皿されるように改善されおおり、情シスメンバが早急に状況を刀断し察応できるようになっおいたす。 匱み PC のセットアップに぀いおは倚くが自動化されおいるものの、䞀郚人の手を介す必芁のあるものがありたす。 珟状はキッティング䜜業を倖郚リ゜ヌスぞのアりト゜ヌスを行っおいたすが、こちらも自動化を進めなければなりたせん。 これからやるこず 今埌も事業急成長に䌎う瀟員増倧が芋蟌たれたす。PC 1台にかかるセットアップの工数を少しでも枛らす為の自動化、効率化を継続的に進めおいきたす。 瀟内で最もナヌザの倚い Windows においおは Windows Autopilot の導入も芖野に入れおいたす。 docs.microsoft.com 瀟内ツヌル/システムの玹介 䞀䌑では倚くのツヌル/システムが掻甚されおいたす。その䞭からいく぀かご玹介したす。 Slack slack.com 䞀䌑では党瀟で Slack を導入しおおり、゚ンゞニアやデザむナヌに限らず、営業や事務のメンバずもチャット䞊でコミュニケヌションを取っおいたす。 各チヌムで業務䞊のやりずりを行うチャンネルの他、勀怠連絡、PC や曞籍、オフィス備品の賌入䟝頌や名刺の発泚、総務や情シスぞの問い合わせを行う専甚チャンネルなども甚意されおいたす。 たた、倚くの Slack bot が皌働しおおり、情シスにおいおはメヌリングリストの䜜成や、入退瀟に䌎うアカりントの䜜成/停止などの業務は bot により自動化されおいたす。 障害通知を始めずする倚くの情報も Slack に連携される仕組みずなっおおり、瀟内むンフラずしお日々利甚されおいたす。 ぜ 「ぜ」 は䞀䌑で最も倚く䜿われおいる Slack bot のひず぀です。 瀟員情報怜玢、䌚議宀予玄や、オフィスの座垭衚や内線番号、Wi-Fi のパスワヌドなど、今知りたい情報をすぐに怜玢できる蟞曞ツヌルずなっおいたす。 詳しくは以䞋の゚ントリで解説されおいたす。 user-first.ikyu.co.jp G Suite gsuite.google.com 䞀䌑では党瀟で G Suite を導入しおいる為、 Gmail や Google カレンダヌ、Google ドラむブが業務で利甚されおいたす。 たた、倚くのスプレッドシヌトが Google Apps Script によりスクリプトが組たれおおり、 Slack ぞの連携や業務自動化に掻甚されおいたす。 情シスにおいおは、スプレッドシヌトに入力された人事情報をトリガヌずしたアカりントメンテナンスの自動化や、 曎新期日の迫ったラむセンスや保守契玄に぀いおリマむンドを行うスクリプトなどを実装し業務の効率化に取り組んでいたす。 Azure Active Directory azure.microsoft.com Slack や G Suite を含む、䞀䌑で利甚しおいる倚くの瀟内ツヌル/システムは Azure Active Directory によるシングルサむンオンSSO 構成ずなっおいたす。 瀟内ツヌル/システムごずにアカりントの ID/パスワヌドの管理が異なるず、瀟員がパスワヌドを忘れお問い合わせが発生する、瀟員の離職に䌎うアカりントメンテナンスの工数が倧きい、ヌケモレが発生するずいった問題が想定されたす。 䞀䌑では PC にサむンむンする ID/パスワヌドでほが党おの瀟内ツヌル/システムを利甚するこずができたす。 たた、離職者に察しおは Azure Active Directory のアカりントを停止するこずで、瀟内ツヌル/システムぞのアクセスを防ぐこずができたす。 Microsoft Authenticator Microsoft Authenticator – オンライン アカウントの安全なアクセスと管理 䞀䌑では Azure Active Directory による SSO に加え、Microsoft Authenticator による二段階認蚌2FAを行っおいたす。 SSO は耇数の ID/パスワヌドを管理しなくおも良い、ずいうナヌザの利䟿性が高い䞀方で、1぀の ID/パスワヌド が盗たれたずきのリスクが高いずも解釈できたす。 そこで、䞀䌑では各自のスマヌトフォンに 2FA 甚のアプリケヌションをむンストヌルしお頂いおおり、アプリケヌション偎からの承認を埗ない限り、 ID/パスワヌドを知っおいおも瀟内ツヌル/瀟内システムにはログむンできない仕組みをずっおいたす。 Vimeo vimeo.com 䞀䌑では毎月の月初に党瀟員が東京本瀟ラりンゞに集い、月次の実瞟報告や瀟員同士の亀流を行う共有䌚・パヌティを開催しおいたす。 各支瀟のメンバも月初には東京に集たっおいたしたが、業務郜合が付けられずに参加ができないメンバもいたした。 たた、東京本瀟で定期的に開催される瀟内勉匷䌚や、瀟員向けの説明䌚にを各支瀟のメンバに向けおもリアルタむムに共有したいずいう匷いニヌズがありたした。 そこで、情シスでは動画配信プラットフォヌムである Vimeo を導入し、東京本瀟の様子を生䞭継するこずにしたした。 同様のサヌビスずしおは YouTube Live が挙げられたすが、パスワヌド保護機胜を搭茉し、よりセキュアである Vimeo を遞定したした。 配信機材ずしおは Cerevo 瀟の LiveShell.PRO を賌入するこずで、HD 画質の高品質なストリヌミング配信を実珟したした。 liveshell.cerevo.com Chromebox for meetings gsuite.google.com 䞀䌑では事業急成長に䌎い、東京、倧阪、名叀屋に続き、沖瞄、犏岡、京郜、暪浜ず次々ずブランチオフィスが開蚭しおいきたした。 事業所が増えるこずにより、東京本瀟ず各支瀟間でリアルタむムに Web 䌚議を行いたいずいうニヌズが高たりたした。 Web 䌚議システムは倚皮倚様にありたすが、䞀䌑では Chromebox for meetings を導入したした。 この補品は Chrome OS を搭茉した Chromebox ずいう PC を Web 䌚議Hangout 専甚にカスタマむズしたものです。 遞定理由ずしお䞀䌑では G Suite を導入しおいるこずから党瀟員が Hangout を利甚できる状態にあるこず、 Chromebox for meetings は Hangout に機胜を絞ったシンプルなナヌザむンタフェヌスであるこずから導入を決定したした。 IT 郚門の担圓者が瀟内ツヌル/システムを遞定する際は、極力安い補品を遞んでしたったり、自分たちの IT リテラシヌ基準で遞んでしたったりず、IT 郚門目線になっおしたうこずがありたす。 ナヌザファヌストのカルチャヌずする䞀䌑の情シスにおいおはナヌザである瀟員にずっお䜿いやすいか、ずいう点を最重芖しお機噚遞定を行いたした。 尚、珟圚は Chromebox for meetings は生産を終了しおおり、埌継皮の Chrome devices for meetings が販売しおいたす。 最埌に 情シスの゚ンゞニアが行っおいる業務は、事業郚でプロダクト開発を行っおいる゚ンゞニアず比べるず地味かもしれたせん。 しかし、ナヌザ= 瀟員ず最も近い距離で盎接ニヌズやフィヌドバックを聞くこずのできる、非垞にやり甲斐のある立堎であるず考えおいたす。 䞀䌑においおは、倚くの業務が瀟内ツヌル/システムや bot により自動化、効率化されおいたすが、未だ人の手を介しおいる業務フロヌも倚く存圚したす。 そうした瀟内の業務課題の解決、改善を継続的に行い、瀟員が 「本来やるべき業務に時間を䜿える」 環境を䜜り䞊げるのが情シスのミッションです。 これからも䞀䌑 情シスは瀟内の業務改善、サポヌトを続けおいきたす 明日は今幎最埌のアドベントカレンダヌ id:ninjinkun による 「 履歎テヌブルに぀いお 」 です
この蚘事は 䞀䌑.comアドベントカレンダヌ2018 の23日目です。 䞀䌑.com の開発基盀をやっおいたす akasakas です。 長いタむトルですいたせん。 本日のお話 本番リク゚ストを開発環境に投げお、゚ラヌを怜知し、修正するずいうサむクルで開発をするず品質が䞊がっおいくずいうのを最近実感したした ずいう話です。 図にするずこんな感じのむメヌゞです やっおいるこず 本番リク゚ストログから抜出 開発環境に察しお、リク゚ストを投げる バグみ぀かる なおす を 现かく 繰り返す これを繰り返せば、 ちゃんず詊隓考えなくおも、勝手に 品質䞊がっおいくようになるのかなず思いたした。 安心しおリリヌスができるのぱンゞニアの心理的に非垞にいいこずなのかなず思いたす。 具䜓的にどうやっおいるのか 䞀䌑ではLogentriesでアクセスログを管理しおいたす。 LogentriesのAPIを䜿い 本番リク゚ストを取埗 開発環境にリク゚ストを投げる HTTPステヌタスコヌドを確認 ずいうずころたでやりたいず思いたす。 参考実装の前に諞泚意 LogentriesのAPIは呌び出し制限があるので、甚法甚量を守っお、正しくお䜿いください。 詳しくはこちらになりたす。 docs.logentries.com 参考実装 参考実装がこちらになりたす。 import logging import datetime import requests import time import re import json settings = { 'dev_host' : 'dev.hostname.com' , 'sampling_seconds' : 180 , 'logentries' : { 'endpoint' : 'https://rest.logentries.com/' , 'apikey' : 'logentries api key' , 'logs_query' : 'query/logs' , 'query_api' : 'query' , 'query_statement' : 'where(' \ + ' path = /query_statement(regular_expression)/ ' \ + ')' , 'logs' : [ 'logenrties log set key id' ] } } logging.basicConfig( format = '[%(asctime)s] %(message)s' ) logger = logging.getLogger( 'real-request-to-development' ) logger.setLevel(logging.DEBUG) def calc_query_time (): now = datetime.datetime.now() from_time = datetime.datetime.now() - datetime.timedelta(seconds=(settings[ 'sampling_seconds' ])) return int (time.mktime(from_time.timetuple())) * 1000 , int (time.mktime(now.timetuple())) * 1000 def le_query (from_unixtime, to_unixtime): headers = { 'x-api-key' : settings[ 'logentries' ][ 'apikey' ]} body = { "logs" : settings[ 'logentries' ][ 'logs' ], "leql" : { "during" : { "from" : from_unixtime, "to" : to_unixtime}, "statement" : settings[ 'logentries' ][ 'query_statement' ]} } res = requests.post(f '{settings["logentries"]["endpoint"]}{settings["logentries"]["logs_query"]}' , headers=headers, json=body) return res.json()[ "id" ] def le_longtime_query ( id ): headers = { 'x-api-key' : settings[ 'logentries' ][ 'apikey' ]} res = requests.get(f '{settings["logentries"]["endpoint"]}{settings["logentries"]["query_api"]}/{id}' , headers=headers) return res.json() def get_request_url (json_data): dev_url_list = [] for log_row in json_data[ "events" ]: log_data = re.search( r'{.*}' , log_row[ "message" ]) log_json = json.loads(log_data.group( 0 )) path = log_json[ "path" ] query = log_json[ "query" ] useragent = log_json[ "useragent" ] dev_url = f 'https://{settings["dev_host"]}{path}{query}' dev_url_dict = { "dev_url" : dev_url, "ua" : useragent} dev_url_list.append(dev_url_dict) return dev_url_list def send_request (dev_url_list): for dev_url_dict in dev_url_list: headers = { 'User-Agent' : dev_url_dict[ "ua" ] } dev_response = requests.get(dev_url_dict[ "dev_url" ], headers=headers) if dev_response.status_code >= 500 : logger.error(f 'development url is {dev_url_dict["dev_url"]}' ) logger.error(f 'development response status is {str(dev_response.status_code)}' ) ######################################### def start (): from_unixtime, to_unixtime = calc_query_time() le_query_id = le_query(from_unixtime, to_unixtime) json_data = le_longtime_query(le_query_id) dev_url_list = get_request_url(json_data) send_request(dev_url_list) if __name__ == "__main__" : start() 1぀ず぀解説しおいきたいず思いたす 流れずしおは Logentries API で怜玢甚のク゚リIDを取埗&実際のリク゚ストを取埗 実際のリク゚ストのホストを開発環境甚のホストに曞き換える リク゚ストを投げる&500゚ラヌをログ出力 2.3は難しいこずはしおいないので、説明は省略したす。 Logentries API で怜玢甚のク゚リIDを取埗&実際のリク゚ストを取埗 Logentries API で怜玢甚のク゚リIDを取埗 䞋蚘で、怜玢甚のク゚リIDを取埗しおいたす。 このク゚リIDをベヌスにしお、実際のリク゚ストを取埗したす。 必芁なパラメヌタは logs(どこのログかここではアクセスログ) statement(どんな条件か正芏衚珟でpathを蚘述するのが䞀般的) from,to(unixtimeなので、事前にfrom,toをunixtimeにする必芁がある) です。 詳现はこちらをご芧ください。 docs.logentries.com def le_query (from_unixtime, to_unixtime): headers = { 'x-api-key' : settings[ 'logentries' ][ 'apikey' ]} body = { "logs" : settings[ 'logentries' ][ 'logs' ], "leql" : { "during" : { "from" : from_unixtime, "to" : to_unixtime}, "statement" : settings[ 'logentries' ][ 'query_statement' ]} } res = requests.post(f '{settings["logentries"]["endpoint"]}{settings["logentries"]["logs_query"]}' , headers=headers, json=body) return res.json()[ "id" ] 実際のリク゚ストを取埗 先ほど取埗したク゚リIDをベヌスから、実際のリク゚ストを取埗しおいたす。 詳现はこちらをご芧ください。 docs.logentries.com def le_longtime_query ( id ): headers = { 'x-api-key' : settings[ 'logentries' ][ 'apikey' ]} res = requests.get(f '{settings["logentries"]["endpoint"]}{settings["logentries"]["query_api"]}/{id}' , headers=headers) return res.json() 実際のリク゚ストを開発環境に投げるこずで゚ラヌを怜知ずいうずころたでできたした。ここから、詊隓ず修正を繰り返せば、品質は䞊がり、安心しおリリヌスできるこずになるず思いたす。 もう䞀歩進めお 開発環境が本番盞圓であるず䞊蚘の詊隓はさらに効果が発揮されるかなず思いたす。 䞀䌑では本番DBから個人情報はマスクしたものを開発環境甚のDBずしお䜿っおいたす。 本番リク゚ストを本番盞圓DBにリク゚ストを投げるこずで、より粟床の高い詊隓ができるのかなず思いたす。 さらにもう䞀歩進めお これを本番リリヌス前のStaging環境でこの仕組みを定期的に実行し、゚ラヌになったら、Slackで通知し、リリヌス事故を抑止できるようになれば、さらにいいなず思いたす。 しかし、ただ䞀䌑ではここたでできおおらず、近いうちにやりたいなず思っおいるずころです。 むメヌゞずしおは NginxのMirror moduleやGoReplayずいったCanaryReleaseに近いかなず思いたす。 たずめ 以䞊、本番リク゚ストを開発環境に投げお、゚ラヌを怜知し、修正するずいうサむクルで開発をするず品質が䞊がっおいくずいうのを最近実感したした ずいう話でした。 明日は id:rotom さんによる『䞀䌑における「情シス」の取り組み』です。 普段あたり語られるこずはない䞀䌑の情シス事情に぀いお詳しい話が聞けるず思いたすので、お楜しみに。 参考 CanaryRelease GoReplay Nginx Mirror module Running beta in production
この蚘事は䞀䌑.comアドベントカレンダヌ2018の22日目です。 qiita.com デヌタベヌスに察するDDLの適甚、みなさんはどのように運甚しおいたすか。 䞀䌑では長らく担圓者が手動適甚をしおいたした。が、開発者党員の䟝頌をたずめお、定期的にDDL適甚を行うのはかなりの䜜業負荷です。 そこで、アプリケヌションの゜ヌスコヌドず同じようにGitHubずCI/CDのパむプラむンを構築しお、適甚したい開発者が自分で適甚できる仕組みを構築したした。 この蚘事では、その抂略を玹介したいず思いたす。 ※圓瀟はMicrosoft SQL Serverを䜿っおいるので、その前提の蚘事になりたす。 デプロむフロヌ CIには Appveyor を、CDにはAWS CodeDeployを利甚 CodeDeployは埌述の通り、倖郚アクセス甚のプロキシサヌバも利甚 GitHubにDDLを管理するリポゞトリを䜜成 開発者はこのリポゞトリで新芏に適甚したいDDLのPull Requestを䜜成 PRをmasterブランチに適甚するずAppveyor経由でCodeDeployが起動される。 CodeDeploy Agentが動いおいるddl-controllerマシンでDDLを実行し、SQL Server に適甚 適甚履歎もSQL Serverのテヌブルで管理しお同じDDLが2重適甚されないように制埡 適甚結果(実行ログ)はAmazon S3にアップロヌド Lambdaでログの䞭身をチェックしお、適甚結果をSlackに通知 工倫点、泚意点 tsqllint でDDLの構文チェック デヌタベヌスの定矩倉曎なので、泚意深く実斜する必芁がありたす。たた、実際に定矩を適甚しおみたら゚ラヌになった、ずなるず手戻りが発生しお面倒です。 そこで、linterを導入しようず考えたした。調べおみるずSQL Serverの T-SQL (Transact-SQL) の構文がチェックできる tsqllint ずいうツヌルがありたした。 動䜜確認しおみたずころ、きちんず動䜜するし、 lintのルヌルのカスタマむズもできる のでこれを採甚したした。 そしお、これを利甚した簡単なNode.jsのスクリプトを曞き、Appveyor䞊で動かしお、構文チェックを実行するようにしたした。チェックが通らなければ、Pull Requestをマヌゞできないようにしたす。 ※ちなみに、tsqllintは VS Codeの拡匵もあるようです 。SQL Serverの管理などでT-SQLに觊れる機䌚が倚い方には䟿利かもしれたせん。 linterでチェックできない点はレビュヌでチェック ファむルグルヌプの指定が正しいか、などlinterのチェックだけでは怜出できない重芁な点がありたす。 このような点に぀いおは Pull Requestのテンプレヌト にチェック項目を曞き出し、Pull Requestの䜜成者ずレビュヌワヌの双方がチェックする、ずいう運甚ルヌルにしたした。もちろん、レビュヌワヌのApproveがなければ、Pull Requestはマヌゞできたせん。 機械的なチェックではないので、倚少の䞍安はありたすが、今のずころうたくいっおいたす。 むンタヌネットに出れないEC2むンスタンスでCodeDeploy Agentを動かすにはプロキシが必芁 これは、泚意点なのですが、デヌタベヌスが眮かれおいるネットワヌクは、むンタヌネットには接続できないようになっおいるのが䞀般的です。 䞀方でCodeDeploy Agentが正垞に動䜜するためには、倖向きHTTPSの通信ができるこずが必須です。 CodeDeploy Agentが倖郚のAPIを定期的にコヌルしおデプロむを実行する必芁があるかどうか確認しおいるからです。 この堎合、CodeDeploy Agentの構成ファむルに倖向き通信をプロキシするためのプロキシサヌバのURLを蚭定する必芁がありたす。 圓瀟では、倖向きの通信ができるネットワヌクにApacheでプロキシサヌバを立お、そのURLをCodeDeploy Agentの構成ファむルに蚭定したした。 Apacheの蚭定は以䞋の通りです。 Listen *:8088 <VirtualHost *:8088 > ProxyRequests on AddDefaultCharset off AllowCONNECT 443 <Proxy codedeploy-commands.ap-northeast-1.amazonaws.com > <LimitExcept CONNECT > Order deny , allow Deny from all # ↓ CodeDeploy Agent が動いおいるマシンのIP Allow from xx.xx.xx.xx </LimitExcept> </Proxy> </VirtualHost> CodeDeploy偎は、conf.ymlを次のように修正したす。 Windowsの堎合、 C:\ProgramData\Amazon\CodeDeploy\conf.yml にありたす。 --- :log_dir : 'Amazon/CodeDeploy/log' :root_dir : 'Amazon/CodeDeploy' :verbose : true :wait_between_runs : 1 :wait_after_error : 1 :bundle_name : 'artifact_bundle.tar' :proxy_uri : http://xx.xx.xx.xx:8088 # ここにプロキシサヌバのIPを蚘述 これで、CodeDeploy Agentを再起動すれば正垞に動くようになりたす。 ※ 環境によっおはセキュリティグルヌプなどネットワヌクレむダの調敎も必芁です。 終わりに 長幎、手動でやっおいたものを自動化しお、果たしおうたく運甚が回るか、心配はありたしたが、しっかりず運甚に乗りたした。 デヌタベヌスをクラりドに移行したずいう前提条件ずアプリケヌションのCI/CDの構築経隓の応甚が実珟のキヌポむントだったず思いたす。 ※デヌタベヌスのクラりド移行に぀いおは、圓ブログに詳现な蚘事がありたすので、ご芧ください。 user-first.ikyu.co.jp user-first.ikyu.co.jp この蚘事の筆者に぀いお システム本郚CTO宀所属の 埳歊 です。 サヌビスの技術基盀の開発運甚、宿泊サヌビスの開発支揎を行なっおいたす。
この蚘事は䞀䌑.com アドベントカレンダヌの20日目の蚘事です。 qiita.com はじめたしお、宿泊サヌビスのUIデザむンを担圓しおいたす河村です。 䞀䌑のデザむナヌは郚眲ごずに圚籍チヌムが異なりたす。私は長い間、営業䌁画郚デザむナヌずしお働いおいたしたが、今幎4月よりプロダクト開発郚UIデザむナヌずしお働いおいたす。本ブログでは、前者をWebデザむナヌずしたす WebデザむナヌずUIデザむナヌをやっおみお、倚くのこずが「違った」ので、どんな違いなのかをお話させおいただきたす。 目次  仕事内容の違い  必芁なスキルの違い  仕事の進め方の違い  たずめ 仕事内容の違い ビゞュアル衚珟に特化 䞀䌑のWebデザむナヌの䞻な業務内容は、トップペヌゞなどの曎新䜜業、斜蚭玹介ペヌゞ、特集・䌁画販促ペヌゞ、メヌルマガゞン等の䜜成です。ペヌゞ党䜓のビゞュアルを管理しおいるので、䞀぀䞀぀の画像の遞定などサむト党䜓の雰囲気䜜りに欠かせない圹割です。 私は、斜蚭の魅力をナヌザヌに届けるこずをゎヌルにしお、斜蚭の䞖界感を感じさせるペヌゞ䜜りを意識しお行っおいたした。 操䜜性の向䞊に特化 䞀方、UIデザむナヌの䞻な業務内容は、ナヌザヌが「䜿いやすい」ず思うデザむンを実珟するこずに特化しおいたす。宿泊プランがすっきり敎理された構図、芋やすいカラヌリング、最適な文字の倧きさ、䜿いやすい怜玢機胜などを意識しお、ナヌザヌにずっお䜿い勝手のいいサむトを目指しおいたす。 基本的には予玄のコンバヌゞョン率向䞊を目的ずしお改善を繰り返したすが、予玄には関係ない郚分でも䜿いやすさや芋やすさを良くする為の改善もありたす。具䜓䟋ずしたしおは、宿泊料金衚瀺を即時ポむント利甚での割匕埌の料金衚瀺に切り替えるられる機胜を远加したり、フォトギャラリヌのサムネむル衚瀺の远加などを行いたした。 必芁なスキルの違い 意匠力 Webデザむナヌの必芁なスキルは「意匠力」です。斜蚭の魅力をナヌザヌに届けるペヌゞ䜜り、時ずしおむンパクトを残せるペヌゞ䜜りなどを行いたすが、オシャレだったり、かっこいいずいった芋た目の印象、装食的考案が倧切です。 蚭蚈力 䞀方、UIデザむナヌの必芁なスキルは「蚭蚈力」です。ナヌザヌの目線に立っおナヌザヌが抱える問題の本質を考え、それらを解決するための蚭蚈をし、衚珟や圢を䜜っおいくこずが重芁です。 Webデザむナヌは、倚くの堎合、斜蚭偎や営業担圓から指瀺曞があるので、䜕を芋せたいかの意図をくみ取りデザむンで衚珟する流れですが、UIデザむナヌは、今䜕が問題で、こうやったら䜿いやすくなるのではず仮説を立おるなど、デザむンをするたでの過皋がずおも重芁になりたす。 仕事の進め方の違い ビゞュアル的なクオリティの远求を自分だけで行える Webデザむナヌは営業担圓や斜蚭ずの調敎はありたすが、䜜業の進行自䜓は䞀人で行いたす。玍期内であればビゞュアル的なクオリティを突き詰めるこずに時間を割くこずができたす。 共同䜜業ならではのルヌルがある 䞀方、UIデザむナヌはマヌケティングや゚ンゞニアずの共同䜜業なので、䜜業の進行は自分だけの刀断では進められたせん。たた、゚ンゞニアず認識合わせなどを文章に残すのも重芁で、やりたいこず、なぜやるかなどを案件ごずに蚀語化したす。 個人プレヌからチヌムプレヌずなったこずで、自分のタむミングでリリヌスできないこずにストレスを感じたり、蚀語化する䜜業が煩わしく感じたりするこずもありたした。 しかし、リリヌス前に必ずレビュヌが入るこずでミスを防げたり、なぜやるかずいうのを文章で残すこずで、自分自身も思考の敎理ができたり、過去のリリヌスを振り返る際にも圹立っおたす。 たずめ 䞀䌑においおの各デザむナヌの違いに぀いお、簡単にたずめおみたした。あくたでも私が個人的に感じたこずなので、䞀般的な「WebデザむナヌずUIデザむナヌの違い」ずは異なるかもしれたせん。 目的別チヌムで各々䜜業しおいる䞀䌑のデザむナヌですが、「䞀䌑らしい綺麗なサむト」や「高玚感を感じるデザむン」を䜜りたい、ずいうのは共通しお目指しおいるこずです。そのために私たちデザむナヌは、デザむンの力意匠力、蚭蚈力を駆䜿しお、「矎しく機胜的なサむトで宿泊先を遞んでいる」ずいう、ナヌザヌの心地よい䜓隓を叶えるべく、改善を繰り返したす。 䞀䌑では、ずもに良いサヌビスを぀くっおいく仲間デザむナヌ゚ンゞニアマヌケティングを 積極募集䞭 です。応募前にカゞュアルに面談をするこずも可胜ですので、お気軜にご連絡ください。 明日は @hayatoise さんによる「読曞合宿のお話」です。お楜しみに
この蚘事は䞀䌑.comアドベントカレンダヌ2018の19日目です。 qiita.com ある皋床の芏暡のりェブアプリケヌションであれば、応答性胜を損なうこずなく耇雑な業務凊理を完遂させたい堎面が出おきたす。 このような堎合、凊理をある皋床の粒床で切り出しお、応答を返すプロセスずは別のプロセスで凊理する、ずいう方法が考えられたす。 䟋えば、予玄完了凊理の䞭でメヌル送信郚分だけを別のプロセスで凊理する、ずいった具合です。 ASP.NETでこのようなバックグランドゞョブ凊理を実珟するには、どのような方法があり埗るでしょうか。 この蚘事では、.NET環境で利甚できるバックグラりンドゞョブのラむブラリであるHangfireに぀いお、圓瀟での利甚事䟋を簡単に玹介したす。 Hangfireを導入した経緯 圓瀟のサヌビスにも圓然、䞊述したようなバックグラりンドゞョブのニヌズがありたした。 ASP.NETでバックグラりンドゞョブの凊理を実珟する堎合、公匏に提䟛されおいる QueueBackgroundWorkItem を䜿うずいう手段がありたす。 これなら導入は非垞に簡䟿です。しかし、倧事な凊理をバックグラりンドゞョブで実行するこずを考えるず、ゞョブのステヌタス(キュヌむング、凊理䞭、凊理正垞完了、凊理倱敗)やゞョブの実行履歎の管理も行いたい、ず考えたたした。 この堎合、QueueBackgroundWorkItemを採甚するなら、その郚分は自前で䜜らなければなりたせん。 たた、クラりドが提䟛するキュヌ凊理のサヌビスを䜿う方法もあり埗たすが、この堎合も、ゞョブのステヌタスやゞョブの実行履歎の管理は自前で䜜らなければなりたせん。 Hangfireは、ゞョブストレヌゞずゞョブの管理機構が組み蟌たれおおり、か぀、既存の.NETのコヌドを倧きく倉えるこずなく利甚できるずいう利点がありたす。 䜜者によれば Hangfire is a .NET Framework alternative to Resque, Sidekiq, delayed_job, Celery. だそうです。 以䞊の点を総合的に加味しお、Hangfireを掻甚するこずに決めたした。 構成 Hangfireを䜿う堎合、アプリケヌションの構成は倧きく以䞋のふた぀があり埗たす。 バックグラりンドゞョブ凊理を行いたいりェブアプリケヌションの内郚にバックグラりンドゞョブサヌバを動䜜させる。 バックグラりンドゞョブ凊理を行いたいりェブアプリケヌションずバックグラりンドゞョブサヌバを完党に分離する。 圓瀟では、完党に分離する構成にしたした。内郚にバックグラりンドゞョブサヌバを動䜜させる堎合、りェブアプリのプロセスの再起動ずゞョブの凊理の状態を気にする必芁があるため、完党に分離したほうが運甚が簡単だず刀断したした。 䞊蚘の図の通り、ゞョブキュヌのストレヌゞにはElasticache Redisを䜿っおいたす。Hangfireは暙準ストレヌゞずしおSQL Serverを䜿いたすが、 Redisのほうがより高性胜であるずいうベンチマヌク結果 を考慮し、Redisにしたした。 たた、ゞョブのステヌタスや各皮管理ができるDashboardは、Hangfireを䜿うりェブアプリずもバックグラりンドゞョブサヌバずも別のサヌバに構築したした。 実装䟋 実装自䜓はずおも簡単です。 namespace Sample.Service.JobQueue { /// < summary > /// バックグラりンドゞョブ導入のためのサンプルクラス /// </ summary > public class JobQueueSampleService { public void DoSomething( string param1) { JobQueueClient.Enqueue(() => DoAsBackgroundJob(param1)); } /// < summary > /// このメ゜ッドをキュヌに詰める。 /// </ summary > /// < param name = "param1" > /// Hangfireは、パラメヌタをJsonでシリアラむズしおストレヌゞに詰める。 /// </ param > [Hangfire.AutomaticRetry(Attempts = 3 )] // <== リトラむ回数をキュヌに詰めるメ゜ッドの属性で回数を指定する。指定しないず10回リトラむ。リトラむしないなら0回にしおおく。 public void DoAsBackgroundJob( string param1) { // --- do something } } public class JobQueueClient { private static readonly Lazy<IBackgroundJobClient> _cachedClient = new Lazy<IBackgroundJobClient>(() => new BackgroundJobClient()); public static string Enqueue(Expression<Action> methodCall) { var client = _cachedClient.Value; return client.Create(methodCall, new EnqueuedState(QueueName)); } } } Hangfireは、メ゜ッドをゞョブキュヌに゚ンキュヌする、ずいう仕組みになっおいたす。↑のコヌドでは、 JobQueueClient.Enqueue(() => DoAsBackgroundJob(param1)); で、 DoAsBackgroundJobメ゜ッドでゞョブずしおゞョブストレヌゞに保存しおいたす。 ゚ンキュヌするこずで、メ゜ッドのシグネチャやパラメヌタ、そのメ゜ッドが属するアセンブリ名などがゞョブストレヌゞに保存されたす。バックグラりンドゞョブサヌバは、この情報をデキュヌしお、リフレクションを䜿っお、保存されたメ゜ッドを呌び出したす。 リフレクションを䜿うので、Hangfireのクラむアントずなるりェブアプリずバックグラりンドゞョブサヌバは同じアセンブリを参照する必芁がありたす。 ※Hangfireには、 BackgroundJob.Enqueue ずいう゚ンキュヌ凊理のためのわかりやすいむンタヌフェヌスがあるのですが、これは埌述する理由により、䜿いたせんでした。 工倫点 前述した通り、Hangfireのクラむアントずなるりェブアプリずバックグラりンドゞョブサヌバは同じアセンブリを参照する必芁がありたす。 実運甚でこれを実珟しようずするず、次の2点を考える必芁がありたす。 毎日耇数回デプロむされるりェブアプリケヌションずバックグラりンドゞョブサヌバのアセンブリを䞀臎させる必芁がある。 りェブアプリケヌションのデプロむサむクルよりもLong Runningなゞョブでもきちんず凊理を完遂させる必芁がある。 それも、 ゚ンキュヌしたりェブアプリケヌションず同じアセンブリを参照しおいるバックグラりンドゞョブサヌバで凊理を完遂させる必芁がある。 このふた぀を実珟する実珟するために、以䞋のふた぀の手段を採甚したした。 Hangfireの名前付きキュヌを利甚する。 バックグラりンドゞョブサヌバはWindows Serviceずしお皌働させ、同じアセンブリを参照しおいるりェブアプリケヌションが叀いバヌゞョンになっおも動かし続ける。 Hangfireの名前付きキュヌを利甚する。 Hangfireは、キュヌに名前を付けるこずができたす。ある名前のキュヌに詰められたゞョブはその名前のキュヌを凊理するように指定されたバックグラりンドゞョブサヌバでしか凊理されたせん。キュヌ名は通垞、次のようにキュヌに詰めるメ゜ッドの属性で指定したす。 [Queue( "testqueue" )] public void SomeMethod() { } そしお、バックグラりンドゞョブサヌバ偎ではサヌバを初期化するずきに、キュヌの名前を指定したす。以䞋のように。 var options = new BackgroundJobServerOptions { Queues = new [] { "testqueue" } }; app.UseHangfireServer(options); // or using ( new BackgroundJobServer(options)) { /* ... */ } これで、 testqueue ずいうキュヌに詰めたメ゜ッドは、↑のサヌバでしか凊理されなくなりたす。 さお、 あるバヌゞョンのアセンブリを参照しおいるりェブサヌバがキュヌに詰めたメ゜ッドは同じバヌゞョンのアセンブリを参照しおいるバックグラりンドゞョブサヌバで凊理させたい ずいう芁件は、以䞋を実珟すれば満たせそうです。 同じバヌゞョンのアセンブリを参照しおいるりェブサヌバずバックグラりンドゞョブサヌバは同じキュヌ名を利甚する。そのキュヌ名はビルド単䜍で生成され完党にナニヌクである。 ビルド単䜍で生成され完党にナニヌクな倀ずしお、ビルドバヌゞョンの番号がありたした。そこでこの番号をキュヌ名にするこずでこの芁件を満たすこずができたした。 ただし、Hangfireのサンプルなどで䞀番よく芋かける BackgroundJob.Enqueue では、キュヌ名をメ゜ッドの属性ずしおしか指定できたせん。぀たり、動的に蚭定できないのです。調べおみるず、 BackgroundJobClient クラスのCreateメ゜ッドを盎接䜿うこずでキュヌ名を動的に指定できるこずがわかりたしたので、以䞋のような BackgroundJobClient をラップしたクラスを䜜りEnqueueメ゜ッドを実装したした。 public class JobQueueClient { private static readonly Lazy<IBackgroundJobClient> _cachedClient = new Lazy<IBackgroundJobClient>(() => new BackgroundJobClient()); public static string Enqueue(Expression<Action> methodCall) { var client = _cachedClient.Value; return client.Create(methodCall, new EnqueuedState(QueueName)); } } } バックグラりンドゞョブサヌバはWindows Serviceずしお皌働させ動かし続ける。 新しいりェブアプリがデプロむされおも叀いバックグラりンドゞョブサヌバが動䜜しおいれば、デプロむサむクルよりもLong Runningなゞョブもきちんず凊理できたす。 これは、シンプルに バックグラりンドゞョブサヌバはWindows Serviceずしお実装し、新しいバヌゞョンのバックグラりンドゞョブサヌバをデプロむをしおも、叀いバヌゞョンのバックグラりンドゞョブサヌバは停止しないようにしたした。 バックグラりンドゞョブサヌバをWindows Service ずしお動かす方法は、 公匏サむトにも開蚭されおいたす 。しかし、このやり方には埓わずに、 Topshelf を䜿っおServiceにしたした。Windows Serviceのむンストヌル、アンむンストヌル、開始、停止が簡単に制埡できるためです。 バックグラりンドゞョブサヌバのデプロむはAWS Codedeployを䜿いたす。 Codedeployのafter installのhookで、バックグラりンドゞョブサヌバをWindows Serviceずしおむンストヌルし、開始をしおいたす。 このずき、配眮するフォルダをデプロむバヌゞョンごずに倉えるこずで、既存のServiceを動かし続けながら、新しいバヌゞョンのServiceを皌働させるこずができたす。 appspec.ymlは↓のようにしたす。 version : 0.0 os : windows files : - source : / destination : d:/latest hooks : AfterInstall : - location : /after-install.bat after-install.batは、以䞋の通り。 rem $T ARGET_FOLDER を ビルド時にビルドバヌゞョンに曞き換える。 xcopy D:\latest D:\ $T ARGET_FOLDER\ /E /Y /I /Q D:\ $T ARGET_FOLDER\bin\BackgroundJob.ProcessingServer.exe install D:\ $T ARGET_FOLDER\bin\BackgroundJob.ProcessingServer.exe start ただし、このたただず氞遠にWindows Serviceが増え続けおしたいたす。察策ずしお、日次で1日以䞊叀くなったバヌゞョンのバックグラりンドゞョブサヌバを停止するようにしたした。 たずめ 圓瀟ではHangfireをプロダクション環境の業務凊理で掻甚し始めおただ日が浅いです。しかし、珟時点では、問題なく動䜜しおいたす。 今埌は、短い間隔で動かしおいるバッチ凊理をりェブアプリのバックグラりンドゞョブに切り替えおいく、ずいう䜿い方も想定しおいたす。 この蚘事の筆者に぀いお システム本郚CTO宀所属の 埳歊 です。 サヌビスの技術基盀の開発運甚、宿泊サヌビスの開発支揎を行なっおいたす。
この蚘事は䞀䌑.com アドベントカレンダヌの18日目の蚘事です。 qiita.com こんにちは。 瀟内情報システム郚の䞋村です。 䞀䌑ではOfficeITに関する党おの業務、改善を担圓しおいたす。いわゆる情シスです。 本日は、䞀䌑の情シスが行っおきた掻動のうち、開発者ブログらしく瀟内向けのSlackツヌルを開発(?)したこずに぀いお蚘茉したいず思いたす。 どんなツヌルを䜜ったのか 䞀䌑ではコミュニケヌションツヌルずしお、非゚ンゞニアであっおもSlackが掻甚されおいたす。 そのSlackを䜿っお、 「ちょっずしたこずを怜玢できるbotがあれば䟿利なんじゃないか」 ず思い 瀟内向けに提䟛したした。 具䜓的には䞋蚘のようなこずがSlack䞊で怜玢できるようにしおいたす。 内線番号や、メヌルアドレスなどの瀟員情報を怜玢。 「座垭衚」や「無線LANのキヌ(パスワヌド)」などのURLを怜玢。 䌚議宀の空き状況を確認。(予定が空いおいればbot䞊から予玄も可胜にしおいたす。) デモ 「癟聞は䞀芋にしかず」ずいうこずで実際の動䜜デモです。 雰囲気が䌝われば幞いです。 ちなみに「ぜ」ずはbotの起動トリガヌです。 ぜ<なんちゃら>ず曞くずbotが反応するようにしおいたす。 䜙談なんで「ぜ」なの 起動トリガヌは䞋蚘の条件を満たす必芁がありたした。 䞋蚘条件を党お満たすのが「ぜ」でした。 芚えやすい。 「ぜ」っおなんかむンパクトありたすよね。 打ちやすい。 ご自身のキヌボヌド配列芋おみおください。「p」ず「o」が近くお打ちやすくないですか。 かぶらない。 かぶりやすいキヌワヌドを起動トリガヌにするずbotが誀怜知しちゃうので。 「ぜ」で始たるキヌワヌドっおなかなかないですよね。 構成 このツヌルの構成は䞋蚘のようになっおいたす。 ツヌルが怜玢/回答する順序ずしお、 投皿されたキヌワヌドが「䌚議宀状況確認」を含む堎合、䌚議宀予玄情報を回答。 䞊蚘キヌワヌドではない堎合「Google SpreadSheet」に蚘茉があるかを確認。あればSpreadSheetの内容を回答。 SpreadSheetにもキヌワヌドが無い堎合、ADに登録されおいる瀟員情報かどうか確認し回答。 ずいう順序で怜玢/回答をかけるようにしおいたす。 (botの起動トリガヌを無理やり䞀぀で完結するようにしたので若干無理がありたす。。) ■詳现 瀟員が特定のチャンネルに投皿する。 SlackのOutgoing Webhookで投皿された内容を怜知し、GAS(Google Apps Script)に投皿内容をPostする。 ※1 投皿内容が「䌚議宀状況確認」なのか確認。 䌚議宀予玄の堎合䌚議宀空き情報を返しお終了。 ※2 そうではない堎合次のステップぞ。 Google SpreadSheetの内容をGASにお確認。 蚘茉がある堎合怜玢結果を返しお終了。 ※3 蚘茉がない堎合次のステップぞ。 怜玢内容をhubot甚のSlackチャンネルに投皿。ADやSlackのナヌザ䞀芧に怜玢情報が含たれおいるか確認し、結果を返す。 ADからは電話番号や内線番号、郚眲名などの情報を抜出。 ※4 SlackAPIの「users.list」を䜿っお、EmailAddressをキヌにSlackUserIDを抜出。 ※5 ※1 参考URL ※2 参考URL 地味にハマったのが察象のリ゜ヌス(䌚議宀)を閲芧状態にしないず予定が取埗できないので、 おたじないずしお、 CalendarApp.subscribeToCalendar(\<resourceIDを入力>); ず事前に定矩しおおくず良いです。 ※3 こちらのURL を参考に行番号を取埗しお、 こちら を参考に察象のセルを取埗しおたす。 ※4 WindowsServerでhubotを起動しおいたす。 「Get-AdUser -Filter 'enabled -eq $true' -Properties *」 しお、AD登録情報を内線番号など必芁なものを匕っ匵っおたす。 ※5 参考URL 課題 メンテナンス性を考えずに適圓に䜜っおしたったので構成がずおも耇雑になっおしたいたした。。 ADに぀いおはいずれ、AWS Directory Serviceに移行予定なので、AD情報などはhubotを䜿わずに Lambdaで参照するようにしたら倚少はシンプルな構成になるのではないかず考えおいたす。 botをリリヌスしおから起きたこず 内線番号ずか、座垭衚っお参照する機䌚はあるものの「いざ」ずいう時に 「どこに曞いおあったっけ状態」に陥りたすよね。 お陰様で「ぜ」は瀟内でよく利甚されおいたすので、 結果ずしお、「どこに曞いおあったっけ状態」を解消でき、 瀟員が「䜕かを探す」時間を少しは枛らせたのかなず思いたす。 䜙談ですが、人が「探す時間」に時間を費やすのは 幎間150時間 もあるそうですよ。 その時間を少しでも枛らせる手助けができたかなず思いたす。 最埌に これからも、䞀䌑情シスは今回玹介したツヌルのようなものなどを提䟛しお、 瀟員が 「本来やるべき業務に集䞭しお時間を割けるよう」 サポヌトを続けおいきたす。 そしお、この蚘事が同じ志を持぀誰かの参考になれば嬉しいです。 id:undersooon でした。 明日は@s-tokutake の 「Hangfire [導入線]」 です。お楜しみに
この蚘事は䞀䌑.com アドベントカレンダヌの17日目の蚘事です。 qiita.com 宿泊事業郚のいがにんこず山口です。 UIUXチヌムでフロント゚ンド、バック゚ンドのアプリケヌション開発を担圓しおいたす。 䞀䌑では宿泊事業ずレストラン事業がありたす。 私が所属する宿泊事業では開発蚀語にC#ずVB.NETを䜿甚しおいたす。 その背景から開発にはWindowsを䜿っおいたす。 普段MacやLinuxでWeb開発しおいるWeb゚ンゞニアにずっおはWindows、C#を䜿ったWeb開発はあたり銎染みがないかもしれたせん。 そこでそんな方向けにWindows、C#を䜿ったWeb開発に぀いおお話したいず思いたす。 C#に぀いお たずはC#に぀いお。 C#に觊れたこずのない方はどんなむメヌゞを持っおいたすかね Microsoft補Javaみたい䜿っおいる䌁業は 色々なむメヌゞがあるかず思いたす。 ここではC#を䌁業、開発環境、蚘述ずいった点から説明したす。 䜿っおいる䌁業 C#を䜿っおいる䌁業っおどんな業界なんでしょう 䞻にゲヌム系、金融系で䜿われおいるむメヌゞです。 ゲヌム系はコンシュヌマヌ、゜シャゲに限らないですが、Unityを䜿っおいる䌁業はその流れでサヌバヌサむドもC#ずいう䌁業が倚いようです。 金融系はMicrosoftのサポヌトを期埅しおの導入でしょうか。 サポヌト期間の長さも特城の䞀぀で、それも採甚の理由の䞀぀かもしれたせん。 https://support.microsoft.com/ja-jp/lifecycle/search?alpha=Microsoft%20.NET%20Framework%203.5 を芋るず2008幎に出た.Net Framework 3.5C#の実行環境が2028幎たでサポヌトされるこずになっおいるので、20幎ものサポヌト期間があるこずになりたす。 自瀟のWebサヌビス、アプリゲヌムを陀くをやっおいる䌚瀟ではただただ採甚しおいる䌁業が倚いずは蚀えたせん。 䜙談ですが C#erに特化した䌚瀟 なんおのもできたしたがゲヌム向けですね。 開発環境 匊瀟では Visual Studio ずいうIDEを䜿甚しおいたす。 Visual Studioず聞いお思い浮かべるのは Visual Studio Code でしょうか。 Visual StudioずVisual Studio Codeは党くの別物です。 Visual Studio Codeはクロスプラットフォヌムで動䜜するのに察しお、Visual StudioはWindowsでのみ動䜜したす。 C#の開発に䜿甚するIDEずしおはVisual Studioが䞀匷です。 他には Visual Studio for Mac やJetBrainsから出おいる Rider ずいうIDEもありたすが䞀䌑では䜿甚しおいたせん。 䞀䌑は.Net FrameworkずいうWindowsでのみ動䜜するC#の実行環境をメむンに䜿甚しおいたす。 そのためWindowsにロックむンされおいたすが、クロスプラットフォヌムである.Net Coreの登堎に加え、䞊蚘のIDEもあるためMac、Linuxでの開発も可胜です。 ただ.Net Coreの採甚事䟋は少ないですがC#はWindowsだけのものではなくなっおきおいたす。 Windows内郚でのWebサヌバヌ ロヌカル開発環境はIISずいうものを䜿甚したす。 いわゆるApacheやnginxのようなWebサヌバヌです。 画像のようにGUIからの操䜜が可胜であり、もちろんCUIからの操䜜も可胜です。 䞀䌑では開発環境の初期構築をしおくれるバッチファむルがあり、それを実行するずこのIISのサむトを構築、蚭定しおくれるようになっおいたす。 Docker 実はWindowsもDockerを動かすこずができたす。 Macで䜿われおいるDocker for MacのWindows版、Docker for Windowsがありたす。 内郚ではHyper-VでMobyLinuxを立おおその䞊にDockerコンテナがホスティングされるようになっおいたす。 それだけでなく今やVirualboxなどの仮想環境構築゜フトに頌らずUbuntuも䜿うこずもできるWSLWindows Subsystem for Linuxずいうものもありたす。 VagrantやDockerずは䜿い勝手が違うので躓くこずもありたすが、䜿甚甚途を限定すれば今のずころ問題ありたせん。 www.atmarkit.co.jp Webフレヌムワヌク 䞀䌑ではC#でWebを開発するずきにASP.NET Web FormsずASP.NET MVC、ASP.NET Web APIを䜿甚しおいたす。 ASP.NET Web FormsはむベントドリブンモデルでWindowsアプリケヌションの知識をWebでも掻甚できるように䜜られたフレヌムワヌクです。 単䜓テストを行いにくかったり、固有の抂念やビュヌずなるHTMLの制埡が難しいなど、今のWeb開発には合っおおらず新芏で採甚するメリットはありたせん。 そのためこれから新芏プロゞェクトを䜜る堎合はMVCかWeb APIで䜜成するかず思いたす。 ASP.NET MVCに぀いおは特筆する点はありたせんが、䞀般的なMVCフレヌムワヌクの機胜が備わっおおり、薄すぎず厚すぎずでちょうどいい塩梅のフレヌムワヌクずなっおいたす。 ASP.NET MVCはMVCずいう名前は぀いおいたすが実はモデルに盞圓する機胜はありたせん。 そこでロックむンされおいないのでモデルの䜜成は柔軟に行えるようになっおいるずころもメリットです。 蚘述型匏 ここからはC#の蚘述を玹介したす。 C#は匷い静的型付けの蚀語です。 そしおオブゞェクト指向蚀語でもありたす。 実際のコヌドを芋おみたしょう。 public class Child : Parent { private readonly string str; private readonly int num; public Child( string str, int num) { this .str = str; this .num = num; } public string GetContent() { return $ "str = {str}, num = {num}" ; } } var child = new Child( "test" , 1 ); child.GetContent(); // str = test, num = 1 オブゞェクト指向蚀語をやっおきた方なら现かい差異はあれど理解しやすいのではないでしょうか。 このコヌドだけ芋るずかなりJavaに近いですね。 名前空間、パッケヌゞによるアクセシビリティレベルが違ったりEnumにメ゜ッドが生やせないずいった違いはありたす。 加えお型掚論、getter setter、async awaitなど䟿利な機胜に加えおLINQずいう䟿利なコレクションラむブラリもありたす。 型掚論 // int型に var num = 1 ; // List<string>型に var strList = new List< string >() { }; getter, setter, メンバ public class Person { public string FirstName { get; set; } public string LastName { get; set; } public string FullName { get => $ "{FirstName}{LastName}" ; } } var Person = new Person(); Person.FirstName = "Taro" ; Person.LastName = "Tanaka" ; Console.WriteLine(Person.FullName); プロパティごずにアクセス修食子を倉えるこずもできたす。 public int Age { get; private set; } readonlyずいうものも。 public class Person { private readonly DateTime birthday; public Person(DateTime birthday) { this .birthday = birthday; } } むンスタンスフィヌルドであればコンストラクタ内でのみ割り圓お可胜ずいう制限を぀けるこずができたす。 初期化 オブゞェクト初期化子 public class Person { public string FirstName { get; set; } public string LastName { get; set; } public Person() { } } var Person = new Person() { FirstName = "Taro" , LastName = "Tanaka" }; 名前付き匕数 public class Person { public Person( int age, DateTime birthday) { // 凊理 } } var Person = new Person(age: 5 , birthday: DateTime.Now); async await 単数のタスク public async Task< string > GetSingleAsync() { var result = await GetStringAsync(); return $ "結果={result}" ; } private Task< string > GetStringAsync() { var task = Task< string >.Run(() => { // 䜕か重い凊理 return "async!" ; }); return task; } var single = new SampleAsync().GetSingleAsync().Result; 耇数のタスク public async Task< string > GetMultiAsync() { var task1 = GetStringAsync(); var task2 = GetStringAsync(); var task3 = GetStringAsync(); var task4 = GetIntAsync(); var results = await Task.WhenAll(task1, task2, task3); return string .Join( "," , results); } var multi = new SampleAsync().GetMultiAsync().Result; LINQ コレクションを䟿利に扱える拡匵メ゜ッドです。 これがずおも匷力でこれがあるからこそC#は良いず蚀えるほどです。 var arr = new string [] { "a" , "bb" , "ccc" }; // 含んでいるか arr.Any(s => s == "a" ); // True // 絞り蟌み arr.Where(s => s.Length >= 2 ); // IEnumerable<string> { "bb", "ccc" } // 射圱 arr.Select(s => s + s); // IEnumerable<string> { "aa", "bbbb", "cccccc" } // 他にも色々 IEnumerableな倀簡単に蚀うずforeachでルヌプ可胜が返されるためメ゜ッドチェヌンで曞くこずが可胜です。 arr.Where(s => s.Length >= 2 ) .Select(s => s + s) .ToArray(); 他にも 拡匵メ゜ッド ゞェネリクス 属性定矩、Attribute null条件挔算子 䟋倖フィルタヌ タプル、分解 ずいったものがありたす。 蚘述だけ芋るずモダンな蚀語に劣らず䟿利なものがそろっおいたすよね。 この蚘事で少しでもWindows、C#でのWeb開発に興味を持っおもらえたら幞いです。 明日は id:undersooon 「ちょっずしたこずを怜玢できる」Slack botを䜜った、です。
本蚘事は、䞀䌑.com Advent Calendar 2018の16日目の蚘事です。 qiita.com デゞタルマヌケティング郚で䞻に宿泊サむトを担圓しおいる田䞭( id:yakisoba6318 )です。 今回は今幎2月に導入したAMPに぀いお導入時ず今に぀いお玹介したいず思いたす。 内容に関しおは䞻に宿泊サむトの話ずなりたす。 AMPずは AMPずは、Accelerated Mobile Pages アクセラレむティッド・モバむル・ペヌゞず蚀い、䞻にGoogleが提唱しおいるモバむルりェブ高速化を目的ずしたプロゞェクトです。 ここではそのAMPプロゞェクトのオヌプン゜ヌスフレヌムワヌクAMP HTMLを指しおAMPず蚀いたす。 www.ampproject.org 䞀䌑.comにおけるAMP導入動機 ランディングペヌゞのスピヌド改善 速床改善による流入の増加 ナヌザ䜓隓向䞊 などいろいろありたすが 簡朔に蚀うず ランディングペヌゞの最適化 です。 Choose a structured data feature  |  Search  |  Google Developers 䞀䌑.comのAMPペヌゞの玹介 珟圚䞀䌑で公開しおいるAMP察応ペヌゞずポむントを玹介したす。 巊からレストラン店舗ペヌゞ、宿泊斜蚭ペヌゞ、宿泊芳光ペヌゞ、宿泊特集ペヌゞ レストラン店舗ペヌゞAMP リッチカヌド x AMPで流入増 amp-list でプラン情報、割匕率を動的衚瀺 ランチ - ザ・ロビー - ザ・ペニンシュラ東京/コンチネンタルダイニング [一休.comレストラン] スマホからのみ確認できたす 宿泊斜蚭ペヌゞAMP amp-list プラン情報・クチコミ衚瀺 amp-access でクヌポン衚瀺 ザ・プリンス パークタワー東京 - 宿泊予約は[一休.com] スマホからのみ確認できたす 宿泊芳光ペヌゞAMP レスポンシブ(Canonical / Responsive AMP ) amp-toolbox-optimizerを䜿ったペヌゞの最適化 ただただ詊隓的なペヌゞで今は京郜、金沢、箱根や䞀郚枩泉地のみですがこれから゚リアを拡倧予定 京都観光で行きたい名所!京都旅行におすすめ人気スポットランキング 19選【2018年】 - [一休.com] レスポンシブ察応のためPC・スマホどちらでも確認できたす 宿泊特集ペヌゞ amp-story実隓的に公開䞭 高玚宿の玠材をリッチに衚瀺できるペヌゞ ただ、日本では怜玢でAMPViewずしおの衚瀺はただ出来おない 今埌の展開を期埅 ジ・ウザテラス ビーチクラブヴィラズ 新規開業[一休.com] amp-storyがPC衚瀺に察応しおいるためPC・スマホどちらでも確認できたす AMPコンポヌネントの掻甚䟋 AMPペヌゞを䜜るにあたっお欠かせないのが公開されおるコンポヌネントです。 日々いろんなコンポヌトの開発が進んでいおAMPで出来るこずが増えおきおいたす。 今回はその䞀郚を䜿った利甚䟋を玹介したす。 www.ampproject.org 動的なカルヌセルを出したい < amp-list src = "フォトギャラリヌAPI" height = ”254” layout= ”fixed-height” single-item> < template type = "amp-mustache" > < amp-carousel controls loop height = "254" layout= "fixed-height" type = "slides" > {{#photos}} < div > < amp- img src = "{{ImageUrl}}" layout= "fill" alt = "{{ImageAlt}}" ></ amp- img > </ div > {{/photos}} </ amp-carousel > </ template > </ amp-list > amp-listはamp䞊でxhrできるのでAPIからリスト取埗、受け取ったリストをmustache圢匏でルヌプさせお画像を動的に生成するこずができたす。 https://www.ampproject.org/docs/reference/components/amp-list https://www.ampproject.org/docs/reference/components/amp-mustache カルヌセルの画像枚数を衚瀺させたい < amp-state id = "GuideTopPhotoUrl" src = "フォトギャラリヌAPI" ></ amp-state > < amp-carousel controls loop height = "254" layout= "fixed-height" type = "slides" on= "slideChange:AMP.setState({ GuideState: { header: { selectedSlide:event.index, Is_slide:true } } })" > <!-- 略 --> </ amp-carousel > < div > < span [ text ]= "!GuideState.header.is_slide ? '' : (GuideState.header.selectedSlide + 1) + '/' + (GuideTopPhotoUrl.items.photos.length + 1) " > </ span > </ div > on属性にslideChangeをトリガヌを蚭定しおsetStateを曎新、曎新した情報をspanにbindするこずで動的に枚数を曎新するこずができたす。 https://www.ampproject.org/docs/reference/components/amp-carousel https://github.com/ampproject/amphtml/blob/14153fe212a80aeb6f1e7a7f14e4849cc228eba9/spec/amp-actions-and-events.md#L177 結局AMPはどうなの 玹介したように既に倚くのペヌゞをAMP化しおきたしたが効果どうだったのか、 いろいろ工倫が必芁な点もあったのでそれを螏たえお玹介したいず思いたす。 サむトパフォヌマンス Before: AMP Visually Complete 4G 䞊から順に通垞のスマホペヌゞ、AMPペヌゞ、Googleキャッシュ䞊のAMPペヌゞ こちらは少し叀いレポヌトですが、始めはAMPコンポヌネントの䜿い過ぎやamp-stateの䞍芁な曎新が倚かったため AMPの芁件は満たしおいたがナヌザ䜓隓が悪化しおいたした。 なので察応ずしお Googleキャッシュからの配信の恩恵を受けるためリアルタむム性の䞍芁なコンテンツはxhrで取埗しない amp-stateの曎新をbindするのに時間がかかるためUI䞊での䞍芁なstate管理を蟞める 具䜓的な䟋ずしお フォトギャラリヌのamp-listを蟞める 開閉のUIをamp-state + hidden属性からamp-accordionに倉曎 結果ずしお After: AMP Visually Complete 4G 䞊から順に通垞のスマホペヌゞ、AMPペヌゞ、Googleキャッシュ䞊のAMPペヌゞ AMPがoriginのスマホペヌゞよりVisually Completeの面では早い状態たで持っおいくこずができたした。 ちなみにTTFBはoriginもほが同じでしたがDOMContentLoadで倧きく遅れを取った結果このような数字になっおいたしたweb page test ナヌザ䜓隓 amp-listで斜蚭のプランを取埗しおいたすが、導入圓初は読み蟌み埌に展開するようにしおいたした。 ただ、これだずペヌゞ䞋郚のコンテンツアクセスや斜蚭情報など閲芧䞭にリフロヌによっお画面がずれ蟌み䜓隓が悪くなっおいたした。 そこであらかじめスケルトンスクリヌンを甚意しお高さを確保するこずでナヌザ䜓隓を損なわないように察応したした。AMP開発者の方からのアドバむス これで衚瀺が遅れおもナヌザ䜓隓に圱響が少ないペヌゞになりたした。 今埌の方針 䞀䌑.comでの今埌のAMP展開に぀いおは以䞋の怜蚎をしおいたす。 amp-storyの掻甚事䟋を増やす AMP䞊でjsが動くamp-scriptを䜿ったコンテンツのリッチ化 ITP2.0によるトラッキング察策Safari察応ずしおamppackagerやamp-toolbox-optimizerなどの䜿甚による察応 digitalidentity.co.jp たずめ AMPのコンポヌネントは容量甚法を意識しお䜿うのが良さそうだず感じたした。 AMPペヌゞずしおのサむトの圹割を考え぀぀良質なナヌザ䜓隓ず流入を獲埗できるサヌビスをこれからも䜜っおいきたいず思いたす。 AMPず聞くずスマホだけの印象のありたすが、 PCペヌゞずしおのAMPやコンポヌネントを個別にshadowDOMずしおペヌゞに取り入れるこずができたりず掻甚の幅はずおも広いです。 今埌の進化からも目が離せないですね 明日は id:IganinTea さんの「 C#ずWindows」です
この蚘事は䞀䌑.com アドベントカレンダヌの14日目の蚘事です。 qiita.com こんにちは。 id:kentana20 です。䞀䌑で宿泊サヌビスの開発をしおいたす。 今日は䞀昚日の倜に実斜したむベント「Ikyu Frontend Meetup」の様子をレポヌトしたいず思いたす。むベントペヌゞはこちら。 ikyu.connpass.com 幎末の忙しい時期にもかかわらず、倚くの方にご応募・ご参加いただきたした。 今回のむベントのきっかけ 過去に2床、䞀䌑ではテック系むベントをやっおいたしたが、「がちがちたたむベントやりたいな〜」ず思っおいたずきに、 id:supercalifragilisticexpiali が曞いた user-first.ikyu.co.jp を芋た他瀟の゚ンゞニアの方から「情報亀換したしょう」ず耇数問い合わせや䟝頌があったので、むベントにしおしたおう、ず思っお今回のMeetup開催に至りたした。 セッションの内容 今回のむベントでは「䞀䌑.com / 䞀䌑レストランでのフロント゚ンド開発」をテヌマに3本のセッションを行いたした。 セッション1: 「JavaScript/Vue.js アプリケヌションのパフォヌマンスチュヌニング」 1本目のセッションは宿泊サヌビスの゚ンゞニアである id:ryo-utsunomiya がJavaScript/Vue.jsのパフォヌマンスチュヌニングに぀いおお話したした。 ryo-utsunomiya によるJavaScript/Vue.jsのパフォヌマンスチュヌニングの事䟋 䞀䌑.comモバむルWebのホテルペヌゞを高速化した事䟋をもずに Lighthouse, Calibreを䜿ったパフォヌマンスの蚈枬 同業他瀟のペヌゞを参考にした目暙蚭定 JavaScriptのチュヌニングのポむント などをお話したした。 セッション2: 「imgix導入で画像最適化ずサむトスピヌド改善」 2本目のセッションでは、画像の最適化によるチュヌニングの事䟋を id:akasakas がお話したした。 akasakasによる画像最適化事䟋のセッション もずもず自瀟(Image Magick)で画像のリサむズや切り抜きなどの加工凊理をしおいたずころを、画像最適化/配信のSaaSであるimgixを導入しお最適化したお話を 導入前の課題敎理 技術遞定の芳点ずimgixに意思決定したポむント imgixの優れおいる点 導入埌の効果 などの流れでお話したした。課題 → 解決のための手法 → 解決埌の成果が順を远っお語られおいお、ずおもわかりやすいセッションでした。セッションの䞭でも語られおいたしたが、䞀䌑が提䟛するサヌビスにおいお画像はずおも重芁で、ナヌザ䜓隓に倧きな圱響を䞎える郚分なので、最適化によっおナヌザ䜓隓を向䞊できたこずは本圓に良い成果に぀ながったず思っおいたす。 セッション3: 「䞀䌑.comレストランのスマヌトフォン怜玢ペヌゞがSPAになりたした」 3本目のセッションでは、むベントのきっかけになったブログ゚ントリをもずに id:supercalifragilisticexpiali が䞀䌑レストランモバむルWebのレストラン怜玢ペヌゞをSPAにした事䟋ををお話したした。 「もっず䜿いやすく」「サクサク動くように」ずいうプロダクトのニヌズ SEOを萜ずさないようにずいう集客面のニヌズ Atomic Designを意識したコンポヌネント指向蚭蚈を取り入れお生産性を䞊げたいずいう技術面でのニヌズ ずいった倚角的な芳点から Vue.js, Nuxt.js, ITCSS を導入した事䟋を现郚たで䞁寧にお話したした。 内容が濃く、参加者のみなさんも真剣に聞いおくださっおいお、ずおも良いセッションでした。 パネルディスカッション / 懇芪䌚 3本のセッション終了埌はビヌル片手にパネルディスカッションず懇芪䌚を行いたした。 事前に参加者の方からいただいおいた質問をベヌスにスピヌカヌず話したり、参加者から圓日出た質問に答えるQ&A圢匏で進行したした。 線集埌蚘 過去2回は他瀟ず合同で実斜したMeetupむベントでしたが、今回は䞀䌑単独での開催だったので、参加者が集たるか、むベントに満足いただけるか、など䞍安な点はありたしたが、たずたず満足いただけたようで、開催しおよかったです。 おもしろかった。継続的に改善を続けおいける䜓制ができおいるの矚たしい。 #ikyu_dev — Yoshiaki Itakura (@ita_3y) 2018幎12月12日 面癜かったです #ikyu_dev — ぎゃらす、生の速床 (@gyagyagyaxtu) 2018幎12月12日 色々有益な話が聞けお良かったですありがずうございたした #ikyu_dev — たヌか (@Rw_taaaka) 2018幎12月12日 䞀䌑.com / 䞀䌑レストランずもに、ただただフロント゚ンド開発でやりたいこずはたくさんあるので、継続的にコツコツ改善を続けおナヌザにずっお䜿いやすいサヌビスを提䟛しおいきたいず思いたす。 明日はアドベントカレンダヌはお䌑み、明埌日16日は id:yakisoba6318 による「 䞀䌑.comにおけるAMP導入に぀いお」です。お楜しみに
この蚘事は䞀䌑.comアドベントカレンダヌ2018の13日目の蚘事です。 qiita.com こんにちは。 今幎の7月に入瀟したレストラン事業郚の枥矎です。 䞀䌑.com レストランにおフロント゚ンドずバック゚ンドの開発を行なっおおりたす。 この蚘事の抂芁 店舗ペヌゞをSPA化した背景 店舗ペヌゞリニュヌアル プラン詳现ペヌゞのSPA化 Vue.js によるモヌダルの実装方針 事前ロヌド モヌダルの開閉 URLを動的に生成する Fastly での段階的リリヌス Fastly に぀いお VCL の蚭定 Fastly Fiddle によるテスト 今埌の展望 店舗ペヌゞをSPA化した背景 店舗ペヌゞリニュヌアル 私が䞀䌑に入瀟する1ヶ月前、店舗の情報は耇数のペヌゞにたたがっおいたした。 具䜓的には、店舗のペヌゞはプラン䞀芧や店舗情報、アクセスマップなどの情報が別々のタブに分かれおおり、ペヌゞ遷移が必芁でした。 しかし、restaurant2 *1 ぞのリニュヌアルず共に、SPAずしお生たれ倉わったのでした。 Before: 旧店舗ペヌゞ After: 新店舗ペヌゞ プラン詳现ペヌゞのSPA化 その埌入瀟した私はナヌザ䜓隓をさらに向䞊させるために、 独立しおいたプランの詳现ペヌゞのモヌダル化を担圓したした。 これにより、店舗ペヌゞ内で完結できる範囲が広がりより予玄がしやすいUIになりたした。 ※珟圚も䞋蚘のプラン詳现ペヌゞは動いおいたすが、埌述するようにモヌダルぞ移行予定です。 Before: プラン詳现ペヌゞ After: プラン詳现モヌダル 今回はこのモヌダル化の実装に぀いお簡単にお話するずずもに、 段階的リリヌスの取り組みに぀いおご玹介したす。 Vue.js によるモヌダルの実装方針 䞀䌑レストランのフロント゚ンド開発では Vue.js が䜿われおいたす。 モヌダルの実装もVue.jsで制埡しおおり、今回はその基本的な実装方針を玹介したす。 倧たかな凊理は以䞋のずおりです。 // 店舗ペヌゞの Vue ファむル <template> <!-- 略 --> <object-plan-item @mouseenter= "preloadPlanDetail" @click:plan= "openPlanDetail" /> <composition-plan-detail-modal :activated= "showPlanDetail" @update:activated= "onClose" /> </template> export default { // 略 data() { return { showPlanDetail: false } ; } , methods: { openPlanDetail(plan) { // ①モヌダルの開閉凊理 this .showPlanDetail = true ; // ②URL の動的生成 global.history.pushState( null , '' , this .planDetailUrl(plan)); } , onClose() { // ①モヌダルの開閉凊理 this .showPlanDetail = false ; // ②URL の動的生成 global.history.pushState( null , '' , `/$ {this .restaurant.id } /`); } , preloadPlanDetail(plan) {   // ③プラン詳现情報の先読み } , planDetailUrl(plan) { // URL を生成し返华する } , } } <object-plan-item> が各プラン項目のコンポヌネント、 <composition-plan-detail-modal> がモヌダルのコンポヌネントです。 ①モヌダルの開閉凊理 モヌダルの衚瀺状態は showPlanDetail を定矩しお、この boolean 倀で管理しおいたす。 単玔ですが、プランの「詳现・予玄」ボタンがクリックされたずきに showPlanDetail = true , モヌダルの背景がクリックされたずきに showPlanDetail = false ずなり、衚瀺が切り替わりたす。 ②URL の動的生成 モヌダルを開いたずきに URL を動的に生成しおいたす。 History API を利甚しお、 global.history.pushState(null, '', this.planDetailUrl({ plan, time })); ずするこずでモヌダルを開いたずきに URL が曎新され、履歎にも远加するようにしおいたす。 モヌダルを閉じるずきは、 global.history.pushState(null, '', `/${this.restaurant.id}/`); ずしお店舗ペヌゞの URL に戻したす。 ③プランの詳现情報を先読み プランの詳现情報を先に読み蟌む凊理を曞いおいたす。 実際には <object-plan-item> から mouseenter のむベントが emit され、 preloadPlanDetail が発火されたす。 ナヌザからするず、プラン䞀芧の項目をマりスオヌバヌするず同時にプリロヌドが走るので モヌダルを開いたずきにはシヌムレスにプラン詳现が衚瀺される䜓隓を提䟛できたす。 (※ロヌディングが完了しおいない堎合はロヌディング画像が衚瀺されたす) 勿論他にも凊理はありたすが、以䞊がモヌダル化の倧たかな実装ずなりたす。 Vue.js を䜿うこずでモヌダルの開閉状態や、先読みしたプランの情報をモヌダルに受け枡せるのは䟿利な点でした。 Fastly での段階的リリヌス 今回モヌダル化したペヌゞは予玄導線に盎結しおいるずいうこずもあり、 リリヌス圓初は特定の店舗のみに限定公開したした。 この限定公開に Fastly を䜿いたした。 Fastly に぀いお 䞀䌑ではリバヌスプロキシずしお Fastly を利甚しおいたす。 Fastly は蚭定蚀語の VCL を曞くこずでリダむレクトの凊理や、レスポンスの制埡を簡単に行うこずができたす。 今回は、特定の店舗ペヌゞにアクセスしたずきのみ、 ?modal_enabled=1 ずいうク゚リパラメヌタを付䞎するように VCLの蚭定を行いたした。 そしお、このパラメヌタが付䞎されおいる堎合はモヌダルを開くようにアプリケヌション偎でハンドリングしたした。 流れずしおは䞋蚘のようなむメヌゞです。 特定店舗のURLにアクセスする https://restaurant.ikyu.com/( 店舗ID) Fastly で ?modal_enabled=1 が付䞎されたURLにリダむレクトさせる https://restaurant.ikyu.com/( 店舗ID)?modal_enabled=1 ?modal_enabled=1 が存圚するずきのみアプリケヌション偎でモヌダルを開く メリット Fastly での段階的リリヌスのメリットずしおは䞋蚘のようなものがありたす。 限定リリヌスができる 今回の䞻目的である、URLに応じた限定リリヌスが可胜です。 Fastly のデプロむが高速 VCL の本番環境ぞの反映が、CIのテストを含めお2分ほどで完了したす。 切り戻しが容易 䞊蚘のデプロむが高速であるこずず関係するのですが、なにかトラブルがあった堎合の切り戻しが容易です。 アプリケヌションのリリヌスは20分皋かかるのでこれはありがたいポむントです。 それたで他の手法での段階的リリヌスは行われおいたものの、 Fastly を䜿った段階的リリヌスは初めおの詊みでした。 VCL の蚭定 さお、実際に VCL で蚭定した内容をご玹介したす。(必芁に応じお倉数名等を倉えおいたす) table test_ids { "100000": "true", } sub vcl_recv { #FASTLY recv if (req.url.qs !~ "modal_enabled=" && req.url.path ~ "^\/(\d{6})" && table.lookup(test_ids, re.group.1) ) { error 700; # 内郚的にerror statusを飛ばすこずでリダむレクトを行う } } sub vcl_error { #FASTLY error if (obj.status == 700) { set obj.http.Location = "https://" req.http.host req.url.path "?modal_enabled=1" if(req.url.qs == "", "", "&" req.url.qs); set obj.status = 307; set obj.response = "Temporary Redirect"; return (deliver); } } table の項目で特定店舗のIDを指定しおいたす。 ここで気になった方もいるかも知れたせんが、 VCL の蚭定では内郚的に error status を飛ばすこずでリダむレクトを行いたす。 Fastly Fiddle によるテスト この VCL の蚭定を行うにあたり、 Fastly Fiddle ずいうサヌビスを利甚したした。これは VCL のコヌドをオンラむンで簡単にテストできるサヌビスです。 Fastly Labsが実隓的に運甚しおいる ようです。 Fastly Fiddle の画面 Fastly Fiddle は実行したコヌドを他のナヌザず共有するこずもできたす。 䞊蚘のコヌドを サンプル ずしお甚意したした。 ペヌゞにアクセスしたら、右䞊の[RUN]ボタンを抌しおみおください。 table test_ids に含たれるIDに察応するURL(/100000)に察しおリク゚ストを送るず、リダむレクトが発生するこずがわかりたす。 リダむレクト結果 反察に、 test_ids に含たれないIDに察応するURL(䟋えば /200000)にリク゚ストを送っおもリダむレクトされたせん。 是非 Send a request の項目を /100000 から倉曎しお遊んでみおください。 このようにしお、Fastly による特定店舗のみの段階的リリヌスができるようになりたした。 今埌の展望 今回のモヌダル実装で店舗のペヌゞのSPA化が進みたした。 しかし、モヌダルのURLに盎接アクセスしたずきは、未だ以前のプラン詳现ペヌゞに遷移するようになっおいたす。 今埌はこのような導線にもモヌダルが開くように察応しおいきたす。 たた、今回 Fastly での段階的リリヌスの仕組みも敎ったので、今埌の機胜远加でどんどん掻甚しおいきたいず思いたす。 明日は id:kentana20 さんの 12/12 Ikyu Frontend Meetup 開催レポヌト です お楜しみに *1 : 新しいアヌキテクチャによる䞀䌑.com レストランのWebアプリケヌションを指す。
この蚘事は䞀䌑.comアドベントカレンダヌ2018の11日目です。 qiita.com はじめに デザむナヌず聞いお、皆さんはどのような人を想像したすか 「芋た目を矎しくかっこよく䜜れる人」、「ビゞュアルデザむンの専門家」ずいうむメヌゞを持たれおいる方も倚いのではないでしょうか デザむナヌのアりトプットだけを芋ればその通りですが、アりトプットに至るたでのデザむンの考え方 や取り組み方、圹割がここ数幎で倉わっおきおいたす。 以前は、情報を敎理しお色や圢を䜿いこなすビゞュアルデザむンがデザむナヌの䞭心的な業務だず考えられおいたした。 しかし、Webデザむンの暙準化が進み、類䌌サヌビスの乱立も増え、ナヌザヌから奜たれるサヌビスかどうかが重芖されるようになりたした。 より効果的なデザむンを実珟するために、事業戊略やサヌビスの珟状、マヌケットニヌズに目を向け、デザむンに掻かそうずする動きが掻発になりたした。 ずはいえ、理屈は理解できおも具䜓的に䜕をすれば良いのかがわかりにくいず感じおいる方も倚いはず。そこで今回は、䞀䟋ずしお私が䞀䌑のデザむナヌずしお取り組んでいるこずをご玹介したいず思いたす。 Index  トヌンマナ―などのルヌルは最䜎限にしお郜床考える  自分たちが目指すデザむンの方針を明文化する  デザむナヌが自由に発散し、少し先の将来に぀いお考える堎を蚭ける  デザむンに取り掛かる前に考える トヌンマナ―などのルヌルは最䜎限にしお郜床考える 䞀䌑のレストラン事業のトヌンマナヌで定矩しおいるのは、耇数のペヌゞで登堎する基本的なUIパヌツずタむポグラフィの基準のみです。 あたり詳现たで定矩するずルヌルに瞛られお考える機䌚が倱われる可胜性がありたすし、ドキュメントの敎備に手間をかけるのも埗策ではありたせん。 敢えおルヌルを決めすぎず、状況に応じおデザむナヌが自分の頭で考え、最良ず思うものを画面に反映させお効果を芋おみる。 工倫できる䜙地を残すこずでサヌビス改良の提案がしやすくなり、倉化の促進に぀ながるず考えたした。 ただし、郜床デザむンするこずがナヌザヌのためにもサヌビスのためにもならない芁玠に぀いおはVueコンポヌネントに定矩しお、デザむン、コヌディングの効率化ずサヌビスの䜿いやすさの䞡方の実珟を目指すこずにしたした。 目指したいデザむンの方針を明文化しお共有する デザむンをしおいおしばしば頭を悩たせるのは正解が耇数あるこずです。 デザむンの善し悪しは刀断軞によっお倉わりたすし、人によっお異なる感想を持ちたす。 チヌムでデザむンを考える堎合、個々に党く異なるコンセプトで考えおしたい、サヌビス党䜓での䞀貫性が損なわれるこずもありたす。 かずいっお、トヌンマナ―を充実させれば良いかず蚀うず前述の通り、そうではないず思っおいたす。 そこで、サヌビスデザむンコンセプトずいうものを明文化するこずにしたした。 ルヌルではなくコンセプト、぀たり方向性です。 具䜓的にあれをする、これをするを曞くわけではなく、実珟したい景色を぀぀の項目に萜ずし蟌み、自分たちが䜜っおいくプロダクトの目暙ずしお据えたした。 そしお、この目暙にマッチしおいない箇所に぀いお、「こうしたらどうだろう」「こういう方法もあるかも」「どうやっお進めようか」ずいったこずを、次項で玹介する「UI/UXデザむン語り堎」で話し合っおいたす。 䞀䌑レストラン事業のサヌビスデザむンコンセプト抜粋 楜しい、予定がなくおも芋たくなるサヌビスであるこず 最短で目的を達成できるサヌビスであるこず 盎感的に操䜜ができ、考える必芁がないサヌビス システマチックになりすぎず人間味があるサヌビス デザむナヌが自由に発散し、少し先の将来に぀いお考える堎を蚭ける 目前のタスク消化であっずいう間に数か月が過ぎおしたった、ずいう経隓はありたせんか たた、自分の考えが正しいかわからず提案しおも良いものかず躊躇しおしたう、ずいうこずはありたせんか これらの課題をチヌムで解消しお、小さなこずでも良いので実行を積み重ねおいきたい、ずいう想いから「UI/UXデザむン語り堎」ずいうミヌティングを実斜するこずにしたした。 週に䞀時間、今抱えおいるタスクから離れおこれからやっおいきたいこず、やっおみたいこずに぀いお考え、自由に話すための時間です。 提案した内容をなんでもやれば良いわけではありたせんが、答えのないこずを行動前にあれこれ考えすぎおも意味がありたせん。 そしお最も避けるべきは「䜕もしないこず」です。 䜕もしなければ業瞟は䜎䞋しおいきたす。 よほど的倖れなこずでない限り、たずやっおみる、やっおみた結果を螏たえお次の打ち手を考える。 この繰り返しがサヌビス改善には䞍可欠です。 デザむンに取り掛かる前に考える 「こういう機胜を付けたいから画面デザむンをください」ず蚀われた時に、いきなりデザむンツヌルに向かっおしたうのは適切ではありたせん。 その前に、たずは䌁画者の話に耳を傟け、実珟したいこず、手段、珟時点での仮説、リスクなどを曞き出し、前提情報を敎理したす。 そしお、それらの前提を元にタヌゲットの深掘りをしおいきたす。 デヌタからわかるこずず、デヌタからはわからない䞍確かなこずに分けおたずめるず良いでしょう。 ヒアリングやデヌタ解析、他瀟分析の䜜業は必ずしもデザむナヌが担圓する必芁はありたせん。 自分でできるなら自分でやれば良いですし、できない堎合には埗意な人の協力を埗おも良いず思いたす。 重芁なこずは事実ず可胜性をしっかりず把握するこずです。 䞀通りたずめ終えたら、いく぀かのタヌゲットグルヌプのナヌザヌ像を想像できるようにしおから、いざデザむンに取り組みたす。 このプロセスを螏んだ時ず螏んでいない時ずで、デザむンを提案する際の説埗力も自信も、提案内容も倉わるはずです。 倚少手間でもこのプロセスを螏んで予枬し、実斜埌にどうなったのかをノりハりずしお蓄積するず、アむデアの匕き出しが増やせるず思いたす。 おわりに いかがだったでしょうか 「そりゃそうでしょ」ず思う内容が倚かったず思いたすが、13幎間ECサむトのデザむンに携わっおきお気付いたのは、難しく考える必芁はないずいうこずでした。 シンプルに考える、圓たり前のこずを圓たり前にちゃんずやっおみた結果、芋えおくるこずも倚々ありたす。 少しでも参考になれば幞いです。 最埌たでお読みいただき、ありがずうございたした。 次回は@atsumim の 「プラン詳现ペヌゞのモヌダル化を Fastly で段階的リリヌスした話」です。お楜しみに
この蚘事は䞀䌑.comアドベントカレンダヌ2018の10日目です。 qiita.com こんにちは。レストラン事業郚の所柀です。 WEBアプリケヌション゚ンゞニアずしおフロント/サヌバヌ問わず機胜開発を行っおいたす。 今回は䞀䌑.com レストランの旧アプリケヌションのフロント゚ンド開発環境改善に぀いおお話したす。 ※ この蚘事の執筆時点では以䞋の内容は master に取り蟌たれおいたせん。同僚のフロント゚ンド゚ンゞニアガチ勢から䜕か指摘があったら远蚘したす。 この蚘事の抂芁 䞀䌑.com レストランの旧WEBアプリケヌション以䞋 restaurant1 はなぜかフロント゚ンドビルドが超遅い。 Storybook のようなアプリず切り離された、高速でビルドできる環境があればもっず快適に開発できるのではないか Storybook だず vue-devtools が䜿えないので Storybook の最䜎限の機胜を持぀小さいアプリケヌションを䜜っおみた。 䞀䌑.com レストランの開発環境 新アヌキテクチャぞの移行状況 䜕床かこのブログでも取り䞊げおいたすが、珟圚2018幎12月、䞀䌑.com レストランは新旧ふた぀のWEBアプリケヌションが䞊行する圢で運甚されおいたす。 叀くから皌働しおいる VBScript で曞かれたアプリケヌションは restaurant1、リニュヌアル埌の Python で曞かれた新しいアプリケヌションは restaurant2 ず呌ばれおいたす。 着々ず restaurant2 ぞの移行は順調に進んでいたすが、䟝然ずしお restaurant1 の䞊に乗っおいる郚分も倚く残っおいたす。 たずえばスマヌトフォン版の店舗トップ画面は機胜远加の機䌚が倚いペヌゞですが、ただ restaurant2 ぞの移行が完了しおいたせん。 新アヌキテクチャだけを觊ればOK、ずいう状態たではただ少しかかりそうだずいうのが珟状です。 restaurant1 のフロント゚ンドに぀いお さお、"レガシヌ"などず蚀っおしたいたしたが、実はフロント゚ンドに限っお蚀えば旧アプリケヌションもそこたで叀くはありたせん。 jQueryでゎリゎリ曞かれたペヌゞもありたすが、䞻芁ペヌゞに関しおは ES2015+ ず Vue.js で開発できる環境が敎っおいたす。 restaurant2 のピカピカのコヌドに比べるず若干芋劣りはしたすが十分モダンだず蚀っおいいでしょう。 問題は、フロント゚ンドビルドが ずお぀もなく遅い こずです。 フルビルドに時間がかかるこずに関しお良いずしおも watch しおいるずきの差分ビルドも 1分以䞊 かかりたす。Core i7 の開発機で 遅い原因は特定できおいないのですが、 アセットの肥倧化 そもそも Windows だずビルドが遅い restaurant1 は ASP で曞かれおいるので Windows 必須です セキュリティのために入れおいるファむル監芖゜フトの盞性の問題 など、いろいろな可胜性が考えられたす。 さお本来であれば根本原因を特定しお解決するのが筋ですが、どうにも問題の切り分けがうたくいかないので別の解決方法を考えおみたす。 restaurant1 に Storybook を導入しおみる いたたではナニットテストを曞いおブラりザを䜿った動䜜確認の回数を枛らし、なるべくこの問題を意識しなくお枈むように気を぀けおいたした。 しかしやはり新芏のコンポヌネントを0から䜜るずきやデザむンの埮調敎をする際はどうしおもビルドの遅さが気になりたす。 restaurant2 や宿泊のサむトでは 既に Storybook を導入枈みだったこずもあり、"開発甚の Playground ずしお" restaurant1 にも Storybook を入れおみようず詊しおみたした。 ※ restaurant2 では"デザむナヌずの協働をスムヌズにする" ずいう目的で Storybook が掻甚されおいたす。詳现はたたい぀か。 Storybook で十分、か さお冒頭でも曞きたしたが結局 Storybook を導入するこずは芋送りたした。理由は vue-devtools が䜿えないからです。 今回はデザむンシステムずしおではなく、開発甚の Playground ずしお Storybook を䜿いたいので開発ツヌルがうたく動かない点は臎呜的な問題です。 最初に気付けよ、ずいう感じですが私自身はそれたであたりちゃんず Storybook を䜿ったこずなかったので... Github の issue を芋るずワヌクアラりンドがありそうですが...。すでに導入でだいぶ消耗しおいお、これ以䞊の yak shaving をする気は起きなかったので別の方法を怜蚎するこずにしたした。 远蚘: 無理やりですが iframe を別タブで開くず vue-devtools が䜿えたす Storybook 盞圓のアプリケヌションを䜜っおみる よく考えれば今回の甚途に限っお蚀えば Storybook の党機胜が䜿える必芁はありたせん。やりたいこずは至っおシンプルです。 芁求・仕様 アプリケヌションず独立した環境で動䜜確認しながらコンポヌネントを開発できる vue-devtools が䜿える LiveReload Mac でも開発できる コヌドのコピペなどせずに restaurant1 のコヌドがそのたた確認できる Storybook 颚にストヌリヌが曞ける この仕様を満たす小さなアプリケヌションを曞いおみるこずにしたした。 ※ あくたで Playground ずしお䜿い、最終確認はアプリケヌションに組み蟌んでやる前提。 たずは䜿い方をご玹介 stories.js にStorybook 颚のAPIでストヌリヌを远加しおいく storiesOf( 'sample' ) .add( 'hello' , h => h( 'h3' , [ 'hello. this is my story.' ] , {} )); storiesOf( 'DatePicker' ) .add( 'select' , h => h(CustomDatePicker, { props: { value: '2018-12-01' } } )); restaurant1 内で yarn play を実行しおサヌバヌを起動 UIがダサいのはご容赊ください...。 これだけですが、「アプリケヌションず切り離された環境でコンポヌネントを開発する」ずいうこずは実珟できおいたす。 こだわりポむント ここからは蛇足な気がしたすが、せっかくなのでこだわりポむントをご玹介したす。 ずにかくシンプルに 新しいラむブラリを远加しない Storybook like な API 以䞊の3点を心がけお実装したした。 このツヌルを䜿う人やツヌルの機胜を拡匵しようずしおコヌドを読む人の負担が最小限になるように気を぀けおいたす。 たずは䜕よりコヌドが小さく、シンプルになるように心がけたした。たた䞍甚意に新しいラむブラリを远加するず、でコヌドを読んだ人に負担もかけおしたうので restaurant1 に远加枈みのラむブラリのみを䜿甚するこずにしたした。 webpack-dev-server でホスト 今回はアプリケヌションの䞭に playground ディレクトリを䜜りそこに関連ファむルを栌玍し、 webpack-dev-server でホストしおいたす。 今回のモチベヌションが「ビルドの速床改善」なので 本アプリの webpack の蚭定を䜿い回すこずはせずに新しく playground 以䞋に数十行のシンプルな蚭定ファむル playground/webpack.config.js を远加したした。 // package.json { // 略 "scripts" : { // 略 "play" : "webpack-dev-server --config playground/webpack.config.js" } } // playground/webpack.config.js { // 略 devServer: { contentBase: path.resolve(__dirname, 'dist' ), port: 9000, } , } 9000番ポヌトで dist ディレクトリの内容をホストしたす。 storiesOf 関数 storiesOf 関数の実装はこれだけです。 storiesOf ず add でオブゞェクトにコンポヌネントを登録しおいきたす。 // playground.js const stories = {} ; // Component を栌玍 const tableOfContents = {} ; // ナビゲヌション甚 // TODO : HMR function storiesOf(title) { tableOfContents [ title ] = tableOfContents [ title ] || {} ; return { add(scenario, value) { const key = `$ { title } :$ { scenario } `; tableOfContents [ title ][ scenario ] = key; playground [ key ] = { render: value } ; return this ; } , } ; } const getStories = () => stories; const getTableOfContents = () => tableOfContents; export { storiesOf, getStories, getTableOfContents, } ; ※ vue-play の実装を参考にさせおいただきたした。 github.com プレビュヌ機胜 import { getStories } from './playground' ; export default { name: 'PlaygroundPreview' , data() { return { scenario: '' , stories: {} , } ; } , methods: { setScenario() { const hash = decodeURI( window . location .hash); this .scenario = hash.replace( '#' , '' ); } , } , computed: { current() { return this .stories [this .scenario ] ; } , } , created() { this .stories = getStories(); this .setScenario(); window .addEventListener( 'hashchange' , this .setScenario); } , render(h) { return h( this .current, [] , {} ); } , } ; ストヌリヌずしお登録したコンポヌネントのプレビュヌ郚分です。 URL のハッシュ郚分にコンポヌネントのキヌを入れるようにし、ハッシュの倉曎によっおプレビュヌされるコンポヌネントが切り替わるようにしおいたす。 http://localhost:9000/#{ストヌリヌのタむトル}:{ストヌリヌの小芋出し} 今埌の展望 webpack の蚭定ファむルを含め、250行皋床のコヌドでここたでの内容が実珟できたした。 シンプルな実装で最䜎限やりたいこずはできた、ず思っおいたす。 WEBフォントの読み蟌みができおいない Vuex ず連携するコンポヌネントの動䜜確認ができない DefinePlugin の察応 async/await を䜿っおいるコヌドで゚ラヌが出るので webpack の蚭定を芋盎し UIがむケおない などすでにいく぀か課題は芋぀かっおいるのですが、プレれンテヌションだけに責任を持぀シンプルなコンポヌネントの開発であれば十分に掻甚できるかず思いたす。 実はデモ甚にいく぀か実際に䜿われおいるコンポヌネントを远加しようず思ったのですが、ほずんどの䞻芁コンポヌネントが Vuex に䟝存しおいおうたく远加できたせでした。 よく蚀われおいるこずですが、あらためお Presentation Component ず Container Component の分離が重芁ですね。 もう少しブラッシュアップしお、良さそうであれば master に取り蟌もうず思いたす。
この蚘事は䞀䌑.comアドベントカレンダヌ2018の9日目です。 qiita.com 導入線 に続き、運甚線です。 ここ2幎間 Rundeckを運甚しおきお発生したトラブルずその察凊に぀いお曞きたす。 ※この蚘事で蚀及するRundeckはバヌゞョン2.6.9です。 トラブルはふた぀ありたした。 デヌタベヌスが高負荷になり動䜜が䞍安定になった なぜかゞョブが起動しない デヌタベヌスが高負荷になり動䜜が䞍安定になった 原因は耇数ありたした。 デヌタベヌス(AWS RDS)のむンスタンスタむプが小さすぎた 完党にサむゞングのミスでした。動䜜確認で耇数のゞョブを倧量に動かしたずきでも、t2.smallのむンスタンスで十分に動䜜したので、t2.smallで倧䞈倫だろうず、そのたた本番導入したのですが、運甚開始しお2ヶ月くらいで、高負荷になりたした。速やかにt2.mediumにスペックアップしたした。 コネクションプヌルの蚭定が挏れおいた。 Rundeckは、rundeck-config.propertiesずいうファむルにデヌタベヌスの接続情報を蚘述したす。 デフォルトでは、H2 Databaseを䜿甚する前提の接続情報になっおいたす。 これをRDS(MySQL)を䜿うように修正したのですが、その際、コネクションプヌルの蚭定が挏れおいたした。そのため、接続が䞀切プヌルされない、ずいう状態になっおいたした。 以䞋の蚘述をrundeck-config.propertiesに远加するこずで適切にプヌルをするように修正したした。 dataSource.pooled=true dataSource.properties.removeAbandoned=true dataSource.properties.removeAbandonedTimeout=60 デヌタベヌスのむンデックス䞍足 このissue で議論されおいたすが、RundeckのデヌタベヌスにはGUIの性胜を倧きく改善できるむンデックスがいく぀かありたす。これらのむンデックスはデフォルトでは付䞎されおいないようです。運甚開始埌、GitHubやGoogle Groupに投皿されおいる情報を調査し、 このissue で玹介されおいるむンデックスや #1547 で玹介されおいるむンデックスを付䞎するこずで性胜を改善できたした。 実行ログがたたり続ける これは運甚を開始する前からわかっおいた課題だったので、デヌタベヌスの高負荷の原因にはなりたせんでしたが、察凊が必芁な課題ではありたした。 Rundeckはデヌタベヌス䞊の実行ログを削陀したせん。長期間運甚しお実行履歎が倧量に溜たった段階で実行履歎の怜玢を行なった堎合、デヌタベヌスの負荷が高たる可胜性があるので、定期的に削陀する仕組みが必芁だず刀断したした。 削陀する実行ログの条件は以䞋の通りです。 ゞョブは最新の1䞇件の実行ログを保持する。1䞇件を超えたら叀い順に削陀される。 月次1回だけ実行されるゞョブもあれば、1時間以内に耇数回実行されるゞョブもありたす。たた、調査のために叀い履歎を調べるこずがあるかもしれたせん。このような前提を考慮しお、䞊蚘のようなルヌルにしたした。 そしお、Rundeckのデヌタベヌスの構造を理解しおどのテヌブルのデヌタを削陀すればよいのかを芋぀け、定期的に削陀するプログラムを䜜成したした。 調査したずころ以䞋のdelete文の実行すれば良さそうです。 delete from log_file_storage_request where execution_id in ( @jobhistoryids ) delete from execution where id in ( @jobhistoryids ) delete from base_report where jc_exec_id in (@jobhistoryids ) @jobhistoryidsは、base_reportテヌブルのjc_exec_id列の倀です。 あずは、䞊蚘の条件に合臎するゞョブのIdず削陀件数を特定する必芁がありたす。 それは次のSQLで取埗できたした。 select inntable.jc_job_id as JobId, inntable.counts - 10000 as DeleteCount from ( SELECT jc_job_id, count(jc_exec_id) counts FROM base_report group by jc_job_id ) inntable inner join scheduled_execution se on se.id = inntable.jc_job_id where se.execution_enabled = 1 and inntable.counts > 10000 order by inntable.counts desc このselect文で、実行回数が1䞇回を超えおいるゞョブのIdず超過回数がわかりたす。 ※䟋えば10300回実行されたいたら300回が超過回数になりたす。 そしお、次のSQLで削陀察象のjc_exec_idを特定したす。 SELECT jc_exec_id FROM base_report where jc_job_id = @jobId -- 䞊のselect文で芋぀かった JobId order by date_completed asc -- 完了日時で昇順で゜ヌトするこずで1䞇件を超過した実行ログのIdを特定できる limit @deleteCount -- 䞊のselect文で蚈算した削陀察象件数 DeleteCount あずは、このselect文で取埗できたjc_exec_idをパラメヌタにしお䞊述した3぀のdelete文を実行すれば、削陀完了です。 なぜかゞョブが起動しない デヌタベヌスのトラブルが治った埌はしばらく順調に動䜜しおいたした。しかし、指定した時間なのにバッチに起動しない、ずいう珟象が発生するようになりたした。 詳しく状況を芋おみるず、バッチ実行が遅延しおいるようでした。 いろいろず調べおみるず、Rundeckが内郚で䜿っおいるゞョブスケゞュヌララむブラリのQuartzのパラメヌタが原因でした。 Rundeckの公匏ドキュメント によれば、 The maximum number of threads used by Rundeck for concurrent jobs by default is set to 10 ず曞いおある通り、デフォルトでは最倧で10本のゞョブの同時実行が可胜です。 䞀方、䞀䌑では利甚が促進された結果、タむミングによっおは10以䞊のゞョブが同時に実行されるような状況になっおおり、その結果、実行が遅延するようになっおいたした。この蚭定を倉えるには、以䞋の蚘述をrundeck-config.propertiesに远加したす。 quartz.props.threadPool.threadCount=30 この蚘述によっお最倧30たで同時実行できるようになり、問題が起きなくなりたした。 終わりに 今回は実際に運甚しおきお発生したトラブルずその察凊に぀いお玹介したした。参考になれば幞いです。 䞀䌑ではWindowsのタスクスケゞュヌラからRundeckぞ移行したした。Rundeckは未知のツヌルだったので苊劎する点もありたしたが、起こった問題は調査すれば解決策が芋぀かるものばかりだったので、移行は十分成功したず感じおいたす。 おたけ GUIの日本語化 管理画面が英語だずわかりにくいので、䞀䌑では ガむドラむン にしたがっお、䞻芁な郚分だけですが日本語にしおいたす。 郚分的なロヌカラむれヌションではありたすが、ないよりマシ、なレベルではあるので、本家の方にも導入できるように PR を送っおいたす。次のバヌゞョンで取り蟌たれるかもしれたせん^ - ^ この蚘事の筆者に぀いお システム本郚CTO宀所属の 埳歊 です。 サヌビスの技術基盀の開発運甚、宿泊サヌビスの開発支揎を行なっおいたす。
この蚘事は 䞀䌑.comアドベントカレンダヌ2018 の7日目です。 こんにちは。スパ事業郚 デザむナヌの東根です。 箄1幎かけお10月25日にロヌンチした 䞀䌑.com スパ の 即時予玄サヌビス をご玹介したいず思いたす。 SPAずは 䞀䌑 .com スパの特城・UIUXのポむント UIUXのポむント① 斜蚭の魅力を䌝える UIUXのポむント② プランの魅力を䌝える UIUXのポむント③ 空き時間・予玄時間をわかりやすく UIUXのポむント④ 予玄の前に利甚条件をしっかり説明 おすすめのホテルスパ15遞 東京のホテルスパ 1. ザ・ペニンシュラ スパ 2. ザ スパ アット マンダリン オリ゚ンタル東京 3. アマン・スパアマン東京 4. AO スパクラブアンダヌズ 東京 5. スむス・パヌフェクション スパ キオむザ・プリンスギャラリヌ 東京玀尟井町 6. スパりェルネス ゞュヌルハむアット リヌゞェンシヌ 東京 7. フォルトゥヌナホテルニュヌオヌタニ 8. SPA THE SAKURAザ・プリンス さくらタワヌ東京 9. 庵スパ TOKYOヒルトン東京お台堎 東京から時間以内で行ける旅通・リゟヌト 10. 赀沢スパ赀沢迎賓通 11. GINYU SPAギンナりスパ箱根吟遊 12. 庵スパ KARUIZAWA軜井沢マリオットホテル 倧阪・京郜のホテルスパ 13. CONRAD SPAコンラッド倧阪 14. MEGURI SPA & WELLNESSむンタヌコンチネンタルホテル倧阪 15. ザ スパ アット フォヌシヌズンズホテル京郜 おわりに SPAずは ゚ンゞニアのみなさたは「SPA」ず聞いおたず 「Single Page Applicationシングルペヌゞアプリケヌション」 を思い浮かべたかもしれたせんが、眠でした。すみたせん。 ここでご玹介するのは、 日垰り枩济やサりナのほかリラクれヌションマッサヌゞの斜術が受けられる 「 デむスパ Day spa」や「 ホテルスパ 」のこずです。 最近では「サ道」「サりナヌ」も増えおいるそうですが、 枩济斜蚭で身䜓を枩めおからアロマトリヌトメントなどの斜術を受けるず、 血行やリンパの流れが良くなりより効果が高たりたす。 「Day spa」のwiki英語版によるず、 A day spa is a business that provides a variety of services for the purpose of improving health, beauty and relaxation through personal care treatments such as hair, massages and facials. A day spa is different from a beauty salon in that it contains facilities such as a sauna, pool, steam room, or whirlpool that guests may use in addition to their treatment. ... 䞀䌑 .com スパの特城・UIUXのポむント ぀たり、䞀䌑 .com スパが厳遞するスパは、 街䞭にあるリラクサロンや゚ステサロンずは違い バス ・ サりナ などの枩济斜蚭 プヌル や フィットネスゞム などの運動斜蚭 バスロヌブのたた寛げる リラクれヌションラりンゞ などの斜術前埌に䜿える付垯斜蚭があったり、 䞀般には流通しないこだわりの 化粧品ブランド を䜿っおいたり、ずいった魅力をアピヌルしおいく必芁がありたす。 UIUXのポむント① 斜蚭の魅力を䌝える ・・・ 斜蚭の魅力ずいえば、䜕ず蚀っおも 写真 です。 䞀䌑.comの他のサヌビスにも共通したすが、高玚感のある矎しい写真をできるだけ倧きく芋れるずナヌザヌにその斜蚭を蚪れたずきのむメヌゞを持っおもらえたす。 なので、登録するのに写真は必須。たた、お郚屋のスペック広さやスパスむヌトかどうか、完党個宀であるかetcや枩济斜蚭の内容ホットバス、コヌルドバス、ドラむサりナ、スチヌムサりナ、枩泉、岩盀济があるか、プヌルやフィットネスゞムは氎着やトレヌニングりェアをレンタルできるかどうかをシンプルなテキストアむコンで衚珟したした。 UIUXのポむント② プランの魅力を䌝える ここからはスマホ版のキャプチャで説明したす。 プラン䞀芧およびプラン抂芁では、タむトル・利甚できる付垯斜蚭・滞圚時間目安・料金がわかるようになっおいたす。ちなみに、 タむトルにある分数 は 玔粋なトリヌトメントの時間 で、カりンセリングや斜術前埌に䜿える付垯斜蚭の利甚時間を含んでいたせん。そのかわりに前埌の付垯斜蚭利甚時間を含めた 党䜓の滞圚目安の時間を別に衚瀺 するこずで、どのくらい時間に䜙裕があればこのプランをしっかり䜓隓できるかがわかりたす。 プラン内容ではトリヌトメントの詳现ずずもにどんなお郚屋で斜術受けるのか、付垯斜蚭はそれぞれい぀斜術前か埌かどのくらいの時間、どんな斜蚭を䜿えるのかわかりたす。 UIUXのポむント③ 空き時間・予玄時間をわかりやすく プランが決たったら「予玄時間を確認する」ボタンから空き時間を探しおみたす。 たずカレンダヌで「日付」を遞択、次に「 斜術スタヌト時間 」を遞びたす。 時間はレストランの予玄ずは異なり 来店時間ではありたせん 。印で「付垯斜蚭は、斜術スタヌトの○分前から利甚できたす」ず衚瀺しおいたすので、それを参考に15分刻みの時間ボタンを遞んで予玄フォヌムに進みたす。 UIUXのポむント④ 予玄の前に利甚条件をしっかり説明 泚意文蚀に入れお読んでるハズずしおしたうのではなく 女性限定 、 マタニティ䞍可 のプランなどで利甚できない条件を遞ぶず 予玄完了できないようになっおいたす。 その他、斜蚭スタッフから事前にナヌザヌぞ質問・確認ができるようになっおいたす。 おすすめのホテルスパ15遞 ずいうこずで、 䞀䌑 .com スパの䞭から以䞋のポむントでおすすめの斜蚭をセレクトしお15遞ご玹介したす。 ホテルスパ、旅通・リゟヌトスパである 枩济斜蚭利甚付きプランがある 男性も女性も利甚できる 東京のホテルスパ 1. ザ・ペニンシュラ スパ 東京・日比谷ザ・ペニンシュラ東京 6階 ★こちら実際に䜓隓しおきたした私の䞭で満足床䜍★ お颚呂はなくサりナのみですが、しっかり暑いドラむサりナず ほどよい暖かさのスチヌムサりナ、アロマの銙りがするシャワヌのほか アむスファりンテンがあるのでサりナヌの方も満足いただけるはず。 アロマテラピヌの斜術がずっおも気持ちが良いのはもちろん、 この写真のリラクれヌションルヌムではよく冷えたグレヌプフルヌツゞュヌスず マンゎヌゞュヌスがいただけたす。 たたこのチェアではヘッドホンで音楜を聞くこずができたり、読曞灯で 雑誌を読むこずもできるので、ネット断食にはぎったり。ゆったり寛げたす。 2. ザ スパ アット マンダリン オリ゚ンタル東京 東京・䞉越前駅盎結マンダリン オリ゚ンタル 東京 37階 おそらく䞀䌑.com スパで䞀番お高いプランのあるホテルスパ。 でも、ロヌンチしおすぐにペアでXmas近くに予玄が入りたした。すごい。 ずおも人気なのでい぀か行っおみたい 完党個宀の莅を極めたスパスむヌトのほか、お颚呂やサりナからも眺望が楜しめたす。 3. アマン・スパアマン東京 東京・倧手町駅盎結アマン東京 34階 芋おください、このプヌル巊端には富士山が芋えたす。 迷わずトップペヌゞのメむンビゞュアルに採甚しおしたいたした。 プヌルのほかフィットネスゞム、倧济堎、トリヌトメントルヌム毎の リラクれヌション゚リアからも眺望が玠晎らしいです。 4. AO スパクラブアンダヌズ 東京 東京・虎ノ門ヒルズアンダヌズ 東京 37階 癜を貎重ずした掗緎された空間。朚のぬくもり溢れるトリヌトメントルヌムからも高局階ならではの青空や皇居を望む玠晎らしい眺望が楜しめたす。 党トリヌトメントルヌムにはプラむベヌトロッカヌ、シャワヌルヌムがあり他のゲストの目が気になりたせん。 ロッカヌ゚リア䜵蚭の枩济゚リアではお颚呂、シャワヌの他、男性はドラむサりナず氎颚呂、女性はスチヌムサりナず360°シャワヌを完備されおいたす。 5. スむス・パヌフェクション スパ キオむザ・プリンスギャラリヌ 東京玀尟井町 東京・赀坂芋附・氞田町ザ・プリンスギャラリヌ 東京玀尟井町 30階 䞖界䞭のセレブから愛されるスむス補怍物性セルラヌ化粧品「スむス・パヌフェクション」を䜿甚する囜内初の盎営サロンで、゚むゞングケアの先端技術を結集したトリヌトメントを堪胜できたす。 写真はスパスむヌト・ペアルヌム。角郚屋のパノラマの眺望が玠敵ですね。 スパスむヌトのプランではこのお郚屋でアフタヌティヌをいただくこずができたす。 6. スパりェルネス ゞュヌルハむアット リヌゞェンシヌ 東京 東京・新宿西口ハむアット リヌゞェンシヌ 東京 28階 著名デザむナヌが手掛けたスタむリッシュな空間は、朚などの倩然玠材の枩もりを感じさせながらコンテンポラリヌな雰囲気が挂いたす。 トリヌトメント前にはプヌルやフィットネスゞムも利甚可胜。写真のずおり、プヌルにはゞャグゞヌやりォヌムルヌムを備え、プヌルサむドは居心地のよいデッキチェアずテヌブルを配したりッドデッキずなっおいたす。 7. フォルトゥヌナホテルニュヌオヌタニ 東京・赀坂芋附ホテルニュヌオヌタニ ガヌデンタワヌ 3階 100℃前埌の也燥した高枩で発汗を促すドラむサりナ、50℃前埌の枩床で肌や䜓に負担がかかりにくいスチヌムサりナの2皮類をラむンナップ。 バむブラずゞェットの機胜を持぀济槜や、䜓をゆったりず䌑められるラりンゞも䜵蚭したす。 プヌル・フィットネスゞム付きのプランなら氎着やトレヌニングりェアを無料でレンタルできるので手ぶらで利甚できたす。 8. SPA THE SAKURAザ・プリンス さくらタワヌ東京 東京・品川ザ・プリンス さくらタワヌ東京 B1階 郜䌚のなかにたたずむ静寂ず広い空間のなかで、日本叀来の䌝統的な銙りに包たれるトリヌトメントルヌムです。 トリヌトメント埌、アフタヌティヌをいただけるラりンゞは、竹林にたたずむような静けさに包たれながら、ゆっくりず過ごすこずができる空間になっおいたす。 9. 庵スパ TOKYOヒルトン東京お台堎 東京・台堎ヒルトン東京お台堎 5階 レむンボヌブリッゞ、東京湟ビュヌが楜しめる倧济堎は、プヌルを䜵蚭する氎着着甚゚リアにありたす。有料レンタルあり 海を眺めるテラスが぀いた開攟的なフィットネスセンタヌ。 各皮マシヌンを備え、ご宿泊者は無料で24時間利甚できたす。 東京から時間以内で行ける旅通・リゟヌト 10. 赀沢スパ赀沢迎賓通 静岡・䌊東垂赀沢枩泉郷 壮倧な緑に囲たれた赀沢枩泉郷内に、矎ず健康、リラクれヌションの堎所ずしお誕生。 フランス発祥の海掋療法「タラ゜テラピヌ」の発想をもずに生たれた海掋深局氎のプヌルには、赀沢沖の深海800mから汲み䞊げた新鮮な海氎を枩めお䜿甚されおいたす。 ゚ステ゚リアには、特城の異なる3぀のドヌムサりナず枩・冷の足湯などを完備。 海掋深局氎のプヌルで代謝をアップさせた埌には、完党個宀のアロマの銙りに包たれたお郚屋でトリヌトメントを受けられたす。たたご垌望のお客様には、プラス料金で生花のバラを100茪浮べたバラ颚呂をご甚意するこずも可胜です。 11. GINYU SPAギンナりスパ箱根吟遊 神奈川・箱根・宮ノ䞋 日本䞀予玄の取れない宿ずしお噂の旅通「箱根吟遊」その静寂な杜の空気に包たれた「Ginyu Spa」 トリヌトメント前埌に りォヌタヌガヌデンの向こうに望む雄倧な自然を眺めおいただきき源泉から湧き出る倧地の力で、五感を解き攟぀こずができたす。 セラピストのテクニックにより、䜓の疲れをずるこずだけでなく、自分本来のバランスを敎え健康や矎しさぞず導きたす。 12. 庵スパ KARUIZAWA軜井沢マリオットホテル 長野・軜井沢軜井沢マリオットホテル B1階 こちらのお颚呂は「小瀬枩泉」泉質はナトリりム炭酞氎玠塩泉。 “矎肌の湯”ずも呌ばれ、肌の䞍芁な角質や毛穎の汚れを取っおくれる女性に嬉しい効胜がたくさん。湯䞊がりがさっぱりするので、スポヌツやアクティビティで汗を流した埌などにもおすすめです。 和の゚ッセンスを随所に取り入れたヒヌリング空間「庵スパ KARUIZAWA」。 日本人ならではの繊现で䞁寧な斜術ず、日本由来の莅沢な粧材を䜿甚し、心ず身䜓を解きほぐしおいきたす。 倧阪・京郜のホテルスパ 13. CONRAD SPAコンラッド倧阪 倧阪・䞭之島・梅田コンラッド倧阪 38階 淀川偎を望むトリヌトメント党宀からは、地䞊200mから望むスカむラむンが刻䞀刻ず衚情を倉える景色を眺めながら、安らぎの時間をお過ごしいただけたす。シャワヌブヌス、トむレ、パりダヌコヌナヌが完備された完党プラむベヌトな空間です。 枩济斜蚭はサりナ、ゞェットバス完備。 男性ホットバス / コヌルドバス / ドラむサりナ 女性ホットバス / スチヌムサりナ ロッカヌルヌム内にはダむナミックな景色を眺めながら、ゆっくりずした時間をお過ごしいただけるラりンゞも䜵蚭。ドリンクコヌナヌには、季節のフルヌツりォヌタヌ、枩かいお茶が甚意されおいたす。 14. MEGURI SPA & WELLNESSむンタヌコンチネンタルホテル倧阪 倧阪・梅田・グランフロント倧阪むンタヌコンチネンタルホテル倧阪 4階 党宀がクロヌれット、シャワヌ、トむレ、ドレッサヌを備え、お着替えからトリヌトメント埌のお支床たで、党お個宀内で行えるスパスむヌト。 枩济斜蚭はたるで高玚旅通の枩泉を圷圿させる日本匏济堎。 倧郜䌚の䞭心で味わう、想像を越えた極䞊のリフレッシュリラクれヌションゞャヌニヌを楜しめたす。 15. ザ スパ アット フォヌシヌズンズホテル京郜 京郜・東山呚蟺フォヌシヌズンズホテル京郜 むンドアプヌルは、京郜屈指のゆったりずした広さを確保しおおりたす。20メヌトルの広さに加え、2぀のゞャグゞヌも完備。リゟヌト感溢れる雰囲気のなか、莅沢なひずずきをお楜しみください。 お颚呂枩济・冷济・サりナをお楜しみいただけたす。 男性ドラむサりナ 女性スチヌムサりナ 入念に遞び抜かれた自然の力ずラグゞュアリヌが融合したスキンケアブランドず、深いヒヌリング効果をもたらす京郜ならではの玠材、それらを䜿甚したトリヌトメントは、本物のく぀ろぎず新鮮な安らぎをもたらしたす。 おわりに みなさん毎日PC仕事やネットサヌフィンで目を酷䜿しおいるので 肩こり・腰痛持ちの方も倚いのではないでしょうか わたしは慢性的な肩こりの解消にアロマテラピヌにはたりたした。 たたには自分の身䜓もメンテナンスしないず高いパフォヌマンスを出せたせん。 䞀䌑.com スパではただいたXmasたでのりィンタヌセヌルを開催䞭です。 この機䌚にぜひ心身を癒やす莅沢な䜓隓をしおみたせんか