<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[hypermkt blog]]></title><description><![CDATA[A web developer blog who love Ruby/PHP.]]></description><link>https://blog.hypermkt.jp</link><generator>GatsbyJS</generator><lastBuildDate>Thu, 01 Oct 2026 12:01:20 GMT</lastBuildDate><atom:link href="https://blog.hypermkt.jp/rss.xml" rel="self" type="application/rss+xml"/><item><title><![CDATA[2025年の振り返り]]></title><description><![CDATA[気づいたら 2025 年が終わってた。子どもがポケモンのアニメを見るのに集中している間に 2025 年の振り返り記事を書く。（間に合うか） 仕事 今年は新しいことにチャレンジすることができ、学びが多い年だった。 2025 年…]]></description><link>https://blog.hypermkt.jp/2025/2025-12-31-furikaeri/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2025/2025-12-31-furikaeri/</guid><pubDate>Wed, 31 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;気づいたら 2025 年が終わってた。子どもがポケモンのアニメを見るのに集中している間に 2025 年の振り返り記事を書く。（間に合うか）&lt;/p&gt;
&lt;h2&gt;仕事&lt;/h2&gt;
&lt;p&gt;今年は新しいことにチャレンジすることができ、学びが多い年だった。&lt;/p&gt;
&lt;p&gt;2025 年 7 月からモジュラモノリス化プロジェクトに参加するため、チームをレンタル移籍。そこで半年間、モジュラモノリスに関する技術検証や 2026 年上期からの体制検討、各種資料整備などを行っていた。&lt;/p&gt;
&lt;p&gt;前半の技術検証までは比較的順調だったが、後半の来期の体制検討やリソース調整では苦労した。個人的にも後半から精神的に負担のかかることも多かったが、チームメンバーと相談・協力することで乗り切ることができた。この辺のチーム組織論については、自身の課題と感じた。&lt;/p&gt;
&lt;p&gt;2026 年 1 月からは元のチームに戻り、モジュラモノリスを他チームに展開するための布教活動を行っていく予定。（社内ではよく「レンタル移籍といっても戻らないでしょ〜？」と冗談っぽく言われることが多いが、ちゃんと戻りましたよ！）&lt;/p&gt;
&lt;p&gt;2025 年 9 月には Kaigi on Rails 2025 に登壇した。「&lt;a href=&quot;https://kaigionrails.org/2025/talks/hypermkt/#day2&quot;&gt;履歴 on Rails : Bitemporal Data Model で実現する履歴管理&lt;/a&gt;」。内容自体は目新しいものではないかもしれないが、2024 年下期から 2025 年上期の取り組みとして自分が苦労したこともあり、それを抽象的な内容でプロポーザルとして書いたら驚いたことに通過した。資料作成から登壇直前までは、毎回ストレスと不安に悩まされているが、発表後にみんなに褒めてもらえるのはとても嬉しい。&lt;/p&gt;
&lt;h2&gt;育児&lt;/h2&gt;
&lt;p&gt;今年の夏まではプラレール、仮面ライダーガヴ、君とアイドルプリキュアだったのに、急にポケモンに変わってしまった。以来、ポケモンにハマってしまい、毎日のようにポケモンのアニメを見たり、ポケモン Go をしている。最近はポケモンカードも始めた。毎日のようにポケモンカーバトルをしている。&lt;/p&gt;
&lt;p&gt;また今年は子どもと一緒にいろんな場所にでかけた。航空祭、東京タワー、スカイツリー、保育園の友達とバーベキューなど。大阪で開催されていた「&lt;a href=&quot;https://pokemon.ougi-japan.com/&quot;&gt;ポケモン発見大作戦&lt;/a&gt;」にも参加した。初めての新幹線＆大阪旅行として、とても良い思い出になった。&lt;/p&gt;
&lt;h2&gt;投資&lt;/h2&gt;
&lt;p&gt;2021 年から本格的に資産運用として始めた投資も、今年で 5 年目。今年は eMaxis Slim 全世界株式を軸に投資した。また今年からはリスク分散として金（ゴールド）投資も初めて、サクっと純金も買い始めた。2025 年の成果としてはとても順調だったので良かった。2026 年も深く考えず、Just Keep Buying！&lt;/p&gt;
&lt;h2&gt;ワールドトリガー&lt;/h2&gt;
&lt;p&gt;同僚のおすすめをきっかけにワールドトリガーに興味を持ち、ハマった。とにかく面白かった。
最近、仕事柄でエンジニア組織を考えることがあったのだが、ワールドトリガーはその組織についてとても細かく描かれている。また主人公のキャラクターと自分を重ねてしまい、とても共感する場面があった。&lt;/p&gt;
&lt;h2&gt;終わりに&lt;/h2&gt;
&lt;p&gt;2026 年も引き続きやっていき。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Kaigi on Rails 2025に参加＆登壇しました]]></title><description><![CDATA[こんにちは、hypermkt です。 2025 年 9 月 26 日, 27 日に開催された Kaigi on Rails 2025 にて、登壇の機会をいただきました。昨年に続き、2 年連続で登壇させていただき、とても光栄です 今回の登壇では、「履歴 on Rails…]]></description><link>https://blog.hypermkt.jp/2025/2025-10-05-kaigi-on-rails-2025/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2025/2025-10-05-kaigi-on-rails-2025/</guid><pubDate>Sun, 05 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;こんにちは、hypermkt です。&lt;/p&gt;
&lt;p&gt;2025 年 9 月 26 日, 27 日に開催された Kaigi on Rails 2025 にて、登壇の機会をいただきました。昨年に続き、2 年連続で登壇させていただき、とても光栄です&lt;/p&gt;
&lt;p&gt;今回の登壇では、「&lt;a href=&quot;https://kaigionrails.org/2025/talks/hypermkt/#day2&quot;&gt;履歴 on Rails : Bitemporal Data Model で実現する履歴管理&lt;/a&gt;」というタイトルで発表してきました。&lt;/p&gt;
&lt;iframe class=&quot;speakerdeck-iframe&quot; frameborder=&quot;0&quot; src=&quot;https://speakerdeck.com/player/cc55b04ff2dd43de8fe5bbee95285f30&quot; title=&quot;履歴 on Rails:  Bitemporal Data Modelで実現する履歴管理/history-on-rails-with-bitemporal-data-model&quot; allowfullscreen=&quot;true&quot; style=&quot;border: 0px; background: padding-box padding-box rgba(0, 0, 0, 0.1); margin: 0px; padding: 0px; border-radius: 6px; box-shadow: rgba(0, 0, 0, 0.2) 0px 5px 40px; width: 100%; height: auto; aspect-ratio: 560 / 315;&quot; data-ratio=&quot;1.7777777777777777&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;登壇後は、ActiveRecord::Bitemporal を活用されている方や有効期間管理に取り組まれている方と、現状の課題感や対策についてお話しする機会があり、とても刺激的でした。 多くの方に関心を持っていただけてうれしかったです。&lt;/p&gt;
&lt;p&gt;この発表が、履歴管理に関心を持つきっかけになれば幸いです 😃&lt;/p&gt;
&lt;h2&gt;気になったセッション&lt;/h2&gt;
&lt;h3&gt;&lt;a href=&quot;https://kaigionrails.org/2025/talks/ohbarye/#day1&quot;&gt;5 年間の Fintech × Rails 実践に学ぶ - 基本に忠実な運用で築く高信頼性システム&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;お話の中で私が興味を持った点は「モジュール化」と「アラートトリアージ」のお話でした。&lt;/p&gt;
&lt;p&gt;1 点目については、アーキテクチャ設計の工夫の一つとして「モジュール」に取り組まれているとのこと。SmrtHR では Packwerk を利用したモジュラモノリス化に取り組んでいるが、SMART BANK 社ではシンプルに Ruby built-in のモジュール方式を採用。登壇者の方と直接お話を伺いましたが、app/models 配下に細かくモジュール化を進められており、各モジュールごとにエントリポイントになるメソッドもあるとのこと。責務の整理や認知負荷の低減といったモジュラモノリスと共通するメリットがある一方で、Gem などを用いず純粋な Ruby/Rails の機能だけで実現されている点がとても興味深かったです。&lt;/p&gt;
&lt;p&gt;2 点目については Sentry アラートのトリアージ。SmartHR でのアプリケーションエラーの監視に Sentry を利用していますが、組織的にうまく活用できていない課題がありました。SMART BANK 社ではモジュールごとにオーナーを決めて担当チームのチャンネルに Slack 通知をすることで、迅速なトリアージに繋げられてるとのこと。エラー発生数も数値として大きく低減する実績も残されている点がとても素晴らしかったです。&lt;/p&gt;
&lt;p&gt;総合的に高信頼性を保つために、アプリケーション設計、監視、品質と様々な観点で工夫と取り組みをされている点が愚直でありながらも、高いレベルで実現できていること、多くのプロダクトで参考になるお話だったのがとても良かったです。&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;https://kaigionrails.org/2025/talks/myumura/#day2&quot;&gt;Rails アプリから何を切り出す？機能分離の判断基準&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;最近モジュラモノリス化を進めているので、機能分離のお話がとても気になりました。なぜ機能分離が必要か、どのような観点で機能を分離するのか、とても丁寧に説明されておりわかりやすかったです。&lt;/p&gt;
&lt;p&gt;機能分離の目的としては「コードベースの複雑化」「開発速度の低下」と開発体験の悪化が大きいようですね。そのうえで、５つの判断軸を提示してそれを利用して個々の機能を機能分離を判断していく過程がとても興味深く参考になりました。&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;https://kaigionrails.org/2025/talks/willnet/#day2&quot;&gt;rails g authentication から学ぶ Rails8.0 時代の認証&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Rails 8.0 から本体で提供されるようになった認証機能の説明でした。とても丁寧に解説頂き概要をしっかり理解することができました。
自分も同じようにコードリーディングを通じて新機能を学んでいきたいと思える内容でした。&lt;/p&gt;
&lt;h2&gt;おわりに&lt;/h2&gt;
&lt;p&gt;2 回目の Kaigi on Rails 参加となりましたが、スポンサーブース・懇親会を通じて様々な方とお話ができてとても楽しかったです。&lt;/p&gt;
&lt;p&gt;さて、2025 年 10 月 10 日に開催予定の「&lt;a href=&quot;https://smarthr.connpass.com/event/367186/&quot;&gt;Kaigi on Rails 2025 事後勉強会&lt;/a&gt;」にて LT 予定です。もしご都合があいましたらぜひご参加ください〜！&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Kaigi on Rails 2024に参加＆登壇しました]]></title><description><![CDATA[2024 年 10 月 25 日, 26 日に開催された Kaigi on Rails 2024 に参加し、「Sidekiq で実現する 長時間非同期処理の中断と再開」というタイトルで発表してきました。 発表の経緯 SmartHR に入社して…]]></description><link>https://blog.hypermkt.jp/2024/2024-10-30-kaigi-on-rails-2024/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2024/2024-10-30-kaigi-on-rails-2024/</guid><pubDate>Wed, 30 Oct 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;2024 年 10 月 25 日, 26 日に開催された Kaigi on Rails 2024 に参加し、「Sidekiq で実現する 長時間非同期処理の中断と再開」というタイトルで発表してきました。&lt;/p&gt;
&lt;iframe class=&quot;speakerdeck-iframe&quot; frameborder=&quot;0&quot; src=&quot;https://speakerdeck.com/player/519ed48333bb467f99800676350f6fc3&quot; title=&quot;Sidekiqで実現する 長時間非同期処理の中断と再開 / Pausing and Resuming Long-Running Asynchronous Jobs with Sidekiq&quot; allowfullscreen=&quot;true&quot; style=&quot;border: 0px; background: padding-box padding-box rgba(0, 0, 0, 0.1); margin: 0px; padding: 0px; border-radius: 6px; box-shadow: rgba(0, 0, 0, 0.2) 0px 5px 40px; width: 100%; height: auto; aspect-ratio: 560 / 315;&quot; data-ratio=&quot;1.7777777777777777&quot;&gt;&lt;/iframe&gt;
&lt;h2&gt;発表の経緯&lt;/h2&gt;
&lt;p&gt;SmartHR に入社して 5 年が経とうとしていますが、転職や子育ても重なり、イベントでの参加や発表から遠ざかっていました。今回、久しぶりに発表しようと思ったきっかけがありました。&lt;/p&gt;
&lt;p&gt;1 つめは、今年の前半にチームのエンジニアマネージャーから「技術的リードを手伝ってほしい」とのフィードバックをもらったことです。その際、前職の GMO ペパボで学んだ「アウトプットの重要性」を思い出しました。自身の知見が誰かにとって有益かもしれないという考えのもと、アウトプットを通じて技術力を向上させることが、チームにも良い影響を与えると感じたのです。&lt;/p&gt;
&lt;p&gt;2 つめは、社内メンバーからの「Kaigi on Rails に CFP を出しませんか？ネタ出しサポートします！」という声かけでした。&lt;/p&gt;
&lt;p&gt;最後にチームで長時間非同期処理の課題にチームで取り組んでいたことです。その過程で学んだ中断・再開という技術を学び、長時間非同期処理の課題は、他のエンジニアや企業にも同様のニーズがあるのでは？と感じ、CFP を出そうと考えました。&lt;/p&gt;
&lt;h2&gt;社内レビューに感謝&lt;/h2&gt;
&lt;p&gt;資料作成の過程では、社内レビューや発表会を通じて多くのフィードバックを頂きました。技術的な正しさ、ストーリーの一貫性や文章のつながり、読みやすさ、さらにプロジェクター投影時のコードの見やすさなど、さまざまな観点から意見をもらい、資料をブラッシュアップすることができました。そのおかげで自信を持って発表に臨める資料に仕上がったと感じています。ありがとうございました。&lt;/p&gt;
&lt;h2&gt;発表後にフィードバックを頂きました！！&lt;/h2&gt;
&lt;p&gt;大変ありがたいことですが、発表後に質問やこうすると良かったのでは？とご意見を頂きました。抜粋してご紹介します。&lt;/p&gt;
&lt;h3&gt;非同期処理のデータを分割して最後にマージできないか&lt;/h3&gt;
 &lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;ja&quot; dir=&quot;ltr&quot;&gt;しかしジョブが長すぎるとつらいので分割実行したあとマージするみたいなことを考えたくなりそう、そうも言ってられない要件もあるのかなー &lt;a href=&quot;https://twitter.com/hashtag/kaigionrails?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#kaigionrails&lt;/a&gt; &lt;a href=&quot;https://twitter.com/hashtag/kaigionrails_blue?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#kaigionrails_blue&lt;/a&gt;&lt;/p&gt;&amp;mdash; うたがわきき (@utgwkk) &lt;a href=&quot;https://twitter.com/utgwkk/status/1849693208500138074?ref_src=twsrc%5Etfw&quot;&gt;October 25, 2024&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;p&gt;直接お会いしてご意見を頂きました。&lt;/p&gt;
&lt;p&gt;頂いたご意見の要約としては以下だった記憶があります。（間違えていたらすいません…!）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;そもそも非同期処理の実行時間が長いのが良くない&lt;/li&gt;
&lt;li&gt;非同期処理の対象データに依存性がなければ、一定の単位で分割して非同期で処理する&lt;/li&gt;
&lt;li&gt;処理がすべて終わったらマージして結果として返すのはどうか&lt;/li&gt;
&lt;li&gt;AWS Step Function なら可能かも。Google Cloud でも同様のものがあるでしょう。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;正直なところ、その発想はありませんでした。データ的には依存性はないため、仕様的には分割可能です。
そもそも非同期処理の実行時間が長いのは課題なのは仰るとおりでしたので、実行時間を短縮するための案としてありだと思いました。&lt;/p&gt;
&lt;h3&gt;処理データを tmp table にはいとけば、状態管理も全部アトミックにやれそうな気がする&lt;/h3&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;ja&quot; dir=&quot;ltr&quot;&gt;tmp table使わない理由気になる。処理データをtmp tableにはいとけば、状態管理も全部アトミックにやれそうな気がする？&lt;a href=&quot;https://twitter.com/hashtag/kaigionrails?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#kaigionrails&lt;/a&gt; &lt;a href=&quot;https://twitter.com/hashtag/kaigionrails_blue?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#kaigionrails_blue&lt;/a&gt;&lt;/p&gt;&amp;mdash; P山 (@pyama86) &lt;a href=&quot;https://twitter.com/pyama86/status/1849692197635096689?ref_src=twsrc%5Etfw&quot;&gt;October 25, 2024&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;p&gt;Temporary Table について教えていただきありがとうございます。&lt;/p&gt;
&lt;p&gt;今回の中断・再開の仕組みは、数年前に設計されたもので、自分が導入に関わっていなかったため Temporary Table を利用しなかった背景は不明です。ただ、調査を進める中で Temporary Table でも状態管理が可能だと感じています。&lt;/p&gt;
&lt;p&gt;一時テーブルが「セッション内のみ有効」という特徴から、短時間のジョブに適していることがわかりました。長時間のジョブで一時的に処理が停止する場合、Temporary Table のデータが消えるリスクがあるため、中断のない運用に変更するか、別の工夫が必要になるかもしれません。&lt;/p&gt;
&lt;p&gt;Temporary Table はこれまで考慮していなかった選択肢でしたが、今後の改善の参考にさせていただきます！&lt;/p&gt;
&lt;h2&gt;おわりに&lt;/h2&gt;
&lt;p&gt;Kaigi on Rails は初参加でしたが、スポンサーブース、懇親会で様々な人との交流ととても楽しむことができました。また久しぶりの登壇を通じて忘れていた何かを思い出すことができました。来年の Kaigi on Rails 2025 もぜひ参加したいと思います。もちろん来年も登壇を目指します！&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;ja&quot; dir=&quot;ltr&quot;&gt;SmartHRは、Kaigi on Rails 2024に協賛しています。&lt;br&gt;みんなで記念撮影！&lt;br&gt;2枚目は、登壇直後の &lt;a href=&quot;https://twitter.com/ymtdzzz?ref_src=twsrc%5Etfw&quot;&gt;@ymtdzzz&lt;/a&gt; &lt;a href=&quot;https://twitter.com/hypermkt?ref_src=twsrc%5Etfw&quot;&gt;@hypermkt&lt;/a&gt; と、明日登壇の &lt;a href=&quot;https://twitter.com/asonas?ref_src=twsrc%5Etfw&quot;&gt;@asonas&lt;/a&gt;&lt;a href=&quot;https://twitter.com/hashtag/kaigionrails?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#kaigionrails&lt;/a&gt;&lt;a href=&quot;https://t.co/COTFotyqDx&quot;&gt;https://t.co/COTFotyqDx&lt;/a&gt; &lt;a href=&quot;https://t.co/keXJsVOupB&quot;&gt;pic.twitter.com/keXJsVOupB&lt;/a&gt;&lt;/p&gt;&amp;mdash; SmartHR Developers (@smarthr_dev) &lt;a href=&quot;https://twitter.com/smarthr_dev/status/1849697221517902294?ref_src=twsrc%5Etfw&quot;&gt;October 25, 2024&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;</content:encoded></item><item><title><![CDATA[SmartHRに入社してからの3年間を振り返る]]></title><description><![CDATA[この記事はSmartHR Advent Calender 2022 24 日目です。 はじめに こんにちは、ばーちー(@hypermkt)です。
2020 年 1 月に SmartHR に入社して約 3 年がたちました。2023 年…]]></description><link>https://blog.hypermkt.jp/2022/2022-12-24-smarthr-3-years/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2022/2022-12-24-smarthr-3-years/</guid><pubDate>Sat, 24 Dec 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;この記事は&lt;a href=&quot;https://qiita.com/advent-calendar/2022/smarthr&quot;&gt;SmartHR Advent Calender 2022 24 日目&lt;/a&gt;です。&lt;/p&gt;
&lt;h2&gt;はじめに&lt;/h2&gt;
&lt;p&gt;こんにちは、ばーちー(&lt;a href=&quot;https://twitter.com/hypermkt&quot;&gt;@hypermkt&lt;/a&gt;)です。
2020 年 1 月に SmartHR に入社して約 3 年がたちました。2023 年 1 月より新しいチームへ異動することとなり、ちょうどよい機会なので入社してからの 3 年間をざっくり振り返りたいと思います。&lt;/p&gt;
&lt;h2&gt;3 年間年末調整機能の開発をしていました&lt;/h2&gt;
&lt;p&gt;年末調整とは「所得税の過不足を調整する手続き」のことです。SmartHR の年末調整機能では人事労務担当者と従業員向けに年末機能を提供しています。年末調整機能の開発プロジェクトは年単位となるため、2020 年版、2021 年版、そして 2022 年版の年末調整を開発してきました。&lt;/p&gt;
&lt;p&gt;今でこそ年末調整について大凡把握はできていますが、入社前は控除の意味すら理解していませんでした…。
全くドメイン知識がない状態でも PdM やドメインエキスパートにより情報をインプットする場が設けられており、しっかりと理解した状態で開発に臨むことができ、とても助かりました。&lt;/p&gt;
&lt;h2&gt;一番思い入れのある開発は「キハイショ」です&lt;/h2&gt;
&lt;p&gt;キハイショとは「給与所得者の基礎控除申告書 兼 配偶者控除等申告 兼 所得金額調整控除申告書」のことを言います。&lt;/p&gt;
&lt;p&gt;…&lt;/p&gt;
&lt;p&gt;な、なんだそれは..?! と思われるかもしれませんが、こちらの書類のことです。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/blog/2022/2022-12-24-smarthr-3-years/kihaisho001.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;社内ではこの書類の右上にある「基・配・所」から「キハイショ」と呼ばれています。&lt;/p&gt;
&lt;p&gt;この書類は 2020 年の税制改正に伴って誕生しました。&lt;/p&gt;
&lt;p&gt;特徴的なのは「給与所得者の基礎控除申告書(ピンク枠)」と「給与所得者の配偶者控除等申告(青枠)」と「所得金額調整控除申告書(緑枠)」という３つの書類が一つに合体した書類となっています。分かりづらいので色分けすると以下のようになっています。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/blog/2022/2022-12-24-smarthr-3-years/kihaisho002.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;この書類は自身の給与収入・所得額をピンク枠に、配偶者の給与収入・所得額を青枠に、給与収入が 850 万円を超える場合で特定の要件を満たす場合は緑枠に扶養家族情報を記載する書類です。&lt;/p&gt;
&lt;p&gt;この書類を PDF 出力する機能開発を担当しました。弊社プロダクトの PDF 出力には &lt;a href=&quot;https://www.thinreports.org/&quot;&gt;Thinreports&lt;/a&gt; を使用しており、これを利用することで簡単に PDF 作成が可能となります。ざっくりとした利用イメージとしては出力したい項目ごとにメソッドを用意して、画面上の指定の場所で該当のメソッドを呼ぶ設定をする感じです。&lt;/p&gt;
&lt;p&gt;年末調整書類の難しいところは項目の出力条件の複雑性です。上部にある「あなたの氏名」や「あなたの住所」であればデータベースから取得した値をそのまま出力するだけで簡単ですが、真ん中から下部にある申告書部は特定条件の時のみチェックを入れたり、値の出力をするので複雑度が増します。&lt;/p&gt;
&lt;p&gt;例えば所得金額調整控除申告書の「☆ 扶養親族等」に該当する扶養親族を出力するには&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/blog/2022/2022-12-24-smarthr-3-years/kihaisho003.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;以下の条件判定を行い、2, 3 のいずれかを選定して出力する必要があります。出力パターン・条件が多数あるため、テストケースも網羅的に実装する必要があります。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/blog/2022/2022-12-24-smarthr-3-years/kihaisho004.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;出典: &lt;a href=&quot;https://www.nta.go.jp/taxes/shiraberu/taxanswer/gensen/2676.htm&quot; target=&quot;_blank&quot;&gt;No.2676  年末調整で所得金額調整控除の適用を受けるとき｜国税庁&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;初めて見たときは「なんだこれは…」となりましたが、書類の仕様を把握するにつれて実装も徐々に楽しくなり、完成形の PDF を出力できたときは達成感に満たされたことを覚えています。&lt;/p&gt;
&lt;h2&gt;MTG ファシリテーションは会議設計が重要&lt;/h2&gt;
&lt;p&gt;SmartHR ではすべてのチームでスクラム開発をしています。スクラム開発にはリファイメント、レトロスペクティブ、プランニングなど様々な MTG が行われます。スクラム開発以外でもチームやタスクの方針など様々な MTG が行われます。&lt;/p&gt;
&lt;p&gt;MTG で共通しているのはメンバーとの議論で、意見を発散させ 1 つの終着点に収束させることです。MTG におけるファシリテーターの役目は MTG を円滑に進行させることです。&lt;/p&gt;
&lt;p&gt;いざ自分が MTG のファシリテーションを担当すると、うまく意見の発散や収束ができず苦労することが多かったです。自分は MTG の中における同期的な議論の理解や瞬発力のある会話が苦手であることに気付かされました。&lt;/p&gt;
&lt;p&gt;そこでファシリテーションが得意なチーフ（チームのプレイヤー兼エンジニアマネージャーの役割）に相談し、ファシリテーショは会議設計が重要であることを教えてもらいました。&lt;/p&gt;
&lt;p&gt;具体的な方法については、去年のアドベントカレンダー記事としてこちら「&lt;a href=&quot;https://blog.hypermkt.jp/2021/2021-12-12-improving-scrum-development-through-facilitation/&quot;&gt;ファシリテーションでスクラム開発の改善に取り組んだ話&lt;/a&gt;」にまとめてありますのでご覧ください。&lt;/p&gt;
&lt;p&gt;苦手なものを今すぐ得意に転換することはできなくても、しっかりと準備をすることで MTG ファシリテーションに恐れることなく立ち向かえるようになりました。
今でも苦手なのは変わりないですが、心持ちは全然違います。この「MTG ファシリテーションは会議設計が重要」であることを知れたのはとても大きかったです。&lt;/p&gt;
&lt;h2&gt;パフォーマンス改善は奥が深い&lt;/h2&gt;
&lt;p&gt;2022 年はパフォーマンス改善に注力し、上期は負荷試験を、下期は継続的なパフォーマンス監視と改善に取り組みました。&lt;/p&gt;
&lt;p&gt;パフォーマンス課題の検知については New Relic などのパフォーマンス監視ツールを利用すれば発見は難しくありません。問題は検知したパフォーマンス課題の解決方法を見つけることです。&lt;/p&gt;
&lt;p&gt;パフォーマンス課題は、様々な条件が組み合わさって「遅い」という結果が生まれます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;アプリケーションサーバーまたはデータベースサーバーのインフラスペック&lt;/li&gt;
&lt;li&gt;データベースの特性&lt;/li&gt;
&lt;li&gt;データベースのパラメーター設定&lt;/li&gt;
&lt;li&gt;データベースのインデックス設定&lt;/li&gt;
&lt;li&gt;データ量&lt;/li&gt;
&lt;li&gt;アプリケーション実装&lt;/li&gt;
&lt;li&gt;SQL&lt;/li&gt;
&lt;li&gt;テーブル設計&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;など様々な要素が絡み合っています。パフォーマンス改善ではどのレイヤーにボトルネックがあるかを特定し、解決方法を編みだす必要があります。&lt;/p&gt;
&lt;p&gt;しかし、いざ着手してみるとこれが難しい!!なかなかすぐに答えが見つけられず何日も悩んだことが何度もありました。
こういった難題に取り組むときのコツとしては、すぐにチームメンバーやパフォーマンス改善が得意な強いエンジニア相談することです。
チームメンバーの力や知見を借りることで、どうにか解決方法を見つけてきました。パフォーマンス改善を通じて学んだことは以下の通りです。&lt;/p&gt;
&lt;p&gt;様々なパフォーマンス課題に取り組んで学んだことは以下のとおりです。&lt;/p&gt;
&lt;h3&gt;速い・遅い ORM の特徴を知ること&lt;/h3&gt;
&lt;p&gt;例えば以下のように 生 SQL では速いですが Active Record の &lt;code class=&quot;language-text&quot;&gt;where&lt;/code&gt; メソッドに巨大な配列を渡すを遅い場合があります。何も知らないと便利と思って実装してしまいそうなので、ORM の特徴や知見を貯めていく必要があることを知りました。
※ ちなみに以下の PR は後日 revert されており、現在もこの課題は残ったままと思われます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/rails/rails/pull/39022&quot;&gt;PERF: Improve performance of where when using an array of values by kamipo · Pull Request #39022 · rails/rails&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;速い・遅い SQL の特徴を知ること&lt;/h3&gt;
&lt;p&gt;発行される SQL の JOIN するテーブル数が多かったり、一回で大量のデータを取得しようとすると遅くなることがあります。
遅くなる SQL の特徴と取得対象のテーブルのデータ数なども考慮しながら SQL を組む必要があります。
この辺については以下書籍がとても参考になりました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.amazon.co.jp/dp/4297104083&quot;&gt;失敗から学ぶ RDB の正しい歩き方 (Software Design plus) | 曽根 壮大 |本 | 通販 | Amazon&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;ORM から発行される SQL を知ること&lt;/h3&gt;
&lt;p&gt;発行される SQL がイメージできないと、発行される SQL に問題がないのか判断できません。
ただ ORM が複雑に絡み合ってくると想像もできなくなってくるので、必要に応じて SQL 出力して SQL の実行確認をするのが良さそうです。&lt;/p&gt;
&lt;h3&gt;多角的な観点で課題を見ること&lt;/h3&gt;
&lt;p&gt;冒頭でパフォーマンス課題は様々な要素が絡み合っていると説明した通り、どのレイヤーで影響しているのか多角的に見ていく必要があります。局所的に課題を見るとハマりがちです。&lt;/p&gt;
&lt;h2&gt;おわりに&lt;/h2&gt;
&lt;p&gt;入社して 3 年間をざっくり振り返りました。苦労したことも多かったですが学びも得ており成長に繋げられたと思います。何より開発を通じて利用しているユーザーの皆さんに価値を提供できていると実感できているのが一番のやりがいです。来月からは本体チームとなりますが、年末調整開発で得た知見と経験を活かしていきたいと思います。&lt;/p&gt;
&lt;h2&gt;参考記事&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://qiita.com/kodera123/items/372d78eb450be5653c96&quot;&gt;PDF 出力してみたいんじゃ！ 【Thinreports + Rails】 - Qiita&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.hypermkt.jp/2021/2021-12-12-improving-scrum-development-through-facilitation/&quot;&gt;ファシリテーションでスクラム開発の改善に取り組んだ話 | hypermkt blog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[ファシリテーションでスクラム開発の改善に取り組んだ話]]></title><description><![CDATA[こんにちは、ばーちーです！この記事は SmartHR Advent Calendar 2021 12 日目の記事です。 ブログ記事、前回書いたのが 2021/04/0…]]></description><link>https://blog.hypermkt.jp/2021/2021-12-12-improving-scrum-development-through-facilitation/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2021/2021-12-12-improving-scrum-development-through-facilitation/</guid><pubDate>Sun, 12 Dec 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;こんにちは、ばーちーです！この記事は &lt;a href=&quot;https://qiita.com/advent-calendar/2021/smarthr&quot;&gt;SmartHR Advent Calendar 2021 12 日目&lt;/a&gt;の記事です。&lt;/p&gt;
&lt;p&gt;ブログ記事、前回書いたのが 2021/04/01 だったので随分時間が空いてしまいました。今回は自分が所属するチームで取り組んだお話を紹介したいと思います。&lt;/p&gt;
&lt;h2&gt;はじめに&lt;/h2&gt;
&lt;p&gt;みなさんはスクラム開発をしていますか？ SmartHR では、すべてのプロダクトチームでスクラム開発をしています。&lt;/p&gt;
&lt;p&gt;スクラム開発にはプランニング、レトロスペクティブなど様々なイベントがありますが、各イベントで共通しているのはメンバーとの議論で、如何に意見の発散と収束させられるかがポイントです。しかし、いざスクラムイベントに参加して見ると「レトロスペクティブで Try がまとめられないなぁ〜」「リファイメントをしたのにいざ着手すると漏れがあるなぁ〜」など、意外と難しいぞ!! ということに気付かされます。教科書を読んでフレームワークの使い方を知っても、そのフレームワークをうまく使いこなすのとは別の話です。&lt;/p&gt;
&lt;p&gt;スクラムイベントがうまく進行できないと、プランニングした通りにタスクが消化できず、結果的にユーザーさんに価値を提供する機会が減ってしまいます。計画通りに価値を提供したい、その機会を増やしていきたい！というのが目的であり、その手段として我々はスクラム開発をしています。&lt;/p&gt;
&lt;p&gt;どうすればスクラム開発というフレームワークをうまく使いこなせるのか。この１年間のスクラム開発を通じて「ファシリテーション力」がスクラム開発を円滑に進めるための重要な要素であることに気づきました。&lt;/p&gt;
&lt;h2&gt;スクラム開発におけるファシリテーションの重要性&lt;/h2&gt;
&lt;p&gt;スプリントレトロスペクティブ（以降レトロスペクティブといいます）を例にします。レトロスペクティブは、スプリント最後のイベントで今回のスプリントがどのように進められたかを検査します。レトロスペクティブでは、振り返りフレームワークである KPT 法が用いられることが多く、ファシリテーターが参加者が出した Keep/Problem の深掘りを行い、そこからみんなで議論をして Try を導き出します。&lt;/p&gt;
&lt;p&gt;しかし、安易に「今後も続けたいことはなんですかねぇ〜」「どの辺が一番困りましたか？」と全員に問いかけても、「う〜ん、なんでしょうねぇ・・・」で会話が止まってしまい、意見が出ないということがありました。意見を収束させるのは思っている以上に難しいです。これはレトロスペクティブに限らず他のスクラムイベントでも同様です。つまり、ファシリテーションがイベント進行における重要な要素であることがわかります。&lt;/p&gt;
&lt;h2&gt;チームでファシリテーション力をあげていく&lt;/h2&gt;
&lt;p&gt;実際に自分が所属するチームで行われた事例を紹介します。&lt;/p&gt;
&lt;h3&gt;ファシリテーションのローテーション&lt;/h3&gt;
&lt;p&gt;「習うより慣れろ」で、スクラムイベントのファシリテーターを「ガチャ」でランダムに決めるようにしました。ガチャは Slackbot を利用した簡単なものです。多少の偏りがあるのが欠点ですが、そういうもの!として受け入れて楽しんでいます。&lt;/p&gt;
&lt;p&gt;また、スクラムイベントのファシリテーションには、専門技術は不要なので、チームメンバー全員(エンジニアだけでなくプロダクトマネージャー/UX ライター/QA/ドメインエキスパートなど!)をガチャの対象とするようにしました。これにより公平にファシリテーションをするチャンスが訪れます。いろんな人のファシリテーションを見ることで、「なるほど〜、こんな深掘りの質問の仕方があるんだなぁ〜!」と発見もありました。&lt;/p&gt;
&lt;h3&gt;会議のファシリテーションでは会議設計が重要&lt;/h3&gt;
&lt;p&gt;「○○ の方針についてここでは決められないので別ミーティングで決めましょう」ということが稀にあるかと思います。何かを決める会議ではファシリテーションの事前準備が必要です。大きく以下の 4 点です。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;台本ともいえる資料作り&lt;/li&gt;
&lt;li&gt;結論の決め方を決めておく&lt;/li&gt;
&lt;li&gt;時間配分を考える&lt;/li&gt;
&lt;li&gt;参加者を把握してイメトレをする&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;台本ともいえる資料作り&lt;/h3&gt;
&lt;p&gt;何の用意もなしに参加者を集めていきなり議論を始めてしまうと、参加者は「主催者が何に困っているのか分からない」「どんな観点で意見を言えば良いか分からない」と困ってしまい、決まるものも決まりません。&lt;/p&gt;
&lt;p&gt;例えば以下のような書式で議題についてまとめておきましょう。内容としてはシンプルにしつつも、説明が必要な箇所は記載し、読み上げるだけで説明できるような台本のように使える資料を意識すると良いです。これによりファシリテーションもしやすくなります。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# ○○の方針について&lt;/span&gt;
- タイムテーブル
- 課題
- 議論の観点
- 選択肢
- 結論
- Next Action&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;結論の決め方を決めておく&lt;/h3&gt;
&lt;p&gt;会議の目的は、合意形成を経て問題解決の結論を出すことです。選択肢を列挙して会議に持ち込めば決まるだろうと考えがちですが、事前に結論の決め方を考えておかないと収束できません。方法については議題に応じて適切なものを選択すれば良いと思いますが、以下のサイトにわかりやすくまとまっていますので参考にしてください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.fukuracia.jp/report/blog/1703.html&quot;&gt;どれがいい？会議の結論の出し方 4 パターン | お役立ち&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://backlog.com/ja/blog/3-ways-of-effective-meeting/&quot;&gt;結論の出ない会議から卒業するための 3 つの手法 | Backlog ブログ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;チーム内で何かしらの１つの方針を決める際は、評価項目ごとに天気マークで評価していました。これにより選択肢のメリデメが視覚的にわかり、天気マークがつけ終わる頃には「もうこれしかないでしょう〜」と必然的に決まりました。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;案 A&lt;/th&gt;
&lt;th&gt;案 B&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;お値段&lt;/td&gt;
&lt;td&gt;☀️&lt;/td&gt;
&lt;td&gt;☂️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;機能性&lt;/td&gt;
&lt;td&gt;☁️&lt;/td&gt;
&lt;td&gt;☀️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;デザイン&lt;/td&gt;
&lt;td&gt;☁️&lt;/td&gt;
&lt;td&gt;☀️&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;時間配分を考える&lt;/h3&gt;
&lt;p&gt;会議には制限時間があります。資料ができたのでヨシ！ではなく、各項目毎の時間配分を考えて見ると、意外と ○○ の時間が足りないということに気づけます。時間配分を先に決めておかないと、会議中に時間が迫ると焦ってしまい適切なファシリテーションができなくなります。
例えば資料の中に簡易的なタイムテーブル表を作成し、この後のイメトレと合わせて活用すると良いと思います。&lt;/p&gt;
&lt;h3&gt;参加者を把握しイメトレをする&lt;/h3&gt;
&lt;p&gt;資料も作った! 結論の決め方も決めた! 準備万端! ヨシ! といざ始めて見ると、想定していなかった意見により結論が決まらなかったということが稀にありました。（全然ヨシ! じゃない.. )&lt;/p&gt;
&lt;p&gt;そこで極力そのような状況を回避するために、一度イメトレをするのがお勧めです。参加者を想像し、司会進行をして見ると、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;説明不足の箇所がありそう&lt;/li&gt;
&lt;li&gt;この辺は時間がかかりそう&lt;/li&gt;
&lt;li&gt;あの人からはこんな意見が出るかもしれない&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ということに気づけるでしょう。事前に想定問答を用意することで、気持ち的にも余裕が生まれ司会進行しやすくなります。&lt;/p&gt;
&lt;h3&gt;意見の発散と収束を区別する&lt;/h3&gt;
&lt;p&gt;会議の目的は、「関係者が集まり、特定の目的（議題）に関して意見交換・審議し、合意・施策などの意思決定をすること」です。その過程において意見の「発散」と「収束」を分けることで目的が達成しやすくなります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;発散
&lt;ul&gt;
&lt;li&gt;アイデアを募る&lt;/li&gt;
&lt;li&gt;質より量&lt;/li&gt;
&lt;li&gt;参加者からの意見を引き出す&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;収束
&lt;ul&gt;
&lt;li&gt;発散から生まれたアイデアを絞り込む&lt;/li&gt;
&lt;li&gt;論理的な根拠で判断する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;会議の場面において、今は発散・収束を意識し、メンバーにもそれを共有しながら進行するとゴールまでリードしやすくなります。&lt;/p&gt;
&lt;h3&gt;ファシリテーションハンドブック&lt;/h3&gt;
&lt;p&gt;スクラムイベントのファシリテーションを担当をして見ると、「どうやって進行するんだっけ？」「どんなことを気にして質問すべきかな 〜🤔」と悩むことがありました。&lt;/p&gt;
&lt;p&gt;そこで私の所属するチームでは、朝会・リファイメント用に台本ともいえるファシリテーションハンドブックが用意されました。（チームのエンジニアマネージャー &lt;a href=&quot;https://twitter.com/zoshigayan&quot;&gt;@zoshigayan&lt;/a&gt; さんに超絶感謝! )&lt;/p&gt;
&lt;p&gt;内容としては、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;全体の進め方&lt;/li&gt;
&lt;li&gt;場面毎で
&lt;ul&gt;
&lt;li&gt;声かけ・質問例&lt;/li&gt;
&lt;li&gt;気にかけること&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;などがまとめられています。ちなみにこのハンドブックは、先ほど紹介した会議設計と意見の発散と収束に基づいた資料になっています!&lt;/p&gt;
&lt;p&gt;このファシリテーションハンドブックを用いることで、イベントの司会進行がしやすくなり、また誰に・どんな観点で質問を投げかけがされることで、例えばエンジニアだけでなくカスタマーサクセス・ドメインエキスパート・QA など様々な方の観点で意見を求めることができるようになりました。&lt;/p&gt;
&lt;h2&gt;チーム全体の意識が変わってバーンダウンができるようになった&lt;/h2&gt;
&lt;p&gt;その後チームとしてどうなったのか？！ですが、結果的に&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;徐々にプランニング通りにチケット消化できるようになり、その後継続的かつ高頻度で出来るようになった&lt;/li&gt;
&lt;li&gt;1 スプリントあたりの消化ポイントを増やすことができた&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;特に後者ができたということはチームとしての開発力があがることでユーザーさんへの価値提供の頻度があがりとても良い結果になったと感じています。&lt;/p&gt;
&lt;p&gt;これらができるようになった理由としては以下と考えています。&lt;/p&gt;
&lt;h3&gt;1. レトロスペクティブを活用して継続的に改善できたこと&lt;/h3&gt;
&lt;p&gt;レトロスペクティブで各メンバーの出した Keep/Problem について、チームとしてなぜうまく機能したのか、なぜうまくいかなかったの深掘りができるようになり、そこからチームメンバーで合意した Try が出せるようになりました。またせっかく決めた Try も翌日に忘れては意味がないので、Slack でピン留めして朝会で「今週の Try できてますか〜」くらいの簡単な確認を行いました。&lt;/p&gt;
&lt;p&gt;これにより Try を意識した行動がチーム全体できるようになり、プランニング通りにタスクを消化するにはどうすれば良いか？が朝会・夕会で議論されるようになり、継続的にタスク消化の調整ができるようになりました。&lt;/p&gt;
&lt;h3&gt;2. 手戻りの少ないリファイメントができるようになった&lt;/h3&gt;
&lt;p&gt;チームで用意したリファイメントハンドブックを用いることで、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;進め方に迷わなくなった&lt;/li&gt;
&lt;li&gt;参加者全体で認識合わせができるようになった&lt;/li&gt;
&lt;li&gt;タスク内容の項目毎に聞くべきことがスムーズに問いかけされることで抜け漏れが減った&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;という効果があり、手戻りの少ないリファイメントができることで、着実にプロダクト開発ができるになったと感じています。&lt;/p&gt;
&lt;h2&gt;さいごに&lt;/h2&gt;
&lt;p&gt;私が所属するチームで今年取り組んだチーム開発改善の一部を紹介しました。今年１年を通じてチーム全体でチーム開発として大きく成長できたと実感できました。いろんな施策を何度も試すことで少しずつ変われたと思います。良いことだけか?! というとそうではなく、失敗もたくさんありましたが、去年に比べれば今年は格段に良くなっていると実感しています。&lt;/p&gt;
&lt;p&gt;一般的にエンジニアの技術力として、バックエンド・フロントエンドにおける固有技術や設計技術などが注目されがちですが、チーム開発においては「ファシリテーション力」も技術の一つとして考えるべきだと改めて実感しました。もしこの記事をきっかけに「ファシリテーション」について興味が湧いていいただければ幸いです！&lt;/p&gt;
&lt;p&gt;最後まで読んで頂きありがとうございました! Merry Christmas!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[最近出会ったRubyの便利メソッド復習]]></title><description><![CDATA[はじめに 開発の過程やコードレビューで便利メソッドに出会ったので、次回からすぐに使えるように備忘録としてまとめておく。 ActiveSupport の try nil でない時に何かしたいときに便利 そういうとき、よくありますよね。 そんな時には ActiveSupport…]]></description><link>https://blog.hypermkt.jp/2021/2021-04-01-benri-ruby-method/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2021/2021-04-01-benri-ruby-method/</guid><pubDate>Thu, 01 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;はじめに&lt;/h2&gt;
&lt;p&gt;開発の過程やコードレビューで便利メソッドに出会ったので、次回からすぐに使えるように備忘録としてまとめておく。&lt;/p&gt;
&lt;h2&gt;ActiveSupport の try&lt;/h2&gt;
&lt;h3&gt;nil でない時に何かしたいときに便利&lt;/h3&gt;
&lt;p&gt;そういうとき、よくありますよね。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ruby&quot;&gt;&lt;pre class=&quot;language-ruby&quot;&gt;&lt;code class=&quot;language-ruby&quot;&gt;name &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;nil&lt;/span&gt;
p name&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;upcase &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;present&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;そんな時には ActiveSupport の &lt;a href=&quot;https://railsguides.jp/active_support_core_extensions.html#try&quot;&gt;try&lt;/a&gt; が便利だった。ちょっとした処理でもスマートにかけるのいいですねー。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ruby&quot;&gt;&lt;pre class=&quot;language-ruby&quot;&gt;&lt;code class=&quot;language-ruby&quot;&gt;name &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;nil&lt;/span&gt;
name&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;try&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:upcase&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# ブロックを渡すことできる&lt;/span&gt;
name&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;try &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;v&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; v&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;upcase &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Enumerable#group_by&lt;/h2&gt;
&lt;h3&gt;仕分けには group_by は便利&lt;/h3&gt;
&lt;p&gt;例えば &lt;code class=&quot;language-text&quot;&gt;people&lt;/code&gt; という人の集まりの配列があり、大人と子供で仕分けしたいとする。そんな時には &lt;a href=&quot;https://docs.ruby-lang.org/ja/latest/method/Enumerable/i/group_by.html&quot;&gt;Enumerable#group_by&lt;/a&gt; がめっちゃ便利だった。&lt;/p&gt;
&lt;p&gt;ポイントとしてはブロックで評価した結果をキーとしてハッシュにセットされるので、そこは好きなものをセットするのが良さそう。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ruby&quot;&gt;&lt;pre class=&quot;language-ruby&quot;&gt;&lt;code class=&quot;language-ruby&quot;&gt;people &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Max&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;age&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;30&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;John&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;age&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Michael&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;age&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
result &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; people&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;group_by &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;v&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; v&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:age&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;
    &lt;span class=&quot;token symbol&quot;&gt;:adult&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;
    &lt;span class=&quot;token symbol&quot;&gt;:child&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;

p result&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;いやー、これは便利だわ。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ruby&quot;&gt;&lt;pre class=&quot;language-ruby&quot;&gt;&lt;code class=&quot;language-ruby&quot;&gt;$ ruby group_by&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;rb
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:adult&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Max&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;:age&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;30&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;John&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;:age&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;:child&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Michael&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;:age&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Array#sort&lt;/h2&gt;
&lt;p&gt;データベースからデータを取得する場合は order by をすればいいが、API のレスポンスや CSV データを任意の条件で並び替えたい時に &lt;a href=&quot;https://docs.ruby-lang.org/ja/latest/method/Array/i/sort.html&quot;&gt;Array#sort&lt;/a&gt; が便利だった&lt;/p&gt;
&lt;p&gt;対象の配列に対して比較条件をブロックで渡すだけで OK。いやぁ、知らなかったなー。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ruby&quot;&gt;&lt;pre class=&quot;language-ruby&quot;&gt;&lt;code class=&quot;language-ruby&quot;&gt;people &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Max&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;age&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;John&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;age&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;30&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Michael&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;age&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# age の昇順に並び替え&lt;/span&gt;
p people&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sort &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;a&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; b&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; a&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:age&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;=&gt;&lt;/span&gt; b&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:age&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# =&gt; [{:name=&gt;&quot;Max&quot;, :age=&gt;10}, {:name=&gt;&quot;Michael&quot;, :age=&gt;20}, {:name=&gt;&quot;John&quot;, :age=&gt;30}]&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# b, a を入れ替えることで age の降順に並び替え&lt;/span&gt;
p people&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sort &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;a&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; b&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; b&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:age&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;=&gt;&lt;/span&gt; a&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:age&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# =&gt; [{:name=&gt;&quot;John&quot;, :age=&gt;30}, {:name=&gt;&quot;Michael&quot;, :age=&gt;20}, {:name=&gt;&quot;Max&quot;, :age=&gt;10}]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;ポイントは &lt;code class=&quot;language-text&quot;&gt;&amp;lt;=&gt;&lt;/code&gt; 演算子による数値の比較。a, b をそのまま比較すれば昇順となるので、b, a で比較すれば降順となる。なるほどなぁ〜。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ruby&quot;&gt;&lt;pre class=&quot;language-ruby&quot;&gt;&lt;code class=&quot;language-ruby&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; pry&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;main&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;=&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;200&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; pry&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;main&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;200&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;=&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; pry&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;main&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;=&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Enumerable#sort_by&lt;/h2&gt;
&lt;p&gt;sort_by というのもあるんですねぇ。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ブロックの評価結果を &amp;#x3C;=&gt; メソッドで比較することで、self を昇順にソートします&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;なるほどー。 パフォーマンス的にも sort よりも優れていると能登なので、基本的にはこちらを使うのが良さそう。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ruby&quot;&gt;&lt;pre class=&quot;language-ruby&quot;&gt;&lt;code class=&quot;language-ruby&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; pry&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;main&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sort_by &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;v&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; v &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;以上!&lt;/p&gt;
&lt;h2&gt;参考&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://railsguides.jp/active_support_core_extensions.html#try&quot;&gt;Active Support コア拡張機能 - Rails ガイド&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.ruby-lang.org/ja/latest/method/Enumerable/i/group_by.html&quot;&gt;Enumerable#group_by (Ruby 3.0.0 リファレンスマニュアル)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.ruby-lang.org/ja/latest/method/Array/i/sort.html&quot;&gt;Array#sort (Ruby 3.0.0 リファレンスマニュアル)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.ruby-lang.org/ja/latest/method/Enumerable/i/sort_by.html&quot;&gt;Enumerable#sort_by (Ruby 3.0.0 リファレンスマニュアル)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[CircleCIで Swagger yaml ファイルのバリデーションをする]]></title><description><![CDATA[背景 RESTful API の API ドキュメントとして Swagger を利用している人も多いと思います。 yaml ファイルと Swagger UI…]]></description><link>https://blog.hypermkt.jp/2020/2020-12-25-validate-swagger-yaml-on-circleci/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2020/2020-12-25-validate-swagger-yaml-on-circleci/</guid><pubDate>Fri, 25 Dec 2020 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;背景&lt;/h2&gt;
&lt;p&gt;RESTful API の API ドキュメントとして Swagger を利用している人も多いと思います。 yaml ファイルと Swagger UI を利用している場合、ついついエラーに気づかず進めてしまうことが多々ありました。
先日開発チームの同僚が年末大掃除として溜まりに溜まったエラーを一気に修正してくれましたが、何かしらの対策をしないと知らずにエラーをまた埋め込んでしまう…
そこで再発防止策として CI 上で Swagger の yaml ファイルをバリデーションし文法エラーを自動的に検知するようにしました。&lt;/p&gt;
&lt;h2&gt;環境&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;CircleCI version 2.1&lt;/li&gt;
&lt;li&gt;Open API version 3&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;方針&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/APIDevTools/swagger-cli&quot;&gt;APIDevTools/swagger-cli&lt;/a&gt;を使って Swagger yaml ファイルをバリデーションします。
swagger-cli は名前の通り Swagger 定義をバリデーションするツールで &lt;code class=&quot;language-text&quot;&gt;validate&lt;/code&gt; コマンドを渡すことで簡単にチェックできます。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;正常な場合&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shellscript&quot;&gt;&lt;pre class=&quot;language-shellscript&quot;&gt;&lt;code class=&quot;language-shellscript&quot;&gt;$ swagger-cli validate petstore.yml
petstore.yml is valid&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;異常な場合&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shellscript&quot;&gt;&lt;pre class=&quot;language-shellscript&quot;&gt;&lt;code class=&quot;language-shellscript&quot;&gt;$ swagger-cli validate petstore.yml
Swagger schema validation failed.
  Additional properties not allowed: tag at #/paths//pets/get

JSON_OBJECT_VALIDATION_FAILED&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;これを CI 上で実行すれば OK！&lt;/p&gt;
&lt;h2&gt;導入&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;yarn run で実行できるように package.json の　 scripts 定義をする&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;scripts&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;validate:swagger-yml&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;swagger-cli validate&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;devDependencies&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;@apidevtools/swagger-cli&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;^4.0.4&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;.circleci/config.yml&lt;/code&gt; に以下を定義する&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;設定ファイル全体を以下に定義していますが必要なのは &lt;code class=&quot;language-text&quot;&gt;swagger_yaml_validate&lt;/code&gt; のジョブの箇所です。それ以外はお好みに調整してください。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2.1&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;executors&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;docker&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; circleci/node&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;10.18.0&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;buster
&lt;span class=&quot;token key atrule&quot;&gt;commands&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;steps&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; checkout
  &lt;span class=&quot;token key atrule&quot;&gt;yarn_install&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;steps&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;restore_cache&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Restore Yarn Package Cache
          &lt;span class=&quot;token key atrule&quot;&gt;keys&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; yarn&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;packages&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; checksum &quot;yarn.lock&quot; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Install Dependencies
          &lt;span class=&quot;token key atrule&quot;&gt;command&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; yarn install &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;immutable
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;save_cache&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Save Yarn Package Cache
          &lt;span class=&quot;token key atrule&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; yarn&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;packages&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; checksum &quot;yarn.lock&quot; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
          &lt;span class=&quot;token key atrule&quot;&gt;paths&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; ~/.cache/yarn
&lt;span class=&quot;token key atrule&quot;&gt;jobs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;swagger_yaml_validate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;executor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; default
    &lt;span class=&quot;token key atrule&quot;&gt;steps&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; build
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; yarn_install
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Run validate swagger yaml file
          &lt;span class=&quot;token key atrule&quot;&gt;command&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; yarn run validate&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;swagger&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;yml your_schema.yml
&lt;span class=&quot;token key atrule&quot;&gt;workflows&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;build_and_test&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;jobs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; swagger_yaml_validate&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;あとは CircleCI 上で実行するだけです。わざと Swagger yaml 内で文法ミスを起こしてコミットし、CI 上でエラーが起きれば成功です。&lt;/p&gt;
&lt;h2&gt;まとめ&lt;/h2&gt;
&lt;p&gt;ついつい見逃しがちな小さなエラーも年単位で貯まると修正するのも大変です。最初から発生しないようにしておけば負債にならずに済みます。
導入自体は簡単なのでもし同じような悩みを抱えている場合は試してみてください。&lt;/p&gt;
&lt;h2&gt;参考&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://circleci.com/docs/reference-2-1/#circleci-2-1-reference&quot;&gt;CircleCI 2.1 Reference – CircleCI 2.1 Reference&lt;/a&gt;&lt;a href=&quot;https://circleci.com/docs/reference-2-1/#circleci-2-1-reference&quot;&gt;CircleCI 2.1 Reference – CircleCI 2.1 Reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/APIDevTools/swagger-cli&quot;&gt;APIDevTools/swagger-cli: Swagger 2.0 and OpenAPI 3.0 command-line tool&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[安全にRails Consoleが使いたい]]></title><description><![CDATA[この記事は、SmartHR Advent Calender 2020 20 日目です。 背景 サービスの運用上、利用状況の調査などで本番データベースからデータ取得したいことがあります。DB に Read Only ユーザーを作成し DB のクライアントツールや Redash…]]></description><link>https://blog.hypermkt.jp/2020/2020-12-19-read-only-rails-console/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2020/2020-12-19-read-only-rails-console/</guid><pubDate>Sat, 19 Dec 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;この記事は、&lt;a href=&quot;https://qiita.com/advent-calendar/2020/smarthr&quot;&gt;SmartHR Advent Calender 2020 20 日目&lt;/a&gt;です。&lt;/p&gt;
&lt;h2&gt;背景&lt;/h2&gt;
&lt;p&gt;サービスの運用上、利用状況の調査などで本番データベースからデータ取得したいことがあります。DB に Read Only ユーザーを作成し DB のクライアントツールや Redash などから SQL を利用するケースが多いと思います。
ほとんどのユースケースではそれで事足りるのですが、Rails Console から Active Record や実装した機能を組み合わせてデータ取得したいと感じることが何度かありました。
ただ普通に Rails Console を起動すると DB の Master 側に接続されるので、操作ミスによるデータ更新や DB に高負荷をかけてしまいサービス影響を与えてしまう恐れがありました。&lt;/p&gt;
&lt;p&gt;そこで本記事では 安心 &amp;#x26; 安全に利用できる Read Only Rails Console の導入方法について紹介します。&lt;/p&gt;
&lt;h2&gt;解決したい課題&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Rails Console を参照専用で利用したい&lt;/li&gt;
&lt;li&gt;重たい処理を実行してもサービス影響が無いようにしたい&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;リードレプリカ環境を用意する&lt;/li&gt;
&lt;li&gt;DB 接続の接続情報をリードレプリカ環境の情報に上書きして Rails Console を起動するだけ&lt;/li&gt;
&lt;li&gt;サービス運用では重宝するツールとなるのでオススメ&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;検証環境&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Rails 6.0&lt;/li&gt;
&lt;li&gt;PostgreSQL
&lt;ul&gt;
&lt;li&gt;MySQL でも同じことは可能です&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;sandbox モードがあるよね！&lt;/h2&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;rails console --sandbox&lt;/code&gt; で起動をすると Sandbox モードとなりコンソールを抜けると SQL がすべてロールバックされるので課題 1 は解決できます！
ですが、万が一サーバー負荷を与えるような Active Record を実行してしまった場合は、サービス影響も与えてしまう懸念があるので安心できないなぁと感じてました。&lt;/p&gt;
&lt;p&gt;refs: &lt;a href=&quot;https://railsguides.jp/command_line.html#rails-console&quot;&gt;Rails のコマンドラインツール - Rails ガイド&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;そこでとても単純な方針ですかサービスが直接が利用しないリードレプリカ環境を用意して、そこに Rails Console の DB が接続するようにすれば両方の課題が解決できます！&lt;/p&gt;
&lt;h2&gt;手順&lt;/h2&gt;
&lt;h3&gt;ステップ１: リードレプリカ環境を用意する&lt;/h3&gt;
&lt;p&gt;DB のスレーブサーバーを構築し、SELECT のみを許可した READ ONLY ユーザーを用意します。AWS RDS でクラスターを組んでいる場合は&lt;a href=&quot;http://e-words.jp/w/%E3%83%AA%E3%83%BC%E3%83%89%E3%83%AC%E3%83%97%E3%83%AA%E3%82%AB.html&quot;&gt;リードレプリカ&lt;/a&gt;を利用するも OK です。
もし環境の都合でリードレプリカ環境が用意できない場合は、Master 側に READ ONLY ユーザーを用意するだけでも良いです。&lt;/p&gt;
&lt;p&gt;(さらっと言いましたが地味にこの環境を用意するのが大変ですね)&lt;/p&gt;
&lt;h3&gt;ステップ２: リードレプリカ環境の環境変数を設定する&lt;/h3&gt;
&lt;p&gt;例:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;READ_ONLY_DATABASE_URL&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;postgres://read_only_user:password@read_replica_host:5432/database&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;ステップ３: リードレプリカ環境を利用する Rails Console の起動スクリプトを用意する&lt;/h3&gt;
&lt;p&gt;Rails アプリケーション内の &lt;code class=&quot;language-text&quot;&gt;bin/production_read_only/rails&lt;/code&gt; に以下をスクリプトを配置します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token shebang important&quot;&gt;#!/bin/bash&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-z&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$READ_ONLY_DATABASE_URL&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;
    &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;READ_ONLY_DATABASE_URL is empty&quot;&lt;/span&gt;
    &lt;span class=&quot;token builtin class-name&quot;&gt;exit&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;

&lt;span class=&quot;token builtin class-name&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;DATABASE_URL&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$READ_ONLY_DATABASE_URL&lt;/span&gt;
bin/rails &lt;span class=&quot;token variable&quot;&gt;$@&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;本番サーバーにデプロイ後、 &lt;code class=&quot;language-text&quot;&gt;bin/production_read_only/rails c&lt;/code&gt; と実行すれば READ ONLY な Rails Console として利用できます！ 🎉&lt;/p&gt;
&lt;h2&gt;まとめ&lt;/h2&gt;
&lt;p&gt;今回用意したスクリプトや方針自体は大した内容ではないですが、Rails Console がユーザー影響を与えることなく安全に利用できるようになりました。
サービス運用の観点ではとても重宝するツールとなりますので、興味のある方はぜひ試してみてください。&lt;/p&gt;
&lt;h2&gt;参考&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://railsguides.jp/active_record_multiple_databases.html&quot;&gt;Active Record で複数のデータベース利用 - Rails ガイド&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://railsguides.jp/command_line.html#rails-console&quot;&gt;Rails のコマンドラインツール - Rails ガイド&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[AWS SESを利用したメール配信とバウンスメール対策の設計案]]></title><description><![CDATA[はじめに とあるサービスのアプリケーションからのメール配信を AWS SES に切り替えるため、全体的なアーキテクチャを検討した。内容としては参考サイトの内容と被っているが、自分の理解のためにまとめた。 現状 アプリケーションからは Dovecot + Postfix…]]></description><link>https://blog.hypermkt.jp/2020/2020-03-29-aws-ses-email-architecture/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2020/2020-03-29-aws-ses-email-architecture/</guid><pubDate>Sun, 29 Mar 2020 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;はじめに&lt;/h2&gt;
&lt;p&gt;とあるサービスのアプリケーションからのメール配信を AWS SES に切り替えるため、全体的なアーキテクチャを検討した。内容としては参考サイトの内容と被っているが、自分の理解のためにまとめた。&lt;/p&gt;
&lt;h2&gt;現状&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;アプリケーションからは Dovecot + Postfix で構築したメールサーバーを利用してメール配信をしている&lt;/li&gt;
&lt;li&gt;バウンスメール対応が出来ていない&lt;/li&gt;
&lt;li&gt;OS のサポート期限が迫っている&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;要求&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;OS のサポート期限問題を解決したい&lt;/li&gt;
&lt;li&gt;マネージドサービスを利用してインフラ運用の手間を減らしたい = サービス開発に注力したい&lt;/li&gt;
&lt;li&gt;バウンスメール対応をしたい&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;アーキテクチャー&lt;/h2&gt;
&lt;p&gt;上記の現状と要求と満たすため、AWS のドキュメント・各種ブログの記事を参考にして、AWS SES を利用したメール配信アーキテクチャにしたい。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/blog/2020/2020-03-29-01.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;ポイント&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;SES を利用することでメールサーバーの構築・運用が不要&lt;/li&gt;
&lt;li&gt;App からのメール配信は AWS SES 経由で行う
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/Welcome.html&quot;&gt;Amazon SES とは&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;AWS SES ではメール送信の結果をバウンス（不達）、苦情、配達の３つを受け取ることができる。それらの結果は、AWS SNS トピックの HTTP エンドポイントのリクエストを利用して、App に送信する
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/monitor-sending-activity-using-notifications.html&quot;&gt;Amazon SES 通知を使用したモニタリング&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;App は AWS SNS より受けたリクエストの種類に応じて処理。バウンス・苦情のメールアドレスは、送信失敗メールアドレスとして DB などに保持。&lt;/li&gt;
&lt;li&gt;App からメール配信時は、送信失敗メールアドレスのリストと比較して、対象メールアドレスには送信しないようにする。それ以外の場合は正常なメールアドレスとしてメール送信しても良い。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;おわりに&lt;/h2&gt;
&lt;p&gt;全体的なアーキテクチャとしては実現できそうなイメージとなった。個々の細かい仕様や設定方法は随時調べる必要はあるが、多分どうにかなるだろう。あとは頑張るのみ。&lt;/p&gt;
&lt;h2&gt;参考&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://vitalify.jp/blog/2018/03/aws-ses-bouncemail.html&quot;&gt;AWS の SES でバウンスメール(bouncemail)対策。3 つの方法とメリット・デメリット | ブログ｜ベトナムでのオフショア開発とスマートフォンアプリ開発のバイタリフィ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.shibayu36.org/entry/2015/08/27/101815&quot;&gt;Amazon SES と SNS を利用してバウンスメールを自動的にハンドリングする - $shibayu36-&gt;blog;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://program-memo.com/archives/599&quot;&gt;Amazon SES と SNS を使って バウンスメールを PHP でハンドリング | ProgramMemo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://micpsm.hatenablog.com/entry/2019/12/06/120000&quot;&gt;Amazon SES ベストプラクティス&amp;#x26;アンチパターン - 後ろを向いて後退します&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.classmethod.jp/articles/amazonsns-http/&quot;&gt;[Node.js]Amazon SNSでHTTPを使って通知を受け取る[aws-sdk-js]&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[独自ドメインのメールアドレス管理をさくらのメールボックスに移設した]]></title><description><![CDATA[はじめに 独自ドメインのメールアドレスをDovecot + Postfixで構築されたメールサーバーで管理していました。このメールサーバーは2015年に構築以来、今日まで大きな障害は一切なく安定稼働を続けてきました。しかし、OSのサポート期限が近づいてきたこともあり、OS…]]></description><link>https://blog.hypermkt.jp/2020/2020-03-22-moved-to-sakura-mail-box/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2020/2020-03-22-moved-to-sakura-mail-box/</guid><pubDate>Sun, 22 Mar 2020 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;はじめに&lt;/h2&gt;
&lt;p&gt;独自ドメインのメールアドレスをDovecot + Postfixで構築されたメールサーバーで管理していました。このメールサーバーは&lt;a href=&quot;/2015/2015-11-29-server-relocated-for-ten-million-pv-site/&quot;&gt;2015年に構築&lt;/a&gt;以来、今日まで大きな障害は一切なく安定稼働を続けてきました。しかし、OSのサポート期限が近づいてきたこともあり、OSのアップデート対応をする必要がありました。&lt;/p&gt;
&lt;h2&gt;困っていたこと&lt;/h2&gt;
&lt;p&gt;このメールサーバー運用でいくつか困っていたことがありました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;【切実】OSのサポート期限が迫っていたので、早く問題を解決したい&lt;/li&gt;
&lt;li&gt;手動構築されたサーバーなので再構築するのが手間&lt;/li&gt;
&lt;li&gt;Ansibleなどのプロビジョニングツールで書き直すのが手間&lt;/li&gt;
&lt;li&gt;Dovecot + Postfixの設定が難しい&lt;/li&gt;
&lt;li&gt;サーバーの運用コストが少しかかっていた&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;といろいろありました。新OSでサーバーを再構築して移設するのが順当なのですが、それなりに時間がかかることもあり、できればもう少し楽な方法を模索していました。
いろいろ調べていた所、メール専用のサービスがあることを知り、運用の手間を減らしてサービス開発に注力するため、今回はメール専用サービスに移設する方針としました。&lt;/p&gt;
&lt;h2&gt;メール専用サービスに求める要件&lt;/h2&gt;
&lt;p&gt;要件をまとめると以下となりました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;必須
&lt;ul&gt;
&lt;li&gt;ドメインレジストラに依存せず利用可
&lt;ul&gt;
&lt;li&gt;運用中のサービスドメインなので、気軽のドメインレジストラの変更は不可&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;お値段が安い
&lt;ul&gt;
&lt;li&gt;現サーバーコストより低ければOK&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;メールアドレス・転送メールアドレスが各々10個程度作成可能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;出来たら
&lt;ul&gt;
&lt;li&gt;Webメーラーが提供されている&lt;/li&gt;
&lt;li&gt;Web UIが分かりやすい&lt;/li&gt;
&lt;li&gt;お試し利用ができる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;その条件で調べた結果、&lt;a href=&quot;https://www.sakura.ne.jp/mail/&quot;&gt;さくらのメールボックス&lt;/a&gt;、&lt;a href=&quot;https://muumuu-mail.com/&quot;&gt;ムームーメール&lt;/a&gt;、&lt;a href=&quot;https://www.onamae.com/service/mail/&quot;&gt;お名前メール&lt;/a&gt; の３つが候補としてあがり、検討した結果「さくらのメールボックス」を採用しました。&lt;/p&gt;
&lt;h2&gt;さくらのメールボックスを選んだ理由&lt;/h2&gt;
&lt;p&gt;理由は以下の通りです。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;【重要】ドメインレジストラに依存せずに利用できる
&lt;ul&gt;
&lt;li&gt;ムームーメールはムームードメインで管理しているドメインでないと利用できない制限があり、今回の候補から外れました&lt;/li&gt;
&lt;li&gt;お名前メールはお名前.com管理のドメインでなくとも利用できるとのことでしたが、MXレコードに設定すべきホスト名が非公開かつ非推奨の利用方法とのことでしたので、候補から外しました&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;料金が安い
&lt;ul&gt;
&lt;li&gt;料金は初期費用無料で「年間一括 1,048円」と格安！&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;お試し利用ができる
&lt;ul&gt;
&lt;li&gt;候補の中でさくらのメールボックスが唯一お試し利用ができました。契約時にクレジットカード決済がありますが、２週間以内にキャンセルすれば返金されます。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;移設手順&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;さくらのメールボックスを契約する
&lt;ul&gt;
&lt;li&gt;初期ドメインのホスト名が作成される&lt;/li&gt;
&lt;li&gt;&lt;img src=&quot;/images/blog/2020/2020-03-22-01.png&quot; alt=&quot;&quot;&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;さくらのメールボックスで環境構築
&lt;ol&gt;
&lt;li&gt;独自ドメイン(例: your-domain.jp）を登録する&lt;/li&gt;
&lt;li&gt;メールアドレス、転送メールアドレス設定をする&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;各自のメーラーでさくらのメールボックスで作成したメールアドレスを設定&lt;/li&gt;
&lt;li&gt;DNSでTTLを300秒など短くする
&lt;ul&gt;
&lt;li&gt;これは万が一トラブルが発生した際に、すぐに戻せるようにするため&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;DNSで独自ドメイン(例: your-domain.jp）のMXレコードをさくらのメールボックスで作成された初期ドメイン名（例: your-domain.sakura.ne.jp )に変更する&lt;/li&gt;
&lt;li&gt;独自ドメインのメールアドレス、転送メールアドレスでメールの送受信が可能か確認する&lt;/li&gt;
&lt;li&gt;終わり&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;おわりに&lt;/h2&gt;
&lt;p&gt;目的は無事に達成できました。作業自体も簡単で特に大きな問題はありませんでした。これで今後の運用も楽になります。メールサーバーの構築は難易度が高く再構築も難しいので、メールアドレス管理はさくらのメールボックスのようなメール専用サービスに任せてしまうのも有りだと思いました。&lt;/p&gt;
&lt;h2&gt;参考情報&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.sakura.ne.jp/mail/&quot;&gt;さくらのメールボックス&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://help.sakura.ad.jp/category/rs/rs_mail/?_ga=2.5386224.2109349385.1584797086-367465202.1584164950&quot;&gt;メール – さくらのサポート情報&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.hypermkt.jp/2015/2015-11-29-server-relocated-for-ten-million-pv-site/&quot;&gt;月間約1,000万PVのサイトをサーバー移設した話 | hypermkt blog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Protocol Buffersのwrappers.protoによる副作用とその解決法]]></title><description><![CDATA[はじめに Protocol Buffers の標準型を利用した場合、エレメントに値がセットしないと初期値が設定される仕様があります。これはドキュメントのこちらで説明されています。しかし、この仕様では nil 判定ができないという問題がありました。 そこで gRPC Plugin…]]></description><link>https://blog.hypermkt.jp/2020/2020-03-08-protocol-buffers-wrappers-proto/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2020/2020-03-08-protocol-buffers-wrappers-proto/</guid><pubDate>Sun, 08 Mar 2020 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;はじめに&lt;/h2&gt;
&lt;p&gt;Protocol Buffers の標準型を利用した場合、エレメントに値がセットしないと初期値が設定される仕様があります。これはドキュメントの&lt;a href=&quot;https://developers.google.com/protocol-buffers/docs/proto#optional&quot;&gt;こちら&lt;/a&gt;で説明されています。しかし、この仕様では nil 判定ができないという問題がありました。&lt;/p&gt;
&lt;p&gt;そこで gRPC Plugin として提供されている &lt;code class=&quot;language-text&quot;&gt;wrappers.proto&lt;/code&gt; を使用することで、nil 判定が可能となりましたが、ある副作用がありました。本記事ではその副作用とその解決方法について紹介します。&lt;/p&gt;
&lt;h2&gt;前提&lt;/h2&gt;
&lt;p&gt;以下の環境で検証をしました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ruby 2.6.1&lt;/li&gt;
&lt;li&gt;Gem
&lt;ul&gt;
&lt;li&gt;protobuf 3.11.4&lt;/li&gt;
&lt;li&gt;grpc-tools 1.27.0&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;nil 判定できない問題と wrappers.proto について&lt;/h2&gt;
&lt;p&gt;本件の前提知知識として簡単に紹介します。例えば以下のように定義します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;syntax = &quot;proto3&quot;;

message SampleMessage {
  int64 age = 1;
  string name = 2;
  bool has_job = 3;
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;値が未設定の場合は、型に応じた初期値がセットされてしまいます。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ruby&quot;&gt;&lt;pre class=&quot;language-ruby&quot;&gt;&lt;code class=&quot;language-ruby&quot;&gt;irb&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;main&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;002&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;SampleMessage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;SampleMessage&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; age&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;has_job&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;それであれば、 &lt;code class=&quot;language-text&quot;&gt;nil&lt;/code&gt; をセットすれば良いと思いますが、&lt;strong&gt;nil はセットされず&lt;/strong&gt;、それでも初期値が設定されてしまします。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ruby&quot;&gt;&lt;pre class=&quot;language-ruby&quot;&gt;&lt;code class=&quot;language-ruby&quot;&gt;irb&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;main&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;004&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;SampleMessage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;age&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;nil&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;nil&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;has_job&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;nil&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;SampleMessage&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; age&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;has_job&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;つまり、 &lt;code class=&quot;language-text&quot;&gt;nil&lt;/code&gt; 判定ができないので、故意にセットされた値なのか、未セットなのか判定できないという問題が発生します。&lt;/p&gt;
&lt;h3&gt;そこで wrappers.proto を使えば nil 判定できる&lt;/h3&gt;
&lt;p&gt;wrappers.proto で提供される &lt;code class=&quot;language-text&quot;&gt;Google::Protobuf::StringValue&lt;/code&gt; という型を利用することで、&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;syntax = &quot;proto3&quot;;

import &quot;google/protobuf/wrappers.proto&quot;;

message SampleMessage2 {
  google.protobuf.Int64Value age = 1;
  google.protobuf.StringValue name = 2;
  google.protobuf.BoolValue has_job = 3;
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;値が未セットの場合は nil になり、これで値の nil 判定が可能になりました！&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ruby&quot;&gt;&lt;pre class=&quot;language-ruby&quot;&gt;&lt;code class=&quot;language-ruby&quot;&gt;irb&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;main&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;016&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;SampleMessage2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;SampleMessage2&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; age&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;nil&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;nil&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;has_job&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;nil&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;wrappers.proto については、以下のブログ記事で詳しく解説されていますのでご参考ください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://qiita.com/k-o-u/items/cf333a4ce30973524591&quot;&gt;ProtocolBuffers での wrappers.proto の使い方 - Qiita&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://matsu-chara.hatenablog.com/entry/2016/11/12/110000&quot;&gt;ProtocolBuffers で primitive のデフォルト値と値が入っていないことを区別したいときにどう書くか - だいたいよくわからないブログ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.soushi.me/entry/2017/09/03/170655/&quot;&gt;protobuf type に値が入っているか確認するには google/protobuf/wrappers.proto をつかうとよい - 平日インプット週末アウトプットぶろぐ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;wrappers.proto で万事解決と思われたが副作用があった&lt;/h2&gt;
&lt;p&gt;しかし、wrappers.proto で提供される型を使用した場合に副作用がありました。値をセットする際に &lt;code class=&quot;language-text&quot;&gt;Google::Protobuf::Int64Value.new(value: 10)&lt;/code&gt; のように wrappers.proto で定義されている型別のオブジェクトを渡す必要になり、オブジェクト構造も変わりました。クラス名が地味に長い…&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ruby&quot;&gt;&lt;pre class=&quot;language-ruby&quot;&gt;&lt;code class=&quot;language-ruby&quot;&gt;irb&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;main&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;017&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; foo &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;SampleMessage2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;age&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Google&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;Protobuf&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Int64Value&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Google&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;Protobuf&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;StringValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;yamada&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;has_job&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Google&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;Protobuf&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;BoolValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;SampleMessage2&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; age&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Google&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;Protobuf&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;Int64Value&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; value&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Google&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;Protobuf&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;StringValue&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; value&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;yamada&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;has_job&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Google&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;Protobuf&lt;span class=&quot;token double-colon punctuation&quot;&gt;::&lt;/span&gt;BoolValue&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; value&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;値を取得するときは &lt;code class=&quot;language-text&quot;&gt;.value&lt;/code&gt; を指定しないといけなくなってしまった。面倒くさい！&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ruby&quot;&gt;&lt;pre class=&quot;language-ruby&quot;&gt;&lt;code class=&quot;language-ruby&quot;&gt;irb&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;main&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;018&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; foo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;age&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;value
&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Message オブジェクトをハッシュ化すると以下になります。何が一番困るかというと、通常の key/value なハッシュ構造であれば、そのまま ActiveRecord に渡すことができましたが、以下の構造だとそのまま渡すことができません。これが&lt;strong&gt;今回の本題&lt;/strong&gt;です。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ruby&quot;&gt;&lt;pre class=&quot;language-ruby&quot;&gt;&lt;code class=&quot;language-ruby&quot;&gt;irb&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;main&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;020&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; foo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;to_h
&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:age&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:value&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;:name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:value&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;yamada&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;:has_job&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:value&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;解決策&lt;/h2&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;{foo: {value: &quot;bar&quot;} }&lt;/code&gt; の構造を&lt;code class=&quot;language-text&quot;&gt;{foo: &quot;bar&quot;}&lt;/code&gt; に変換するため、再帰的にハッシュを精査して該当の箇所を愚直に変換するようにしました。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ruby&quot;&gt;&lt;pre class=&quot;language-ruby&quot;&gt;&lt;code class=&quot;language-ruby&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token method-definition&quot;&gt;&lt;span class=&quot;token function&quot;&gt;extract_values&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;obj&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; obj
  &lt;span class=&quot;token keyword&quot;&gt;when&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Hash&lt;/span&gt;
    obj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;compact&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;transform_values &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;v&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; v&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;kind_of&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;Array&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;extract_values&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;v&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;
        v&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:value&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;when&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;Array&lt;/span&gt;
    obj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;map &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;v&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;extract_values&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;v&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;
    obj
  &lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;このメソッドにハッシュを渡すと以下のように &lt;code class=&quot;language-text&quot;&gt;{foo: {value: &quot;bar&quot;} }&lt;/code&gt; を &lt;code class=&quot;language-text&quot;&gt;{foo: &quot;bar&quot;}&lt;/code&gt; に変換してくれます！&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ruby&quot;&gt;&lt;pre class=&quot;language-ruby&quot;&gt;&lt;code class=&quot;language-ruby&quot;&gt;irb&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;main&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;039&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; foo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;to_h
&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:age&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:value&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;:name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:value&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;yamada&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;:has_job&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:value&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
irb&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;main&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;040&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; extract_values&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;foo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;to_h&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:age&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;:name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;yamada&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;:has_job&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;ハッシュの中に配列があっても問題なしです。万事解決！&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ruby&quot;&gt;&lt;pre class=&quot;language-ruby&quot;&gt;&lt;code class=&quot;language-ruby&quot;&gt;irb&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;main&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;043&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; a &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;foo1&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;bar1&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;foo2&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;hoge2&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;bar2&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:foo1&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:value&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;bar1&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;:foo2&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:hoge2&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:value&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;bar2&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
irb&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;main&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;044&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; extract_values&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;a&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:foo1&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;bar1&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;:foo2&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:hoge2&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;bar2&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;他にも良い方法がありそうですが、今の所これ以上の方法が思いつきませんでした。もし他の方法がありましたら教えてもらえると嬉しいです。&lt;/p&gt;
&lt;h2&gt;まとめ&lt;/h2&gt;
&lt;p&gt;Protocol Buffers で nil 判定をした場合には、wrappers.proto に定義された型を使用することで解決をすることができます。しかし、それには構造変化の副作用がありましたが、再帰的にデータを精査して変換処理をかけることで、シンプルな構造に変換する事例を紹介しました。もし同様な悩みを抱えている人がいたら参考になれば幸いです。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[PHPカンファレンス2019に参加&登壇しました]]></title><description><![CDATA[はじめに PHPカンファレンス2019に参加し、「脆弱性から学ぶWebセキュリティ Part2」を発表してきました。 脆弱性から学ぶWebセキュリティ Part2 本トークはPHPカンファレンス沖縄で発表した「脆弱性から学ぶWeb…]]></description><link>https://blog.hypermkt.jp/2019/2019-12-02-php-con-2019/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2019/2019-12-02-php-con-2019/</guid><pubDate>Mon, 02 Dec 2019 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;はじめに&lt;/h2&gt;
&lt;p&gt;PHPカンファレンス2019に参加し、「脆弱性から学ぶWebセキュリティ Part2」を発表してきました。&lt;/p&gt;
&lt;div style=&quot;left: 0; width: 100%; height: 0; position: relative; padding-bottom: 74.9296%;&quot;&gt;&lt;iframe src=&quot;https://speakerdeck.com/player/3edb106c7ce64e89a89a766d75d888ef&quot; style=&quot;border: 0; top: 0; left: 0; width: 100%; height: 100%; position: absolute;&quot; allowfullscreen scrolling=&quot;no&quot; allow=&quot;encrypted-media&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;h2&gt;脆弱性から学ぶWebセキュリティ Part2&lt;/h2&gt;
&lt;p&gt;本トークはPHPカンファレンス沖縄で発表した「脆弱性から学ぶWebセキュリティ」の続編でした。もちろん単なるコピペではなく、脆弱性対策については沖縄ではお話できなかった脆弱性について解説しました。ディレクトリ・トラバーサル、OSコマンドインジェクション、セッション管理の不備は、どれも影響度が大きく緊急性の高い脆弱性です。&lt;/p&gt;
&lt;p&gt;今回２回の発表を通じて、基礎的な脆弱性対策について学ぶきっかけとなり、ソースコードの見る目が変わりました。習得した知識のおかげで脆弱性を見つけ対応できるようになったので、自身としても収穫が大きかったです。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/search?q=since%3A2019-12-01_14%3A45%3A00_JST+until%3A2019-12-01_15%3A10%3A00_JST+%23phpcon+%23Track3&amp;#x26;src=savs&quot;&gt;発表中のTwitterの様子&lt;/a&gt; も確認しましたが、皆さんに興味を持っていただいて何よりです。&lt;/p&gt;
&lt;h2&gt;Webセキュリティに注力した2019&lt;/h2&gt;
&lt;p&gt;文字通りWebセキュリティに注力した年でした。仕事をきっかけにWebセキュリティ技術の大切さを知り、
&lt;a href=&quot;https://www.amazon.co.jp/%E4%BD%93%E7%B3%BB%E7%9A%84%E3%81%AB%E5%AD%A6%E3%81%B6-%E5%AE%89%E5%85%A8%E3%81%AAWeb%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9-%E7%AC%AC2%E7%89%88-%E8%84%86%E5%BC%B1%E6%80%A7%E3%81%8C%E7%94%9F%E3%81%BE%E3%82%8C%E3%82%8B%E5%8E%9F%E7%90%86%E3%81%A8%E5%AF%BE%E7%AD%96%E3%81%AE%E5%AE%9F%E8%B7%B5-%E5%BE%B3%E4%B8%B8/dp/4797393165/ref=pd_sbs_14_t_0/357-2706109-0860537?_encoding=UTF8&amp;#x26;pd_rd_i=4797393165&amp;#x26;pd_rd_r=be156c32-7d0a-4a0b-86bb-18be7dd4c9fb&amp;#x26;pd_rd_w=fS64M&amp;#x26;pd_rd_wg=k8ZFI&amp;#x26;pf_rd_p=ca22fd73-0f1e-4b39-9917-c84a20b3f3a8&amp;#x26;pf_rd_r=DQM8R8HFG2ED2V9SJEQY&amp;#x26;psc=1&amp;#x26;refRID=DQM8R8HFG2ED2V9SJEQY&quot;&gt;徳丸さんの本&lt;/a&gt;と
&lt;a href=&quot;https://www.ipa.go.jp/security/vuln/websecurity.html&quot;&gt;IPAの安全なウェブサイトの作り方&lt;/a&gt; を参考に基礎的な脆弱性対策について学びました。個人的に感じたのは、思っていた以上に知らないこと、正しく理解していなかったことが多かったです。それが今回の発表を通じて補完できたのは良かったでした。&lt;/p&gt;
&lt;p&gt;基礎かつ当たり前に知るべきことであるからこそ啓蒙活動の意味はあると考え、今回培った知識を発表することにし、その意義は十分あったと感じることができました。&lt;/p&gt;
&lt;p&gt;来年からはRuby/Railsを業務で使用することになります。Ruby/Railsなりの脆弱性対策があるはずなので、今後はそれを調べていきたいです。&lt;/p&gt;
&lt;h2&gt;PHPUnit開発者のSebastianさんにお会いできたのが嬉しかった&lt;/h2&gt;
&lt;p&gt;PHPerであれば誰もがお世話になっているPHPUnit。今年のPHPカンファレンスでまさかお会いできるとは思わなかった。大変お世話になっているので、日々の感謝を伝えました。&lt;/p&gt;
&lt;blockquote class=&quot;instagram-media&quot; data-instgrm-permalink=&quot;https://www.instagram.com/p/B5hqzsfAu4X/?utm_source=ig_embed&amp;amp;utm_campaign=loading&quot; data-instgrm-captioned data-instgrm-version=&quot;12&quot; style=&quot; background:#FFF; border:0; border-radius:3px; box-shadow:0 0 1px 0 rgba(0,0,0,0.5),0 1px 10px 0 rgba(0,0,0,0.15); margin: 1px; max-width:658px; min-width:326px; padding:0; width:99.375%; width:-webkit-calc(100% - 2px); width:calc(100% - 2px);&quot;&gt;&lt;div style=&quot;padding:16px;&quot;&gt; &lt;a href=&quot;https://www.instagram.com/p/B5hqzsfAu4X/?utm_source=ig_embed&amp;amp;utm_campaign=loading&quot; style=&quot; background:#FFFFFF; line-height:0; padding:0 0; text-align:center; text-decoration:none; width:100%;&quot; target=&quot;_blank&quot;&gt; &lt;div style=&quot; display: flex; flex-direction: row; align-items: center;&quot;&gt; &lt;div style=&quot;background-color: #F4F4F4; border-radius: 50%; flex-grow: 0; height: 40px; margin-right: 14px; width: 40px;&quot;&gt;&lt;/div&gt; &lt;div style=&quot;display: flex; flex-direction: column; flex-grow: 1; justify-content: center;&quot;&gt; &lt;div style=&quot; background-color: #F4F4F4; border-radius: 4px; flex-grow: 0; height: 14px; margin-bottom: 6px; width: 100px;&quot;&gt;&lt;/div&gt; &lt;div style=&quot; background-color: #F4F4F4; border-radius: 4px; flex-grow: 0; height: 14px; width: 60px;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;padding: 19% 0;&quot;&gt;&lt;/div&gt; &lt;div style=&quot;display:block; height:50px; margin:0 auto 12px; width:50px;&quot;&gt;&lt;svg width=&quot;50px&quot; height=&quot;50px&quot; viewBox=&quot;0 0 60 60&quot; version=&quot;1.1&quot; xmlns=&quot;https://www.w3.org/2000/svg&quot; xmlns:xlink=&quot;https://www.w3.org/1999/xlink&quot;&gt;&lt;g stroke=&quot;none&quot; stroke-width=&quot;1&quot; fill=&quot;none&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;g transform=&quot;translate(-511.000000, -20.000000)&quot; fill=&quot;#000000&quot;&gt;&lt;g&gt;&lt;path d=&quot;M556.869,30.41 C554.814,30.41 553.148,32.076 553.148,34.131 C553.148,36.186 554.814,37.852 556.869,37.852 C558.924,37.852 560.59,36.186 560.59,34.131 C560.59,32.076 558.924,30.41 556.869,30.41 M541,60.657 C535.114,60.657 530.342,55.887 530.342,50 C530.342,44.114 535.114,39.342 541,39.342 C546.887,39.342 551.658,44.114 551.658,50 C551.658,55.887 546.887,60.657 541,60.657 M541,33.886 C532.1,33.886 524.886,41.1 524.886,50 C524.886,58.899 532.1,66.113 541,66.113 C549.9,66.113 557.115,58.899 557.115,50 C557.115,41.1 549.9,33.886 541,33.886 M565.378,62.101 C565.244,65.022 564.756,66.606 564.346,67.663 C563.803,69.06 563.154,70.057 562.106,71.106 C561.058,72.155 560.06,72.803 558.662,73.347 C557.607,73.757 556.021,74.244 553.102,74.378 C549.944,74.521 548.997,74.552 541,74.552 C533.003,74.552 532.056,74.521 528.898,74.378 C525.979,74.244 524.393,73.757 523.338,73.347 C521.94,72.803 520.942,72.155 519.894,71.106 C518.846,70.057 518.197,69.06 517.654,67.663 C517.244,66.606 516.755,65.022 516.623,62.101 C516.479,58.943 516.448,57.996 516.448,50 C516.448,42.003 516.479,41.056 516.623,37.899 C516.755,34.978 517.244,33.391 517.654,32.338 C518.197,30.938 518.846,29.942 519.894,28.894 C520.942,27.846 521.94,27.196 523.338,26.654 C524.393,26.244 525.979,25.756 528.898,25.623 C532.057,25.479 533.004,25.448 541,25.448 C548.997,25.448 549.943,25.479 553.102,25.623 C556.021,25.756 557.607,26.244 558.662,26.654 C560.06,27.196 561.058,27.846 562.106,28.894 C563.154,29.942 563.803,30.938 564.346,32.338 C564.756,33.391 565.244,34.978 565.378,37.899 C565.522,41.056 565.552,42.003 565.552,50 C565.552,57.996 565.522,58.943 565.378,62.101 M570.82,37.631 C570.674,34.438 570.167,32.258 569.425,30.349 C568.659,28.377 567.633,26.702 565.965,25.035 C564.297,23.368 562.623,22.342 560.652,21.575 C558.743,20.834 556.562,20.326 553.369,20.18 C550.169,20.033 549.148,20 541,20 C532.853,20 531.831,20.033 528.631,20.18 C525.438,20.326 523.257,20.834 521.349,21.575 C519.376,22.342 517.703,23.368 516.035,25.035 C514.368,26.702 513.342,28.377 512.574,30.349 C511.834,32.258 511.326,34.438 511.181,37.631 C511.035,40.831 511,41.851 511,50 C511,58.147 511.035,59.17 511.181,62.369 C511.326,65.562 511.834,67.743 512.574,69.651 C513.342,71.625 514.368,73.296 516.035,74.965 C517.703,76.634 519.376,77.658 521.349,78.425 C523.257,79.167 525.438,79.673 528.631,79.82 C531.831,79.965 532.853,80.001 541,80.001 C549.148,80.001 550.169,79.965 553.369,79.82 C556.562,79.673 558.743,79.167 560.652,78.425 C562.623,77.658 564.297,76.634 565.965,74.965 C567.633,73.296 568.659,71.625 569.425,69.651 C570.167,67.743 570.674,65.562 570.82,62.369 C570.966,59.17 571,58.147 571,50 C571,41.851 570.966,40.831 570.82,37.631&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div style=&quot;padding-top: 8px;&quot;&gt; &lt;div style=&quot; color:#3897f0; font-family:Arial,sans-serif; font-size:14px; font-style:normal; font-weight:550; line-height:18px;&quot;&gt; View this post on Instagram&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;padding: 12.5% 0;&quot;&gt;&lt;/div&gt; &lt;div style=&quot;display: flex; flex-direction: row; margin-bottom: 14px; align-items: center;&quot;&gt;&lt;div&gt; &lt;div style=&quot;background-color: #F4F4F4; border-radius: 50%; height: 12.5px; width: 12.5px; transform: translateX(0px) translateY(7px);&quot;&gt;&lt;/div&gt; &lt;div style=&quot;background-color: #F4F4F4; height: 12.5px; transform: rotate(-45deg) translateX(3px) translateY(1px); width: 12.5px; flex-grow: 0; margin-right: 14px; margin-left: 2px;&quot;&gt;&lt;/div&gt; &lt;div style=&quot;background-color: #F4F4F4; border-radius: 50%; height: 12.5px; width: 12.5px; transform: translateX(9px) translateY(-18px);&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;margin-left: 8px;&quot;&gt; &lt;div style=&quot; background-color: #F4F4F4; border-radius: 50%; flex-grow: 0; height: 20px; width: 20px;&quot;&gt;&lt;/div&gt; &lt;div style=&quot; width: 0; height: 0; border-top: 2px solid transparent; border-left: 6px solid #f4f4f4; border-bottom: 2px solid transparent; transform: translateX(16px) translateY(-4px) rotate(30deg)&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;margin-left: auto;&quot;&gt; &lt;div style=&quot; width: 0px; border-top: 8px solid #F4F4F4; border-right: 8px solid transparent; transform: translateY(16px);&quot;&gt;&lt;/div&gt; &lt;div style=&quot; background-color: #F4F4F4; flex-grow: 0; height: 12px; width: 16px; transform: translateY(-4px);&quot;&gt;&lt;/div&gt; &lt;div style=&quot; width: 0; height: 0; border-top: 8px solid #F4F4F4; border-left: 8px solid transparent; transform: translateY(-4px) translateX(8px);&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt; &lt;div style=&quot;display: flex; flex-direction: column; flex-grow: 1; justify-content: center; margin-bottom: 24px;&quot;&gt; &lt;div style=&quot; background-color: #F4F4F4; border-radius: 4px; flex-grow: 0; height: 14px; margin-bottom: 6px; width: 224px;&quot;&gt;&lt;/div&gt; &lt;div style=&quot; background-color: #F4F4F4; border-radius: 4px; flex-grow: 0; height: 14px; width: 144px;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/a&gt;&lt;p style=&quot; color:#c9c8cd; font-family:Arial,sans-serif; font-size:14px; line-height:17px; margin-bottom:0; margin-top:8px; overflow:hidden; padding:8px 0 7px; text-align:center; text-overflow:ellipsis; white-space:nowrap;&quot;&gt;&lt;a href=&quot;https://www.instagram.com/p/B5hqzsfAu4X/?utm_source=ig_embed&amp;amp;utm_campaign=loading&quot; style=&quot; color:#c9c8cd; font-family:Arial,sans-serif; font-size:14px; font-style:normal; font-weight:normal; line-height:17px; text-decoration:none;&quot; target=&quot;_blank&quot;&gt;A post shared by Makoto Chiba (@hypermkt)&lt;/a&gt; on &lt;time style=&quot; font-family:Arial,sans-serif; font-size:14px; line-height:17px;&quot; datetime=&quot;2019-12-01T10:14:42+00:00&quot;&gt;Dec 1, 2019 at 2:14am PST&lt;/time&gt;&lt;/p&gt;&lt;/div&gt;&lt;/blockquote&gt;
&lt;script async src=&quot;https://www.instagram.com/embed.js&quot;&gt;&lt;/script&gt;
&lt;h2&gt;おわりに&lt;/h2&gt;
&lt;p&gt;今年はPHPerKaigi, PHPカンファレンス沖縄、PHPカンファレンスと３つのカンファレンスで登壇することができました。３つのイベントに登壇することで、知り合いもできました。「あのときに発表されていたバーチーさんですよね？」と声をかけていただいたのはとても嬉しかったです! また次のイベントでお会いしましょう!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Software Design 2019年12月号に記事を寄稿しました]]></title><description><![CDATA[はじめに 2019 年 11 月 18 日発売
技術評論社 Software Design 2019 年 12 月号に「基礎のクロスサイト・スクリプティング対策 PHPer のための Web セキュリティ入門」の記事を寄稿しました。 本記事は 2019 年 12 月…]]></description><link>https://blog.hypermkt.jp/2019/2019-12-02-software-design-2019-12/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2019/2019-12-02-software-design-2019-12/</guid><pubDate>Mon, 02 Dec 2019 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;はじめに&lt;/h2&gt;
&lt;p&gt;2019 年 11 月 18 日発売
&lt;a href=&quot;https://gihyo.jp/magazine/SD/archive/2019/201912&quot;&gt;技術評論社 Software Design 2019 年 12 月号&lt;/a&gt;に「基礎のクロスサイト・スクリプティング対策 PHPer のための Web セキュリティ入門」の記事を寄稿しました。 本記事は 2019 年 12 月 6 日に発売される「みんなの PHP 現場で役立つ最新ノウハウ!」(以下、みんなの PHP)の応援企画として 4 名の PHPer が思い思いの PHP ネタを持ち寄った特集です。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/blog/2019/2019-12-02-01.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2&gt;なぜクロスサイト・スクリプティング対策の記事？&lt;/h2&gt;
&lt;p&gt;それは昨今 XSS 脆弱性による被害が増大しているからです。2019 年 10 月 24 日に IPA(情報処理機構)から発表された
&lt;a href=&quot;https://www.ipa.go.jp/security/vuln/report/vuln2019q3.html&quot;&gt;ソフトウェア等の脆弱性関連情報に関する届出状況 2019 年第 3 四半期（7 月～ 9 月）&lt;/a&gt;によると、2019 年 2Q, 3Q は XSS 脆弱性が異常に急増しています。XSS 脆弱性対策は、Web アプリケーションエンジニアの基礎ではありますが、Web アプリケーションの特性上、一番発生しやすく一番注意しなくてはいけない脆弱性対策です。そういった経緯もあり、「啓蒙活動」の意味も込めて、クロスサイト・スクリプティング対策の記事を執筆させていただきました。&lt;/p&gt;
&lt;h2&gt;初めての執筆活動&lt;/h2&gt;
&lt;p&gt;人生初の執筆活動でした。初めてということもあり不慣れな点もありましたが、編集ご担当者の方には大変助けていただきました。またこのような機会を作っていただいた
&lt;a href=&quot;https://twitter.com/koyhoge&quot;&gt;koyhoge さん&lt;/a&gt;にも感謝です。&lt;/p&gt;
&lt;h2&gt;さいごに&lt;/h2&gt;
&lt;p&gt;出版物は一度発売されると内容の訂正ができないので、「完了しました」と判断するのにとても緊張しました。エンジニアが読んだ際に違和感が無いか、嘘はないか、誤字はないか、何度も読み直しました。そして、自信を持って皆さんに読んでもらいたいという内容に仕上がりました。本記事をきっかけに皆さんの Web セキュリティ技術向上に一役買えたら幸いです。&lt;/p&gt;
&lt;p&gt;あと、「&lt;a href=&quot;https://www.amazon.co.jp/dp/4297110555&quot;&gt;みんなの PHP 現場で役立つ最新ノウハウ!&lt;/a&gt;」をよろしくお願い致します!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[PHPカンファレンス沖縄2019に参加&登壇しました]]></title><description><![CDATA[はじめに PHPカンファレンス沖縄2019に参加し「脆弱性から学ぶWebセキュリティ」を発表してきました。 PHPカンファレンス沖縄  会場のCODEBASEは、那覇市内から電車で行くことが出来ず、タクシーで直接向かった。約2…]]></description><link>https://blog.hypermkt.jp/2019/2019-10-14-php-conf-okinawa-2019/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2019/2019-10-14-php-conf-okinawa-2019/</guid><pubDate>Mon, 14 Oct 2019 00:00:00 GMT</pubDate><content:encoded>&lt;h3&gt;はじめに&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://phpcon.okinawa.jp&quot;&gt;PHPカンファレンス沖縄2019&lt;/a&gt;に参加し「脆弱性から学ぶWebセキュリティ」を発表してきました。&lt;/p&gt;
&lt;h3&gt;PHPカンファレンス沖縄&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;/images/blog/2019/2019-10-14-01.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;会場のCODEBASEは、那覇市内から電車で行くことが出来ず、タクシーで直接向かった。約20分ほど。&lt;/p&gt;
&lt;p&gt;今回視聴したセッションはこちら。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;スタートアップにおけるプロダクト開発とエンジニア組織の変遷&lt;/li&gt;
&lt;li&gt;技術基盤/SREの視点で取り組むサービスの成長を継続し加速させるためのPHPアプリケーション改善&lt;/li&gt;
&lt;li&gt;ランチスポンサートーク/小さな機能、大きな仕事&lt;/li&gt;
&lt;li&gt;スポンサートーク&lt;/li&gt;
&lt;li&gt;6年かけてこうなった！我々の開発環境の変遷と現在&lt;/li&gt;
&lt;li&gt;LT&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;スタートアップにおけるプロダクト開発とエンジニア組織の変遷&lt;/p&gt;
&lt;p&gt;個人的にこのお話が一番面白かった。スタートアップとしてエンジニア１名で始まり、スピードと価値提供を優先した開発体制。サービスとエンジニア組織の変遷に合わせた開発大変の変化。スタートアップ企業の成長のリアルな現場のお話を聞かせていただいた。&lt;/p&gt;
&lt;p&gt;偶然にも国際通りのお土産屋さんでPaykeさんの実商品を見かけたときは嬉しかった。&lt;/p&gt;
&lt;p&gt;PHPでも機械学習がしたい&lt;/p&gt;
&lt;p&gt;発表者の方と懇親会でお話させてもらった。チュートリアルやサンプルはたくさん出回っているので、それを利用すれば簡単な機械学習はできるとのこと。機械学習で大切なのは&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ビジネスにおける課題解決能力（？）（ちょっと違ったかもしれないが忘れてしまった&lt;/li&gt;
&lt;li&gt;実装能力&lt;/li&gt;
&lt;li&gt;統計学&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;の３点が必要とのこと。２については一般的なWebアプリケーションであれば問題なし。1は如何に機械学習を利用したビジネスにおける課題解決に落とし込めるかの能力が必要とのこと。確かに単に知識だけあってもそれを現実の課題解決に紐付けられなければ意味がないですね。&lt;/p&gt;
&lt;p&gt;また、今であれば機械学習の現場に入ることができるが、そろそろサーバーサイド・フロントエンド・モバイルのように、機械学習エンジニアも細分化される可能性があるので、そうなると後から入るのは難しくなりそうというお話が印象的だった。&lt;/p&gt;
&lt;p&gt;もし資料が公開されれば一度試してみたい。6年かけてこうなった！我々の開発環境の変遷と現在&lt;/p&gt;
&lt;p&gt;他社さんの開発環境事情は気になるのでとても面白かった。やはりVagrantからDockerの切り替えが大変そうという印象。最初だけDockerfileを用意するのが大変ですしね。ただPHP7以上になれば、Docker Hubのイメージが使用できるので少しは楽になるはず。やっぱり今のPHP開発環境はDocker一択なのかなぁという印象。他の会社さんはどうなんでしょう？&lt;/p&gt;
&lt;h3&gt;脆弱性から学ぶWebセキュリティを発表&lt;/h3&gt;
&lt;p&gt;今年はWebセキュリティについて強い興味を持ち、ぜひみんなに脆弱性対策の基礎を知ってほしいという気持ちから「脆弱性から学ぶWebセキュリティ」を発表した。以下が発表資料です。&lt;/p&gt;
&lt;div style=&quot;left: 0; width: 100%; height: 0; position: relative; padding-bottom: 56.1972%;&quot;&gt;&lt;iframe src=&quot;https://speakerdeck.com/player/86682fd7b4a74a0597e55208b726077a&quot; style=&quot;border: 0; top: 0; left: 0; width: 100%; height: 100%; position: absolute;&quot; allowfullscreen scrolling=&quot;no&quot; allow=&quot;encrypted-media&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;p&gt;懇親会などで本発表に興味を持って頂いた方からいろいろ意見を頂いた。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Webセキュリティはエンジニアとして重要。もっとみんなに周知されるべき。最近のエンジニア業界では設計が一つのブームだが、どうやったらセキ* ュリティも同様にみんなの関心を得ることができるのか？&lt;/li&gt;
&lt;li&gt;PHPコミュニティとしてセキュリティをみんなに周知させたい。&lt;/li&gt;
&lt;li&gt;ぜひ宮崎で発表してください！出張代出します!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;徳丸さん以外でWebセキュリティの発表を聞くのは珍しい。ばーちーさんにWebセキュリティの第一人者になってほしい（笑&lt;/p&gt;
&lt;p&gt;と思っていた以上にセキュリティの大切さから関心を持っている方多いことに気づいた。きっっかけとしては先日の7pay事件が大きいと思われる。脆弱性対策について体系的に学ぶ機会が無いので、なんとなくでしか理解しておらず、もっと勉強していきたいとのことだった。&lt;/p&gt;
&lt;p&gt;自分はセキュリティの専門家ではないが、一エンジニアとして可能な限り自分が分かる範囲で、脆弱性対策を周知していきたいと考えており、機会がある限り発表していきたいと思った。これはPHP製のアプリケーションに限った話ではないので。&lt;/p&gt;
&lt;h3&gt;おわりに&lt;/h3&gt;
&lt;p&gt;Webセキュリティについて引き続き学習し、アウトプットしていく必要性があると改めて感じた。次回はPHPカンファレンス2019で発表予定なので、他の脆弱性対策について詳しく調べていこう。あと、せっかく会社のホワイトハッカー研修で脆弱性診断方法についても学んだので、それについても共有していきたい。まだまだやらなくちゃいけないことがたくさんある。&lt;/p&gt;
&lt;p&gt;PHPカンファレンス沖縄に参加できて本当に良かったので運営の方々に感謝です。ありがとうございました！&lt;/p&gt;
&lt;p&gt;さて、次はPHPカンファレンス2019！引き続きやっていくぞー！&lt;/p&gt;</content:encoded></item><item><title><![CDATA[IPAの「安全なウェブサイトの作り方」改訂第7版を読んだ]]></title><description><![CDATA[結論 Webアプリケーションエンジニアは、IPA 情報処理推進機構が公開している 「安全なウェブサイトの作り方」改訂第7版を一度は読むことをオススメする 本書を読むことでIPAに届け出が多く、影響度が大きい脆弱性の概要・対策方法を一通り学ぶことができる はじめに 最近Web…]]></description><link>https://blog.hypermkt.jp/2019/2019-08-15-ipa-websecurity/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2019/2019-08-15-ipa-websecurity/</guid><pubDate>Thu, 15 Aug 2019 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;結論&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Webアプリケーションエンジニアは、IPA 情報処理推進機構が公開している&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://www.ipa.go.jp/files/000017316.pdf&quot;&gt;「安全なウェブサイトの作り方」改訂第7版&lt;/a&gt;を一度は読むことをオススメする&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;本書を読むことでIPAに届け出が多く、影響度が大きい脆弱性の概要・対策方法を一通り学ぶことができる&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;はじめに&lt;/h2&gt;
&lt;p&gt;最近Webセキュリティについて改めて学び直す必要があると感じることが多くなってきた。そこでIPA 情報処理推進機構が公開している
&lt;a href=&quot;https://www.ipa.go.jp/files/000017316.pdf&quot;&gt;「安全なウェブサイトの作り方」改訂第7版&lt;/a&gt;を読んだ。&lt;/p&gt;
&lt;h2&gt;安全なウェブサイトの作り方とは&lt;/h2&gt;
&lt;p&gt;IPAのホームページ上にこのように説明がある。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;「安全なウェブサイトの作り方」は、IPAが届出 を受けた脆弱性関連情報を基に、届出件数の多かった脆弱性や攻撃による影響度が大きい脆弱性を取り上げ、ウェブサイト開発者や運営者が適切なセキュリティを考慮したウェブサイトを作成するための資料です。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;資料はPDFとして無料で公開されており、誰でも閲覧することができる。また「別冊：安全なSQLの呼び出し方」の資料も同様に無料で公開されている。これは、SQLインジェクションのための資料ではあるが、SQLインジェクションの被害件数の多さとその影響度合いが大きいことから、別資料として詳細に解説されているものと思われる。&lt;/p&gt;
&lt;h2&gt;安全なウェブサイトの作り方を読んで&lt;/h2&gt;
&lt;p&gt;本書は、IPAに届け出があった脆弱性から件数が多くかつ危険度が高いものが選定されている。そのため、これらを一通り学ぶことで、必要最低限の知識を習得できる。&lt;/p&gt;
&lt;p&gt;本書は各脆弱性について、概要、脅威、届出状況とまず最初に脆弱性に関する脅威について説明がある。これにより脆弱性の概要と実態を知ることができる。&lt;/p&gt;
&lt;h3&gt;根本的解決と保守的対策の選択&lt;/h3&gt;
&lt;p&gt;次に解決策として根本的解決、保守的対策の２つの視点で解決方法が提案される。本書においてここが一番重要な点である。
根本的解決、保守的対策は以下のように説明がされている。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;根本的解決&lt;/li&gt;
&lt;li&gt;「脆弱性を作り込まない実装」を実現する手法&lt;/li&gt;
&lt;li&gt;脆弱性を狙った攻撃が無効化されることを期待&lt;/li&gt;
&lt;li&gt;保守的対策&lt;/li&gt;
&lt;li&gt;攻撃による影響を軽減する対策&lt;/li&gt;
&lt;li&gt;攻撃される可能性を低減する&lt;/li&gt;
&lt;li&gt;攻撃された場合に、脆弱性を突かれる可能性を低減する&lt;/li&gt;
&lt;li&gt;脆弱性を突かれた場合に、被害範囲を最小化する&lt;/li&gt;
&lt;li&gt;被害が生じた場合に、早期に知る&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;当たり前ではあるが、根本的対策を実施して、脆弱性を無効化するのが一番良い。しかし、運用中のシステムにおいて、現場のリソース、稼働状況、時間などの制約から根本的解決が実施できない場合がある。そこで、保守的対策として攻撃を軽減する対策が提案されている。これも一つの選択肢であるので、知っておくべきと感じた。&lt;/p&gt;
&lt;h3&gt;脆弱性を作り込まないためには正しい知識と実装が必要&lt;/h3&gt;
&lt;p&gt;理想的には脆弱性を最初から作り込まないのが良い。そのためには脆弱性に対する正しい知識と理解を持って、実装する必要があることがわかった。ただ開発において考えることはセキュリティだけではない。設計、実行速度など様々なことを考えながら開発をすすめるので、絶対に脆弱性を埋め込まないというのは難しい。&lt;/p&gt;
&lt;p&gt;脆弱性を埋め込まない開発方法の一つとして、チーム全体でWebセキュリティ力をあげて、コードレビューなどで脆弱性を作らない体制も一つの方法と感じた。&lt;/p&gt;
&lt;h3&gt;脆弱性対策には正しい知識と判断が必要&lt;/h3&gt;
&lt;p&gt;世の中に存在する脆弱性を全て理解して一切埋め込まないようにするのはさすがに難しい。ただ可能な限り減らすことは前項で意見を述べた。大切なのは脆弱性を見つけたときの行動である。脆弱性対策には&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;根本的解決&lt;/li&gt;
&lt;li&gt;保守的対策&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;の２つの選択肢がある。加えてそれにサービス仕様も必要である。脆弱性対策の方法とサービス仕様、そしてその他状況（リソース、被害状況有り無し、影響範囲）などを考慮して総合的に判断が必要である。色んな変数が絡み合うことで迷いが生じることもあるが、正しい知識を持つことで、その変数はある程度固定化されることにより、判断がしやすくなると個人的には思う。なので、引き続きWebセキュリティに関する知識は学んでいかなくてはいけないと感じた。&lt;/p&gt;
&lt;h2&gt;終わりに&lt;/h2&gt;
&lt;p&gt;「安全なウェブサイトの作り方」を通じて影響度・発生頻度の高い脆弱性の概要・対策を一通り学ぶことができた。特に根本的解決、保守的対策の２つの観点を得られたのが大きい。引き続きWebセキュリティについて学んでいきたい。&lt;/p&gt;
&lt;h2&gt;参考&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.ipa.go.jp/security/vuln/websecurity.html&quot;&gt;安全なウェブサイトの作り方：IPA 独立行政法人 情報処理推進機構&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.ipa.go.jp/files/000017316.pdf&quot;&gt;「安全なウェブサイトの作り方」改訂第7版&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[「仕事の説明書」を献本頂いたので読みました]]></title><description><![CDATA[初献本を頂いた 元上司の田宮さんより「仕事の説明書」という本の献本を頂きました。田宮さんは、2017年に「
ビッグデータ分析・活用のためのSQL…]]></description><link>https://blog.hypermkt.jp/2019/2019-07-10-review-for-work-instructions/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2019/2019-07-10-review-for-work-instructions/</guid><pubDate>Wed, 10 Jul 2019 00:00:00 GMT</pubDate><content:encoded>&lt;h3&gt;初献本を頂いた&lt;/h3&gt;
&lt;p&gt;元上司の田宮さんより「&lt;a href=&quot;https://www.amazon.co.jp/%E4%BB%95%E4%BA%8B%E3%81%AE%E8%AA%AC%E6%98%8E%E6%9B%B8%E3%80%9C%E3%81%82%E3%81%AA%E3%81%9F%E3%81%AF%E4%BB%8A%E3%81%A9%E3%82%93%E3%81%AA%E3%82%B2%E3%83%BC%E3%83%A0%E3%82%92%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%81%AE%E3%81%8B%E3%80%9C-%E7%94%B0%E5%AE%AE-%E7%9B%B4%E4%BA%BA/dp/4991087007&quot;&gt;仕事の説明書&lt;/a&gt;」という本の献本を頂きました。田宮さんは、2017年に「
&lt;a href=&quot;https://www.amazon.co.jp/%E3%83%93%E3%83%83%E3%82%B0%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E3%83%BB%E6%B4%BB%E7%94%A8%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AESQL%E3%83%AC%E3%82%B7%E3%83%94-%E5%8A%A0%E5%B5%9C-%E9%95%B7%E9%96%80/dp/4839961263&quot;&gt;ビッグデータ分析・活用のためのSQLレシピ&lt;/a&gt;」を執筆されており、今回２冊目。早速「仕事の説明書」を拝読させて頂き、感想を述べたいと思います。&lt;/p&gt;
&lt;h3&gt;「仕事の説明書」とはどんな本か&lt;/h3&gt;
&lt;p&gt;本書では、仕事の目的は問題解決であると定義している。その問題解決をするために、問題の分析の仕方、アクションの起こし方、仕事の環境について、説得力のある資料の作り方など、ビジネスにおける課題解決のフレームワークとも言える本で、文字通り「仕事」をうまくやるための方法を教えてくれる本である。&lt;/p&gt;
&lt;p&gt;先日、本書を手にとってからずっと考えていた。今自分はどんな悩みを抱えていて、この本に何を期待しているのか。そして本書を読み終わったあと、どんな影響を与えてくれるのかと。まず自分が困っていることについて整理し、そこを踏まえて本書を読み進める方針とした。&lt;/p&gt;
&lt;h3&gt;仕事において困っていること&lt;/h3&gt;
&lt;p&gt;「無理をして仕事を受けがち」&lt;/p&gt;
&lt;p&gt;無理をして仕事を受けがちで結果的に残業につながってしまっている。複数のプロジェクトを抱えることで、生産性は下がり、全体的な成果も落ちてしまう。要因としては、受けたタスクを他の人に割り振らず、自分で抱え込んでしまう性格が原因である。&lt;/p&gt;
&lt;h3&gt;本書に期待すること&lt;/h3&gt;
&lt;p&gt;素直に悩みの答えを求めていた。本書の目次を眺めたところ、答えが得られそうな章がちょうどあった。&lt;/p&gt;
&lt;p&gt;「７章：仕事を前に進める 」&lt;/p&gt;
&lt;p&gt;７章では、自分の考えをまとめ、メンバーに提案し、チームメンバーと協力して、より大きな仕事を達成するための方法について説明がされている。&lt;/p&gt;
&lt;h3&gt;早速一つ実践してみた&lt;/h3&gt;
&lt;p&gt;実は自分が担当していたプロジェクトについて複数の課題があった。それらを解決するため、複数の提案があり、１０人以上の関係者に共有・相談をしなくてはいけなかった。そして、自分の考えをまとめてメンバーに伝え、同意を得る必要があった。&lt;/p&gt;
&lt;p&gt;そこで本書で自分の考え方の手段として説明があった「一枚企画書」を実践してみた。資料作りの上で注意した点として、&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;この本を読み終えたらどんな小さなことでも本書に従って行動に移してほしい。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;の言葉通り、本書に沿って資料を作るように心がけた。&lt;/p&gt;
&lt;p&gt;・資料は一枚、情報をグルーピングする P.234の通り・視認性を高める工夫として、課題と解決方法は色分け・タイトルと本文の文字の大きさのメリハリをつける・３０秒もあれば説明できる程度の資料にした&lt;/p&gt;
&lt;p&gt;この作成した資料を関係者に共有した結果、まず私の提案は正しく相手に共有することができた。そして提案内容には同意頂き、そこから議論を展開することができ、情報共有と同意を得る目的は達成できた。もちろん今までどおりチャットやIssue上での文字だけの説明もできた。しかし、一枚企画書によりお互いの認識の齟齬を減らし、新たな議論の発展や時間短縮にも貢献できたと考える。&lt;/p&gt;
&lt;h3&gt;まとめ&lt;/h3&gt;
&lt;p&gt;結論として言えるのは、「仕事の説明書」には自分の求めていた答えが書かれていた。そしてそれは実践として使えるノウハウ集である。各自が抱えている課題は違うので、必要に応じて本書から知見を取り出し役立てると良いと考えている。今回は数ある方法から一つしか実践していないが、明日から使える実用的な課題解決方法もあるので、少しずつ取り入れていきたい。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[PHPerKaigi 2019 で発表してきました]]></title><description><![CDATA[はじめに PHPerKaigi 2019 のレギューラートークで「モバイルアプリ向けAPI開発を通じて学んだこと」を発表してきました! 以下は発表資料です。  今回の発表について正直に言いますと需要があるのか少し不安でした。というのも、モバイルアプリとAPI…]]></description><link>https://blog.hypermkt.jp/2019/2019-03-31-phperkaigi2019/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2019/2019-03-31-phperkaigi2019/</guid><pubDate>Sun, 31 Mar 2019 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;はじめに&lt;/h2&gt;
&lt;p&gt;PHPerKaigi 2019 のレギューラートークで「モバイルアプリ向けAPI開発を通じて学んだこと」を発表してきました! 以下は発表資料です。&lt;/p&gt;
&lt;div style=&quot;left: 0; width: 100%; height: 0; position: relative; padding-bottom: 74.9296%;&quot;&gt;&lt;iframe src=&quot;https://speakerdeck.com/player/87d3b06a6a6e4772a54d3d38b2fc47d9&quot; style=&quot;border: 0; top: 0; left: 0; width: 100%; height: 100%; position: absolute;&quot; allowfullscreen scrolling=&quot;no&quot; allow=&quot;encrypted-media&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src=&quot;/images/blog/2019/2019-03-31-01.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;今回の発表について正直に言いますと需要があるのか少し不安でした。というのも、モバイルアプリとAPI開発は今となっては当たり前だし、興味持ってもらえるだろうか？と。ただ１年前の自分だったら間違いなく率先して聞く内容だし、去年１年間の成果だったので、誰かのためになればと思い発表しました。&lt;/p&gt;
&lt;p&gt;結果、思っていた以上に興味を持ってもらえ色んな人に質問をもらいとても嬉しかったです！&lt;/p&gt;
&lt;h2&gt;質疑応答&lt;/h2&gt;
&lt;p&gt;たくさん質問頂いてありがとうございます! 頂いた質問を以下にまとめます。（質問内容が間違っていたり、漏れていたらごめんなさい)&lt;/p&gt;
&lt;h3&gt;Laravel Passportは最初から導入する予定だったのか。他に候補はあったのか。&lt;/h3&gt;
&lt;p&gt;最初から導入する前提でした。他の候補はありませんでした。あとになって思ったのですが、「PHPフレームワーク Laravel Webアプリケーション開発」によると、
&lt;a href=&quot;https://github.com/tymondesigns/jwt-auth&quot;&gt;tymondesigns/jwt-auth&lt;/a&gt;を使ったAPI認証の事例もあったので、それを使うのも一案だったかもしれないです。&lt;/p&gt;
&lt;h3&gt;Swaggerをちょうど導入している。しかし、ymlファイルが１万行を超えてしまいファイル分割をしているが、Swagger Editorで見れなくなってしまう。どうすればいいのか。&lt;/h3&gt;
&lt;p&gt;担当しているプロジェクトでは独自に分割したymlファイルの結合プログラムを実装し、それを利用して結合した文字列をSwagger Editorに挿入して利用しています。少し手間ではありますが、そんなに時間もかからないので、問題にはなっていません。&lt;/p&gt;
&lt;p&gt;個人的にはPRをマージしたら、CI上でswagger codegenでhtml出力し、どこかのサーバーにアップロードしてドキュメントを自動生成すると便利になりそうと思ってますが、まだ未着手です。&lt;/p&gt;
&lt;h3&gt;ちょうどAPIの新規開発案件にアサインされた。１年前のバーチーさんと全く同じで周りに経験者がいません。読書会はどうやって進めたのか。&lt;/h3&gt;
&lt;p&gt;チームのエンジニア全員を集めて順番に音読し、わからない所があれば相談しあってました。&lt;/p&gt;
&lt;h3&gt;会社でニックネームTシャツを流行らせたいので写真取らせてください&lt;/h3&gt;
&lt;p&gt;はい（笑）&lt;/p&gt;
&lt;h2&gt;PHPerトークン探しの旅&lt;/h2&gt;
&lt;p&gt;いやー、初日からやっていればと後悔です。1日目に発表があったのでそれに集中するため全く興味を示していませんでしたが、2日目にやりはじめたらハマってしまいました。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/blog/2019/2019-03-31-02.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;壁にあったり&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/blog/2019/2019-03-31-03.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;入り口の扉にあったり&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/blog/2019/2019-03-31-04.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;掲示物にさり気なくあったり&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/blog/2019/2019-03-31-05.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;さり気なく入り口のテーブルの下に隠れてたり&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/blog/2019/2019-03-31-06.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;最初は完全に見過ごしていたけど、どうどうとゲーム名がPHPerトークンにｗ&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/blog/2019/2019-03-31-07.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;tadsanさんの背中ｗ&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/blog/2019/2019-03-31-08.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;優勝者のnrsさん、まじですごいｗ おめでとうございます！&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;私の勝ちです&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;ご査収ください
&lt;a href=&quot;https://twitter.com/hashtag/phperkaigi?src=hash&amp;#x26;ref_src=twsrc%5Etfw&quot;&gt;#phperkaigi&lt;/a&gt;
&lt;a href=&quot;https://t.co/R021SevLYm&quot;&gt;pic.twitter.com/R021SevLYm&lt;/a&gt;
— nrs (@nrslib)
&lt;a href=&quot;https://twitter.com/nrslib/status/1112269397295398912?ref_src=twsrc%5Etfw&quot;&gt;2019年3月31日&lt;/a&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;h2&gt;おわりに&lt;/h2&gt;
&lt;p&gt;PHPerKaigi 2019、２回目の参加となりましたが去年よりも圧倒的にアップグレードしていて本当にすごいなぁと思いました。コミュニケーションを目的に設計されたイベントで、夜にボードゲーム会があったり、PHPerトークンイベントなどなどとても楽しめました。また今年はレギュラートークにも参加できて嬉しかったです。また来年も参加します! 長谷川さん、スタッフの皆さんありがとうございました! 最高のイベントでした!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[最初で最後のLaravel JP Conferenceに参加]]></title><description><![CDATA[はじめに 2018年からLaravelを業務で使い始めたこともあり、Laravel JP Conferenceはとても待ち遠しいイベントだった。また、日本国内でフレームワーク主体のイベントは珍しく、どんなイベントになるのかも楽しみでした。ついに待望のイベントが2019年2月1…]]></description><link>https://blog.hypermkt.jp/2019/2019-02-23-laraveljpconf-2019/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2019/2019-02-23-laraveljpconf-2019/</guid><pubDate>Sat, 23 Feb 2019 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;はじめに&lt;/h2&gt;
&lt;p&gt;2018年からLaravelを業務で使い始めたこともあり、Laravel JP Conferenceはとても待ち遠しいイベントだった。また、日本国内でフレームワーク主体のイベントは珍しく、どんなイベントになるのかも楽しみでした。ついに待望のイベントが2019年2月16日(土)に開催!&lt;/p&gt;
&lt;h2&gt;印象的だったセッション&lt;/h2&gt;
&lt;p&gt;個人的に印象的だったのはセッションとその理由をまとめる。&lt;/p&gt;
&lt;h3&gt;LaravelでのAPI開発を爆速にするためにやっていること&lt;/h3&gt;
&lt;h3&gt;SimpleとEasyは違う&lt;/h3&gt;
&lt;p&gt;便利なライブラリということでサクッと導入したはいいが、少しレールから外れたことをしようとすると途端に難しくなる。EasyではあるがSimpleではない。とても納得感の高い話だった。&lt;/p&gt;
&lt;h3&gt;ランチセッション「エキテンとLaravelと私」&lt;/h3&gt;
&lt;p&gt;「エキテン」と「イアンさん」の２つしか覚えていないくらい衝撃的かつ爆笑のランチセッションだった。ある意味ランチにちょうどよい喜劇を見ているような気分だった。&lt;/p&gt;
&lt;p&gt;内容的には発表者がエキテンの超レガシーな環境で感じた感想とのことだが、素直な感想だからこそ現実味のある話であった。また話を聞けば、学生から社会人への変化も忠実に感じ取っており、ビジネス視点の重要性をしっかりと感じ取って本人の成長を感じる素晴らしいセッションだった。個人的にはMVPとしたい。&lt;/p&gt;
&lt;p&gt;あと、今半のお弁当、めっちゃ美味しかったです。デザインワンさんに感謝!&lt;/p&gt;
&lt;h3&gt;LT: Laravel Telescopeにアプリのモリタリングをお任せしてみた&lt;/h3&gt;
&lt;p&gt;Telescopeは、Sentryのようにエラー集約をしてくれる機能とのことで目から鱗だった。発表者によるとダッシュボード画面は認証をつけることもでき、安心して特定の人のみが閲覧することができるとのこと。これがあれば防げるバグもあるかもしれないと感じた。&lt;/p&gt;
&lt;h3&gt;LT: Laravel Zeroでらくして情報収集する？&lt;/h3&gt;
&lt;p&gt;Laravel Zeroも存在すら知らなかった。非公式パッケージとのことだが、これを利用すればコマンドラインツールが用意に開発でき、Slack連携も簡単に可能とのことで、ちょっとした便利ツール開発には良さそうだった。&lt;/p&gt;
&lt;h3&gt;LT: Lighthouseを使って認証必須GraphQL APIを開発する&lt;/h3&gt;
&lt;p&gt;最近何かと注目度の高いGraphQLだが、モバイルアプリ向けにはRESTful APIより向いていると感じており、Laravelでの実装方法としてとても興味のあるセッションだった。LighthouseはLaravelでGraphQLを実装する上で、標準的なライブラリのようなので、どこかで検証してみたい気持ちになった。&lt;/p&gt;
&lt;h2&gt;まとめ&lt;/h2&gt;
&lt;p&gt;Laravel特化のカンファレンスだけあって、Laravelに関する話の密度はとても濃く、かつ幅広い話が聞けてとても勉強になるカンファレンスだった。Laravelの人気ぶりの実感とLaravelというフレームワークを使用することで得られる恩恵の大きさを感じた。たった1年なので当たり前だが、まだまだ知らないことも多く発見が多かった。PHPカンファレンスやPHP勉強会などPHP言語に関するイベントは多数あるが、フレームワーク特化型だからこそ、情報や人が集まるので、個人的にはカンファレンスに限らずこのようなイベントには今後も継続的に参加したい。&lt;/p&gt;
&lt;p&gt;カンファレンス開催を運営をして頂いたスタッフの皆さんに感謝します。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Vue Fes Japan 2018 コアスタッフ スポンサー担当として参加しました]]></title><description><![CDATA[この記事は
GMO ペパボ Advent Calendar 2018 の 21 日目の記事です。 はじめに 一ヶ月半前となりますが 2018 年 11 月 3 日(土) UDX ギャラリーで開催された Vue Fes Japan…]]></description><link>https://blog.hypermkt.jp/2018/2018-12-21-vue-fes-japan-2018-core-staff/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2018/2018-12-21-vue-fes-japan-2018-core-staff/</guid><pubDate>Fri, 21 Dec 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;この記事は
&lt;a href=&quot;https://qiita.com/advent-calendar/2018/pepabo&quot;&gt;GMO ペパボ Advent Calendar 2018 の 21 日目&lt;/a&gt;の記事です。&lt;/p&gt;
&lt;h2&gt;はじめに&lt;/h2&gt;
&lt;p&gt;一ヶ月半前となりますが 2018 年 11 月 3 日(土) UDX ギャラリーで開催された Vue Fes Japan にコアスタッフ スポンサー担当として参加しました。日本初開催となった Vue.js カンファレンス。カンファレンス運営にスタッフとして最初から携わったのは初めての経験でした。&lt;/p&gt;
&lt;p&gt;本記事では、なかなか世にでることはないカンファレンス運営の一部についてご紹介できればと思います。スポンサー担当として何をしたのか、当日は何をしていたのか、Vue Fes Japan を振り返っての感想をまとめたいと思います。&lt;/p&gt;
&lt;h2&gt;スポンサー担当とは&lt;/h2&gt;
&lt;p&gt;スポンサー企業様の窓口として募集・入金対応・配布物・スポンサーブースの案内まで全般を対応します。自分が担当した業務を列挙すると以下になります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;スポンサー企業様応募フォームの作成と Slack 通知連携&lt;/li&gt;
&lt;li&gt;協賛金の請求書、領収書作成&lt;/li&gt;
&lt;li&gt;Vue Fes 公式サイトに掲載するロゴ・PR 文章の提出依頼の調整&lt;/li&gt;
&lt;li&gt;スポンサー企業様からあがってきたロゴと PR 文章の Vue Fes 公式サイトへの掲載依頼&lt;/li&gt;
&lt;li&gt;配布物・スポンサーブースの案内資料作成&lt;/li&gt;
&lt;li&gt;スポンサーブース設営に伴う会場へのお問い合わせ&lt;/li&gt;
&lt;li&gt;スポンサーブース・スピーカー&amp;#x26;スタッフ控室で使用する延長ケーブル＆電源タップのレンタル&lt;/li&gt;
&lt;li&gt;会場の電源位置に伴う延長ケーブル・電源タップ設計&lt;/li&gt;
&lt;li&gt;会場の追加・延長レンタル調整&lt;/li&gt;
&lt;li&gt;不用品回収業者の手配&lt;/li&gt;
&lt;li&gt;スポンサー企業様からのお問い合わせ対応&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;今振り返るとスポンサー対応で一番大変だったのは、各企業様の状態管理でした。スポンサーはお申込み頂いてから&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;請求書作成&lt;/li&gt;
&lt;li&gt;請求書送付&lt;/li&gt;
&lt;li&gt;入金確認&lt;/li&gt;
&lt;li&gt;領収書作成&lt;/li&gt;
&lt;li&gt;領収書送付&lt;/li&gt;
&lt;li&gt;プラン別の特典の案内&lt;/li&gt;
&lt;li&gt;PR 文章・バナーの依頼&lt;/li&gt;
&lt;li&gt;PR 文章・バナーの掲載&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;の対応が必要となります。各企業様別の状態を Google スプレッドシートで管理していたのですが、簡単な管理システムを実装するなりプログラマブルな課題解決をすべきだったなぁ・・・というのが反省です。&lt;/p&gt;
&lt;h2&gt;全体スケジュール&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/images/blog/2018/2018-12-21-01.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;簡単にですが年間を通したスケジュールは上記のようになります。スポンサー担当の主な業務は、スポンサー募集期間におけるお申込み対応と各種お問い合わせ対応です。期間については募集する企業数やプランの内容によって変わると思いますが、Vue Fes Japan では約 40 社の企業様からスポンサープランにお申し込みを頂き、5 ヶ月間スポンサー募集を行っていました。多数の企業様にお申し込み頂き本当に感謝です。&lt;/p&gt;
&lt;h2&gt;イベント前日 11/2(金)&lt;/h2&gt;
&lt;p&gt;この日は会社を有休にしました。昼間は会場でスポンサー企業様から送付されてきた配布物・スポンサーブース設営物の到着確認、夜はスタッフ全員で配布物のトートバッグを封入行いました。トートバッグ封入作業は、まず机にずらーと配布物を１列に並べ、配布物を端から取る担当、トートバッグに詰める担当、完成品をダンボールに梱包する担当に分かれて一気に実施。みんなエンジニアなので、「並列化しよう!(人の流れを 2 列に)」「ディスク容量がいっぱいです!(ダンボールに入らない)」「アラートがあがってます!(助けて!)」などわいわいしながらしてたらあっという間に終わりました。良い思い出です。&lt;/p&gt;
&lt;h2&gt;イベント当日 11/3(土)&lt;/h2&gt;
&lt;p&gt;当日はスポンサー受付担当としてボランティアスタッフの方々と協力して以下を行いました。メールや電話で何度もやりとりをした企業様のブースが無事に設営でき、たくさんの来場者がブースを訪れていてとても嬉しかったです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;スポンサー企業様の優先入場の受付&lt;/li&gt;
&lt;li&gt;スポンサーブースの電源設営&lt;/li&gt;
&lt;li&gt;スポンサーブースの荷物の配備&lt;/li&gt;
&lt;li&gt;荷物の多いスポンサー企業様への資材部屋へのご案内&lt;/li&gt;
&lt;li&gt;ブース設営・片付けに発生したゴミの案内&lt;/li&gt;
&lt;li&gt;ブース片付け時の荷物の郵送の案内&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;スポンサー対応で大切なことは何か&lt;/h2&gt;
&lt;p&gt;自分が感じたのは以下の 3 点です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;迅速な応対&lt;/li&gt;
&lt;li&gt;スポンサー企業様の視点に立った資料作り&lt;/li&gt;
&lt;li&gt;イベント会場との念密な調整&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;１．については、スポンサー担当は企業様との窓口ですので、迅速なメール応対が必要です。ただしここは運営側の改善点だと考えており、メールですと運用負荷が高いので、PHP カンファレンスのように Facebook グループなどが良いのでは？と個人的には考えています。&lt;/p&gt;
&lt;p&gt;２．はスポンサーブースやノベルティに関する資料です。ノベルティグッズやスポンサーブースの規約、当日のスケジュール、撤収までスポンサー側視点ですと気になることは多いです。その視点になってなるべく多くの情報を事前に提供することが大切だと感じました。ここがかけてしまうと、お問い合わせも増えてしまうので両者にとって不利益です。&lt;/p&gt;
&lt;p&gt;３.イベント会場の担当者の方とは、何度も連絡を取り合いました。下見は一度しかしていなかったので、公開されている資料だけでは分からないことなどは聞くしかありません。メールだと往復に時間がかかってしまうので、電話で済ませたほうが早いので吉です。&lt;/p&gt;
&lt;h2&gt;感想&lt;/h2&gt;
&lt;p&gt;Vue Fes Japan は一年がかりで準備して取り組んだイベントでした。Vue.js という素晴らしいフレームワークをもっと多くの人に知ってもらいたい、最新情報の取得の場として、沢山の方々に参加して欲しいという気持ちで自分はスタッフとして参加しました。イベントは何一つトラブルなく大成功に終わり感無量です!&lt;/p&gt;
&lt;p&gt;この一年をざっと振り返ると、プライベートの時間をかなり使っていたので、作業の効率化やプログラマブルな課題解決にもう少し取り組むべきだったというのが反省です。今回が初めでだったからというのもありますが、カンファレンスは各所で多数行われているので、もう少し経験者に運営の注意点などを聞いておくべきだったなと。&lt;/p&gt;
&lt;p&gt;コアスタッフの業務は楽なものではありませんが、フロントエンド業界の一線で活躍する優秀なエンジニアやコミッターの方と知り合いになれ、更にイベントをやりきった後に得られる達成感は何者にも耐え難いです。&lt;/p&gt;
&lt;p&gt;OSS の貢献はソースコードへのコミットだけではなく、コミュニティ活動やイベント運営も一つの方法です。興味のある方はぜひ各種イベントのスタッフに参加してみてください!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;VueFes お疲れ様でした！
最後に staff とスピーカーで集合写真を撮りました！
&lt;a href=&quot;https://twitter.com/hashtag/vuefes?src=hash&amp;#x26;ref_src=twsrc%5Etfw&quot;&gt;#vuefes&lt;/a&gt;
&lt;a href=&quot;https://t.co/lWwcABSvmi&quot;&gt;pic.twitter.com/lWwcABSvmi&lt;/a&gt;
— Vue Fes Japan (@vuefes)
&lt;a href=&quot;https://twitter.com/vuefes/status/1058697600310763522?ref_src=twsrc%5Etfw&quot;&gt;2018 年 11 月 3 日&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;</content:encoded></item><item><title><![CDATA[PHPerKaigi 2018に参加&懇親会で飛び込みLTした]]></title><description><![CDATA[初開催となる PHPerKaigi  PHP のカンファレンスといえば、東京・大阪・福岡で毎年 1 回開催される PHP カンファレンスが PHPer にとってのカンファレンスだったが、今年から楽しみが一つ増えた。 CFP は落選! 最近 Laravel…]]></description><link>https://blog.hypermkt.jp/2018/2018-03-10-phperkaigi-2018/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2018/2018-03-10-phperkaigi-2018/</guid><pubDate>Sat, 10 Mar 2018 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;初開催となる PHPerKaigi&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/images/blog/2018/2018-03-10-01.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;PHP のカンファレンスといえば、東京・大阪・福岡で毎年 1 回開催される PHP カンファレンスが PHPer にとってのカンファレンスだったが、今年から楽しみが一つ増えた。&lt;/p&gt;
&lt;h2&gt;CFP は落選!&lt;/h2&gt;
&lt;p&gt;最近 Laravel を勉強中であり、課題として Vue.js を絡めた SPA アプリケーションを開発していた。ちょっとフロントエンドよりのテーマになってしまったので、PHPer 向けでは無かったのが反省。&lt;/p&gt;
&lt;h2&gt;トークタイトル&lt;/h2&gt;
&lt;p&gt;今すぐできる Laravel + Vue.js による SPA アプリケーション開発&lt;/p&gt;
&lt;h2&gt;トーク概要&lt;/h2&gt;
&lt;p&gt;SPA は通常の Web ページでは実現できないユーザー体験と高速なページ遷移が実現できます。しかし、SPA を実現するには API とフロントエンド双方の開発と周辺技術の知見が必要となります。
そこで Laravel を利用することで API + フロントエンド環境が容易に構築ができ、皆さんのアイデアを実現する手助けをしてくれます。
本トークでは Laravel + Vue.js による SPA アプリケーション開発について一通りご紹介します。&lt;/p&gt;
&lt;h2&gt;3/10(土) 2 日目 Track B の相談会に入り浸ってしまった&lt;/h2&gt;
&lt;p&gt;PHP カンファレンスにはない「Interactive Round Table」という企画。ちょうど個人的に悩んでいたことがありましたが、答えを頂き大満足です。&lt;/p&gt;
&lt;h3&gt;Laravel 相談会で Laravel/Lumen どっちがいいのかを議論した&lt;/h3&gt;
&lt;p&gt;円卓テーブルを囲って Laravel リファレンス著者の
&lt;a href=&quot;https://twitter.com/ex_takezawa&quot;&gt;@ex_takezawa さん&lt;/a&gt; に直接相談できる会。偶然にも
&lt;a href=&quot;https://twitter.com/shin1x1&quot;&gt;@shin1x1 さん&lt;/a&gt;　も座っていて、著者２名が同じテーブルにいる豪華相談会!&lt;/p&gt;
&lt;h3&gt;API を開発したい。チームメンバーは Laravel 初心者。Laravel / Lumen どっちを使えばいい？&lt;/h3&gt;
&lt;p&gt;結論：Laravel を使うと良い&lt;/p&gt;
&lt;p&gt;理由として Laravel/Lumen は結構違う。Laravel から始めて不要なものを外すのは簡単だが、Lumen から始めて追加するのは大変。Elasticsearch や Fluentd の連携もフレームワーク初心者は躓く可能性あり。&lt;/p&gt;
&lt;h3&gt;CakePHP 相談会で CakePHP 1.3 バージョンアップ問題を相談した&lt;/h3&gt;
&lt;p&gt;とある Web サービスを CakePHP 1.3 &amp;#x26; PHP 5.3 で開発しており、CakePHP のバージョンアップどうしようと悩んでいたので相談した。&lt;/p&gt;
&lt;p&gt;CakePHP 1.3 は、PHP バージョンいくつまで動くのか？&lt;/p&gt;
&lt;p&gt;結論： PHP 5.6 まではコアの修正なしで動作する。あくまで一事例であって公式サポートするものではない。&lt;/p&gt;
&lt;p&gt;コアを改造して CakePHP 1.3 &amp;#x26; PHP7.0 で本番利用の事例はあり。但しコアをいじるのはおすすめしない。&lt;/p&gt;
&lt;h2&gt;至れり尽くせりのカンファレンス&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/phperkaigi/status/972019772899565569&quot;&gt;https://twitter.com/phperkaigi/status/972019772899565569&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/phperkaigi/status/972276030667763712&quot;&gt;https://twitter.com/phperkaigi/status/972276030667763712&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/phperkaigi/status/972279353554845696&quot;&gt;https://twitter.com/phperkaigi/status/972279353554845696&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/phperkaigi/status/972303883492970497&quot;&gt;https://twitter.com/phperkaigi/status/972303883492970497&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;懇親会で急遽飛び込み LT!&lt;/h2&gt;
&lt;p&gt;今思えば「あの問題解きました! 」という LT タイトルは分かりづらかったですね＾＾； 素直に「入口ポスターの暗号を解きました！」とかにすれば良かった。&lt;/p&gt;
&lt;p&gt;あとで
&lt;a href=&quot;https://twitter.com/uzulla&quot;&gt;@uzulla さん&lt;/a&gt;に聞いたら、まさか復号化プログラムを作るとは思わなかったとのことで、自分の簡易プログラムが懇親会 LT の開催にもつながって良かった。飛び込み LT は人生初でしたが、あの制限時間が無い中に雑な資料を作って、ビールの勢いで話すのはとても楽しかったです。また挑戦したい。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://www.instagram.com/p/BgI2pcXH2dH/&quot;&gt;飛び込み LT してきたー！PHPerKaigi 最高ー！ #phperkaigi&lt;/a&gt;
&lt;a href=&quot;https://www.instagram.com/hypermkt/&quot;&gt;Makoto Chiba&lt;/a&gt;さん(@hypermkt)がシェアした投稿 -
3 月 10, 2018 at 1:52 午前 PST&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;まとめ&lt;/h2&gt;
&lt;p&gt;控えめに言って PHPerKaigi2018 に参加してとても楽しかったです。
&lt;a href=&quot;https://twitter.com/tomzoh&quot;&gt;@tomzoh さん&lt;/a&gt;がおっしゃってましたが、スピーカーとして参加するほうが 1.5 倍楽しいので、次の PHP カンファレンスでスピーカーを狙うぞ〜！&lt;/p&gt;
&lt;h2&gt;参考&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://phperkaigi.jp/2018/&quot;&gt;PHPerKaigi 2018&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[ISUCON7予選にチーム「Rising Sun」で参加しました]]></title><description><![CDATA[はじめに インフラ担当
@asuforce , アプリケーション担当の
@purple_jwl と自分の３人で参加しました。結果は「246位 8,037」と惨敗でしたが、@asuforce と @purple_jwl…]]></description><link>https://blog.hypermkt.jp/2017/2017-10-24-isucon7/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2017/2017-10-24-isucon7/</guid><pubDate>Tue, 24 Oct 2017 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;はじめに&lt;/h2&gt;
&lt;p&gt;インフラ担当
&lt;a href=&quot;https://twitter.com/asuforce&quot;&gt;@asuforce&lt;/a&gt; , アプリケーション担当の
&lt;a href=&quot;https://twitter.com/purple_jwl&quot;&gt;@purple_jwl&lt;/a&gt; と自分の３人で参加しました。結果は「246位 8,037」と惨敗でしたが、@asuforce と @purple_jwl と一緒に参加できてとても楽しかったです。本当に悔しいので来年に向けて振り返ります。&lt;/p&gt;
&lt;h2&gt;自分が対応したこと&lt;/h2&gt;
&lt;h3&gt;ローカル開発環境の構築&lt;/h3&gt;
&lt;p&gt;DockerでNginx + PHP-FPM + MySQLの雛形を用意しておいたので、アプリケーションコード、静的ファイル、スキーマファイルを配置するだけで簡単にローカル開発環境の準備が出来たのは良かったでした。去年は全くDockerの右も左も分からず、インフラエンジニアに任せっきりでしたが、自分一人で対応することが出来ました。&lt;/p&gt;
&lt;p&gt;ですが、色んな人のブログや話を聞くと、ビルドインサーバーでも充分だったと思いました。また、直接本番サーバーでコード修正をする方も多くいたそうで、時間制限を考えるとそれもありでしたね。&lt;/p&gt;
&lt;h3&gt;画像のDB保存&lt;/h3&gt;
&lt;p&gt;ボトルネックは画像のDB保存だということは、Slow Queryやalpの調査結果から明白だったので、これは対応必須と早い段階で相談しました。過去に画像のDB保存の自信で実装し、それをNginx経由での動的画像変換に置き換えた経験があったので、それを導入すれば高速化できると思いましたが、考えが甘すぎました。
Nginx側は @asuforceに対応してもらい、DBから画像の抜き出しとアプリケーションコード調整は自分が対応しリリースしましたが、点数が全く変わらず呆然・・・。&lt;/p&gt;
&lt;h2&gt;振り返り&lt;/h2&gt;
&lt;p&gt;残念ながら今回のISUCONでは対応した施策があまりなく書くことも多くないので、KPTによる振り返りを書きたいと思います。&lt;/p&gt;
&lt;h3&gt;Keep 良かったこと&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;予選開始前に時系列で作業分担を決めたこと&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;模擬戦をしたこと。これにより課題が見えて本格的な準備を始めた&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;デプロイ、最初にやる、最後にやる、チューニングに関するドキュメントが整備された&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;簡易ER図とR/W状況を書いた。これによりテーブル状態がチームに共有できた&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;@purple_jwl がアプリケーション状態を最初に把握して、機能をホワイトボードに列挙してくれた&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;alp, pt-digest-query, xdebugの基本的な使い方を学習した&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;４０分位前に再起動検証をしたこと&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Problem 改善したいこと&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;予選マニュアルをしっかり読まなかったこと&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;課題解決に関連するコードしか読まなかったこと。コードの全体確認しなかった。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;インフラ周りを @asuforce に任せっきりだった&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Nginx + PHP-FPM力が低くて手助けできなかった&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;何回か一緒に調査したら問題に気づけたこともあった&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;画像配信修正に時間がかかりすぎてアプリケーションコードを読む時間がとれなかった&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;サーバー台数がなぜ３台あったのか理由を深く考えなかった&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;単純な画像配信の課題ではなかったことに気づけなかった&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;３台のサーバーの活かし方すら考えていなかった&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Try 次に試すこと&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;メンバー全員でゆっくり予選マニュアルを読む&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;アプリケーションコード全体をしっかり読むこと&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Nginx + PHP+FPMの基礎を学ぶ&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;複数台サーバー構成に合わせた設定方法を学ぶ&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;全ての過去問で満点をとれるくらい復習する。そうしないと次回も高得点は狙えない&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;中盤の段階でMTGをし現状を確認をする&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;誰かが問題にハマったら、２人以上で解決に取り組む。他者の目が入ることですぐに解決できることが多い。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;終わりに&lt;/h2&gt;
&lt;p&gt;ISUCONに２回参加して感じることは、当たり前の技術は基礎として当たり前のように使えなくてはいけないと思いました。問題毎に課題の本質があり、それに対して適切なアプローチを打てるかがポイントとなります。最低限の知識として、Nginx + PHP-FPMの設定を書けるようにし、柔軟に対応できるようにしたいです。また、過去の問題にも取り組み、引き出しの数も増やしていきたいです。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[PHPカンファレンス2017で「できるPHP7アップグレード」を発表してきました]]></title><description><![CDATA[はじめに 2017年10月8日(日) に開催されたPHPカンファレンス2017で、「できるPHP7アップグレード」を発表してきました。発表資料はこちらです。 2年連続スピーカーとして参加できて良かったです。11:00と朝早くの時間だったにも関わらず、8…]]></description><link>https://blog.hypermkt.jp/2017/2017-10-09-phpcon-2017/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2017/2017-10-09-phpcon-2017/</guid><pubDate>Mon, 09 Oct 2017 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;はじめに&lt;/h2&gt;
&lt;p&gt;2017年10月8日(日) に開催されたPHPカンファレンス2017で、「できるPHP7アップグレード」を発表してきました。発表資料はこちらです。&lt;/p&gt;
&lt;div style=&quot;left: 0; width: 100%; height: 0; position: relative; padding-bottom: 74.9296%;&quot;&gt;&lt;iframe src=&quot;https://speakerdeck.com/player/84e580e1cb514fbda342c674a2c75cb2&quot; style=&quot;border: 0; top: 0; left: 0; width: 100%; height: 100%; position: absolute;&quot; allowfullscreen scrolling=&quot;no&quot; allow=&quot;encrypted-media&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;p&gt;2年連続スピーカーとして参加できて良かったです。11:00と朝早くの時間だったにも関わらず、80名の会議室は満員で、サテライト部屋が2部屋も追加される盛況ぶりに驚きました。多数の方に視聴頂きましてありがとうございます。&lt;/p&gt;
&lt;h2&gt;質疑応答&lt;/h2&gt;
&lt;p&gt;発表後にいくつか質問をいただきました。&lt;/p&gt;
&lt;h3&gt;Q. チーム全員検証はどのような環境で行ったのか？&lt;/h3&gt;
&lt;p&gt;ユーザーさんは閲覧できないステージング環境のサーバーをPHP7.1環境に切り替え、それをチームメンバーに利用してもらいました。&lt;/p&gt;
&lt;h3&gt;Q. PHP5.2で開発しているが、チームメンバーがComposerの必要性を理解していないのでアップグレードにも興味を示しません。どうしたらComposerの必要性が伝わりますか？&lt;/h3&gt;
&lt;p&gt;長年同じ環境で開発をしているとそれが当たり前になってしまい、疑問すら持たなくなります。Composerが無いことで、チームの誰かが車輪の再発明をし、余計な開発コストを掛けている可能性があります。開発スピードが下がることはユーザーデメリットでしかありません。そのチームメンバーの方には、Composerが無いことでチーム全体の開発スピードが下がり、ユーザーさんに機能提供出来る回数が減っている現状について、良いことかどうかを聞いてみると良いと思います。&lt;/p&gt;
&lt;h3&gt;Q. E2Eテストを全画面分実装するのはかなり大変な印象です。デザイン変更時にテスト落ちが頻繁に起きませんか？&lt;/h3&gt;
&lt;p&gt;起きませんでした。E2Eテストの実装方針として、必須項目のみにテキストボックスに文字列を入れて、登録ボタンを押し、成功メッセージが表示されるかなど&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;簡易的な&lt;/em&gt;*&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;テストケースのみでした。薄く広く実装する方針でしたので、INPUTタグを消す、name属性名を変えるなどの変更がない限りテストが落ちることはありませんでした。&lt;/p&gt;
&lt;h2&gt;PHPアップグレード関連が5本！&lt;/h2&gt;
&lt;p&gt;今年は特に多かった印象です。PHPカンファレンス2017福岡でもアップグレード関連の発表がいくつかあり、重い腰を上げ始めた会社さんが増えてきたのだと思います。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://speakerdeck.com/hypermkt/php7-upgrade&quot;&gt;PHP7アップグレード&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;バージョンアップ施策について&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;広告配信管理システムを支えるPHP ~ レガシーシステムからの段階的移行戦略&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;PHPで作るサービスの、これまでの10年とこれからの10年&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://speakerdeck.com/tanakayuki/chatworktophptosi&quot;&gt;ChatWorkとPHPと私&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;PHP Version Up と AWS への移行&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;発表を聞いていて、いくつか感じたことがありました。&lt;/p&gt;
&lt;h3&gt;アップグレードの必要性は認識していたが、売上・KPIのためサービス開発を優先&lt;/h3&gt;
&lt;p&gt;弁護士ドットコムさんの発表が印象的でした。サービス開始から8年間赤字で、最近売上が急増したころにより、今後のサービス拡大を見据えてアプリケーション環境の改善に着手できるようになったと仰ってました。自分の担当サービスも赤字ではないですが、KPIが急成長した点では同様な境遇でした。また、ランサーズさんの発表時に「開発者以外がアップグレードの必要性を理解してもらえないがどうしたらいいか？」という質問もあがっていました。&lt;/p&gt;
&lt;p&gt;エンジニア視点ではセキュリティ対応や開発スピード・モチベーション改善というのがありますが、なかなか理解してもらえない現状もあります。やはり、売上・KPIの成長などのきっかけは必要で、そこでさらなる成長のためにアップグレードの訴えをすると納得もし易いと考えます。&lt;/p&gt;
&lt;h3&gt;サービス・アプリケーション状況により対応コストが全く異なる&lt;/h3&gt;
&lt;p&gt;当然ではありますが、サービスによってアプリケーション状態、フレームワーク有り無し、インフラ規模も千差万別です。特にGREEさんのような大規模なゲームやプラットフォームですと、パートナー企業向けに提供しているAPIなどもあり、エラー一つも許されない状況だと思います。また、CakePHPなどの汎用的なフレームワークの有り無しでも作業コストが変わる印象でした。フレームワーク無しであれば、下位互換性のない変更点など一般的な修正のみですが、フレームワークがあると、フレームワークのアップグレードに伴うファイル名や実装の変更も追加され、更に作業コストが増えます。&lt;/p&gt;
&lt;p&gt;個人的にはフレームワークは必要だと考えているので、それに伴う作業コストは致し方ないと感じますが、フレームワークのバージョンアップ時は設計方針が大きく変わる可能性があるので、PHPのアップグレード以上になるはやの対応が必要だと感じました。&lt;/p&gt;
&lt;h3&gt;チームワークという財産を得た&lt;/h3&gt;
&lt;p&gt;GREEさんの発表で、PHPアップグレードという大きな技術的な課題を乗り越えるため、チームの枠を超え様々な職種の方と積極的なコミュニケーションを取り、一致団結して取り組む、そしてそれが財産になると。話を聞いていて本当にそうだなぁ・・・うんうん、としみじみ感じていました。（資料のストーリーも分かりやすくてうまい。）&lt;/p&gt;
&lt;p&gt;特に自分の場合は、インフラエンジニアの
&lt;a href=&quot;https://twitter.com/hfm&quot;&gt;@hfm&lt;/a&gt;と密に連携して作業を進める中で、困った時に助けてもらったり、時に厳しい指摘をもらったり、お互いが各々の技術フィールドを信頼しあって進めていました。いろいろ辛かったこともありましたが、協力無くして5.2から7.1へのアップグレード目標の達成はできなかったことでしょう。PHPカンファレンスで発表する機会も生まれました。@hfm に大変感謝です。&lt;/p&gt;
&lt;h2&gt;さいごに&lt;/h2&gt;
&lt;p&gt;今年もスピーカーとして参加できて良かったです。何よりチームの同僚と一緒に登壇できたのが嬉しかったです。また、会社からもスタッフ参加や一般として参加する人もおり、いろんな形で関わっている人が多いイベントでした。&lt;/p&gt;
&lt;p&gt;去年の中盤から色んな所で登壇することで、徐々に顔見知りが増え、過去に自分の発表を見てくれた人や名前を覚えてくれた人も何人もいました。これも継続的な発表をした成果だと思います。&lt;/p&gt;
&lt;p&gt;やっぱりPHPカンファレンスはPHPerにとって最高のイベントなので、来年も参加したいです。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://www.instagram.com/p/BZ-kbhxncKf/&quot;&gt;#phpcon2017 で発表してきました！サテライト２部屋増設とたくさんの方に視聴頂いてありがとうございます！来年も参加するぞー！&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Makoto Chibaさん(@hypermkt)がシェアした投稿 -
2017 10月 7 11:52午後 PDT&lt;/p&gt;</content:encoded></item><item><title><![CDATA[builderscon tokyo 2017に参加しました]]></title><description><![CDATA[ブログを書くまでがbuildersconということで、参加記録の記事を書きます。### CFP 自分のbuildersconは
CFP…]]></description><link>https://blog.hypermkt.jp/2017/2017-08-06-builderscon-tokyo-2017/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2017/2017-08-06-builderscon-tokyo-2017/</guid><pubDate>Sun, 06 Aug 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;ブログを書くまでがbuildersconということで、参加記録の記事を書きます。### CFP&lt;/p&gt;
&lt;p&gt;自分のbuildersconは
&lt;a href=&quot;https://builderscon.io/tokyo/2017/session/44db23a8-db2e-4918-b001-0faa50bd2b80&quot;&gt;CFP応募&lt;/a&gt;から始まっていました。結果不採用となりましたが、今回参加してわかったことは、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;知らなかった、を聞く&lt;/em&gt;*&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;というテーマに沿えてなかったと感じました。PHPのアップグレードに関する情報は既にいくつかありますし、新鮮味もなかったのだろうと理解しました。応募をしたことは、ナイストライと褒めたいですが、この反省を活かしたいです。&lt;/p&gt;
&lt;h3&gt;前夜祭&lt;/h3&gt;
&lt;p&gt;企業や関係者を特定してしまう固有名詞は投稿禁止、写真・動画撮影禁止とのことでセッション内容については控えます。但し「すごーい」等の感想は許可されていたので、一言で言うとすごかったです。本当にここでしか聞けない話だったので、参加して損は無い内容でした&lt;/p&gt;
&lt;h3&gt;1日目&lt;/h3&gt;
&lt;p&gt;以下は今回参加したセッションです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PHPで支える大規模アーキテクチャ&lt;/li&gt;
&lt;li&gt;マイクロチームでの高速な新規開発を支える開発・分析基盤&lt;/li&gt;
&lt;li&gt;フレームなき道を拓くPHP&lt;/li&gt;
&lt;li&gt;RDBアンチパターン リファクタリング&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;PHPで支える大規模アーキテクチャ&lt;/p&gt;
&lt;p&gt;正直な感想としては、Hadoop/Spark/Cassandoraなどを使ったことがなかったので、全体的に難しい内容でした。大量データの中から高速に検索仕組みとして、PHPからでもビッグデータを扱うことが出来るということは分かりました。&lt;/p&gt;
&lt;p&gt;マイクロチームでの高速な新規開発を支える開発・分析基盤&lt;/p&gt;
&lt;p&gt;timakinさんは、去年の
&lt;a href=&quot;http://yapcasia8oji-2016mid.hachiojipm.org/&quot;&gt;ヤパチー&lt;/a&gt;にボランティアスタッフとして参加された方で、
&lt;a href=&quot;https://hypermkt-blog.lolipop.io/yapcasia-hachioji-2016-in-shinagawa/&quot;&gt;同じ部屋を担当&lt;/a&gt;しました。その後、Gunosyに転職されていたんですね。&lt;/p&gt;
&lt;p&gt;3ヶ月という短い期間で、小規模なチームながら、API・アプリ・分析基盤を関連知識未経験なエンジニアと開発し、それを見事にやり遂げるお話。一言でいうと圧巻という感じでした。聞いていて思ったのは、Gunosy社内の知見やライブラリを最大限に再利用してるのが素晴らしかったです。入社直後ともあれば、コミュニケーションも課題になるかと感じましたが、それを微塵にも感じさせないような内容でした。&lt;/p&gt;
&lt;p&gt;フレームなき道を拓くPHP&lt;/p&gt;
&lt;p&gt;PixivでPHPエンジニアをされている方のお話。実務で経験されたルーティング問題についてのお話が一番記憶に残っています。業務でも似たような問題を抱えているので、悩ましいですね・・・。&lt;/p&gt;
&lt;p&gt;RDBアンチパターン リファクタリング&lt;/p&gt;
&lt;p&gt;「データベースの寿命はアプリケーションよりも案外」という言葉に改めてハッとさせられました。その当たり前のことをすっかりと忘れていました。
その上でデータベースをリファクタリングするという気持ちで取り込んだことはあまりありませんでした。ソフトウェアエンジニアの場合、データベースとの関わりは大きいです。にも関わらず、データベースのリファクタリングは軽視されがちですが、もはやアプリケーションのOSとも言える土台なので、そこはもうちょっと考慮すべきだったと反省するきっかけとなりました。&lt;/p&gt;
&lt;p&gt;また「RDBの知識は寿命が長い 覚えれば仕事で長い間役に立つ」というのも同意です。ソフトウェアエンジニアの場合、特定の言語・フレームワークは5年単位でパラダイムシフトが起き、環境が変わることも少なくありません。しかし、RDBはアプリケーションより寿命も長いこともあり、技術自体も大きく変わりません。一瞬DBAに転職しようか悩みました（笑）&lt;/p&gt;
&lt;h3&gt;2日目&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://ginzarb.github.io/kaigi01/&quot;&gt;ぎんざRuby会議01&lt;/a&gt;にてLTの予定があり、開始から参加するため、builderscon 2日目の参加は辞退しました。2日目は特に聞きたいセッションが多かったので残念・・・。早くビデオがアップされないかな。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ここまで出来るmruby&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;知られざる世界 〜WEB以外のPHP〜&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;OSS の引き継ぎ方&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;OSS貢献超入門&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The Evolution of PHP at Slack HQ&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;型を意識した PHP アプリケーション開発&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Serverless Server Side Swift&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;汎用CMSから新規開発の自社サービスへ移行した事例のご紹介&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;まとめ&lt;/h3&gt;
&lt;p&gt;一言で言えば参加して良かったです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;buildersconは「知らなかった、を聞く」をテーマとした技術を愛する全てのギーク達のお祭りです。&lt;/em&gt;*&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;という説明通りでした。懇親会の料理もとても豪華ですし、量も多くよくあるイベントですぐになくなってしまうということもありませんでした。いろんな方に突撃で声をかけてみましたが、どなたも親切に答えてくれました。思い出せば、懇親会のチケットを申し込み忘れていたのですが、スタッフの方に譲って頂き無事に参加できて感謝です。&lt;/p&gt;
&lt;p&gt;来年は「知らなかった、を聞く」に応えられるようなテーマで応募してリベンジしたいです。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Vue.js Tokyo v-meetup]]></title><description><![CDATA[はじめに 2017年7月7日(金) LINE株式会社オフィスで開催された「
Vue.js Tokyo v-meetup #4」でLTしてきました。 当初は、「Vue.js…]]></description><link>https://blog.hypermkt.jp/2017/2017-07-09-vue-js-tokyo-meetup-4-lt/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2017/2017-07-09-vue-js-tokyo-meetup-4-lt/</guid><pubDate>Sun, 09 Jul 2017 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;はじめに&lt;/h2&gt;
&lt;p&gt;2017年7月7日(金) LINE株式会社オフィスで開催された「
&lt;a href=&quot;https://vuejs-meetup.connpass.com/event/58071/&quot;&gt;Vue.js Tokyo v-meetup #4&lt;/a&gt;」でLTしてきました。 当初は、「Vue.jsで作る音声レコーダー」というユニットテストとは全く関係ない事を話す予定でした。&lt;/p&gt;
&lt;div style=&quot;left: 0; width: 100%; height: 0; position: relative; padding-bottom: 56.1972%;&quot;&gt;&lt;iframe src=&quot;https://speakerdeck.com/player/2882ec422411496d9b317187150124a6&quot; style=&quot;border: 0; top: 0; left: 0; width: 100%; height: 100%; position: absolute;&quot; allowfullscreen scrolling=&quot;no&quot; allow=&quot;encrypted-media&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;h2&gt;なぜユニットテストの話にしたのか&lt;/h2&gt;
&lt;p&gt;とある日同僚の
&lt;a href=&quot;https://twitter.com/Joe_noh&quot;&gt;@Joe_noh&lt;/a&gt; が「Vueコンポーネントのテストをきっちりやっているの、世界で３人くらいしかいないのでは」と言っていました。話を聞くと、業務でVue.jsを利用し始めたが、コンポーネントのテストが辛い、事例やサンプルの情報が少ないとのことでした。確かに自分も以前から同じことを感じていました。&lt;/p&gt;
&lt;p&gt;その状況の原因としては、「The Progressive JavaScript Framework」所以なのではと考えていました。Progressive とは、「アプリケーションの段階的な要求変化に応じて問題解決できる方法を提供できる。必要になった時に問題解決するライブラリを適宜導入して問題を解決する」という意味です。Vue.js本体はフルスタックなフレームワークではなく、ビュー層に焦点が当てられてたフレームワークです。それゆえ、
&lt;a href=&quot;https://jp.vuejs.org/v2/guide/unit-testing.html#%E3%83%86%E3%82%B9%E3%83%88%E3%83%84%E3%83%BC%E3%83%AB%E3%81%A8%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97&quot;&gt;ドキュメントのテストの項目&lt;/a&gt;にも、単純な例やDOM更新の例しかありません。それ自体は、ライブラリの方針なので問題ではありません。&lt;/p&gt;
&lt;p&gt;しかし現場は違います。RouterもHttpもStoreも利用します。それらが連携して一つのアプリケーションとなります。そういった状況で簡単にテストが書けるライブラリが必要と感じていました。
&lt;a href=&quot;https://twitter.com/Joe_noh&quot;&gt;@Joe_noh&lt;/a&gt; から
&lt;a href=&quot;https://github.com/eddyerburgh/avoriaz&quot;&gt;avoriaz&lt;/a&gt;、
&lt;a href=&quot;https://github.com/vuejs/vue-test-utils&quot;&gt;vue-test-utils&lt;/a&gt;の存在を教えてもらい、他の人も同じことを考えていることが分かりました。&lt;/p&gt;
&lt;p&gt;であれば、今回のMeetupで、テストを書くのが辛い状況を共有し、テストに関することをもっとアウトプットしてもらおう！と考え、ユニットテストの話をすることにしました。&lt;/p&gt;
&lt;h2&gt;発表資料&lt;/h2&gt;
&lt;p&gt;現時点(7/9 17:00)で
&lt;a href=&quot;http://b.hatena.ne.jp/entry/s/speakerdeck.com/hypermkt/vuekonponentofalseyunitutotesuto&quot;&gt;133ブクマ&lt;/a&gt;頂き大変嬉しいです。それだけテストに関する需要や共感を頂けたものと感じています。&lt;/p&gt;
&lt;h2&gt;LINE株式会社 新宿オフィス&lt;/h2&gt;
&lt;p&gt;2017年4月にヒカリエからミライナータワーに引っ越した新オフィスです。今回写真撮影NGとのことでしたので、有名な
&lt;a href=&quot;http://blog.kushii.net/archives/2048602.html&quot;&gt;941さんのブログ&lt;/a&gt;をご覧ください。こちらのオーディトリアムと呼ばれるセミナールームでした。スーパーオシャレでした。&lt;/p&gt;
&lt;h2&gt;懇談会&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Vue.jsを始めたばっかり&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;テストって必要なんですか？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コンポーネントのロジックはテストしていたが、ビューはしていなかった。ビュー層のテストが出来るようになって良い。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;vue-routerを使っているが、モックを作るのがめんどい&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;今日紹介されたライブラリは初めて聞いた&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;vue-test-utilsに期待&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;などいろんなコメントをもらいました。&lt;/p&gt;
&lt;h2&gt;おわりに&lt;/h2&gt;
&lt;p&gt;情報提供、発表のきっかけを作ってくれた
&lt;a href=&quot;https://twitter.com/Joe_noh&quot;&gt;@Joe_noh&lt;/a&gt;, 資料のレビューをしてくれた
&lt;a href=&quot;https://twitter.com/inouetakuya&quot;&gt;@inouetakuya&lt;/a&gt;,
&lt;a href=&quot;https://twitter.com/tsuchikazu&quot;&gt;@tsuchikazu&lt;/a&gt;の三人に感謝です。&lt;/p&gt;
&lt;p&gt;また登壇時に大切なことを言い忘れていましたが、
何でも良いのでテストの実装例をアウトプットしてもらえると嬉しいです！&lt;/p&gt;</content:encoded></item><item><title><![CDATA[The only supported ciphers are AES-128-CBC and AES-256-CBCエラーにハマった]]></title><description><![CDATA[概要 Laravelで開発したアプリケーションを閲覧した際に「
The only supported ciphers are AES-128-CBC and AES-256-CBC…]]></description><link>https://blog.hypermkt.jp/2017/2017-03-13-laravel-the-only-supported-ciphers-error/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2017/2017-03-13-laravel-the-only-supported-ciphers-error/</guid><pubDate>Mon, 13 Mar 2017 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;概要&lt;/h2&gt;
&lt;p&gt;Laravelで開発したアプリケーションを閲覧した際に「
The only supported ciphers are AES-128-CBC and AES-256-CBC」というエラーが表示され結構ハマってしまいました。本エラーの原因と解決方法をまとめます。&lt;/p&gt;
&lt;h2&gt;前提&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Laravel 5.4&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;原因&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;このエラー文言は&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/laravel/framework/blob/5.4/src/Illuminate/Encryption/Encrypter.php#L43&quot;&gt;Encrypterクラス&lt;/a&gt;から例外で送出されます。
supportedメソッドを見ると暗号化名と桁数が一致しないとfalseとなりこの問題が発生します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;つまり&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;.envファイル内で指定した
APP_KEYと
config/app.phpの
cipherで指定した暗号と桁数が一致していないのが原因です。&lt;/p&gt;
&lt;h2&gt;解決方法&lt;/h2&gt;
&lt;p&gt;確認すべきは以下です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;.env&lt;/strong&gt; 内で &lt;strong&gt;APP_KEY&lt;/strong&gt; が指定されているか。指定されていなければ、&lt;strong&gt;php artisan key:generate&lt;/strong&gt; を実行する&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;APP_KEY&lt;/strong&gt; を復号化して桁数を調べる&lt;/li&gt;
&lt;li&gt;もし16桁なら &lt;strong&gt;AES-128-CBC&lt;/strong&gt; を、32桁なら&lt;strong&gt;AES-256-CBC&lt;/strong&gt;を指定する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これで解決します。&lt;/p&gt;
&lt;h2&gt;参考&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/laravel/framework/issues/9080&quot;&gt;The only supported ciphers are AES-128-CBC and AES-256-CBC&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[CTO賞祝賀会に行ってきました]]></title><description><![CDATA[はじめに 先日あんちぽさん(@kentaro)、おっくん (@hfm)とCTO賞祝賀会のため、飯田橋の
トラットリア・グランボッカに行ってきました。 CTO賞を頂いた経緯 自分の担当サービスである「グーペ」 お申込みサイトのPHP…]]></description><link>https://blog.hypermkt.jp/2017/2017-02-06-cto-award-2016/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2017/2017-02-06-cto-award-2016/</guid><pubDate>Sun, 26 Feb 2017 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;はじめに&lt;/h2&gt;
&lt;p&gt;先日あんちぽさん(&lt;a href=&quot;https://twitter.com/kentaro&quot;&gt;@kentaro&lt;/a&gt;)、おっくん (&lt;a href=&quot;https://twitter.com/hfm&quot;&gt;@hfm&lt;/a&gt;)とCTO賞祝賀会のため、飯田橋の
&lt;a href=&quot;https://tabelog.com/tokyo/A1309/A130905/13173167/&quot;&gt;トラットリア・グランボッカ&lt;/a&gt;に行ってきました。&lt;/p&gt;
&lt;h2&gt;CTO賞を頂いた経緯&lt;/h2&gt;
&lt;p&gt;自分の担当サービスである「&lt;a href=&quot;https://goope.jp/&quot;&gt;グーペ&lt;/a&gt;」 お申込みサイトのPHP7化を、社内最速で達成できたことを評価してもらえました。タイミングもあったかもしれませんが、初のCTO賞を頂けたことは大変嬉しいですし光栄です。&lt;/p&gt;
&lt;h2&gt;肉もワインも最高のイタリアン！&lt;/h2&gt;
&lt;p&gt;前菜からローストビーフまでどれも絶品で、食べるのがもったいないくらい美味しかったです。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/IMG_20170131_201852-e1486305416634.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/IMG_20170131_210537-e1486305529745.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/IMG_20170131_231144-e1486305566746.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;将来目指したいエンジニア像、グーペの未来について様々な話をすることができました。去年の頑張りの成果で来ることができたので、今年度末も同じように思えるようになりたいです。CTO賞、頂いたからには二年連続の獲得ができるように今年も頑張ろう！&lt;/p&gt;</content:encoded></item><item><title><![CDATA[PHP BLT]]></title><description><![CDATA[はじめに 2/22(火)にメルカリオフィスで行われた
PHP BLT #6でLTしてきました。タイトルは「5分で分かるPHP7化する方法」です。 発表資料 業務で携わるサービスのPHPアップグレードから学んだ事のお話でしたが、予想通り…]]></description><link>https://blog.hypermkt.jp/2017/2017-02-25-phpblt6/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2017/2017-02-25-phpblt6/</guid><pubDate>Sat, 25 Feb 2017 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;はじめに&lt;/h2&gt;
&lt;p&gt;2/22(火)にメルカリオフィスで行われた
&lt;a href=&quot;https://phpblt.connpass.com/event/49458/&quot;&gt;PHP BLT #6&lt;/a&gt;でLTしてきました。タイトルは「5分で分かるPHP7化する方法」です。&lt;/p&gt;
&lt;h2&gt;発表資料&lt;/h2&gt;
&lt;div style=&quot;left: 0; width: 100%; height: 0; position: relative; padding-bottom: 56.1972%;&quot;&gt;&lt;iframe src=&quot;https://speakerdeck.com/player/fdefef95b4984996921b0712475865a6&quot; style=&quot;border: 0; top: 0; left: 0; width: 100%; height: 100%; position: absolute;&quot; allowfullscreen scrolling=&quot;no&quot; allow=&quot;encrypted-media&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;p&gt;業務で携わるサービスのPHPアップグレードから学んだ事のお話でしたが、予想通り5分では一部しかご紹介できませんでした。出来たらPHPカンファレンスなどでもう少し時間を取ってじっくり発表したいですね。&lt;/p&gt;
&lt;h2&gt;懇談会&lt;/h2&gt;
&lt;h3&gt;PHPプロジェクトのデプロイツールは何が最適か？&lt;/h3&gt;
&lt;p&gt;あるエンジニアの方が最近PHPプロジェクトに参加し、デプロイツールを探されていました。その方の結論はCapistranoで、Deployer/Rocketeerが不採用になった理由の一つがステージ毎の設定が柔軟に
できなかったとのことでした。（もう一個のssh絡みの理由は忘れてしまいました＾＾；）&lt;/p&gt;
&lt;p&gt;個人的にデプロイツールに求める要件としては、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;開発・デザイナーのPC環境に依存せず利用できること&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;みんなが見れる場所でデプロイ履歴が残ること&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;です。裏側はCapistranoでも何でもいいですが、表はChatOpsでデプロイ出来るのが理想だと今回の懇談会で感じました。&lt;/p&gt;
&lt;h3&gt;名前を覚えてもらえてて嬉しかった&lt;/h3&gt;
&lt;p&gt;前回の
&lt;a href=&quot;https://phpblt.connpass.com/event/35070/&quot;&gt;PHP BLT #5&lt;/a&gt;で司会をした際に、迷コメントをたくさん発したおかげで「バーチー」という名前を覚えてもらえて嬉しかったです。明日も頑張って生きようと思いました。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;司会で評判のバーチーさんだ!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/hashtag/phpblt?src=hash&quot;&gt;#phpblt&lt;/a&gt;— Jun Watanabe＠rela (@rela1470)
&lt;a href=&quot;https://twitter.com/rela1470/status/834361224443727872&quot;&gt;2017年2月22日&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;バーチーさんや！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/hashtag/phpblt?src=hash&quot;&gt;#phpblt&lt;/a&gt;— いとしょ (@itosho)
&lt;a href=&quot;https://twitter.com/itosho/status/834361372116865024&quot;&gt;2017年2月22日&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;まとめブログ&lt;/h2&gt;
&lt;p&gt;こちらの記事が、会場の雰囲気から参加者の資料などが分かりやすくまとまっています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;http://hamuhamu.hatenablog.jp/entry/2017/02/22/220837&quot;&gt;PHP BLT #6に参加してきた - はむはむエンジニアぶろぐ&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://pause.cf/post/201702/phpblt-vol6/&quot;&gt;PHP BLT #6 @ メルカリさん に参加してきました #phpblt | pause&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;おわりに&lt;/h2&gt;
&lt;p&gt;新規プロジェクトでは最新バージョンが利用されるのは当たり前だが、現場レベルではPHP5.6が一番普及しているという印象でした。PHP7以上にあげたいという気持ちはあるが、アプリケーションの状態からどうしても重い腰が上げられないという声をいくつか聞きました。アップグレード情報は需要があると強く感じることができ、とても良い機会でした。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[PHP7文法調査(3) スカラー型宣言]]></title><description><![CDATA[はじめに 個人的には待ってました！というべき機能でした。三行でまとめると 引数の型宣言の種類が増えた 関数の戻り値の型も指定できるようになった 緩い型、強い型モードの２種類が設定できるようになった となります。早速確認していきましょう。 新しい型宣言 php.net…]]></description><link>https://blog.hypermkt.jp/2017/2017-02-12-php7-scalar-type-hinting/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2017/2017-02-12-php7-scalar-type-hinting/</guid><pubDate>Sun, 12 Feb 2017 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;はじめに&lt;/h2&gt;
&lt;p&gt;個人的には待ってました！というべき機能でした。三行でまとめると&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;引数の型宣言の種類が増えた&lt;/li&gt;
&lt;li&gt;関数の戻り値の型も指定できるようになった&lt;/li&gt;
&lt;li&gt;緩い型、強い型モードの２種類が設定できるようになった&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;となります。早速確認していきましょう。&lt;/p&gt;
&lt;h2&gt;新しい型宣言&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;http://php.net/manual/ja/functions.arguments.php#functions.arguments.type-declaration&quot;&gt;php.netの型宣言&lt;/a&gt;によると、以下の4種類が新しい型として利用できるようになりました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ブーリアン型 bool&lt;/li&gt;
&lt;li&gt;文字列型 string&lt;/li&gt;
&lt;li&gt;数値型 int&lt;/li&gt;
&lt;li&gt;浮動小数点数型 float&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;PHP5.0はクラス、PHP5.1は配列、PHP5.4はcallableが指定できましたが、型宣言として不十分でした。PHP7からやっと本格的な型宣言ができるようになったという印象です。&lt;/p&gt;
&lt;h2&gt;戻り値の型宣言が出来るようになった&lt;/h2&gt;
&lt;p&gt;PHP7の大きな仕様追加の一つに上げられるのは、この
&lt;a href=&quot;http://php.net/manual/ja/migration70.new-features.php#migration70.new-features.return-type-declarations&quot;&gt;戻り値の型宣言&lt;/a&gt;だと思います。&lt;/p&gt;
&lt;h3&gt;サンプルコード1&lt;/h3&gt;
&lt;p&gt;下記のように戻り値に文字列を指定した関数で配列を返そうとすると、&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;php&quot;&gt;&lt;pre class=&quot;language-php&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function-definition function&quot;&gt;hoge1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword return-type&quot;&gt;string&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;hoge1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;実行結果&lt;/h3&gt;
&lt;p&gt;下記エラーが発生するようになり、より関数の入出力が厳密な実装ができるようになりました。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;php&quot;&gt;&lt;pre class=&quot;language-php&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token constant&quot;&gt;PHP&lt;/span&gt; Fatal error&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;  Uncaught TypeError&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;Return&lt;/span&gt; value of &lt;span class=&quot;token function&quot;&gt;hoge1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; must be of the type &lt;span class=&quot;token keyword type-declaration&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword type-declaration&quot;&gt;array&lt;/span&gt; returned in&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;デフォルトでは弱い型検査、設定で強い型検査も可能&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;http://php.net/manual/ja/functions.arguments.php#functions.arguments.type-declaration.strict&quot;&gt;強い型付け&lt;/a&gt;のページによると、以下となります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;弱い型、強い型の２種類があり、デフォルトでは弱い型が選択されている&lt;/li&gt;
&lt;li&gt;弱い型の場合に、間違った型が渡されても可能な限り型の自動変換が適用される&lt;/li&gt;
&lt;li&gt;厳密な型宣言にするには、declare文でstrict_types = 1を宣言することにより適用できる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;少し分かりにくいので、サンプルコードを交えながら見ていきましょう。&lt;/p&gt;
&lt;p&gt;1番はそういうものとして、2番が一番気になりました。例えば以下のようなコードです。&lt;/p&gt;
&lt;h3&gt;型の自動変換&lt;/h3&gt;
&lt;p&gt;サンプルコード2&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;php&quot;&gt;&lt;pre class=&quot;language-php&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function-definition function&quot;&gt;hoge1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword type-hint&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$hoge&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;var_dump&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$hoge&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;hoge1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;hoge&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// OK&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;hoge1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// OK&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;実行結果&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;php&quot;&gt;&lt;pre class=&quot;language-php&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token keyword type-declaration&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;hoge&quot;&lt;/span&gt;
&lt;span class=&quot;token keyword type-declaration&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;1&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;実行結果を見ると面白いことが起きています。数値の1が文字列の1に変換されているのが分かります。これが型の自動変換の結果のようですね。&lt;/p&gt;
&lt;h3&gt;厳密な型宣言&lt;/h3&gt;
&lt;p&gt;declare(strict_types=1);を宣言すると、サンプルコード２の実行結果と変わりました。stringの時は、stringしか通らなくなりました。&lt;/p&gt;
&lt;p&gt;サンプルコード3&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;php&quot;&gt;&lt;pre class=&quot;language-php&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;declare&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;strict_types&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 厳密な型検査モードにする&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function-definition function&quot;&gt;hoge1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword type-hint&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$hoge&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$hoge&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;hoge1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;hoge&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// OK&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;hoge1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// NG&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;実行結果&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;php&quot;&gt;&lt;pre class=&quot;language-php&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;hogePHP Fatal error&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;  Uncaught TypeError&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Argument &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; passed to &lt;span class=&quot;token function&quot;&gt;hoge1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; must be of the type &lt;span class=&quot;token keyword type-declaration&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; integer given&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; called&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;２つの型検査が生み出す新たな世界&lt;/h2&gt;
&lt;p&gt;この２つの型検査の仕様を知った時、どうしてどちらかにならなかったんだろうか？と単純に思いました。その経緯と回答については、
&lt;a href=&quot;http://tech.respect-pal.jp/&quot;&gt;東北ギーク ～仙台にあるWeb系会社システム部のブログ～さん&lt;/a&gt;の
&lt;a href=&quot;http://tech.respect-pal.jp/php7_scalar_type_hinting/#i-5&quot;&gt;3 導入に至るまでの経緯&lt;/a&gt;の記事に詳しくまとまってるので、そちらをご覧ください。&lt;/p&gt;
&lt;p&gt;要するに、弱い型検査、強い型検査、双方にメリット・デメリットがありますが、議論の末に両方の導入が決まり選択はエンジニアに委ねられたということでした。&lt;/p&gt;
&lt;p&gt;個人的にはどちらかにしてほしかったと思います。選択肢があるということは、導入時にはそれを決めるコスト、利用時にはそれを確認するコストの両方が発生します。がっつりとPHP7のコードの世界には入っていないので、どんなことは待ち受けているか分かりませんが、今後どちらが良いのか見極めていきたいです。まずは弱い型検査を使ってみようと思います。&lt;/p&gt;
&lt;h2&gt;終わりに&lt;/h2&gt;
&lt;p&gt;PHP7文法チェックを調べれば調べるほど、新仕様には長年の議論の末に導入されたという事実が潜んでいることが多いことが分かりました。特に今回のスカラー型宣言は、その典型例でした。文法を知ることも大切ですが、こういった背景を知った上で利用するのも面白いと思いました。&lt;/p&gt;
&lt;h2&gt;参考サイト&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://php.net/manual/ja/migration70.new-features.php#migration70.new-features.scalar-type-declarations&quot;&gt;PHP: 新機能 - Manual&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://qiita.com/bokotomo/items/1ead446ef689dc45b487&quot;&gt;PHPの型と型安全について(PHP7からのPHPプログラミング) - Qiita&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://tech.respect-pal.jp/php7_scalar_type_hinting/&quot;&gt;【導入決定！】PHP7で実装されるスカラー型宣言とは？ | 東北ギーク&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[PHP7文法調査(2) Null合体演算子]]></title><description><![CDATA[はじめに 前回の続き、PHP7の文法を見ていきます。今回は前々から気になっていた ?? です。 概要 php.netでは以下のように説明されています。 null 合体演算子 (??) がシンタックスシュガーとして追加されました。 三項演算子と isset…]]></description><link>https://blog.hypermkt.jp/2017/2017-02-07-php7-null-coalesce-operator/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2017/2017-02-07-php7-null-coalesce-operator/</guid><pubDate>Tue, 07 Feb 2017 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;はじめに&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/php7-group-use-declaration/&quot;&gt;前回&lt;/a&gt;の続き、PHP7の文法を見ていきます。今回は前々から気になっていた ?? です。&lt;/p&gt;
&lt;h2&gt;概要&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;http://php.net/manual/ja/migration70.new-features.php&quot;&gt;php.net&lt;/a&gt;では以下のように説明されています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;null 合体演算子 (??) がシンタックスシュガーとして追加されました。 三項演算子と isset() を組み合わせる よくありがちなパターンを、より簡単に書くためのものです。 この演算子は、もし第一オペランドが非 NULL の値であればそれを返し、 そうでない場合は第二オペランドを返します。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;サンプルコードを書くと以下のようになります。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;php&quot;&gt;&lt;pre class=&quot;language-php&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token php language-php&quot;&gt;&lt;span class=&quot;token delimiter important&quot;&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 左辺がNULLでなければそれを返し、NULLならば右辺を返す。&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$_GET&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;user&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;??&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;This is null&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 以下と同じ意味&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;isset&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$_GET&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;user&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$_GET&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;user&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;This is null&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;確かに今まではissetを利用してNULL判定する機会は多々ありましたが、冗長なコードになりがちでした。??を利用することで重複箇所が減り、コードもすっきりします。&lt;/p&gt;
&lt;h2&gt;NULL合体演算子が生まれた経緯&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.php.net/rfc/isset_ternary&quot;&gt;RFC&lt;/a&gt;を見ると面白いことが書いてあります。要約すると&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PHPはWebに焦点をあてた言語なので、ユーザーデータの処理は頻繁に行われます。&lt;/li&gt;
&lt;li&gt;isset($_GET[‘mykey’]) ? $_GET[‘mykey’] : &quot;&quot; とチェックするのは面倒くさい&lt;/li&gt;
&lt;li&gt;短縮版三項演算子 ?: は便利にしてくれますが $_GET[‘mykey’] ?: &quot;&quot; の場合にNoticeエラーが起きる（Undefined index)&lt;/li&gt;
&lt;li&gt;これらの問題解決のため、?: の修正やifsetor()が頻繁に要求されてきた&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;結局何が原因でここまで議論されてきたのかと言うと、精査したい対象の値が$_GET[‘no_index’]のような場合だと、Noticeエラーがあがってしまうのが問題とのことでした。それを回避する手段として?:の修正案や
&lt;a href=&quot;https://wiki.php.net/rfc/ifsetor&quot;&gt;ifsetor&lt;/a&gt;が提案されてきたんですね。&lt;/p&gt;
&lt;p&gt;ちなみにifsetorの実装例は下記のようなコードだそうです。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;php&quot;&gt;&lt;pre class=&quot;language-php&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function-definition function&quot;&gt;ifsetor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$value&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$default&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;isset&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$value&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$value&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$default&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;確かにこれであればNoticeエラーも回避できますが、どうも名前が分かりづらい印象です。&lt;/p&gt;
&lt;p&gt;そして今回満を持して ?? 演算子が実装されたようです。&lt;/p&gt;
&lt;h2&gt;終わりに&lt;/h2&gt;
&lt;p&gt;RFCも確認するとそれがどういった経緯で導入されたのか知れて面白いですね。関連する議論については2004年から始まっており、12年越しに生まれた文法が ??演算子なので、機会があれば積極的に使っていきたいですね。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[PHP7文法調査(1) use宣言のグループ化]]></title><description><![CDATA[はじめに PHP7.0.xから追加された新機能、文法について把握できていないので、気になった箇所から調べてみようと思います。 概要 複数のクラスや関数そして定数を同じ namespace からインポートする際に、 単一の use 文にまとめられるようになりました。 今までuse…]]></description><link>https://blog.hypermkt.jp/2017/2017-02-05-php7-group-use-declaration/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2017/2017-02-05-php7-group-use-declaration/</guid><pubDate>Sun, 05 Feb 2017 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;はじめに&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;http://php.net/manual/ja/migration70.new-features.php&quot;&gt;PHP7.0.x&lt;/a&gt;から追加された新機能、文法について把握できていないので、気になった箇所から調べてみようと思います。&lt;/p&gt;
&lt;h2&gt;概要&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;複数のクラスや関数そして定数を同じ namespace からインポートする際に、 単一の use 文にまとめられるようになりました。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;今までuseでクラスのインポートをする際は、必要な数だけuseを記述する必要がありましたが、同じ名前空間の場合は一行で記述出来るようになりました。この記法であれば重複も減り、可読性もあがっていいですね。&lt;/p&gt;
&lt;h3&gt;BEFORE&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;php&quot;&gt;&lt;pre class=&quot;language-php&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;token package&quot;&gt;Sample&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;Hoge&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;token package&quot;&gt;Sample&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;Fuga&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;token package&quot;&gt;Sample&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;Bar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;AFTER&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;php&quot;&gt;&lt;pre class=&quot;language-php&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;use&lt;/span&gt; Sample\&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;Hoge&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Fuga&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Bar&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;参考サイト&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://php.net/manual/ja/migration70.new-features.php&quot;&gt;PHP: 新機能 - Manual&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://wiki.php.net/rfc/group_use_declarations&quot;&gt;PHP: rfc:group_use_declarations&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[phpenvのphpにpdo_pgsqlをインストールする方法]]></title><description><![CDATA[背景 LaravelからPostgreSQLのデータベースに接続しようと思い、DB設定をした所下記エラーに遭遇した。 調査した所、下記２点が分かった。 Laravelでは PDO PostgreSQL 拡張モジュールを利用してPostgreSQLに接続する phpenv…]]></description><link>https://blog.hypermkt.jp/2017/2017-01-28-install-pdo-pgsql-for-phpenv/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2017/2017-01-28-install-pdo-pgsql-for-phpenv/</guid><pubDate>Sat, 28 Jan 2017 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;背景&lt;/h2&gt;
&lt;p&gt;LaravelからPostgreSQLのデータベースに接続しようと思い、DB設定をした所下記エラーに遭遇した。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;php&quot;&gt;&lt;pre class=&quot;language-php&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;Illuminate\Database\QueryException with message &lt;span class=&quot;token string single-quoted-string&quot;&gt;&apos;could not find driver (SQL: select * from &quot;hoges&quot;)&apos;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;調査した所、下記２点が分かった。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Laravelでは&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;http://php.net/manual/ja/ref.pdo-pgsql.php&quot;&gt;PDO PostgreSQL 拡張モジュール&lt;/a&gt;を利用してPostgreSQLに接続する&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;phpenvでインストールしたPHP7.1.0にはpdo_pgsqlが無い&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;根本的には２番が原因なので、phpenvでPHPをインストール時にpdo_pgsqlを有効にしてインストールする方法をまとめます。&lt;/p&gt;
&lt;h2&gt;対象者&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;LaravelでPostgreSQLに接続したい人&lt;/li&gt;
&lt;li&gt;phpenvでpdo_pgsqlを利用したい人&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;手順&lt;/h2&gt;
&lt;h3&gt;特定のバージョンで有効にする&lt;/h3&gt;
&lt;p&gt;7.1.0で有効にする場合は
~/.phpenv/plugins/php-build/share/php-build/definitions/7.1.0 の冒頭部に
configure_option -R “—with-pdo-pgsql”を追加するのみです。完成形は下記の通り。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;configure_option &lt;span class=&quot;token parameter variable&quot;&gt;-R&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;--with-pdo-pgsql&quot;&lt;/span&gt;

install_package &lt;span class=&quot;token string&quot;&gt;&quot;https://secure.php.net/distributions/php-7.1.0.tar.bz2&quot;&lt;/span&gt;
install_xdebug &lt;span class=&quot;token string&quot;&gt;&quot;2.5.0&quot;&lt;/span&gt;
enable_builtin_opcache&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;全バージョンで有効にする&lt;/h3&gt;
&lt;p&gt;~/.phpenv/plugins/php-build/share/php-build/default_configure_options の好きなところに
—with-pdo-pgsqlを追加するのみです。&lt;/p&gt;
&lt;p&gt;上記の対応を実施後
phpenv install 7.1.0 でインストールしなおせば
pdo_pgsql が有効なPHPがインストールされます。&lt;/p&gt;
&lt;h2&gt;終わりに&lt;/h2&gt;
&lt;p&gt;phpenvはextensionの設定も細かく調整できて便利でいいですね。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Laravel 5.3から5.4アップグレード：Laravel Mix編]]></title><description><![CDATA[はじめに Laravel 5.4が２日前にリリースされていたことを知り、5.3で開発を進めていたアプリケーションを5.4へのアップグレードを試みました。
Upgrade Guideを見ると、Laravel ElixirからLaravel Mix…]]></description><link>https://blog.hypermkt.jp/2017/2017-01-26-laravel-53-to-54-upgrade-for-laravel-mix/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2017/2017-01-26-laravel-53-to-54-upgrade-for-laravel-mix/</guid><pubDate>Thu, 26 Jan 2017 00:00:00 GMT</pubDate><content:encoded>&lt;h3&gt;はじめに&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://laravel-news.com/category/laravel-5.4&quot;&gt;Laravel 5.4が２日前にリリース&lt;/a&gt;されていたことを知り、5.3で開発を進めていたアプリケーションを5.4へのアップグレードを試みました。
&lt;a href=&quot;https://laravel.com/docs/5.4/upgrade&quot;&gt;Upgrade Guide&lt;/a&gt;を見ると、Laravel ElixirからLaravel Mixへの乗り換え方法が記述されておらず、途方に暮れていた所、Laravelリファレンス著者
&lt;a href=&quot;https://twitter.com/localdisk&quot;&gt;@localdiskさん&lt;/a&gt;から即レスで手順を教えていだきました。ありがとうございます。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/hypermkt&quot;&gt;@hypermkt&lt;/a&gt; packages.json から laravel-elixir をリリースして laravel-mix を足す。node_modules/laravel-mix/setup/webpack.mix.js をコピーすればOK— MATSUO Masaru (@localdisk)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/localdisk/status/824262581476921344&quot;&gt;2017年1月25日&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;まとめると以下となります。&lt;/p&gt;
&lt;h3&gt;Laravel ElixirからLaravel Mixへの乗り換え手順&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;package.json内のlaravel-elixir関連を削除して、laravel-mix を追加&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token property&quot;&gt;&quot;laravel-elixir&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;^6.0.0-14&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;&quot;laravel-elixir-vue-2&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;^0.2.0&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;&quot;laravel-elixir-webpack-official&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;^1.0.2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;を以下に変更します。
laravel-mix のバージョンは&lt;a href=&quot;https://github.com/JeffreyWay/laravel-mix&quot;&gt;本家&lt;/a&gt;のリリースを見たところ、v0.5.3 が最新でしたのでそちらを指定しました。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token property&quot;&gt;&quot;laravel-mix&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;^0.5.3&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;laravel/laravelリポジトリから package.jsonのscriptsセクションをコピー&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;ビルドツールがGulpからWebpackに変更となるためです。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token property&quot;&gt;&quot;scripts&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;&quot;dev&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;node node_modules/cross-env/bin/cross-env.js NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;&quot;watch&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;node node_modules/cross-env/bin/cross-env.js NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;&quot;hot&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;node node_modules/cross-env/bin/cross-env.js NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;&quot;production&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;node node_modules/cross-env/bin/cross-env.js NODE_ENV=production node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;コアコンポーネントのコピー&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Laravel Elixirの gulpfile.js に当たるファイルです。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;cp&lt;/span&gt; node_modules/laravel-mix/setup/webpack.mix.js &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;webpack.config.js を編集したい場合は node_modules/laravel-mix/setup からコピーします。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;cp&lt;/span&gt; node_modules/laravel-mix/setup/webpack.config.js &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;—config のファイルパスを調整すれば完了です。
&lt;a href=&quot;https://github.com/JeffreyWay/laravel-mix/blob/master/docs/installation.md&quot;&gt;マニュアル&lt;/a&gt;によると
webpack.config.js の配備は必須ではなく上級者用とのことなので、通常利用の場合は
webpack.mix.js だけコピーすれば問題無さそうです。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token property&quot;&gt;&quot;scripts&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;dev&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;node node_modules/cross-env/bin/cross-env.js NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=webpack.config.js&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;watch&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;node node_modules/cross-env/bin/cross-env.js NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --progress --hide-modules --config=webpack.config.js&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;hot&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;node node_modules/cross-env/bin/cross-env.js NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=webpack.config.js&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;production&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;node node_modules/cross-env/bin/cross-env.js NODE_ENV=production node_modules/webpack/bin/webpack.js --progress --hide-modules --config=webpack.config.js&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;パッケージインストール&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;まだ &lt;a href=&quot;https://github.com/JeffreyWay/laravel-mix/issues/82&quot;&gt;yarnではインストールできない&lt;/a&gt; とのことなので
npm install します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;以上です。&lt;/p&gt;
&lt;h3&gt;動作検証&lt;/h3&gt;
&lt;p&gt;ビルド用の対象ファイルがあることが前提ですが、
npm run dev を実行すると成功と表示されます。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;DONE Compiled successfully &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; 1649ms

Asset Size Chunks Chunk Names
dist/app.js &lt;span class=&quot;token number&quot;&gt;2.75&lt;/span&gt; kB &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;emitted&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; app
dist/app.css &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; bytes &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;emitted&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; app
mix-manifest.json &lt;span class=&quot;token number&quot;&gt;68&lt;/span&gt; bytes &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;emitted&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;終わりに&lt;/h3&gt;
&lt;p&gt;5.4もリリース直後ということで、もしかしたら同じように悩まれている方がいるかもしれないので、&lt;a href=&quot;https://twitter.com/localdisk&quot;&gt;@localdiskさん&lt;/a&gt;に教えて頂いた内容そのままですがブロク記事にまとめさせて頂きました。参考になれば幸いです。&lt;/p&gt;
&lt;h3&gt;参考&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://laravel.com/docs/5.4/upgrade&quot;&gt;Upgrade Guide - Laravel - The PHP Framework For Web Artisans&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/JeffreyWay/laravel-mix/blob/master/docs/installation.md&quot;&gt;laravel-mix/installation.md at master · JeffreyWay/laravel-mix&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[YAPC::Hokkaido2016で「Vue.jsによるWebアプリケーション開発」を発表してきました]]></title><description><![CDATA[YAPC::Hokkaido2016で「Vue.jsによるWeb…]]></description><link>https://blog.hypermkt.jp/2016/2016-12-15-vue-js-web-application-in-yapc-hokkaido/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2016/2016-12-15-vue-js-web-application-in-yapc-hokkaido/</guid><pubDate>Thu, 15 Dec 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;YAPC::Hokkaido2016で「Vue.jsによるWebアプリケーション開発」を発表してきました。&lt;/p&gt;
&lt;div style=&quot;left: 0; width: 100%; height: 0; position: relative; padding-bottom: 56.1972%;&quot;&gt;&lt;iframe src=&quot;https://speakerdeck.com/player/284455e250b3451386ce8d2c3671436f&quot; style=&quot;border: 0; top: 0; left: 0; width: 100%; height: 100%; position: absolute;&quot; allowfullscreen scrolling=&quot;no&quot; allow=&quot;encrypted-media&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;p&gt;多数の方々にご清聴いただき、かつ質問も頂きましてありがとうございました！これで今期９回目の発表も無事に終わりました。&lt;/p&gt;
&lt;p&gt;さて思い返すと今回は思い出深い旅となったので時系列に沿ってYAPC::Hokkaido2016を振り返りをします。&lt;/p&gt;
&lt;p&gt;##2016/12/09(金）北海道へ&lt;/p&gt;
&lt;p&gt;今回は会社でスポンサーをしていることもあり&lt;a href=&quot;https://twitter.com/june29&quot;&gt;@june29&lt;/a&gt; さん、
&lt;a href=&quot;https://twitter.com/mamipeko&quot;&gt;@mamipeko&lt;/a&gt;さん、自分の奥さんと４人で北海道に行きました。 新千歳空港から札幌市内へは電車で40分。電車から見える風景から想像以上の雪景色でテンション上がりまくりでした。札幌についたら既に積もっていてついはしゃいでしまった。埼玉県民は雪と海にめっぽう弱いです。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/blog/2016/2016-12-09-01.jpg&quot; alt=&quot;&quot;&gt;
夕食に入った居酒屋さんのイクラ丼が最高に美味しくて驚愕！ハラス、ホッケ、ラーメンサラダなどどれもめちゃくちゃ美味しかった！美味しいお店を紹介していただいてありがとうございます！！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/blog/2016/2016-12-09-02.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2&gt;2016/12/10(土）YAPC::Hokkaidoへ&lt;/h2&gt;
&lt;p&gt;東札幌駅を出たら膝まで雪が積もっており、スニーカーで来たことを後悔しました・・・。会場まで無事にたどり着けるのか不安を感じつつもどうにか札幌市産業振興センターに到着。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/blog/2016/2016-12-10-01.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;スピーカーグッズをもらってテンションマックスへ！こういうの欲しかったんです！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/blog/2016/2016-12-10-02.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;発表はつい癖で早口になってしまいましたが無事に終了。「React.jsを導入しようと検討しているか、Vue.jsとの違いは何か？」「APIとフロントは一緒にすべきか、分けるべきか」等質問も頂いて嬉しかったです。&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;ja&quot; dir=&quot;ltr&quot;&gt;バーチーさんだ！！！ &lt;a href=&quot;https://twitter.com/hashtag/yapcjapan?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#yapcjapan&lt;/a&gt; &lt;a href=&quot;https://twitter.com/hashtag/yapcjapanB?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#yapcjapanB&lt;/a&gt; &lt;a href=&quot;https://t.co/E0NSYm9yLF&quot;&gt;pic.twitter.com/E0NSYm9yLF&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jun OHWADA (@june29) &lt;a href=&quot;https://twitter.com/june29/status/807467808174940160?ref_src=twsrc%5Etfw&quot;&gt;December 10, 2016&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;p&gt;ま、明日になったら晴れてるでしょ！と軽い気持ちでその日は懇親会へ。&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;ja&quot; dir=&quot;ltr&quot;&gt;( ﾟдﾟ)&lt;a href=&quot;https://twitter.com/hashtag/yapcjapan?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#yapcjapan&lt;/a&gt; &lt;a href=&quot;https://t.co/XsaoLob6Zm&quot;&gt;pic.twitter.com/XsaoLob6Zm&lt;/a&gt;&lt;/p&gt;&amp;mdash; ◥◣◥◣あべんべん◢◤◢◤「フィンテックエンジニア養成読本」発売中 (@abenben) &lt;a href=&quot;https://twitter.com/abenben/status/807746789172342784?ref_src=twsrc%5Etfw&quot;&gt;December 11, 2016&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;h2&gt;2016/12/11(日）〜12(月）まさかの空港泊&lt;/h2&gt;
&lt;p&gt;帰りの飛行は19時だったので日中は二条市場、六花亭、旧札幌道庁を周り十分札幌を満喫しました。&lt;/p&gt;
&lt;p&gt;夕方になるにつれ吹雪だし電車が遅延するかもしれないと思い早めに新千歳空港に移動。予想通り電車遅延に・・・。新千歳空港に到着した後、次々と欠航する中、自分の便は幸いにも乗ることができ「なんだ帰れるじゃん！良かった〜」と安心しきっていたのですが、滑走路まで行ったはずなのに一向に離陸しない・・・。そして待機場まで引き返し吹雪のためしばらく待ちと告げられ待つこと二時間。機長から欠航しますとアナウンスがあり、料金返金と終電の時間が伝えられ、札幌市内に戻るか否かを悩みましたが奥さんと相談した結果、ホテルの予約も難しいので空港に泊まることにしました。（後から空港職員に聞いたのですが、普段は当然泊まることはできず航空会社各社同時に欠航しかつ大勢の人が帰宅困難になった場合のみ開放してくれるそうです。）&lt;/p&gt;
&lt;p&gt;最初はでこぼこのベンチの上で寝るのはきついな〜と思っていたのですが、空港から毛布、寝袋の提供があり、かつ空港内は暖房が効いて温かく、コンビニ、Wi-Fi、至る所に電源もあり思っていた以上に快適でした。この写真はうちの前線基地です。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/blog/2016/2016-12-10-03.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;翌朝には新千歳空港温泉にも行くことができ空港泊で溜まった疲れを落とすには最高でした。露天風呂から見えた欠航の原因となった雪もなんだか感慨深く見えます。ちなみに朝だと８００円で入れます！安い！&lt;/p&gt;
&lt;p&gt;その後は飛行機に乗れて無事に帰れました。良かった良かった・・・。家に帰るまでがYAPC。&lt;/p&gt;
&lt;p&gt;最後には空港泊というなかなか経験できない出来事もありましたが、北海道の料理も満喫し、YAPC::Hokkaidoにも登壇できて良かったです。また北海道に行きたいな〜！&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Vue.js componentでvue-router,vue-resourceを利用したメソッドのUnitTestを書く方法]]></title><description><![CDATA[始めに 最近vue-resource・vue-routerを使ったSPAウェブサービスを開発・運用しており、ふとそろそろUnit Test…]]></description><link>https://blog.hypermkt.jp/2016/2016-11-26-vue-js-component-unittesting/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2016/2016-11-26-vue-js-component-unittesting/</guid><pubDate>Sat, 26 Nov 2016 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;始めに&lt;/h2&gt;
&lt;p&gt;最近vue-resource・vue-routerを使ったSPAウェブサービスを開発・運用しており、ふとそろそろUnit Testを書いてみたいな〜と思い、ググってみたのですが思っていた以上に情報が見つからず・・・。ネット上で見つけたのは下記の３つのみ。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://vuejs.org/v2/guide/unit-testing.html&quot;&gt;公式サイトのUnit Testing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.slideshare.net/coulix/vuejs-testing?qid=cf224629-58db-4968-bc7b-6d3dfab85d58&amp;#x26;v=&amp;#x26;b=&amp;#x26;from_search=1&quot;&gt;Vuejs testingのスライド&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://qiita.com/edwardkenfox/items/a44dd04fb80c30c53aba&quot;&gt;Rails + Vue.jsなアプリケーションではじめてのフロントエンドのユニットテスト - Qiita&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;公式サイトを見ながら見よう見まねで書いてみたが、ハマりにハマってしまいもう無理だーとVue.jsコミュニティの方々に助けを求めました。皆さんから多数の提案を頂き、無事に解決しました。本当にありがとうございます！&lt;/p&gt;
&lt;p&gt;今回はVue.jsコミュニティの方々に教えて頂いた、Vue.js componentのUnitTestを書く方法をまとめます。&lt;/p&gt;
&lt;h2&gt;前提&lt;/h2&gt;
&lt;p&gt;下記ライブラリを使用します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Vue.js 2.0 + vue-resource + vue-router + vueify&lt;/li&gt;
&lt;li&gt;karma&lt;/li&gt;
&lt;li&gt;mocha&lt;/li&gt;
&lt;li&gt;chai&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;テストケース ３パターン&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;普通のコンポーネントメソッド&lt;/li&gt;
&lt;li&gt;vue-routerのパラメーターを利用したメソッドのテスト&lt;/li&gt;
&lt;li&gt;vue-resourceでAPI呼び出しをしているメソッドのテスト&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;テストについて&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Vue.jsの&lt;/li&gt;
&lt;li&gt;.vueのコンポーネントを対象とし、methods内のメソッドをテストします。&lt;/li&gt;
&lt;li&gt;一部省略していますが、&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/hypermkt/vuejs-samples/tree/master/vue-component-unittest&quot;&gt;こちら&lt;/a&gt;にサンプルコードが置いてありますのでこちらをご覧ください。&lt;/p&gt;
&lt;h3&gt;パターン１：普通のコンポーネントメソッド&lt;/h3&gt;
&lt;p&gt;まずは外部ライブラリ、リソースを全く利用しない一番シンプルな例です。下記のような
addという足し算メソッドがあったとします。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;methods&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;a&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; b&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; a &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; b&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;上記のメソッドのテストをする場合は以下のように記述します。ポイントは以下の通りです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;テスト対象のコンポーネントをimportします。（読み込み時にファイルパスは適度の調整してください。）&lt;/li&gt;
&lt;li&gt;コンポーネント内のメソッドへはmethodsを通じて呼び出すことができます。これはVueの基本仕様通りメソッドはmethods内にあるからです。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Test &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;../../../src/js/components/test.vue&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;describe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Testコンポーネント&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;it&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;足し算&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Test&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;methods&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;to&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;be&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;eql&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;また下記のようにすればメソッドの存在確認テストもできます。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Test &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;../../../src/js/components/test.vue&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;describe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Testコンポーネント&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;it&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;足し算&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Test&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;methods&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;add&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;to&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;be&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;function&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;ここまでは自分で出来ました。&lt;/p&gt;
&lt;h3&gt;パターン２：vue-routerのパラメーターを利用したメソッドのテスト&lt;/h3&gt;
&lt;p&gt;ここからは自分では解決できず、コミュニティの方の助言で解決しました。例えば下記のように vue-router のパラメーターを取得して文字列結合をするとします。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;methods&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;myName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;$route&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;params&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos; Taro&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;上記のメソッドのテストをする場合は以下のように記述します。ポイントは以下の通りです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://jp.vuejs.org/v2/api/#Vue-extend&quot;&gt;Vue.extend&lt;/a&gt;でサブクラスを作成し、テストケースの中でインスタンス化します&lt;/li&gt;
&lt;li&gt;またインスタンス化時に&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://jp.vuejs.org/v2/api/#beforeCreate&quot;&gt;beforeCreate&lt;/a&gt;でルーティングのパラメーターを設定することが出来、ルーティングされた体でテストを書くことが出来るようになります。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Vue &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;vue&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; _Test &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;../../../src/js/components/test.vue&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; Test &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Vue&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;_Test&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;describe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Testコンポーネント&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;it&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;vue-routerを利用した場合のテストケース&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; vm &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Test&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token function&quot;&gt;beforeCreate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;$route &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Yamada&apos;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;vm&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;myName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;to&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;be&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;eql&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Yamada Taro&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;パターン３：vue-resourceでAPI呼び出しをしているメソッドのテスト&lt;/h3&gt;
&lt;p&gt;今回一番悩んだのがこのテストケースでした。APIを利用してJSONで値を取得し、success時にデータオブジェクトのprofileを変更したい場合です。API呼び出しには &lt;a href=&quot;https://github.com/pagekit/vue-resource&quot;&gt;vue-resource&lt;/a&gt;のグローバル関数 Vue.http.get を利用していました。メソッドの返り値はPromiseとなり、非同期処理のテストってどうやるのか・・・。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;profile&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;methods&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;fetchProfile&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      Vue&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;http&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;http://localhost:8000/api/profile&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;success&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;profile &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;failure&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;ゴールのイメージとしては外部リソースであるAPIを実行しないようにモック化し、テスト対象のメソッド内で置き換えをすることです。&lt;/p&gt;
&lt;p&gt;今回は Vue.http.getとグローバル関数を呼ぶので、下記のように
&lt;a href=&quot;https://jp.vuejs.org/v2/guide/computed.html&quot;&gt;算出プロパティ&lt;/a&gt;を利用して
$Vueからテスト対象オブジェク自身を取得できるように調整します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;profile&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;computed&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;$Vue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; Vue&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;methods&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;fetchProfile&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      Vue&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;http&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;http://localhost:8000/api/profile&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;success&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;profile &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;failure&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;次にテストケースです。ポイントは以下の通りです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;まずテストケースの引数にdoneを指定します。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://mochajs.org/#asynchronous-code&quot;&gt;mochaの仕様&lt;/a&gt;でdone()の実行をもって非同期テストが終了したことをmochaに通知します。（通例的に
doneと命名されるそうです）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Vue.http.getでAPIを実際に呼び出さないようにモック化。getメソッドでPromiseの成功時にjson()メソッドがprofileのオブジェクトを返すように設定します。sinon等のモックライブラリを使わず、今回は仮の値を返す方式でも問題ありません。そしてテストケース2と同じ方式でコンポーネントをインスタンス化し、今回のテストケース用に設定した&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$Vueを通じて、Vueインスタンスのグローバル変数を上書きします。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;最後にテスト対象のメソッドを実行します。今回は非同期のテストにつき、そのままではPromiseの成功処理に入らないので、setTimeoutで擬似的に非同期にします。setTimeout内のdone()の実行をもって非同期テストが終了したことをmochaに通知され、モックで指定した通り&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Promise.resolveで成功処理に入りテストケースが通ります。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Vue &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;vue&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; _Test &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;../../../src/js/components/test.vue&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; Test &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Vue&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;_Test&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;describe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Testコンポーネント&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// ステップ１：引数のdoneを指定  &lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;it&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;vue-resourceを利用した場合&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;done&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; profile &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;nickname&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;hoge&apos;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// ステップ２：Vue.http.getをモック化&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; vm &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Test&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    vm&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;$Vue&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;http &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; Promise&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;resolve&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token function&quot;&gt;json&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; profile &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    
    &lt;span class=&quot;token comment&quot;&gt;// ステップ３：setTimeoutで非同期呼び出し&lt;/span&gt;
    vm&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;fetchProfile&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;setTimeout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;vm&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;profile&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;to&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;be&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;eql&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;profile&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      
      &lt;span class=&quot;token comment&quot;&gt;// mochaの非同期用テスト仕様で、done()が実行されるまでテストは実行されない。&lt;/span&gt;
      &lt;span class=&quot;token function&quot;&gt;done&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Special Thanks&lt;/h2&gt;
&lt;p&gt;今回はVue.jsコミュニティの下記の方々に１週間に渡って何度も助言頂きました。最後にはパッチまで準備して頂きありがとうございます！とても勉強になりました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/chi-bd&quot;&gt;@chi-bd&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://twitter.com/kitak&quot;&gt;@kitak&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://twitter.com/ktsn&quot;&gt;@ktsn&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;感想&lt;/h2&gt;
&lt;p&gt;普段からJavaScriptのテストコードを全く書いたことがなかったので、正直基本的な事から理解が出来ず苦労しました。ただVue.jsを通じてテストを書く機会が生まれて、この３パターンなら書けるようになりました。JavaScriptのテストコードコード楽しいですね〜。もっと書きたくなったぞー！&lt;/p&gt;</content:encoded></item><item><title><![CDATA[PHPカンファレンス2016で「PHPerのためのVue.js入門とVue.js2.0の未来」を話してきました]]></title><description><![CDATA[PHPカンファレンス2016に登壇し、「PHPerのためのVue.js入門とVue.js2.0の未来」について話してきました。発表資料はこちらです。 イベントドリブン型登壇は大変だが勉強になる！ 今思えば勢いでした。「PHPerのためのVue.js入門とVue.js2.…]]></description><link>https://blog.hypermkt.jp/2016/2016-11-05-php-confference-2016/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2016/2016-11-05-php-confference-2016/</guid><pubDate>Sat, 05 Nov 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;http://phpcon.php.gr.jp/2016/&quot;&gt;PHPカンファレンス2016&lt;/a&gt;に登壇し、「PHPerのためのVue.js入門とVue.js2.0の未来」について話してきました。発表資料はこちらです。&lt;/p&gt;
&lt;h2&gt;イベントドリブン型登壇は大変だが勉強になる！&lt;/h2&gt;
&lt;p&gt;今思えば勢いでした。「PHPerのためのVue.js入門とVue.js2.0の未来」というタイトルで応募しましたが、応募時点では2.0は未リリースだったので全く調べておらず、受かったら調べるか〜！という気持ちで応募しました。そしたら見事に受かったのでやるしかない！という気持ちになりました。思い返せば通勤電車の中でトーク採択メールを受信したときはめっちゃ嬉しかったな〜。&lt;/p&gt;
&lt;p&gt;メルカリのsotarokさんが応募してからネタを考えれば良いとPHPBLT#5で言ってましたが、さすがにタイトル無しでは応募できなかったので、未来の自分なら多分出来ているだろうと信じて応募しました。どうにか間に合って良かった・・・。&lt;/p&gt;
&lt;h2&gt;PHPカンファレンスは懇親会まで参加すべき！&lt;/h2&gt;
&lt;p&gt;初めて参加したんですが、とにかく楽しい！！数百人というPHPerが一同に集まり、うまい酒を飲みながら好き放題話せるのは最高！！ほとんど知らない人ですが前回ヤパチーで一緒にスタッフをした人や自分の発表を聞いてくれた人と会えたり、あと何人かに「ばーちーっていう面白いTシャツを着ているのでつい声かけちゃいました！」と言ってもらえてたのもすごい嬉しかったです！次回からは名刺もちゃんとたくさん持っていこう。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://www.instagram.com/p/BMWLWE7BcHG/&quot;&gt;Facebook開発者と！ #phpcon2016&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Makoto Chibaさん(@hypermkt)が投稿した写真 -
2016 11月 3 4:35午前 PDT&lt;/p&gt;
&lt;h2&gt;来年のPHPカンファレンス2017も登壇したい！&lt;/h2&gt;
&lt;p&gt;登壇を通じて沢山の人と知り合えたので来年も登壇したいです！今会社でやっているあれをネタに応募するぞ〜！来年の10月までなら終わっているはずだ！来年の自分を信じよう！（笑）&lt;/p&gt;
&lt;p&gt;さて次は予告通り北海道に行きます。YAPC::Hokkaidoに向けて頑張るぞ〜！&lt;/p&gt;</content:encoded></item><item><title><![CDATA[ISUCON6予選にチーム「Slow Queries」で参加しました]]></title><description><![CDATA[日曜参加でした。前の木金が会社の開発合宿ということもあり１日休暇日を挟んでの参戦となりました。 結果は23,181点でした。くやしいいいいいい！！ isucon_result##チーム「Slow Queries…]]></description><link>https://blog.hypermkt.jp/2016/2016-09-18-isucon6-slow-queries/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2016/2016-09-18-isucon6-slow-queries/</guid><pubDate>Sun, 18 Sep 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;日曜参加でした。前の木金が会社の開発合宿ということもあり１日休暇日を挟んでの参戦となりました。&lt;/p&gt;
&lt;p&gt;結果は23,181点でした。くやしいいいいいい！！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2016/09/isucon_result.png&quot; alt=&quot;isucon_result&quot;&gt;##チーム「Slow Queries」です&lt;/p&gt;
&lt;p&gt;インフラ担当１名（
&lt;a href=&quot;https://twitter.com/buty4649&quot;&gt;じっぱーさん&lt;/a&gt;）、アプリケーション担当２名(
&lt;a href=&quot;https://twitter.com/yuto_kyoku&quot;&gt;局長&lt;/a&gt;、
&lt;a href=&quot;https://twitter.com/hypermkt&quot;&gt;@hypermkt&lt;/a&gt;)、の計３名で参加しました。&lt;/p&gt;
&lt;h2&gt;当日に向けての準備&lt;/h2&gt;
&lt;p&gt;社内からも優勝者を出してほしいというあんちぽさんの願いのもと社内で模擬戦をしましょうということで社内ISUCONが実施されました。結果は追試時にサーバーの再起動に失敗し死亡で0点・・・。その後予選参加を決めた一部メンバーで週末に練習会を実施して2万点をどうにか出せるようになるも同僚に完敗・・・。&lt;/p&gt;
&lt;p&gt;この悔しさをバネに予選では！と意気込み臨んだISUCON6でした。&lt;/p&gt;
&lt;h2&gt;実施したこと&lt;/h2&gt;
&lt;p&gt;私達が実施できたのは以下の箇所です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;インデックス調整&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;isutarのisuda統合&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;select * をカラム指定&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Twigのキャッシュ利用&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;PHPセッションのRedis化&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;DBのSELECT結果をRedis保持&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;PHP-FPMをsocketにする&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Nginxチューニング&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;OPCache有効&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;最初に悩んだのはCHARACTER_LENGTH&lt;/h3&gt;
&lt;p&gt;主に自分が担当して解決できなかった箇所です。SELECTのORDER BY するときに都度文字数を計算していたんで、それをやめてentry.keyword_lengthカラムにキーワード登録時に文字数を登録し、
order by keyword_lengthにすれば高速化できるのでは？と睨んでいたのですがFAILとなってしまい対処できませんでした。今振り返ればこれ自体は大した問題ではなかったのかもしれません。&lt;/p&gt;
&lt;h3&gt;一番悩んだ箇所は htmlifyの正規表現&lt;/h3&gt;
&lt;p&gt;正直お手上げでした。キーワード数が増えればいつか破綻する実装になっておりどうにかしなくてはいけないのは分かっていたのですが解決方法が全く思いつきませんでした。チームメンバーからはmecabを利用し形態素解析をする案もでていたのですが、誰も実装経験はなく具体的な実装例まで考えられませんでした。今更ですが「PHP 自動リンク」と検索し実装例を見ていればまた違ったのかもしれませんが、なぜ検索すらしなかったのか・・・（泣）&lt;/p&gt;
&lt;h2&gt;Nginx + MySQL + Redis + PHP7 on Dockerのローカル開発環境が遂に出来た！&lt;/h2&gt;
&lt;p&gt;過去２回の練習時に毎回悩んでいたのがPHPのローカル開発環境の構築でした。毎回デプロイして本番サーバーで確認するのは手間なので各自の手元で開発できる環境がほしいと思っていましたが、Redisがうまくビルドできなかったりいろいろ躓いて構築できませんでした。&lt;/p&gt;
&lt;p&gt;今回は事前にNginx + MySQL + Redis + PHP7 on Dockerを用意し、当日状況に合わせて調整する予定でした。アプリケーション構成が複雑になっておりお昼過ぎまでかかりましたが無事にローカル開発環境が完成しました。そのおかげで修正・調査はとても快適になりました。じっぱーさんに圧倒的感謝です。&lt;/p&gt;
&lt;h2&gt;感想&lt;/h2&gt;
&lt;p&gt;自分への戒めとして恥を忍んで書くとアプリケーション担当としてあまり仕事が出来ていなかったと感じました。一部挙動が分からず読解に時間を要してしまったり、CHARACTER_LENGTHの箇所で時間を無駄に使ってしまったりとあまり得点に貢献できませんでした。短時間で既存の構成やライブラリの機能、オプション、仕様を把握するのも試されるコンテストであり、コードリーディングの読解力や発想が足りないという印象でした。&lt;/p&gt;
&lt;p&gt;ただマイナスなことばかり書いてしまうとあれなので、プラスの面も考えるとまずは予選に参加できて良かったです。少なくとも過去最高得点です！これは一重に
&lt;a href=&quot;https://twitter.com/tnmt&quot;&gt;@tnmtさん&lt;/a&gt;と
&lt;a href=&quot;https://twitter.com/pyama86&quot;&gt;@pyama86さん&lt;/a&gt;が社内ISUCONを実施してくれたおかげです。本当にありがとうございます。また唐突なお誘いにも関わらず一緒に参加してくれたチームメンバーにも感謝です！&lt;/p&gt;
&lt;p&gt;来年も必ず参加してこの悔しさを取り返すしか無い！！次こそはーーーーーーーー！！！！&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Vue.js + vueify + browserify + Babel でビルドする方法]]></title><description><![CDATA[概要 vueify利用時に
babel-coreをインストールするので、 ファイル内はES2015形式でも記述できるのですが、それ以外のファイルはES5形式で書く必要があります。一部だけ記法が違うのも気持ち悪かったので、他のJSファイル内でもES201…]]></description><link>https://blog.hypermkt.jp/2016/2016-09-10-vuejs_vueify_browserify_babel_build/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2016/2016-09-10-vuejs_vueify_browserify_babel_build/</guid><pubDate>Sat, 10 Sep 2016 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;概要&lt;/h2&gt;
&lt;p&gt;vueify利用時に
babel-coreをインストールするので、&lt;code class=&quot;language-text&quot;&gt;*.vue&lt;/code&gt; ファイル内はES2015形式でも記述できるのですが、それ以外のファイルはES5形式で書く必要があります。一部だけ記法が違うのも気持ち悪かったので、他のJSファイル内でもES2015形式で書けるようにする方法をまとめます。&lt;/p&gt;
&lt;h2&gt;用語説明&lt;/h2&gt;
&lt;h3&gt;ES2015&lt;/h3&gt;
&lt;p&gt;ES2015とはJavaScriptの仕様バージョンのことで極端に言えばPHP5などと同じようなものです。現行のほとんどのブラウザはES5と呼ばれるバージョンになっていますが、ES2015から新しい文法が使えるようになります。別名ES6とも呼ばれています。（この辺が紛らわしい）&lt;/p&gt;
&lt;h3&gt;vueify&lt;/h3&gt;
&lt;p&gt;Vue.jsのコンポーネントを &lt;code class=&quot;language-text&quot;&gt;*.vue&lt;/code&gt; ファイルに分割することができます。また一つの .vue ファイル内でcss/template/scriptの３つを管理することができ見通しが良くなります。&lt;/p&gt;
&lt;h3&gt;browserify&lt;/h3&gt;
&lt;p&gt;ブラウザ動作用に記述したJavaScriptコード内で require(‘modules’) が使えるようになります。&lt;/p&gt;
&lt;h3&gt;Babel&lt;/h3&gt;
&lt;p&gt;ES2015に対応したトランスコンパイラです。ES2015形式で書いたJavaScriptコードをES5に変換してくれます。&lt;/p&gt;
&lt;h2&gt;参考ソースコード&lt;/h2&gt;
&lt;p&gt;package.json&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;{
  &quot;scripts&quot;: {
    &quot;build&quot;: &quot;browserify -e main.js -o app.js&quot;
  },
  &quot;browserify&quot;: {
    &quot;transform&quot;: [
      &quot;vueify&quot;,
      &quot;babelify&quot;
      ]
  },
  &quot;devDependencies&quot;: {
    &quot;babel-core&quot;: &quot;^6.14.0&quot;,
    &quot;babel-plugin-transform-runtime&quot;: &quot;^6.15.0&quot;,
    &quot;babel-preset-es2015&quot;: &quot;^6.14.0&quot;,
    &quot;babel-runtime&quot;: &quot;^6.11.6&quot;,
    &quot;babelify&quot;: &quot;^7.3.0&quot;,
    &quot;browserify&quot;: &quot;^13.1.0&quot;,
    &quot;vue&quot;: &quot;^1.0.26&quot;,
    &quot;vueify&quot;: &quot;^8.7.0&quot;
  }
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;index.html&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token doctype&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;!&lt;/span&gt;&lt;span class=&quot;token doctype-tag&quot;&gt;DOCTYPE&lt;/span&gt; &lt;span class=&quot;token name&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;meta&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;charset&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;utf-8&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;app&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;common_header&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;common_header&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;hr&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
  {{ message }}
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;hr&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;common_footer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;common_footer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;app.js&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;main.js&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Vue &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;vue&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Header &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;./components/header.vue&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Footer &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;./components/footer.vue&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Vue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;el&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;#app&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;components&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// header, footerは予約後のため使えない&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;common_header&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Header&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;common_footer&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Footer&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Hello Vue.js&apos;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;components/heaeder.vue&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;lt;template&gt;
header
&amp;lt;/template&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;components/footer.vue&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;lt;template&gt;
footer
&amp;lt;/template&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;設定方法&lt;/h2&gt;
&lt;h3&gt;必要パッケージのインストール&lt;/h3&gt;
&lt;p&gt;まずは Vue.js + vueify + browserify + Babel でビルドするために必要なパッケージを全てインストールします。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;npm install\
    vue\
    vueify\
    babel-core\
    babel-present-es2015\
    babel-runtime\
    babel-plugin-transform-runtime\
    browserify\
    baberify\
    --save-dev&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;babel-core〜babel-runtime&lt;/p&gt;
&lt;p&gt;これらのパッケージは vueify インストール時の必要パッケージとして要求されます。これらをインストールすることで、 &lt;code class=&quot;language-text&quot;&gt;*.vue&lt;/code&gt; 内ではES2015でコードを書くことができます。&lt;/p&gt;
&lt;p&gt;babelify&lt;/p&gt;
&lt;p&gt;browserify でBabel変換するためのパッケージです。&lt;/p&gt;
&lt;h3&gt;browserify.transform項目&lt;/h3&gt;
&lt;p&gt;refs: &lt;a href=&quot;https://github.com/substack/browserify-handbook#browserifytransform-field&quot;&gt;https://github.com/substack/browserify-handbook#browserifytransform-field&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;package.json内でbrowserify.transform項目を記述することで、browserifyが実行された際に自動的にtransform設定を適用することができます。今回の場合ですと、
vueify と
babelily の２つを同時に適用したので下記のように記述します。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token string-property property&quot;&gt;&quot;browserify&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&quot;transform&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
      &lt;span class=&quot;token string&quot;&gt;&quot;vueify&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string&quot;&gt;&quot;babelify&quot;&lt;/span&gt;
     &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;.babelrc&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;{
  &quot;presets&quot;: [&quot;es2015&quot;],
  &quot;plugins&quot;: [
    &quot;transform-runtime&quot;
  ]
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;presets&lt;/p&gt;
&lt;p&gt;babelで変換するバージョンを指定します&lt;/p&gt;
&lt;p&gt;transform-runtime&lt;/p&gt;
&lt;p&gt;babel-plugin-transform-runtime をインストールすると利用できるようになるbabel用プラグイン。似たようなものに
babel-polyfill があるらしいがグローバル汚染するのことでこちらを利用するのがいいらしい。babel変換するのに必要。&lt;/p&gt;
&lt;p&gt;参考 :
&lt;a href=&quot;http://qiita.com/inuscript/items/d2a9d5d4daedaacff924&quot;&gt;babel-polyfillとbabel-runtimeの使い分けに迷ったので調べた - Qiita&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;ビルド&lt;/h2&gt;
&lt;p&gt;package.json の scripts で build を宣言しているので下記で実行できます。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;npm run build&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;結果、下記のように表示されれば成功です。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/vuejs_babelify.png&quot; alt=&quot;vuejs_babelify&quot;&gt;&lt;/p&gt;
&lt;p&gt;本件のソースコードは&lt;a href=&quot;https://github.com/hypermkt/vuejs-samples/tree/master/vueify-babel-build&quot;&gt;こちら&lt;/a&gt;に置いてあります。&lt;/p&gt;
&lt;h2&gt;感想&lt;/h2&gt;
&lt;p&gt;正直随分ハマりましたが、これでES2015でコードが書けるようになって幸せです。（といいつつも全く書けません。勉強中です。）&lt;/p&gt;</content:encoded></item><item><title><![CDATA[素のEl CapitanにPHP 5.6.0をインストールする方法]]></title><description><![CDATA[素のMac OSX El CapitanにPHP 5.6.0をインストール機会があったので手順をまとめます。予想通りいろいろつまづきまして・・・。##準備 Xcode Command Line tool gitコマンドを利用するために必要です $ xcode-select…]]></description><link>https://blog.hypermkt.jp/2016/2016-08-28-installing-php5-6-0-by-phpenv-on-el-capitan/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2016/2016-08-28-installing-php5-6-0-by-phpenv-on-el-capitan/</guid><pubDate>Sun, 28 Aug 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;素のMac OSX El CapitanにPHP 5.6.0をインストール機会があったので手順をまとめます。予想通りいろいろつまづきまして・・・。##準備&lt;/p&gt;
&lt;h3&gt;Xcode Command Line tool&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;gitコマンドを利用するために必要です&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$ xcode-select —install&lt;/p&gt;
&lt;h3&gt;Brew&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;PHPビルド時に必要な各種パッケージをインストールするために必要です&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$ /usr/bin/ruby -e ”$(curl -fsSL &lt;a href=&quot;https://raw.githubusercontent.com/Homebrew/install/master/install&quot;&gt;https://raw.githubusercontent.com/Homebrew/install/master/install&lt;/a&gt;)”&lt;/p&gt;
&lt;h3&gt;phpenv, php-build&lt;/h3&gt;
&lt;p&gt;PHPのビルド＆インストールに必要です&lt;/p&gt;
&lt;p&gt;$ git clone &lt;a href=&quot;https://github.com/CHH/phpenv.git&quot;&gt;https://github.com/CHH/phpenv.git&lt;/a&gt;
$ phpenv/bin/phpenv-install.sh&lt;/p&gt;
&lt;p&gt;以下を
~/.bash_profileに追記&lt;/p&gt;
&lt;p&gt;export PATH=“$HOME/.phpenv/bin:$PATH”
eval ”$(phpenv init -)”&lt;/p&gt;
&lt;p&gt;~/.bash_profileを再読み込み&lt;/p&gt;
&lt;p&gt;$ source ~/.bash_profile&lt;/p&gt;
&lt;h2&gt;php5.6.0のインストール&lt;/h2&gt;
&lt;p&gt;実行するコマンドはこれだけなのですが、この後いろんなエラーが出てインストールに失敗します。エラーの内容ごとに解決方法を追記します。&lt;/p&gt;
&lt;p&gt;$ phpenv install 5.6.0&lt;/p&gt;
&lt;h3&gt;bisonバージョン問題&lt;/h3&gt;
&lt;p&gt;configure:5267: WARNING: This bison version is not supported for regeneration of the Zend/PHP parsers (found: 2.3, min: 204, excluded: 3.0).&lt;/p&gt;
&lt;p&gt;El Capitanにインストールされているbisonが
2.3と古いため起きる問題です。
2.7以上が必要な為下記コマンドを実行してインストールします。&lt;/p&gt;
&lt;p&gt;$ brew tap homebrew/versions
$ brew install bison27
$ brew link bison27 —force&lt;/p&gt;
&lt;p&gt;参考：
&lt;a href=&quot;http://blog.sarabande.jp/post/53780323365&quot;&gt;homebrew で標準のバージョンよりも古い bison をインストールする - Sarabande.jp&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;またそのままだと2.3側を利用してconfigureしてしまうので下記ファイルの冒頭に
YACC=/usr/local/opt/bison27/bin/bison を追記することで
2.7 のbisonを利用するように指定します。&lt;/p&gt;
&lt;p&gt;~/.phpenv/plugins/php-build/share/php-build/default_configure_options&lt;/p&gt;
&lt;p&gt;参考：
&lt;a href=&quot;http://uzulla.hateblo.jp/entry/2013/12/29/165752&quot;&gt;phpenvでphp5.5.7とかビルドするとbisonとかでおこなので、brewでどうにかするつもりが結局bison27のFormulaかく羽目になったやつ - uzullaがブログ&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;OpenSSL問題&lt;/h3&gt;
&lt;p&gt;configure: error: Cannot find OpenSSL’s &amp;#x3C;evp.h&gt;&lt;/p&gt;
&lt;p&gt;素のEl Capitanではopensslがインストールされていないため発生します。必要パッケージをインストールします。&lt;/p&gt;
&lt;p&gt;$ brew install openssl
$ brew install libxml2
$ brew link openssl —force
$ brew link libxml2 —-force&lt;/p&gt;
&lt;p&gt;が下記のようにlinkに失敗します。&lt;/p&gt;
&lt;p&gt;$ brew link openssl —force
Warning: Refusing to link: openssl
Linking keg-only openssl means you may end up linking against the insecure,
deprecated system OpenSSL while using the headers from Homebrew’s openssl.
Instead, pass the full include/library paths to your compiler e.g.:
-I/usr/local/opt/openssl/include -L/usr/local/opt/openssl/lib&lt;/p&gt;
&lt;p&gt;コンパイル時にパスを渡せばビルドすれば解決します。&lt;/p&gt;
&lt;p&gt;$ PHP_BUILD_CONFIGURE_OPTS=“—with-openssl=$(brew —prefix openssl) —with-libxml-dir=$(brew —prefix libxml2)” phpenv install 5.6.0&lt;/p&gt;
&lt;h3&gt;パッケージ不足&lt;/h3&gt;
&lt;p&gt;configure: WARNING: You will need re2c 0.13.4 or later if you want to regenerate PHP parsers.
これは単純に
re2c がないとの事なのでインストールすれば解決。&lt;/p&gt;
&lt;p&gt;$ brew install re2c&lt;/p&gt;
&lt;h1&gt;configure: error: jpeglib.h not found.&lt;/h1&gt;
&lt;h1&gt;configure: error: png.h not found.&lt;/h1&gt;
&lt;h1&gt;configure: error: mcrypt.h not found. Please reinstall libmcrypt.&lt;/h1&gt;
&lt;p&gt;こちらも同様に下記をインストールして解決。&lt;/p&gt;
&lt;p&gt;$ brew install libjpeg
$ brew install limping
$ brew install libmcrypt&lt;/p&gt;
&lt;p&gt;参考：
&lt;a href=&quot;http://qiita.com/tebonz/items/82ad7e57066650d43b28&quot;&gt;Homebrewでphp-build及びphpenvインストール後に5.5系をインストールするための手順 - Qiita&lt;/a&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;次のエラーは長いので
&lt;a href=&quot;https://gist.github.com/hypermkt/e4a60fc93f733a48ee2157f6e23b2a73&quot;&gt;gist&lt;/a&gt;で&lt;/p&gt;
&lt;p&gt;参考：
&lt;a href=&quot;http://qiita.com/omega999/items/c5b1c177331f8d342efd&quot;&gt;phpenv+php-build環境によるphpバージョン管理&lt;del&gt;Mac（Yosemite）編&lt;/del&gt; - Qiita&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;エラーログを眺めるとmacro周りでwarningが発生している。ここからconfigureが正常に実行できないことが分かりautoconf, automakeが推測できるとのこと（友人談）。またEl Capitanには初期ではそれらが未インストール状態につき、ビルドに失敗する。なるほど・・・。&lt;/p&gt;
&lt;p&gt;$ brew install autoconf
$ brew install automake&lt;/p&gt;
&lt;p&gt;これでビルドが通ります。&lt;/p&gt;
&lt;h2&gt;PHP 5.6.0への切り替え&lt;/h2&gt;
&lt;p&gt;下記でEl Capitanに標準でインストールされているPHP 5.5からPHP 5.6.0に切り替えができます。&lt;/p&gt;
&lt;p&gt;$ phpenv versions
$ phpenv global 5.6.0
$ phpenv rehash&lt;/p&gt;
&lt;p&gt;いや〜。なかなかしんどかった・・・。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[CentOS5にPercona Tool Kitをインストールする方法]]></title><description><![CDATA[約5,000万件のテーブルにインデックスを張らなくてはいけなくなりました。明らかに時間がかかることが明白でしたので、Percona Tool Kitの pt-online-schema-change…]]></description><link>https://blog.hypermkt.jp/2016/2016-08-20-how-to-install-percona-tool-kit-for-centos5/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2016/2016-08-20-how-to-install-percona-tool-kit-for-centos5/</guid><pubDate>Sat, 20 Aug 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;約5,000万件のテーブルにインデックスを張らなくてはいけなくなりました。明らかに時間がかかることが明白でしたので、Percona Tool Kitの pt-online-schema-change を使うことにしました。これを使うことで安全かつ高速にインデックス追加ができるようになります。今回はCentOS5にPercona Tool Kitをインストールする方法をまとめます。(なんで今さらCentOS5なの？ということはスルーして下さい・・・)##pt-olnine-schema-change とは&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.percona.com/&quot;&gt;Percona社&lt;/a&gt; が提供しているMySQL用の便利ツール集
&lt;a href=&quot;https://www.percona.com/software/mysql-tools/percona-toolkit&quot;&gt;Percona Tool Kit&lt;/a&gt;の一つです。pt-online-schema-changeを利用することでサービスを無停止でカラム、インデックス追加等の操作が実行できます。詳しくは
&lt;a href=&quot;http://d.hatena.ne.jp/fat47/20140418/1397811745&quot;&gt;こちら&lt;/a&gt; をご覧ください。図付きの解説が分かりやすくまとまっています。&lt;/p&gt;
&lt;h2&gt;インストール方法&lt;/h2&gt;
&lt;p&gt;英語ですが手順は
&lt;a href=&quot;https://www.percona.com/doc/percona-server/5.5/installation/yum_repo.html&quot;&gt;本家のサイト&lt;/a&gt;にまとまっています。それを参考にインストールを進めます。&lt;/p&gt;
&lt;h3&gt;Percona Yum Repositoryのインストール&lt;/h3&gt;
&lt;p&gt;まずはpercona-release-0.1-3.noarch.rpmをダウンロードします。CentOS5ではリモートのyumを直接インストールすることが出来ないのでwgetする必要があります。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;[root@www ~]# wget http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm
--2016-08-20 18:58:37-- http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm
Resolving www.percona.com... 74.121.199.234
Connecting to www.percona.com|74.121.199.234|:80... connected.
HTTP request sent, awaiting response... 301 Moved Permanently
Location: https://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm [following]
--2016-08-20 18:58:38-- https://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm
Connecting to www.percona.com|74.121.199.234|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 6566 (6.4K) [application/x-redhat-package-manager]
Saving to: `percona-release-0.1-3.noarch.rpm&apos;

100%[===========================================================================================================================================&amp;amp;gt;] 6,566 --.-K/s in 0s

2016-08-20 18:58:39 (88.2 MB/s) - `percona-release-0.1-3.noarch.rpm&apos; saved [6566/6566]&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;ダウンロードしたらrpmコマンドでインストールします。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;[root@www ~]# ll
total 56
-rw------- 1 root root 1126 Aug 31 2012 anaconda-ks.cfg
-rw-r--r-- 1 root root 23614 Aug 31 2012 install.log
-rw-r--r-- 1 root root 3536 Aug 31 2012 install.log.syslog
-rw-rw-r-- 1 root root 6566 Sep 22 2014 percona-release-0.1-3.noarch.rpm
[root@www ~]# rpm -ivh percona-release-0.1-3.noarch.rpm
warning: percona-release-0.1-3.noarch.rpm: Header V4 DSA signature: NOKEY, key ID cd2efd2a
Preparing... ### ### ### ### ### ### ### ### ### ### ### ### ### ### # [100%]
1:percona-release ### ### ### ### ### ### ### ### ### ### ### ### ### ### # [100%]&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;これで完了。&lt;/p&gt;
&lt;h3&gt;Perlcona Tool Kitのインストール&lt;/h3&gt;
&lt;p&gt;このようにインストール可能な状態となります。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;[root@www ~]# yum list | grep percona
percona-release.noarch 0.1-3 installed
Percona-SQL-50-debuginfo.x86_64 5.0.92-b23.89.rhel5 percona-release-x86_64
Percona-SQL-client-50.x86_64 5.0.92-b23.89.rhel5 percona-release-x86_64
Percona-SQL-devel-50.x86_64 5.0.92-b23.89.rhel5 percona-release-x86_64
Percona-SQL-server-50.x86_64 5.0.92-b23.89.rhel5 percona-release-x86_64
Percona-SQL-shared-50.x86_64 5.0.92-b23.89.rhel5 percona-release-x86_64
Percona-SQL-shared-compat.x86_64 5.0.92-b23.85.rhel5 percona-release-x86_64
Percona-SQL-test-50.x86_64 5.0.92-b23.89.rhel5 percona-release-x86_64
Percona-Server-51-debuginfo.x86_64 5.1.73-rel14.12.624.rhel5 percona-release-x86_64
Percona-Server-55-debuginfo.x86_64 5.5.51-rel38.1.el5 percona-release-x86_64
Percona-Server-56-debuginfo.x86_64 5.6.31-rel77.0.el5 percona-release-x86_64
Percona-Server-MongoDB.x86_64 3.0.12-1.8.el5 percona-release-x86_64
Percona-Server-MongoDB-32.x86_64 3.2.8-2.0.el5 percona-release-x86_64
3.2.8-2.0.el5 percona-release-x86_64
Percona-Server-MongoDB-32-mongos.x86_64 3.2.8-2.0.el5 percona-release-x86_64
Percona-Server-MongoDB-32-server.x86_64 3.2.8-2.0.el5 percona-release-x86_64
Percona-Server-MongoDB-32-shell.x86_64 3.2.8-2.0.el5 percona-release-x86_64
Percona-Server-MongoDB-32-tools.x86_64 3.2.8-2.0.el5 percona-release-x86_64
Percona-Server-MongoDB-debuginfo.x86_64 3.0.12-1.8.el5 percona-release-x86_64
Percona-Server-MongoDB-mongos.x86_64 3.0.12-1.8.el5 percona-release-x86_64
Percona-Server-MongoDB-server.x86_64 3.0.12-1.8.el5 percona-release-x86_64
Percona-Server-MongoDB-shell.x86_64 3.0.12-1.8.el5 percona-release-x86_64
Percona-Server-MongoDB-tools.x86_64 3.0.12-1.8.el5 percona-release-x86_64
Percona-Server-client-51.x86_64 5.1.73-rel14.12.624.rhel5 percona-release-x86_64
Percona-Server-client-55.x86_64 5.5.51-rel38.1.el5 percona-release-x86_64
Percona-Server-client-56.x86_64 5.6.31-rel77.0.el5 percona-release-x86_64
Percona-Server-devel-51.x86_64 5.1.73-rel14.12.624.rhel5 percona-release-x86_64
Percona-Server-devel-55.x86_64 5.5.51-rel38.1.el5 percona-release-x86_64
Percona-Server-devel-56.x86_64 5.6.31-rel77.0.el5 percona-release-x86_64
Percona-Server-server-51.x86_64 5.1.73-rel14.12.624.rhel5 percona-release-x86_64
Percona-Server-server-55.x86_64 5.5.51-rel38.1.el5 percona-release-x86_64
Percona-Server-server-56.x86_64 5.6.31-rel77.0.el5 percona-release-x86_64
Percona-Server-shared-51.x86_64 5.1.73-rel14.12.624.rhel5 percona-release-x86_64
Percona-Server-shared-55.x86_64 5.5.51-rel38.1.el5 percona-release-x86_64
Percona-Server-shared-56.x86_64 5.6.31-rel77.0.el5 percona-release-x86_64
Percona-Server-shared-compat.x86_64 5.1.68-rel14.6.551.rhel5 percona-release-x86_64
Percona-Server-shared-compat-51.x86_64 5.1.73-rel14.12.624.rhel5 percona-release-x86_64
Percona-Server-test-51.x86_64 5.1.73-rel14.12.624.rhel5 percona-release-x86_64
Percona-Server-test-55.x86_64 5.5.51-rel38.1.el5 percona-release-x86_64
Percona-Server-test-56.x86_64 5.6.31-rel77.0.el5 percona-release-x86_64
Percona-Server-tokudb-56.x86_64 5.6.31-rel77.0.el5 percona-release-x86_64
Percona-XtraDB-Cluster-55.x86_64 1:5.5.41-25.11.853.el5 percona-release-x86_64
1:5.5.41-25.11.853.el5 percona-release-x86_64
Percona-XtraDB-Cluster-56.x86_64 1:5.6.30-25.16.1.el5 percona-release-x86_64
1:5.6.30-25.16.1.el5 percona-release-x86_64
Percona-XtraDB-Cluster-client.x86_64 1:5.5.34-23.7.6.565.rhel5 percona-release-x86_64
Percona-XtraDB-Cluster-client-55.x86_64 1:5.5.41-25.11.853.el5 percona-release-x86_64
Percona-XtraDB-Cluster-client-56.x86_64 1:5.6.30-25.16.1.el5 percona-release-x86_64
Percona-XtraDB-Cluster-debuginfo.x86_64 1:5.5.34-23.7.6.565.rhel5 percona-release-x86_64
Percona-XtraDB-Cluster-devel.x86_64 1:5.5.34-23.7.6.565.rhel5 percona-release-x86_64
Percona-XtraDB-Cluster-devel-55.x86_64 1:5.5.41-25.11.853.el5 percona-release-x86_64
Percona-XtraDB-Cluster-devel-56.x86_64 1:5.6.30-25.16.1.el5 percona-release-x86_64
Percona-XtraDB-Cluster-full-55.x86_64 1:5.5.41-25.11.853.el5 percona-release-x86_64
Percona-XtraDB-Cluster-full-56.x86_64 1:5.6.30-25.16.1.el5 percona-release-x86_64
Percona-XtraDB-Cluster-galera.x86_64 2.8-1.162.rhel5 percona-release-x86_64
Percona-XtraDB-Cluster-galera-2.x86_64 2.12-1.2682.rhel5 percona-release-x86_64
2.12-1.2682.rhel5 percona-release-x86_64
Percona-XtraDB-Cluster-galera-3.x86_64 3.16-1.rhel5 percona-release-x86_64
3.16-1.rhel5 percona-release-x86_64
Percona-XtraDB-Cluster-galera-56.x86_64 3.1-1.169.rhel5 percona-release-x86_64
3.1-1.169.rhel5 percona-release-x86_64
2.8-1.162.rhel5 percona-release-x86_64
Percona-XtraDB-Cluster-garbd-2.x86_64 2.12-1.2682.rhel5 percona-release-x86_64
Percona-XtraDB-Cluster-garbd-3.x86_64 3.16-1.rhel5 percona-release-x86_64
Percona-XtraDB-Cluster-server.x86_64 1:5.5.34-23.7.6.565.rhel5 percona-release-x86_64
Percona-XtraDB-Cluster-server-55.x86_64 1:5.5.41-25.11.853.el5 percona-release-x86_64
Percona-XtraDB-Cluster-server-56.x86_64 1:5.6.30-25.16.1.el5 percona-release-x86_64
Percona-XtraDB-Cluster-shared.x86_64 1:5.5.34-23.7.6.565.rhel5 percona-release-x86_64
Percona-XtraDB-Cluster-shared-55.x86_64 1:5.5.41-25.11.853.el5 percona-release-x86_64
Percona-XtraDB-Cluster-shared-56.x86_64 1:5.6.30-25.16.1.el5 percona-release-x86_64
Percona-XtraDB-Cluster-test.x86_64 1:5.5.34-23.7.6.565.rhel5 percona-release-x86_64
Percona-XtraDB-Cluster-test-55.x86_64 1:5.5.41-25.11.853.el5 percona-release-x86_64
Percona-XtraDB-Cluster-test-56.x86_64 1:5.6.30-25.16.1.el5 percona-release-x86_64
jemalloc.x86_64 3.6.0-2.el5 percona-release-x86_64
jemalloc-devel.x86_64 3.6.0-2.el5 percona-release-x86_64
libev.x86_64 4.15-1.el5.rf percona-release-x86_64
libev-devel.x86_64 4.15-1.el5.rf percona-release-x86_64
libtokumx-enterprise.x86_64 2.0.2-1.el5 percona-release-x86_64
libtokumx-enterprise-devel.x86_64 2.0.2-1.el5 percona-release-x86_64
percona-cacti-templates.noarch 1.1.6-1 percona-release-noarch
percona-nagios-plugins.noarch 1.1.6-1 percona-release-noarch
percona-playback.x86_64 0.7-2.el5.centos percona-release-x86_64
percona-playback-debuginfo.x86_64 0.7-2.el5.centos percona-release-x86_64
percona-playback-devel.x86_64 0.7-2.el5.centos percona-release-x86_64
percona-toolkit.noarch 2.2.19-1 percona-release-noarch
percona-xtrabackup.x86_64 2.3.5-1.el5 percona-release-x86_64
percona-xtrabackup-20.x86_64 2.0.8-587.rhel5 percona-release-x86_64
percona-xtrabackup-20-debuginfo.x86_64 2.0.8-587.rhel5 percona-release-x86_64
percona-xtrabackup-20-test.x86_64 2.0.8-587.rhel5 percona-release-x86_64
percona-xtrabackup-21.x86_64 2.1.9-746.rhel5 percona-release-x86_64
percona-xtrabackup-21-debuginfo.x86_64 2.1.9-746.rhel5 percona-release-x86_64
percona-xtrabackup-22.x86_64 2.2.13-1.el5 percona-release-x86_64
percona-xtrabackup-22-debuginfo.x86_64 2.2.13-1.el5 percona-release-x86_64
percona-xtrabackup-24.x86_64 2.4.4-1.el5 percona-release-x86_64
percona-xtrabackup-24-debuginfo.x86_64 2.4.4-1.el5 percona-release-x86_64
percona-xtrabackup-debuginfo.x86_64 2.3.5-1.el5 percona-release-x86_64
percona-xtrabackup-test.x86_64 2.3.5-1.el5 percona-release-x86_64
percona-xtrabackup-test-21.x86_64 2.1.9-746.rhel5 percona-release-x86_64
percona-xtrabackup-test-22.x86_64 2.2.13-1.el5 percona-release-x86_64
percona-xtrabackup-test-24.x86_64 2.4.4-1.el5 percona-release-x86_64
percona-zabbix-templates.noarch 1.1.6-1 percona-release-noarch
qpress.x86_64 11-1.el5.centos percona-release-x86_64
qpress-debuginfo.x86_64 11-1.el5.centos percona-release-x86_64
sysbench.x86_64 0.5-6.el5 percona-release-x86_64
sysbench-debuginfo.x86_64 0.5-6.el5 percona-release-x86_64
tokumx-enterprise.x86_64 2.0.2-1.el5 percona-release-x86_64
tokumx-enterprise-common.x86_64 2.0.2-1.el5 percona-release-x86_64
tokumx-enterprise-server.x86_64 2.0.2-1.el5 percona-release-x86_64&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;必要なのは Percona Tool Kit だけなので、それだけをインストールします。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;[root@www ~]# yum install percona-toolkit.noarch
Loaded plugins: fastestmirror, security
Loading mirror speeds from cached hostfile
*   base: mirror.fairway.ne.jp
*   extras: mirror.nus.edu.sg
*   rpmforge: mirror.oscc.org.my
*   updates: centos.usonyx.net
Setting up Install Process
Resolving Dependencies
--&amp;amp;gt; Running transaction check
---&amp;amp;gt; Package percona-toolkit.noarch 0:2.2.19-1 set to be updated
--&amp;amp;gt; Processing Dependency: perl(DBD::mysql) &amp;amp;gt;= 1.0 for package: percona-toolkit
--&amp;amp;gt; Processing Dependency: perl(Term::ReadKey) for package: percona-toolkit
--&amp;amp;gt; Processing Dependency: perl(IO::Socket::SSL) for package: percona-toolkit
--&amp;amp;gt; Running transaction check
---&amp;amp;gt; Package perl-DBD-MySQL.x86_64 0:3.0007-2.el5 set to be updated
--&amp;amp;gt; Processing Dependency: libmysqlclient.so.15(libmysqlclient_15)(64bit) for package: perl-DBD-MySQL
--&amp;amp;gt; Processing Dependency: libmysqlclient.so.15()(64bit) for package: perl-DBD-MySQL
---&amp;amp;gt; Package perl-IO-Socket-SSL.noarch 0:1.01-2.el5 set to be updated
--&amp;amp;gt; Processing Dependency: perl(Net::SSLeay) &amp;amp;gt;= 1.21 for package: perl-IO-Socket-SSL
---&amp;amp;gt; Package perl-TermReadKey.x86_64 0:2.30-3.el5.rf set to be updated
--&amp;amp;gt; Running transaction check
---&amp;amp;gt; Package mysql.x86_64 0:5.0.95-5.el5_9 set to be updated
---&amp;amp;gt; Package perl-Net-SSLeay.x86_64 0:1.30-4.fc6 set to be updated
--&amp;amp;gt; Finished Dependency Resolution

Dependencies Resolved

=====================================================================================================================================================================================
Package Arch Version Repository Size
=====================================================================================================================================================================================
Installing:
percona-toolkit noarch 2.2.19-1 percona-release-noarch 1.7 M
Installing for dependencies:
mysql x86_64 5.0.95-5.el5_9 base 4.9 M
perl-DBD-MySQL x86_64 3.0007-2.el5 base 148 k
perl-IO-Socket-SSL noarch 1.01-2.el5 base 50 k
perl-Net-SSLeay x86_64 1.30-4.fc6 base 192 k
perl-TermReadKey x86_64 2.30-3.el5.rf rpmforge 57 k

Transaction Summary
=====================================================================================================================================================================================
Install 6 Package(s)
Upgrade 0 Package(s)

Total download size: 7.0 M
Is this ok [y/N]: y
Downloading Packages:
(1/6): perl-IO-Socket-SSL-1.01-2.el5.noarch.rpm | 50 kB 00:00
(2/6): perl-TermReadKey-2.30-3.el5.rf.x86_64.rpm | 57 kB 00:00
(3/6): perl-DBD-MySQL-3.0007-2.el5.x86_64.rpm | 148 kB 00:00
(4/6): perl-Net-SSLeay-1.30-4.fc6.x86_64.rpm | 192 kB 00:00
(5/6): percona-toolkit-2.2.19-1.noarch.rpm | 1.7 MB 00:01
(6/6): mysql-5.0.95-5.el5_9.x86_64.rpm | 4.9 MB 00:28
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Total 209 kB/s | 7.0 MB 00:34
warning: rpmts_HdrFromFdno: Header V4 DSA signature: NOKEY, key ID cd2efd2a
percona-release-noarch/gpgkey | 1.7 kB 00:00
Importing GPG key 0xCD2EFD2A &quot;Percona MySQL Development Team &amp;amp;lt;mysql-dev@percona.com&amp;amp;gt;&quot; from /etc/pki/rpm-gpg/RPM-GPG-KEY-Percona
Is this ok [y/N]: y
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
Installing : perl-TermReadKey 1/6
Installing : perl-Net-SSLeay 2/6
Installing : mysql 3/6
Installing : perl-DBD-MySQL 4/6
Installing : perl-IO-Socket-SSL 5/6
Installing : percona-toolkit 6/6

Installed:
percona-toolkit.noarch 0:2.2.19-1

Dependency Installed:
mysql.x86_64 0:5.0.95-5.el5_9 perl-DBD-MySQL.x86_64 0:3.0007-2.el5 perl-IO-Socket-SSL.noarch 0:1.01-2.el5 perl-Net-SSLeay.x86_64 0:1.30-4.fc6
perl-TermReadKey.x86_64 0:2.30-3.el5.rf

Complete!&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;これでインストール完了です。コマンドを叩くと使えるようになっているのが分かります。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;[root@www ~]# pt-online-schema-change
Usage: pt-online-schema-change [OPTIONS] DSN

Errors in command-line arguments:
*   A DSN must be specified
*   The DSN must specify a database (D) and a table (t)

pt-online-schema-change alters a table&apos;s structure without blocking reads or
writes. Specify the database and table in the DSN. Do not use this tool before
reading its documentation and checking your backups carefully. For more
details, please use the --help option, or try &apos;perldoc
/usr/bin/pt-online-schema-change&apos; for complete documentation.&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;実際 pt-online-schema-changeしか使ったこと無いので他のコマンドを試してみたいですね。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[ssh port forwardingの使い方]]></title><description><![CDATA[ssh port forwarding (ポートフォワーディング)とは ssh tunnel 別名sshトンネルとも呼ばれており、sshによって確立された通信経路を利用して、クライアントの3307ポートとリモートの330…]]></description><link>https://blog.hypermkt.jp/2016/2016-07-17-ssh-portforawarding/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2016/2016-07-17-ssh-portforawarding/</guid><pubDate>Sun, 17 Jul 2016 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;ssh port forwarding (ポートフォワーディング)とは&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2016/07/ssh-tunnel.png&quot; alt=&quot;ssh tunnel&quot;&gt;&lt;/p&gt;
&lt;p&gt;別名sshトンネルとも呼ばれており、sshによって確立された通信経路を利用して、クライアントの3307ポートとリモートの3306ポートをマッピングします。&lt;/p&gt;
&lt;p&gt;つまりこのポートフォワーディングが接続されている間は3307番に接続すると、リモートサーバーの3306番に接続されます。&lt;/p&gt;
&lt;p&gt;しかもssh接続なのでその間の通信は暗号化もされています。&lt;/p&gt;
&lt;h2&gt;ssh port fowardingを実行する&lt;/h2&gt;
&lt;p&gt;ssh -fNg 3307:localhost:3307 user@remote-server -p 22&lt;/p&gt;
&lt;p&gt;ローカル環境から上記コマンドを実行することでssh port forwardingが設定できます。&lt;/p&gt;
&lt;p&gt;オプション&lt;/p&gt;
&lt;p&gt;説明&lt;/p&gt;
&lt;p&gt;-f&lt;/p&gt;
&lt;p&gt;バックグラウンドで実行させる&lt;/p&gt;
&lt;p&gt;-N&lt;/p&gt;
&lt;p&gt;リモートコマンドを実行しない。sshポートフォワーディング時のみに利用する&lt;/p&gt;
&lt;p&gt;-g&lt;/p&gt;
&lt;p&gt;リモートホストが転送されたローカルなポートに接続することを許可します。&lt;/p&gt;
&lt;p&gt;-L&lt;/p&gt;
&lt;p&gt;指定されたローカルのポートをリモートのポートとマッピングさせる&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;</content:encoded></item><item><title><![CDATA[pmjp.slack.comオフ会#4でLTしました]]></title><description><![CDATA[昨日pmjp.slack.comオフ会#4にて「チーム全員でお申し込み数を２倍にした話」をLTしてきました。これは7/2(土）にヤパチーで発表した内容と同じものです。 偶然のきっかけで発表することになりました 大変恐縮ながらpmjpのSlack…]]></description><link>https://blog.hypermkt.jp/2016/2016-07-06-pmjp-slack-com-off-4/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2016/2016-07-06-pmjp-slack-com-off-4/</guid><pubDate>Wed, 06 Jul 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;昨日&lt;a href=&quot;http://pmjp.connpass.com/event/33514/&quot;&gt;pmjp.slack.comオフ会#4&lt;/a&gt;にて「チーム全員でお申し込み数を２倍にした話」をLTしてきました。これは7/2(土）にヤパチーで発表した内容と同じものです。&lt;/p&gt;
&lt;h2&gt;偶然のきっかけで発表することになりました&lt;/h2&gt;
&lt;p&gt;大変恐縮ながらpmjpのSlackチャンネルには入っていたのですが、イベントのことを把握しておりませんでした（汗）。ヤパチーも終わった直後で気を抜いていた所、突然pmjpのSlackチャンネルで下記の通知が流れ驚いたのを覚えています（笑）。 恐らくどなたかにはてブでPMのタグを付けていただきそれがイベント前日に通知され、off会のことを知りました。偶然の出来事ではありましたが、もっと多くの人に知ってほしい！と思い、後押しも頂きLT枠（ちょうど１枠だけ空いていた・・・ｗ）として参加させて頂きました。参加できてとても良かったです。（またこうやって発表できたのもヤパチーのおかげです。）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2016/07/%E8%B2%BC%E3%82%8A%E4%BB%98%E3%81%91%E3%81%9F%E7%94%BB%E5%83%8F_2016_07_06_22_50.png&quot; alt=&quot;貼り付けた画像_2016_07_06_22_50&quot;&gt;&lt;/p&gt;
&lt;h2&gt;発表&lt;/h2&gt;
&lt;p&gt;ヤパチーでは30分でしたが、LTは10分枠でしたので短縮版として発表しました。上記資料は省略無しのものです。発表後にちょうど改善に取り組んでいる方からどうやったら改善できるのか、改善したと判断する指標は何かなど議論ができて良かったです。自分はつい流入先のセッション数を1つでも増やすために少し強引な施策を考えがちですが、やはりコンバージョン見込みのある流入を増やすのが最適ではありますよね。またQiitaの及川さんの発表も拝聴することが出来とても貴重な経験でした。次はPHP BLT #5に向けて資料作り頑張ります。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[YAPC::ASIA Hachioji 2016 in Shinagawaに登壇＆ボランティアスタッフとして参加しました]]></title><description><![CDATA[…]]></description><link>https://blog.hypermkt.jp/2016/2016-07-03-yapcasia-hachioji-2016-in-shinagawa/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2016/2016-07-03-yapcasia-hachioji-2016-in-shinagawa/</guid><pubDate>Sun, 03 Jul 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;スタッフの皆さん、参加者のお疲れ様でした！たくさんの方に参加いただいて本当にありがとうございました！！いや〜、すごい楽しい二日間で最高でしたね！&lt;/p&gt;
&lt;p&gt;今回自分はボランティアスタッフ兼登壇者として参加しました。今回自分はこのようなカンファフェンスにボランティアスタッフとして初めて参加したので、スタッフ目線でまとめてみました。&lt;/p&gt;
&lt;h2&gt;どうやって参加したのか？&lt;/h2&gt;
&lt;p&gt;ボランティアスタッフの
&lt;a href=&quot;https://github.com/hachiojipm/yapcasia-8oji-2016mid/issues/4#issue-147836065&quot;&gt;参加issue&lt;/a&gt; で募集の告知を知りコメントをしました。そもそもこういうイベントのスタッフで参加するのは始めてだったので、これが一般的かどうかは分かりませんが、応募者の方は一望できてとても良かったです。&lt;/p&gt;
&lt;h2&gt;どうやって準備をしたのか？&lt;/h2&gt;
&lt;p&gt;全てこちらの
&lt;a href=&quot;https://github.com/hachiojipm/yapcasia-8oji-2016mid&quot;&gt;リポジトリ&lt;/a&gt;にまとまっています。
&lt;a href=&quot;https://twitter.com/uzulla?lang=ja&quot;&gt;@uzulla&lt;/a&gt;さん、
&lt;a href=&quot;https://twitter.com/maka2_donzoko&quot;&gt;makamaka&lt;/a&gt; さんを中心にSlackでボランティアスタッフと会話しながら、issueで議論してWikiに決まったことがまとめられていきました。&lt;/p&gt;
&lt;h2&gt;何をしたのか？&lt;/h2&gt;
&lt;p&gt;部屋Aのリーダーをしていました。一部屋に主リーダー１名、タイムキーパー２名を必須とし、予備として副リーダー１、副タイムキーパー名の合計５名構成でした。リーダーは後ろで全体を見渡し乱れた椅子を直したり、トラブルが起きた時の対処をします。タイムキーパーは司会進行です。発表時の開始と終了の合図は
&lt;a href=&quot;https://itunes.apple.com/jp/app/xue-xiaochaimu/id1023234803?mt=8&quot;&gt;学校チャイム&lt;/a&gt; と呼ばれるアプリで完全全自動でした。発表スケジュールを全て登録しておくことで、自動的にチャイムが鳴ってくれるスグレモノです。すげー。&lt;/p&gt;
&lt;h2&gt;他の人は何をするのか&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;ビルの受付班&lt;/li&gt;
&lt;li&gt;入り口で受付をします&lt;/li&gt;
&lt;li&gt;発表が見れないので少し苦行ですが、交代で見ていました&lt;/li&gt;
&lt;li&gt;会場受付班&lt;/li&gt;
&lt;li&gt;会場の受付で名札を渡します&lt;/li&gt;
&lt;li&gt; ネット班&lt;/li&gt;
&lt;li&gt;ツイッターをずっと監視して困っている人を探してすぐに回答します&lt;/li&gt;
&lt;li&gt;忘れ物が出たら告知をします&lt;/li&gt;
&lt;li&gt;遊撃隊&lt;/li&gt;
&lt;li&gt;何でも屋さん。一人行動OKのリベロ。&lt;/li&gt;
&lt;li&gt;会場内の見渡し&lt;/li&gt;
&lt;li&gt;困っている人を助ける&lt;/li&gt;
&lt;li&gt;うるさい人をいたら注意&lt;/li&gt;
&lt;li&gt;汚れたらメインで対応する&lt;/li&gt;
&lt;li&gt;部屋担当&lt;/li&gt;
&lt;li&gt;各部屋に主リーダー1名 タイムキーパー２名 副リーダー1名  タイムキーパー1名&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;スタッフでも発表できるのか？&lt;/h2&gt;
&lt;p&gt;出来ました。登壇の前の発表の時点で副リーダーに担当を交代してもらい、軽く資料を修正する余裕すら有りました。&lt;/p&gt;
&lt;h2&gt;Microsoft様のセミナールームは快適でした&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;プロジェクター２個完備&lt;/li&gt;
&lt;li&gt;登壇席には返しモニター有り&lt;/li&gt;
&lt;li&gt;司会席あり 返しモニター有り&lt;/li&gt;
&lt;li&gt;マイク、ピンマイク、台付きマイクなど全種類あり&lt;/li&gt;
&lt;li&gt;充電電池多数完備&lt;/li&gt;
&lt;li&gt;冬用のクローゼット有り&lt;/li&gt;
&lt;li&gt;と完全装備&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;余談ですが31階からの眺めは圧巻でした。あの空き地には何が建設されるんだろう。&lt;/p&gt;
&lt;h2&gt;当日はどうやってスタッフ間の連絡をとったのか&lt;/h2&gt;
&lt;p&gt;Slackを無線のように使いました。特定のチャンネルの通知を常にプッシュ通知で受信するようにし、イヤフォンで常に音声で聞いていました。これが結構便利でして問題が起きた際にすぐに検知できました。&lt;/p&gt;
&lt;h2&gt;参加して率直な感想&lt;/h2&gt;
&lt;p&gt;とても楽しかったの一言につきます。あとすごい疲れました。ただ参加してメリットしか無かったです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;有名なエンジニアの方を知り合いになれた&lt;/li&gt;
&lt;li&gt;イベントの運営経験が得られた。今後社内外を通して役に立ちます。&lt;/li&gt;
&lt;li&gt;ヤパチーに来れた。スタッフ優先枠効果。&lt;/li&gt;
&lt;li&gt;ヤパチーで発表できた。３人の方に２０分近く質問してもらった。&lt;/li&gt;
&lt;li&gt;みんなにいいねしてもらった。これは嬉しい！&lt;/li&gt;
&lt;li&gt;みんなに褒めてもらえた。これも嬉しい！&lt;/li&gt;
&lt;li&gt;自分の知らない世界を知れた。正直いままでこういうイベントに全く参加しておらず、エンジニア界隈の中に入れていなかったのですが、参加すること自体は簡単で単に自分が参加していないだけでした。&lt;/li&gt;
&lt;li&gt;みんなとても優しく困ったことがあったらすぐに助けてくれた&lt;/li&gt;
&lt;li&gt;みんなとても協力的で不平不満を言う人が一人もいなかった。これはスタッフ、参加者ともに。&lt;/li&gt;
&lt;li&gt;マイクロソフトさんのセミナールーム最強！WIFI環境超高速！眺め最高！広いし、椅子も多いし、トイレも広いし、手の乾燥機は２つもあるし、最高かよ！！！&lt;/li&gt;
&lt;li&gt;終わった後の達成感がたまらなく最高&lt;/li&gt;
&lt;li&gt;また参加したくなった&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;と興奮冷め止まない感じではありますが、また次のヤパチーがあれば必ず参加したいです！&lt;/p&gt;</content:encoded></item><item><title><![CDATA[TechShopTokyo見学ツアーに参加した]]></title><description><![CDATA[今日は会社のmake部メンバーと一緒に
TechShopTokyoの見学ツアーに参加してきました。##TechShopTokyoとは アメリカ発の会員制DIY工房で、２０１６年４月１日にアーク森ビル３Fにオープンした施設です。本格的な工作設備が多数配備されており、3D…]]></description><link>https://blog.hypermkt.jp/2016/2016-06-12-techshoptokyo-tour/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2016/2016-06-12-techshoptokyo-tour/</guid><pubDate>Sun, 12 Jun 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;今日は会社のmake部メンバーと一緒に
&lt;a href=&quot;http://www.techshop.jp/&quot;&gt;TechShopTokyo&lt;/a&gt;の見学ツアーに参加してきました。##TechShopTokyoとは&lt;/p&gt;
&lt;p&gt;アメリカ発の会員制DIY工房で、２０１６年４月１日にアーク森ビル３Fにオープンした施設です。本格的な工作設備が多数配備されており、3Dプリンタ、木工加工、金属加工、樹脂加工、テキスタイル、カラーリング、電気工作など何でも作れる工房です。またセミナールームも有り、講習会も行われています。&lt;/p&gt;
&lt;p&gt;[embed]&lt;a href=&quot;https://www.youtube.com/embed/p-sF2pbosfE%5B/embed%5D&quot;&gt;https://www.youtube.com/embed/p-sF2pbosfE[/embed]&lt;/a&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;h2&gt;見学ツアーとは&lt;/h2&gt;
&lt;p&gt;予約無しで施設内が見学できる30分ほどのツアーです。&lt;/p&gt;
&lt;p&gt;曜日&lt;/p&gt;
&lt;p&gt;時間&lt;/p&gt;
&lt;p&gt;平日&lt;/p&gt;
&lt;p&gt;13:00、15:00、17:00、19:00&lt;/p&gt;
&lt;p&gt;土・日・祝日&lt;/p&gt;
&lt;p&gt;11:00、15:00、17:00、19:00&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;h2&gt;写真レポート&lt;/h2&gt;
&lt;p&gt;[caption id=“attachment_726” align=“alignright” width=“1125”]
&lt;img src=&quot;/images/0003_xlarge.jpg&quot; alt=&quot;0003_xlarge&quot;&gt; 3Dスキャナー。緑の物体をスキャンして、右が複製されたもの。すごい。
&lt;img src=&quot;/images/0006_xlarge.jpg&quot; alt=&quot;0006_xlarge&quot;&gt;[/caption]&lt;/p&gt;
&lt;p&gt;名前は全く覚えていないが、木工用機械。イラレデータを入力すると自動的に木を加工してくれて&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/0007_xlarge.jpg&quot; alt=&quot;0007_xlarge&quot;&gt;&lt;/p&gt;
&lt;p&gt;こんなのが作れてしまう。木を回転させながら上から削るとのこと。加工しているところを見てみたい。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/0012_xlarge.jpg&quot; alt=&quot;0012_xlarge&quot;&gt;&lt;/p&gt;
&lt;p&gt;金属加工機械。これもデータを入力すれば自動的に加工してくれる。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/0016_xlarge.jpg&quot; alt=&quot;0016_xlarge&quot;&gt;&lt;/p&gt;
&lt;p&gt;溶接も出来る。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/0024_xlarge.jpg&quot; alt=&quot;0024_xlarge&quot;&gt;&lt;/p&gt;
&lt;p&gt;樹脂加工。所謂プラスチック製品を作ることが出来る。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/0025_xlarge.jpg&quot; alt=&quot;0025_xlarge&quot;&gt;&lt;/p&gt;
&lt;p&gt;データを入力するだけで好きな樹脂製品を作ることが出来る。ちょうどいいサイズの箱が欲しい場合は、樹脂加工で作ると良さそう。（もっとマシなものを作るべきだが・・・）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/0023_xlarge.jpg&quot; alt=&quot;0023_xlarge&quot;&gt;&lt;/p&gt;
&lt;p&gt;スマホケースへの印刷も出来る。
&lt;img src=&quot;/images/0022_xlarge.jpg&quot; alt=&quot;0022_xlarge&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/0020_xlarge.jpg&quot; alt=&quot;0020_xlarge&quot;&gt;&lt;/p&gt;
&lt;p&gt;いろんな素材にもカラフルな印刷ができる。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/0033_xlarge.jpg&quot; alt=&quot;0033_xlarge&quot;&gt;&lt;/p&gt;
&lt;p&gt;印刷ではなく、自動的に縫ってくれる。TechShopの機械で印刷できないものはほとんど無い気がするｗ&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/0018_xlarge.jpg&quot; alt=&quot;0018_xlarge&quot;&gt;&lt;/p&gt;
&lt;p&gt;施設の中心にあるワークスペース。作業場、MTGとして利用できる。広くて良いね。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/0002_xlarge.jpg&quot; alt=&quot;0002_xlarge&quot;&gt;&lt;/p&gt;
&lt;p&gt;と、雑なレポートで恐縮ですが見学会のまとめでした。想像していた以上に本格的な施設で機材も揃っていました。実際にアメリカではTechShopからSquareのプロトタイプを作り生まれたりしており、日本には足りない新しい何かを作る気質を感じた。&lt;/p&gt;
&lt;p&gt;オープンにソフトウェアを開発する場としてコワーキングスペースがあるが、ここはハードウェアのコワーキングスペースという印象だった。今までこういうことするには自分で機材を揃えるか、DIY店の片隅にある加工コーナーに行く必要があったが、都内で気軽に行けるのは興味深い。&lt;/p&gt;
&lt;p&gt;今後ここから新しいハードウェアのスタートアップが生まれるかもしれない。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[ELB導入時に躓いた件]]></title><description><![CDATA[先日ELBを導入したんですが、事前の調査不足もあり思った以上に影響がでてしまい障害となってしまった（反省）。というのも、ELBというAWSのロードバランサー配下にWebサーバーを入れた場合に、クライアントのIPアドレス取得方法が今までと変わる。*Elastic Load…]]></description><link>https://blog.hypermkt.jp/2016/2016-05-23-note-for-elb/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2016/2016-05-23-note-for-elb/</guid><pubDate>Mon, 23 May 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;先日ELBを導入したんですが、事前の調査不足もあり思った以上に影響がでてしまい障害となってしまった（反省）。というのも、ELBというAWSのロードバランサー配下にWebサーバーを入れた場合に、クライアントのIPアドレス取得方法が今までと変わる。*&lt;a href=&quot;http://docs.aws.amazon.com/ja_jp/ElasticLoadBalancing/latest/DeveloperGuide/x-forwarded-headers.html&quot;&gt;Elastic Load Balancing の X-Forwarded ヘッダー - Elastic Load Balancing&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://ja.wikipedia.org/wiki/X-Forwarded-For&quot;&gt;X-Forwarded-For - Wikipedia&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;にあるように「X-Forwarded-Forヘッダー」にクライアントIPアドレスが入るようになり 環境変数の
REMOTE_ADDR では取得できないようになる。（知らなかった〜）&lt;/p&gt;
&lt;p&gt;これが地味に影響範囲が広く&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;フレームワーク内のIPアドレス取得メソッド&lt;/li&gt;
&lt;li&gt;Apacheのconfファイル内のIPアドレス制限&lt;/li&gt;
&lt;li&gt;.htaccess内のIPアドレス制限&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;に影響があり、アプリケーション全体で盛大に誤動作してしまった・・・。&lt;/p&gt;
&lt;h3&gt;フレームワーク内のIPアドレス取得メソッド&lt;/h3&gt;
&lt;p&gt;PHPであれば
$_SERVER[‘HTTP_X_FORWARDED_FOR’];で取得できる。但し複数IPアドレスが入る場合もあるので要注意。
refs :
&lt;a href=&quot;https://teratail.com/questions/131&quot;&gt;PHP - PHP ロードバランサ経由のクライアントのIP取得ができない(131)｜teratail&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;.htaccess内のIPアドレス制限&lt;/h3&gt;
&lt;p&gt;海外のボットなど気軽にIPアドレス制限をかけたい場合に、.htaccessは大変便利なわけなのですが、記述の変更が必要です。
SetEnvIfでIPアドレスを指定する際は正規表現で指定できるのですが、複数個のIPアドレスをパイプでつなげると可読性が悪いので、個人的には下記の記法が好みです。&lt;/p&gt;
&lt;h3&gt;ELB非利用時&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;order allow,deny
allow from all
deny from xxx.xxx.xxx.xxx
deny from xxx.xxx.xxx.xxx&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;ELB利用時&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;order allow,deny
allow from all

SetEnvIf X-Forwarded-For &quot;xxx\.xxx\.xxx\.xxx&quot; deny_ip_addresses
SetEnvIf X-Forwarded-For &quot;xxx\.xxx\.xxx\.xxx&quot; deny_ip_addresses

deny from env=deny_ip_addresses&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;とネット上ではありふれた情報であるのですが、最初は結構戸惑ったので自分用のメモとしてまとめました。どうにか導入できてよかった。これでグーグルクローラーに本気で来られても大丈夫だろう。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[vue-validator のドキュメント翻訳を始めました]]></title><description><![CDATA[PRは
こちらです。 vue-validatorって何？ vue-validator は @kazu_pon さんが開発されたVue.js向けのフォームバリデーションライブラリです。 フォーム要素のバリデーションが簡単に実装できます。 どうして始めたのか 最近Vue.js…]]></description><link>https://blog.hypermkt.jp/2016/2016-05-08-started-translation-for-vue-validator/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2016/2016-05-08-started-translation-for-vue-validator/</guid><pubDate>Sun, 08 May 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;PRは
&lt;a href=&quot;https://github.com/vuejs/vue-validator/pull/216&quot;&gt;こちら&lt;/a&gt;です。&lt;/p&gt;
&lt;h2&gt;vue-validatorって何？&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vuejs/vue-validator&quot;&gt;vue-validator&lt;/a&gt; は &lt;a href=&quot;https://twitter.com/kazu_pon&quot;&gt;@kazu_pon&lt;/a&gt; さんが開発されたVue.js向けのフォームバリデーションライブラリです。&lt;/li&gt;
&lt;li&gt;フォーム要素のバリデーションが簡単に実装できます。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;どうして始めたのか&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;最近Vue.jsに興味を持ち始め勉強してました。&lt;/li&gt;
&lt;li&gt;一つの勉強法としてドキュメント翻訳は調度良いのでは？と突然思い始めました。ドキュメント翻訳するには、英語のドキュメントをよく読み、動作が分からない箇所はサンプルコードも確認する必要があります。翻訳を通じてライブラリも詳しくなり、Vue.jsにも慣れることが出来るのではと思います。&lt;/li&gt;
&lt;li&gt;またちょうどライブラリのドキュメント翻訳も募集されてました&lt;/li&gt;
&lt;li&gt;Vue.js本家が全て日本語翻訳されており大変助けられたので、Vue.jsに貢献したかった&lt;/li&gt;
&lt;li&gt;GWだし（あと３０分で終わりだけど）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;翻訳を始めてどうか&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;個人的に英語が好きなので、翻訳業務は楽しいです。&lt;/li&gt;
&lt;li&gt;vue-validatorの仕様に少し詳しくなれた&lt;/li&gt;
&lt;li&gt;とはいえ翻訳は難しい。変にカタカナ用語を繋げすぎても意味が分からないし、既存のVue.js日本語本家で使われている単語との差異があってもいけない。&lt;/li&gt;
&lt;li&gt;Vue.js、関連コンポーネントのお作法などが学べて良い&lt;/li&gt;
&lt;li&gt;困ったことがあると開発者の @kazupon さんからもコメントがもらえ助かっています。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vuejs-jp/jp.vuejs.org/blob/lang-ja/CONTRIBUTING.md&quot;&gt;Vue.js 公式の翻訳ガイド&lt;/a&gt;があり、参加しやすかった。また構文チェックもtextlintという自動ツールもあって便利。いろいろ知らないことが多い。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;感想&lt;/h2&gt;
&lt;p&gt;亀翻訳ながらもちょっとずつ進められています。あと１，２週間以内には終えられるように頑張ろう。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Sequel Proで選択した行をMarkdown出力するバンドルを作りました]]></title><description><![CDATA[元々実装自体は1年前に書いてはいたんですが、ずっとgistに放置したままになったので簡単にインストールしやすいようにしました。 概要 Sequel ProはMac用MySQLクライアントで、接続設定をすると簡単に検索やSQLを実行できるとても便利なソフトウェアです。 GitHub…]]></description><link>https://blog.hypermkt.jp/2016/2016-04-03-copy-as-markdown-for-sequel-pro/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2016/2016-04-03-copy-as-markdown-for-sequel-pro/</guid><pubDate>Sun, 03 Apr 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;元々実装自体は1年前に書いてはいたんですが、ずっとgistに放置したままになったので簡単にインストールしやすいようにしました。&lt;/p&gt;
&lt;h2&gt;概要&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Sequel ProはMac用MySQLクライアントで、接続設定をすると簡単に検索やSQLを実行できるとても便利なソフトウェアです。&lt;/li&gt;
&lt;li&gt;GitHub issueに貼りやすくするためSequel Proの検索結果をMarkdown形式でコピーできるバンドル（プラグインのようなもの）を実装しました&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;インストール方法&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/hypermkt/CopyAsMarkdownForSequelProBundle&quot;&gt;hypermkt/CopyAsMarkdownForSequelProBundle&lt;/a&gt;をgit cloneして
copyAsMarkdown.spBundle をダブルクリックするだけです。&lt;/p&gt;
&lt;h2&gt;使い方&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;検索結果行を選択&lt;/li&gt;
&lt;li&gt;メニューから「バンドル &gt; copyAs &gt; copyAsMarkdown」を選択するとコピーされます&lt;/li&gt;
&lt;li&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2016/04/copy_as_markdown.png&quot; alt=&quot;copy_as_markdown&quot;&gt;&lt;/li&gt;
&lt;li&gt;後は貼り付けるだけです！&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;id&lt;/th&gt;
&lt;th&gt;method&lt;/th&gt;
&lt;th&gt;accessed_at&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;15207807&lt;/td&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;2016-01-25 00:00:00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15207808&lt;/td&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;2016-01-25 00:00:00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15207811&lt;/td&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;2016-01-25 00:00:01&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;検索結果をMarkdownの表として整形して残したい時に便利です！&lt;/p&gt;</content:encoded></item><item><title><![CDATA[全ページをSSL化する方法]]></title><description><![CDATA[概要 先日
あにこれの全ページSSL化の導入が完了しました。本件ではその経験を元に全ページをSSL化する際の確認事項・手順・注意点等をまとめます。 なぜ全ページSSL化するのか SEOとセキュリティ対策が目的です。「
Google ウェブマスター向け公式ブログ: HTTPS…]]></description><link>https://blog.hypermkt.jp/2016/2016-03-21-always-on-ssl/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2016/2016-03-21-always-on-ssl/</guid><pubDate>Mon, 21 Mar 2016 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;概要&lt;/h2&gt;
&lt;p&gt;先日
&lt;a href=&quot;https://www.anikore.jp&quot;&gt;あにこれ&lt;/a&gt;の全ページSSL化の導入が完了しました。本件ではその経験を元に全ページをSSL化する際の確認事項・手順・注意点等をまとめます。&lt;/p&gt;
&lt;h2&gt;なぜ全ページSSL化するのか&lt;/h2&gt;
&lt;p&gt;SEOとセキュリティ対策が目的です。「
&lt;a href=&quot;http://googlewebmastercentral-ja.blogspot.jp/2014/08/https-as-ranking-signal.html&quot;&gt;Google ウェブマスター向け公式ブログ: HTTPS をランキング シグナルに使用します&lt;/a&gt;」にある通りGoogle公式ブログでランキングアルゴリズムに僅かながら寄与すると明言しています。暗中模索のSEO対策の中、比較的効果が期待できる方法につき、やらない理由は無いです。&lt;/p&gt;
&lt;h2&gt;全ページSSL化とは&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;httpsで表示するページ内の全ての既存サーバー内の静的ファイル、外部リソースファイルの読み込み、通信を&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;httpsに切り替えること&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;httpでアクセスしたら自動的に&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;httpsに301リダイレクトされること&lt;/p&gt;
&lt;h2&gt;やらないこと&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;外部サイトへのAタグのURLはhttpのままでも問題ありません。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;【個人的にオススメしない】HSTS&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;初回SSL導入時はオススメしません。これを初回に実施してしまうとトラブル発生時に&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;httpに戻すのが大変になります。&lt;/p&gt;
&lt;h2&gt;確認事項&lt;/h2&gt;
&lt;h3&gt;Webサーバー&lt;/h3&gt;
&lt;p&gt;まずはWebサーバー本体にSSL証明書の導入が必要です。利用しているウェブサーバーのミドルウェアに応じてインストールしましょう。&lt;/p&gt;
&lt;h3&gt;静的ファイルへのパス&lt;/h3&gt;
&lt;p&gt;画像、JavaScript, CSSファイルなどの静的ファイルのパスをhttpsで参照できるように変更する必要があります。方法は２つあります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ファイルへのパスをhttpsから記述する&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;例)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://www.anikore.jp/logo.png&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;URIスキームを削除してhttp/https両方に対応させる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;例)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;//www.anikore.jp/logo.png&quot; /&gt;
&lt;h3&gt;画像サーバー&lt;/h3&gt;
&lt;p&gt;img.hogehoge.jp等の独自の画像サーバーを構築して利用している場合は、対象のサブドメインにもSSL証明書の導入が必要です。Webサーバー同様に利用しているミドルウェアに応じてインストールしましょう。&lt;/p&gt;
&lt;h3&gt;CDN&lt;/h3&gt;
&lt;p&gt;Akamai/CloudFrontを利用している場合はhttp非対応のプランもあるので、各サービスのマニュアルを確認しましょう。&lt;/p&gt;
&lt;h3&gt;広告/アフィリエイト&lt;/h3&gt;
&lt;p&gt;広告やアフィリエイトシステムでは各社が計測や広告出力用のJavaScript, 画像を配信しており、https化は各社のサーバーに依存します。&lt;/p&gt;
&lt;p&gt;https対応可能&lt;/p&gt;
&lt;p&gt;下記はhttpsに対応しているので、URLを変えることで対応できます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Google AdSense&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;楽天アフィリエイト&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Nend&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;https未対応&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A8&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A8に問い合わせた所、画像は自分のサーバーから配信して問題ないとのことです。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;fluentd&lt;/h3&gt;
&lt;p&gt;Apache/Nginx共に初期設定ではアクセスログの出力先が分かれているので、ログを転送している場合は合わせてfluentdの設定を調整してください。&lt;/p&gt;
&lt;h2&gt;手順&lt;/h2&gt;
&lt;p&gt;各環境・状態に応じて順序は変わりますが、ざっくりと手順とまとめます。&lt;/p&gt;
&lt;h3&gt;事前リリース可能&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Web/画像サーバーにSSL証明書をインストール&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;静的ファイル・広告類をhttpsに切り替える&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;fluentdの設定変更&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;全ページSSL化&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;全ページで301リダイレクト&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;切替後に要対応&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Google Analyticsのプロパティ名を&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;httpsに変更する&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Google Analyticsのプロパティ設定のデフォルトURLを&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;httpsに変更する&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SearchConsoleに&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;httpsの新URLのプロパティを新規追加する&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SearchConsoleで&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;httpsの新URLが列挙された新サイトマップXMLを送信する&lt;/p&gt;
&lt;h2&gt;まとめ&lt;/h2&gt;
&lt;p&gt;当初は簡単かつすぐに出来ると考えてましたが、作業を始めて見ると既存のコード内に
httpの直書き(反省)があったり、他サーバーへの影響(見積もりが甘い)もあり、アプリケーション・インフラを横断して対応が必要で地味に大変でした。&lt;/p&gt;
&lt;p&gt;ただ念願の全ページSSL化が対応でき、今後オーガニック検索の流入がどう変化するのか楽しみです。&lt;/p&gt;
&lt;h2&gt;参考にしたサイト&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;http://qiita.com/takoratta/items/fb6b3486257eb7b9f12e&quot;&gt;HSTS (HTTP Strict Transport Security) の導入 - Qiita&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;http://qiita.com/gotohiro55/items/7daa988db23a5a8355c1&quot;&gt;mod_rewriteでHTTP / HTTPSの切り替え - Qiita&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;http://d.hatena.ne.jp/mrgoofy33/20100914/1284414817&quot;&gt;.htaccessでHTTPアクセスをSSLでリダイレクト(逆もアリ) - hogehoge foobar Blog Style5&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[iPhone5からNexus5x(シムフリー)にMNPした]]></title><description><![CDATA[先日iPhone5からNexus5x（シムフリー）にMNPで乗り換えたので、その際の手順や感想をまとめます。##乗り換えた理由 iPhone_Payment_Last6months 月額利用料が約800…]]></description><link>https://blog.hypermkt.jp/2016/2016-03-13-iphone5-to-nexus5x-sim-free/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2016/2016-03-13-iphone5-to-nexus5x-sim-free/</guid><pubDate>Sun, 13 Mar 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;先日iPhone5からNexus5x（シムフリー）にMNPで乗り換えたので、その際の手順や感想をまとめます。##乗り換えた理由&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/iPhone_Payment_Last6months.png&quot; alt=&quot;iPhone_Payment_Last6months&quot;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;月額利用料が約8000円と高いので前々から不満だった。上記は過去半年の実際に利用料のグラフである。通話はほぼ無かったので１万円を超えることはなかったが、それでも高い！&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;3年使ったiPhone5が突然再起動したり、画面が固まったりと不調が続いていた&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;全体的に遅くなっていた&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;電源ボタンが押せなくなってしまい、ソフトウェアホームボタンで画面を切っていたがとても不便&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Google Nexus5xを選んだ理由&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;最新のAndroid6が初期インストールされた比較的新しい機種&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;http://www.expansys.jp/google-nexus-5x-lg-h791-sim-16gb-carbon-black-287557/&quot;&gt;Expansys&lt;/a&gt;でちょうどセールが行われており3万円で購入できた。約12000円割引！&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;最新機種の6Pに劣らないスペック&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;シムフリーにMNPする流れ&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Google Nexus5Xを購入。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ソフトバンクのMNP窓口に電話して予約番号を獲得する&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ヨドバシカメラ 秋葉原店で&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;http://umobile.jp/service/sim/vc/&quot;&gt;U-Mobile 通話プラン 5G&lt;/a&gt;を選択&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;MNP受付が20:00までなのでそれまでに来店する必要あり&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;必要な物はMNP予約番号、身分証明書、クレジットカード&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;あとは店員さんの言われるがままにお申込書に記入&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;20分待ってお支払いをして完了。SIMを受け取る&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Nexus5XにSIMを挿入&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;完了&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Google Nexus5xの使い勝手&lt;/h2&gt;
&lt;p&gt;全体的に満足度は高いが気になったことを下記にまとめる&lt;/p&gt;
&lt;h3&gt;良かったこと&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;背面指紋認証がとても便利。すぐにロック解除が出来る。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;画面描画、動作がとても高速である&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;充電速度が早い&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;画質が良い&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;画面が広い&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;プラスチック筐体で安っぽいかも？と懸念があったが、マット調なのでそこまで悪く無い。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;悪かったこと&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;サイズが大きい。片手で操作はかなりしずらく結局両手操作をしている。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;充電器が大きい。海外製の充電器に日本用の変換器をつけている。変換器は購入時に無料で付いていた。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ライトの色が少しオレンジ色がかっている。気にするほどじゃないけど。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;U-Mobile通話プラン5Gについて&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;月額2138円(税込み)は今までに比べて約6000円安くなり年間では72000円の節約となる。まずこれが大満足である。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;当初はIIJの音声通話機能付きSIMみおふぉんにしようかと思ったが月額税込み価格が2397円とU-Mobileに比べて200円高かったのでU-Mobileにした。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;通信速度の差もあるが大差はない。また音声通話料金は20円/30秒は各社同じなので正直値段で判断するのが一番良い。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;今だと&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;http://umobile.jp/lp/ltecp01/&quot;&gt;３ヶ月無料キャンペーン&lt;/a&gt;をやっており約9000円お得になる。橋本環奈ちゃん様様である。&lt;/p&gt;
&lt;h2&gt;データの移行について&lt;/h2&gt;
&lt;h3&gt;【重要】LINE&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;2016年においてLINEアカウントは電話番号、メールアドレス以上に重要なアカウントとなっているのでこれは絶対に引き継ぐ必要がある&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;http://official-blog.line.me/ja/archives/53494977.html&quot;&gt;【重要/変更】2016年最新版 LINEのアカウントを引き継ぐ方法 : LINE公式ブログ&lt;/a&gt;にしたがうだけで簡単に出来た。会話は消えてしまったが友達、グループ、グループ内の写真などほぼ移行できて良かった。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;電話帳&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;iPhoneからGoogleなのでiCouldによる移行は出来ないので引き継ぎは出来ない。ただ現状において電話番号は重要ではなくソーシャルアカウントやLINEでのやりとりが頻繁なので「連絡先」としてLINEが引き継げれば全く支障は無い。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;ソーシャルアカウント&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;メールアドレスログインが前提なので問題無し。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Googleアカウント&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;これが一番驚いた。Nexus5Xの初期設定時に今で使っていたGoogleアカウントでログインしたのだが、iPhone5のChromeで入力したID/PWや履歴がなぜか引き継がれていたのである（笑）恐らくiCouldと同じ仕組だと思うのだがすごいシステムだ・・・。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;iPhoneで撮った写真/動画&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;めんどい。旧iPhone5をiPhotoに繋いで吸い取るしか無い。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;またはGoogleドライブやDropboxなどの外部ストレージに常に保存する設定にしておけば機種依存はしなかっただろうけど、そこまで考慮していなかった&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;音楽&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;元より音楽を日常的に聞くタイプではないので不便ではないが、Nexus5xへの入れ方が全く不明である。AndroidにはiTunesに変わるソフトウェアがあるんだろうか？&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Google Authenticator&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;GitHubなどでQRコードを発行し再設定すれば良いので問題無し&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;乗り換えての感想&lt;/h2&gt;
&lt;p&gt;月額利用料が破格の2100円になり、かつ軽快な操作なNexus5xに大満足である。一方でiTunesが使えなくなったり、キャリア別メールアドレスが無くなったことで親との連絡はどうしよう？とふと思ったが回避方法はあるので大した問題ではない。また5Gという通信制限はあるがマイソフトバンクで調べたら一ヶ月で5.1Gの使用量だったので今後気にして使えばそれを超えることはないだろう。もし同じ悩みを抱えている人がいたらシムフリーへの乗り換えはおすすめである。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Apache2.2+mod_sslのSSL設定メモ]]></title><description><![CDATA[概要 Apache2.2で構築されたウェブサーバーにSSL証明書を設定します 購入元 SSL証明書は自分が知るかぎり格安の
RapidSSLから購入しました。当日中に発行できるのでとても便利です。 設定方法 mod_sslのインストール ApacheでSSLを利用するには
mod…]]></description><link>https://blog.hypermkt.jp/2016/2016-02-14-setup_ssl_for_apache_mod_ssl/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2016/2016-02-14-setup_ssl_for_apache_mod_ssl/</guid><pubDate>Sun, 14 Feb 2016 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;概要&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Apache2.2で構築されたウェブサーバーにSSL証明書を設定します&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;購入元&lt;/h2&gt;
&lt;p&gt;SSL証明書は自分が知るかぎり格安の
&lt;a href=&quot;http://www.rapid-ssl.jp/&quot;&gt;RapidSSL&lt;/a&gt;から購入しました。当日中に発行できるのでとても便利です。&lt;/p&gt;
&lt;h2&gt;設定方法&lt;/h2&gt;
&lt;h3&gt;mod_sslのインストール&lt;/h3&gt;
&lt;p&gt;ApacheでSSLを利用するには
&lt;a href=&quot;http://httpd.apache.org/docs/2.2/en/mod/mod_ssl.html&quot;&gt;mod_sslモジュール&lt;/a&gt;を使います。下記コマンドを実行しmod_sslをインストールします。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ yum &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; mod_ssl&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;証明書の配置&lt;/h3&gt;
&lt;p&gt;購入元からメールで送られてきた証明書ファイルをサーバー内に配置します。下記は一例ですが、パッケージインストールされたhttpdの場合は
/etc/httpd以下にプログラム・設定ファイルが配置されるので今回は
/etc/httpd/sslディレクトリ内に証明書ファイル３つを配備しました。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ ll /etc/httpd/ssl
合計 &lt;span class=&quot;token number&quot;&gt;12&lt;/span&gt;
-rw-r--r-- &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; root root &lt;span class=&quot;token number&quot;&gt;1497&lt;/span&gt;  &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;月 &lt;span class=&quot;token number&quot;&gt;13&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;15&lt;/span&gt;:27 www.your-site.jp-cert-chain.pem  &lt;span class=&quot;token comment&quot;&gt;# 中間証明書&lt;/span&gt;
-rw-r--r-- &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; root root &lt;span class=&quot;token number&quot;&gt;1513&lt;/span&gt;  &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;月 &lt;span class=&quot;token number&quot;&gt;11&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;18&lt;/span&gt;:19 www.your-site.jp-cert.pem        &lt;span class=&quot;token comment&quot;&gt;# サーバー証明書&lt;/span&gt;
-rw-r--r-- &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; root root &lt;span class=&quot;token number&quot;&gt;1679&lt;/span&gt;  &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;月 &lt;span class=&quot;token number&quot;&gt;11&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;18&lt;/span&gt;:19 www.your-site.jp-key.pem         &lt;span class=&quot;token comment&quot;&gt;# 秘密鍵&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Apache設定&lt;/h3&gt;
&lt;p&gt;mod_sslをインストールすると
/etc/httpd/conf.d/ssl.confに設定ファイルが配置されるので、ssl.confを下記のように設定すると有効になります。（自分用のメモのため各設定項目の説明やその他設定項目は省いています。）&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;Listen &lt;span class=&quot;token number&quot;&gt;443&lt;/span&gt;
NameVirtualHost *:443

&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;VirtualHost *:44&lt;span class=&quot;token operator&quot;&gt;&lt;span class=&quot;token file-descriptor important&quot;&gt;3&lt;/span&gt;&gt;&lt;/span&gt;
   SSLEngine on
   &lt;span class=&quot;token comment&quot;&gt;# SSLv2, SSLv3以外の全てを有効にする&lt;/span&gt;
   SSLProtocol all &lt;span class=&quot;token parameter variable&quot;&gt;-SSLv2&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-SSLv3&lt;/span&gt;
   &lt;span class=&quot;token comment&quot;&gt;# SSLハンドシェイク時に利用する暗号化方式はサーバー側を優先する&lt;/span&gt;
   SSLHonorCipherOrder On
   &lt;span class=&quot;token comment&quot;&gt;# 暗号化スイート設定&lt;/span&gt;
   SSLCipherSuite ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;EXP:&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;LOW:&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;aNULL:&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;eNULL:&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;ADH:&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;DSS:&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;MD5:&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;PSK:&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;SRP:&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;RC4:&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;3DES
   SSLCertificateChainFile /etc/httpd/ssl/www.anikore.jp-cert-chain.pem
   SSLCertificateFile /etc/httpd/ssl/www.your-site.jp.jp-cert.pem
   SSLCertificateKeyFile /etc/httpd/ssl/www.your-site.jp.jp-key.pem&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Apache設定の反映&lt;/h3&gt;
&lt;p&gt;証明書ファイルを配備、Apache設定をしただけではSSLは有効になりません。下記のようにApacheを再起動して初めて有効になります。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sh&quot;&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;service&lt;/span&gt; httpd configtest
$ &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;service&lt;/span&gt; httpd graceful&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;感想&lt;/h2&gt;
&lt;p&gt;SSLを有効にすること自体は参考サイト通りにすれば簡単に設定はできる事は分った。但し近年のSSL脆弱性問題に対応するには正しい知識と理解から利用する暗号化スイートは選択しなければならない点は気をつける必要がある。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[nodejs/npmを最新にアップデートする方法]]></title><description><![CDATA[n というnodejs用バージョン管理ソフトウェアがあるとのことなので、これを利用します。 nのインストール nodejsを最新にアップデート npmを最新にアップデート と自分用にメモ。]]></description><link>https://blog.hypermkt.jp/2016/2016-01-17-update-to-latest-nodejs-npm/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2016/2016-01-17-update-to-latest-nodejs-npm/</guid><pubDate>Sun, 17 Jan 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://github.com/tj/n&quot;&gt;n&lt;/a&gt; というnodejs用バージョン管理ソフトウェアがあるとのことなので、これを利用します。&lt;/p&gt;
&lt;h3&gt;nのインストール&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ npm install -g n&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;nodejsを最新にアップデート&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ n latest&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;npmを最新にアップデート&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ npm update -g npm&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;と自分用にメモ。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Ansibleを一ヶ月使ってみての感想]]></title><description><![CDATA[結論 最初から 入門Ansible [Kindle版]を買って読んでおけば良かった！ ちまたで言われているほどシンプルでも簡単でも無かった。 それでもやっぱりPuppet/Chefより学習コストは低いので今後も使いたい。 以上！ 最初から入門Ansible [Kindle…]]></description><link>https://blog.hypermkt.jp/2016/2016-01-02-ansible-impression-for-first-month/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2016/2016-01-02-ansible-impression-for-first-month/</guid><pubDate>Sat, 02 Jan 2016 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;結論&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;最初から&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;http://www.amazon.co.jp/%E5%85%A5%E9%96%80Ansible-%E8%8B%A5%E5%B1%B1%E5%8F%B2%E9%83%8E-ebook/dp/B00MALTGDY&quot;&gt;入門Ansible [Kindle版]&lt;/a&gt;を買って読んでおけば良かった！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ちまたで言われているほどシンプルでも簡単でも無かった。&lt;/li&gt;
&lt;li&gt;それでもやっぱりPuppet/Chefより学習コストは低いので今後も使いたい。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以上！&lt;/p&gt;
&lt;h2&gt;最初から入門Ansible [Kindle版]を買って読んでおけば良かった&lt;/h2&gt;
&lt;p&gt;3週目位に存在を知ったのですが、最初から読んでおけば良かったです。この本を読めば基本的なことは全て学べます。&lt;/p&gt;
&lt;h3&gt;ベスト・プラクティスには黙って従おう&lt;/h3&gt;
&lt;p&gt;さくらのナレッジブログでWordPressを動かす環境構築を例に分かりやすく解説してくれます。本来は
&lt;a href=&quot;http://docs.ansible.com/ansible/playbooks_best_practices.html&quot;&gt;本家のBest Practices&lt;/a&gt;を読むべきですが、やっぱり日本語の方が読みやすいですね（すません）。日本語で感触が掴んでから英語版を読むと良いです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://knowledge.sakura.ad.jp/tech/3084/&quot;&gt;実践！Ansibleベストプラクティス（前編） - さくらのナレッジ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://knowledge.sakura.ad.jp/tech/3086/&quot;&gt;実践！Ansibleベストプラクティス（後編） - さくらのナレッジ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;ちまたで言われているほどシンプルでも簡単でも無かった。&lt;/h2&gt;
&lt;p&gt;よくAnsibleはシンプルで簡単に使えるとどのサイトにも書かれていますが、一ヶ月経っての正直な感想は全くそうではないです。&lt;/p&gt;
&lt;h3&gt;changed_when, failed_whenの意味が分からなかった&lt;/h3&gt;
&lt;p&gt;shellやcommandモジュールなど一部のモジュールでは単なる状態確認でも常にchanged扱いになってしまいます。単にshellを実行しているだけなので、OKと表示してほしいことがあります。その際にchanged_whenを使うのですが、この辺の判別を記述する方法が独特かつマニュアルが少ないので最初混乱しました。&lt;/p&gt;
&lt;h3&gt;モジュール数が463個と多い！&lt;/h3&gt;
&lt;p&gt;モジュール数が思っていた以上に多かったことです。
&lt;a href=&quot;http://docs.ansible.com/ansible/list_of_all_modules.html&quot;&gt;こちら&lt;/a&gt;)にAnsibleのtaskで使える全モジュール一覧があるんですが、463個あります・・・。プログラミング言語の関数に比べれば大したことはないですが、「シンプル」「簡単」という謳い文句を勝手に信じていたので、結構多かったんだねという印象でした。ただ実際この一ヶ月で使ったのは下記の10個だけでした。ただこの10個があればだいたい用は足ります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;service&lt;/li&gt;
&lt;li&gt;yum&lt;/li&gt;
&lt;li&gt;gem&lt;/li&gt;
&lt;li&gt;copy&lt;/li&gt;
&lt;li&gt;template&lt;/li&gt;
&lt;li&gt;user&lt;/li&gt;
&lt;li&gt;file&lt;/li&gt;
&lt;li&gt;replace&lt;/li&gt;
&lt;li&gt;shell&lt;/li&gt;
&lt;li&gt;command&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;それでもやっぱりPuppet/Chefより学習コストは低いので今後も使いたい&lt;/h2&gt;
&lt;p&gt;（言うほどPuppet/Chefを使ったことがあるのか！と怒られそうですが）
今後も使いたいです。総じてAnsibleの良いと感じたところは&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;最低10個のモジュールの使い方を覚えればどうにかなる&lt;/li&gt;
&lt;li&gt;Best Practicesに従っておけば煩雑になりにくい&lt;/li&gt;
&lt;li&gt;インストールが簡単なのは最高。ssh接続ができれば対象サーバーに対してすぐに実行できる&lt;/li&gt;
&lt;li&gt;個人的にはこれが一番の理由でもあります。今までChefのインストールに相当苦しめられたので・・・。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ということで年末年始休暇はAnsible一色で終わってしまった。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[xargsを使って簡単に並列処理をする方法]]></title><description><![CDATA[この記事は
Pepabo Advent Calendar 2015の20日目の記事です。 先日とある案件で約400万個の画像データを別のサーバーにAPI経由でインポートする必要がありました。最初は単純に直列で実行してたのですが、終了予想を調べたら約2…]]></description><link>https://blog.hypermkt.jp/2015/2015-12-21-xargs-parallel-option/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2015/2015-12-21-xargs-parallel-option/</guid><pubDate>Mon, 21 Dec 2015 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;この記事は
&lt;a href=&quot;http://qiita.com/advent-calendar/2015/pepabo&quot;&gt;Pepabo Advent Calendar 2015&lt;/a&gt;の20日目の記事です。&lt;/p&gt;
&lt;p&gt;先日とある案件で約400万個の画像データを別のサーバーにAPI経由でインポートする必要がありました。最初は単純に直列で実行してたのですが、終了予想を調べたら約20日かかる事になりあまりに遅すぎる！！と悩んでいた所、「並列処理で実行すればいいよ」というアドバイスを頂きました。いろいろ調べて試した結果、xargsで並列処理をするのが一番簡単かつ使いやすかったので使い方をまとめます。##サンプルスクリプト&lt;/p&gt;
&lt;p&gt;現在時刻を表示した後に1秒間sleepします。&lt;/p&gt;
&lt;?php

// 画像１件をインポートした体とする
echo date(&apos;Y-m-d H:i:s&apos;) . &quot;\n\r&quot;;
sleep(1);

これをxargsコマンドを利用して10回直列実行すると下記の通り10秒かかります。これは想定通りです。


# for i in {1..10}; do echo $i ; done | xargs -n 1 php import.php
2015-12-19 01:01:22
2015-12-19 01:01:23
2015-12-19 01:01:24
2015-12-19 01:01:25
2015-12-19 01:01:26
2015-12-19 01:01:27
2015-12-19 01:01:28
2015-12-19 01:01:29
2015-12-19 01:01:30
2015-12-19 01:01:31

※
-n は引数の数を指定します。


## 並列処理の実行方法



-P #{1度に実行したい最大プロセス数}を指定するだけです。
下記では10回の処理を5並列で実行することにより2秒で処理を終えています。倍速に！！
並列で起動させるプロセス数によっては倍速やそれ以上の速度で処理ができます。


# for i in {1..10}; do echo $i ; done | xargs -P 5 -n 1 php import.php
2015-12-19 00:59:29
2015-12-19 00:59:29
2015-12-19 00:59:29
2015-12-19 00:59:29
2015-12-19 00:59:29
2015-12-19 00:59:30
2015-12-19 00:59:30
2015-12-19 00:59:30
2015-12-19 00:59:30
2015-12-19 00:59:30

実行中のプロセスの様子を見ると下記の通り5プロセスで処理していることが分かります。


# ps aux | grep php
root      9716  0.0  0.1   6336   628 pts/0    S+   16:10   0:00 xargs -P 5 -n 1 php import.php
root      9717  1.0  1.2 115728  7348 pts/0    S+   16:10   0:00 php import.php 1
root      9718  0.0  1.2 115728  7344 pts/0    S+   16:10   0:00 php import.php 2
root      9719  1.0  1.2 115728  7344 pts/0    S+   16:10   0:00 php import.php 3
root      9720  0.0  1.2 115728  7344 pts/0    S+   16:10   0:00 php import.php 4
root      9721  0.0  1.2 115728  7340 pts/0    S+   16:10   0:00 php import.php 5


## 引数も操作できる



php import.php --start=1

とコマンドラインのオプションに合わせて引数を渡したい場合は下記のように
-Iオプションで標準入力を中身を変数に格納し、それをコマンドラインの好きな場所で指定するだけです。


for i in {1..10}; do echo $i ; done | xargs -P 5 -I no php import.php --start=no


root      9979  0.0  0.7 101576  4324 pts/0    R+   16:30   0:00 php import.php --start=6
root      9980  0.0  0.6 101576  4140 pts/0    R+   16:30   0:00 php import.php --start=7
root      9981  0.0  0.7 109792  4612 pts/0    R+   16:30   0:00 php import.php --start=8
root      9982  0.0  0.7 101576  4456 pts/0    R+   16:30   0:00 php import.php --start=9
root      9983  0.0  0.5  67156  3440 pts/0    R+   16:30   0:00 php import.php --start=10


## 最後に


地味なお話でしたがいかがでしたでしょうか。恐らく普段のWebアプリケーション開発では使うことは無いかと思いますが、サーバー移転やデータ連携の都合で大量データを処理する必要がある場合は、並列処理を利用することで高速化を図ることが出来ます。もちろん各言語別で並列処理を実装する事もできますが、個人的にはシンプルな実装、メモリー使用量の考慮、使い勝手を考慮してxargs方式がお気に入りでした。もし機会があれば使ってみてください。</content:encoded></item><item><title><![CDATA[月間約1,000万PVのサイトをサーバー移設した話]]></title><description><![CDATA[先日サーバー移設が無事に完了し、全ロールのサーバーで正常稼働が確認できたので、気持ちが熱いうちに記事にしておこうと思います。 概要 5年前から週末・平日の夜に開発・運営しているとあるレビューサイトをサーバー移設した話です。 規模感としては月間1000万PV、ユーザー数3…]]></description><link>https://blog.hypermkt.jp/2015/2015-11-29-server-relocated-for-ten-million-pv-site/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2015/2015-11-29-server-relocated-for-ten-million-pv-site/</guid><pubDate>Sun, 29 Nov 2015 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;先日サーバー移設が無事に完了し、全ロールのサーバーで正常稼働が確認できたので、気持ちが熱いうちに記事にしておこうと思います。&lt;/p&gt;
&lt;h2&gt;概要&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;5年前から週末・平日の夜に開発・運営しているとあるレビューサイトをサーバー移設した話です。&lt;/li&gt;
&lt;li&gt;規模感としては月間1000万PV、ユーザー数30万人、移設前のサーバー台数は6台です。&lt;/li&gt;
&lt;li&gt;技術的な課題に対する解決方法、導入した技術などは別にしようと思います。&lt;/li&gt;
&lt;li&gt;今回は移設理由、移設手順、全体スケジュール、移設直後の感想のお話です。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;なぜサーバー移設したのか&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;結論を言えば、2015年9月頃にサーバー会社から年末までの移設命令が来たからです。その会社が某社と業務提携をし、データセンターが統合されるのでなんとかかんとか。&lt;/li&gt;
&lt;li&gt;元よりオンプレミスな環境には不満を持っており、クラウドサーバーへの移設は検討をしていたので、重い腰をあげる良い機会になりました。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;移設前のサーバー構成&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;全台オンプレミス環境&lt;/li&gt;
&lt;li&gt;Web x 3&lt;/li&gt;
&lt;li&gt;DB x 2 (Master/Slave)&lt;/li&gt;
&lt;li&gt;Image x 1&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;移設後のサーバー構成&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;全台クラウドサーバー&lt;/li&gt;
&lt;li&gt;Web x 3&lt;/li&gt;
&lt;li&gt;Batch x 1&lt;/li&gt;
&lt;li&gt;DB x 2 (Master/Slave)&lt;/li&gt;
&lt;li&gt;Image x 1&lt;/li&gt;
&lt;li&gt;Mail x 1&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;まず初めに何をしたのか&lt;/h2&gt;
&lt;h3&gt;現状の構成と移設後の構成を手書きで書いた&lt;/h3&gt;
&lt;p&gt;既存の構成、仕様を洗い出しました。各サーバーで動いているミドルウェア、利用状態をA4のホワイトボードに何度も書き直しました。&lt;/p&gt;
&lt;h3&gt;移設予定日を最初から決めた&lt;/h3&gt;
&lt;p&gt;スケジュールを逆算で作る際に必要なので、最初から決めました。直前をゴールとせず一回失敗しても余裕がある日を移設予定日としました。&lt;/p&gt;
&lt;h3&gt;やること・やらないことルールを決めた&lt;/h3&gt;
&lt;p&gt;ルールはシンプルにしました。何か問題が発生した際やディレクターからの割り込み業務が入った際の断る理由として役立ちます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;やること&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;やらないとユーザー、サイトに悪影響を及ぼす業務。これはやるしかありません。&lt;/li&gt;
&lt;li&gt;それ以外はしない。基本的に移設業務のみとする。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;やらないこと&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;開発メンバーは把握していないスクリプト、ミドルウェアは移設しない。導入しない。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;リファクタリング&lt;/li&gt;
&lt;li&gt;メジャーバージョンアップ&lt;/li&gt;
&lt;li&gt;サイトの改善系差し込みの業務&lt;/li&gt;
&lt;li&gt;自分の技量に合わない新技術の導入、挑戦&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;スケジュールを簡単に立てた&lt;/h3&gt;
&lt;p&gt;スケジュールを立てる際には下記のルールとしました&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;本業に支障がでるスケジュールは立てない&lt;/li&gt;
&lt;li&gt;健康を害するようなスケジュールは立てない&lt;/li&gt;
&lt;li&gt;最終期限に余裕を持たせること&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;その上でスケジュール第一版として週単位での作業目安のスケジュールを立てました。ここで日単位でスケジュールを立てなかったのは、プロジェクトの開始初期は技術的な課題が発生しやすく多少のスケジュール変更もしやすくしました。&lt;/p&gt;
&lt;h2&gt;サーバー構築方針&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;既存のサーバーは動作しているミドルウェア、技術的に把握していな箇所が多く、整理も兼ねて正しいサーバー構築手順書を作成するために今回は手動構築としました。&lt;/li&gt;
&lt;li&gt;手順書は全て
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://ja.atlassian.com/software/confluence/&quot;&gt;コンフルエンス&lt;/a&gt;にまとめました。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;プロビジョニングツール化はサーバー移設後に完成した手順書を元に書き起こす予定です。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;プロジェクト中盤でやったこと&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;スケジュールの進捗を確認し、他開発者への助けが必要かどうかの判断をしました。これはギリギリになってリソースを割いても間に合わせない可能性があるので、早めの判断が必要です。&lt;/li&gt;
&lt;li&gt;今回の場合ですが、一部想定外の作業が発生し明らかにスケジュールに間に合わないと判断したので助けを求め、作業を分担することで解決しました。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;プロジェクト後半でやったこと&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;後半になると残件の残り僅かとなるので、issueに細かい粒度で全てを列挙し日別で作業を割り当てました。その結果、予想以上に残件が多いことに気づき、作業分担と予定立てが出来た点が良かったです。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;メンテ直前でやったこと&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;担当者と口頭でリハーサルを行いました。実際にコマンドは叩かずに、メンテナンス手順書を読み上げながら確認しました。その結果、作業の漏れや実行順序の入れ替えによる効率化など改善が出来ました。&lt;/li&gt;
&lt;li&gt;メンテナンス手順書においては、実行予定のコマンドがコピペで使えるように工夫しました。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;移設して良かったこと&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;移設準備作業を通じて既存構成の懸念点、セキュリティ的課題など多数の問題を発見することが出来た。&lt;/li&gt;
&lt;li&gt;念願のクラウド環境を手に入れることができ、サーバー調達が容易になった。&lt;/li&gt;
&lt;li&gt;これら移設作業を通じることで幅広いインフラ知識を身に付けることが出来た。&lt;/li&gt;
&lt;li&gt;クラウド環境ならではのテクニックを得ることが出来ました。DBサーバーの移設時にダンプ＆圧縮＆解凍処理に長時間がかかり、メンテナンス時間が長引く恐れがあったのですが、その時だけ高額のプランを利用することにより、一時的にネットワーク帯域、CPUコア数、メモリースペックを最大限にあげることで、処理の短縮化が出来ました。&lt;/li&gt;
&lt;li&gt;分割移設が出来たことが良かったです。事前に画像サーバー、メールサーバーを段階的に移設することで最終移設日の作業範囲を減らすことが出来ました。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;感想&lt;/h2&gt;
&lt;p&gt;まずは無事に移設できて良かったです。作業の過程で見つかった課題はこれから徐々に潰していく予定です。また移設の過程で自分では解決できない問題がいくつも発生し、開発・インフラエンジニアの友人の助言によって問題解決が出来ました。友人達にはとても感謝しています。今回唯一残念だったことは、最終メンテナンス日が友人の壮行会と重なってしまい参加できなかった事でした・・・・。&lt;/p&gt;
&lt;p&gt;総じて楽しく移設できたので、引き続きサイト改善に努めたいと思います。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[my.cnfのread_onlyについて調べた]]></title><description><![CDATA[概要 某所でMySQLのスレーブサーバーを構築することになり、友人から
read_only権限について教えてもらったので改めて自分で調べなおしてみた。 read_onlyとは？ MySQLのスレーブサーバーでは my.cnfで
read_only設定をするとSUPER…]]></description><link>https://blog.hypermkt.jp/2015/2015-11-25-my-conf_readony/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2015/2015-11-25-my-conf_readony/</guid><pubDate>Wed, 25 Nov 2015 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;概要&lt;/h2&gt;
&lt;p&gt;某所でMySQLのスレーブサーバーを構築することになり、友人から
read_only権限について教えてもらったので改めて自分で調べなおしてみた。&lt;/p&gt;
&lt;h2&gt;read_onlyとは？&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;MySQLのスレーブサーバーでは&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;my.cnfで
read_only設定をするとSUPER権限を持つアカウント以外の更新クエリーは実行できなくなる&lt;/p&gt;
&lt;h3&gt;疑問&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;rootアカウントが書き込み権限を持つアカウントを発行しようとするとどうなるのか&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;予測1. 作成できない
予測2. SUPER権限有りで作成できる&lt;/p&gt;
&lt;h2&gt;検証環境&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Vagrant&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CentOS release 6.5 (Final)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Server version: 5.5.46 MySQL Community Server (GPL)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;テスト環境を用意した&lt;/h2&gt;
&lt;h3&gt;初期状態&lt;/h3&gt;
&lt;p&gt;mysql&gt; select * from user\G&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;************************** 1. row ***************************
Host: localhost
User: root
Password:
Select_priv: Y
Insert_priv: Y
Update_priv: Y
Delete_priv: Y
Create_priv: Y
Drop_priv: Y
Reload_priv: Y
Shutdown_priv: Y
Process_priv: Y
File_priv: Y
Grant_priv: Y
References_priv: Y
Index_priv: Y
Alter_priv: Y
Show_db_priv: Y
Super_priv: Y
Create_tmp_table_priv: Y
Lock_tables_priv: Y
Execute_priv: Y
Repl_slave_priv: Y
Repl_client_priv: Y
Create_view_priv: Y
Show_view_priv: Y
Create_routine_priv: Y
Alter_routine_priv: Y
Create_user_priv: Y
Event_priv: Y
Trigger_priv: Y
Create_tablespace_priv: Y
ssl_type:
ssl_cipher:
x509_issuer:
x509_subject:
max_questions: 0
max_updates: 0
max_connections: 0
max_user_connections: 0
plugin:
authentication_string:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;1 row in set (0.00 sec)&lt;/p&gt;
&lt;p&gt;mysql&gt; select * from db\G&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;************************** 1. row ***************************
Host: localhost
Db: root
User: root
Select_priv: Y
Insert_priv: Y
Update_priv: Y
Delete_priv: Y
Create_priv: Y
Drop_priv: Y
Grant_priv: N
References_priv: Y
Index_priv: Y
Alter_priv: Y
Create_tmp_table_priv: Y
Lock_tables_priv: Y
Create_view_priv: Y
Show_view_priv: Y
Create_routine_priv: Y
Alter_routine_priv: Y
Execute_priv: Y
Event_priv: Y
Trigger_priv: Y
1 row in set (0.00 sec)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;mysql&gt;&lt;/p&gt;
&lt;h3&gt;grant all privilegesのアカウントを作成する&lt;/h3&gt;
&lt;p&gt;この時点では
test_userアカウントは
hogeデータベースに対して全権限があるとしてアカウントは作成された。ここは普通なんだね。&lt;/p&gt;
&lt;p&gt;GRANT ALL PRIVILEGES ON hoge.* TO test_user@localhost;
SET PASSWORD FOR ‘test_user’@‘localhost’ = PASSWORD(‘fugafuga’);
flush privileges;&lt;/p&gt;
&lt;p&gt;mysql&gt; GRANT ALL PRIVILEGES ON hoge.* TO test_user@localhost;
Query OK, 0 rows affected (0.00 sec)&lt;/p&gt;
&lt;p&gt;mysql&gt; SET PASSWORD FOR ‘test_user’@‘localhost’ = PASSWORD(‘fugafuga’);
Query OK, 0 rows affected (0.00 sec)&lt;/p&gt;
&lt;p&gt;mysql&gt; flush privileges;
Query OK, 0 rows affected (0.00 sec)&lt;/p&gt;
&lt;p&gt;mysql&gt; select * from user\G&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;************************** 1. row ***************************
Host: localhost
User: root
Password:
Select_priv: Y
Insert_priv: Y
Update_priv: Y
Delete_priv: Y
Create_priv: Y
Drop_priv: Y
Reload_priv: Y
Shutdown_priv: Y
Process_priv: Y
File_priv: Y
Grant_priv: Y
References_priv: Y
Index_priv: Y
Alter_priv: Y
Show_db_priv: Y
Super_priv: Y
Create_tmp_table_priv: Y
Lock_tables_priv: Y
Execute_priv: Y
Repl_slave_priv: Y
Repl_client_priv: Y
Create_view_priv: Y
Show_view_priv: Y
Create_routine_priv: Y
Alter_routine_priv: Y
Create_user_priv: Y
Event_priv: Y
Trigger_priv: Y
Create_tablespace_priv: Y
ssl_type:
ssl_cipher:
x509_issuer:
x509_subject:
max_questions: 0
max_updates: 0
max_connections: 0
max_user_connections: 0
plugin:
authentication_string:&lt;/li&gt;
&lt;li&gt;************************** 2. row ***************************
Host: localhost
User: test_user
Password: *574991E975571281C22C99705978B14740B142B7
Select_priv: N
Insert_priv: N
Update_priv: N
Delete_priv: N
Create_priv: N
Drop_priv: N
Reload_priv: N
Shutdown_priv: N
Process_priv: N
File_priv: N
Grant_priv: N
References_priv: N
Index_priv: N
Alter_priv: N
Show_db_priv: N
Super_priv: N
Create_tmp_table_priv: N
Lock_tables_priv: N
Execute_priv: N
Repl_slave_priv: N
Repl_client_priv: N
Create_view_priv: N
Show_view_priv: N
Create_routine_priv: N
Alter_routine_priv: N
Create_user_priv: N
Event_priv: N
Trigger_priv: N
Create_tablespace_priv: N
ssl_type:
ssl_cipher:
x509_issuer:
x509_subject:
max_questions: 0
max_updates: 0
max_connections: 0
max_user_connections: 0
plugin:
authentication_string: NULL&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;2 rows in set (0.00 sec)&lt;/p&gt;
&lt;p&gt;mysql&gt; select * from db\G&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;************************** 1. row ***************************
Host: localhost
Db: hoge
User: test_user
Select_priv: Y
Insert_priv: Y
Update_priv: Y
Delete_priv: Y
Create_priv: Y
Drop_priv: Y
Grant_priv: N
References_priv: Y
Index_priv: Y
Alter_priv: Y
Create_tmp_table_priv: Y
Lock_tables_priv: Y
Create_view_priv: Y
Show_view_priv: Y
Create_routine_priv: Y
Alter_routine_priv: Y
Execute_priv: Y
Event_priv: Y
Trigger_priv: Y&lt;/li&gt;
&lt;li&gt;************************** 2. row ***************************
Host: localhost
Db: root
User: root
Select_priv: Y
Insert_priv: Y
Update_priv: Y
Delete_priv: Y
Create_priv: Y
Drop_priv: Y
Grant_priv: N
References_priv: Y
Index_priv: Y
Alter_priv: Y
Create_tmp_table_priv: Y
Lock_tables_priv: Y
Create_view_priv: Y
Show_view_priv: Y
Create_routine_priv: Y
Alter_routine_priv: Y
Execute_priv: Y
Event_priv: Y
Trigger_priv: Y
2 rows in set (0.00 sec)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;hogeデータベースにusersテーブルを作った&lt;/h3&gt;
&lt;p&gt;CREATE TABLE users (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB;&lt;/p&gt;
&lt;h2&gt;test_userでinsertを実行すると&lt;/h2&gt;
&lt;p&gt;insertが拒否された。なるほど、
read_onlyが有効になっているから更新系クエリーが実行できないということなんだね。&lt;/p&gt;
&lt;p&gt;[vagrant@db ~]$ mysql -utest_user -p -Dhoge
Enter password:
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A&lt;/p&gt;
&lt;p&gt;Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 5.5.46 MySQL Community Server (GPL)&lt;/p&gt;
&lt;p&gt;Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.&lt;/p&gt;
&lt;p&gt;Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.&lt;/p&gt;
&lt;p&gt;Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.&lt;/p&gt;
&lt;p&gt;mysql&gt; insert into users (id, name) values (1, ‘hoge’);
ERROR 1290 (HY000): The MySQL server is running with the —read-only option so it cannot execute this statement
mysql&gt;&lt;/p&gt;
&lt;h3&gt;my.cnfから&lt;/h3&gt;
&lt;p&gt;read_onlyを外したらinsert出来た&lt;/p&gt;
&lt;p&gt;設定が外れた瞬間普通に実行できる。&lt;/p&gt;
&lt;p&gt;[vagrant@db ~]$ mysql -utest_user -p -Dhoge
Enter password:
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A&lt;/p&gt;
&lt;p&gt;Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.5.46 MySQL Community Server (GPL)&lt;/p&gt;
&lt;p&gt;Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.&lt;/p&gt;
&lt;p&gt;Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.&lt;/p&gt;
&lt;p&gt;Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.&lt;/p&gt;
&lt;p&gt;mysql&gt; insert into users (id, name) values (1, ‘hoge’);
Query OK, 1 row affected (0.01 sec)&lt;/p&gt;
&lt;p&gt;mysql&gt;&lt;/p&gt;
&lt;h2&gt;結論&lt;/h2&gt;
&lt;p&gt;自分の予想は全て外れたｗ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;rootアカウントで&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;grant allのアカウント作成を実行すると、一般権限で
grant allなアカウントが作成される。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;但し&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;read_only設定につき更新系クエリーが実行できない。設定がなければ更新系クエリーが実行できる。&lt;/p&gt;
&lt;h3&gt;参考&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.mk-mode.com/octopress/2012/02/10/10002040/&quot;&gt;* MySQL - 一般ユーザにSUPER権限を付与！ - mk-mode BLOG&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[rbenv installする際にrdoc/ri生成を省略化してビルドを速くする]]></title><description><![CDATA[CONFIGURE_OPTS=“—disable-install-rdoc” rbenv install -v 2.2.3 と
CONFIGURE_OPTS=“—disable-install-rdoc”を追記することでrdocとriを省略することが出来ます。 CONFIGURE…]]></description><link>https://blog.hypermkt.jp/2015/2015-09-22-how-to-make-rbenv-install-faster/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2015/2015-09-22-how-to-make-rbenv-install-faster/</guid><pubDate>Tue, 22 Sep 2015 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;CONFIGURE_OPTS=“—disable-install-rdoc” rbenv install -v 2.2.3&lt;/p&gt;
&lt;p&gt;と
CONFIGURE_OPTS=“—disable-install-rdoc”を追記することでrdocとriを省略することが出来ます。&lt;/p&gt;
&lt;h3&gt;CONFIGURE_OPTSとは？&lt;/h3&gt;
&lt;p&gt;rubyビルドのパラメーターです。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/sstephenson/ruby-build#special-environment-variables&quot;&gt;sstephenson/ruby-build&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;CONFIGURE_OPTS lets you pass additional options to ./configure.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;上記によると
./configureにオプションを渡すことが出来ます。&lt;/p&gt;
&lt;h3&gt;—disable-install-rdocとは？&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://qiita.com/maangie/items/532809d78b4fade0d487&quot;&gt;How to install ruby without documentations - Qiita&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;configureオプションに
—disable-install-rdocを渡すことによりRDocの生成をやめるとのことです。&lt;/p&gt;
&lt;p&gt;Rdocの生成で画面がほぼ止まってしまい本当にビルドしているのかどうかわからない状況に良くなっていたのですが、これのおかげでその心配もなくなり助かります。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[旧バージョンのXcodeをダウンロードする方法]]></title><description><![CDATA[OSXの自動アップデート機能で誤ってXcodeまで最新バージョンにアップデートしてしまった。Swiftが登場してからXcodeのバージョンアップに応じてSwiftもバージョンアップにしており、XcodeをバージョンアップするたびにiOS…]]></description><link>https://blog.hypermkt.jp/2015/2015-09-22-旧バージョンのxcodeをダウンロードする方法/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2015/2015-09-22-旧バージョンのxcodeをダウンロードする方法/</guid><pubDate>Tue, 22 Sep 2015 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;OSXの自動アップデート機能で誤ってXcodeまで最新バージョンにアップデートしてしまった。Swiftが登場してからXcodeのバージョンアップに応じてSwiftもバージョンアップにしており、XcodeをバージョンアップするたびにiOSアプリが起動しなくなることがしばしばある。&lt;/p&gt;
&lt;p&gt;そこでXcodeの旧バージョンをダウンロードしたいことがあり都度ぐぐっていたがメモがてら記事にする。解決方法は簡単で下記のAppleの開発者向けサイトに旧バージョンのXcodeのファイルが有りいつでもダウンロードできる。ついつい忘れがちだがこれのおかげでいつも助かっている。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.apple.com/downloads/&quot;&gt;https://developer.apple.com/downloads/&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[capistrano3-unicornでunicornを起動しようとしてハマった]]></title><description><![CDATA[環境 capistrano (3.4.0) capistrano3-unicorn (0.2.1) したかったこと Capistranoでデプロイ時にunicornを再起動をする ハマったこと bundle exec cap production deploy…]]></description><link>https://blog.hypermkt.jp/2015/2015-08-14-failed-to-restart-unicorn-by-capistrano3-unicorn/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2015/2015-08-14-failed-to-restart-unicorn-by-capistrano3-unicorn/</guid><pubDate>Fri, 14 Aug 2015 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;環境&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;capistrano (3.4.0)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;capistrano3-unicorn (0.2.1)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;したかったこと&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Capistranoでデプロイ時にunicornを再起動をする&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;ハマったこと&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;bundle exec cap production deployしても&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;unicornがうんともすんとも言わない・・・。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;上記の問題解決後、再度実行したら“pid=’: Already running on PID:11705`エラーが発生して正常に再起動できない&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;log/unicorn.stderr.log&lt;/h3&gt;
&lt;p&gt;#{deploy_to}/shared/bundle/ruby/2.2.0/gems/unicorn-4.9.0/lib/unicorn/http_server.rb:206:in &lt;code class=&quot;language-text&quot;&gt;pid=&apos;: Already running on PID:11705 (or pid=/tmp/unicorn.pid is stale) (ArgumentError)
        from #{deploy_to}/shared/bundle/ruby/2.2.0/gems/unicorn-4.9.0/lib/unicorn/http_server.rb:135:in &lt;/code&gt;start’
from #{deploy_to}/shared/bundle/ruby/2.2.0/gems/unicorn-4.9.0/bin/unicorn:126:in &lt;code class=&quot;language-text&quot;&gt;&amp;lt;top (required)&gt;&apos;
        from #{deploy_to}/shared/bundle/ruby/2.2.0/bin/unicorn:23:in &lt;/code&gt;load’
from #{deploy_to}/shared/bundle/ruby/2.2.0/bin/unicorn:23:in `&lt;main&gt;’&lt;/p&gt;
&lt;h2&gt;問題１：unicornがうんともすんとも言わない&lt;/h2&gt;
&lt;p&gt;capistranoのデプロイログを見ても、unicornが起動されたログが全くなく完全に無視されているような状態だった。一旦
unicorn:startで直接起動しても、下記の通り何も起きなかった。&lt;/p&gt;
&lt;p&gt;$ bundle exec cap production unicorn:start
DEBUG [96aa134d] Running /usr/bin/env [ -d /usr/local/rbenv/versions/2.2.0 ] on
DEBUG [96aa134d] Command: [ -d /usr/local/rbenv/versions/2.2.0 ]
DEBUG [96aa134d] Finished in 2.405 seconds with exit status 0 (successful).&lt;/p&gt;
&lt;p&gt;原因はrole設定の不一致っだった orz capistrano3-unicornの
&lt;a href=&quot;https://github.com/tablexi/capistrano3-unicorn/blob/master/lib/capistrano3/tasks/unicorn.rake#L5&quot;&gt;unicorn.rake&lt;/a&gt;によるとデフォルトで
appになっているが、自分が設定した
config/deploy/production.rbでは
app以外を設定しており、そこがずれていたからだった。&lt;/p&gt;
&lt;h2&gt;問題２：Already running on PID&lt;/h2&gt;
&lt;p&gt;capistrano3-unicornの
restartタスクではまず
startタスクを実行し、起動していなければ起動、起動済みなら何もしないという順序になっている。ここで起動をしようとするとunicornが既に起動済みだよ！と怒られてしまう・・・。&lt;/p&gt;
&lt;p&gt;原因はまたしても設定の不一致だった orz
&lt;a href=&quot;https://github.com/tablexi/capistrano3-unicorn/blob/a4adb59031b001a9cd8f9dce5f4beb3200c80f8d/lib/capistrano3/tasks/unicorn.rake#L3&quot;&gt;unicorn.rake&lt;/a&gt;の
unicorn_pidに応じてpidファイルが作られるのだが、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;config/deploy/production.rb&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;set :unicorn_pid, ”#{shared_path}/tmp/pids/unicorn.pid”&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;config/unicorn/production.rb&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;/tmp/unicorn.pid&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;と全く別の場所を参照していたのだ・・・。こちらもsharedに合わせることで解決。&lt;/p&gt;
&lt;p&gt;地味な問題で数時間もハマってしまったが解決できてよかった。これでデプロイするたびにunicornが再起動してくれるので完璧だ。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Google Cloud Messaging for iOSの設定画面でAPNS証明書のアップロードにハマった]]></title><description><![CDATA[ここ数日Google Cloud Messaging for iOSの設定画面からApple Developer Centerから発行した開発・本番用のAPNs証明書をアップロードした際に下記エラーがずっと表示されて、本番側の証明書のアップロードに失敗していた。 error…]]></description><link>https://blog.hypermkt.jp/2015/2015-07-22-uploading-certificate-for-google-cloud-messaging-for-ios/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2015/2015-07-22-uploading-certificate-for-google-cloud-messaging-for-ios/</guid><pubDate>Wed, 22 Jul 2015 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;ここ数日Google Cloud Messaging for iOSの設定画面からApple Developer Centerから発行した開発・本番用のAPNs証明書をアップロードした際に下記エラーがずっと表示されて、本番側の証明書のアップロードに失敗していた。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2015/07/error-message-on-gcm.png&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2015/07/error-message-on-gcm.png&quot; alt=&quot;error-message-on-gcm&quot;&gt;&lt;/a&gt;The certificate environment did not match.
Ensure that you got the right development or production APNS certificate.&lt;/p&gt;
&lt;p&gt;エラー文言を見る限りでは証明書の環境がマッチしていないとのことで、何度も見なおしたが間違いなく本番の証明書であり、何度やり直してもずっと失敗していた・・・&lt;/p&gt;
&lt;p&gt;が、やっと原因が分かった。&lt;/p&gt;
&lt;p&gt;Apple Developer CenterのAPNS証明書を作成する画面をよく見直すと&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A separate certificate is required for each app you distribute.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;と書いてあり、別々の証明書（ここではCSR）が必要ですとのこと。そういえば、開発・本番のAPNS証明書を発行する際にどちらも同じCSRを利用していたが、どうやらこれが原因だということがわかった。MacのキーチェーンアクセスからCSRを発行しなおして、それを利用して本番側のAPNS証明書を発行しなおしたら&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2015/07/success-on-gcm.png&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2015/07/success-on-gcm.png&quot; alt=&quot;success-on-gcm&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;正常にアップロードすることができた。無事に解決。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Google Cloud Messaging for iOSのサンプルを試してみた]]></title><description><![CDATA[環境 MacOS X Yosemite 10.10.4 Xcode 6.4 iPhone5(実機。シュミレーターでは出来ません。) Google Cloud Messaging for iOSとは？ 無料 で利用できるプッシュ通知サービスです。 元々はAndroid…]]></description><link>https://blog.hypermkt.jp/2015/2015-07-19-tried-for-google-cloud-messaging-for-ios/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2015/2015-07-19-tried-for-google-cloud-messaging-for-ios/</guid><pubDate>Sun, 19 Jul 2015 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;環境&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;MacOS X Yosemite 10.10.4&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Xcode 6.4&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;iPhone5(実機。シュミレーターでは出来ません。)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Google Cloud Messaging for iOSとは？&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;無料&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;で利用できるプッシュ通知サービスです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;元々はAndroidのみの対応でしたが、2015年5月に行われたGoogle I/O 2015にてiOSの対応も発表されました。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;サンプルを試してみた&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.google.com/cloud-messaging/ios/start?hl=ja&amp;#x26;ver=swift&quot;&gt;公式サイト&lt;/a&gt;によると下記の手順となっています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;プロジェクトの用意&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;設定ファイルの用意&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;プロジェクトに設定ファイルを追加&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;サンプルを実行&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;では始めます。&lt;/p&gt;
&lt;h3&gt;プロジェクトの用意&lt;/h3&gt;
&lt;p&gt;上記の通り、実行すると下記となり。Xcodeが自動的に起動します。&lt;/p&gt;
&lt;p&gt;$ bundle exec pod try Google
Updating spec repositories&lt;/p&gt;
&lt;p&gt;CocoaPods 0.38.0 is available.
To update use: &lt;code class=&quot;language-text&quot;&gt;sudo gem install cocoapods&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;For more information see &lt;a href=&quot;http://blog.cocoapods.org&quot;&gt;http://blog.cocoapods.org&lt;/a&gt;
and the CHANGELOG for this version &lt;a href=&quot;http://git.io/BaH8pQ&quot;&gt;http://git.io/BaH8pQ&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Trying Google
1: Samples/admob/AdMobExample.xcodeproj
2: Samples/analytics/AnalyticsExample.xcodeproj
3: Samples/appinvites/AppInvitesExample.xcodeproj
4: Samples/gcm/GcmExample.xcodeproj
5: Samples/signin/SignInExample.xcodeproj
Which project would you like to open [1-5]?
4
Performing CocoaPods Installation&lt;/p&gt;
&lt;p&gt;CocoaPods 0.38.0 is available.
To update use: &lt;code class=&quot;language-text&quot;&gt;sudo gem install cocoapods&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;For more information see &lt;a href=&quot;http://blog.cocoapods.org&quot;&gt;http://blog.cocoapods.org&lt;/a&gt;
and the CHANGELOG for this version &lt;a href=&quot;http://git.io/BaH8pQ&quot;&gt;http://git.io/BaH8pQ&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Installing GGLInstanceID (1.0.0)
Installing Google (1.0.7)
Installing GoogleCloudMessaging (1.0.3)
Installing GoogleInterchangeUtilities (1.0.0)
Installing GoogleNetworkingUtilities (1.0.0)
Installing GoogleSymbolUtilities (1.0.0)
Installing GoogleUtilities (1.0.1)&lt;/p&gt;
&lt;p&gt;[!] Please close any current Xcode sessions and use &lt;code class=&quot;language-text&quot;&gt;GcmExample.xcworkspace&lt;/code&gt; for this project from now on.
Opening ‘/private/var/folders/_p/wq04phmd1x7g4clvhlxx_8zw0000gn/T/CocoaPods/Try/Google/Samples/gcm/GcmExample.xcworkspace’&lt;/p&gt;
&lt;h2&gt;設定ファイルの用意&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.google.com/mobile/add&quot;&gt;Enable Google Services for your app&lt;/a&gt;ページから取得できます。&lt;/p&gt;
&lt;p&gt;Pick a platformボタンを押します。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2015/07/gcm-01.png&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2015/07/gcm-01.png&quot; alt=&quot;gcm-01&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Cloud Messagingを選択して、
Generate configuration filesボタンを押します。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2015/07/gcm-02.png&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2015/07/gcm-02.png&quot; alt=&quot;gcm-02&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;開発用、本番用APNs証明書をアップロードする箇所が２箇所ありますが、サンプルを試すだけなので開発側だけでアップロードします。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2015/07/gcm-03.png&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2015/07/gcm-03.png&quot; alt=&quot;gcm-03&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;plistファイルができたらダウンロードして下さい。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2015/07/gcm-04.png&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2015/07/gcm-04.png&quot; alt=&quot;gcm-04&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;プロジェクトに設定ファイルを追加&lt;/h3&gt;
&lt;p&gt;ダウンロードした GoogleService-Info.plistファイルをドラッグアンドドロップでプロジェクトのルート直下に置きます。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2015/07/choose_options_for_adding_files.png&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2015/07/choose_options_for_adding_files.png&quot; alt=&quot;choose_options_for_adding_files&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2015/07/google-service.plist_.png&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2015/07/google-service.plist_.png&quot; alt=&quot;google-service.plist&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;実行前に調整&lt;/h3&gt;
&lt;p&gt;このまま実行すると下記エラーが発生してしまいます。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2015/07/IMG_4261.png&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2015/07/IMG_4261.png&quot; alt=&quot;IMG_4261&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;これを回避するためにBundle IdentiferをAPNs証明書を発行したBundle Identifierに修正し、またteamも正しいものに設定してください。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2015/07/bundle_id.png&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2015/07/bundle_id.png&quot; alt=&quot;bundle_id&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;サンプルを実行&lt;/h3&gt;
&lt;p&gt;再度サンプルを実行し直すと下記のようにGCMへの登録成功のメッセージが表示されます。Xcodeのログにトークンが記載されているのでメモしてください。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2015/07/IMG_4262.png&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2015/07/IMG_4262.png&quot; alt=&quot;IMG_4262&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;では次にプッシュ通知を送信する準備をします。TargetよりGcmServerDemoを選択し実行してください。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2015/07/gcm_server_demo.png&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2015/07/gcm_server_demo.png&quot; alt=&quot;gcm_server_demo&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;実行したらapiKeyと先ほどログから取得したRegistrationKeyを入力し、Send Notificationボタンを押してください。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2015/07/demo.png&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2015/07/demo.png&quot; alt=&quot;demo&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;しばらくすると実機に下記メッセージが送信されれば成功です。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2015/07/IMG_4263.png&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2015/07/IMG_4263.png&quot; alt=&quot;IMG_4263&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;自分用のまとめ記事につき、APNsの証明書の取得など省いてしまいわかりづらいところもあるかもしれませんが、Google Cloud Message for iOSを試される際はご参考にしてください。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Mac Yosemite上のChromeでショートカットのコピー＆ペーストをすると固まる問題の一時的回避法]]></title><description><![CDATA[YosemiteにアップグレードしてからChrome上でコピー（⌘+C）、ペースト（⌘+V）をするとレインボーマークが表示されて数秒待たさせる現象がかなりの頻度で発生するようにあった。 調べるとChronium側にもissue…]]></description><link>https://blog.hypermkt.jp/2015/2015-07-19-how-to-avoid-freezing-by-copy-and-paste-on-yosemite/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2015/2015-07-19-how-to-avoid-freezing-by-copy-and-paste-on-yosemite/</guid><pubDate>Sun, 19 Jul 2015 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;YosemiteにアップグレードしてからChrome上でコピー（⌘+C）、ペースト（⌘+V）をするとレインボーマークが表示されて数秒待たさせる現象がかなりの頻度で発生するようにあった。&lt;/p&gt;
&lt;p&gt;調べるとChronium側にもissueが立っていて問題が報告されているが、どうやら日本語のIMEが関係しており、日本人のみで問題が発生している様子。*&lt;a href=&quot;http://qiita.com/shrkw/items/9388301ad43f1cfe3f05&quot;&gt;Mac上のChromeでショートカットキーでコピー/ペーストをすると数秒待たされる問題 （未解決） - Qiita&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://code.google.com/p/chromium/issues/detail?id=473850&quot;&gt;Issue 473850 - chromium - Chrome hangs on copying/pasting text in a input field on Mac - An open-source project to help move the web forward. - Google Project Hosting&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;そこでYosemiteに標準でインストールされている日本語入力とChromeとの相性に問題があることがわかったので、
&lt;a href=&quot;https://www.google.co.jp/ime/&quot;&gt;Google日本語入力&lt;/a&gt;をインストールして試したところ、今のところ固まる問題は起きなくなった。あくまで一つの回避方法であり根本的な問題解決にはなってないが、１日に何十回と待たされるよりかはだいぶマシである。&lt;/p&gt;
&lt;p&gt;また懸念点としてGoogleにパスワードなどの入力内容が送信されているのでは？という心配するが、下記の通り公式で
&lt;a href=&quot;https://support.google.com/ime/japanese/answer/166771?hl=ja&quot;&gt;送信することはない&lt;/a&gt;と明言されているのでおそらく大丈夫。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;入力した文字や文章がGoogle に送信されることはありません。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;インストール時、またはプロパティ画面の[その他]タブにある[使用統計情報と障害レポート]のチェックボックスをオンにした場合には、お客さまがご利用のOS情報、カスタマイズ情報、打鍵数などの統計情報、クラッシュレポートがGoogleに送信されますが、ここでも、Google日本語入力を通じて入力された単語や文章が送信されることはありませんのでご安心ください。&lt;/p&gt;
&lt;p&gt;ということで、もし同様な問題に悩んでいる人がいたら、Google日本語入力を試してみてください。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[vagrant pluginをインストールしようとするとnokogiriエラーがでてインストールできない時の対策]]></title><description><![CDATA[下記エラーが表示された場合は$ vagrant plugin install vagrant-librarian-puppet
Installing the ‘vagrant-librarian-puppet’ plugin. This can take a few…]]></description><link>https://blog.hypermkt.jp/2014/2014-12-27-can-not-install-vagant-plugin-by-nokogiri/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2014/2014-12-27-can-not-install-vagant-plugin-by-nokogiri/</guid><pubDate>Sat, 27 Dec 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;下記エラーが表示された場合は$ vagrant plugin install vagrant-librarian-puppet
Installing the ‘vagrant-librarian-puppet’ plugin. This can take a few minutes…
Bundler, the underlying system Vagrant uses to install plugins,
reported an error. The error is shown below. These errors are usually
caused by misconfigured plugin installations or transient network
issues. The error from Bundler is:&lt;/p&gt;
&lt;p&gt;An error occurred while installing nokogiri (1.6.5), and Bundler cannot continue.
Make sure that &lt;code class=&quot;language-text&quot;&gt;gem install nokogiri -v &apos;1.6.5&apos;&lt;/code&gt; succeeds before bundling.&lt;/p&gt;
&lt;p&gt;普通にnokogiriをインストールしても対応できないので&lt;/p&gt;
&lt;p&gt;$ gem install —install-dir ~/.vagrant.d/gems nokogiri -v ‘1.6.5’&lt;/p&gt;
&lt;p&gt;でインストールしてあげればエラーが解消できます。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Swiftで本番・開発フラグを簡単に判別する方法]]></title><description><![CDATA[よくあるあるでしょうけど、APIのURLを本番と開発で切り替えたり、開発時のときだけAnalyticsを送信しない、ログを出力する等処理を切り替えたりする際に使用します。### 準備 まずはXcodeのBuild Settings -> Swift Compiler…]]></description><link>https://blog.hypermkt.jp/2014/2014-12-23-swiftで本番・開発フラグを簡単に判別する方法/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2014/2014-12-23-swiftで本番・開発フラグを簡単に判別する方法/</guid><pubDate>Tue, 23 Dec 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;よくあるあるでしょうけど、APIのURLを本番と開発で切り替えたり、開発時のときだけAnalyticsを送信しない、ログを出力する等処理を切り替えたりする際に使用します。### 準備&lt;/p&gt;
&lt;p&gt;まずはXcodeのBuild Settings -&gt; Swift Compiler - Custom Flags のDEBUG項目に
-D DEBUGを設定します。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/12/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2014-12-23-9.57.07.png&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/12/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2014-12-23-9.57.07.png&quot; alt=&quot;スクリーンショット 2014-12-23 9.57.07&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;環境クラスを用意&lt;/h3&gt;
&lt;p&gt;とても単純ですが下記クラスを追加します。&lt;/p&gt;
&lt;p&gt;class Environment {
class func isDevelopment() -&gt; Bool {
#if DEBUG
return true
#else
return false
#endif
}
}&lt;/p&gt;
&lt;h3&gt;使い方&lt;/h3&gt;
&lt;p&gt;if (Environment.isDevelopment) {
// 開発時はログを出力する
}&lt;/p&gt;
&lt;p&gt;他にもっと良いやり方もある気がするので、もうちょっと模索してみたいと思います。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[2014年iTunes Connectのサービス停止期間を発表！現地時間で12/22(月)-29(月)]]></title><description><![CDATA[https://developer.apple.com/news/?id=12082104a 毎年恒例との事ですがアプリ申請をしたことがなかったので全く知らなかった。上記によると*現地時間とは明記しないけど、過去のブログを見るとそうらしい 2014/12/22-2…]]></description><link>https://blog.hypermkt.jp/2014/2014-12-09-itunes-connect-holiday-shutdown/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2014/2014-12-09-itunes-connect-holiday-shutdown/</guid><pubDate>Tue, 09 Dec 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://developer.apple.com/news/?id=12082104a&quot;&gt;https://developer.apple.com/news/?id=12082104a&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;毎年恒例との事ですがアプリ申請をしたことがなかったので全く知らなかった。上記によると*現地時間とは明記しないけど、過去のブログを見るとそうらしい&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;2014/12/22-29はクリスマス（winter holidays)の為、iTunes Connectを停止する&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;もしアプリのリリース、価格変更をそれらの期間に行いたい場合は、12/18(木)までに申請、承認を終える事&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;今現在テスト中、プレリリース状態の場合は影響しない&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;売上、トレンド（？）レポートは継続しています&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;との事らしいです。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[XcodeでValidate時に「iTunes Store operation failed redundant binary upload」言われた場合の対策]]></title><description><![CDATA[09ed37cc-7d65-11e4-8fb4-35a1b1447c1a よく見ると詳細なエラーが表示されていた Redundant Binary Upload.There are already exists a binary upload build with ‘1’ for…]]></description><link>https://blog.hypermkt.jp/2014/2014-12-09-itunes-store-operation-failed-redundant-binary-upload/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2014/2014-12-09-itunes-store-operation-failed-redundant-binary-upload/</guid><pubDate>Tue, 09 Dec 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/12/09ed37cc-7d65-11e4-8fb4-35a1b1447c1a.png&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/12/09ed37cc-7d65-11e4-8fb4-35a1b1447c1a.png&quot; alt=&quot;09ed37cc-7d65-11e4-8fb4-35a1b1447c1a&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;よく見ると詳細なエラーが表示されていた&lt;/p&gt;
&lt;p&gt;Redundant Binary Upload.There are already exists a binary upload build with ‘1’ for versi
切れてしまっているがこれを訳すと&lt;/p&gt;
&lt;p&gt;バイナリーの重複アップロードです。既にVersion ‘1’としてビルドされたバイナリーが存在しています。&lt;/p&gt;
&lt;p&gt;実はアプリ申請の過程で既に一回バイナリーは送信済みで、時間があったので追加で修正を加えた物を再送信しようとしたのであった。Xcode側にもVersionが存在し、そこが1.0のままだからエラーとなったようだ。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/12/bd673c3a420b08828f8bdb1f266b878e.png&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/12/bd673c3a420b08828f8bdb1f266b878e.png&quot; alt=&quot;bd673c3a420b08828f8bdb1f266b878e&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;なのでそこを1.0.1にバージョンアップすることでValidateが通り。送信出来た。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[triph(トリフ)というiPhoneアプリをリリースしました]]></title><description><![CDATA[triph(トリフ)という散歩を旅行に変える音声ガイドiPhoneアプリをリリースしました。 triph_web_top triph…]]></description><link>https://blog.hypermkt.jp/2014/2014-10-20-released-triph-iphone-app/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2014/2014-10-20-released-triph-iphone-app/</guid><pubDate>Mon, 20 Oct 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;triph(トリフ)という散歩を旅行に変える音声ガイドiPhoneアプリをリリースしました。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/10/triph_web_top.png&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/10/triph_web_top.png&quot; alt=&quot;triph_web_top&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;triphでは浅草、渋谷の２エリアを選ぶ事ができ、指定エリア内のオススメ観光スポットを音声で紹介します。音声は同僚のウェブデザイナーが声優となり録音し、開発メンバーたちが実際に訪れたオススメのスポットを紹介します。また音楽には元プロギタリストの同僚が作曲してくれたとても心落ち着く音楽です。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/10/triph_1.png&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/10/triph_1.png&quot; alt=&quot;triph_1&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/10/triph_2.png&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/10/triph_2.png&quot; alt=&quot;triph_2&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/10/triph_3.png&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/10/triph_3.png&quot; alt=&quot;triph_3&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;無料アプリなので是非一度ダウンロードして音声ガイドを再生してみて下さい！&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://itunes.apple.com/jp/app/id926095175&quot;&gt;&lt;img src=&quot;https://triph.jp/appstore.svg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[DeployGateにテスターを追加する方法]]></title><description><![CDATA[前提 Apple Developer Programに契約済。但しテスターの人は不要。 対象アプリ用のDeployGateアカウントに登録済み。テスターアカウントは別途登録が必要。 流れ Apple Developer Program Devicesに対象iPhone…]]></description><link>https://blog.hypermkt.jp/2014/2014-10-19-how-to-add-a-tester-account-for-deploygate/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2014/2014-10-19-how-to-add-a-tester-account-for-deploygate/</guid><pubDate>Sun, 19 Oct 2014 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前提&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Apple Developer Programに契約済。但しテスターの人は不要。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;対象アプリ用のDeployGateアカウントに登録済み。テスターアカウントは別途登録が必要。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;流れ&lt;/h2&gt;
&lt;h3&gt;Apple Developer Program&lt;/h3&gt;
&lt;p&gt;Devicesに対象iPhoneを登録&lt;/p&gt;
&lt;p&gt;XCode &gt; Window &gt; Devicesから自分のiPhone端末を選択し、UUIDを取得します。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/10/1.png&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/10/1.png&quot; alt=&quot;1&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Apple Developer Program &gt; Member Center &gt; Certificates, Identifiers &amp;#x26; Profiles &gt; Certificates &gt; Devices all &gt; +（プラスマーク）を選択し、先ほど取得したUUIDを入力&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/10/2.png&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/10/2.png&quot; alt=&quot;2&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;登録成功すると一覧画面に表示されます。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/10/3.png&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/10/3.png&quot; alt=&quot;3&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;プロビジョニングプロファイルに対象デバイスを入れてプロビジョニングプロファイルをダウンロードし直す&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;DeployGate&lt;/h3&gt;
&lt;p&gt;アプリ用DeployGateにログイン後、テスター用DeployGateのアカウントのメールアドレスを入力して招待します。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/10/deploygate.png&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/10/deploygate.png&quot; alt=&quot;deploygate&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;iPhone&lt;/h3&gt;
&lt;p&gt;招待メールが届いたら、メール本文内のURLをクリックします。URLを開くと下記ページが表示されるので「DeployGateをインストール」をクリックします。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/10/01_install_deploy_gate.png&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/10/01_install_deploy_gate.png&quot; alt=&quot;01_install_deploy_gate&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;プロファイルのインストールが聞かれるのでそのままインストールします。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/10/02_install_deploy_gate_profile.png&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/10/02_install_deploy_gate_profile.png&quot; alt=&quot;02_install_deploy_gate_profile&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;インストールするとiPhone上にDeployGateアイコンが表示されます。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/10/03_deploy_gate_icon-e1413727212939.png&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/10/03_deploy_gate_icon-e1413727212939.png&quot; alt=&quot;03_deploy_gate_icon&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;DeployGateアイコンをタップするとアプリ一覧が表示され、これでアプリのダウンロードが出来るようになり準備完了です！&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/10/04_ready_to_download.png&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/10/04_ready_to_download.png&quot; alt=&quot;04_ready_to_download&quot;&gt;&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Rubygemsでライブラリを公開したので、手順をまとめる。]]></title><description><![CDATA[前提 gemspecは準備済み 流れ 1. rubygemsに会員登録 2. API KEYの登録 hypermktの箇所は自分のユーザー名 $ curl -u hypermkt https://rubygems.org/api/v1/api_key.yaml > ~/.gem…]]></description><link>https://blog.hypermkt.jp/2014/2014-10-10-rubygemsでライブラリを公開したので、手順をまとめる/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2014/2014-10-10-rubygemsでライブラリを公開したので、手順をまとめる/</guid><pubDate>Fri, 10 Oct 2014 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前提&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;gemspecは準備済み&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;流れ&lt;/h2&gt;
&lt;h3&gt;1. rubygemsに会員登録&lt;/h3&gt;
&lt;h3&gt;2. API KEYの登録&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;hypermktの箇所は自分のユーザー名&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$ curl -u hypermkt &lt;a href=&quot;https://rubygems.org/api/v1/api_key.yaml&quot;&gt;https://rubygems.org/api/v1/api_key.yaml&lt;/a&gt; &gt; ~/.gem/credentials; chmod 0600 ~/.gem/credentials
Enter host password for user ‘hypermkt’:
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
Dload  Upload   Total   Spent    Left  Speed
100    56    0    56    0     0     15      0 —:—:—  0:00:03 —:—:—    15&lt;/p&gt;
&lt;h3&gt;3.&lt;/h3&gt;
&lt;p&gt;rubygemsに
push。これで完了！&lt;/p&gt;
&lt;p&gt;$ bundle exec rake release
animemap-api-ruby 0.0.1 built to pkg/animemap-api-ruby-0.0.1.gem.
Tagged v0.0.1.
Pushed git commits and tags.
Pushed animemap-api-ruby 0.0.1 to rubygems.org.&lt;/p&gt;
&lt;h3&gt;地味にハマったエラー&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;エラー文言の通りGemfileに&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;rakeを入れれば解決&lt;/p&gt;
&lt;p&gt;$ bundle exec rake release
/Users/hypermkt/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/bundler-1.6.3/lib/bundler/rubygems_integration.rb:252:in &lt;code class=&quot;language-text&quot;&gt;block in replace_gem&apos;: rake is not part of the bundle. Add it to Gemfile. (Gem::LoadError)
    from /Users/hypermkt/.rbenv/versions/2.1.2/bin/rake:22:in &lt;/code&gt;&lt;main&gt;’&lt;/p&gt;</content:encoded></item><item><title><![CDATA[アニメ番組表APIから番組情報を取得するcomposer/gemを作った]]></title><description><![CDATA[わざわざgemやcomposerにするほどの実装でもないんだが、それよりもcomposer/gemを一から作り公開する手順が知りたかったので課題として実装してみました。あとTravis CIも使ってみたかったので。会社ではこれを使いIRC…]]></description><link>https://blog.hypermkt.jp/2014/2014-10-09-アニメ番組表apiから番組情報を取得するcomposergemを作っ/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2014/2014-10-09-アニメ番組表apiから番組情報を取得するcomposergemを作っ/</guid><pubDate>Thu, 09 Oct 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;わざわざgemやcomposerにするほどの実装でもないんだが、それよりもcomposer/gemを一から作り公開する手順が知りたかったので課題として実装してみました。あとTravis CIも使ってみたかったので。会社ではこれを使いIRCに今日放送予定のアニメ番組をアニメチャンネルにお昼の時間帯に通知しています。*&lt;a href=&quot;https://rubygems.org/gems/animemap-api-ruby&quot;&gt;https://rubygems.org/gems/animemap-api-ruby&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://packagist.org/packages/hypermkt/animemap-api-php&quot;&gt;https://packagist.org/packages/hypermkt/animemap-api-php&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;今回学んだ点は別記事でまとめたいと思います。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[homebrewパッケージを指定バージョンでインストールする]]></title><description><![CDATA[３回ぐぐったらまとめようルールにひかかったのでまとめます。 諸事情でMacの中に入っているmysqlのバージョンを落とす必要があったのでバージョンを下げる方法をまとめます。##まずインストール可能なバージョンを調べる brew versions #{package_name…]]></description><link>https://blog.hypermkt.jp/2014/2014-09-25-homebrew-install-specific-version-of-formula/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2014/2014-09-25-homebrew-install-specific-version-of-formula/</guid><pubDate>Thu, 25 Sep 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;３回ぐぐったらまとめようルールにひかかったのでまとめます。&lt;/p&gt;
&lt;p&gt;諸事情でMacの中に入っているmysqlのバージョンを落とす必要があったのでバージョンを下げる方法をまとめます。##まずインストール可能なバージョンを調べる&lt;/p&gt;
&lt;p&gt;brew versions #{package_name}でバージョンを調べます。ここでは
5.5.29をインストールしたいとします。&lt;/p&gt;
&lt;p&gt;$ brew versions mysql
Warning: brew-versions is unsupported and may be removed soon.
Please use the homebrew-versions tap instead:
&lt;a href=&quot;https://github.com/Homebrew/homebrew-versions&quot;&gt;https://github.com/Homebrew/homebrew-versions&lt;/a&gt;
5.6.19   git checkout 3d3d8ae /usr/local/Library/Formula/mysql.rb
5.6.17   git checkout e271c21 /usr/local/Library/Formula/mysql.rb
5.6.16   git checkout 34ad88d /usr/local/Library/Formula/mysql.rb
5.6.15   git checkout b8a121e /usr/local/Library/Formula/mysql.rb
5.6.14   git checkout dc5d10c /usr/local/Library/Formula/mysql.rb
5.6.13   git checkout dcc7f40 /usr/local/Library/Formula/mysql.rb
5.6.12   git checkout ed829a3 /usr/local/Library/Formula/mysql.rb
5.6.10   git checkout 48f7e86 /usr/local/Library/Formula/mysql.rb
5.5.29   git checkout 336c976 /usr/local/Library/Formula/mysql.rb
5.5.28   git checkout 5825f62 /usr/local/Library/Formula/mysql.rb
5.5.27   git checkout 93aecfa /usr/local/Library/Formula/mysql.rb
5.5.25a  git checkout faaa6c1 /usr/local/Library/Formula/mysql.rb
5.5.25   git checkout 5bcd1f3 /usr/local/Library/Formula/mysql.rb
5.5.24   git checkout a977fbd /usr/local/Library/Formula/mysql.rb
5.5.20   git checkout f4009ef /usr/local/Library/Formula/mysql.rb
5.5.19   git checkout c2b8e87 /usr/local/Library/Formula/mysql.rb
5.5.15   git checkout 513c0f8 /usr/local/Library/Formula/mysql.rb
5.5.14   git checkout a840c4a /usr/local/Library/Formula/mysql.rb
5.5.12   git checkout 35b60ca /usr/local/Library/Formula/mysql.rb
5.5.10   git checkout 1f2b24e /usr/local/Library/Formula/mysql.rb
5.1.56   git checkout feae63a /usr/local/Library/Formula/mysql.rb
5.1.55   git checkout 0476235 /usr/local/Library/Formula/mysql.rb
5.1.54   git checkout 7077f84 /usr/local/Library/Formula/mysql.rb
5.1.53   git checkout fbee3a0 /usr/local/Library/Formula/mysql.rb
5.1.52   git checkout 7871a99 /usr/local/Library/Formula/mysql.rb
5.1.51   git checkout 0fc5ce3 /usr/local/Library/Formula/mysql.rb
5.1.49   git checkout 2e7d624 /usr/local/Library/Formula/mysql.rb
5.1.48   git checkout 75def21 /usr/local/Library/Formula/mysql.rb
5.1.47   git checkout 9d73887 /usr/local/Library/Formula/mysql.rb
5.1.46   git checkout ee9ecec /usr/local/Library/Formula/mysql.rb
5.1.45   git checkout 1ca6b6b /usr/local/Library/Formula/mysql.rb
5.1.44   git checkout 052d1f2 /usr/local/Library/Formula/mysql.rb
5.1.43   git checkout c4decd7 /usr/local/Library/Formula/mysql.rb&lt;/p&gt;
&lt;h2&gt;対象Formulaファイル？のバージョンを下げます&lt;/h2&gt;
&lt;p&gt;git checkout 336c976 /usr/local/Library/Formula/mysql.rb&lt;/p&gt;
&lt;h2&gt;あとはインストールするだけです&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sh&quot;&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;$ brew &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; mysql
&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; Installing mysql dependency: cmake
&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; Downloading https://downloads.sf.net/project/machomebrew/Bottles/cmake-3.0.0.mavericks.bottle.tar.gz
&lt;span class=&quot;token comment&quot;&gt;### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ###  100.0%&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; Pouring cmake-3.0.0.mavericks.bottle.tar.gz&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[AWS ELBにSSL証明書を設定する方法]]></title><description><![CDATA[AWSのELB&EC2を利用してサイトを運用している場合に、SSLを設定する方法ですが調べた所、ELB側に対して証明書をアップロードする事により対応できるとの事でしたので対応方法をまとめました。 前提 Rapid SSLで証明書を購入済みの状態とする 設定方法 EC…]]></description><link>https://blog.hypermkt.jp/2014/2014-09-14-setup-ssl-for-aws-elb/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2014/2014-09-14-setup-ssl-for-aws-elb/</guid><pubDate>Sun, 14 Sep 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;AWSのELB&amp;#x26;EC2を利用してサイトを運用している場合に、SSLを設定する方法ですが調べた所、ELB側に対して証明書をアップロードする事により対応できるとの事でしたので対応方法をまとめました。&lt;/p&gt;
&lt;h2&gt;前提&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Rapid SSLで証明書を購入済みの状態とする&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;設定方法&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;EC2 =&gt; Load Balancers =&gt; Listnersをクリックする&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/09/step1.png&quot; alt=&quot;step1&quot;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;EditボタンをクリックするとListners変更画面が表示される&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/09/step2.png&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/09/step2.png&quot; alt=&quot;step2&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Load Balancer ProtocolのプルダウンよりHTTPS(Secure HTTP)を選択する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/09/step3.png&quot; alt=&quot;step3&quot;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;SSL CertificateのChangeボタンを押すとSSLのアップロード画面が表示される。*Private Keyの項目にCSR作成ツールで作成した秘密鍵を貼付ける&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Public Key Certificateに&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;「【通知】 SSL サーバ証明書発行完了のお知らせ」メールの
「SSLサーバ証明書（X.509形式）」の箇所を貼付ける&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Certificate Chainに&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;「【通知】 SSL サーバ証明書発行完了のお知らせ」メールの
中間証明書(INTERMEDIATE CA):を貼付ける&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SAVE（ボタン名を忘れました）をクリックして完了&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/09/step4.png&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/09/step4.png&quot; alt=&quot;step4&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;下記の完了画面が表示されたら設定完了です。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/09/step5.png&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/09/step5.png&quot; alt=&quot;step5&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SSLのFQDNをhttpsで表示すると正常に動作しているはずです。思っていた以上に簡単で拍子抜けでした。&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Mac(Mavericks)にphpenv+phpbuildでPHP5.6.0をインストールする]]></title><description><![CDATA[先日ついにPHP5.6.0が正式リリースし、同僚からも「ちゃんとPHP5.6.0をキャッチアップしてる？？」と煽られたので早速ローカル環境にPHP5.6.0をインストールします。 準備 phpenvをインストール php-buildをインストール PHP5.6.…]]></description><link>https://blog.hypermkt.jp/2014/2014-09-08-macmavericksにphpenvphpbuildでphp5-6-0をインストールする/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2014/2014-09-08-macmavericksにphpenvphpbuildでphp5-6-0をインストールする/</guid><pubDate>Mon, 08 Sep 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;先日ついにPHP5.6.0が正式リリースし、同僚からも「ちゃんとPHP5.6.0をキャッチアップしてる？？」と煽られたので早速ローカル環境にPHP5.6.0をインストールします。&lt;/p&gt;
&lt;h2&gt;準備&lt;/h2&gt;
&lt;h3&gt;phpenvをインストール&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;cd
git clone git://github.com/phpenv/phpenv.git .phpenv
echo &apos;export PATH=&quot;$HOME/.phpenv/bin:$PATH&quot;&apos; &gt;&gt; ~/.bash_profile
echo &apos;eval &quot;$(phpenv init -)&quot;&apos; &gt;&gt; ~/.bash_profile&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;php-buildをインストール&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;git clone git://github.com/CHH/php-build.git $HOME/.phpenv/plugins/php-build&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;PHP5.6.0のインストール&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ php-build 5.6.0 ~/.phpenv/versions/5.6.0
[Info]: Loaded apc Plugin.
[Info]: Loaded pyrus Plugin.
[Info]: Loaded xdebug Plugin.
[Info]: Loaded xhprof Plugin.
[Info]: php.ini-production gets used as php.ini
[Info]: Building 5.6.0 into /Users/#{username}/.phpenv/versions/5.6.0
[Downloading]: http://php.net/distributions/php-5.6.0.tar.bz2
[Preparing]: /var/tmp/php-build/source/5.6.0
[Compiling]: /var/tmp/php-build/source/5.6.0
[Pyrus]: Downloading from http://pear2.php.net/pyrus.phar
[Pyrus]: Installing executable in /Users/#{username}/.phpenv/versions/5.6.0/bin/pyrus
[XDebug]: Downloading http://xdebug.org/files/xdebug-2.2.5.tgz
[XDebug]: Compiling in /var/tmp/php-build/source/xdebug-2.2.5
[XDebug]: Installing XDebug configuration in /Users/#{username}/.phpenv/versions/5.6.0/etc/conf.d/xdebug.ini
[XDebug]: Cleaning up.
[Info]: Enabling Opcache...
[Info]: Done
[Info]: The Log File is not empty, but the Build did not fail. Maybe just warnings got logged. You can review the log in /tmp/php-build.5.6.0.20140907105041.log
[Success]: Built 5.6.0 successfully.&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;PHP5.6.0に切り替える&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;*   system (set by /Users/#{username}/.phpenv/version)
  5.6.0
$ phpenv local 5.6.0
phpenv v0.0.4-dev

5.6.0
$ phpenv rehash
$ php -v
PHP 5.6.0 (cli) (built: Sep  7 2014 10:59:24) 
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2014 Zend Technologies
    with Zend OPcache v7.0.4-dev, Copyright (c) 1999-2014, by Zend Technologies
    with Xdebug v2.2.5, Copyright (c) 2002-2014, by Derick Rethans&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[Tokyo Otaku Modeさんのサマーウォーズ上映会に行ってきた！]]></title><description><![CDATA[つっちー(
@hika69)のお誘いで
Tokyo Otaku Modeさんのサマーウォーズ上映会に参加してきました。 tokyo_otaku_mode_entrance…]]></description><link>https://blog.hypermkt.jp/2014/2014-09-02-tokyo-otaku-modeさんのサマーウォーズ上映会に行ってきた！/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2014/2014-09-02-tokyo-otaku-modeさんのサマーウォーズ上映会に行ってきた！/</guid><pubDate>Tue, 02 Sep 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;つっちー(
&lt;a href=&quot;https://twitter.com/hika69&quot;&gt;@hika69&lt;/a&gt;)のお誘いで
&lt;a href=&quot;http://otakumode.com/&quot;&gt;Tokyo Otaku Modeさん&lt;/a&gt;のサマーウォーズ上映会に参加してきました。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/09/tokyo_otaku_mode_entrance-e1409584706192.jpg&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/09/tokyo_otaku_mode_entrance-e1409584706192-225x300.jpg&quot; alt=&quot;tokyo_otaku_mode_entrance&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;他社のエンジニアや高校生エンジニアの方と一緒にサマーウォーズをがっつり視聴し、その後つきる事の無いアニメ話をしとても楽しかったです。食事、飲み物とごちそう頂きましてありがとうございました。&lt;/p&gt;
&lt;p&gt;とはいえ参加させていただきましたが、Tokyo Otaku Modeについて詳しく知らなかったのでこれを気に調べてみました。##Tokyo Otaku Modeとは？&lt;/p&gt;
&lt;p&gt;世界最大級の海外のオタク向けの情報配信しているサイトを運営しています。Facebookページとウェブページの２サイトがあり、Facebookページ側では日本のアニメ、漫画、オタク情報などを配信し、ウェブページ側ではオタク情報のニュース、ギャラリー、またユーザーさんが作成したイラストの商品販売をしているとのことです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;http://otakumode.com/&quot;&gt;Tokyo Otaku Mode::Web&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.facebook.com/tokyootakumode?fref=ts&quot;&gt;Tokyo Otaku Mode::Facebook&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;何ができるのか&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;自分の商品を海外向けに販売できる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;商品紹介などを英訳してくれる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;特設ページで宣伝してくれる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;国内外のメディアで宣伝してくれる&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;審査はあるようですが、スペシャルクリエイターとなると無料で上記をサポートしてくれるそうです。コミケなどで商品を販売している人には新たな販売チャンネルとして海外向けに既に市場のある場所で売る事出来るのでいいですね。&lt;/p&gt;
&lt;h2&gt;感想&lt;/h2&gt;
&lt;p&gt;いろんなウェブサービスやアプリを見てきたけど、日本人として日本の文化を誇りを持って海外に宣伝かつ販売し海外の人に喜んでもらえるサービスってすてきですね。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Macのvimでluaを有効にする方法]]></title><description><![CDATA[下記を実行後、vimを起動して
:versionの中に
+luaが入れば成功。brew install lua
brew reinstall vim —with-lua]]></description><link>https://blog.hypermkt.jp/2014/2014-09-02-macのvimでluaを有効にする方法/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2014/2014-09-02-macのvimでluaを有効にする方法/</guid><pubDate>Tue, 02 Sep 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;下記を実行後、vimを起動して
:versionの中に
+luaが入れば成功。brew install lua
brew reinstall vim —with-lua&lt;/p&gt;</content:encoded></item><item><title><![CDATA[YAPC Asia 2014 Tokyoに参加して]]></title><description><![CDATA[昨日は
YAPC Asia2014に初めて参加してきたので、感想などをまとめようと思う。##参加したトーク 突然ITインフラを任された人のための…監視設計入門 半端なPHPDisでPHPerに陰で笑われないためのPerl Monger向け最新PHP事情（5.…]]></description><link>https://blog.hypermkt.jp/2014/2014-08-31-yapc-asia-2014-tokyoに参加して/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2014/2014-08-31-yapc-asia-2014-tokyoに参加して/</guid><pubDate>Sun, 31 Aug 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;昨日は
&lt;a href=&quot;http://yapcasia.org/2014/&quot;&gt;YAPC Asia2014&lt;/a&gt;に初めて参加してきたので、感想などをまとめようと思う。##参加したトーク&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;http://yapcasia.org/2014/talk/show/d1eb4942-fdb5-11e3-b7e8-e4a96aeab6a4&quot;&gt;突然ITインフラを任された人のための…監視設計入門&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;http://yapcasia.org/2014/talk/show/a02d05e6-fead-11e3-b7e8-e4a96aeab6a4&quot;&gt;半端なPHPDisでPHPerに陰で笑われないためのPerl Monger向け最新PHP事情（5.6対応）&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;http://yapcasia.org/2014/talk/show/ce6e777e-fb91-11e3-b7e8-e4a96aeab6a4&quot;&gt;ほんとにあったスキーマの話 「ソーシャルゲーム」&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;http://yapcasia.org/2014/talk/show/e10a7e62-01ba-11e4-b7e8-e4a96aeab6a4&quot;&gt;Perl For (Non?) Perl Mongers&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;http://yapcasia.org/2014/talk/show/805806ba-0c6f-11e4-aec0-ad686aeab6a4&quot;&gt;Changing the tires on a moving car: a case study in upgrading legacy architecture&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;http://yapcasia.org/2014/talk/show/3a5f2a0e-ec3e-11e3-bd6d-c7a06aeab6a4&quot;&gt;Mobile Application Development for Perl Mongers [ninjinkun x gfx]&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;http://sssslide.com/speakerdeck.com/ninjinkun/mobile-app-development-for-perl-mongers&quot;&gt;Slide&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;http://yapcasia.org/2014/talk/show/adfd5cb8-01c1-11e4-9357-07b16aeab6a4&quot;&gt;趣味開発のためのクラウド/VPS活用術&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;突然ITインフラを任された人のための…監視設計入門&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;トークが始まる前に前説的な話があり暇せず開始まで待つ事が出来た&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;監視すべきレイヤー、内容を具体的な実装例をだして丁寧に説明してもらいとても分かりやすかった。そのまま参考書にして売れるのでは。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;発表途中や発表後に指名で質問したり、積極的に発表者の方が参加者の疑問点の伺う姿勢がとても素晴らしかった&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;半端なPHPDisでPHPerに陰で笑われないためのPerl Monger向け最新PHP事情（5.6対応）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;PHPの深い闇から最新の事情まで紹介&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;圧倒的なトーク力で爆笑の渦。こういうのって単に話が面白いからということではなく、技術的にちゃんと理解している人だから闇について説明が出来て指摘が出来るのですごい事だなって思った&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;PHPStormを紹介している話もあったが、自分も最近PHPStormを使い始めて、地味なエラーやtypoなど指摘してもらったり、入力保管が聞いたりと本当に便利ですね&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Mobile Application Development for Perl Mongers [ninjinkun x gfx]&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Frontend/Backendを二人で交互に発表し合うというスタイルはとても面白いですね。同じ会社同士ならありそうな話ですが、別の会社同士の人たちが外部のイベントでするというのがいいですね。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;アプリ開発においてエンジニアがUIデザインもすべきという点は同意。特にObjective-cにおいてはデザイナーではアニメーションを実装する事は難しいのでそこはプログラマーがデザイナー領域も担当しデザイナーと協力して実装するのが理想ですね&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Frilという有名なアプリでの具体的な問題点の解決法を紹介していて分かりやすかった&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CookPadでのアプリとウェブの開発事例が聞けてよかった。やっぱりアプリはgit flowがいいんですね。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Changing the tires on a moving car: a case study in upgrading legacy architecture&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;同時通訳レシーバーのおかげで日本語で聞けて良かった。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;正直内容については分からなかったが(英語という事ではなく、技術的に)、レガシーコードとちゃんと向き合い段階的に改善している点はとても大切だと思った。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;どこの会社やサービスにもテストがなかったり、バージョンが古かったりと問題をかかえている所は多いだろうけど、ちゃんとレガシーコードは改善しないとあとあと機能追加や運営が大変になるからね・・・。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;その他&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;OSS開発欲がすごい刺激された&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ということで参加できて本当に良かった。正直、参加者と見ていて、LTをしている人や運営者の人たちはとても大変そうだとは思ったが、少しうらやましい気もした。いつかあそこでLTできるようになりたいですね。明日からがんばるぞ！&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Mac(mavericks)にcpanmをインストールする]]></title><description><![CDATA[YAPC 2014 Tokyoに参加してPerl熱があがったので、cpanmコマンドが使いたくなったので、早速インストールしてみた*Downloading the standalone executable 上記サイトを参考にインストールしてみる $ cd /usr/bin…]]></description><link>https://blog.hypermkt.jp/2014/2014-08-30-macmavericksにcpanmをインストールする/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2014/2014-08-30-macmavericksにcpanmをインストールする/</guid><pubDate>Sat, 30 Aug 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;YAPC 2014 Tokyoに参加してPerl熱があがったので、cpanmコマンドが使いたくなったので、早速インストールしてみた*&lt;a href=&quot;http://search.cpan.org/~miyagawa/App-cpanminus-1.7004/lib/App/cpanminus.pm#Downloading_the_standalone_executable&quot;&gt;Downloading the standalone executable&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;上記サイトを参考にインストールしてみる&lt;/p&gt;
&lt;p&gt;$ cd /usr/bin
$ sudo curl -LOk &lt;a href=&quot;http://xrl.us/cpanm&quot;&gt;http://xrl.us/cpanm&lt;/a&gt;
Password:
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
Dload  Upload   Total   Spent    Left  Speed
100   216  100   216    0     0    367      0 —:—:— —:—:— —:—:—   367
0     0    0     0    0     0      0      0 —:—:— —:—:— —:—:—     0
0     0    0   131    0     0     67      0 —:—:—  0:00:01 —:—:—   209
100  262k  100  262k    0     0   100k      0  0:00:02  0:00:02 —:—:—  766k
$ ll | grep cpanm
-rw-r—r—   1 root   wheel    268417  8 30 14:10 cpanm
$ sudo chmod +x cpanm
$ cpanm
Usage: cpanm [options] Module […]&lt;/p&gt;
&lt;p&gt;Try &lt;code class=&quot;language-text&quot;&gt;cpanm --help&lt;/code&gt; or &lt;code class=&quot;language-text&quot;&gt;man cpanm&lt;/code&gt; for more options.&lt;/p&gt;
&lt;p&gt;と簡単にインストール完了！&lt;/p&gt;</content:encoded></item><item><title><![CDATA[grepコマンドの各オプションの使い方を調査した]]></title><description><![CDATA[書式 grep [オプション] [パターン] [ファイル名] オプション オプション 意味 -A NUM, —after-context NUM NUMで指定した行だけマッチした行の後に表示する -B NUM, —before-context NUM NUM…]]></description><link>https://blog.hypermkt.jp/2014/2014-08-27-grepコマンドの各オプションの使い方を調査した/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2014/2014-08-27-grepコマンドの各オプションの使い方を調査した/</guid><pubDate>Wed, 27 Aug 2014 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;書式&lt;/h2&gt;
&lt;p&gt;grep [オプション] [パターン] [ファイル名]&lt;/p&gt;
&lt;h2&gt;オプション&lt;/h2&gt;
&lt;p&gt;オプション&lt;/p&gt;
&lt;p&gt;意味&lt;/p&gt;
&lt;p&gt;-A NUM, —after-context NUM&lt;/p&gt;
&lt;p&gt;NUMで指定した行だけマッチした行の後に表示する&lt;/p&gt;
&lt;p&gt;-B NUM, —before-context NUM&lt;/p&gt;
&lt;p&gt;NUMで指定した行だけマッチした行の前に表示する&lt;/p&gt;
&lt;p&gt;-C, —contest&lt;/p&gt;
&lt;p&gt;NUMで指定した行だけマッチした行の前後に表示する&lt;/p&gt;
&lt;p&gt;-c, —count&lt;/p&gt;
&lt;p&gt;マッチした行数を表示する&lt;/p&gt;
&lt;p&gt;-e PATTERN, —regexp=PATTERN&lt;/p&gt;
&lt;p&gt;パターンを指定&lt;/p&gt;
&lt;p&gt;-E PATTERN, —extended-regexp=PATTERN&lt;/p&gt;
&lt;p&gt;拡張正規表現として扱う。egrepと同じ。&lt;/p&gt;
&lt;p&gt;-f FILE, —file=FILE&lt;/p&gt;
&lt;p&gt;パターンをファイルから一行ずつ読み込む。空ファイルの場合はパターンを含まないので何にもマッチしない。&lt;/p&gt;
&lt;p&gt;-G, —basic-regexp&lt;/p&gt;
&lt;p&gt;通常のgrepとして動作。基本正規表現として扱う。&lt;/p&gt;
&lt;p&gt;-H&lt;/p&gt;
&lt;p&gt;マッチした行の頭にファイル名を表示する&lt;/p&gt;
&lt;p&gt;-h, —no-filename&lt;/p&gt;
&lt;p&gt;ファイル名を表示しない。&lt;/p&gt;
&lt;p&gt;-i&lt;/p&gt;
&lt;p&gt;パターン、入力の両方で大文字小文字を区別しない case-sensitive=大文字小文字を区別するという意味&lt;/p&gt;
&lt;p&gt;-o, —only-matching&lt;/p&gt;
&lt;p&gt;マッチした箇所のみ表示する&lt;/p&gt;
&lt;p&gt;-q, —quiet, —silent&lt;/p&gt;
&lt;p&gt;標準出力を抑える&lt;/p&gt;
&lt;p&gt;-v, —invert-match&lt;/p&gt;
&lt;p&gt;結果を反転してマッチしなかった行のみ表示。invert=逆にする、反対にする&lt;/p&gt;
&lt;p&gt;-w, —word-regexp&lt;/p&gt;
&lt;p&gt;キーワードにマッチする行のみ表示する&lt;/p&gt;
&lt;p&gt;-Z&lt;/p&gt;
&lt;p&gt;zgrepとして動作&lt;/p&gt;
&lt;h2&gt;備考&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;正規表現には基本正規表現と拡張正規表現の２種類がある。オプションで正規表現を実行する際はどちらで評価されるのか注意する事&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;refs :&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;http://www.m-bsys.com/linux/sed-reg&quot;&gt;sed/grepコマンドの正規表現&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;例&lt;/h2&gt;
&lt;h3&gt;-B&lt;/h3&gt;
&lt;p&gt;$ grep -B 2 bird search.txt
dog
cat
bird&lt;/p&gt;
&lt;h3&gt;-C&lt;/h3&gt;
&lt;p&gt;$ grep -C 2 bird search.txt
dog
cat
bird
elephant
pig&lt;/p&gt;
&lt;h3&gt;-H&lt;/h3&gt;
&lt;p&gt;$ grep -H a *.txt
animals.txt:cat
animals.txt:elephant
animals.txt:zebra
fruits.txt:apple
fruits.txt:pineapple
fruits.txt:strawberry&lt;/p&gt;
&lt;h3&gt;-o&lt;/h3&gt;
&lt;p&gt;$ grep a animals.txt
cat
elephant
zebra
$ grep -o a animals.txt
a
a
a&lt;/p&gt;
&lt;h3&gt;-v&lt;/h3&gt;
&lt;p&gt;$ grep -v a animals.txt
dog
bird
pig
horse&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Mac(Mavericks)にJenkinsをインストールして起動する方法]]></title><description><![CDATA[JenkinsはJavaで書かれた継続的インテグレーションツールです。Jenkinsを利用する事でテストやデプロイなど日々の作業を自動化することができます。MacでJenkins…]]></description><link>https://blog.hypermkt.jp/2014/2014-08-25-macmavericksにjenkinsをインストールして起動する方法/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2014/2014-08-25-macmavericksにjenkinsをインストールして起動する方法/</guid><pubDate>Mon, 25 Aug 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;JenkinsはJavaで書かれた継続的インテグレーションツールです。Jenkinsを利用する事でテストやデプロイなど日々の作業を自動化することができます。MacでJenkinsを試したい場合は簡単にインストールする事が出来すぐに利用できるのでインストール＆起動方法をまとめます。##前提&lt;/p&gt;
&lt;p&gt;ソフトウェア&lt;/p&gt;
&lt;p&gt;バージョン&lt;/p&gt;
&lt;p&gt;OSX Mavericks&lt;/p&gt;
&lt;p&gt;10.9.3&lt;/p&gt;
&lt;p&gt;Java&lt;/p&gt;
&lt;p&gt;Java(TM) SE Runtime Environment (build 1.8.0_11-b12)&lt;/p&gt;
&lt;p&gt;Homebrew&lt;/p&gt;
&lt;p&gt;0.9.5&lt;/p&gt;
&lt;h2&gt;インストール&lt;/h2&gt;
&lt;h3&gt;ターミナルより以下コマンドを実行&lt;/h3&gt;
&lt;p&gt;brew install jenkins&lt;/p&gt;
&lt;h3&gt;Jenkinsを起動する&lt;/h3&gt;
&lt;p&gt;java -jar /usr/local/opt/jenkins/libexec/jenkins.war&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Swift勉強会 hosted by @nakajijapan from ペパボにLTで参加]]></title><description><![CDATA[#Swift勉強会 hosted by @nakajijapan from ペパボにLTで参加 資料 他LTの資料 トラウマ by @misyobun…]]></description><link>https://blog.hypermkt.jp/2014/2014-07-19-swift勉強会-hosted-by-nakajijapan-from-ペパボにltで参加/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2014/2014-07-19-swift勉強会-hosted-by-nakajijapan-from-ペパボにltで参加/</guid><pubDate>Sat, 19 Jul 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;#Swift勉強会 hosted by @nakajijapan from ペパボにLTで参加&lt;/p&gt;
&lt;h2&gt;資料&lt;/h2&gt;
&lt;h2&gt;他LTの資料&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.vagrantup.jp/entry/2014/07/19/105017&quot;&gt;トラウマ&lt;/a&gt; by&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/misyobun&quot;&gt;@misyobun&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;感想&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;今回も多数の参加者に参加頂いて、情報交換が出来てよかったです。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;初心者視点での発表という事になったが、そろそろ自信を持って自慢のネタなどを発表できるようになりたいですね。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[PHPMD(PHP Mess Detector)を使ってバグ検出2：変数命名編]]></title><description><![CDATA[前回の
に続いて今回は変数命名について調べました。PHPMD実行時のオプションで
namingを渡すことで下記をチェックしてくれます### 短すぎる変数名 メンバ変数 ローカル変数 引数 最小値 : 3文字 長過ぎる変数名 メンバ変数 ローカル変数 引数 最大値 : 2…]]></description><link>https://blog.hypermkt.jp/2014/2014-07-12-phpmdphp-mess-detectorを使ってバグ検出2：変数命名編/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2014/2014-07-12-phpmdphp-mess-detectorを使ってバグ検出2：変数命名編/</guid><pubDate>Sat, 12 Jul 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;前回の
&lt;a href=&quot;https://hypermkt-blog.lolipop.io/phpmdphp-mess-detector%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6%e3%83%90%e3%82%b0%e6%a4%9c%e5%87%ba%ef%bc%9a%e6%9c%aa%e4%bd%bf%e7%94%a8%e5%a4%89%e6%95%b0%e7%b7%a8/&quot;&gt;&lt;/a&gt;に続いて今回は変数命名について調べました。PHPMD実行時のオプションで
namingを渡すことで下記をチェックしてくれます### 短すぎる変数名&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;メンバ変数&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ローカル変数&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;引数&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;最小値 : 3文字&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;長過ぎる変数名&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;メンバ変数&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ローカル変数&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;引数&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;最大値 : 20文字&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;短すぎる関数名&lt;/h3&gt;
&lt;h3&gt;クラス名と同名の関数名の使用禁止&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;PHP4の時はクラス名と同名の関数名がコンストラクタとなりましたが、PHP5の場合コンストラクタは__constructになります。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;定数の大文字チェック&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;定数は大文字で宣言すべきなので、小文字だと指摘されます。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;getメソッドなのにboolean型を返そうとしている&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;boolean型の値を返したい場合はisXかhasXを利用すべきなので、getでboolean型を返そうとする場合は指摘されます。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ただしこのチェックは実際の関数の中をみるのではなくコメント欄と@return booleanをみているので、コメントが記述されていない場合はスルーされます。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;試してみる&lt;/h2&gt;
&lt;?php

class BadNaming {
    const bad_naming = 0;
    const GOOD_NAMING = 1;

    public $a;
    protected $toooooooooooooooooooooooooooooooLong;

    public function BadNaming() {
        // php4 style
    }

    public function a($d) {
        $e = &apos;Hello World&apos;;
        echo $e;
    }

    public function main() {

    }

    /**
     * Return a boolean
     *
     * @return boolean
     **/
    public function getFoo() {
        return true;
    }

    public function getBar() {
        return true;
    }
}

下記の通り注意されます。


$ ./vendor/bin/phpmd BadNaming.php text naming

BadNaming.php:4 Constant bad_naming should be defined in uppercase
BadNaming.php:7 Avoid variables with short names like $a. Configured minimum length is 3.
BadNaming.php:8 Avoid excessively long variable names like $toooooooooooooooooooooooooooooooLong. Keep variable name length under 20.
BadNaming.php:10    Classes should not have a constructor method with the same name as the class
BadNaming.php:14    Avoid variables with short names like $d. Configured minimum length is 3.
BadNaming.php:14    Avoid using short method names like BadNaming::a(). The configured minimum method name length is 3.
BadNaming.php:15    Avoid variables with short names like $e. Configured minimum length is 3.
BadNaming.php:28    The &apos;getFoo()&apos; method which returns a boolean should be named &apos;is...()&apos; or &apos;has...()&apos;</content:encoded></item><item><title><![CDATA[PHPMD(PHP Mess Detector)を使ってバグ検出：未使用変数編]]></title><description><![CDATA[バグがない世界に行けるものなら行きたいけど、そんな世界は残念ながら存在しないです。
ただバグを少なくすることは可能で今日はつまらないバグを未然に防ぐことが出来るツール
PHP Mess Detectorを見つけたので早速使ってみたのでまとめてみる。##PHP…]]></description><link>https://blog.hypermkt.jp/2014/2014-07-12-phpmdphp-mess-detectorを使ってバグ検出：未使用変数編/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2014/2014-07-12-phpmdphp-mess-detectorを使ってバグ検出：未使用変数編/</guid><pubDate>Sat, 12 Jul 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;バグがない世界に行けるものなら行きたいけど、そんな世界は残念ながら存在しないです。
ただバグを少なくすることは可能で今日はつまらないバグを未然に防ぐことが出来るツール
&lt;a href=&quot;http://phpmd.org/&quot;&gt;PHP Mess Detector&lt;/a&gt;を見つけたので早速使ってみたのでまとめてみる。##PHP Messdetectorとは？&lt;/p&gt;
&lt;p&gt;指定のソース、ディレクトリ内のPHPソースコードを解析し、バグの可能性になりうる箇所を検知しリストアップしてくれます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;命名ルール&lt;/li&gt;
&lt;li&gt;未使用変数、関数&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;などなど&lt;/p&gt;
&lt;h2&gt;インストール&lt;/h2&gt;
&lt;p&gt;下記２つを追加してcomposer installするだけでOK。注意点としては
pdepend/pdependに依存してくるので追記を忘れないこと。&lt;/p&gt;
&lt;p&gt;{
“require”: {
“phpmd/phpmd” : “1.4.*”,
“pdepend/pdepend” : “1.1.0”
}
}&lt;/p&gt;
&lt;h2&gt;使い方&lt;/h2&gt;
&lt;p&gt;下記形式に手動実行するだけで可能。&lt;/p&gt;
&lt;p&gt;./vendor/bin/phpmd #{対象ファイル名} #{結果の出力形式} #{チェック項目の種類}&lt;/p&gt;
&lt;h2&gt;使ってみる&lt;/h2&gt;
&lt;p&gt;下記のサンプルソースコードを使って一番分かりやすい未使用変数チェックをしてみる。&lt;/p&gt;
&lt;?php

class Hoge
{
    public $_publicUnused;
    protected $_protectedUnused;
    private $_privateUnused;

    public function pubicUnusedFunction()
    {
        $localUnused = &apos;Hello&apos;;
        $localUsed = &apos;World&apos;;
        echo $localUsed;
    }

    protected function protectedUnusedFunction($unused)
    {
    }

    private function privateUnusedFunction($used = &apos;howdy&apos;)
    {
        echo $used;
    }
}

実行してみたら見事に検知できた。テストで自分のプロジェクトのソースファイルに対して実行してみると未使用変数がいくつか見つかりぞっとした・・・。明らかに無駄なデータ取得してるよね・・・。


$ ./vendor/bin/phpmd Hoge.php text unusedcode

Hoge.php:7  Avoid unused private fields such as &apos;$_privateUnused&apos;.
Hoge.php:11 Avoid unused local variables such as &apos;$localUnused&apos;.
Hoge.php:16 Avoid unused parameters such as &apos;$unused&apos;.
Hoge.php:20 Avoid unused private methods such as &apos;privateUnusedFunction&apos;.


unusedcodeは下記の４項目をチェックしてくれる。この項目はどれもよくあるあるでとても分かりやすいし修正も簡単な例ですね。その反面コードの量が増えるとその中にまぎれてしまい見つかりにくくなるのでこういうのこそ機械的にPHPMDで検知してしまうのがいいですね。
refs : http://phpmd.org/rules/unusedcode.html


### 未使用privateメソッド



*  未使用のprivateメソッドを検出する。public/protecedは検出されない。


### 未使用privateメンバ変数



*  未使用のprivateメンバ変数を検出する。public/protecedは検出されない。


### 未使用ローカル変数



### 未使用引数


今回はPHPMDでunusedcodeオプションを使い未使用変数を検知してみたが他にもオプションがあるので調べてみよう。</content:encoded></item><item><title><![CDATA[CocoaPodsのDKAudioPlayerのバグ修正がマージされた]]></title><description><![CDATA[動画の取り方が分からなかったので分かりにくかったらすいません。 iPhoneアプリ開発で音声ファイルを簡単に再生でき、画面にプレイヤー表示が出来る
DKAudioPlayerというCocoaPodsライブラリがあります。 DKAudioPlayer…]]></description><link>https://blog.hypermkt.jp/2014/2014-07-07-cocoapodsのdkaudioplayerのバグ修正がマージされた/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2014/2014-07-07-cocoapodsのdkaudioplayerのバグ修正がマージされた/</guid><pubDate>Mon, 07 Jul 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;動画の取り方が分からなかったので分かりにくかったらすいません。&lt;/p&gt;
&lt;p&gt;iPhoneアプリ開発で音声ファイルを簡単に再生でき、画面にプレイヤー表示が出来る
&lt;a href=&quot;https://github.com/wzbozon/DKAudioPlayer&quot;&gt;DKAudioPlayer&lt;/a&gt;というCocoaPodsライブラリがあります。&lt;/p&gt;
&lt;p&gt;DKAudioPlayerのプレイヤーを表示させた場合、吹き出しで再生時間の現在値と最大値（例： 00:00 / 01:30）が表示されるのですが、プレイヤーを表示された直後になぜか
03:45 / 05:00と一瞬表示されてから音声ファイルの長さにそって
00:00 / 03:12と切り替わりとても不自然な挙動をしていました。&lt;/p&gt;
&lt;p&gt;調べたところ、initWithAudioFilePathで初期化時にラベル内に
03:45 / 05:00と設定しかつ吹き出しの位置も
03:45とベタでしていされていました。なので、初期化時に音声ファイル情報を渡しているのでそのデータに基づいて曲の長さを取得し、吹き出しの位置を調整した方が良さそうでしたのでそのように修正し、
&lt;a href=&quot;https://github.com/wzbozon/DKAudioPlayer/pull/4&quot;&gt;Pull Request&lt;/a&gt;を送ったところ先ほどマージされました。何気に外部の公開リポジトリに対してPRしたのも、マージされたのも初めてだったので嬉しかったです。これで少し便利になりました。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Macbook Pro 13-inch, Early 2001のメモリーを8Gに増設した]]></title><description><![CDATA[結構前から不満に思いつつも面倒がって放置気味でしたが、さすがにそろそろ我慢の限界に達したのでメモリーを増設しました。##メモリーの選び方 メモリーの仕様から該当するメモリーの仕様を調べ、Amazonから下記を購入しました。 増設の仕方 こちらのページに記載されています。
http…]]></description><link>https://blog.hypermkt.jp/2014/2014-06-21-macbook-pro-13-inch-early-2001のメモリーを8gに増設した/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2014/2014-06-21-macbook-pro-13-inch-early-2001のメモリーを8gに増設した/</guid><pubDate>Sat, 21 Jun 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;結構前から不満に思いつつも面倒がって放置気味でしたが、さすがにそろそろ我慢の限界に達したのでメモリーを増設しました。##メモリーの選び方&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://support.apple.com/kb/HT1270?viewlocale=ja_JP#link1&quot;&gt;メモリーの仕様&lt;/a&gt;から該当するメモリーの仕様を調べ、Amazonから下記を購入しました。&lt;/p&gt;
&lt;h2&gt;増設の仕方&lt;/h2&gt;
&lt;p&gt;こちらのページに記載されています。
&lt;a href=&quot;http://support.apple.com/kb/HT1270?viewlocale=ja_JP#link1&quot;&gt;http://support.apple.com/kb/HT1270?viewlocale=ja_JP#link1&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;必要な工具&lt;/h2&gt;
&lt;p&gt;下記のプラスドライバー #00で背面のねじを全て開ける事が出来ました。&lt;/p&gt;
&lt;h2&gt;ベンチマーク&lt;/h2&gt;
&lt;p&gt;左側側がメモリー追加前、右側が追加後です。まぁ・・・メモリーを4Gから8Gにしただけなので性能が向上する訳ではないですよねw よく見るとCPU、Memoryテスト共に下がってるw　体感的には今まであったもたつきが全て解消されて満足です。メモリー交換も思っていた以上に簡単にできるので、メモリー増設はオススメです。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/06/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2014-06-21-11.18.17.png&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/06/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2014-06-21-11.18.17-300x270.png&quot; alt=&quot;スクリーンショット 2014-06-21 11.18.17&quot;&gt;&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Swift文法まとめ 変数・配列・関数]]></title><description><![CDATA[SwiftのTipsはブログの記事にしても問題ないという確認が取れたので、自分の勉強用に理解したこと＆進捗用にまとめよう。 変数/定数 varで変数 letで定数 var now_count = 50
let MAX_COUNT = 100 コロン区切りで型宣言も可能 var…]]></description><link>https://blog.hypermkt.jp/2014/2014-06-10-swift文法まとめ-変数・配列・関数/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2014/2014-06-10-swift文法まとめ-変数・配列・関数/</guid><pubDate>Tue, 10 Jun 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;http://www.vagrantup.jp/entry/2014/06/10/003424&quot;&gt;SwiftのTipsはブログの記事にしても問題ない&lt;/a&gt;という確認が取れたので、自分の勉強用に理解したこと＆進捗用にまとめよう。&lt;/p&gt;
&lt;h2&gt;変数/定数&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;varで変数&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;letで定数&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;var now_count = 50
let MAX_COUNT = 100&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;コロン区切りで型宣言も可能&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;var number: Integer = 200&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;都度型宣言は不要。コンパイラーが自動的に推測する。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;型変換可能。型違いの値を結合しようとするとエラーになる。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;変数展開&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;()で変数展開ができる。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;バックスラッシュはMacの場合は&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Option + ¥で入力可能&lt;/p&gt;
&lt;p&gt;var numbers = 3
var answer = “I have (numbers) pens.”  =&gt; I have 3 pens.&lt;/p&gt;
&lt;h3&gt;配列&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ブラケット[]で指定する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;var fruits = [“apple”, “banana”, “melon”]&lt;/p&gt;
&lt;h3&gt;連想配列&lt;/h3&gt;
&lt;p&gt;var myHouse = [
“station”: “tokyo”,
“floor”: 3
]&lt;/p&gt;
&lt;h2&gt;関数&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;関数宣言に&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;funcを使用&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;引数の型指定が必要&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;-&gt;で返り値の型指定が必要&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;func sayHowdy(name:String) -&gt; String {
return “(name) Hello”
}
sayHowdy(“Steve”)&lt;/p&gt;
&lt;p&gt;と今日はここまで。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[CocoaPods Trunkを利用したライブラリの追加方法]]></title><description><![CDATA[CocoaPodsLogo Objective-Cの勉強を始めてまだ一ヶ月にも満たないのですが、CocoaPodsのPod…]]></description><link>https://blog.hypermkt.jp/2014/2014-05-26-cocoapods-trunkを利用したライブラリの追加方法/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2014/2014-05-26-cocoapods-trunkを利用したライブラリの追加方法/</guid><pubDate>Mon, 26 May 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/05/CocoaPodsLogo.gif&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/05/CocoaPodsLogo.gif&quot; alt=&quot;CocoaPodsLogo&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Objective-Cの勉強を始めてまだ一ヶ月にも満たないのですが、CocoaPodsのPodライブラリを開発＆公開してみたくなり、西暦から和暦に変換するライブラリを書いて公開しました。コード的には微妙な箇所が多いですが、まずはライブラリ公開をゴールとしたかったので改善は後回しとします。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/hypermkt/JapaneseCalendarYear&quot;&gt;JapaneseCalendarYear&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Podライブラリは今までGitHubのPull Requestで追加していたのですが、ちょうど一週間前より仕様変更がありまして、TrunkというAPIサービスを利用して追加する方式にかわりました。使ってみたのですが、驚くほど簡単でしたので公開方法についてまとめます。&lt;/p&gt;
&lt;h2&gt;CocoaPodsライブラリ登録までの流れ&lt;/h2&gt;
&lt;p&gt;初めて登録する場合は下記の通りとなります。1番、5番は２回目以降は不要となります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;pod lib create #{library_name}&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ライブラリの追加&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;.podspecファイルの修正&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;pod lib lint&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;pod trunk register #{email} #{your_name} —description=‘#{description_of_this_account}’&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;pod trunk push #{podspec_name_path}&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;それでは各コマンドについて説明します。&lt;/p&gt;
&lt;h2&gt;pod lib create #{library_name}&lt;/h2&gt;
&lt;p&gt;CocoaPodsライブラリのひな形を作ります。&lt;/p&gt;
&lt;p&gt;pod lib create
[!] A name for the Pod is required.&lt;/p&gt;
&lt;p&gt;Usage:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ pod lib create NAME [TEMPLATE_URL]

  Creates a scaffold for the development of a new Pod according to the CocoaPods
  best practices. If a `TEMPLATE_URL`, pointing to a git repo containing a
  compatible template, is specified, it will be used in place of the default one.&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Options:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;--silent    Show nothing
--verbose   Show more debugging information
--no-ansi   Show output without ANSI codes
--help      Show help banner of specified command&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;実行すると下記の構成でひな形が作成されます。Pod登録時に必須となるLICENSEファイルも自動で作られるのでおすすめです。&lt;/p&gt;
&lt;p&gt;$ pod lib create Foo
Cloning &lt;code class=&quot;language-text&quot;&gt;https://github.com/CocoaPods/pod-template.git&lt;/code&gt; into &lt;code class=&quot;language-text&quot;&gt;Foo&lt;/code&gt;.
Configuring Foo template.&lt;/p&gt;
&lt;p&gt;To learn more about the template see &lt;code class=&quot;language-text&quot;&gt;https://github.com/CocoaPods/pod-template.git&lt;/code&gt;.
To learn more about creating a new pod, see &lt;code class=&quot;language-text&quot;&gt;http://guides.cocoapods.org/making/making-a-cocoapod&lt;/code&gt;.
$ tree Foo/
Foo/
├── Assets
├── CHANGELOG.md
├── Classes
│   ├── ios
│   └── osx
├── Example
│   └── Podfile
├── Foo.podspec
├── LICENSE
├── README.md
└── Rakefile&lt;/p&gt;
&lt;p&gt;5 directories, 6 files&lt;/p&gt;
&lt;h2&gt;ライブラリの追加&lt;/h2&gt;
&lt;p&gt;Classes内に実装したヘッダー、実装ファイルを追加してコミットしてください。登録するファイルはコミットされていないと大正となりません。&lt;/p&gt;
&lt;h2&gt;.podspecファイルの修正&lt;/h2&gt;
&lt;p&gt;ライブラリの作成者やリポジトリの場所などの情報をまとめた.podspecファイルを修正します。下記は先日自分が公開した西暦から和暦に変換するPodライブラリの一例です。&lt;/p&gt;
&lt;p&gt;Pod::Spec.new do |s|
s.name         = “JapaneseCalendarYear”
s.version      = “0.0.1”
s.summary      = “Calculate japanese calendar year from current year.”
s.homepage     = ”&lt;a href=&quot;https://github.com/hypermkt&quot;&gt;https://github.com/hypermkt&lt;/a&gt;”
s.license      = “MIT”
s.author       = { “hypermkt” =&gt; ”#{email}” }
s.social_media_url   = ”&lt;a href=&quot;https://twitter.com/hypermkt&quot;&gt;https://twitter.com/hypermkt&lt;/a&gt;”
s.platform     = :ios
s.source       = { :git =&gt; ”&lt;a href=&quot;https://github.com/hypermkt/JapaneseCalendarYear.git&quot;&gt;https://github.com/hypermkt/JapaneseCalendarYear.git&lt;/a&gt;”, :tag =&gt; s.version.to_s }
s.source_files  = “Classes/*.{h,m}”
s.requires_arc = true
end&lt;/p&gt;
&lt;h2&gt;pod lib lint&lt;/h2&gt;
&lt;p&gt;Pod公開前にバリデーションチェックを行います。LICENSEファイルがあるか、.podspecファイルの文法は正しいか、リモートリポジトリは存在するかなどのチェックがされます。ソースコードはリモートリポジトリ基準となりますので、ローカルで修正したらpush後にlintしてください。&lt;/p&gt;
&lt;p&gt;pod lib lint&lt;/p&gt;
&lt;p&gt;-&gt; JapaneseCalendarYear (0.0.1)&lt;/p&gt;
&lt;p&gt;JapaneseCalendarYear passed validation.&lt;/p&gt;
&lt;h2&gt;pod trunk register #{email} #{your_name} —description=‘#{description_of_this_account}’&lt;/h2&gt;
&lt;p&gt;初回はユーザーアカウント登録が必要となるので、下記コマンドを実行します。&lt;/p&gt;
&lt;p&gt;pod trunk register #{email} hypermkt —description=‘My Laptop’
[!] Please verify the session by clicking the link in the verification email that has been sent to #{email}&lt;/p&gt;
&lt;p&gt;実行すると下記確認メールが登録メールアドレス宛に届きますので、確認用URLをクリックしてください。クリックすれば登録完了です。&lt;/p&gt;
&lt;p&gt;Hi hypermkt,&lt;/p&gt;
&lt;p&gt;Please confirm your registration with CocoaPods by clicking the following link:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://trunk.cocoapods.org/sessions/verify/#%7Bkey%7D&quot;&gt;https://trunk.cocoapods.org/sessions/verify/#{key}&lt;/a&gt;
If you did not request this you do not need to take any further action.&lt;/p&gt;
&lt;p&gt;Kind regards, the CocoaPods team&lt;/p&gt;
&lt;h2&gt;pod trunk push #{podspec_name_path}&lt;/h2&gt;
&lt;p&gt;pushコマンドでPodを登録します。驚くことに下記コマンドを１回実行するだけで完了です。&lt;/p&gt;
&lt;p&gt;pod trunk push JapaneseCalendarYear.podspec
Validating podspec
-&gt; JapaneseCalendarYear (0.0.1)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Data URL: &lt;a href=&quot;https://raw.githubusercontent.com/CocoaPods/Specs/9aed9c8857ec20f00f5cee8cfc73e68c502bfe70/Specs/JapaneseCalendarYear/0.0.1/JapaneseCalendarYear.podspec.json&quot;&gt;https://raw.githubusercontent.com/CocoaPods/Specs/9aed9c8857ec20f00f5cee8cfc73e68c502bfe70/Specs/JapaneseCalendarYear/0.0.1/JapaneseCalendarYear.podspec.json&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Log messages:
&lt;ul&gt;
&lt;li&gt;May 25th, 22:57: Push for `JapaneseCalendarYear 0.0.1’ initiated.&lt;/li&gt;
&lt;li&gt;May 25th, 22:57: Push for `JapaneseCalendarYear 0.0.1’ has been pushed (1.104098643 s).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;正常に処理されるとすぐにCocoaPods公式よりすぐにツイートされ、ライブラリがリポジトリに登録されます。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/05/%E5%88%9D%E3%83%84%E3%82%A4%E3%83%BC%E3%83%88.png&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/05/%E5%88%9D%E3%83%84%E3%82%A4%E3%83%BC%E3%83%88-300x60.png&quot; alt=&quot;初ツイート&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;実際にPodfileに記述してpod installするとインストールできた！！！&lt;/p&gt;
&lt;p&gt;pod install
Analyzing dependencies
Downloading dependencies
Installing JapaneseCalendarYear (0.0.1)
Generating Pods project
Integrating client project&lt;/p&gt;
&lt;p&gt;[!] From now on use &lt;code class=&quot;language-text&quot;&gt;test001.xcworkspace&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;と流れをまとめましたが、TrunkのおかげでPodライブラリの公開が全自動かつ即公開となりました。これからもTrunkを利用してPodライブラリをどんどん公開できるようがんばります！&lt;/p&gt;</content:encoded></item><item><title><![CDATA[スクレイピングをmod_dosdetector-forkで防ぐ方法]]></title><description><![CDATA[とある日、サーバーがやけに重いなーと思ってログを見た所、頑張ってスクレイピングをしている人がいた。その日のログの件数だけで18万件・・・。111.86.200.225 - - [18/Apr/2014:13:38:24 +0900] “GET /review/69804…]]></description><link>https://blog.hypermkt.jp/2014/2014-05-06-スクレイピングをmod_dosdetector-forkで防ぐ方法/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2014/2014-05-06-スクレイピングをmod_dosdetector-forkで防ぐ方法/</guid><pubDate>Tue, 06 May 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;とある日、サーバーがやけに重いなーと思ってログを見た所、頑張ってスクレイピングをしている人がいた。その日のログの件数だけで18万件・・・。111.86.200.225 - - [18/Apr/2014:13:38:24 +0900] “GET /review/698049/ HTTP/1.1” 200 8703 ”&lt;a href=&quot;http://www.anikore.jp/anime_review/4031/page:3&quot;&gt;http://www.anikore.jp/anime_review/4031/page:3&lt;/a&gt;” “Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:28.0) Gecko/20100101 Firefox/28.0”
111.86.200.225 - - [18/Apr/2014:13:38:19 +0900] “GET /anime_review/4031/page:3 HTTP/1.1” 200 15619 ”&lt;a href=&quot;http://www.anikore.jp/anime_review/4031/&quot;&gt;http://www.anikore.jp/anime_review/4031/&lt;/a&gt;” “Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:28.0) Gecko/20100101 Firefox/28.0”
111.86.200.225 - - [18/Apr/2014:13:38:19 +0900] “GET /review/555875/ HTTP/1.1” 200 10559 ”&lt;a href=&quot;http://www.anikore.jp/anime_review/4030/&quot;&gt;http://www.anikore.jp/anime_review/4030/&lt;/a&gt;” “Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:28.0) Gecko/20100101 Firefox/28.0”
111.86.200.225 - - [18/Apr/2014:13:38:20 +0900] “GET /review/715718/ HTTP/1.1” 200 10455 ”&lt;a href=&quot;http://www.anikore.jp/anime_review/4030/&quot;&gt;http://www.anikore.jp/anime_review/4030/&lt;/a&gt;” “Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:28.0) Gecko/20100101 Firefox/28.0”
111.86.200.225 - - [18/Apr/2014:13:38:20 +0900] “GET /review/611081/ HTTP/1.1” 200 9340 ”&lt;a href=&quot;http://www.anikore.jp/anime_review/4031/page:5&quot;&gt;http://www.anikore.jp/anime_review/4031/page:5&lt;/a&gt;” “Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:28.0) Gecko/20100101 Firefox/28.0”&lt;/p&gt;
&lt;p&gt;レビューサイトの宿命ではあるんだが、結構スクレイピングをされる事が多いです。どうせやるならバレないようにしてほしいんですが、一気にアクセスされるとさすがにサーバーに負荷がかかり、他のユーザーさんにも影響が出てしまうため、対策を行いました。&lt;/p&gt;
&lt;p&gt;スクレイピングもほぼDoS攻撃と連続アクセスという点では同じなので、DoS対策について調べました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;mod_security&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mod_evasive&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mod_dosdetector&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mod_dosdetector-fork&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;導入方法&lt;/h2&gt;
&lt;h3&gt;ビルド&lt;/h3&gt;
&lt;p&gt;ビルド自体は簡単。下記の通りすれば完了。&lt;/p&gt;
&lt;p&gt;git clone &lt;a href=&quot;mailto:git@github.com&quot;&gt;git@github.com&lt;/a&gt;:tkyk/mod_dosdetector-fork.git
cd /usr/local/src/mod_dosdetector-fork
make
make install&lt;/p&gt;
&lt;h3&gt;導入&lt;/h3&gt;
&lt;p&gt;ビルドしたモジュールをhttpd.confで読み込む&lt;/p&gt;
&lt;p&gt;LoadModule dosdetector_module /usr/lib64/httpd/modules/mod_dosdetector.so&lt;/p&gt;
&lt;p&gt;DoS対策をしたバーチャルホスト設定内に下記を追加。ポイントと下記の通りです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ローカルネットワーク内からのアクセスは全て除外する。定期的な監視スクリプトなどが走っているので。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;クローラーは除外する&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;画像、CSS、Javascriptなどはアクセスカウントの対象外とする&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;デフォルトでは favicon のコンテンツタイプは指定されていないので設定&lt;/h1&gt;
&lt;p&gt;AddType image/vnd.microsoft.icon .ico&lt;/p&gt;
&lt;h1&gt;検知を有効にする&lt;/h1&gt;
&lt;p&gt;DoSDetection On&lt;/p&gt;
&lt;h1&gt;DoS 攻撃の判定を行う時間を設定。（秒）&lt;/h1&gt;
&lt;p&gt;DoSPeriod 60&lt;/p&gt;
&lt;h1&gt;DoSPeriod の間にこの数だけアクセスがあれば DoS 攻撃の疑いありとみなし、環境変数 SuspectDoS を 1 にセットする。&lt;/h1&gt;
&lt;p&gt;DoSThreshold 50&lt;/p&gt;
&lt;h1&gt;DoSPeriod の間にこの数だけアクセスがあれば DoS 攻撃の疑いが強いとみなし、環境変数 SuspectHardDoS を 1 にセットする。&lt;/h1&gt;
&lt;p&gt;DoSHardThreshold 100&lt;/p&gt;
&lt;h1&gt;DoS 攻撃の疑いが設定されてから解除するまでの時間。（秒）&lt;/h1&gt;
&lt;p&gt;DoSBanPeriod 3600&lt;/p&gt;
&lt;h1&gt;クライアントの追跡記録を保存する数。多すぎるとその分リソースを消費する。&lt;/h1&gt;
&lt;p&gt;DoSTableSize 100&lt;/p&gt;
&lt;p&gt;SetEnvIf Request_URI “.(gif|jpe?g|ico|js|css|png)$” NoCheckDoS&lt;/p&gt;
&lt;p&gt;RewriteEngine On
RewriteCond %{ENV:SuspectHardDoS} =1
RewriteCond %｛REMOTE_ADDR｝ !^(127.0.0.1)$&lt;/p&gt;
&lt;h1&gt;クラスAのローカルIPアドレス帯を全て除外&lt;/h1&gt;
&lt;p&gt;RewriteCond %｛REMOTE_ADDR｝ !^(10.[0-9]+.[0-9].[0-9])$&lt;/p&gt;
&lt;h1&gt;クラスBのローカルIPアドレス帯を全て除外&lt;/h1&gt;
&lt;p&gt;RewriteCond %｛REMOTE_ADDR｝ !^(172.(1[6-9]|2[0-9]|3[0-1]).[0-9]+.[0-9]+)$&lt;/p&gt;
&lt;h1&gt;クラスCのローカルIPアドレス帯を全て除外&lt;/h1&gt;
&lt;p&gt;RewriteCond %｛REMOTE_ADDR｝ !^(192.168.[0-9]+.[0-9]+)$
RewriteCond %｛HTTP_USER_AGENT｝ !(google|yahoo|msn|bing) [NC]
RewriteRule .* - [R=503,L]
ErrorDocument 503 “Server is busy.”&lt;/p&gt;
&lt;p&gt;LogFormat ”%{SuspectHardDoS}e %h %l %u %t “%r” %&gt;s %b ”%{Referer}i” ”%{User-Agent}i&quot;&quot; dos_suspect
CustomLog “logs/dos_suspect_log” dos_suspect env=SuspectDoS&lt;/p&gt;
&lt;p&gt;あとはApacheをconfigtest &amp;#x26; gracefulすれば完了です。&lt;/p&gt;
&lt;h2&gt;運用後&lt;/h2&gt;
&lt;p&gt;運用後に気付いた点をまとめます。&lt;/p&gt;
&lt;h3&gt;クローラーがひっかかる&lt;/h3&gt;
&lt;p&gt;下記はbingの一例ですが、Googleクローラーも疑わしいアクセスとして検知されます。&lt;/p&gt;
&lt;p&gt;[Tue May 06 04:03:50 2014] [notice] mod_dosdetector: ‘157.55.33.26’ is suspected as DoS attack! (counter: 51)&lt;/p&gt;
&lt;p&gt;157.55.33.26 - - [06/May/2014:11:24:03 +0900] “GET /review/255621/ HTTP/1.0” 200 85004 ”-” “Mozilla/5.0 (compatible; bingbot/2.0; +&lt;a href=&quot;http://www.bing.com/bingbot.htm&quot;&gt;http://www.bing.com/bingbot.htm&lt;/a&gt;)”
157.55.33.26 - - [06/May/2014:11:24:13 +0900] “GET /review/683640/ HTTP/1.0” 200 38173 ”-” “Mozilla/5.0 (compatible; bingbot/2.0; +&lt;a href=&quot;http://www.bing.com/bingbot.htm&quot;&gt;http://www.bing.com/bingbot.htm&lt;/a&gt;)”&lt;/p&gt;
&lt;p&gt;もちろんクローラーをDoSアタックと検知し、拒否されてしまうとSEO対策的に好ましくないので、上記の設定時に各種クローラーは除外するようにし拒否しないようにします。&lt;/p&gt;
&lt;p&gt;RewriteCond %｛HTTP_USER_AGENT｝ !(google|yahoo|msn|bing) [NC]&lt;/p&gt;
&lt;h3&gt;怪しいアクセスを防いだ&lt;/h3&gt;
&lt;p&gt;ユーザーエージェントもなく連続アクセスっぽいアクセスがあったが、１０１アクセス目で503を返しており、拒否っています。あちら側も503を検知したのか急にアクセスが止まった。&lt;/p&gt;
&lt;p&gt;61.119.116.18 - - [06/May/2014:03:04:54 +0900] “GET /tag/%E8%85%90%E5%A5%B3%E5%AD%90%E5%90%91%E3%81%91/ HTTP/1.1” 200 20594 ”-” ”-”
61.119.116.18 - - [06/May/2014:03:04:55 +0900] “GET /tag/%E3%81%BB%E3%81%AE%E3%81%BC%E3%81%AE/ HTTP/1.1” 200 22122 ”-” ”-”
61.119.116.18 - - [06/May/2014:03:04:56 +0900] “GET /tag/%E9%80%86%E3%83%8F%E3%83%BC%E3%83%AC%E3%83%A0/ HTTP/1.1” 200 19831 ”-” ”-”
61.119.116.18 - - [06/May/2014:03:04:57 +0900] “GET /project/ HTTP/1.1” 200 5999 ”-” ”-”
61.119.116.18 - - [06/May/2014:03:04:57 +0900] “GET /terms_of_use/ HTTP/1.1” 200 9861 ”-” ”-”
61.119.116.18 - - [06/May/2014:03:04:58 +0900] “GET /guideline/ HTTP/1.1” 503 15 ”-” ”-”
61.119.116.18 - - [06/May/2014:03:04:58 +0900] “GET /privacy_policy/ HTTP/1.1” 503 15 ”-” ”-”
61.119.116.18 - - [06/May/2014:03:04:58 +0900] “GET /thank_ranking/ HTTP/1.1” 503 15 ”-” ”-”
61.119.116.18 - - [06/May/2014:03:04:58 +0900] “GET /contacts/ HTTP/1.1” 503 15 ”-” ”-”&lt;/p&gt;
&lt;p&gt;とまぁまだまだ様子見の段階ではありますが、概ね順調に動いております。これで次回スクレイピングやDoSアタックが来ても大丈夫！でありたい。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[ユーザーエージェント指定でアクセス拒否する方法]]></title><description><![CDATA[muninのグラフを眺めてたら、CPU使用率が普段の5倍になってて、なんじゃこりゃー！という事になりました。 2feb2e74972f961458c81faa3dc34b0e…]]></description><link>https://blog.hypermkt.jp/2014/2014-03-17-deny-from-user-agent/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2014/2014-03-17-deny-from-user-agent/</guid><pubDate>Mon, 17 Mar 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;muninのグラフを眺めてたら、CPU使用率が普段の5倍になってて、なんじゃこりゃー！という事になりました。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/03/2feb2e74972f961458c81faa3dc34b0e.png&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/03/2feb2e74972f961458c81faa3dc34b0e.png&quot; alt=&quot;2feb2e74972f961458c81faa3dc34b0e&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;状況を調べた所、スクレイピングツールでレビュー全件をスクレイピングしている輩がおりまして、うちのサイトも有名になったもんだと思いつつも、さすがにCPU負荷がサイトに影響を与えていたので、アクセス拒否をする事にしました。##Apacheで拒否&lt;/p&gt;
&lt;p&gt;Apacheでユーザーエージェント指定拒否する事が可能です。下記が実際のログでScrapyというツールを使ってアクセスしているのが分かります。&lt;/p&gt;
&lt;p&gt;xxx.xxx.xxx.xxx - - [14/Mar/2014:00:00:06 +0900] “GET /review/420085/ HTTP/1.1” 200 8750 ”&lt;a href=&quot;http://www.anikore.jp/anime_review/3753/page:33&quot;&gt;http://www.anikore.jp/anime_review/3753/page:33&lt;/a&gt;” “Scrapy/0.22.2 (+&lt;a href=&quot;http://scrapy.org&quot;&gt;http://scrapy.org&lt;/a&gt;
)”&lt;/p&gt;
&lt;p&gt;Apacheの
&lt;a href=&quot;http://httpd.apache.org/docs/2.2/mod/mod_setenvif.html#setenvif&quot;&gt;SetEnvIf&lt;/a&gt;ディレクティブを使って、環境変数を設定し、対象を拒否します。これでhttpd.confを保存後、configtest&amp;#x26;gracefulをすれば完了です。&lt;/p&gt;
&lt;p&gt;SetEnvIf User-Agent “Scrapy” deny_ua &amp;#x3C;= これを追加&lt;/p&gt;
&lt;p&gt;Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
Deny from env=deny_ua &amp;#x3C;= これを追加&lt;/p&gt;
&lt;h2&gt;Dev HTTP Clientで確認&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://chrome.google.com/webstore/detail/dev-http-client/aejoelaoggembcahagimdiliamlcdmfm&quot;&gt;Google Chrome AppのDev Http Client&lt;/a&gt;を使用して、httpリクエストを送信してテストしましょう。&lt;/p&gt;
&lt;h3&gt;通常の場合&lt;/h3&gt;
&lt;p&gt;Chromeのユーザーエージェントの場合は正常にアクセスできますね。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/03/dev-http-client-02.png&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/03/dev-http-client-02-300x134.png&quot; alt=&quot;dev-http-client-02&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Scrapyのリクエストの場合&lt;/h3&gt;
&lt;p&gt;先ほどのScrapyのアクセスログを元にユーザーエジェントを指定してアクセスしようとすると403 Forbiddenで拒否&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/03/dev-http-client.png&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/03/dev-http-client-300x120.png&quot; alt=&quot;dev-http-client&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;と、Scrapyから来た場合はちゃんと弾けているよというのが確認出来ましたので、これでデプロイしました。
まぁ正直言って、UserAgentが改ざんされてしまったらこれでは弾けないんですが、あくまで対策の一環という事で。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[vim7.4を一般ユーザーアカウント内にインストールする]]></title><description><![CDATA[vim-editor_logo 開発で利用している共用サーバーのvimのバージョンが古くroot権限でインストールし直そうか悩んでいた所、同僚から自分の一般ユーザーアカウント内に最新版のvim…]]></description><link>https://blog.hypermkt.jp/2014/2014-03-06-vim7-4を一般ユーザーアカウント内にインストールす/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2014/2014-03-06-vim7-4を一般ユーザーアカウント内にインストールす/</guid><pubDate>Sun, 16 Mar 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/03/vim-editor_logo.png&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/03/vim-editor_logo-300x300.png&quot; alt=&quot;vim-editor_logo&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;開発で利用している共用サーバーのvimのバージョンが古くroot権限でインストールし直そうか悩んでいた所、同僚から自分の一般ユーザーアカウント内に最新版のvimをインストールすればいいんじゃないですかと助言をもらった。&lt;/p&gt;
&lt;p&gt;自分のアカウント内にインストールすれば他のユーザーへの影響は全くなく好きなツールを利用する事が出来大変便利な方法なのでまとめる。&lt;/p&gt;
&lt;h2&gt;vim7.4をインストールする&lt;/h2&gt;
&lt;p&gt;$ mkdir temp
$ cd temp
$ wget ftp://ftp.vim.org/pub/vim/unix/vim-7.4.tar.bz2
$ tar jxvf vim-7.4.tar.bz2
$ cd vim74
$ mkdir patches
$ cd patches
$ curl -O ‘ftp://ftp.vim.org/pub/vim/patches/7.4/7.4.[001-192]’
$ cd ../
$ cat patches/7.4.* | patch -p0
$ ./configure —enable-multibyte —enable-xim —enable-fontset —with-features=big —prefix=$HOME
$ make &amp;#x26; make install&lt;/p&gt;
&lt;h2&gt;vimのバイナリを指定して起動&lt;/h2&gt;
&lt;p&gt;.bashrcを開く&lt;/p&gt;
&lt;p&gt;vim ~/.bashrc&lt;/p&gt;
&lt;p&gt;下記を追記する&lt;/p&gt;
&lt;p&gt;alias vim=’~/bin/vim’&lt;/p&gt;
&lt;p&gt;.bashrcを反映して完了！&lt;/p&gt;
&lt;p&gt;source ~/.bashrc&lt;/p&gt;
&lt;p&gt;できたー。ついパッケージインストール時はroot権限でやらなくちゃいけないという頭でいたけど、自分のアカウント内に好きなコマンドをいれられるのは便利ですね。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[サーバーの転送量の調べ方]]></title><description><![CDATA[ウェブサーバーの場合はApacheやNginxのログファイルにある転送量を合算すれば算出できるが、DBサーバーの場合はどうすればいいのか調べていた所、ifconfigコマンドでサーバーが起動してから転送量が分かるとの事。 RX bytesが受信パケットバイト数、TX bytes…]]></description><link>https://blog.hypermkt.jp/2014/2014-02-26-サーバーの転送量を調べる/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2014/2014-02-26-サーバーの転送量を調べる/</guid><pubDate>Wed, 26 Feb 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;ウェブサーバーの場合はApacheやNginxのログファイルにある転送量を合算すれば算出できるが、DBサーバーの場合はどうすればいいのか調べていた所、ifconfigコマンドでサーバーが起動してから転送量が分かるとの事。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;# ifconfig eth1
eth1      inet addr:xxx.xxx.xxx.xxx  Bcast:yyy.yyyy.yyy.yyy  Mask:255.255.255.192
          RX bytes:86505216487 (80.5 GiB)  TX bytes:658784079187 (613.5 GiB)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;RX bytesが受信パケットバイト数、TX bytesが送信パケットバイト数です。なのでサーバーから外部に放出された送信側の転送量をサーバーの起動日数で割れば１日あたりの平均転送量が算出できるという事ですね。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[ntpd monlist脆弱性の対策法]]></title><description><![CDATA[JPCERTよりntpdの脆弱性の報告があった NTP Project が提供する ntpd の一部のバージョンには、NTP サーバの状態を確認する機能 (monlist) が実装されており、同機能は遠隔からサービス運用妨害 (DDoS…]]></description><link>https://blog.hypermkt.jp/2014/2014-02-15-ntpd-monlist脆弱性の対策法/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2014/2014-02-15-ntpd-monlist脆弱性の対策法/</guid><pubDate>Sat, 15 Feb 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;http://www.jpcert.or.jp/at/2014/at140001.html&quot;&gt;JPCERTよりntpdの脆弱性&lt;/a&gt;の報告があった&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;NTP Project が提供する ntpd の一部のバージョンには、NTP サーバの状態を確認する機能 (monlist) が実装されており、同機能は遠隔からサービス運用妨害 (DDoS) 攻撃に使用される可能性があります。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;NTP は、通常 UDP を使用して通信するため、容易に送信元 IP アドレスを詐称することができます。また、monlist 機能は、サーバへのリクエストに対して大きなサイズのデータを送信元 IP アドレスへ返送するため、攻撃者は攻撃対象の IP アドレスを送信元 IP アドレスに偽装した問い合わせパケットをNTP サーバに送信することで、大きなサイズのデータを攻撃対象 (Web サイトなど) に送りつけることができます。&lt;/p&gt;
&lt;p&gt;ntpd 4.2.7p26 より前のバージョン
*) 安定版の 4.2.6.x は全て影響を受けます。&lt;/p&gt;
&lt;p&gt;全部ってことですね・・・&lt;/p&gt;
&lt;p&gt;バージョンを調べた所見事にビンゴ。&lt;/p&gt;
&lt;p&gt;対処方法としては&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;ntpdを停止する&lt;/li&gt;
&lt;li&gt;ntpdを起動させる場合は/etc/ntp.confにdisable monitorを記述してmonlist機能をOFFにする&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;とのことでした。&lt;/p&gt;
&lt;p&gt;考えた結果、そもそもntpdを常駐しておくほどの事もなく1日1回時間補正をしてくれればいいので、ntpdは停止し/etc/cron.daily/ntp.cronを追加し、毎朝時間補正をするようにしました。&lt;/p&gt;
&lt;p&gt;chefに下記を追加&lt;/p&gt;
&lt;p&gt;template “ntp.cron” do
path “/etc/cron.daily/ntp.cron”
owner “root”
group “root”
mode “755”
source “/etc/cron.daily/ntp.cron.erb”
end&lt;/p&gt;
&lt;p&gt;#!/bin/sh
/usr/sbin/ntpdate ntp.nict.jp&lt;/p&gt;
&lt;p&gt;runlistに追加して適用！終わり！&lt;/p&gt;</content:encoded></item><item><title><![CDATA[munin-nodeの複数の監視設定を一発で設定する方法]]></title><description><![CDATA[muninの監視項目を追加したい際に今まで下記のようにシンボリックリンクを手動で貼ってました。# ln -s /usr/share/munin/plugins/mysql_bytes /etc/munin/plugins/mysql_bytes ln -s /usr/share…]]></description><link>https://blog.hypermkt.jp/2014/2014-02-12-munin-nodeの複数の監視設定を一発で設定する方法/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2014/2014-02-12-munin-nodeの複数の監視設定を一発で設定する方法/</guid><pubDate>Wed, 12 Feb 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;muninの監視項目を追加したい際に今まで下記のようにシンボリックリンクを手動で貼ってました。# ln -s /usr/share/munin/plugins/mysql_bytes /etc/munin/plugins/mysql_bytes&lt;/p&gt;
&lt;h1&gt;ln -s /usr/share/munin/plugins/mysql_isam_space_ /etc/munin/plugins/mysql_isam_space_&lt;/h1&gt;
&lt;h1&gt;ln -s /usr/share/munin/plugins/mysql_queries /etc/munin/plugins/mysql_queries&lt;/h1&gt;
&lt;h1&gt;ln -s /usr/share/munin/plugins/mysql_slowqueries /etc/munin/plugins/mysql_slowqueries&lt;/h1&gt;
&lt;h1&gt;ln -s /usr/share/munin/plugins/mysql_threads /etc/munin/plugins/mysql_threads&lt;/h1&gt;
&lt;p&gt;手段としては間違っていないのですが、一個一個コマンドを実行して行くのはまー面倒い。会社の人にそんな事をつぶやいたら、munin-nodeに標準で梱包されているmunin-node-configureを使えば簡単かつ一発で設定出来ますよ！と教えてもらいました。&lt;/p&gt;
&lt;p&gt;まずは下記のようにsuggestオプションを利用する事で、現在利用中と設定可能な物を一覧で表示できます。Usedが現在設定中。Suggestionsがまだ未設定だけど設定可能というもの。&lt;/p&gt;
&lt;h1&gt;munin-node-configure -suggest&lt;/h1&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plugin&lt;/th&gt;
&lt;th&gt;Used&lt;/th&gt;
&lt;th&gt;Suggestions&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;acpi&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;no [cannot read []&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;amavis&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;apache_accesses&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;apache_processes&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;apache_volume&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;…ずらずら続く&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;設定可能な物を確認した後にshellオプションを利用すると設定用のシンボリックリンクを文字列で出力してくれます。これを一個一個実行すれば問題ないのですが、面倒いので一発で設定しちゃいます。&lt;/p&gt;
&lt;h1&gt;munin-node-configure -shell&lt;/h1&gt;
&lt;p&gt;ln -s ‘/usr/share/munin/plugins/apache_accesses’ ‘/etc/munin/plugins/apache_accesses’
ln -s ‘/usr/share/munin/plugins/apache_processes’ ‘/etc/munin/plugins/apache_processes’
ln -s ‘/usr/share/munin/plugins/apache_volume’ ‘/etc/munin/plugins/apache_volume’&lt;/p&gt;
&lt;p&gt;下記のようにパイプでシェルに渡してしまえば、上記のシンボリックリンクコマンドが全て実行され一発で監視設定を追加できます。&lt;/p&gt;
&lt;h1&gt;munin-node-configure -shell | sh&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;http://blog.glidenote.com/&quot;&gt;@glidenote&lt;/a&gt;先生、ありがとうございます！&lt;/p&gt;</content:encoded></item><item><title><![CDATA[mysqladmin flush-logsでlogrotateが出来ない！]]></title><description><![CDATA[mysql_logo なぜだ・・・なぜなんだー！ 事の発端はある日のAM4:00に発生したmysqldのメモリー超過でした。4:00ちょうどから急激に実メモリー、スワップメモリーが上昇しはじめ、一時間後あたりでOOMキラーでプロセスがkillされていました。調査した結果、cron…]]></description><link>https://blog.hypermkt.jp/2014/2014-02-02-mysqladmin-flush-logsでlogrotateが出来ない！/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2014/2014-02-02-mysqladmin-flush-logsでlogrotateが出来ない！/</guid><pubDate>Sun, 02 Feb 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/02/mysql_logo.png&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/02/mysql_logo-300x155.png&quot; alt=&quot;mysql_logo&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;なぜだ・・・なぜなんだー！&lt;/p&gt;
&lt;p&gt;事の発端はある日のAM4:00に発生したmysqldのメモリー超過でした。4:00ちょうどから急激に実メモリー、スワップメモリーが上昇しはじめ、一時間後あたりでOOMキラーでプロセスがkillされていました。調査した結果、cron.dailyでmysqlのログをlogrotateする際にpostrotateでmysqldを再起動していました。恐らく過去の経緯を考えるに毎朝メモリの解放をする為に再起動にしていたのかと思いますが、mysqldを毎朝再起動するというのもリスクが大きいです。本来、logrotateする際はflush logsでログを切り替えるのが正しいとの事なので早速設定してみた&lt;/p&gt;
&lt;h2&gt;/etc/logrotate.d/mysqld&lt;/h2&gt;
&lt;p&gt;まずはlogrotate.dディレクトリ内に設定ファイルを配置します。&lt;/p&gt;
&lt;p&gt;/var/log/mysql/*.log {
create 640 mysql mysql
notifempty
daily
rotate 60
missingok
compress
postrotate
# just if mysqld is really running
if test -x /usr/bin/mysqladmin &amp;#x26;&amp;#x26; &lt;br&gt;
/usr/bin/mysqladmin ping &amp;#x26;&gt;/dev/null
then
/usr/bin/mysqladmin flush-logs
fi
endscript
}&lt;/p&gt;
&lt;h2&gt;/root/.my.cnf&lt;/h2&gt;
&lt;p&gt;/etc/logrotate.d/mysqld とサンプルファイルによると下記の通りroot権限でmysqladminを操作する場合は/root/.my.cnfファイルを配置し、その中にmysqlのrootのパスワードを設定するようにと指示がありますのでその通りに設定します。&lt;/p&gt;
&lt;h1&gt;If the root user has a password you have to create a&lt;/h1&gt;
&lt;h1&gt;/root/.my.cnf configuration file with the following&lt;/h1&gt;
&lt;h1&gt;content:&lt;/h1&gt;
&lt;h1&gt;&lt;/h1&gt;
&lt;h1&gt;[mysqladmin]&lt;/h1&gt;
&lt;h1&gt;password = &lt;secret&gt;&lt;/h1&gt;
&lt;h1&gt;user= root&lt;/h1&gt;
&lt;h1&gt;&lt;/h1&gt;
&lt;h1&gt;where ”&lt;secret&gt;” is the password.&lt;/h1&gt;
&lt;h1&gt;&lt;/h1&gt;
&lt;h1&gt;ATTENTION: This /root/.my.cnf should be readable ONLY&lt;/h1&gt;
&lt;h1&gt;for root !&lt;/h1&gt;
&lt;p&gt;$ cat /root/.my.cnf
[mysqladmin]
password = #{password}
user= root&lt;/p&gt;
&lt;p&gt;$ chmod 600 .my.cnf&lt;/p&gt;
&lt;h2&gt;デバッグモードで動作を確認する&lt;/h2&gt;
&lt;p&gt;logrotate -dv /etc/logrotate.d/mysqld&lt;/p&gt;
&lt;h2&gt;手動実行してみた&lt;/h2&gt;
&lt;p&gt;下記コマンドで実行した所、/var/log/mysqld内の既存のログファイルは全て.gzに切り替わったけど、新規で作成されたクエリログ、エラーログ、スロークエリログが０バイトのまま何も書き込まれない。&lt;/p&gt;
&lt;p&gt;logrotate /etc/logrotate.d/mysqld&lt;/p&gt;
&lt;p&gt;はて、なぜに・・・&lt;/p&gt;
&lt;p&gt;もしかしてmysqladminが実行されてないのか？&lt;/p&gt;
&lt;p&gt;mysqladmin flush-logs&lt;/p&gt;
&lt;p&gt;を手動実行しても何も変わらず・・・&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;MySQL に新しいログ ファイルの使用を強制するには、mysqladmin flush-logs または mysqladmin refresh を使用するか、SQL コマンド FLUSH LOGS を使用します。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;とのこなとので、&lt;/p&gt;
&lt;p&gt;mysqladmin refresh&lt;/p&gt;
&lt;p&gt;を実行してもログが書き込まれず・・・&lt;/p&gt;
&lt;p&gt;なぜだー！&lt;/p&gt;
&lt;p&gt;mysqldを再起動するとログは切り替わるんだが・・・なんでだろう・・・。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Webサーバー複数台化への道のり::設計編]]></title><description><![CDATA[small__3595638270 概要 とあるレビューサイトではアクセスのピーク時間帯になるとサイト動作が全体的に遅くなる現象が長く続いていました。取り急ぎの改善としてはSQL、I/O…]]></description><link>https://blog.hypermkt.jp/2014/2014-01-25-webサーバー複数台化への道のり設計編/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2014/2014-01-25-webサーバー複数台化への道のり設計編/</guid><pubDate>Sat, 25 Jan 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/01/small__3595638270.jpg&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/01/small__3595638270-300x225.jpg&quot; alt=&quot;small__3595638270&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;概要&lt;/h2&gt;
&lt;p&gt;とあるレビューサイトではアクセスのピーク時間帯になるとサイト動作が全体的に遅くなる現象が長く続いていました。取り急ぎの改善としてはSQL、I/O負荷の高い処理の見直しをしてきましたが、あくまで局部的な修正に過ぎず、根本的な改善となりませんでした。&lt;/p&gt;
&lt;p&gt;PHPのパージョンアップ、ミドルウェアの導入などソフトウェアによる改善も検討しましたが、今回はハードウェアの強化を優先することにしウェアサーバーを一台から複数台に変更するすることにしました。このエントリーで懸念点、対策方法の設計についてまとめます。&lt;/p&gt;
&lt;h2&gt;複数台に伴う懸念点&lt;/h2&gt;
&lt;p&gt;実際Webサーバーの2台目以降を構築して、DNSラウンドロビンをして、ハイ終わり！とはならず、いろいろ既存の仕様の問題や疑問点が見つかりました&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;複数台への同時デプロイはどうすべきか&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;アップロード画像データのDB管理また複数台時の共有はどうすべきか&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;アップロード画像データの独自のサイズ変換機能&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sitemap.xmlなどの出力データの共有&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;PHPセッションはどうやって共有するのか&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;これを機にPHPや各種ミドルウェアのバージョンもすべきか&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;サーバー構築の手順書を作るのが大変だ&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;サーバー構築はどこでやるのか&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;サーバーが複数台になったらいちいち全台にsshするのはめんどい・・&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;監視はどうする？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;その他の独自仕様が‥&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;他にもあったような気もしましたが忘れました&lt;/p&gt;
&lt;h2&gt;解決方法&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;複数台サーバーへのデプロイ&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/01/capistrano1-e1388846470181.png&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/01/capistrano1-e1388846470181-300x89.png&quot; alt=&quot;capistrano1&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;画像管理とサイズ変換と共有方法&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/01/nginx2.png&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/01/nginx2-300x108.png&quot; alt=&quot;nginx2&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;画像サーバーを構築しそこでユーザーのアップロード画像を一括管理。またnginx+HttpImageFilterでリアルタイム画像変換&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Sitemap.xml&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/01/newrsynclogo.jpg&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/01/newrsynclogo-300x187.jpg&quot; alt=&quot;newrsynclogo&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;rsyncで常に同期&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;PHPセッションの共有&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/01/web-accelerators-memcached.jpg&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/01/web-accelerators-memcached-300x183.jpg&quot; alt=&quot;web-accelerators-memcached&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;PHPや各種ミドルウェアのバージョンアップもすべきか&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;しない。目的は複数台化でありバージョンアップではない。バージョンアップを新規構築分だけしてしまうと問題が起きた時に調査しずらい。あくまで既存のウェブサーバーを忠実に再現することが前提。今回はしないという意味で複数台化が終わってからやるべき。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;サーバー構築の手順書作りが大変&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/01/6521.OC_Chef_Logo-e1388648008381.png&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/01/6521.OC_Chef_Logo-300x236.png&quot; alt=&quot;Chef Logo&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;サーバー構築はどこでやるのか&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/01/logo_wide-cab47086.png&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/01/logo_wide-cab47086-300x82.png&quot; alt=&quot;logo_wide-cab47086&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;サーバーが複数台になったらいちいち全台にログインするのは面倒い・・・&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Knife Solo&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;監視&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/01/munin_logo_325x100.jpg&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/01/munin_logo_325x100-300x92.jpg&quot; alt=&quot;munin_logo_325x100&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;その他一台構成前提の独自仕様が‥&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;気合いで直す！&lt;/p&gt;
&lt;h2&gt;設計から約一年後‥&lt;/h2&gt;
&lt;p&gt;スタートから様々なイベントや既存の運用もあったので時間もかかりましたが、ほぼ想定通りに実装完了しました。リリース直後から様々な障害もありましたが(今もまだ残作業が残ってますが)、サーバー負荷は想定以上に下がり、体感的に早くなりました。正確には早くなったというより、負荷が下がったので重たい頻度が少なくなったというのが正しい表現かと思います。&lt;/p&gt;
&lt;p&gt;基本的には設計時にあげたソフトウェアは全て未経験なので手探り状態で始めたのでかなり時間がかかりましたがとても良い経験になりました。これも開発チームの協力あってのおかげです。&lt;/p&gt;
&lt;h2&gt;今後の予定&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;http://serverspec.org/&quot;&gt;serverspec&lt;/a&gt;を導入してテスト駆動インフラ構築をしたい&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;PHPのバージョンアップを・・・&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;次回以降は各対応でのまとめや経験した問題の解決方法などを公開したいと思います。ではでは&lt;/p&gt;
&lt;p&gt;PS&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;データセンター画像探しは&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;http://shop-pro.jp/news/131213_photo/&quot;&gt;これ&lt;/a&gt;を参考にしました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;photo credit:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/neospire/3595638270/&quot;&gt;NeoSpire&lt;/a&gt; via
&lt;a href=&quot;http://photopin.com&quot;&gt;photopin&lt;/a&gt;
&lt;a href=&quot;http://creativecommons.org/licenses/by/2.0/&quot;&gt;cc&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[ドキュメント管理ソフトウェア Confluenceのすすめ]]></title><description><![CDATA[logoConfluencePNG 概要 アプリケーションやウェブサイトの開発の際に仕様、キャンペーンの企画などをGitHub/TracのissueやWikiなどで管理するケースが多いと思います。ですが、GitHub/TracのWiki…]]></description><link>https://blog.hypermkt.jp/2014/2014-01-17-ドキュメント管理ソフトウェア-confluenceのすすめ/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2014/2014-01-17-ドキュメント管理ソフトウェア-confluenceのすすめ/</guid><pubDate>Fri, 17 Jan 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/01/logoConfluencePNG.png&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/01/logoConfluencePNG-300x78.png&quot; alt=&quot;logoConfluencePNG&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;概要&lt;/h2&gt;
&lt;p&gt;アプリケーションやウェブサイトの開発の際に仕様、キャンペーンの企画などをGitHub/TracのissueやWikiなどで管理するケースが多いと思います。ですが、GitHub/TracのWikiはどちらかと技術者向けのソフトウェアであり一般の人が使うには少しハードルが高いと感じています。またissueやticketは数が増えると埋もれてしまい探すのが手間です。&lt;/p&gt;
&lt;p&gt;そこで誰もが簡単に情報共有ができるドキュメント管理ソフトウェアのConfluence（コンフルエンス）の紹介をしたいと思います。Confluenceはオーストラリアのatlassian社が開発しているソフトウェアでその他にJIRA/Bitbucketなども開発している有名なソフトウェア会社です。とあるレビューサイトの仕様や施策の企画・結果等は全てConfluenceで管理しています。&lt;/p&gt;
&lt;h2&gt;Confluenceとは？&lt;/h2&gt;
&lt;p&gt;この動画をご覧ください。&lt;/p&gt;
&lt;h2&gt;Confluenceを使うメリット&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Markdown/Wiki記法など全く知らなくてもホームページ作成ソフトウェアのように操作が出来る。つまり一般的なITリテラシーがあれば誰でも使える。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コメント機能、メンション機能あり。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;各ドキュメントを階層階層構造で管理できる&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これだけでも十分なメリットだと思います。&lt;/p&gt;
&lt;h2&gt;契約&lt;/h2&gt;
&lt;p&gt;契約形態にオンデマンド型（ASP)とダウンロード型の２種類があります。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/01/conflucence_ondemand.png&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/01/conflucence_ondemand.png&quot; alt=&quot;conflucence_ondemand&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/01/conflucence_download.png&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/01/conflucence_download.png&quot; alt=&quot;conflucence_download&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;オンデマンド型は所謂ASPです。サーバー代は自腹となりますが、長期的に考えるとダウンロード版がお得でオススメです。特に小規模なチームなら１０ユーザー１０ドルなので、一回１０ドル払えばずっとConfluenceが使えます。&lt;/p&gt;
&lt;h2&gt;インストール方法&lt;/h2&gt;
&lt;p&gt;実際にインストールした時に履歴を記録していなかったので詳細は
&lt;a href=&quot;https://confluence.atlassian.com/display/DOC/Confluence+Setup+Guide&quot;&gt;こちら&lt;/a&gt;をご確認ください。英語のマニュアルですがこの通りに従えばインストールできます。&lt;/p&gt;
&lt;h2&gt;インストール先サーバーの要件&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://confluence.atlassian.com/display/DOC/Server+Hardware+Requirements+Guide&quot;&gt;Server Hardware Requirements Guide&lt;/a&gt;によると&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5 Concurrent Users&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;2GHz+ CPU&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;512MB RAM&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;5GB database space&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;とのことです。また
&lt;a href=&quot;https://confluence.atlassian.com/display/DOC/System+Requirements#SystemRequirements-ConfluenceHardwareRequirements&quot;&gt;システム要件&lt;/a&gt;によるとJava/PostgreSQLが必要との事なので共用レンタルサーバーでのインストールは難しいので、メモリ1G CPU Xeon 2.4Ghz*2 月額1000円のVPSにインストールしています。&lt;/p&gt;
&lt;h2&gt;最後に&lt;/h2&gt;
&lt;p&gt;アプリケーションやウェブサイトを開発する際は企画、開発、運用、改善のフローが周期があって成長して行きます。誰もが簡単にドキュメントが作成出来るConflunceを使えば、ディレクターからの施策の提案、開発者の仕様のまとめ、広告の成果などが全て一つにまとめられます。チーム内のスキルを高め、各種便利なツールを使えばWikiなどでも問題ないですが、もう一つの選択肢としてConflunceはオススメです！（回し者っぽいですね&lt;/p&gt;</content:encoded></item><item><title><![CDATA[サーバー時刻を自動的に補正する方法]]></title><description><![CDATA[サーバー時刻はあまり正確ではなく、少しずつずれていき、年間で約１０分ずれます。時刻がずれるとアプリやAIの動作に影響があるので必ず正確な時刻に補正しましょう。 今回はntpd…]]></description><link>https://blog.hypermkt.jp/2014/2014-01-12-サーバー時刻を自動的に補正する方法/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2014/2014-01-12-サーバー時刻を自動的に補正する方法/</guid><pubDate>Sun, 12 Jan 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;サーバー時刻はあまり正確ではなく、少しずつずれていき、年間で約１０分ずれます。時刻がずれるとアプリやAIの動作に影響があるので必ず正確な時刻に補正しましょう。&lt;/p&gt;
&lt;p&gt;今回はntpdを利用して自動的に補正します。##サーバー時刻がずれていることの問題点&lt;/p&gt;
&lt;p&gt;サーバー時刻がずれているといろいろヤバイです&lt;/p&gt;
&lt;p&gt;過去に自分が経験した事例としては&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;正確なログ調査ができない。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;複数台化構成で時刻がずれてるとデータの並び替えにずれが起きる(レコードのcreate_dateをnow()ではなく、アプリ側で日付を作り登録する仕様だとこうなります。)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;5〜10分近くずれるとAPIでエラーが起こることもある(前にRoute53で登録に失敗したことがあったような)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;などなど、とにかく単にログだけではなくアプリの動作にも影響する可能性もありますので、必ず正確な時刻に合わしておく必要があります。&lt;/p&gt;
&lt;h2&gt;Chefでntpを入れよう&lt;/h2&gt;
&lt;p&gt;cookbooks/ntp/recipes/default.rb&lt;/p&gt;
&lt;p&gt;%w{
ntp
}.each do |package|
package package do
action :install
end
end&lt;/p&gt;
&lt;p&gt;template “ntp.conf” do
path “/etc/ntp.conf”
owner “root”
group “root”
mode 0644
source “ntp.conf.erb”
notifies :restart, “service[ntpd]”
end&lt;/p&gt;
&lt;p&gt;service “ntpd” do
action [ :enable, :start]
supports :status =&gt; true,
:restart =&gt; true,
:reload =&gt; true
end&lt;/p&gt;
&lt;p&gt;cookbooks/ntp/templates/default/ntp.conf.erb
NTPサーバーは日本標準時刻にあわせるため、日本のサーバーを使用します。&lt;/p&gt;
&lt;h1&gt;Permit time synchronization with our time source, but do not&lt;/h1&gt;
&lt;h1&gt;permit the source to query or modify the service on this system.&lt;/h1&gt;
&lt;p&gt;restrict default kod nomodify notrap nopeer noquery
restrict -6 default kod nomodify notrap nopeer noquery&lt;/p&gt;
&lt;h1&gt;Permit all access over the loopback interface.  This could&lt;/h1&gt;
&lt;h1&gt;be tightened as well, but to do so would effect some of&lt;/h1&gt;
&lt;h1&gt;the administrative functions.&lt;/h1&gt;
&lt;p&gt;restrict 127.0.0.1
restrict -6 ::1&lt;/p&gt;
&lt;h1&gt;Hosts on local network are less restricted.&lt;/h1&gt;
&lt;p&gt;#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap&lt;/p&gt;
&lt;h1&gt;Use public servers from the pool.ntp.org project.&lt;/h1&gt;
&lt;h1&gt;Please consider joining the pool (&lt;a href=&quot;http://www.pool.ntp.org/join.html&quot;&gt;http://www.pool.ntp.org/join.html&lt;/a&gt;).&lt;/h1&gt;
&lt;p&gt;server -4 ntp.nict.jp
server -4 ntp1.jst.mfeed.ad.jp
server -4 ntp2.jst.mfeed.ad.jp
server -4 ntp3.jst.mfeed.ad.jp&lt;/p&gt;
&lt;p&gt;#broadcast 192.168.1.255 key 42     # broadcast server
#broadcastclient            # broadcast client
#broadcast 224.0.1.1 key 42     # multicast server
#multicastclient 224.0.1.1      # multicast client
#manycastserver 239.255.254.254     # manycast server
#manycastclient 239.255.254.254 key 42  # manycast client&lt;/p&gt;
&lt;h1&gt;Undisciplined Local Clock. This is a fake driver intended for backup&lt;/h1&gt;
&lt;h1&gt;and when no outside source of synchronized time is available.&lt;/h1&gt;
&lt;p&gt;server  127.127.1.0 # local clock
fudge   127.127.1.0 stratum 10&lt;/p&gt;
&lt;h1&gt;Drift file.  Put this in a directory which the daemon can write to.&lt;/h1&gt;
&lt;h1&gt;No symbolic links allowed, either, since the daemon updates the file&lt;/h1&gt;
&lt;h1&gt;by creating a temporary in the same directory and then rename()‘ing&lt;/h1&gt;
&lt;h1&gt;it to the file.&lt;/h1&gt;
&lt;p&gt;driftfile /var/lib/ntp/drift&lt;/p&gt;
&lt;h1&gt;Key file containing the keys and key identifiers used when operating&lt;/h1&gt;
&lt;h1&gt;with symmetric key cryptography.&lt;/h1&gt;
&lt;p&gt;keys /etc/ntp/keys&lt;/p&gt;
&lt;h1&gt;Specify the key identifiers which are trusted.&lt;/h1&gt;
&lt;p&gt;#trustedkey 4 8 42&lt;/p&gt;
&lt;h1&gt;Specify the key identifier to use with the ntpdc utility.&lt;/h1&gt;
&lt;p&gt;#requestkey 8&lt;/p&gt;
&lt;h1&gt;Specify the key identifier to use with the ntpq utility.&lt;/h1&gt;
&lt;p&gt;#controlkey 8&lt;/p&gt;
&lt;h2&gt;初回は手動で補正しよう&lt;/h2&gt;
&lt;p&gt;ntpdは時間がずれ過ぎているといきなり補正しないしようとのことなので、初回は手動で補正するのが早いです&lt;/p&gt;
&lt;p&gt;/etc/rc.d/init.d/ntpd stop
ntpdate ntp.nict.jp
/etc/rc.d/init.d/ntpd start&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Chefでソースコードからパッケージをインストールする方法]]></title><description><![CDATA[Chef Logo yumでインストールできるものは
package resourceで簡単にインストールできるのですが、稀にソースコードをmake installしてインストールしたいパッケージもあります。 その場合は
bash resource…]]></description><link>https://blog.hypermkt.jp/2014/2014-01-11-chefでソースコードからパッケージをインストール/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2014/2014-01-11-chefでソースコードからパッケージをインストール/</guid><pubDate>Sat, 11 Jan 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/01/6521.OC_Chef_Logo-e1388648008381.png&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/01/6521.OC_Chef_Logo-300x236.png&quot; alt=&quot;Chef Logo&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;yumでインストールできるものは
&lt;a href=&quot;http://docs.opscode.com/chef/resources.html#package&quot;&gt;package resource&lt;/a&gt;で簡単にインストールできるのですが、稀にソースコードをmake installしてインストールしたいパッケージもあります。&lt;/p&gt;
&lt;p&gt;その場合は
&lt;a href=&quot;http://docs.opscode.com/chef/resources.html#bash&quot;&gt;bash resource&lt;/a&gt;を使うことで対応可能です。下記のように記述することで、mod_fcgidのパッケージをダウンロードしてから解凍し、make&amp;#x26;make installが実行可能となります。&lt;/p&gt;
&lt;p&gt;bash “install mod_fcgid” do
user “root”
cwd “/usr/local/src”
not_if { File.exists?(“/usr/lib64/httpd/modules/mod_fcgid.so”) }
code &amp;#x3C;&amp;#x3C;-EOH
wget &lt;a href=&quot;http://ftp.meisei-u.ac.jp/mirror/apache/dist//httpd/mod_fcgid/mod_fcgid-2.3.9.tar.gz&quot;&gt;http://ftp.meisei-u.ac.jp/mirror/apache/dist//httpd/mod_fcgid/mod_fcgid-2.3.9.tar.gz&lt;/a&gt;
tar zxvf mod_fcgid-2.3.6.tar.gz
cd mod_fcgid-2.3.6
./configure.apxs
make
make install
EOH
end&lt;/p&gt;
&lt;p&gt;bash resourceを使ってパッケージをインストールする際に気をつけなくてはいけないのはpackage resourceと違って、インストール済みかどうかの判別を自分で記述する必要があります。今回の例ではnot_ifを使って、/usr/lib64/httpd/modules/mod_fcgid.soファイルが存在しなければインストールするという制御にしています。&lt;/p&gt;
&lt;p&gt;not_if { File.exists?(“/usr/lib64/httpd/modules/mod_fcgid.so”) }&lt;/p&gt;
&lt;p&gt;上記のとおりbash resourceを使えば指定のコマンドを順番に実行させることができるようにはなるのですが、環境に依存する可能性があるので極力使わないほうが良い気がしますね。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Gitでコミットする時にPHPの文法チェックを自動で行う方法]]></title><description><![CDATA[Git-Logo-1788C 必要な理由 typoや最低限の文法ミスの軽減が保証されて幸せになれます。 機能 git commit時に全PHPファイルに対して文法チェック(php -l…]]></description><link>https://blog.hypermkt.jp/2014/2014-01-09-gitでコミットする時にphpの文法チェックを自動で行/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2014/2014-01-09-gitでコミットする時にphpの文法チェックを自動で行/</guid><pubDate>Thu, 09 Jan 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/01/Git-Logo-1788C-e1388646507771.png&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/01/Git-Logo-1788C-300x125.png&quot; alt=&quot;Git-Logo-1788C&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;必要な理由&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;typoや最低限の文法ミスの軽減が保証されて幸せになれます。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;機能&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;git commit時に全PHPファイルに対して文法チェック(php -l)を行う&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;文法エラーがある場合はコミットを中止し、画面にエラーを表示する&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;参考資料&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/doloopwhile&quot;&gt;doloopwhileさん&lt;/a&gt;が作られた&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://gist.github.com/doloopwhile/5115016&quot;&gt;gist&lt;/a&gt;を自分仕様に変更しました&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;大変勉強になります！&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;使い方&lt;/h2&gt;
&lt;p&gt;gitにはコミットをフックに処理を実行させる事ができます。
&lt;a href=&quot;http://git-scm.com/book/ja/Git-%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-Git-%E3%83%95%E3%83%83%E3%82%AF&quot;&gt;詳しくはこちら&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;pre-commit&lt;/h3&gt;
&lt;p&gt;.git/hooks/pre-commitに下記を記述します。&lt;/p&gt;
&lt;h3&gt;post-commitファイルに実行権限を付与します。&lt;/h3&gt;
&lt;p&gt;$ chmod +x post-commit&lt;/p&gt;
&lt;p&gt;これで設定完了です。&lt;/p&gt;
&lt;h2&gt;使ってみましょう&lt;/h2&gt;
&lt;p&gt;セミコロンを付け忘れた場合。これでコミットしてみよう。&lt;/p&gt;
&lt;p&gt;phpinfo()
&amp;#x3C;/pre&lt;/p&gt;
&lt;p&gt;エラーがでてコミット出来ない！助かったー！となるわけですね。&lt;/p&gt;
&lt;p&gt;Parse error:  syntax error, unexpected $end in
/home/hoge/work/phpinfo.php on line
3&lt;/p&gt;
&lt;p&gt;Errors parsing /home/hoge/work/phpinfo.php&lt;/p&gt;
&lt;p&gt;いやー、便利ですねー。他にもvimのpluginで文法チェックする方法もありますのでお好みで。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[sshのポート番号を変更する方法]]></title><description><![CDATA[centos-transparent なぜ変更するのか sshの標準ポート番号の22番は一般的に知られた番号であり、そのままではSSHブルートフォースアタックの的となります。そのために、変更した方がより安全です。 変更方法 2222番に変更する手順をまとめます。 222…]]></description><link>https://blog.hypermkt.jp/2014/2014-01-08-sshのポート番号を変更する方法/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2014/2014-01-08-sshのポート番号を変更する方法/</guid><pubDate>Wed, 08 Jan 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/01/centos-transparent-e1389189582292.png&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/01/centos-transparent-300x114.png&quot; alt=&quot;centos-transparent&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;なぜ変更するのか&lt;/h2&gt;
&lt;p&gt;sshの標準ポート番号の22番は一般的に知られた番号であり、そのままではSSHブルートフォースアタックの的となります。そのために、変更した方がより安全です。&lt;/p&gt;
&lt;h2&gt;変更方法&lt;/h2&gt;
&lt;p&gt;2222番に変更する手順をまとめます。&lt;/p&gt;
&lt;h3&gt;2222番を解放する&lt;/h3&gt;
&lt;p&gt;/etc/sysconfig/iptablesに下記を追加します。&lt;/p&gt;
&lt;p&gt;-A INPUT -p tcp -m tcp  —dport 2222 -j ACCEPT&lt;/p&gt;
&lt;p&gt;追加したら再起動します。&lt;/p&gt;
&lt;p&gt;$ /etc/rc.d/init.d/iptables restart&lt;/p&gt;
&lt;h3&gt;sshdのポート番号を2222に変更する&lt;/h3&gt;
&lt;p&gt;もし既にPort番号の指定があれば2222に変更して下さい。指定がなければ下記を追加してください。&lt;/p&gt;
&lt;p&gt;Port 2222&lt;/p&gt;
&lt;p&gt;追加が完了したら再起動して反映させます。&lt;/p&gt;
&lt;p&gt;$ /etc/rc.d/init.d/sshd restart&lt;/p&gt;
&lt;p&gt;まずはこの時点で2222番ポートでssh接続が出来るか確認して下さい。&lt;/p&gt;
&lt;p&gt;$ ssh -p 2222 accout@hostname&lt;/p&gt;
&lt;h3&gt;22番を閉じる&lt;/h3&gt;
&lt;p&gt;下記を削除して再度iptablesを再起動したら作業完了です。&lt;/p&gt;
&lt;p&gt;-A INPUT -p tcp -m tcp  —dport 22 -j ACCEPT&lt;/p&gt;
&lt;p&gt;これで終わりです。作業的には難しくないのですが、事前にiptablesでポート番号を開けておかないとログインできなくなるので要注意です。&lt;/p&gt;
&lt;p&gt;PS
sshのロゴってないんですね・・・。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[複数サーバーでデータを同期する方法]]></title><description><![CDATA[newrsynclogo ウェブサーバーを複数台運用している場合、sitemap.xmlなどのデータを全ウェブサーバーで共有したい場合があります。 解決方法としては rsyncでファイルを定期的に転送 NFS とありますが、ちょっとしたファイル程度ならrsync…]]></description><link>https://blog.hypermkt.jp/2014/2014-01-06-複数サーバーでデータを同期する方法/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2014/2014-01-06-複数サーバーでデータを同期する方法/</guid><pubDate>Mon, 06 Jan 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/01/newrsynclogo.jpg&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/01/newrsynclogo-300x187.jpg&quot; alt=&quot;newrsynclogo&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ウェブサーバーを複数台運用している場合、sitemap.xmlなどのデータを全ウェブサーバーで共有したい場合があります。&lt;/p&gt;
&lt;p&gt;解決方法としては&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;rsyncでファイルを定期的に転送&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;NFS&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;とありますが、ちょっとしたファイル程度ならrsyncでデータを転送してしまうのが簡単です。&lt;/p&gt;
&lt;h2&gt;指定フォルダをリモートサーバーの特定の場所と同期する&lt;/h2&gt;
&lt;p&gt;下記を実行するとローカルの/var/www/html/sitemapにあるデータをリモート先（&lt;a href=&quot;mailto:hoge@192.168.xxx.xxx&quot;&gt;hoge@192.168.xxx.xxx&lt;/a&gt;）の/var/www/htmlにデータを再起的にパーミッション、オーナー、タイムスタンプを維持して転送します。また—deleteを指定する事でローカルのsitemap内のファイルが削除された場合、リモート先でも自動的に削除され完全に同期する事が出来ます。&lt;/p&gt;
&lt;p&gt;rsync -av —delete /var/www/html/sitemap &lt;a href=&quot;mailto:hoge@192.168.xxx.xxx&quot;&gt;hoge@192.168.xxx.xxx&lt;/a&gt;:/var/www/html&lt;/p&gt;
&lt;h2&gt;リモート先sshのポート番号を指定して同期する&lt;/h2&gt;
&lt;p&gt;rsync -av —delete -e “ssh -p 10022” /var/www/html/sitemap &lt;a href=&quot;mailto:hoge@192.168.xxx.xxx&quot;&gt;hoge@192.168.xxx.xxx&lt;/a&gt;:/var/www/html&lt;/p&gt;
&lt;p&gt;上記コマンドをシェルスクリプトにし、cronで定期的に実行する事でデータを同期する事が出来ます。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Apache httpd.confのBufferLogsでハマった話]]></title><description><![CDATA[Apache-Logo この設定のおかげで三時間近く悩みました。access_logの書き込みの挙動がやけに不規則で再起動をすると一気に書き込まれたりとおかしな〜とず〜と悩んでました。 友達に聞いた結果このBufferLogsが原因だと分かりました。 BufferLogs…]]></description><link>https://blog.hypermkt.jp/2014/2014-01-04-apache-httpd-confのbufferlogsにハマった話/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2014/2014-01-04-apache-httpd-confのbufferlogsにハマった話/</guid><pubDate>Sat, 04 Jan 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/01/Apache-Logo.png&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/01/Apache-Logo-300x206.png&quot; alt=&quot;Apache-Logo&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;この設定のおかげで三時間近く悩みました。access_logの書き込みの挙動がやけに不規則で再起動をすると一気に書き込まれたりとおかしな〜とず〜と悩んでました。&lt;/p&gt;
&lt;p&gt;友達に聞いた結果このBufferLogsが原因だと分かりました。&lt;/p&gt;
&lt;h2&gt;&lt;a href=&quot;http://www.apache.jp/manual/ja/mod/mod_log_config.html#bufferedlogs&quot;&gt;BufferLogs&lt;/a&gt;&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;BufferedLogs ディレクティブを使うと mod_log_config の挙動が変化して、 複数のログを書き出す際に、それぞれのリクエスト処理後毎に 書き出すのではなく、いったんメモリに蓄えてから、 まとめてディスクに書き出すようになります。 この結果ディスクアクセスがより効率的になり、 高いパフォーマンスの得られるシステムもあるでしょう。 このディレクティブはサーバ全体で一度だけ設定できます; バーチャルホストごとに設定することはできません。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;上記の通りBufferLogs Onだとログはリアルタイムで書き込まれず、一定量溜まるまで書き込まれない挙動に変わるとの事。&lt;/p&gt;
&lt;p&gt;なので、自分はアクセスログの書き込みが遅延してると勘違いしてましたが、遅延というのは間違いでした。&lt;/p&gt;
&lt;p&gt;説明の通りDisk/IOが減るのでサーバー負荷も下がるので設定はOnでも問題ないですね。&lt;/p&gt;
&lt;p&gt;いや〜、解決してよかった！&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Capistranoでポート番号が異なるサーバーにデプロイする方法]]></title><description><![CDATA[capistrano1 前提 Capistranoのssh_optionsのport設定は使用せず、基本的には22番ポートの接続を前提とします。 Capistranoのroleには22番ポートのサーバー、それ以外のポートのサーバーもまとめて記述。 1. ~/.ssh/config…]]></description><link>https://blog.hypermkt.jp/2014/2014-01-04-capistranoでポート番号が異なるサーバーにデプロイする/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2014/2014-01-04-capistranoでポート番号が異なるサーバーにデプロイする/</guid><pubDate>Sat, 04 Jan 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/01/capistrano1-e1388846470181.png&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/01/capistrano1-e1388846470181-300x89.png&quot; alt=&quot;capistrano1&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;前提&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Capistranoのssh_optionsのport設定は使用せず、基本的には22番ポートの接続を前提とします。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Capistranoのroleには22番ポートのサーバー、それ以外のポートのサーバーもまとめて記述。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;1. ~/.ssh/configに22番ポート以外の接続先別のポート番号指定を記述する&lt;/h2&gt;
&lt;p&gt;Host xxx.xxx.xxx.xxx
HostName xxx.xxx.xxx.xxx
Port 10022&lt;/p&gt;
&lt;h2&gt;2. リモート先の~/.ssh/configにGitHubへの接続ポートを指定する&lt;/h2&gt;
&lt;p&gt;実際のエラーをメモし忘れましたが、１番の対応のままデプロイをすると「GitHubに10022ポートで接続できないよ」というエラーが発生しデプロイに失敗します。それを正す為に下記でGitHubへの接続を22番ポートに強制します。&lt;/p&gt;
&lt;p&gt;Host github.com
HostName github.com
Port 22
User git&lt;/p&gt;
&lt;p&gt;これで複数台のサーバーの一部のポート番号が異なる場合でもCapistranoでデプロイ可能となります。
が、そもそもこのような例外対応をしなくてはいけない状況自体が問題なので、sshの接続ポートをまずは揃えた方が良いと思います。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[knife-soloを使ってリモートサーバーに対してChefを適用する]]></title><description><![CDATA[Chef Logo 概要 Chef-soloはサーバーにログインして実行する必要がありますが、管理するサーバー台数が増えてくると各サーバーに都度ログインしてChef Soloを実行するのが面倒くさくなりました。そこで管理サーバーとして大本のサーバーから各サーバーに対してChef…]]></description><link>https://blog.hypermkt.jp/2014/2014-01-02-knife-soloを使ってリモートサーバーに対してchefを適用す/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2014/2014-01-02-knife-soloを使ってリモートサーバーに対してchefを適用す/</guid><pubDate>Thu, 02 Jan 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/01/6521.OC_Chef_Logo-e1388648008381.png&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/01/6521.OC_Chef_Logo-300x236.png&quot; alt=&quot;Chef Logo&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;概要&lt;/h2&gt;
&lt;p&gt;Chef-soloはサーバーにログインして実行する必要がありますが、管理するサーバー台数が増えてくると各サーバーに都度ログインしてChef Soloを実行するのが面倒くさくなりました。そこで管理サーバーとして大本のサーバーから各サーバーに対してChef Soloが実行できるようにし、手間を減らします。&lt;/p&gt;
&lt;h2&gt;準備&lt;/h2&gt;
&lt;p&gt;デモなのでVagrantを使用します。同じ事を本番サーバーでも可能です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Vagrant 1.3.5&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Box:CentOS 5.8 x64&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;前提&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ruby 1.9.3がインストール済み&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;manageからwebに対して鍵無しログインが可能&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Vagrantfile&lt;/h2&gt;
&lt;p&gt;knife soloを実行する管理サーバー(manage)とChef Soloを適用するウェブサーバー(web1)を起動します。&lt;/p&gt;
&lt;h1&gt;-&lt;em&gt;- mode: ruby -&lt;/em&gt;-&lt;/h1&gt;
&lt;h1&gt;vi: set ft=ruby :&lt;/h1&gt;
&lt;h1&gt;Vagrantfile API/syntax version. Don’t touch unless you know what you’re doing!&lt;/h1&gt;
&lt;p&gt;VAGRANTFILE_API_VERSION = “2”&lt;/p&gt;
&lt;p&gt;Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.define “manage” do |manage|
manage.vm.box = “CentOS-5.8-x86_64”
manage.vm.hostname = “manage”
manage.vm.network :private_network, ip: “192.168.33.10”
manage.vm.network :public_network
end&lt;/p&gt;
&lt;p&gt;config.vm.define “web” do |web|
web.vm.box = “CentOS-5.8-x86_64”
web.vm.hostname = “web”
web.vm.network :private_network, ip: “192.168.33.20”
web.vm.network :public_network
end
end&lt;/p&gt;
&lt;h2&gt;knife-soloのインストール&lt;/h2&gt;
&lt;p&gt;$ gem install knife-solo&lt;/p&gt;
&lt;h2&gt;cookboosのひな形を準備&lt;/h2&gt;
&lt;p&gt;[vagrant@manage ~]$ knife solo init knife_chef
Creating kitchen…
Creating knife.rb in kitchen…
Creating cupboards…&lt;/p&gt;
&lt;h2&gt;httpdをインストールするとrecipeを準備&lt;/h2&gt;
&lt;p&gt;[vagrant@manage knife_chef]$ knife cookbook create httpd -o cookbooks&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;Creating cookbook httpd&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;Creating README for cookbook: httpd&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;Creating CHANGELOG for cookbook: httpd&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;Creating metadata for cookbook: httpd&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;[vagrant@manage knife_chef]$ vim cookbooks/httpd/recipes/default.rb
package “httpd” do
action :install
end&lt;/p&gt;
&lt;h2&gt;リモートサーバーでChef-soloが実行できるように準備&lt;/h2&gt;
&lt;p&gt;$ knife solo prepare &lt;a href=&quot;mailto:vagrant@192.168.33.20&quot;&gt;vagrant@192.168.33.20&lt;/a&gt;
[vagrant@manage ~]$ knife solo prepare &lt;a href=&quot;mailto:vagrant@192.168.33.20&quot;&gt;vagrant@192.168.33.20&lt;/a&gt;
WARNING: No knife configuration file found
Bootstrapping Chef…
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
Dload  Upload   Total   Spent    Left  Speed
100 14101  100 14101    0     0  14009      0  0:00:01  0:00:01 —:—:— 69806
Downloading Chef 10.12.0 for el…
downloading &lt;a href=&quot;https://www.opscode.com/chef/metadata?v=10.12.0&amp;#x26;prerelease=false&amp;#x26;p=el&amp;#x26;pv=5&amp;#x26;m=x86_64&quot;&gt;https://www.opscode.com/chef/metadata?v=10.12.0&amp;#x26;prerelease=false&amp;#x26;p=el&amp;#x26;pv=5&amp;#x26;m=x86_64&lt;/a&gt;
to file /tmp/install.sh.9830/metadata.txt
trying wget…
url &lt;a href=&quot;https://opscode-omnibus-packages.s3.amazonaws.com/el/5/x86_64/chef-10.12.0-1.el5.x86_64.rpm&quot;&gt;https://opscode-omnibus-packages.s3.amazonaws.com/el/5/x86_64/chef-10.12.0-1.el5.x86_64.rpm&lt;/a&gt;
md5 25887ebd80bbb488b88b9360a837d736
sha256  6047a88dd52d9bf33e4c30de36c57fa7308477e73cec07f1703eaba1e1bb366a
downloaded metadata file looks valid…
downloading &lt;a href=&quot;https://opscode-omnibus-packages.s3.amazonaws.com/el/5/x86_64/chef-10.12.0-1.el5.x86_64.rpm&quot;&gt;https://opscode-omnibus-packages.s3.amazonaws.com/el/5/x86_64/chef-10.12.0-1.el5.x86_64.rpm&lt;/a&gt;
to file /tmp/install.sh.9830/chef-10.12.0.x86_64.rpm
trying wget…
Checksum compare with sha256sum succeeded.
Installing Chef 10.12.0
installing with rpm…
Preparing…                ### ### ### ### ### ### ### ### ### ### ### ### ### ### # [100%]
1:chef                   ### ### ### ### ### ### ### ### ### ### ### ### ### ### # [100%]
Thank you for installing Chef!
Generating node config ‘nodes/192.168.33.20.json’…&lt;/p&gt;
&lt;h2&gt;nodeファイルにhttpdをインストールするrecipeを追加&lt;/h2&gt;
&lt;p&gt;[vagrant@manage knife_chef]$ vim nodes/192.168.33.20.json
{
“run_list”:[
“recipe[httpd::default]”
]
}&lt;/p&gt;
&lt;h2&gt;knife-soloを実行&lt;/h2&gt;
&lt;p&gt;[vagrant@manage knife_chef]$ knife solo cook &lt;a href=&quot;mailto:vagrant@192.168.33.20&quot;&gt;vagrant@192.168.33.20&lt;/a&gt;
Running Chef on 192.168.33.20…
Checking Chef version…
Uploading the kitchen…
Generating solo config…
Running Chef…
Starting Chef Client, version 11.8.2
Compiling Cookbooks…
Converging 1 resources
Recipe: httpd::default&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;package[httpd] action install
&lt;ul&gt;
&lt;li&gt;install version 2.2.3-83.el5.centos of package httpd&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Chef Client finished, 1 resources updated&lt;/p&gt;
&lt;h2&gt;リモート先のサーバーで確認&lt;/h2&gt;
&lt;h3&gt;knife-solo実行前&lt;/h3&gt;
&lt;p&gt;[vagrant@web ~]$ yum list installed | grep httpd
[vagrant@web ~]$&lt;/p&gt;
&lt;h3&gt;knife-solo実行後&lt;/h3&gt;
&lt;p&gt;リモート先に遠隔越しにインストールされました&lt;/p&gt;
&lt;p&gt;[vagrant@web ~]$ yum list installed | grep httpd
httpd.x86_64                      2.2.3-83.el5.centos                  installed&lt;/p&gt;
&lt;p&gt;サーバー一台ならChef soloで十分なんですが複数台となるとログインし直すが大変面倒なので管理サーバーなどからKnife solo cookコマンド一発でリモート先を変更できるようになるので楽ですねー！&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Macでvagrant upの際にエラーが発生した際の対処法]]></title><description><![CDATA[logo_wide-cab47086 過去に何十回とぐぐったのでそろそろ自分用のメモとしてまとめておく。 vagrant upをすると稀に下記のエラーが表示される $ vagrant up
Bringing machine ‘manage’ up with ‘virtualbox…]]></description><link>https://blog.hypermkt.jp/2014/2014-01-02-macでvagrant-upの際にエラーが発生した際の対処法/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2014/2014-01-02-macでvagrant-upの際にエラーが発生した際の対処法/</guid><pubDate>Thu, 02 Jan 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/01/logo_wide-cab47086.png&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/01/logo_wide-cab47086-300x82.png&quot; alt=&quot;logo_wide-cab47086&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;過去に何十回とぐぐったのでそろそろ自分用のメモとしてまとめておく。&lt;/p&gt;
&lt;p&gt;vagrant upをすると稀に下記のエラーが表示される&lt;/p&gt;
&lt;p&gt;$ vagrant up
Bringing machine ‘manage’ up with ‘virtualbox’ provider…
[manage] Clearing any previously set forwarded ports…
[manage] Creating shared folders metadata…
[manage] Clearing any previously set network interfaces…
There was an error while executing &lt;code class=&quot;language-text&quot;&gt;VBoxManage&lt;/code&gt;, a CLI used by Vagrant
for controlling VirtualBox. The command and stderr is shown below.&lt;/p&gt;
&lt;p&gt;Command: [“hostonlyif”, “create”]&lt;/p&gt;
&lt;p&gt;Stderr: 0%…
Progress state: NS_ERROR_FAILURE
VBoxManage: error: Failed to create the host-only adapter
VBoxManage: error: VBoxNetAdpCtl: Error while adding new interface: failed to open /dev/vboxnetctl: No such file or directory&lt;/p&gt;
&lt;p&gt;VBoxManage: error: Details: code NS_ERROR_FAILURE (0x80004005), component HostNetworkInterface, interface IHostNetworkInterface
VBoxManage: error: Context: “int handleCreate(HandlerArg*, int, int*)” at line 68 of file VBoxManageHostonly.cpp&lt;/p&gt;
&lt;p&gt;この場合は下記コマンドを実行してVirtual Boxを再起動したら直ります。なぜ発生するかの原因は不明ですが・・・。&lt;/p&gt;
&lt;p&gt;$ sudo /Library/StartupItems/VirtualBox/VirtualBox restart&lt;/p&gt;</content:encoded></item><item><title><![CDATA[CentOS5.8にyumでgitをインストールする]]></title><description><![CDATA[Git-Logo-1788C CentOS 5.8(Final)にyumでgitをインストールしようとするとNo package git available.と言われインストール出来ない。 [vagrant@vagrant-c5-x86_64 ~]$ sudo yum…]]></description><link>https://blog.hypermkt.jp/2013/2013-12-31-centos5-8にyumでgitをインストールする/</link><guid isPermaLink="false">https://blog.hypermkt.jp/2013/2013-12-31-centos5-8にyumでgitをインストールする/</guid><pubDate>Tue, 31 Dec 2013 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/01/Git-Logo-1788C-e1388646507771.png&quot;&gt;&lt;img src=&quot;https://hypermkt-blog.lolipop.io/wp-content/uploads/2014/01/Git-Logo-1788C-300x125.png&quot; alt=&quot;Git-Logo-1788C&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;CentOS 5.8(Final)にyumでgitをインストールしようとするとNo package git available.と言われインストール出来ない。&lt;/p&gt;
&lt;p&gt;[vagrant@vagrant-c5-x86_64 ~]$ sudo yum install git
Loaded plugins: fastestmirror
Determining fastest mirrors&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;base: mirrors.grandcloud.cn&lt;/li&gt;
&lt;li&gt;extras: ftp.riken.jp&lt;/li&gt;
&lt;li&gt;updates: mirrors.grandcloud.cn&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;base                                                     | 1.1 kB     00:00
base/primary                                             | 1.3 MB     00:06
base                                                     3662/3662
extras                                                   | 2.1 kB     00:00
extras/primary_db                                        | 173 kB     00:01
updates                                                  | 1.9 kB     00:00
updates/primary_db                                       | 197 kB     00:04
Setting up Install Process
No package git available.
Nothing to do&lt;/p&gt;
&lt;p&gt;gitはepelリポジトリに含まれているため、まずはepelリポジトリをyumで使えるようにします。&lt;/p&gt;
&lt;h2&gt;環境&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Vagrant 1.3.5&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;box:&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://dl.dropbox.com/u/17738575/CentOS-5.8-x86_64.box&quot;&gt;CentOS 5.8 x86_64&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;epelリポジトリのインストール&lt;/h2&gt;
&lt;p&gt;[vagrant@vagrant-c5-x86_64 ~]$ sudo rpm -ivh &lt;a href=&quot;http://ftp.jaist.ac.jp/pub/Linux/Fedora/epel/5/x86_64/epel-release-5-4.noarch.rpm&quot;&gt;http://ftp.jaist.ac.jp/pub/Linux/Fedora/epel/5/x86_64/epel-release-5-4.noarch.rpm&lt;/a&gt;
&lt;a href=&quot;http://ftp.jaist.ac.jp/pub/Linux/Fedora/epel/5/x86_64/epel-release-5-4.noarch.rpm&quot;&gt;http://ftp.jaist.ac.jp/pub/Linux/Fedora/epel/5/x86_64/epel-release-5-4.noarch.rpm&lt;/a&gt; を取得中
警告: /var/tmp/rpm-xfer.xRs7dj: ヘッダ V3 DSA signature: NOKEY, key ID 217521f6
エラー: stat /vagrant に失敗しました: そのようなファイルやディレクトリはありません
準備中…                ### ### ### ### ### ### ### ### ### ### ### ### ### ### # [100%]
1:epel-release           ### ### ### ### ### ### ### ### ### ### ### ### ### ### # [100%]&lt;/p&gt;
&lt;p&gt;これでgitはインストール可能になるのですが、このままではepelリポジトリがCentOSの公式リポジトリより優先されてしまうので、公式リポジトリを優先するように設定します。&lt;/p&gt;
&lt;h2&gt;yum-prioritiesのインストール&lt;/h2&gt;
&lt;p&gt;[vagrant@vagrant-c5-x86_64 ~]$ sudo yum install yum-priorities
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;base: mirrors.grandcloud.cn&lt;/li&gt;
&lt;li&gt;epel: ftp.kddilabs.jp&lt;/li&gt;
&lt;li&gt;extras: ftp.riken.jp&lt;/li&gt;
&lt;li&gt;updates: mirrors.grandcloud.cn&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Setting up Install Process
Resolving Dependencies
—&gt; Running transaction check
---&gt; Package yum-priorities.noarch 0:1.1.16-21.el5.centos set to be updated
—&gt; Finished Dependency Resolution&lt;/p&gt;
&lt;p&gt;Dependencies Resolved&lt;/p&gt;
&lt;h1&gt;==============================================================================================================================================================================================================================================
Package                                                     Arch                                                Version                                                              Repository                                         Size&lt;/h1&gt;
&lt;p&gt;Installing:
yum-priorities                                              noarch                                              1.1.16-21.el5.centos                                                 base                                               16 k&lt;/p&gt;
&lt;h1&gt;Transaction Summary&lt;/h1&gt;
&lt;p&gt;Install       1 Package(s)
Upgrade       0 Package(s)&lt;/p&gt;
&lt;p&gt;Total download size: 16 k
Is this ok [y/N]: y
Downloading Packages:
yum-priorities-1.1.16-21.el5.centos.noarch.rpm                                                                                                                                                                         |  16 kB     00:00
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
Installing     : yum-priorities                                                                                                                                                                                                         1/1
error: failed to stat /vagrant: No such file or directory&lt;/p&gt;
&lt;p&gt;Installed:
yum-priorities.noarch 0:1.1.16-21.el5.centos&lt;/p&gt;
&lt;p&gt;Complete!&lt;/p&gt;
&lt;h2&gt;優先度の変更&lt;/h2&gt;
&lt;p&gt;先ほどインストールしたyum-prioritesによりBaseリポジトリにpriorityで優先度を付ける事ができます。&lt;/p&gt;
&lt;p&gt;[vagrant@vagrant-c5-x86_64 ~]$ sudo vim /etc/yum.repos.d/CentOS-Base.repo&lt;/p&gt;
&lt;p&gt;[base]
name=CentOS-$releasever - Base
mirrorlist=&lt;a href=&quot;http://mirrorlist.centos.org/?release=$releasever&amp;#x26;arch=$basearch&amp;#x26;repo=os&quot;&gt;http://mirrorlist.centos.org/?release=$releasever&amp;#x26;arch=$basearch&amp;#x26;repo=os&lt;/a&gt;
#baseurl=&lt;a href=&quot;http://mirror.centos.org/centos/$releasever/os/$basearch/&quot;&gt;http://mirror.centos.org/centos/$releasever/os/$basearch/&lt;/a&gt;
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
+priority=1&lt;/p&gt;
&lt;p&gt;#released updates
[updates]
name=CentOS-$releasever - Updates
mirrorlist=&lt;a href=&quot;http://mirrorlist.centos.org/?release=$releasever&amp;#x26;arch=$basearch&amp;#x26;repo=updates&quot;&gt;http://mirrorlist.centos.org/?release=$releasever&amp;#x26;arch=$basearch&amp;#x26;repo=updates&lt;/a&gt;
#baseurl=&lt;a href=&quot;http://mirror.centos.org/centos/$releasever/updates/$basearch/&quot;&gt;http://mirror.centos.org/centos/$releasever/updates/$basearch/&lt;/a&gt;
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
+priority=1&lt;/p&gt;
&lt;p&gt;#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras
mirrorlist=&lt;a href=&quot;http://mirrorlist.centos.org/?release=$releasever&amp;#x26;arch=$basearch&amp;#x26;repo=extras&quot;&gt;http://mirrorlist.centos.org/?release=$releasever&amp;#x26;arch=$basearch&amp;#x26;repo=extras&lt;/a&gt;
#baseurl=&lt;a href=&quot;http://mirror.centos.org/centos/$releasever/extras/$basearch/&quot;&gt;http://mirror.centos.org/centos/$releasever/extras/$basearch/&lt;/a&gt;
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
+priority=1&lt;/p&gt;
&lt;p&gt;#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus
mirrorlist=&lt;a href=&quot;http://mirrorlist.centos.org/?release=$releasever&amp;#x26;arch=$basearch&amp;#x26;repo=centosplus&quot;&gt;http://mirrorlist.centos.org/?release=$releasever&amp;#x26;arch=$basearch&amp;#x26;repo=centosplus&lt;/a&gt;
#baseurl=&lt;a href=&quot;http://mirror.centos.org/centos/$releasever/centosplus/$basearch/&quot;&gt;http://mirror.centos.org/centos/$releasever/centosplus/$basearch/&lt;/a&gt;
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
+priority=1&lt;/p&gt;
&lt;p&gt;#contrib - packages by Centos Users
[contrib]
name=CentOS-$releasever - Contrib
mirrorlist=&lt;a href=&quot;http://mirrorlist.centos.org/?release=$releasever&amp;#x26;arch=$basearch&amp;#x26;repo=contrib&quot;&gt;http://mirrorlist.centos.org/?release=$releasever&amp;#x26;arch=$basearch&amp;#x26;repo=contrib&lt;/a&gt;
#baseurl=&lt;a href=&quot;http://mirror.centos.org/centos/$releasever/contrib/$basearch/&quot;&gt;http://mirror.centos.org/centos/$releasever/contrib/$basearch/&lt;/a&gt;
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
+priority=1&lt;/p&gt;
&lt;h2&gt;gitのインストール&lt;/h2&gt;
&lt;p&gt;[vagrant@vagrant-c5-x86_64 ~]$ sudo yum install git
Loaded plugins: fastestmirror, priorities
Loading mirror speeds from cached hostfile&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;base: ftp.riken.jp&lt;/li&gt;
&lt;li&gt;epel: ftp.kddilabs.jp&lt;/li&gt;
&lt;li&gt;extras: ftp.riken.jp&lt;/li&gt;
&lt;li&gt;updates: ftp.riken.jp&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;base                                                                                                                                                                                                                   | 1.1 kB     00:00
extras                                                                                                                                                                                                                 | 2.1 kB     00:00
updates                                                                                                                                                                                                                | 1.9 kB     00:00
274 packages excluded due to repository priority protections
Setting up Install Process
Resolving Dependencies
—&gt; Running transaction check
---&gt; Package git.x86_64 0:1.8.2.1-1.el5 set to be updated
—&gt; Processing Dependency: perl-Git = 1.8.2.1-1.el5 for package: git
—&gt; Processing Dependency: rsync for package: git
—&gt; Processing Dependency: perl(Term::ReadKey) for package: git
—&gt; Processing Dependency: perl(Git) for package: git
—&gt; Processing Dependency: perl(Error) for package: git
—&gt; Processing Dependency: libcurl.so.3()(64bit) for package: git
—&gt; Running transaction check
---&gt; Package curl.x86_64 0:7.15.5-17.el5_9 set to be updated
—&gt; Processing Dependency: libidn.so.11()(64bit) for package: curl
---&gt; Package perl-Error.noarch 1:0.17010-1.el5 set to be updated
---&gt; Package perl-Git.x86_64 0:1.8.2.1-1.el5 set to be updated
---&gt; Package perl-TermReadKey.x86_64 0:2.30-4.el5 set to be updated
---&gt; Package rsync.x86_64 0:3.0.6-4.el5_7.1 set to be updated
—&gt; Running transaction check
---&gt; Package libidn.x86_64 0:0.6.5-1.1 set to be updated
—&gt; Finished Dependency Resolution&lt;/p&gt;
&lt;p&gt;Dependencies Resolved&lt;/p&gt;
&lt;h1&gt;==============================================================================================================================================================================================================================================
Package                                                        Arch                                                 Version                                                         Repository                                          Size&lt;/h1&gt;
&lt;p&gt;Installing:
git                                                            x86_64                                               1.8.2.1-1.el5                                                   epel                                               7.4 M
Installing for dependencies:
curl                                                           x86_64                                               7.15.5-17.el5_9                                                 base                                               232 k
libidn                                                         x86_64                                               0.6.5-1.1                                                       base                                               195 k
perl-Error                                                     noarch                                               1:0.17010-1.el5                                                 epel                                                26 k
perl-Git                                                       x86_64                                               1.8.2.1-1.el5                                                   epel                                                49 k
perl-TermReadKey                                               x86_64                                               2.30-4.el5                                                      epel                                                32 k
rsync                                                          x86_64                                               3.0.6-4.el5_7.1                                                 base                                               347 k&lt;/p&gt;
&lt;h1&gt;Transaction Summary&lt;/h1&gt;
&lt;p&gt;Install       7 Package(s)
Upgrade       0 Package(s)&lt;/p&gt;
&lt;h2&gt;Total download size: 8.2 M
Is this ok [y/N]: y
Downloading Packages:
(1/7): perl-Error-0.17010-1.el5.noarch.rpm                                                                                                                                                                             |  26 kB     00:00
(2/7): perl-TermReadKey-2.30-4.el5.x86_64.rpm                                                                                                                                                                          |  32 kB     00:00
(3/7): perl-Git-1.8.2.1-1.el5.x86_64.rpm                                                                                                                                                                               |  49 kB     00:00
(4/7): libidn-0.6.5-1.1.x86_64.rpm                                                                                                                                                                                     | 195 kB     00:01
(5/7): curl-7.15.5-17.el5_9.x86_64.rpm                                                                                                                                                                                 | 232 kB     00:02
(6/7): rsync-3.0.6-4.el5_7.1.x86_64.rpm                                                                                                                                                                                | 347 kB     00:01
(7/7): git-1.8.2.1-1.el5.x86_64.rpm                                                                                                                                                                                    | 7.4 MB     00:25&lt;/h2&gt;
&lt;p&gt;Total                                                                                                                                                                                                         249 kB/s | 8.2 MB     00:33
警告: rpmts_HdrFromFdno: ヘッダ V3 DSA signature: NOKEY, key ID 217521f6
epel/gpgkey                                                                                                                                                                                                            | 1.7 kB     00:00
Importing GPG key 0x217521F6 “Fedora EPEL &lt;a href=&quot;mailto:epel@fedoraproject.org&quot;&gt;epel@fedoraproject.org&lt;/a&gt;” from /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL
Is this ok [y/N]: y
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
Installing     : perl-Error                                                                                                                                                                                                             1/7
error: failed to stat /vagrant: No such file or directory
Installing     : libidn                                                                                                                                                                                                                 2/7
Installing     : curl                                                                                                                                                                                                                   3/7
Installing     : perl-TermReadKey                                                                                                                                                                                                       4/7
Installing     : rsync                                                                                                                                                                                                                  5/7
Installing     : git                                                                                                                                                                                                                    6/7
Installing     : perl-Git                                                                                                                                                                                                               7/7&lt;/p&gt;
&lt;p&gt;Installed:
git.x86_64 0:1.8.2.1-1.el5&lt;/p&gt;
&lt;p&gt;Dependency Installed:
curl.x86_64 0:7.15.5-17.el5_9        libidn.x86_64 0:0.6.5-1.1        perl-Error.noarch 1:0.17010-1.el5        perl-Git.x86_64 0:1.8.2.1-1.el5        perl-TermReadKey.x86_64 0:2.30-4.el5        rsync.x86_64 0:3.0.6-4.el5_7.1&lt;/p&gt;
&lt;p&gt;Complete!&lt;/p&gt;
&lt;p&gt;gitのインストール完了です。&lt;/p&gt;</content:encoded></item></channel></rss>