<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>notes</title><link>https://unionsep.dev/</link><description>Recent content on notes</description><generator>Hugo -- 0.161.1</generator><language>en</language><lastBuildDate>Thu, 08 Dec 2022 00:00:00 +0900</lastBuildDate><atom:link href="https://unionsep.dev/index.xml" rel="self" type="application/rss+xml"/><item><title>自動化は界王拳の夢をみるか</title><link>https://unionsep.dev/posts/2022/12/08/000000/</link><pubDate>Thu, 08 Dec 2022 00:00:00 +0900</pubDate><author>unionsep</author><guid>https://unionsep.dev/posts/2022/12/08/000000/</guid><description>&amp;lt;no value&amp;gt;</description><content type="text/html" mode="escaped"><![CDATA[<p>この記事は、 <a href="https://adventar.org/calendars/7407">Kyash Advent Calendar 2022</a> の8日目の記事です。</p>
<aside class="cite-card">
    <img
      class="cite-card__image"
      src="https://adventar.org/og_image.png"
      alt=""
      loading="lazy"
    >

  <a href="https://adventar.org/calendars/7407" target="_blank" rel="noopener noreferrer">
    <div class="cite-card__title">Kyash</div>
      <div class="cite-card__description">
        Kyashのプロダクト開発に関わる有志メンバーによるアドベントカレンダーです。
業務やプライベートで取り組んでいることを書きます。Kyashで働くメンバーのことを知っていただき…
      </div>

    <div class="cite-card__site">Adventar</div>
  </a>
</aside>

<p>　久々のブログ投稿となります。肌寒い日が続きますね。<br>
今年、2022年11月、Kyashの仲間に加えてもらいました。Software Engineer in Test（SET）という役割で声をかけていただき、ソフトウェアテストに関する自動化を推進するポジションとして、1ヶ月程度、過ごしております。</p>
<p>　私は40歳の大台に差し掛かる今まで、ソフトウェアエンジニアとして主にバックエンドの開発に勤しんできました。もうかれこれ15年程度はこの業界で働いていて、荒波にのまれながらあれやこれや担当していたので、サーバー開発だけでなく、データ基盤やモバイル開、技術責任者なんかも経験してきましたが、私の主戦場はバックエンド（サーバー）開発だと自認しています。 <br>
　そんな中、今回、Software Engineer in Test（SET）という、少し毛色の変わったロールに挑戦しております。過去に脆弱性診断士としてセキュリティ診断を行っていたことや、品質向上のためにテストの自動化に取り組んでいたこと、JSTQB資格の取得などを評価いただいて、現在に至ります。<br>
　入社してからまだ1ヶ月で、まだまだ成果と言えるような結果を出せているわけではないですが、今回は、今まで取り組んできたこと、これからKyashで、どのようにソフトウェアテストに取り組んでいきたいのかを書きたいと思います。</p>
<hr>
<p>　Kyashは、資金移動業ライセンスを取得しており、お客様の大切なお金に関わるシステムを提供しているFintech企業なので、品質にかけるコストについて重要視しています。入社前に <a href="https://x.com/konifar">@konifar</a> さんや <a href="https://x.com/ymzkmct">@ymzkmct</a> さんから、現状のQAについて、予めお話を伺っていたのですが、入社後、QAチームメンバーとコミュニケーションを取らせてもらって、改めて、想像以上にしっかりとテスト活動に取り組んでいるんだなと感じました。<br>
　Kyashの開発サイクルでは、エンジニアチームが要件定義や実装を進めていく段階で、QAメンバーもテスト計画を立て、開発が終わったらマニュアル（手動）によるテストを実施し、品質の担保を維持しています。Kyashはモバイルアプリ中心のサービスであるため、どうしてもマニュアルテストでなければテスト実施できなかったこともあって、かなりの時間をかけてテストしています。<br>
　しかし、サービスを開始してから5年程度経過し、多くの機能が実装され、中でもリグレッション（回帰）テストにかかる時間が増えてきたため、リリーススケジュールに影響するようになってきてしまいました。そこで、モバイルアプリのリグレッションテストの自動化を実現するため、様々な可能性を模索している段階です。</p>
<p>　現在、Webサービスのテストについて、多くのソリューションが提供されており、また、品質を重視する組織が増えてきたこともあり、E2Eやリグレッションテストの自動化率が上がってきているのではないかと思います。また、クラウドベースのインフラ環境を構築している組織も増え、テスト実施の素地を整えやすい環境になってきたことも、ソフトウェアテストの自動化を後押しする要因の1つかなと考えています。<br>
　しかし、広く普及している便利なソフトウェアサービスは、モバイル端末で操作するものが多く、ブラウザ操作によるテストではなく、アプリ操作によるテストを行わなければならない場面も多いと思います。Kyashはまさに、アプリ操作がメインのサービスであり、自動化がしづらく、テスト工数の肥大化に悩まされています。</p>
<p>　Kyashでは、新しく追加した機能が正しく利用できるかの観点でテストシナリオを設計し、テスト計画に落とし込んでから機能テストを実施しています。その後、プログラムの変更に伴ったシステムへの予想外の影響が起きていないかを確認するために、リグレッションテストを実施しています。Kyashのシステムテストを長く担当してくれているメンバーによる探索的テストも実施しているため、広範囲に渡って不具合への対策が行われています。</p>
<p>　一方で、ソフトウェアテストチームが正しく機能していると感じましたが、開発チームは今どきなスクラムを実践できているのに、テストはウォーターフォールのまま置き去りにされていないかと感じました。ソフトウェアテストが下流工程のようになっていやしないかと。。<br>
　とはいえ、それはKyashだけではなく、ソフトウェアテストにおいては往々として起こることであり、また、開発とテストのトレードオフ的な関係性を解消できている方が稀だと思います。重厚なテスト活動を行えば、開発期間が短くなるし、テスト活動を軽視すれば品質に問題が出るし・・・とか言うありがちな問題です。</p>
<p>　<a href="https://x.com/konifar">@konifar</a> さんや <a href="https://x.com/ymzkmct">@ymzkmct</a> さんとお話したとき、決済事業者としての高い品質を保ったまま、効率的にソフトウェアテストを行うことにより、生産力の爆上げを両立したいと聞いたとき、正直、難しい課題だなと感じました。</p>
<aside class="cite-card">
    <img
      class="cite-card__image"
      src="https://cdn.image.st-hatena.com/image/scale/c3115b50d0f1b2dde7b558e93a3ca54155178125/backend=imagemagick;version=1;width=1300/https%3A%2F%2Fstorage.googleapis.com%2Fgweb-cloudblog-publish%2Fimages%2F1_breaking_down_devops_perf.max-2800x2800.jpg"
      alt=""
      loading="lazy"
    >

  <a href="https://blog.kyash.co/entry/2022/06/15/170000" target="_blank" rel="noopener noreferrer">
    <div class="cite-card__title">Tech Teamの生産力を爆上げすべくGrowth Technology Teamが爆誕しました</div>
      <div class="cite-card__description">
        はじめに KyashでBackend Engineerをしている uncle__ko です。 この度、KyashのTech Teamの生産力を爆上げするべく新たにGrowth…
      </div>

    <div class="cite-card__site">Kyash Product Blog</div>
  </a>
</aside>

<p>　決済事業者として、1円の間違いやミスも許されないドメインを扱っているので、テスト活動を軽視してよいわけがありません。ただ、Kyashは決済システムを0から自社で作ってきたという自負のある会社です。極めて作ることにこだわりがある組織なので、もしかしたら、培ってきた技術力を活かして、生産性の爆上げと高品質を両立できるのではないかと思い、入社を決めました。</p>
<hr>
<p>　テスト活動の自動化において、Kyashでは<a href="https://autify.com/mobile">Autify for Mobile</a>を利用させていただいています。</p>
<aside class="cite-card">
    <div class="cite-card__image cite-card__image--fallback" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor"
      stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-image">
      <rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect>
      <circle cx="8.5" cy="8.5" r="1.5"></circle>
      <polyline points="21 15 16 10 5 21"></polyline>
   </svg></div>

  <a href="https://autify.com/mobile" target="_blank" rel="noopener noreferrer">
    <div class="cite-card__title">Mobile</div>

    <div class="cite-card__site">autify.com</div>
  </a>
</aside>

<p>　<a href="https://autify.com/mobile">Autify for Mobile</a> の良いところは、テストコードを書かなくても、モバイルアプリ操作の自動化を実現できる点です。初めてテストプランを作成したとき、ブラウザ操作だけで、エミュレーターが起動し、テストシナリオが作成できたときは、「モバイルアプリのテスト自動化もここまで来たか！」と感動しました。<br>
　Kyashでは、Pull Requestがマージされたとき、GitHub Actionsでアプリをアップロードし、テストプランを起動するように設定していましたが、度々、テストが失敗するケースがありました。テストが失敗する理由は様々ですが、Pull Requestをベースにテストシナリオを起動していては、シナリオを修正する契機が開発者に依存してしまい、テスターがテストを修正する機会が少なくなり、テストの精度がなかなか上がらないと考えたため、定期的にテストシナリオを起動するようにしました。<br>
　<a href="https://autify.com/mobile">Autify for Mobile</a> では、定期実行する機能は提供されていませんが、テストプランを起動するAPIが提供されているので、これを利用して、平日2時間ごとにテストプランを起動するようにしました。</p>
<p>　Autify for Mobileのアカウント設定から、パーソナルアクセストークンを取得します。</p>
<p><a href="/posts/2022/12/08/000000/20221205114250.png"><img src="/posts/2022/12/08/000000/20221205114250.png" alt="Autifyの画面"></a></p>
<p>　今回は、お手軽に定期実行したかったので、Google App Scriptを利用しましたが、以下のPOSTリクエストが実行できればどのような環境でも動きます。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>curl -X <span style="color:#e6db74">&#39;POST&#39;</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  <span style="color:#e6db74">&#39;https://mobile-app.autify.com/api/v1/test_plans/xxxxx/test_plan_results&#39;</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  -H <span style="color:#e6db74">&#34;Authorization: Bearer 1234567890abc&#34;</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  -H <span style="color:#e6db74">&#39;accept: application/json&#39;</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  -H <span style="color:#e6db74">&#39;Content-Type: application/json&#39;</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>  -d <span style="color:#e6db74">&#39;{
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">  &#34;build_id&#34;: &#34;xxyyzz&#34;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">}&#39;</span>
</span></span></code></pre></div><p>　そして、POSTリクエストに成功したら、以下のようなjsonが戻ってきます。起動したことを通知してほしかったので、SlackのIncomming Webhookにjsonの内容を投稿しています。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;id&#34;</span>: <span style="color:#e6db74">&#34;abcdef&#34;</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;test_plan&#34;</span>: {
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&#34;id&#34;</span>: <span style="color:#e6db74">&#34;xxxxx&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&#34;name&#34;</span>: <span style="color:#e6db74">&#34;Autify Test Plans&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&#34;created_at&#34;</span>: <span style="color:#e6db74">&#34;2022-11-01T01:32:42.999Z&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&#34;updated_at&#34;</span>: <span style="color:#e6db74">&#34;2022-11-05T01:54:18.999Z&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&#34;build&#34;</span>: {
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">&#34;id&#34;</span>: <span style="color:#e6db74">&#34;xxyyzz&#34;</span>,
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">&#34;name&#34;</span>: <span style="color:#e6db74">&#34;app.build&#34;</span>,
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">&#34;version&#34;</span>: <span style="color:#e6db74">&#34;0.0.1&#34;</span>,
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">&#34;created_at&#34;</span>: <span style="color:#e6db74">&#34;2022-11-29T09:04:56.999Z&#34;</span>,
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">&#34;updated_at&#34;</span>: <span style="color:#e6db74">&#34;2022-11-29T09:04:57.999Z&#34;</span>
</span></span><span style="display:flex;"><span>    },
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&#34;execute_environments&#34;</span>: [
</span></span><span style="display:flex;"><span>      {
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">&#34;os&#34;</span>: <span style="color:#e6db74">&#34;iOS&#34;</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">&#34;os_version&#34;</span>: <span style="color:#e6db74">&#34;14.4&#34;</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">&#34;device&#34;</span>: <span style="color:#e6db74">&#34;iPhone 12&#34;</span>
</span></span><span style="display:flex;"><span>      }
</span></span><span style="display:flex;"><span>    ]
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>　起動後、Autify for Mobileのテスト結果ページに実行中のテストプランが表示されます。今まで作ってきたテストプランの実行が終わるのに、だいたい1時間から2時間弱かかっています。<br>
　Autifyには、テスト実行が終わったらSlackに通知する仕組みもあり、テスト実行が終わったら通知してくれます。</p>
<p><a href="/posts/2022/12/08/000000/20221205123541.png"><img src="/posts/2022/12/08/000000/20221205123541.png" alt="Slackの画面"></a></p>
<p>　このように、テスト実行回数を増やし、テストシナリオの精度を上げる取り組みを実施しています。</p>
<hr>
<p>　Kyashでは、テスト自動化の取り組みを始めたばかりなので、Autifyのような自動化を始めやすいサービスから導入を進めています。自動テストは壊れやすいため、オートヒーリング機能についても期待しています。<br>
　しかし、全てをAutifyで自動化できるとは考えておらず、AppiumやSeleniumなどのテスティングフレームワークを使ったテストコードの整備を行い、網羅率とテスト精度を上げていく取り組みを行っていきたいと考えています。</p>
<p>　また、アジャイル開発にテスト活動を組み入れたいと考えており、スプリントの最後にテストをするのではなく、スプリントサイクルにどのようにテストサイクルを組み込んでいくのがチームとしてベストなのか模索していきたいと考えています。</p>
<p>　Kyashは様々なサービスと連携しているため、テスト環境の整備や運用についても、テストエンジニアが率先して取り組んでいく予定です。それは、いついかなるタイミングでテストを実行しても、正しいテスト結果（正誤問わず）を返せる冪等性を担保した環境を整備することにより、開発サイクルを高速化できると考えているからです。いつでもどこでも正しくテストできる事により、Kyash Tech Teamが掲げる3倍界王拳の実現をテストエンジニアから後押ししていきたいと考えています。</p>
<p>　Webやアプリ開発の様々な技術を駆使して、ソフトウェアテストに取り組み、QuarityをEngineeringしていきたいと考えています。それはもしかしたら、QAエンジニアとか開発エンジニアという枠組みを取っ払い、すべてのKyashのエンジニアがソフトウェアテストの自動化や精度向上に関わる活動を行うマインドセットを持った組織になる未来が訪れることを意味するのかもしれません。</p>
<p>　Kyashでは、ソフトウェアテストの自動化を始め、様々な職種で仲間を募集しています。少しでも興味がございましたら、カジュアル面談でのご連絡もお待ちしております！</p>
<aside class="cite-card">
    <img
      class="cite-card__image"
      src="https://v1.herp.cloud/resources/company_logos/C-9WN82"
      alt=""
      loading="lazy"
    >

  <a href="https://herp.careers/v1/kyash" target="_blank" rel="noopener noreferrer">
    <div class="cite-card__title">株式会社Kyash の全ての求人一覧</div>
      <div class="cite-card__description">
        株式会社Kyash の全ての求人一覧です。
      </div>

    <div class="cite-card__site">株式会社Kyash</div>
  </a>
</aside>

]]></content></item><item><title>Debianの言語設定を変更した</title><link>https://unionsep.dev/posts/2022/08/18/130631/</link><pubDate>Thu, 18 Aug 2022 13:06:31 +0900</pubDate><author>unionsep</author><guid>https://unionsep.dev/posts/2022/08/18/130631/</guid><description>&amp;lt;no value&amp;gt;</description><content type="text/html" mode="escaped"><![CDATA[<aside class="cite-card">
    <img
      class="cite-card__image"
      src="https://ogimage.blog.st-hatena.com/10328537792370092437/26006613575552066/1594267506"
      alt=""
      loading="lazy"
    >

  <a href="https://unionsep.hatenablog.com/entry/2020/07/09/130307" target="_blank" rel="noopener noreferrer">
    <div class="cite-card__title">DebianのLocal timeをJSTに変更した</div>
      <div class="cite-card__description">
        EC2でDebian/Ubuntuベースのインスタンスを立ち上げたときに、だいたい UTC になってて9時間ほど前の時間になってると思う。 それはちょっと面倒なので、 JST に変…
      </div>

    <div class="cite-card__site">Webメモ</div>
  </a>
</aside>

<p>前にDebianのLocal timeをJSTに変えたんですが、そういえば、言語設定が英語のままだな〜と思ってました。
Amazon Linuxで言語設定変えたけど、これ、言語設定と共にやっといてもええかな〜と思ったんで、メモします。</p>
<aside class="cite-card">
    <img
      class="cite-card__image"
      src="https://ogimage.blog.st-hatena.com/10328537792370092437/26006613595495899/1594267572"
      alt=""
      loading="lazy"
    >

  <a href="https://unionsep.hatenablog.com/entry/2020/07/09/130612" target="_blank" rel="noopener noreferrer">
    <div class="cite-card__title">Amazon Linuxの言語設定を変更した</div>
      <div class="cite-card__description">
        言語設定が英語のUTF-8になってたので、日本語設定しておいた。 $ cat /etc/sysconfig/i18n LANG=en_US.UTF-8 でもlocaleは日本語にな…
      </div>

    <div class="cite-card__site">Webメモ</div>
  </a>
</aside>

<p>OSは <code>Debian 10</code></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ cat /etc/os-release
</span></span><span style="display:flex;"><span>PRETTY_NAME<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;Debian GNU/Linux 10 (buster)&#34;</span>
</span></span><span style="display:flex;"><span>NAME<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;Debian GNU/Linux&#34;</span>
</span></span><span style="display:flex;"><span>VERSION_ID<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;10&#34;</span>
</span></span><span style="display:flex;"><span>VERSION<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;10 (buster)&#34;</span>
</span></span><span style="display:flex;"><span>VERSION_CODENAME<span style="color:#f92672">=</span>buster
</span></span><span style="display:flex;"><span>ID<span style="color:#f92672">=</span>debian
</span></span><span style="display:flex;"><span>HOME_URL<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;https://www.debian.org/&#34;</span>
</span></span><span style="display:flex;"><span>SUPPORT_URL<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;https://www.debian.org/support&#34;</span>
</span></span><span style="display:flex;"><span>BUG_REPORT_URL<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;https://bugs.debian.org/&#34;</span>
</span></span></code></pre></div><p>こういう感じで英語な感じのレスポンス</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ ll
</span></span><span style="display:flex;"><span>-bash: ll: command not found
</span></span></code></pre></div><p>日本語のパッケージがインストールされてなかったんで追加</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ sudo apt install task-japanese locales-all
</span></span></code></pre></div><p>ロケールを変更するには <code>localectl</code> コマンド
これで <code>/etc/default/locale</code> が <code>ja_JP.UTF-8</code> に変わった</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ sudo localectl set-locale LANG<span style="color:#f92672">=</span>ja_JP.UTF-8 LANGUAGE<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;ja_JP:ja&#34;</span>
</span></span></code></pre></div><p>変えた設定を適用する</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ source /etc/default/locale
</span></span></code></pre></div><p>日本語が返ってきたっす</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ ll
</span></span><span style="display:flex;"><span>-bash: ll: コマンドが見つかりません
</span></span></code></pre></div>]]></content></item><item><title>Ubuntu立てるときに、はじめにやることの大体のアレ</title><link>https://unionsep.dev/posts/2022/08/17/151244/</link><pubDate>Wed, 17 Aug 2022 15:12:44 +0900</pubDate><author>unionsep</author><guid>https://unionsep.dev/posts/2022/08/17/151244/</guid><description>&amp;lt;no value&amp;gt;</description><content type="text/html" mode="escaped"><![CDATA[<p>AWSでもGCPでもどんなクラウドでも、もしくはクライアントPCでUbuntuをインストールしてなんかするときに、ワイが大体やることをまとめたかったのでメモ書き。
いつも大体やってるんだけど、ほとんどあのコマンドなんやっけ？とかなって調べて「あぁそうやったわ」ってなるのがいい加減面倒くさくなったので。。</p>
<ul>
<li><strong>OSは以下</strong><br>
今回は訳合って <code>Ubuntu 20.04</code> 。
書いた時点で最新のLTSである <code>22.04</code> が良かったんだけど、MongoDBがうまく対応してなかったかなんかで一個前のLTSを採用した。</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ cat /etc/os-release
</span></span><span style="display:flex;"><span>NAME<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;Ubuntu&#34;</span>
</span></span><span style="display:flex;"><span>VERSION<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;20.04.4 LTS (Focal Fossa)&#34;</span>
</span></span><span style="display:flex;"><span>ID<span style="color:#f92672">=</span>ubuntu
</span></span><span style="display:flex;"><span>ID_LIKE<span style="color:#f92672">=</span>debian
</span></span><span style="display:flex;"><span>PRETTY_NAME<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;Ubuntu 20.04.4 LTS&#34;</span>
</span></span><span style="display:flex;"><span>VERSION_ID<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;20.04&#34;</span>
</span></span><span style="display:flex;"><span>HOME_URL<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;https://www.ubuntu.com/&#34;</span>
</span></span><span style="display:flex;"><span>SUPPORT_URL<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;https://help.ubuntu.com/&#34;</span>
</span></span><span style="display:flex;"><span>BUG_REPORT_URL<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;https://bugs.launchpad.net/ubuntu/&#34;</span>
</span></span><span style="display:flex;"><span>PRIVACY_POLICY_URL<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;https://www.ubuntu.com/legal/terms-and-policies/privacy-policy&#34;</span>
</span></span><span style="display:flex;"><span>VERSION_CODENAME<span style="color:#f92672">=</span>focal
</span></span><span style="display:flex;"><span>UBUNTU_CODENAME<span style="color:#f92672">=</span>focal
</span></span></code></pre></div><ul>
<li><strong>rootになる</strong><br>
初期設定はroot作業が多いので、面倒くさいからrootで作業してる。
sudoでやったほうがいいけど、まぁ、これだけだしそんなにセキュリティがちがちじゃなくてもいいかな。</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ sudo -s
</span></span></code></pre></div><ul>
<li><strong>aptのアップグレードとアップデート</strong><br>
AWSでUbuntu作ったら <code>source.list</code> のリポジトリが <code>ap-northeast-1</code> のミラーを見てるみたいなで、それをそのまま利用させてもらう。
クライアントPCとかでデスクトップとして使うとかの用途なら、どこかの大学とかが公開してるミラーサイトに変更する。</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#75715e"># apt upgrade</span>
</span></span><span style="display:flex;"><span>Reading package lists... Done
</span></span><span style="display:flex;"><span>Building dependency tree
</span></span><span style="display:flex;"><span>Reading state information... Done
</span></span><span style="display:flex;"><span>Calculating upgrade... Done
</span></span><span style="display:flex;"><span>The following NEW packages will be installed:
</span></span><span style="display:flex;"><span>  linux-aws-5.15-headers-5.15.0-1017 linux-headers-5.15.0-1017-aws linux-image-5.15.0-1017-aws linux-modules-5.15.0-1017-aws
</span></span><span style="display:flex;"><span>...
</span></span><span style="display:flex;"><span><span style="color:#75715e"># apt update</span>
</span></span><span style="display:flex;"><span>Hit:1 http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu focal InRelease
</span></span><span style="display:flex;"><span>...
</span></span></code></pre></div><ul>
<li><strong>時間合わせる</strong><br>
過去に記事にしたけど、とっちらかっるのが嫌なのでリンクと内容書いとく
<aside class="cite-card">
    <img
      class="cite-card__image"
      src="https://ogimage.blog.st-hatena.com/10328537792370092437/26006613575552066/1594267506"
      alt=""
      loading="lazy"
    >

  <a href="https://unionsep.hatenablog.com/entry/2020/07/09/130307" target="_blank" rel="noopener noreferrer">
    <div class="cite-card__title">DebianのLocal timeをJSTに変更した</div>
      <div class="cite-card__description">
        EC2でDebian/Ubuntuベースのインスタンスを立ち上げたときに、だいたい UTC になってて9時間ほど前の時間になってると思う。 それはちょっと面倒なので、 JST に変…
      </div>

    <div class="cite-card__site">Webメモ</div>
  </a>
</aside>
</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#75715e"># timedatectl</span>
</span></span><span style="display:flex;"><span>               Local time: Wed 2022-08-17 02:39:47 UTC
</span></span><span style="display:flex;"><span>           Universal time: Wed 2022-08-17 02:39:47 UTC
</span></span><span style="display:flex;"><span>                 RTC time: Wed 2022-08-17 02:39:46
</span></span><span style="display:flex;"><span>                Time zone: Etc/UTC <span style="color:#f92672">(</span>UTC, +0000<span style="color:#f92672">)</span>
</span></span><span style="display:flex;"><span>System clock synchronized: yes
</span></span><span style="display:flex;"><span>              NTP service: active
</span></span><span style="display:flex;"><span>          RTC in local TZ: no
</span></span><span style="display:flex;"><span><span style="color:#75715e"># timedatectl list-timezones|grep Tokyo</span>
</span></span><span style="display:flex;"><span>Asia/Tokyo
</span></span><span style="display:flex;"><span><span style="color:#75715e"># timedatectl set-timezone Asia/Tokyo</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># date</span>
</span></span><span style="display:flex;"><span>Wed Aug <span style="color:#ae81ff">17</span> 11:40:38 JST <span style="color:#ae81ff">2022</span>
</span></span></code></pre></div><ul>
<li><strong>日本語にしたいな</strong><br>
英語（ <code>us</code> ）のままでも別にいいんだけど、マニュアル（ <code>man</code> ）は日本語のほうが緊急時に助かったりするので、日本語にする。</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#75715e"># localectl status</span>
</span></span><span style="display:flex;"><span>   System Locale: LANG<span style="color:#f92672">=</span>C.UTF-8
</span></span><span style="display:flex;"><span>       VC Keymap: n/a
</span></span><span style="display:flex;"><span>      X11 Layout: us
</span></span><span style="display:flex;"><span>       X11 Model: pc105
</span></span><span style="display:flex;"><span><span style="color:#75715e"># localectl list-locales</span>
</span></span><span style="display:flex;"><span>C.UTF-8
</span></span><span style="display:flex;"><span>en_US.UTF-8
</span></span><span style="display:flex;"><span><span style="color:#75715e"># apt install language-pack-ja -y</span>
</span></span><span style="display:flex;"><span>Reading package lists... Done
</span></span><span style="display:flex;"><span>Building dependency tree
</span></span><span style="display:flex;"><span>Reading state information... Done
</span></span><span style="display:flex;"><span>...
</span></span><span style="display:flex;"><span><span style="color:#75715e"># localectl list-locales</span>
</span></span><span style="display:flex;"><span>C.UTF-8
</span></span><span style="display:flex;"><span>en_US.UTF-8
</span></span><span style="display:flex;"><span>ja_JP.UTF-8
</span></span><span style="display:flex;"><span><span style="color:#75715e"># localectl set-locale LANG=ja_JP.UTF-8</span>
</span></span></code></pre></div><ul>
<li><strong>ホスト名変えたいな</strong><br>
AWSだとプライベートIPを含む名前になるみたいなんだけど、管理サーバが多くなってきて脳みその切り替えのコストがしんどくなってきたんでわかり易い名前に変更してます。</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#75715e"># hostnamectl</span>
</span></span><span style="display:flex;"><span>   Static hostname: ip-xxx-xxx-xxx-xxx
</span></span><span style="display:flex;"><span>         Icon name: computer-vm
</span></span><span style="display:flex;"><span>           Chassis: vm
</span></span><span style="display:flex;"><span>        Machine ID: aaaaa
</span></span><span style="display:flex;"><span>           Boot ID: bbbbb
</span></span><span style="display:flex;"><span>    Virtualization: kvm
</span></span><span style="display:flex;"><span>  Operating System: Ubuntu 20.04.4 LTS
</span></span><span style="display:flex;"><span>            Kernel: Linux 5.13.0-1029-aws
</span></span><span style="display:flex;"><span>      Architecture: x86-64
</span></span><span style="display:flex;"><span><span style="color:#75715e"># hostnamectl set-hostname XXXXX</span>
</span></span></code></pre></div><ul>
<li><strong>ここで一旦再起動</strong><br>
ロケール変えたりホスト名変えたけど、リブートしないと反映されないっぽいので、一旦このタイミングで再起動してる。</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#75715e"># reboot</span>
</span></span></code></pre></div><ul>
<li><strong>マニュアルを日本語にする</strong><br>
ゆっくり英語のマニュアルを読むのはいいんだけど、急いでるときはちょっとしんどいんで <code>man</code> は日本語にしておく</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#75715e"># apt install manpages-ja</span>
</span></span><span style="display:flex;"><span>パッケージリストを読み込んでいます... 完了
</span></span><span style="display:flex;"><span>依存関係ツリーを作成しています
</span></span><span style="display:flex;"><span>状態情報を読み取っています... 完了
</span></span><span style="display:flex;"><span>以下のパッケージが新たにインストールされます:
</span></span><span style="display:flex;"><span>  manpages-ja
</span></span><span style="display:flex;"><span>アップグレード: <span style="color:#ae81ff">0</span> 個、新規インストール: <span style="color:#ae81ff">1</span> 個、削除: <span style="color:#ae81ff">0</span> 個、保留: <span style="color:#ae81ff">0</span> 個。
</span></span><span style="display:flex;"><span>...
</span></span><span style="display:flex;"><span><span style="color:#75715e"># apt install manpages-ja-dev</span>
</span></span><span style="display:flex;"><span>パッケージリストを読み込んでいます... 完了
</span></span><span style="display:flex;"><span>依存関係ツリーを作成しています
</span></span><span style="display:flex;"><span>状態情報を読み取っています... 完了
</span></span><span style="display:flex;"><span>以下のパッケージが新たにインストールされます:
</span></span><span style="display:flex;"><span>  manpages-ja-dev
</span></span><span style="display:flex;"><span>アップグレード: <span style="color:#ae81ff">0</span> 個、新規インストール: <span style="color:#ae81ff">1</span> 個、削除: <span style="color:#ae81ff">0</span> 個、保留: <span style="color:#ae81ff">0</span> 個。
</span></span><span style="display:flex;"><span>...
</span></span></code></pre></div><ul>
<li><strong>visudoのエディタを変える</strong><br>
visudoのエディタが <code>nano</code> であんまり慣れてないから <code>vim.tiny</code> に変える。
選択肢の4番を指定する。</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#75715e"># update-alternatives --config editor</span>
</span></span><span style="display:flex;"><span>There are <span style="color:#ae81ff">4</span> choices <span style="color:#66d9ef">for</span> the alternative editor <span style="color:#f92672">(</span>providing /usr/bin/editor<span style="color:#f92672">)</span>.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  Selection    Path                Priority   Status
</span></span><span style="display:flex;"><span>------------------------------------------------------------
</span></span><span style="display:flex;"><span>* <span style="color:#ae81ff">0</span>            /bin/nano            <span style="color:#ae81ff">40</span>        auto mode
</span></span><span style="display:flex;"><span>  <span style="color:#ae81ff">1</span>            /bin/ed             -100       manual mode
</span></span><span style="display:flex;"><span>  <span style="color:#ae81ff">2</span>            /bin/nano            <span style="color:#ae81ff">40</span>        manual mode
</span></span><span style="display:flex;"><span>  <span style="color:#ae81ff">3</span>            /usr/bin/vim.basic   <span style="color:#ae81ff">30</span>        manual mode
</span></span><span style="display:flex;"><span>  <span style="color:#ae81ff">4</span>            /usr/bin/vim.tiny    <span style="color:#ae81ff">15</span>        manual mode
</span></span></code></pre></div><ul>
<li><strong>ユーザを追加</strong><br>
ユーザ作ってから、 <code>visudo</code> を使ってパスワードなしで <code>sudo</code> できる権限をつける。</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#75715e"># adduser unionsep --disabled-password</span>
</span></span><span style="display:flex;"><span>Adding user <span style="color:#e6db74">`</span>unionsep<span style="color:#e6db74">&#39; ...
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">Adding new group `unionsep&#39;</span> <span style="color:#f92672">(</span>1001<span style="color:#f92672">)</span> ...
</span></span><span style="display:flex;"><span>Adding new user <span style="color:#e6db74">`</span>unionsep<span style="color:#e6db74">&#39; (1001) with group `unionsep&#39;</span> ...
</span></span><span style="display:flex;"><span>Creating home directory <span style="color:#e6db74">`</span>/home/unionsep<span style="color:#e6db74">&#39; ...
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">Copying files from `/etc/skel&#39;</span> ...
</span></span><span style="display:flex;"><span>Changing the user information <span style="color:#66d9ef">for</span> unionsep
</span></span><span style="display:flex;"><span>Enter the new value, or press ENTER <span style="color:#66d9ef">for</span> the default
</span></span><span style="display:flex;"><span>	Full Name <span style="color:#f92672">[]</span>:
</span></span><span style="display:flex;"><span>	Room Number <span style="color:#f92672">[]</span>:
</span></span><span style="display:flex;"><span>	Work Phone <span style="color:#f92672">[]</span>:
</span></span><span style="display:flex;"><span>	Home Phone <span style="color:#f92672">[]</span>:
</span></span><span style="display:flex;"><span>	Other <span style="color:#f92672">[]</span>:
</span></span><span style="display:flex;"><span>Is the information correct? <span style="color:#f92672">[</span>Y/n<span style="color:#f92672">]</span> Y
</span></span></code></pre></div><ul>
<li><strong>追加したユーザに <code>sudo</code> できるようにする</strong><br>
<code>visudo</code> で開いた <code>/etc/sudoers.tmp</code> に以下追加</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#75715e"># visudo</span>
</span></span><span style="display:flex;"><span>unionsep ALL<span style="color:#f92672">=</span>NOPASSWD: ALL
</span></span></code></pre></div><ul>
<li><strong>作ったユーザがkeypairでログインできるようにしてる</strong><br>
AWSでは、<code>ubuntu</code> というデフォルトのユーザが作成され、インスタンス生成時にこのユーザに独自の <code>keypair</code> を設定してる。
各々のユーザに <code>keypair</code> を作って各々のインスタンスに配布したいのだけど、Bastionに入れるユーザがワイしかいないので、コピーしてる・・・</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#75715e"># cp -r /home/ubuntu/.ssh /home/unionsep/</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># chown -R unionsep:unionsep /home/unionsep/.ssh</span>
</span></span></code></pre></div><hr>
<p>その他、 <code>ll</code> コマンドなんかの <code>alias</code> や、 <code>LSCOLORS</code> で <code>ls</code> コマンドの色つけたりするけど、Ubuntuはすでにできてるのでやらない。
作ったインスタンスはAMIとかにしておくんだけど、AMIって課金対象だったりするので、あんまり作ってないなぁ。
Ansibleで構成管理したりしたらコマンド一発だしね。。</p>
<p>こんな感じで作ったインスタンスに <code>node</code> やら <code>java</code> やら <code>elasticsearch</code> やらなんやかんや入れて構築したりしてる感じ。</p>
<p>では〜</p>
]]></content></item><item><title>あれ？iTerm2でコピーできんくなった</title><link>https://unionsep.dev/posts/2020/07/09/132221/</link><pubDate>Thu, 09 Jul 2020 13:22:21 +0900</pubDate><author>unionsep</author><guid>https://unionsep.dev/posts/2020/07/09/132221/</guid><description>&amp;lt;no value&amp;gt;</description><content type="text/html" mode="escaped"><![CDATA[<p>いつの日か、iTerm上で文字列を選択しても、コピーできんくなった。。<br>
いや、あれ？このインスタンスだとできるけど、これだとできんなぁ。。みたいな感じだったので、まぁ、ついてないだけやろって思ってたけど、いやもうムリコレーってなったんで、雑にググったらこちらのページに行き着きました。</p>
<aside class="cite-card">
    <img
      class="cite-card__image"
      src="https://ogimage.blog.st-hatena.com/12921228815723770793/10328749687205628185/1484094112"
      alt=""
      loading="lazy"
    >

  <a href="http://gozuk16.hatenablog.com/entry/2017/01/11/092152" target="_blank" rel="noopener noreferrer">
    <div class="cite-card__title">iTerm2でvimを使うとマウスでコピペできなくなった</div>
      <div class="cite-card__description">
        記憶は定かではないがある時を境にでビジュアルモードで選択されるようになった。 最初に何か設定したかもしれないけど思い出せないのでぐぐったら解決した。 d.hatena.ne.jp…
      </div>

    <div class="cite-card__site">ごずろぐ</div>
  </a>
</aside>

<p>ありがとうございます、助かりました！<br>
なんかvi起動したときの、 <code>visual mode</code> でよく起きるわぁ〜とか思ってたらその通りでございました。<br>
重複になりますが、僕もウェブに残しておきます 🙇‍♂️</p>
<ul>
<li>Preferences &gt; Profile &gt; Terminal &gt; Terminal Emulation
<ul>
<li><code>Enable mouse reporting</code> のチェック外す</li>
</ul>
</li>
</ul>
]]></content></item><item><title>Amazon LinuxのタイムゾーンをUTCからJSTに変える</title><link>https://unionsep.dev/posts/2020/07/09/130858/</link><pubDate>Thu, 09 Jul 2020 13:08:58 +0900</pubDate><author>unionsep</author><guid>https://unionsep.dev/posts/2020/07/09/130858/</guid><description>&amp;lt;no value&amp;gt;</description><content type="text/html" mode="escaped"><![CDATA[<p>Amazon Linux（2ではない）を選択してインスタンスを立てたらタイムゾーンがUTCだったのでJSTに変更しました。</p>
<ul>
<li>OSを確認<br>
CentOSってイメージだったけど、 <code>rhel fedora</code> ってなってるってことは、必ずしもCentOSと一緒ってことではなさそうなんすね。</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ cat /etc/os-release
</span></span><span style="display:flex;"><span>NAME<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;Amazon Linux AMI&#34;</span>
</span></span><span style="display:flex;"><span>VERSION<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;2018.03&#34;</span>
</span></span><span style="display:flex;"><span>ID<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;amzn&#34;</span>
</span></span><span style="display:flex;"><span>ID_LIKE<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;rhel fedora&#34;</span>
</span></span><span style="display:flex;"><span>VERSION_ID<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;2018.03&#34;</span>
</span></span><span style="display:flex;"><span>PRETTY_NAME<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;Amazon Linux AMI 2018.03&#34;</span>
</span></span><span style="display:flex;"><span>ANSI_COLOR<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;0;33&#34;</span>
</span></span><span style="display:flex;"><span>CPE_NAME<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;cpe:/o:amazon:linux:2018.03:ga&#34;</span>
</span></span><span style="display:flex;"><span>HOME_URL<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;http://aws.amazon.com/amazon-linux-ami/&#34;</span>
</span></span></code></pre></div><ul>
<li>時間を確認<br>
うん、9時間ずれてる。</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ date
</span></span><span style="display:flex;"><span>2020年  7月  8日 水曜日 02:23:56 UTC
</span></span></code></pre></div><ul>
<li><code>/etc/sysconfig/clock</code> を修正</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ sudo vi /etc/sysconfig/clock
</span></span><span style="display:flex;"><span><span style="color:#75715e">#ZONE=&#34;UTC&#34;</span>
</span></span><span style="display:flex;"><span>ZONE<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;Asia/Tokyo&#34;</span>
</span></span><span style="display:flex;"><span>UTC<span style="color:#f92672">=</span>true
</span></span></code></pre></div><ul>
<li>シンボリックリンクの変更</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>sudo ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
</span></span></code></pre></div><ul>
<li>時間を確認<br>
9時間戻った。</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ date
</span></span><span style="display:flex;"><span>2020年  7月  8日 水曜日 11:41:30 JST
</span></span></code></pre></div><ul>
<li>crondを再起動<br>
Amazon Linux（2ではない）は、 <code>systemctl</code> が入ってなかったので、 <code>service</code> コマンドで再起動すれば良さそう。</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ sudo service crond restart
</span></span><span style="display:flex;"><span>Stopping crond:                                            <span style="color:#f92672">[</span>  OK  <span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>Starting crond:                                            <span style="color:#f92672">[</span>  OK  <span style="color:#f92672">]</span>
</span></span></code></pre></div>]]></content></item><item><title>Amazon Linuxの言語設定を変更した</title><link>https://unionsep.dev/posts/2020/07/09/130612/</link><pubDate>Thu, 09 Jul 2020 13:06:12 +0900</pubDate><author>unionsep</author><guid>https://unionsep.dev/posts/2020/07/09/130612/</guid><description>&amp;lt;no value&amp;gt;</description><content type="text/html" mode="escaped"><![CDATA[<p>言語設定が英語のUTF-8になってたので、日本語設定しておいた。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ cat /etc/sysconfig/i18n
</span></span><span style="display:flex;"><span>LANG<span style="color:#f92672">=</span>en_US.UTF-8
</span></span></code></pre></div><p>でもlocaleは日本語になってた。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ locale
</span></span><span style="display:flex;"><span>LANG<span style="color:#f92672">=</span>ja_JP.UTF-8
</span></span><span style="display:flex;"><span>LC_CTYPE<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;ja_JP.UTF-8&#34;</span>
</span></span><span style="display:flex;"><span>LC_NUMERIC<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;ja_JP.UTF-8&#34;</span>
</span></span><span style="display:flex;"><span>LC_TIME<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;ja_JP.UTF-8&#34;</span>
</span></span><span style="display:flex;"><span>LC_COLLATE<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;ja_JP.UTF-8&#34;</span>
</span></span><span style="display:flex;"><span>LC_MONETARY<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;ja_JP.UTF-8&#34;</span>
</span></span><span style="display:flex;"><span>LC_MESSAGES<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;ja_JP.UTF-8&#34;</span>
</span></span><span style="display:flex;"><span>LC_PAPER<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;ja_JP.UTF-8&#34;</span>
</span></span><span style="display:flex;"><span>LC_NAME<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;ja_JP.UTF-8&#34;</span>
</span></span><span style="display:flex;"><span>LC_ADDRESS<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;ja_JP.UTF-8&#34;</span>
</span></span><span style="display:flex;"><span>LC_TELEPHONE<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;ja_JP.UTF-8&#34;</span>
</span></span><span style="display:flex;"><span>LC_MEASUREMENT<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;ja_JP.UTF-8&#34;</span>
</span></span><span style="display:flex;"><span>LC_IDENTIFICATION<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;ja_JP.UTF-8&#34;</span>
</span></span><span style="display:flex;"><span>LC_ALL<span style="color:#f92672">=</span>
</span></span></code></pre></div><p>まぁ、どっかの <code>rc</code> かなんかで設定してるんかなと推測。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ echo $LANG
</span></span><span style="display:flex;"><span>ja_JP.UTF-8
</span></span></code></pre></div><p>とりま変えとく</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ sudo vi /etc/sysconfig/i18n
</span></span><span style="display:flex;"><span><span style="color:#75715e">#LANG=en_US.UTF-8</span>
</span></span><span style="display:flex;"><span>LANG<span style="color:#f92672">=</span>ja_JP.UTF-8
</span></span></code></pre></div>]]></content></item><item><title>DebianのLocal timeをJSTに変更した</title><link>https://unionsep.dev/posts/2020/07/09/130307/</link><pubDate>Thu, 09 Jul 2020 13:03:07 +0900</pubDate><author>unionsep</author><guid>https://unionsep.dev/posts/2020/07/09/130307/</guid><description>&amp;lt;no value&amp;gt;</description><content type="text/html" mode="escaped"><![CDATA[<p>EC2でDebian/Ubuntuベースのインスタンスを立ち上げたときに、だいたい <code>UTC</code> になってて9時間ほど前の時間になってると思う。<br>
それはちょっと面倒なので、 <code>JST</code> に変更します。</p>
<ul>
<li><strong>Debian 10</strong> でした。</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ cat /etc/os-release
</span></span><span style="display:flex;"><span>PRETTY_NAME<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;Debian GNU/Linux 10 (buster)&#34;</span>
</span></span><span style="display:flex;"><span>NAME<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;Debian GNU/Linux&#34;</span>
</span></span><span style="display:flex;"><span>VERSION_ID<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;10&#34;</span>
</span></span><span style="display:flex;"><span>VERSION<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;10 (buster)&#34;</span>
</span></span><span style="display:flex;"><span>VERSION_CODENAME<span style="color:#f92672">=</span>buster
</span></span><span style="display:flex;"><span>ID<span style="color:#f92672">=</span>debian
</span></span><span style="display:flex;"><span>HOME_URL<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;https://www.debian.org/&#34;</span>
</span></span><span style="display:flex;"><span>SUPPORT_URL<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;https://www.debian.org/support&#34;</span>
</span></span><span style="display:flex;"><span>BUG_REPORT_URL<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;https://bugs.debian.org/&#34;</span>
</span></span></code></pre></div><ul>
<li>timezoneの確認</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ timedatectl
</span></span><span style="display:flex;"><span>               Local time: Thu 2020-07-09 03:56:56 UTC
</span></span><span style="display:flex;"><span>           Universal time: Thu 2020-07-09 03:56:56 UTC
</span></span><span style="display:flex;"><span>                 RTC time: Thu 2020-07-09 03:56:57
</span></span><span style="display:flex;"><span>                Time zone: Etc/UTC <span style="color:#f92672">(</span>UTC, +0000<span style="color:#f92672">)</span>
</span></span><span style="display:flex;"><span>System clock synchronized: yes
</span></span><span style="display:flex;"><span>              NTP service: inactive
</span></span><span style="display:flex;"><span>          RTC in local TZ: no
</span></span></code></pre></div><ul>
<li>東京のtimezoneの値を確認</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ timedatectl list-timezones|grep Tokyo
</span></span><span style="display:flex;"><span>Asia/Tokyo
</span></span></code></pre></div><ul>
<li>timezoneを東京に変更</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ sudo timedatectl set-timezone Asia/Tokyo
</span></span></code></pre></div><ul>
<li>東京の時間になったか確認</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ timedatectl
</span></span><span style="display:flex;"><span>               Local time: Thu 2020-07-09 13:02:27 JST
</span></span><span style="display:flex;"><span>           Universal time: Thu 2020-07-09 04:02:27 UTC
</span></span><span style="display:flex;"><span>                 RTC time: Thu 2020-07-09 04:02:28
</span></span><span style="display:flex;"><span>                Time zone: Asia/Tokyo <span style="color:#f92672">(</span>JST, +0900<span style="color:#f92672">)</span>
</span></span><span style="display:flex;"><span>System clock synchronized: yes
</span></span><span style="display:flex;"><span>              NTP service: inactive
</span></span><span style="display:flex;"><span>          RTC in local TZ: no
</span></span></code></pre></div><hr>
<p>インスタンスを再起動しても、Local timeが <code>JST</code> のままだったので、とりあえずよしとしました。</p>
]]></content></item><item><title>Bitnamiの右ロゴリンクを無効にした</title><link>https://unionsep.dev/posts/2020/05/28/171401/</link><pubDate>Thu, 28 May 2020 17:14:01 +0900</pubDate><author>unionsep</author><guid>https://unionsep.dev/posts/2020/05/28/171401/</guid><description>&amp;lt;no value&amp;gt;</description><content type="text/html" mode="escaped"><![CDATA[<p>Bitnami Redmineでもほぼ同じだった。</p>
<ol>
<li>sshでログイン</li>
<li>コマンド実行</li>
</ol>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ sudo /opt/bitnami/apps/wordpress/bnconfig --disable_banner <span style="color:#ae81ff">1</span>
</span></span></code></pre></div><ol start="3">
<li>httpdリスタート</li>
</ol>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ sudo /opt/bitnami/ctlscript.sh restart apache
</span></span><span style="display:flex;"><span>Unmonitored apache
</span></span><span style="display:flex;"><span>Syntax OK
</span></span><span style="display:flex;"><span>/opt/bitnami/apache2/scripts/ctl.sh : httpd stopped
</span></span><span style="display:flex;"><span>Syntax OK
</span></span><span style="display:flex;"><span>/opt/bitnami/apache2/scripts/ctl.sh : httpd started at port <span style="color:#ae81ff">80</span>
</span></span><span style="display:flex;"><span>Monitored apache
</span></span></code></pre></div>]]></content></item><item><title>お前のパソコンを構成管理してやろうか</title><link>https://unionsep.dev/posts/2018/12/14/070000/</link><pubDate>Fri, 14 Dec 2018 07:00:00 +0900</pubDate><author>unionsep</author><guid>https://unionsep.dev/posts/2018/12/14/070000/</guid><description>&amp;lt;no value&amp;gt;</description><content type="text/html" mode="escaped"><![CDATA[<p>この記事は <a href="https://qiita.com/advent-calendar/2018/pepabo">GMOペパボ Advent Calendar 2018</a> の14日目の記事です。</p>
<aside class="cite-card">
    <img
      class="cite-card__image"
      src="https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Fadvent_calendar%2Fogp%2Fcalendar-ogp-background-c24e7570f8dc39b6f4e1323cbd83d11f.jpg?ixlib=rb-4.1.1&amp;w=1200&amp;mark-x=142&amp;mark-y=128&amp;mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjEuMSZ0eHQtYWxpZ249bGVmdCUyQ3RvcCZ0eHQtY29sb3I9JTIzRkZGRkZGJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTU2JnR4dD1HTU8lRTMlODMlOUElRTMlODMlOTElRTMlODMlOUMlMjBBZHZlbnQlMjBDYWxlbmRhciUyMDIwMTgmdz05MTYmaD0zNTYmcz1kNTBkY2E0ZWQzNTQzMTc2MDI2ZTM4ZmM4YTU4NDE0OA&amp;blend-mode=normal&amp;blend-x=142&amp;blend-y=491&amp;blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjEuMSZ0eHQtYWxpZ249bGVmdCUyQ3RvcCZ0eHQtY29sb3I9JTIzRkZGRkZGJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTM2JnR4dD1HTU8lRTMlODMlOUElRTMlODMlOTElRTMlODMlOUMlRTYlQTAlQUElRTUlQkMlOEYlRTQlQkMlOUElRTclQTQlQkUmdz05MTYmcz00ZGEyZmIxOWQxOTk2ZDExMzQwYmE2MGVlNDBjNjljOA&amp;s=c7e7f154ae0437c982778d775b835570"
      alt=""
      loading="lazy"
    >

  <a href="https://qiita.com/advent-calendar/2018/pepabo" target="_blank" rel="noopener noreferrer">
    <div class="cite-card__title">GMOペパボ - Qiita Advent Calendar 2018</div>
      <div class="cite-card__description">
        Calendar page for Qiita Advent Calendar 2018 regarding GMOペパボ.
      </div>

    <div class="cite-card__site">Qiita</div>
  </a>
</aside>

<p>　さっむいですね。。<br>
前回の記事が「あっついですね」で始まっていたのにもう寒くなってしまいました。寒暖差が体に堪えても、普通に会社に出て普通に仕事しています。</p>
<p>　最近ですね、お仕事してる時にこう言われることが多くなってきたんです。</p>
<ul>
<li>開発環境が壊れて開発すべきページが見れなくて困っている</li>
<li>テンプレートのデザインしたので、コミットしておいてもらえませんか</li>
</ul>
<p>　あれ？何かが違う気がする。。。</p>
<p>気がついたら、そのたびに小一時間、下手したら丸一日かかりっきりでパソコンを直してました。</p>
<ul>
<li>Ruby のバージョンが違う</li>
<li>コンテナが buzy で止まってる</li>
<li>pid ファイルがあるのにサーバが止まってる</li>
<li>Python3 にしないと動かないはずなのに動かない</li>
<li>Composer がエラー吐く</li>
<li>PuppetLabs の VM イメージが古すぎて GnuPG の署名が通らなくなってた</li>
<li>rbenv の git リポジトリが変わってるみたいで Puppet が止まる</li>
<li>会社でホストしてた yum リポジトリがなくなってた</li>
</ul>
<p>　などなど、そもそも構築方法を見直さなければならないものから、手順自体を見直さなければならないものまで、多種多様の「動かなくなった」案件が舞い降りました。<br>
　僕はわりと壊れたものを直すのが好きなので、時間がかかっても最終的に直してしまっていたのですが、ちょっと時間取られすぎかなって思ったり、いやいや、そもそもちゃんとした開発環境もないのにちゃんと開発できてるんか？生産性とか開発のテンポってみんなどう感じてる？みたいな思いが頭の中でグールグルしていました。<br>
　そんな家でビールを飲んでテレビを見てうとうとしていた時に、なぜかデーモン閣下が僕にこうささやいていました。</p>
<pre tabindex="0"><code>「お前のパソコンを構成管理してやろうか！」
</code></pre><p>　というのは嘘なんですが、これは結構大事なんじゃあなかろうかと思いました。<br>
　確かに僕たちが開発してるものは、維持しなければならない技術スタックが多くなってきてまして、それらを維持するための解決案もあってケアされていると思っていましたが、それをブラッシュアップしきれていない状況でした。<br>
このことについては、我らが偉大なるリーダーも課題感を持っており、会社ブログで書いてました。</p>
<aside class="cite-card">
    <img
      class="cite-card__image"
      src="https://tech.pepabo.com/images/ogpimage.png"
      alt=""
      loading="lazy"
    >

  <a href="https://tech.pepabo.com/2018/06/21/development-environment-bootstrap-with-mitamae-and-fabric/" target="_blank" rel="noopener noreferrer">
    <div class="cite-card__title">ローカル開発環境の構築をMItamaeとfabricで自動化・共通化する - Pepabo Tech Portal</div>
      <div class="cite-card__description">
        こんにちは。EC事業部のチーフテクニカルリード(CTL)のけんちゃんくんさんです。この記事の公開日である6/21は私の誕生日です!おめでとう!私!!1

さて、本記事ではEC事業部…
      </div>

    <div class="cite-card__site">tech.pepabo.com</div>
  </a>
</aside>

<p>　ただ、僕としては DB を除く全てのロールをコンテナ化したいと思っていて、そのコンテナから社内 OpenStack のイメージを作成してサンドボックス環境化して行きたかったんですね。<br>
で、環境作るときはとりあえず <code>docker-compose up</code> しといて！って言ったら終わる感じにしておきたかったんですが、今の puppet どうする？ capistrano どうする？みたいなよくある構成管理はどのツールに請け負わす？みたいな解決案を持っていませんでした。<br>
　<code>docker-compose.yml</code> や <code>dockerfile</code> に全部書けるぐらいなら管理も楽だしそれがいいんですが、ちょっとそんなに単純でもないしな。かと言って本番の Terraform からキックされるクックブックとは違う開発環境のクックブックをブラッシュアップしていくことにどれほどの意味があるのか。 mitamae か確かに便利そうだなぁ、割と Ruby っぽいレシピ書くっぽいけどこれ自体を維持していけるかな。あでもなんか mruby 使ってるだけあって速いらしいけど、今のやつは Fabric と混ざってる？？<br>
　うーんうーん、と悩んでたんですが、結局、まずまずは目の前の環境が壊れている子を助けることが主眼なんだから、今手元でずっと温め続けてきた ansible-playbook をもうちょっとブラッシュアップして使ってもらったほうが早いのでは？と思い直し、とりあえずみんなの環境ができて、お隣に行ってガチャガチャ直す時間が減ってからベストプラクティスを定義しても遅くはないのではなかろうか？どうせコンテナ化したらまたバックグラウンドが変わるだろうし。と思って社内で公開しました。</p>
<p>　構成はベストプラクティスに寄せたつもりです。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ tree -L <span style="color:#ae81ff">2</span>
</span></span><span style="display:flex;"><span>.
</span></span><span style="display:flex;"><span>├── ansible.cfg
</span></span><span style="display:flex;"><span>├── dev.yml
</span></span><span style="display:flex;"><span>├── hosts
</span></span><span style="display:flex;"><span>├── log
</span></span><span style="display:flex;"><span>│   ├── debug.log
</span></span><span style="display:flex;"><span>│   roles
</span></span><span style="display:flex;"><span>│   ├── composer
</span></span><span style="display:flex;"><span>│   ├── docker
</span></span><span style="display:flex;"><span>│   ├── homebrew
</span></span><span style="display:flex;"><span>│   ├── hosts
</span></span><span style="display:flex;"><span>│   ├── migration
</span></span><span style="display:flex;"><span>│   ├── node
</span></span><span style="display:flex;"><span>│   ├── pip
</span></span><span style="display:flex;"><span>│   ├── ruby
</span></span><span style="display:flex;"><span>│   ├── sidekiq
</span></span><span style="display:flex;"><span>│   ├── styleguide
</span></span><span style="display:flex;"><span>│   ├── vagrant
</span></span><span style="display:flex;"><span>│   ├── vagrant.puppet
</span></span><span style="display:flex;"><span>│   └── workspace
</span></span><span style="display:flex;"><span>└── workspace
</span></span><span style="display:flex;"><span>    ├── repository A
</span></span><span style="display:flex;"><span>    ├── repository B
</span></span><span style="display:flex;"><span>    └── repository C
</span></span></code></pre></div><p>　抽象化した作業をロールで分解して、使いたいタスクを dev.yml のコメントを外して使ってもらって好きな playbook を使ってもらえるように意識したつもりで、例えば好きなロールのサーバの起動だけしたいとか、 homebrew でインストールしたアプリのアップデートだけしたいとか、ユースケースに併せて使えるように意識しました。今後、使ってもらっていって、固定化されたユースケースが浮き上がってきたらそれ用の playbook を作ったらいいんだし、再利用性を考慮したつもりなんですけど、こういう設計って答えがなくて無限に悩めますね。<br>
（ちなみに、これが全てではなくて、ロール固有の処理とかビジネスロジックに依存するタスクは割愛しております。</p>
<p>　Ansible 自体は前職のゲーム作っていた時に本番のサーバプロビジョニングで使っていたので、記法や勘所はすぐに思い出せたのですが、個人のパソコンをプロビジョニングする時にとっても悩んだ点を紹介します。<br>
サーバのプロビジョニングはベースとなる構成が同じなので、各個人の macOS でベースが違うプロビジョニングはかなりハードルが高いと思いました。例えば</p>
<ul>
<li>使っているシェルが zsh や fish 、 bash など異なる</li>
<li>ndenv 、 nodebrew など、言語のバージョン管理ツールが各個人で異なる</li>
<li>sudo する時のパスワード入力</li>
<li>python の実行パスが各個人で異なる</li>
<li>インストールパスに各個人の趣向が異なる</li>
<li>既にインストール済みのモジュールのエラー回避</li>
<li>ロールの設計</li>
</ul>
<p>　また、普通にハマったことはこんなもの</p>
<ul>
<li>変数にハイフン（ <code>-</code> ）を使ったら見つからなくなった</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>TASK <span style="color:#f92672">[</span>test : debug<span style="color:#f92672">]</span> ***************************************************************
</span></span><span style="display:flex;"><span>Tuesday <span style="color:#ae81ff">11</span> December <span style="color:#ae81ff">2018</span>  17:00:54 +0900 <span style="color:#f92672">(</span>0:00:01.294<span style="color:#f92672">)</span>       0:00:01.437 ******
</span></span><span style="display:flex;"><span>ok: <span style="color:#f92672">[</span>localhost<span style="color:#f92672">]</span> <span style="color:#f92672">=</span>&gt; <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;ps-test&#34;</span>: <span style="color:#e6db74">&#34;VARIABLE IS NOT DEFINED!&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span></code></pre></div><p>　こんな感じで、 <code>VARIABLE IS NOT DEFINED!</code> になってあれ？って思ったんですけど、ハイフン使わなかったら出ました<br>
（ yml かなこれは</p>
<ul>
<li><a href="https://docs.ansible.com/ansible/2.5/modules/docker_service_module.html">docker_service_module</a> は Python3 しか動かない</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#f92672">[</span>local<span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>localhost ansible_python_interpreter<span style="color:#f92672">=</span>/usr/local/bin/python3
</span></span></code></pre></div><p>hosts に <code>ansible_python_interpreter</code> を指定して Python3 のインタプリタをフルパス指定したら動きました</p>
<ul>
<li><a href="https://docs.ansible.com/ansible/2.4/vault.html">Ansible Vault</a> の使い方</li>
</ul>
<p>　個人 mac なんで、 NOPASSWD とか指定してませんから、 sudo が必要なタスクで <code>--ask-become-pass</code> を指定しておかないと権限がなくてエラーになります。<br>
パスワードの入力自体はいいんですけど、NOPASSWD を記述してる VM 内の操作にそぐわなかったので、まぁ、playbook を分けるか mac に NOPASSWD を記述します。<br>
　でも、セキュリティ上、良くないので、 vault で解決できたらそれがいいんですが、ちょっとそこまで行きませんでした。。</p>
<ul>
<li>rbenv はバージョンが切り替わるけど、 ndenv は切り替わらなかった</li>
</ul>
<p>　これは、今でもよくわかっていないのですが、 shell モジュールの実行時、 <code>.node_version</code> での node バージョンの切り替えがうまくいきませんでした。<br>
rbenv の場合、 <code>.ruby_version</code> に記載のバージョンに切り替わるので、 <code>chdir</code> を指定したらバージョンが切り替わったのですが、なぜか ndenv の場合、 <code>.node_version</code> のバージョンに切り替わりませんでした。<br>
　<code>lookup</code> を使って <code>.node_version</code> を参照して <code>node global xxx</code> で切り替わったのでそうしましたが、もうちょっと上手いことやれる気がしてます。、</p>
<h3 id="感想など">感想など<a href="#%e6%84%9f%e6%83%b3%e3%81%aa%e3%81%a9" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h3>
<p>　やっぱり自動化は面白い！って思いました。<br>
Ansible は、エラーが実行したコマンドのエラーそのまま出ますので、えー、これ使ってるんや！とか、なんでこのファイルのここをコメントアウトしてるんだ・・・とか発見が多かったです。<br>
　多分、普通にアプリ実行環境（本番とかステージング環境）の構築に Ansible を使っているだけではぶつからないエラーに引っかかるので、ちょっと Ansible 力が上がった気がします。</p>
<p>　ということで、明日の <a href="https://qiita.com/advent-calendar/2018/pepabo">GMOペパボ Advent Calendar 2018</a> は <a href="https://qiita.com/litencatt">@litencatt</a> さんです。</p>
]]></content></item><item><title>WebExtensions で Firefox Add-ons を公開してみました</title><link>https://unionsep.dev/posts/2018/08/21/175442/</link><pubDate>Tue, 21 Aug 2018 17:54:42 +0900</pubDate><author>unionsep</author><guid>https://unionsep.dev/posts/2018/08/21/175442/</guid><description>&amp;lt;no value&amp;gt;</description><content type="text/html" mode="escaped"><![CDATA[<p>　あっついですね。。<br>
前の記事からだいぶサボってました。。<br>
ブログ記事にするようなことがなかったわけではないのですが、なぜだか間が空いてしまいました。<br>
資格試験の勉強をしていたのですが、だんだん飽きてきてしまったので、そういえばブログだな〜っていうテンションで書いてます。<br>
公開してから結構経ってしまったのですが、初めて WebExtensions に触れて公開したので、メモ書きします。</p>
<p>　今年のはじめ、QAチームのエンジニアさんというポジションに配属したのですが、問い合わせ業務や改善作業や障害対応もいろいろ関連付けて仕事していたら、なんだか何でも屋さんになってしまっていて、結局僕はなんていう名前のポジションなんだろうって考えてまして、あえて言うなら最近流行りの SRE（ <code>Site Reliability Engineering</code> ）や CRE（ <code>Customer Reliability Engineer</code> ）かな〜って思ってたんですが、まぁそんな大それた感じでもないか〜って思ってました。</p>
<hr>
<p>　で、いろいろな作業をやるうちの一つに、内部脆弱性検査を実施するお仕事もありまして、 <a href="https://www.owasp.org/index.php/OWASP_Zed_Attack_Proxy_Project">OWASP ZAP</a> や <a href="https://portswigger.net/burp">BurpSuite</a> を触っていたのですが、エンジニアが少ないQAチームメンバーでも効率的に脆弱性を検査できるツールで <a href="https://vaddy.net/ja/">VAddy</a> を使おうということになりました。<br>
このツール、素晴らしく脆弱性を検査してくれます。アップデートが早いし、どんどん高機能になっているので、僕は今後もお世話になっていくことになるでしょう。
中の方が茅場町に来てくださったので、上役とお邪魔してきました。</p>
<aside class="cite-card">
    <div class="cite-card__image cite-card__image--fallback" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor"
      stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-image">
      <rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect>
      <circle cx="8.5" cy="8.5" r="1.5"></circle>
      <polyline points="21 15 16 10 5 21"></polyline>
   </svg></div>

  <a href="https://vaddy.doorkeeper.jp/events/73915" target="_blank" rel="noopener noreferrer">
    <div class="cite-card__title">https://vaddy.doorkeeper.jp/events/73915</div>

    <div class="cite-card__site">vaddy.doorkeeper.jp</div>
  </a>
</aside>

<p>　ただ、自動テストを想定しているせいか、手動でのテストは割と手間がかかるかなぁという印象です。<br>
自動テストは僕がやりたい領域のトップに入るのですが、残念ながら今、それに注力できる時間が少なく、そもそも、環境からじゃね？ってなっていまして、いろいろ遠回りするしかなくてなかなかテストスクリプトを書く段階まで至らず、でもその間にも脆弱性は検知したいので、どうしても手動によるテストや探索的テストに大きく頼らざるを得ません。<br>
そういう時、以下のマニュアルに沿って手で進めるのですが、大量にクロールデータ（テストシナリオ）を作る作業で時間がかかってしまうなぁと感じました。</p>
<aside class="cite-card">
    <div class="cite-card__image cite-card__image--fallback" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor"
      stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-image">
      <rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect>
      <circle cx="8.5" cy="8.5" r="1.5"></circle>
      <polyline points="21 15 16 10 5 21"></polyline>
   </svg></div>

  <a href="https://support.vaddy.net/hc/ja/articles/115005935107--STEP-2-%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%AB%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%81%A8%E5%AE%9F%E8%A1%8C-Proxy%E7%B7%A8" target="_blank" rel="noopener noreferrer">
    <div class="cite-card__title">https://support.vaddy.net/hc/ja/articles/115005935107--STEP-2-%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%AB%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%81%A8%E5%AE%9F%E8%A1%8C-Proxy%E7%B7%A8</div>

    <div class="cite-card__site">support.vaddy.net</div>
  </a>
</aside>

<p>　まぁ、とはいえ手順が多いとか、複雑とかではなく、やることは至って単純なのです。<br>
上記はクロールデータを作成する手順でして、ブラウザのプロキシを設定して、 begin URL（開始） を叩いて、画面操作して、 commit URL（終了）を叩けば終わりです。<br>
あとは僕が作ってくれたシナリオをスキャンするのに、ボタンポチポチするか、スクリプトでガーッとやるかなんですが、クロールデータを作成するのは、僕ではなかったりしました。テスト担当者や、 CS のメンバーにお願いしていたため、どうしてもどれのあとにこれをやって、でどうなってっていう説明が難しくてですね。<br>
説明が難しくても、厚めにフォローしてたら解決できる範囲だったのでいいのですが、 begin URL を叩いたら、変なエラーがでたとか、うまく操作してるつもりだったんだけど、クロールデータができなかったとかありまして、そのときにでたエラーを1つ1つ解消するのに苦労しました。</p>
<hr>
<p>　なんでだろうな〜、って思っていたのですが、間違って begin URL を2回叩いていたとか、クロールデータ作成中に他のメンバーが begin URL を叩いてしまって、中断されてしまったとかでした。<br>
複数メンバーで一気にクロールデータ作成を行っていたために起きていた問題と、そもそも操作ミスが原因で起きていた問題に切り分けられました。<br>
前者は検証環境を増やすことで解消できたのですが、操作ミスは依然残ってしまっていて、どうしたらスムーズに進行してもらえるかな〜と考えていまして、その結果、 Add-ons を作ることにしました。<br>
要するに、開始 URL と終了 URL を1回ずつ叩けばいいので、ブラウザの右端にアイコン作ってあげて、操作ミスを軽減したらいいのではないかと。<br>
で、開始 URL を叩いたタイミングでテスト対象の URL を開いてあげたら更にいい感じになるのではと思ったので、それぐらいなら速攻できそうだなと思われました。</p>
<a href="https://addons.mozilla.org/ja/firefox/addon/easy-vaddy-proxy-crawling/" target="_blank" rel="noopener noreferrer">Easy VAddy Proxy Crawling – 🦊 Firefox (ja) 向け拡張機能を入手</a>

<p>　はじめ、 Chrome を想定して作っていたのですが、割と出来上がってきたタイミングで、あ、Chromeのプロキシってシステムのプロキシ利用するんだったってことに気づいて、あぁあぁぁぁ。。ってなりました。<br>
確かにマニュアルにも近しいこと書いてるなぁ。なんかそういうのなかったっけって調べたんですが、 <code>sudo</code> で Chrome 叩いて、引数に Proxy を渡したら、どうやらいい感じに動いたんですが、いや、流石にちょっとPCを管理している感じの人に怒られそうだな、じゃぁ、そのままシステムのプロキシ使ってもいいんじゃない？って思ったんですが、あれ？ Slack&hellip; ってなったんで、やっぱ Firefox しかねぇって方向転換しました。<br>
最近、 Firefox も WebExtensions になったみたいだし、書いたコードも流用できるでしょうと思ってたのですが、案外 Firefox の WebExtensions の作例が少なかったので、 <a href="https://developer.mozilla.org/ja/docs/Mozilla/Add-ons">MDN</a> 読んでたら結構なボリュームだったんで、読むのに時間かけてしまいました。。。 ^^;</p>
<aside class="cite-card">
    <img
      class="cite-card__image"
      src="https://opengraph.githubassets.com/eba451aef8bba5284c7cd06905b8efdfb89a2208f53ca451d4878c7e75d53644/unionsep/easy-vaddy-proxy-crawling"
      alt=""
      loading="lazy"
    >

  <a href="https://github.com/unionsep/easy-vaddy-proxy-crawling" target="_blank" rel="noopener noreferrer">
    <div class="cite-card__title">GitHub - unionsep/easy-vaddy-proxy-crawling: Firefox Extensions for VAddy Proxy Crawling</div>
      <div class="cite-card__description">
        Firefox Extensions for VAddy Proxy Crawling. Contribute to…
      </div>

    <div class="cite-card__site">GitHub</div>
  </a>
</aside>

<p>　作りながら、うーん、このタイミングで Notification を出したいな〜とか、このタイミングのときは Icon を変えたくないなぁとか、 Option ページは bootstrap とか使ってそれなりのデザインにしたいなぁとか欲求がでてきまして、速攻とか言ってましたけど、 Add-ons を作ること自体が楽しくなってきてしまって2、3日かけてしまいました。。</p>
<hr>
<p>　まだ、ちょっと使いづらいし、例外ハンドリングが甘いのですが、僕たちがクロールデータを手動で作成するワークフローに合うように作れたと思います。<br>
チームメンバーに使ってもらって、フィードバックを得たいですが、初めてブラウザのアドオン作ったので、いい勉強になりました！</p>
]]></content></item><item><title>Androidアプリ公開しました！</title><link>https://unionsep.dev/posts/2017/09/06/152929/</link><pubDate>Wed, 06 Sep 2017 15:29:29 +0900</pubDate><author>unionsep</author><guid>https://unionsep.dev/posts/2017/09/06/152929/</guid><description>&amp;lt;no value&amp;gt;</description><content type="text/html" mode="escaped"><![CDATA[<p>　かつてより作ってみたいな〜と思っていたAndroidアプリをGooglePlayに製品版を公開しました！</p>
<aside class="cite-card">
    <div class="cite-card__image cite-card__image--fallback" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor"
      stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-image">
      <rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect>
      <circle cx="8.5" cy="8.5" r="1.5"></circle>
      <polyline points="21 15 16 10 5 21"></polyline>
   </svg></div>

  <a href="https://play.google.com/store/apps/details?id=pl_sheeter.heteml.jp.penlightsheeterz" target="_blank" rel="noopener noreferrer">
    <div class="cite-card__title">https://play.google.com/store/apps/details?id=pl_sheeter.heteml.jp.penlightsheeterz</div>

    <div class="cite-card__site">play.google.com</div>
  </a>
</aside>

<p>　WebViewで作られていたソシャゲを担当していた時、ネイティブの機能を使ってあれやりたいこれやりたいと思ったり、このJavascriptはどういう仕組で動いているんだ？と疑問に感じていたので、なんでもいいからスマホアプリを自分で手がけたいと悶々と思っていました。<br>
　まぁ、それまでアプリプラットフォームチームのコードを読んだりもしていたのですが、そもそも今の組織に入ったとき、流行り始めているスマホアプリを開発したかったという思いもあって、6年越しに一通り自分で管理できる機会に恵まれました。</p>
<p>　作ったアプリは、HTML5の <code>canvas</code> で生成した画像をスマホのストレージに保存する機能しか持たない簡単なアプリですが、なかなかはまりました。お遊びでアプリは作っていたのですが、ちょっと込み入ったことをすると途端にはまるのはいつまで経っても変わらないな。。<br>
　普通のWebViewのアンカーリンク（A要素）から画像ファイルをダウンロードするのであれば、特にはまらなかったかもしれませんが、今回はbase64エンコードされた文字列をアプリで受け取って、画像ファイルにデコードして保存という流れです。というのも、WebView上の <code>canvas</code> に文字やスタンプ画像を好きに配置して、 <code>toDataURL()</code> メソッドで <code>data:URI</code> を生成するためです。<br>
　この場合、 <code>DownloadListener</code> で受け取れるのか、 <code>WebViewClient.shouldOverrideUrlLoading(WebView view, String url)</code> で受け取れるのか挙動が分からずに色々悩みました。素人同然のため、API Levelで挙動が違うのか、端末依存なのか、WebViewのバージョンで違うのかが全く分からず、なんだかできたと思ったら他の端末で動かない、それを直したら他で動かないみたいなモグラたたき状態に陥っていました。<br>
　結局、この記事に行き着き、 <code>DownloadListener</code> ではなく <code>shouldOverrideUrlLoading</code> でもないブラウザのセキュリティの更新が原因だったみたいでした。 <code>JavascriptInterface</code> を用意して、 <code>data:URI</code> をWebViewのJSから渡してもらう方法に軌道修正して期待通りの動きにできました。なんとなくアンカーリンク（A要素）だし初アプリ実装だから、王道のメソッドで受け取りたかったんだろうなと自分にかかったバイアスの強さを感じました。</p>
<aside class="cite-card">
    <div class="cite-card__image cite-card__image--fallback" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor"
      stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-image">
      <rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect>
      <circle cx="8.5" cy="8.5" r="1.5"></circle>
      <polyline points="21 15 16 10 5 21"></polyline>
   </svg></div>

  <a href="http://pokkurutime.hatenablog.com/entry/2017/08/04/164551" target="_blank" rel="noopener noreferrer">
    <div class="cite-card__title">http://pokkurutime.hatenablog.com/entry/2017/08/04/164551</div>

    <div class="cite-card__site">pokkurutime.hatenablog.com</div>
  </a>
</aside>

<p>　だから端末によってイベントをキャッチできたりできなかったりしたんだろうなぁと振り返って思いました。他にもはまったポイントや知り得たことを忘れないように書いておこう。</p>
<ul>
<li>端末の権限の取り方
<ul>
<li>Android 7.0以降は <code>onRequestPermissionsResult</code> をOverrideしてユーザの操作をハンドリングする</li>
<li>これをOverrideしていないと権限無い状態で先の処理が走ってしまってアプリが落ちる</li>
</ul>
</li>
<li><code>ProgressDialog</code> の実装方法
<ul>
<li><code>Thread</code> で非同期にしておかないと <code>Activity</code> で管理？していないダイアログになってアプリが落ちる</li>
</ul>
</li>
<li>JSのAlertみたいなダイアログの実装方法
<ul>
<li><code>AlertDialog.Builder</code> でボタンの挙動だったり表示文字をセットできる</li>
</ul>
</li>
<li>画面回転した場合、WebView
の更新処理が走る
<ul>
<li><code>restoreState()</code> で <code>savedInstanceState</code> を保存しておくメソッドをOverrideしておく</li>
</ul>
</li>
<li>Webアプリじゃないので、戻るボタンを押されたときの挙動を実装しておく
<ul>
<li><code>onKeyDown()</code> をOverrideして実装しておかないと、トップページに戻った時に再度戻るボタンを押したら別のページに遷移したりする</li>
<li>この挙動がネイティブアプリっぽくないから、適切に押下を無視するとか <code>finish()</code> とかを実装しておく</li>
</ul>
</li>
<li>アプリからWebViewのHTMLを変えたい
<ul>
<li><code>onPageFinished()</code> とかをOverrideして <code>loadUrl()</code> でJSを即時実行させると動く</li>
</ul>
</li>
<li>リファレンス機は必要
<ul>
<li>エミュレータで確認していたのですが、どうやらWebViewの更新が追いついていなかったのかな？動かなかった。。</li>
<li>Nexux5xも息が長いけど、公式リファレンス実機の確認は絶対やったほうがいい</li>
</ul>
</li>
</ul>
<hr>
<p>　実装はとても楽しかったので、最後にアプリの紹介をば。
これは所属する会社のお産合宿に誘われたのがきっかけで始まったことでした。</p>
<aside class="cite-card">
    <div class="cite-card__image cite-card__image--fallback" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor"
      stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-image">
      <rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect>
      <circle cx="8.5" cy="8.5" r="1.5"></circle>
      <polyline points="21 15 16 10 5 21"></polyline>
   </svg></div>

  <a href="http://osan.pepabo.com/" target="_blank" rel="noopener noreferrer">
    <div class="cite-card__title">http://osan.pepabo.com/</div>

    <div class="cite-card__site">osan.pepabo.com</div>
  </a>
</aside>

<p>　さらっと <code>canvas</code> で画像ファイルを・・・と話しましたが、それはアイドルのコンサートなんかで光らせるキングブレードというペンライトに装飾をするための画像ファイルです。キングブレードの内紙にバッチリ合う画像ファイルをコンビニで印刷できる（コンサートへ向かう最中でも推しメン用にカスタマイズできる）ことが売りです。<br>
　そちら方面はまったく詳しくないのですが、  <a href="https://twitter.com/souseiji">@souseiji</a> さんや <a href="https://twitter.com/_mmmix">@_mmmix</a> さんの話を聞く内にチャンスなのではないかと感じて参戦させていただいた次第です。</p>
<aside class="cite-card">
    <div class="cite-card__image cite-card__image--fallback" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor"
      stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-image">
      <rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect>
      <circle cx="8.5" cy="8.5" r="1.5"></circle>
      <polyline points="21 15 16 10 5 21"></polyline>
   </svg></div>

  <a href="https://www.amazon.co.jp/%E3%83%AB%E3%82%A4%E3%83%95%E3%82%A1%E3%83%B3-%E3%82%B8%E3%83%A3%E3%83%91%E3%83%B3-%E3%82%AD%E3%83%B3%E3%82%B0%E3%83%96%E3%83%AC%E3%83%BC%E3%83%89X10III-Neo-%E3%82%B7%E3%83%A3%E3%82%A4%E3%83%8B%E3%83%B3%E3%82%B0/dp/B015E0NEAI/ref=pd_cp_21_1?_encoding=UTF8&amp;psc=1&amp;refRID=KHYT9AJXZ6CQVYW0XGC0" target="_blank" rel="noopener noreferrer">
    <div class="cite-card__title">Amazon.co.jp</div>

    <div class="cite-card__site">www.amazon.co.jp</div>
  </a>
</aside>

<p>　途中、まったくわからないキーワードに出会ったり、自分用のキングブレード買ったり、帰りにスターマリーのコンサートに連れて行ってもらったりと、開発以外にも色々初体験が多い期間で楽しかったです。</p>
<aside class="cite-card">
    <img
      class="cite-card__image"
      src="https://static.wixstatic.com/media/971c66_05755d35c75d4020bbcbf0eb6b347f8d~mv2.jpg/v1/fill/w_2500,h_1667,al_c/971c66_05755d35c75d4020bbcbf0eb6b347f8d~mv2.jpg"
      alt=""
      loading="lazy"
    >

  <a href="http://starmarie.com/" target="_blank" rel="noopener noreferrer">
    <div class="cite-card__title">ホーム | STARMARIE</div>

    <div class="cite-card__site">STARMARIE official</div>
  </a>
</aside>

<p>　今回は、金銭的にも期間的にもAndroidアプリに絞って作りましたが、会社の人たちはiPhone率が高いので、空いた時間にちょびちょび作ってしれっとiOSアプリも公開しとこうかな〜</p>
]]></content></item><item><title>コードレビューのおきもち</title><link>https://unionsep.dev/posts/2017/07/25/123456/</link><pubDate>Tue, 25 Jul 2017 12:34:56 +0900</pubDate><author>unionsep</author><guid>https://unionsep.dev/posts/2017/07/25/123456/</guid><description>&amp;lt;no value&amp;gt;</description><content type="text/html" mode="escaped"><![CDATA[<p>　今日、わりとふと感じたことがあったので、一応メモしておこうかと思って書いてます。
チームでペアレビューの話が軽く出て、あぁ、そうかと納得したのですが、レビューってどう感じてますか？
レビューって、以下のようなことを目的としてやってるかと思います。</p>
<ul>
<li>多角的な視点でコードを見て、不具合を減らす</li>
<li>タイポの防止</li>
<li>メンバー間のコミュニケーション</li>
<li>人に説明できるコードを書けているかの確認</li>
</ul>
<p>　よく言われてるから、今更どうとかではないし、上記を考えるとレビューをやる意義があると考えています。</p>
<hr>
<p>　ただ、まだ駆け出しの頃は、レビューをするのもされるのも苦手でした。
振り返ってみて、なんで苦手だったかは、既に自分の中で答えが出ていました。</p>
<p><code>なんかケチつける or つけられてるみたいでマイナスなおきもち</code></p>
<p>　どんなにメンバーの関係が良好でも、言葉を選んでも、1%はそういう意味合いが僕にあったし感じていました。（関西人だから、自意識が高いのかなｗ？）<br>
でも多分、それは今でも変わっていないので、だから、今でもする時もされる時も気を使っています。<br>
　で、その気を遣うっていうのは、間違っていないんだとも思っています。
コードレビューじゃなくても、普段の生活をしていて、誰かに指摘や注意をする時って、気を遣いますよね。
それは、関係性をうまくし続けるために、必要な人間的活動なんだと思います。</p>
<p>　じゃあ、そのもやもやした意識を持ち続けて今後レビュー活動に勤しんでいても良いものかと、多分漠然と思っていたんでしょう。自分が。
でですね、やっと感じていたもやもやを打ち勝たせる魔法の考えがふと頭をよぎったのでした。</p>
<hr>
<p>　コードレビューに対話やコミュニケーションの意義を見出すことに近いのですが、多分、僕が今後、レビューやペアレビューをするときは以下の思いを持って接していると思います。</p>
<p><code>僕の思想や考え方をあげるからちょうだい</code></p>
<p>　レビューをですね、いろんな人とすることによって、ペアになった人の思考や思想がどんな形であれ、自分の中に流れてきますよね。
それを受け取ったら、どのような感情を抱いても自分の中には入ってきてるんですよね。多分。そういう自分の考えじゃないものをいっぱい受け取って気に入ったものを反芻することで、自分の感性がブラッシュアップされていくんだと思うんですよね。<br>
　今、僕が立っている場所はそういう活動を活発にしようとしているから、若いエンジニアは、広い視野を持ったり、知識を得る機会に恵まれて早く成長できるんだろうなと思ったんですよ。<br>
　良いアイデアなのかそうでないのかを相対的に判断する必要はなくて、受け取った人の感性で継承していけばいいんじゃないのかな。それを個々人がコミュニティでやっていれば、自然淘汰されて良いアイデアが残っていくのではないか。自分のクローンは作らなくていいけど、いわゆる上位のエンジニアレベルの人間をできるだけ早く作るために、良いアイデアの生存競争を活発にすれば良いのではないかと。</p>
<hr>
<p>　まぁ、であるならば生存競争の機会はレビューじゃなくても良いんだけど、レビューはわかりやすい場であるかな。
そう思えば、多少苦手でも、苦にならないなと自分は思った次第です。</p>
<hr>
<p>　なんで今さらそんなことをふと思いついたのかはよくわかりませんが、<code>WEB+DB PRESS</code> を執筆させて頂く機会に恵まれた事は関係していると思います。
エンジニアになってから、よく目にする機会があった本に執筆させて頂く機会を与えてくださり、ありがとうございました。<br>
　報告することが遅れてしまって申し訳ありませんでしたが、自分の知識の棚卸しを本にするという、なかなか体験できない経験をさせて頂いた技術評論社 池田様や、弊社メンバーに感謝しています。</p>
<aside class="cite-card">
    <img
      class="cite-card__image"
      src="https://gihyo.jp/assets/images/ogp/2017/vol99.jpg"
      alt=""
      loading="lazy"
    >

  <a href="http://gihyo.jp/magazine/wdpress/archive/2017/vol99" target="_blank" rel="noopener noreferrer">
    <div class="cite-card__title">WEB&#43;DB PRESS Vol.99</div>
      <div class="cite-card__description">
        特集1
［Rubyで学ぶ！］良いコードって何だろう？
現場で光る✨ 変数、メソッド、クラス、モジュール活用法

コードを読んでいると、「何をしているか理解しやすいな」「機能…
      </div>

    <div class="cite-card__site">技術評論社</div>
  </a>
</aside>

]]></content></item><item><title>Zephirはじめてみました</title><link>https://unionsep.dev/posts/2017/06/30/190432/</link><pubDate>Fri, 30 Jun 2017 19:04:32 +0900</pubDate><author>unionsep</author><guid>https://unionsep.dev/posts/2017/06/30/190432/</guid><description>&amp;lt;no value&amp;gt;</description><content type="text/html" mode="escaped"><![CDATA[<p>どうも</p>
<aside class="cite-card">
    <img
      class="cite-card__image"
      src="https://ogimage.blog.st-hatena.com/10328537792370092437/10328749687236641325/1492068189"
      alt=""
      loading="lazy"
    >

  <a href="http://unionsep.hatenablog.com/entry/2017/04/13/162309" target="_blank" rel="noopener noreferrer">
    <div class="cite-card__title">再帰的なarray_searchを作った</div>
      <div class="cite-card__description">
        どもども すっかり春な気候になってきて、フレッシュな方々を目にする機会が多くなりました。 フレッシュな感じに羨望の眼差しを向けながら、ここ4年ぐらい、ず〜っとPHPをメインに扱って…
      </div>

    <div class="cite-card__site">Webメモ</div>
  </a>
</aside>

<p>前回の記事で少し話しましたが、Zephirを触ってみました<br>
ZephirはPHPカンファレンス2015ぐらいに見聞きしていて、興味のあるプロダクトでした</p>
<aside class="cite-card">
    <img
      class="cite-card__image"
      src="https://assets.phalcon.io/zephir/logo.png"
      alt=""
      loading="lazy"
    >

  <a href="https://zephir-lang.com/" target="_blank" rel="noopener noreferrer">
    <div class="cite-card__title">Zephir Website</div>
      <div class="cite-card__description">
        Zephir is an open source, high-level/domain specific language designed to ease the…
      </div>

    <div class="cite-card__site">Zephir Website</div>
  </a>
</aside>

<aside class="cite-card">
    <img
      class="cite-card__image"
      src="http://phpcon.php.gr.jp/2015/ogp.png"
      alt=""
      loading="lazy"
    >

  <a href="http://phpcon.php.gr.jp/2015/" target="_blank" rel="noopener noreferrer">
    <div class="cite-card__title">PHPカンファレンス2015</div>
      <div class="cite-card__description">
        PHPカンファレンスは、国内最大のPHPイベントとして2000年より毎年夏に開催されています。今年も10月3日（土）に大田区産業プラザ（PiO)にて開催いたします。
      </div>

    <div class="cite-card__site">PHPカンファレンス2015</div>
  </a>
</aside>

<p>ただ、インストールしてみるものの、なかなか実際にどんなものか確かめるまでに至らなかったのですが、おもむろに見てみたらバージョンが <code>0.9.8</code> になっててそろそろ正式版になるのではと思って焦って触りましたｗ</p>
<hr>
<p><a href="https://docs.zephir-lang.com/en/latest/install.html">Installation</a> に <code>If you’re using Ubuntu</code> って書いてあったので、手持ちのUbuntu16.04にインストールしてみました<br>
ホント、最近 <code>apt</code> でなんでもインストールできますよね<br>
みんなUbuntu好きなのかな</p>
<p>インストール自体は書いてある通りに <code>gcc</code> やら <code>PHP</code> を入れて <code>git clone</code> して installer叩くだけなので、手順は割愛します</p>
<p>で、とりあえず <a href="https://docs.zephir-lang.com/en/latest/tutorial.html">Tutorial</a> にあるものを作ってみました<br>
他でも書かれてありますが、ちょっとコードを書いてPHPとの違いを意識したのは以下ぐらいでした</p>
<ul>
<li>変数の書き換えに <code>let</code> を指定</li>
<li><code>namespace</code> は必須</li>
<li><code>for</code> は <code>foreach</code> になる</li>
<li><code>if</code> で条件式に括弧いらない</li>
<li>型がPHPより厳密</li>
<li>functionの戻り値の型をhintで指定できる</li>
</ul>
<p>まぁ、JavaとかC#とか触ってる人だったら、あんまり意識しなくても自然な流れで書けるのではないでしょうか<br>
聞いていた <code>elseif</code> が使えないというのも、このバージョンでは使えるようになっているみたい</p>
<a href="https://docs.zephir-lang.com/latest/introduction/#if-statement" target="_blank" rel="noopener noreferrer">Introduction - Zephir Documentation</a>

<hr>
<p>でですね、再帰的なarray_searchを作ろうと思ってこんなコードを書いてみたわけですが、結構ハマりました<br>
書いたと言いましたが、多分これじゃない感じなんですけど、それっぽいものが書けたので、とりあえずコードは載せようと思いまして^^;<br>
どうもZephirにはPHPの <code>use</code> に相当する機能（参照渡し）がないようで、どう解消しようかハマっていました<br>
結果どうなのか追えていないのですが、以下あたりで議論されてるみたいです</p>
<aside class="cite-card">
    <img
      class="cite-card__image"
      src="https://opengraph.githubassets.com/ff1f08c6055946bcb1ce7b07f8b010d3a18450af942a637c0aebcf0b8e0c3cec/zephir-lang/zephir/issues/1318"
      alt=""
      loading="lazy"
    >

  <a href="https://github.com/phalcon/zephir/issues/1318" target="_blank" rel="noopener noreferrer">
    <div class="cite-card__title">Is Zephir supported use keyword in closure? · Issue #1318 · zephir-lang/zephir</div>
      <div class="cite-card__description">
        the code here:https://docs.zephir-lang.com/en/latest/closures.html namespace MyLibrary;…
      </div>

    <div class="cite-card__site">GitHub</div>
  </a>
</aside>

<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-php" data-lang="php"><span style="display:flex;"><span><span style="color:#66d9ef">namespace</span> <span style="color:#a6e22e">Utils</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">class</span> <span style="color:#a6e22e">Arrays</span>
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">private</span> <span style="color:#66d9ef">static</span> <span style="color:#a6e22e">keys</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">public</span> <span style="color:#66d9ef">static</span> <span style="color:#66d9ef">function</span> <span style="color:#a6e22e">arraySearchRecursive</span>(<span style="color:#66d9ef">var</span> <span style="color:#a6e22e">needle</span>, <span style="color:#66d9ef">var</span> <span style="color:#a6e22e">heystack</span>) <span style="color:#f92672">-&gt;</span> <span style="color:#a6e22e">array</span>
</span></span><span style="display:flex;"><span>    {
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">let</span> <span style="color:#a6e22e">self</span><span style="color:#f92672">::</span><span style="color:#a6e22e">keys</span> <span style="color:#f92672">=</span> [];
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">self</span><span style="color:#f92672">::</span><span style="color:#a6e22e">search</span>(<span style="color:#a6e22e">needle</span>, <span style="color:#a6e22e">heystack</span>);
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span> <span style="color:#a6e22e">self</span><span style="color:#f92672">::</span><span style="color:#a6e22e">keys</span>;
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">private</span> <span style="color:#66d9ef">static</span> <span style="color:#66d9ef">function</span> <span style="color:#a6e22e">search</span>(<span style="color:#66d9ef">var</span> <span style="color:#a6e22e">needle</span>, <span style="color:#66d9ef">var</span> <span style="color:#a6e22e">heystack</span>) <span style="color:#f92672">-&gt;</span> <span style="color:#a6e22e">bool</span>
</span></span><span style="display:flex;"><span>    {
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">var</span> <span style="color:#a6e22e">key</span>, <span style="color:#a6e22e">val</span>;
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">for</span> <span style="color:#a6e22e">key</span>, <span style="color:#a6e22e">val</span> <span style="color:#a6e22e">in</span> <span style="color:#a6e22e">heystack</span> {
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">if</span> <span style="color:#a6e22e">is_array</span>(<span style="color:#a6e22e">val</span>) {
</span></span><span style="display:flex;"><span>                <span style="color:#a6e22e">self</span><span style="color:#f92672">::</span><span style="color:#a6e22e">search</span>(<span style="color:#a6e22e">needle</span>, <span style="color:#a6e22e">val</span>);
</span></span><span style="display:flex;"><span>            } <span style="color:#66d9ef">else</span> {
</span></span><span style="display:flex;"><span>                <span style="color:#66d9ef">if</span> <span style="color:#a6e22e">needle</span> <span style="color:#f92672">==</span> <span style="color:#a6e22e">val</span> {
</span></span><span style="display:flex;"><span>                    <span style="color:#a6e22e">let</span> <span style="color:#a6e22e">self</span><span style="color:#f92672">::</span><span style="color:#a6e22e">keys</span>[] <span style="color:#f92672">=</span> <span style="color:#a6e22e">key</span>;
</span></span><span style="display:flex;"><span>                }                
</span></span><span style="display:flex;"><span>            }
</span></span><span style="display:flex;"><span>        }
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span>;
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><hr>
<p>どうやらSuperGlobal、_POSTの値とかも取れるみたいで、取る必要ないんちゃうかなとか思いました^^;<br>
言語仕様は、そこまで込み入った感じはなかったのですが、<code>function</code> に <code>-&gt;</code> 指定で返却値の型をhintで書けるぐらいが独特かなぁというぐらいでした</p>
<a href="http://tech.cygames.co.jp/archives/2976/" target="_blank" rel="noopener noreferrer">【PHPカンファレンス2016 フォローアップ】Cygamesを支えるPHPについて講演しました | Cygames Engineers&#39; Blog</a>

<p>こちらの記事にも書かれている通り、配列処理で高速化が見込めるそうです<br>
僕も計測をしてみたかったのですが、わりとハマったので一旦ここで断念しましたが、ソーシャルゲームを開発していた時は、巨大な配列処理を行う事が結構あったので、ガチャロジックとか開催中のイベント配列とかで使えないかなと思いました<br>
あと、単純にextension化することで、簡単に処理を変更できなくするという意味でも有効性を見いだせる気がしています</p>
<p>今はゲーム事業から離れてしまったので、Zephirを使って高速化を試みるより、リファクタリングやDBの正規化で事足りますが、いつかキラーコンテンツとして提案できる日が来たらいいなぁと思っています<br>
いつか使うど！</p>
<p>（UbuntuデフォのFirefoxではてな開くと英語になったのにちょっと感動した！）</p>
]]></content></item><item><title>再帰的なarray_searchを作った</title><link>https://unionsep.dev/posts/2017/04/17/162309/</link><pubDate>Thu, 13 Apr 2017 16:23:09 +0900</pubDate><author>unionsep</author><guid>https://unionsep.dev/posts/2017/04/17/162309/</guid><description>&amp;lt;no value&amp;gt;</description><content type="text/html" mode="escaped"><![CDATA[<p>どもども</p>
<p>すっかり春な気候になってきて、フレッシュな方々を目にする機会が多くなりました。
フレッシュな感じに羨望の眼差しを向けながら、ここ4年ぐらい、ず〜っとPHPをメインに扱っています。</p>
<p>う〜ん、もともとず〜っとJava、Perlな感じの人で、敷居が低いと噂のPHPを横目に見てましたが、ソシャゲを扱うようになってPHPも扱うようになったんですが、もはや何を作るにしても、もうPHPでよくね？みたいな脳みそになってしまったのが良かったのか悪かったのか。。<br>
まぁ、アンチPHPな方もお見かけしますし、当然、僕自身もPHPのこの言語仕様はやだな〜って思ったりしたりすることもあります。
確かにレガシーなシステムを扱うときに、脳みそひねくり回さないとダメなときもあるし、<a href="https://secure.php.net/manual/ja/index.php">PHPマニュアル</a> 見てて、え、そうなの。。って思うときもあります。<br>
でも地雷を踏まない能力ってエンジニアに必要な能力の一つだったりするのかなぁって今は思っています。
そういう能力を養うコストと、PHP
の強力な文字列処理や配列処理の恩恵を受けるメリットを天秤にかけて、やっぱPHPで良いかなぁと思う次第です。。</p>
<hr>
<p>個人的なコラムはどうでもいいとして、僕がPHPを気に入っている面の一つが配列処理です。
<code>array_column</code> とか <code>usort</code> とかは超気にいってますが、 <code>array_search</code> が単一階層の配列しか検索してくれない。。
配列の中に設定項目を連想配列にして詰め込んで、特定の設定項目を探し出すっていうケース、ソシャゲでは結構あったんですが、ソシャゲから離れた今、またそういう要件に対峙する時が来ました。
あれ、こういうパターンって確か共通関数にしてたなぁって思ったので、はてブから「そろそろブログ書かない？」メールも来たので、筆を取る気になりました。</p>
<p>想定している連想配列は以下のような構造です。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-php" data-lang="php"><span style="display:flex;"><span>$event <span style="color:#f92672">=</span> <span style="color:#66d9ef">array</span>(
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">array</span>(
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#39;start_date&#39;</span> <span style="color:#f92672">=&gt;</span> <span style="color:#e6db74">&#39;2017-01-01 00:00:00&#39;</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#39;end_date&#39;</span> <span style="color:#f92672">=&gt;</span> <span style="color:#e6db74">&#39;2017-03-31 23:59:59&#39;</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#39;key&#39;</span> <span style="color:#f92672">=&gt;</span> <span style="color:#e6db74">&#39;event_1&#39;</span>
</span></span><span style="display:flex;"><span>    ),
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">array</span>(
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#39;start_date&#39;</span> <span style="color:#f92672">=&gt;</span> <span style="color:#e6db74">&#39;2017-02-01 00:00:00&#39;</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#39;end_date&#39;</span> <span style="color:#f92672">=&gt;</span> <span style="color:#e6db74">&#39;2017-04-31 23:59:59&#39;</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#39;key&#39;</span> <span style="color:#f92672">=&gt;</span> <span style="color:#e6db74">&#39;event_2&#39;</span>
</span></span><span style="display:flex;"><span>    ),
</span></span><span style="display:flex;"><span>);
</span></span></code></pre></div><p><code>key</code> が <code>event_2</code> の要素番号を取りたいといった場面がよくありました。
ここで、 <code>array_search</code> でって思うのですが、このような配列の中に配列がある多重配列構造の場合、思った通りの動作をしてくれません。
そこで、こんな関数を作ってみました。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-php" data-lang="php"><span style="display:flex;"><span><span style="color:#66d9ef">function</span> <span style="color:#a6e22e">array_search_recursive</span>($needle, $heystack)
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    $keys <span style="color:#f92672">=</span> <span style="color:#66d9ef">array</span>();
</span></span><span style="display:flex;"><span>    $func <span style="color:#f92672">=</span> <span style="color:#66d9ef">function</span> ($needle, $heystack) <span style="color:#66d9ef">use</span> (<span style="color:#f92672">&amp;</span>$func, <span style="color:#f92672">&amp;</span>$keys) {
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">foreach</span> ($heystack <span style="color:#66d9ef">as</span> $key <span style="color:#f92672">=&gt;</span> $val) {
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">is_array</span>($val)) {
</span></span><span style="display:flex;"><span>                <span style="color:#66d9ef">if</span> ($func($needle, $val) <span style="color:#f92672">!==</span> <span style="color:#66d9ef">false</span>) {
</span></span><span style="display:flex;"><span>                    $keys[] <span style="color:#f92672">=</span> $key;
</span></span><span style="display:flex;"><span>                }
</span></span><span style="display:flex;"><span>            }
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">if</span> ($needle <span style="color:#f92672">==</span> $val) {
</span></span><span style="display:flex;"><span>                $keys[] <span style="color:#f92672">=</span> $key;
</span></span><span style="display:flex;"><span>            }
</span></span><span style="display:flex;"><span>        }
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span> <span style="color:#66d9ef">false</span>;
</span></span><span style="display:flex;"><span>    };
</span></span><span style="display:flex;"><span>    $func($needle, $heystack);
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> $keys;
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p><code>$needle</code> に検索したいキーワード、 <code>$heystack</code> に検索対象の配列を指定すると、検索に引っかかる要素番号を配列で返します。
検索に引っかからなかった場合は、空配列を返します。</p>
<p>これ、同じことを考えておられた方がいて、こちらのQiitaの記事を参考にしました。</p>
<aside class="cite-card">
    <img
      class="cite-card__image"
      src="https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-user-contents.imgix.net%2Fhttps%253A%252F%252Fcdn.qiita.com%252Fassets%252Fpublic%252Farticle-ogp-background-afbab5eb44e0b055cce1258705637a91.png%3Fixlib%3Drb-4.1.1%26w%3D1200%26blend64%3DaHR0cHM6Ly9xaWl0YS11c2VyLXByb2ZpbGUtaW1hZ2VzLmltZ2l4Lm5ldC9odHRwcyUzQSUyRiUyRnFpaXRhLWltYWdlLXN0b3JlLnMzLmFtYXpvbmF3cy5jb20lMkYwJTJGNDQzMTclMkZwcm9maWxlLWltYWdlcyUyRjE0NzM2ODk4NTY_aXhsaWI9cmItNC4xLjEmYXI9MSUzQTEmZml0PWNyb3AmbWFzaz1lbGxpcHNlJmJnPUZGRkZGRiZmbT1wbmczMiZzPWJiZTk0ZTU5MWIxZWE4MDFlYTNjNzQ2MDUzZjFkMDAz%26blend-x%3D120%26blend-y%3D467%26blend-w%3D82%26blend-h%3D82%26blend-mode%3Dnormal%26s%3D4abade8d2ca55a8177ee23ddf42aa93c?ixlib=rb-4.1.1&amp;w=1200&amp;fm=jpg&amp;mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjEuMSZ3PTk2MCZoPTMyNCZ0eHQ9UEhQJTNBJTIwJUU1JUE0JTlBJUU2JUFDJUExJUU1JTg1JTgzJUU5JTg1JThEJUU1JTg4JTk3JUUzJTgxJUE3YXJyYXlfc2VhcmNoJUUzJTgyJTkyJUU0JUJEJUJGJUUzJTgxJTg4JUUzJTgyJThCJUUzJTgyJTg4JUUzJTgxJTg2JUUzJTgxJUFCJUUzJTgxJTk5JUUzJTgyJThCJUU5JTk2JUEyJUU2JTk1JUIwJnR4dC1hbGlnbj1sZWZ0JTJDdG9wJnR4dC1jb2xvcj0lMjMxRTIxMjEmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9NTYmdHh0LXBhZD0wJnM9OWEzYzJjMDM2NzQxNWZlMThkNWMyZGUwZTdkYmU1MDQ&amp;mark-x=120&amp;mark-y=112&amp;blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjEuMSZ3PTgzOCZoPTU4JnR4dD0lNDB5b3Jrc3lvJnR4dC1jb2xvcj0lMjMxRTIxMjEmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9MzYmdHh0LXBhZD0wJnM9ZGVlODNlZmNmNmY3NWMxYjI3ODM2MWIxZGYzMTY2MjM&amp;blend-x=242&amp;blend-y=480&amp;blend-w=838&amp;blend-h=46&amp;blend-fit=crop&amp;blend-crop=left%2Cbottom&amp;blend-mode=normal&amp;s=4652f6c848b28b4b86c14a1db94454ff"
      alt=""
      loading="lazy"
    >

  <a href="http://qiita.com/yorksyo/items/4b0cbec7dcaec86907ab" target="_blank" rel="noopener noreferrer">
    <div class="cite-card__title">PHP: 多次元配列でarray_searchを使えるようにする関数</div>
      <div class="cite-card__description">
        1次元配列まで対応しているarray_searchを多次元配列に使えるようにする関数を作ってみました in_arrayとarray_valuesと多次元配列についてのコチラの投稿を…
      </div>

    <div class="cite-card__site">Qiita</div>
  </a>
</aside>

<p>記事では検索キーワードに引っかかった最初の要素番号を返却していますが、仰っている通り、引っかかった全ての要素番号を返却した方が、汎用性が高くなりそうだったので、少し改良しています。
とは言え、クロージャに配列を参照渡しして、引っかかったら配列に詰めるってとこしか改良していませんが。。^^;</p>
<hr>
<p>あと、 <code>start_date</code> が <code>2017-01-15 00:00:00</code> 以降の要素番号とかを取りたいとかもありますよね。<br>
そういう場合は、 <code>array_search_recursive</code> に関数を渡せるようにしてあげたら、もっとかっこよくなるかなぁ。
でも今回はそういう要件ではなかったので、脳みそ終了しました。</p>
<hr>
<p>クロージャを代入した変数を参照渡しして、検索対象が配列だった場合、どんどん下層まで検索していくので、リークしないか気になるとこですが、そこそこ使えるのではないでしょうか<br>
とは言え、 <code>array_column</code> で似たようなことできるよね〜とも思うのですが、実は開発環境は5.3みたいなとこあるのでは？</p>
<p>こういうの、Zephirで実装できたらかっこいいよねぇ</p>
<aside class="cite-card">
    <img
      class="cite-card__image"
      src="https://assets.phalcon.io/zephir/logo.png"
      alt=""
      loading="lazy"
    >

  <a href="https://zephir-lang.com/" target="_blank" rel="noopener noreferrer">
    <div class="cite-card__title">Zephir Website</div>
      <div class="cite-card__description">
        Zephir is an open source, high-level/domain specific language designed to ease the…
      </div>

    <div class="cite-card__site">Zephir Website</div>
  </a>
</aside>

<p>最後に、いつぞやのPHPカンファレンスで見た尊敬するRasmus Lerdorfのインタビュー記事でも載せておこうかな〜</p>
<aside class="cite-card">
    <img
      class="cite-card__image"
      src="https://gihyo.jp/assets/images/ICON/2015/1458_rasmus-interview.jpg"
      alt=""
      loading="lazy"
    >

  <a href="http://gihyo.jp/news/report/2015/12/1401" target="_blank" rel="noopener noreferrer">
    <div class="cite-card__title">PHPの生みの親、ラスマス・ラードフ氏インタビュー</div>
      <div class="cite-card__description">
        2015年12月に無事公開されたPHP7。その公開に先立ってPHPの生みの親であるラスマス・ラードフ氏に話を伺う機会がありました。がラスマス氏の思想がよく分かる話題が多く、可能な限…
      </div>

    <div class="cite-card__site">gihyo.jp</div>
  </a>
</aside>

]]></content></item><item><title>続 select結果をcsvでファイル出力</title><link>https://unionsep.dev/posts/2017/03/07/192632/</link><pubDate>Tue, 07 Mar 2017 19:26:32 +0900</pubDate><author>unionsep</author><guid>https://unionsep.dev/posts/2017/03/07/192632/</guid><description>&amp;lt;no value&amp;gt;</description><content type="text/html" mode="escaped"><![CDATA[<aside class="cite-card">
    <img
      class="cite-card__image"
      src="https://ogimage.blog.st-hatena.com/10328537792370092437/10328749687214380007/1486437386"
      alt=""
      loading="lazy"
    >

  <a href="http://unionsep.hatenablog.com/entry/2017/02/07/114941" target="_blank" rel="noopener noreferrer">
    <div class="cite-card__title">select結果をcsvでファイル出力</div>
      <div class="cite-card__description">
        自分では結構前から便利に使ってるんだけど、意外に重宝されることが最近ありました それがこれ select * from hoge into outfile…
      </div>

    <div class="cite-card__site">Webメモ</div>
  </a>
</aside>

<p>先月、mysqlの <code>into outfile</code> でレコードをCSVファイルにサクッと取ってた記事を書きました<br>
で、これは知ってるんだけど、今回はこれじゃダメなんだよな〜ってときに、どうしていたか思い出したので、記事書く気になりました</p>
<p>というのも、</p>
<ol>
<li><code>into outfile</code> を使うと <code>access denied</code> になる場合も権限によってはあるね</li>
<li>mysqlがsshトンネルの先にあって、その先のsshは許可されてないの・・・とか</li>
<li>ファイルにしたら巨大過ぎて、そんなの置くスペースないぜ！とか</li>
</ol>
<p>過去を思い返すと、3. のパターンはあったな〜という思い出です<br>
確かあれはサーバフルリプレイスしてたときに、あのvmが・・・</p>
<p>まぁ、というわけなんですが、手順はこんな感じ</p>
<ol>
<li><code>mysql</code> コマンドに <code>-e</code> つけてSQLを投げる</li>
<li>
<ol>
<li>はタブ区切りで出力されるから、 <code>sed</code> でタブをカンマに変換</li>
</ol>
</li>
<li>csvファイルにリダイレクトする</li>
</ol>
<p>1 . のSQLですが、文字列系はダブルクオーテーションで囲う</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-sql" data-lang="sql"><span style="display:flex;"><span><span style="color:#66d9ef">select</span>
</span></span><span style="display:flex;"><span>  concat(<span style="color:#e6db74">&#39;&#34;&#39;</span>, hoge, <span style="color:#e6db74">&#39;&#34;&#39;</span>) <span style="color:#66d9ef">as</span> hoge,
</span></span><span style="display:flex;"><span>  hige <span style="color:#66d9ef">as</span> hige,
</span></span><span style="display:flex;"><span>  concat(<span style="color:#e6db74">&#39;&#34;&#39;</span>, huga, <span style="color:#e6db74">&#39;&#34;&#39;</span>) <span style="color:#66d9ef">as</span> huga
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">from</span> hogehoge
</span></span></code></pre></div><p>ワンライナーで書けるSQLだったら <code>-e</code> に続けて書いてもいいけど、 <code>concat</code> とか使ってたらそうも行かないので、SQLファイルにしておく<br>
で、これでファイルを <code>cat</code> してクエリをmysqlに流し込んで、ファイルにリダイレクトしておく<br>
この時、mysqlはタブ区切りに出力してくれるみたいなので、なんとなく拡張子を <code>tsv</code> にしてます</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>mysql -uroot hohoidb -e <span style="color:#e6db74">&#34;`cat hogehoge.sql`&#34;</span> &gt; ./hoge.tsv
</span></span></code></pre></div><p>2 . 3 . <code>sed</code> でタブをカンマに変換してリダイレクト</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>sed -e <span style="color:#e6db74">&#39;s/\t/,/g&#39;</span> ./hoge.tsv &gt; hoge.csv
</span></span></code></pre></div><hr>
<p>てな感じでヌルっと出してます<br>
まぁ、だいたいSQL用意してこんな感じでバーンとしてます</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>mysql -uroot hohoidb -e <span style="color:#e6db74">&#34;`cat hogehoge.sql`&#34;</span> | sed -e <span style="color:#e6db74">&#39;s/\t/,/g&#39;</span> &gt; hogehoge.csv
</span></span></code></pre></div><hr>
<p>あ、前回書き忘れたけど、csvをmysqlにインポートするときはこんなSQL使ってます</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-sql" data-lang="sql"><span style="display:flex;"><span><span style="color:#66d9ef">LOAD</span> <span style="color:#66d9ef">DATA</span> <span style="color:#66d9ef">LOCAL</span> INFILE <span style="color:#e6db74">&#39;/home/ore/hogehoge.csv&#39;</span> <span style="color:#66d9ef">INTO</span> <span style="color:#66d9ef">TABLE</span> hogehoge FIELDS TERMINATED <span style="color:#66d9ef">BY</span> <span style="color:#e6db74">&#39;,&#39;</span> ENCLOSED <span style="color:#66d9ef">BY</span> <span style="color:#e6db74">&#39;&#34;&#39;</span>
</span></span></code></pre></div><hr>
<p>自分が完全に管理してるDBだったら、<code>ALTER</code> やっちゃえ！とかも思うんですが、「別チームんとこだしなー」「申請とかなー」とか思う時、エンジニアだったらあるはず！<br>
そんなときに、サックリ自己解決したいときに使ってます<br>
遅せークエリがボトルネックになってるんだけど、ローカルにデータ欲しいわーって思ったときとかかなぁ</p>
<p>今のところ、この2つの手法でデータが取れなかったことはないかなぁ</p>
<hr>
<p>こういうのって、結構レガシーな手法で、知ってても自慢できるようなことじゃないんだけど、知らない人は知らない感じなのかなぁ<br>
僕は結構頻繁に使うのですが、知らない人は、思いつかない限り使わないのかなぁと思ったりしてます<br>
これらの気にいってるとこは、 <code>select</code> しか投げてないで！ってとこ<br>
流石に <code>select</code> で壊れないっしょっていう安心感があるｗ<br>
ブログ書いてるの、わりと会社の人にバレた気配がするので、役立ってくれたらうれしいなぁ〜</p>
]]></content></item><item><title>jQuery.DataTablesで完全一致検索</title><link>https://unionsep.dev/posts/2017/02/27/190107/</link><pubDate>Mon, 27 Feb 2017 19:01:07 +0900</pubDate><author>unionsep</author><guid>https://unionsep.dev/posts/2017/02/27/190107/</guid><description>&amp;lt;no value&amp;gt;</description><content type="text/html" mode="escaped"><![CDATA[<p>はまった〜</p>
<p>知らなかったけど、とっても便利なjQueryのプラグインがあって、むしろ便利過ぎて使い所迷っちゃうなって感じ<br>
ページング実装するだけで使ってもいいじゃない<br>
2年前ぐらいの記事が多かったから、わりと前から流行ってたみたいなんで、使い方については先人様に任せます</p>
<a href="https://datatables.net/" target="_blank" rel="noopener noreferrer">DataTables - The Javascript Table Solution</a>

<p>で、これ、インクリメンタルサーチっぽい動きがデフォルトで、とってもかっちょいいんですが、使い所によっては完全一致させたいとかあるのかも<br>
キーワードを入れてサブミットさせて、テーブルに並べるデータをHTML生成時に絞ってやるって方法が真っ先に頭に浮かんだんす<br>
実装で迷ったのは、JSでスイスイ検索できるのに、完全一致させるためだけにサーバサイドに頼るってのもかっちょ悪いなと<br>
なんか知らないけど、 <code>DataTable()</code> で指定するパラメタにちょちょいって書いてやれば、すぐできんじゃない？って思ってました</p>
<p>そんなの速攻できるっしょってたかをくくってたんですが、わりとそうでもなくて1日かかっちゃいました<br>
まぁ、ドキュメントは英語だし、このプラグインで完全一致させたいなんて思うやつはあんまりいなかったのかなぁ<br>
で、 <code>jquery.dataTables.js</code> の中身を読む旅に出発</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-js" data-lang="js"><span style="display:flex;"><span><span style="color:#a6e22e">$</span>(<span style="color:#e6db74">&#39;#example&#39;</span>).<span style="color:#a6e22e">DataTable</span>(
</span></span><span style="display:flex;"><span>  <span style="color:#e6db74">&#34;oSearch&#34;</span><span style="color:#f92672">:</span> {<span style="color:#e6db74">&#34;bSmart&#34;</span><span style="color:#f92672">:</span> <span style="color:#66d9ef">false</span>}
</span></span><span style="display:flex;"><span>)
</span></span></code></pre></div><a href="https://datatables.net/docs/DataTables/1.9.0/DataTable.defaults.oSearch.html#bSmart" target="_blank" rel="noopener noreferrer">https://datatables.net/docs/DataTables/1.9.0/DataTable.defaults.oSearch.html#bSmart</a>

<p>まずこれでスマートなフィルタリングを使わないに設定</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-js" data-lang="js"><span style="display:flex;"><span><span style="color:#a6e22e">$</span>(<span style="color:#e6db74">&#39;#example&#39;</span>)
</span></span><span style="display:flex;"><span>  .<span style="color:#a6e22e">DataTable</span>()
</span></span><span style="display:flex;"><span>  .<span style="color:#a6e22e">search</span>(<span style="color:#e6db74">&#34;^&#34;</span> <span style="color:#f92672">+</span> <span style="color:#a6e22e">$</span>(<span style="color:#e6db74">&#39;#text_area&#39;</span>).<span style="color:#a6e22e">val</span>() <span style="color:#f92672">+</span> <span style="color:#e6db74">&#34;$&#34;</span>, <span style="color:#66d9ef">true</span>, <span style="color:#66d9ef">false</span>, <span style="color:#66d9ef">true</span>)
</span></span><span style="display:flex;"><span>  .<span style="color:#a6e22e">draw</span>();
</span></span></code></pre></div><p>つぎにこれで正規表現を使って1語検索をするのが正解みたい<br>
結局stack overflowを参考にさせていただきました</p>
<aside class="cite-card">
    <div class="cite-card__image cite-card__image--fallback" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor"
      stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-image">
      <rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect>
      <circle cx="8.5" cy="8.5" r="1.5"></circle>
      <polyline points="21 15 16 10 5 21"></polyline>
   </svg></div>

  <a href="http://stackoverflow.com/questions/8609577/jquery-datatables-filter-column-by-exact-match" target="_blank" rel="noopener noreferrer">
    <div class="cite-card__title">http://stackoverflow.com/questions/8609577/jquery-datatables-filter-column-by-exact-match</div>

    <div class="cite-card__site">stackoverflow.com</div>
  </a>
</aside>

<p>ここにも書いてましたけど、stack overflowのが僕にとってやさしかったです</p>
<a href="https://code.google.com/archive/p/jquery-datatables-column-filter/issues/137" target="_blank" rel="noopener noreferrer">Google Code Archive - Long-term storage for Google Code Project Hosting.</a>

<p>いいじゃんいいじゃんって嬉しがってたら、また一難<br>
テキストエリアにキーワードを入れて、次に消していって、最後まで消したら、最後の検索が残ってる(´・ω・`)</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-js" data-lang="js"><span style="display:flex;"><span><span style="color:#66d9ef">if</span> (<span style="color:#e6db74">&#39;&#39;</span> <span style="color:#f92672">!=</span> <span style="color:#a6e22e">$</span>(<span style="color:#e6db74">&#39;#text_area&#39;</span>).<span style="color:#a6e22e">val</span>()) {
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">$</span>(<span style="color:#e6db74">&#39;#example&#39;</span>)
</span></span><span style="display:flex;"><span>    .<span style="color:#a6e22e">DataTable</span>()
</span></span><span style="display:flex;"><span>    .<span style="color:#a6e22e">search</span>(<span style="color:#e6db74">&#34;^&#34;</span> <span style="color:#f92672">+</span> <span style="color:#a6e22e">$</span>(<span style="color:#e6db74">&#39;#text_area&#39;</span>).<span style="color:#a6e22e">val</span>() <span style="color:#f92672">+</span> <span style="color:#e6db74">&#34;$&#34;</span>, <span style="color:#66d9ef">true</span>, <span style="color:#66d9ef">false</span>, <span style="color:#66d9ef">true</span>)
</span></span><span style="display:flex;"><span>    .<span style="color:#a6e22e">draw</span>();
</span></span><span style="display:flex;"><span>} <span style="color:#66d9ef">else</span> {
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">$</span>(<span style="color:#e6db74">&#39;#example&#39;</span>)
</span></span><span style="display:flex;"><span>    .<span style="color:#a6e22e">DataTable</span>()
</span></span><span style="display:flex;"><span>    .<span style="color:#a6e22e">search</span>(<span style="color:#e6db74">&#39;&#39;</span>)
</span></span><span style="display:flex;"><span>    .<span style="color:#a6e22e">draw</span>();
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>テキスト内にキーワードが入ってないときは空で <code>draw()</code> したら、とりあえずは期待通りの動きをしてくれた〜<br>
<code>clear()</code> とか <code>destroy()</code> 使ったら、デフォルトで設定したパラメタも初期化されてしまってどうしていいかわからなかったｗ<br>
<code>oSearch</code> とか <code>aoColumnDefs</code> とかで設定できるのかなと思ったんだけど、ここまでにたどり着くまで半日かかってるので燃料が切れて一旦終了。。</p>
<p>なんでこの記事を書こうと思ったかというと、DataTablesは調べれば調べるほど高機能なプラグインだなーって思ったんですけど、便利過ぎて完全一致なんてパラメタですぐっしょって思ってしまったから<br>
だから、多分、次同じことをしようとした時、まーた性懲りもなくすぐっしょて思いそうだったから。。<br>
これだけスイスイ検索できることがウリ？なのに、完全一致検索は違うんじゃない？って今になって思います(´・ω・`)</p>
<p>ブログを書く訓練として、思いついたことを書くのを最近心がけてますが、結構ネタはあるみたい<br>
ただ、やっぱまだ書くのに時間がかかってて、もっと精進せねばと思う感じです〜</p>
]]></content></item><item><title>select結果をcsvでファイル出力</title><link>https://unionsep.dev/posts/2017/02/07/114941/</link><pubDate>Tue, 07 Feb 2017 11:49:41 +0900</pubDate><author>unionsep</author><guid>https://unionsep.dev/posts/2017/02/07/114941/</guid><description>&amp;lt;no value&amp;gt;</description><content type="text/html" mode="escaped"><![CDATA[<p>自分では結構前から便利に使ってるんだけど、意外に重宝されることが最近ありました</p>
<p>それがこれ</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-sql" data-lang="sql"><span style="display:flex;"><span><span style="color:#66d9ef">select</span> <span style="color:#f92672">*</span> <span style="color:#66d9ef">from</span> hoge
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">into</span> outfile <span style="color:#e6db74">&#39;/tmp/hoge.csv&#39;</span>
</span></span><span style="display:flex;"><span>fields terminated <span style="color:#66d9ef">by</span> <span style="color:#e6db74">&#39;,&#39;</span>
</span></span><span style="display:flex;"><span>optionally enclosed <span style="color:#66d9ef">by</span> <span style="color:#e6db74">&#39;&#34;&#39;</span>
</span></span></code></pre></div><p>私の使いみちとしては、</p>
<ul>
<li>障害対応なんかで、多分このレコードがおかしいんだけど、100%自信がないときに試したい</li>
<li>二日酔いのときに、絶対間違えられないクエリを流すとき</li>
<li>ローカルじゃない別の環境で起きてる不具合のデータをサクッととってきたいとき</li>
<li>単にダンプが面倒なとき</li>
<li>シャーディングしてるDBで、他のDBへの参照権限がない場合、grantするの大げさやなって思ったときにファイルに出してシェルとかawkでコネコネするとき</li>
</ul>
<p><code>/tmp</code> か <code>/var/tmp</code> 配下にcsvファイルを落として、ファイル自体の消し忘れを防止することを意識的にしてたりする</p>
<p>ま、mysqlの実行ユーザーにパーミッションがないところには落とせないんですけど</p>
<p>時と場合によっては <code>fields terminated by</code> の指定を変えて、タブ区切りとかスペース区切りにしてシェルとかawk、perlで使いやすい形にしたりする</p>
<p>前のプロジェクトの方針？として、「直せるんだったらなにしてもいい」っていうなんともファンキーな空気で、まぁ立ち上げ近くからいたからかもしれませんが、、クエリ打つときは <code>begin</code> <code>commit</code> <code>rollback</code> してって先輩に口酸っぱく言われてました</p>
<p>ただ、家でたら鍵かけたかな？って思うぐらい、一時記憶装置の容量が少ない私は不安になってしまってこういう若干過度なテクニックがわりと発達したのかも</p>
<p>まぁ、もう大体忘れちゃいましたけど・・・</p>
<p>最近はMySQLばっかのプロジェクトに関わることが多いのですが、OracleとかPostgresqlとかにも同様の機能があるのかなぁ</p>
]]></content></item><item><title>Ansible Towerを触ってみた</title><link>https://unionsep.dev/posts/2017/02/01/190552/</link><pubDate>Wed, 01 Feb 2017 19:05:52 +0900</pubDate><author>unionsep</author><guid>https://unionsep.dev/posts/2017/02/01/190552/</guid><description>&amp;lt;no value&amp;gt;</description><content type="text/html" mode="escaped"><![CDATA[<p>空気が暖かくなったり冷たくなったり、年々外気温に振り回される体質になってきてますね</p>
<p>会社は暖かいので、なにを着ていったらいいのか分からない感じですが、構成管理ってやってますでしょうか</p>
<p>最近、身の回りの環境が変わって、ChefとかCapistrano使ってるんだろうな〜って思われるなにかに触れる機会が多いのですが、以前はAnsibleで結構な台数のvmを管理してました</p>
<p>cookbookとか見たいなと思ってるのですが、これからAnsible触る機会少なそうだし、せっかく苦労して覚えたAnsibleの知識をもう少し進めたいな〜と思って、話のオチ的なノリでRedhatさんになったAnsible Towerを触りました</p>
<p>ところで、私が苦労していたAnsibleは、今Ansible Coreって言うそうですね<br>
Ansible TowerとAnsible Coreって呼ぶみたいです<br>
無料ライセンス登録したら、まさかのRedhatさんからお電話頂いて、Ansible Coreっておっしゃってて「んん？」てなったんですけど、そういうことみたいです</p>
<p>で、ざっと下のリファレンス読むか〜と思って目を通しました</p>
<a href="https://legacy-controller-docs.ansible.com/ansible-tower/3.0.2/html/quickinstall/prepare.html" target="_blank" rel="noopener noreferrer">1. Preparing for the Tower Installation — Ansible Tower Quick Install Guide v3.0.1</a>

<p>結構、紆余曲折したんですが、結果、こんな感じでインストールできました<br>
vmはこんな感じ</p>
<ul>
<li>Vagrantのこちらのbox使わせてもらいました
<ul>
<li><a href="https://atlas.hashicorp.com/centos/boxes/7">Vagrant box centos/7 | Atlas by HashiCorp</a></li>
<li><code>/</code> に40GBぐらいマウントされるんで、disk20GB以上指定クリア</li>
</ul>
</li>
<li>IPアドレスを固定したいので、Vagrantfileに以下追加</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>config.vm.network <span style="color:#e6db74">&#34;private_network&#34;</span>, ip: <span style="color:#e6db74">&#34;192.168.33.10&#34;</span>
</span></span></code></pre></div><ul>
<li>SSLみたいなので、443ポートをマッピング</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>config.vm.network <span style="color:#e6db74">&#34;forwarded_port&#34;</span>, guest: 443, host: <span style="color:#ae81ff">443</span>
</span></span></code></pre></div><ul>
<li>RAMは2GB以上指定なので、以下追加</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>config.vm.provider <span style="color:#e6db74">&#34;virtualbox&#34;</span> <span style="color:#66d9ef">do</span> |vb|
</span></span><span style="display:flex;"><span>    vb.memory <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;2048&#34;</span>
</span></span><span style="display:flex;"><span>end
</span></span></code></pre></div><p><a href="http://releases.ansible.com/ansible-tower/setup/ansible-tower-setup-latest.tar.gz">http://releases.ansible.com/ansible-tower/setup/ansible-tower-setup-latest.tar.gz</a></p>
<p>ここからターガンジップを <code>/usr/local/src/</code> に持ってきて解凍して <code>setup.sh</code> を実行したら依存するパッケージをインストールしてくれて、Ansible CoreがAnsible Towerをインストールしてくれました</p>
<p>全体的には楽々なんですけど、ポイントはこんな感じかな</p>
<ul>
<li><code>setup.sh</code> と同じ階層にある <code>inventory</code> にパスワードを事前に書いておく<br>
これやっておかないとAnsible Coreさんに怒られる</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#f92672">[</span>all:vars<span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>admin_password<span style="color:#f92672">=</span><span style="color:#e6db74">&#39;パスワード&#39;</span>
</span></span><span style="display:flex;"><span>redis_password<span style="color:#f92672">=</span><span style="color:#e6db74">&#39;パスワード&#39;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>pg_password<span style="color:#f92672">=</span><span style="color:#e6db74">&#39;パスワード&#39;</span>
</span></span></code></pre></div><ul>
<li>RAM2GB、disk20GBを守らないとAnsible Coreに怒られる</li>
</ul>
<p><code>setup.sh</code> 叩いたらAnsible Coreが動くのですが、満たしていない場合、怒られる<br>
playbook書き換えたらインストールできるのですが、いきなり書き換えるのもなんだかねぇ<br>
とはいえ、Ubuntu16.04には対応しておいてほしかったかな</p>
<ul>
<li>Ansible TowerというよりCentOS7かな</li>
</ul>
<p>実は固定IPするのに結構はまりました<br>
<code>/etc/sysconfig/network-scripts/ifcfg-eth1</code> をVagrantが作ってくれてるのですが、 <code>vagrant up</code> 時には期待通りのIPにならず。。<br>
networkの再起動で固定されるみたいなのですが、そもそも <code>ifcfg-eth1</code> じゃないってことをこの時知りました<br>
<code>vagrant init ansible/tower</code> で即できるはずですけど、それ知らなきゃねぇ・・・</p>
<aside class="cite-card">
    <img
      class="cite-card__image"
      src="https://www.redhat.com/profiles/rh/themes/redhatdotcom/img/logo-rh-og-image.png"
      alt=""
      loading="lazy"
    >

  <a href="https://www.ansible.com/tower-trial" target="_blank" rel="noopener noreferrer">
    <div class="cite-card__title">Red Hat Ansible Automation Platform | Product Trial</div>
      <div class="cite-card__description">
        An agentless automation platform.
      </div>

    <div class="cite-card__site">www.ansible.com</div>
  </a>
</aside>

<p>で、無事にこんな感じでインストールできました</p>
<p><a href="/posts/2017/02/01/190552/20170130190333.png"><img src="/posts/2017/02/01/190552/20170130190333.png" alt="Ansible Towerの画面"></a></p>
<p>うん、シンプルでいい感じ<br>
知ってたけど、グラフが出るのいいなーって思いました<br>
と、こうなってくると、話のオチ的な感じで構築したのに、グラフがぐにゃぐにゃなってるとこ見たくなりました<br>
てわけで、なんか適当なplaybook作ってAnsible Towerから走らせたくなったので、次はそれしようかな〜</p>
]]></content></item><item><title>後でAnsibleにしたいsensu-serverのインストールログ</title><link>https://unionsep.dev/posts/2016/06/20/172629/</link><pubDate>Mon, 20 Jun 2016 17:26:29 +0900</pubDate><author>unionsep</author><guid>https://unionsep.dev/posts/2016/06/20/172629/</guid><description>&amp;lt;no value&amp;gt;</description><content type="text/html" mode="escaped"><![CDATA[<p>sensu influxDB grafana環境を試してみたくて、とりあえずsensuとuchiwaをVagrantで実現してみた。
下記のページを写経させてもらった。<br>
SSL証明は0.25が最新ぽかったけど、latest指定でも大丈夫そう。<br>
実際、監視させてみて感触掴んだら、頑張ってAnsible化するっす。</p>
<aside class="cite-card">
    <img
      class="cite-card__image"
      src="https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-user-contents.imgix.net%2Fhttps%253A%252F%252Fcdn.qiita.com%252Fassets%252Fpublic%252Farticle-ogp-background-afbab5eb44e0b055cce1258705637a91.png%3Fixlib%3Drb-4.1.1%26w%3D1200%26blend64%3DaHR0cHM6Ly9xaWl0YS11c2VyLXByb2ZpbGUtaW1hZ2VzLmltZ2l4Lm5ldC9odHRwcyUzQSUyRiUyRnFpaXRhLWltYWdlLXN0b3JlLnMzLmFtYXpvbmF3cy5jb20lMkYwJTJGMzUzOSUyRnByb2ZpbGUtaW1hZ2VzJTJGMTQ3MzY4MzMwMD9peGxpYj1yYi00LjEuMSZhcj0xJTNBMSZmaXQ9Y3JvcCZtYXNrPWVsbGlwc2UmYmc9RkZGRkZGJmZtPXBuZzMyJnM9NjdjNjNhODRjMmE4MjI2NTk1MGQ3MzI3ZDhiYWJjYzg%26blend-x%3D120%26blend-y%3D462%26blend-w%3D90%26blend-h%3D90%26blend-mode%3Dnormal%26mark64%3DaHR0cHM6Ly9xaWl0YS1vcmdhbml6YXRpb24taW1hZ2VzLmltZ2l4Lm5ldC9odHRwcyUzQSUyRiUyRnMzLWFwLW5vcnRoZWFzdC0xLmFtYXpvbmF3cy5jb20lMkZxaWl0YS1vcmdhbml6YXRpb24taW1hZ2UlMkZiOTM2YTFjOGIxNTI2Mjk3OGQ1OGQ4ZjljMzI4OTc0YzRkNGI0YTJlJTJGb3JpZ2luYWwuanBnJTNGMTQyMjkzOTAzOD9peGxpYj1yYi00LjEuMSZ3PTQ0Jmg9NDQmZml0PWNyb3AmbWFzaz1jb3JuZXJzJmNvcm5lci1yYWRpdXM9OCZiZz1GRkZGRkYmYm9yZGVyPTIlMkNGRkZGRkYmZm09cG5nMzImcz1jYWNhZTQ2NjUxNDIzZWEzNTRjYTgyYTFjMDk3ZGIyMA%26mark-x%3D186%26mark-y%3D515%26mark-w%3D40%26mark-h%3D40%26s%3D40859182d77e93f89a410ccc20f06070?ixlib=rb-4.1.1&amp;w=1200&amp;fm=jpg&amp;mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjEuMSZ3PTk2MCZoPTMyNCZ0eHQ9Q2VudE9TJTIwNi42JUUzJTgxJUFCU2Vuc3UlRTMlODIlQTQlRTMlODMlQjMlRTMlODIlQjklRTMlODMlODglRTMlODMlQkMlRTMlODMlQUIlRUYlQkMlODglRTclOUIlQTMlRTglQTYlOTYlRTMlODIlQjUlRTMlODMlQkMlRTMlODMlOTAlRTUlODElQjQlRUYlQkMlODkmdHh0LWFsaWduPWxlZnQlMkN0b3AmdHh0LWNvbG9yPSUyMzFFMjEyMSZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT01NiZ0eHQtcGFkPTAmcz0zODRhODU2ZTFmYWY0MTQ5NTdhZDBkOWZiOWZiMmFhYg&amp;mark-x=120&amp;mark-y=112&amp;blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjEuMSZ3PTgzOCZoPTU4JnR4dD0lNDByYXNha2EmdHh0LWNvbG9yPSUyMzFFMjEyMSZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT0zNiZ0eHQtcGFkPTAmcz04NGM3NGM3ZGQwZGRiYWIxMzQzYTM5MzAxMDkxNWNmYg&amp;blend-x=242&amp;blend-y=454&amp;blend-w=838&amp;blend-h=46&amp;blend-fit=crop&amp;blend-crop=left%2Cbottom&amp;blend-mode=normal&amp;txt64=5qCq5byP5Lya56S-44Ko44OL44Kw44Oi&amp;txt-x=242&amp;txt-y=539&amp;txt-width=838&amp;txt-clip=end%2Cellipsis&amp;txt-color=%231E2121&amp;txt-font=Hiragino%20Sans%20W6&amp;txt-size=28&amp;s=e6f61a71dc26b05fe7607b9f659cc078"
      alt=""
      loading="lazy"
    >

  <a href="http://qiita.com/narvaux/items/15da8f71f7e175116d8b" target="_blank" rel="noopener noreferrer">
    <div class="cite-card__title">CentOS 6.6にSensuインストール（監視サーバ側）</div>
      <div class="cite-card__description">
        以下はChef/Puppetを使わずにCentOS 6.6にインストールする手順。 OS: CentOS 6.6 Sensu: 0.16 Sensu クライアント側インストール手順…
      </div>

    <div class="cite-card__site">Qiita</div>
  </a>
</aside>

<aside class="cite-card">
    <img
      class="cite-card__image"
      src="https://opengraph.githubassets.com/32ce337a0c0cb689e6cdd04709ba95774293ab26952f31cbc456dc01902a9755/unionsep/install-log"
      alt=""
      loading="lazy"
    >

  <a href="https://github.com/unionsep/install-log/tree/master/sensu" target="_blank" rel="noopener noreferrer">
    <div class="cite-card__title">install-log/sensu at master · unionsep/install-log</div>
      <div class="cite-card__description">
        memo. Contribute to unionsep/install-log development by creating an account on GitHub.
      </div>

    <div class="cite-card__site">GitHub</div>
  </a>
</aside>

]]></content></item><item><title>Mackerelで遊んでみた</title><link>https://unionsep.dev/posts/2016/04/08/013608/</link><pubDate>Fri, 08 Apr 2016 01:36:08 +0900</pubDate><author>unionsep</author><guid>https://unionsep.dev/posts/2016/04/08/013608/</guid><description>&amp;lt;no value&amp;gt;</description><content type="text/html" mode="escaped"><![CDATA[<p>はてなさんが展開してるMackerelを使う機会に恵まれたので、ついでに監視してみたかったものを利用してMackerelを一通り触ってみました。<br>
meetupで出会った方に仲良くしていただいたので、導入してみたよっ！ってお伝えしたら、ブログも勧められたので、書いたことないブログも書いてみました。
Markdown記法に慣れてないので、GitのWiki書くのもやっぱり苦手で、克服できたらええなぁ&hellip;</p>
<ol>
<li><a href="/posts/2016/04/08/013608/#no1">Mackerelにサインアップ、agentをインストールしてみる</a></li>
<li><a href="/posts/2016/04/08/013608/#no2">Hubotがちょいちょい落ちてたので、独自監視項目を追加してみる</a></li>
<li><a href="/posts/2016/04/08/013608/#no3">監視ルールを設定してみる</a></li>
<li><a href="/posts/2016/04/08/013608/#no4">Slackに投稿できるようにしてみる</a></li>
<li><a href="/posts/2016/04/08/013608/#no5">Slackから再起動スクリプトを叩けるようにできたらええな&hellip;</a></li>
<li><a href="/posts/2016/04/08/013608/#no6">まとめなど</a></li>
</ol>
<h4 id="no1">サインアップとインストール<a href="#no1" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h4>
<p>なんのこっちゃないです。<a href="https://mackerel.io/ja/">ここ</a> からメールアドレスで登録しました。<br>
サインインするとオーガニゼーション、サービス、ホストを作るスタートアップガイドがあったので、その通り作りました。適当にネーミングしたの、、やっぱ失敗だったかな。</p>
<p>エージェントのインストールはrpmが選べるみたいだったので、その通り、叩いてみた。<br>
特にひっかかりなく、agentもインストールできたんですが、sedでapikeyを書き換えるんですね。起動時にuser/passの入力を想像してたんで、ちょっと以外でした。</p>
<p>で、mackerelのページに戻ったら、もう既にcpuやらmemoryやらの6個ぐらいのグラフが出来上がってた。こいつぁ、早い！って感心しました。</p>
<h4 id="no2">Hubotを監視してみる<a href="#no2" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h4>
<p>Slackである形式で投稿したら、メールも送信してくれるみたいなHubotのscriptを作ってたんですが、v3のHubotで運用していたせいか、3,4日ほど利用されないとSocketが切れるのか、Hubot自体もKILLされてるみたいな現象が起きてました。<br>
休み明けに会社来て、bot無反応だったよって聞くたびに悲しくなったので、モニタリングしてみたかったのでカスタムメトリックなるものを作ってみました。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#f92672">[</span>Tue Dec <span style="color:#ae81ff">22</span> <span style="color:#ae81ff">2015</span> 01:31:13 GMT+0900 <span style="color:#f92672">(</span>JST<span style="color:#f92672">)]</span> ERROR Last pong is too old: 14.844
</span></span><span style="display:flex;"><span><span style="color:#f92672">[</span>Tue Dec <span style="color:#ae81ff">22</span> <span style="color:#ae81ff">2015</span> 01:31:13 GMT+0900 <span style="color:#f92672">(</span>JST<span style="color:#f92672">)]</span> INFO Reconnecting in 1000ms
</span></span><span style="display:flex;"><span><span style="color:#f92672">[</span>Tue Dec <span style="color:#ae81ff">22</span> <span style="color:#ae81ff">2015</span> 01:31:14 GMT+0900 <span style="color:#f92672">(</span>JST<span style="color:#f92672">)]</span> INFO Attempting reconnect
</span></span><span style="display:flex;"><span><span style="color:#f92672">[</span>Tue Dec <span style="color:#ae81ff">22</span> <span style="color:#ae81ff">2015</span> 01:31:14 GMT+0900 <span style="color:#f92672">(</span>JST<span style="color:#f92672">)]</span> INFO Connecting...
</span></span><span style="display:flex;"><span><span style="color:#f92672">[</span>Tue Dec <span style="color:#ae81ff">22</span> <span style="color:#ae81ff">2015</span> 01:31:43 GMT+0900 <span style="color:#f92672">(</span>JST<span style="color:#f92672">)]</span> INFO Slack client closed, waiting <span style="color:#66d9ef">for</span> reconnect
</span></span><span style="display:flex;"><span><span style="color:#f92672">[</span>Tue Dec <span style="color:#ae81ff">22</span> <span style="color:#ae81ff">2015</span> 01:32:18 GMT+0900 <span style="color:#f92672">(</span>JST<span style="color:#f92672">)]</span> ERROR undefined
</span></span><span style="display:flex;"><span><span style="color:#f92672">[</span>Tue Dec <span style="color:#ae81ff">22</span> <span style="color:#ae81ff">2015</span> 01:32:18 GMT+0900 <span style="color:#f92672">(</span>JST<span style="color:#f92672">)]</span> INFO Reconnecting in 2000ms
</span></span><span style="display:flex;"><span><span style="color:#f92672">[</span>Tue Dec <span style="color:#ae81ff">22</span> <span style="color:#ae81ff">2015</span> 01:32:20 GMT+0900 <span style="color:#f92672">(</span>JST<span style="color:#f92672">)]</span> INFO Attempting reconnect
</span></span><span style="display:flex;"><span><span style="color:#f92672">[</span>Tue Dec <span style="color:#ae81ff">22</span> <span style="color:#ae81ff">2015</span> 01:32:20 GMT+0900 <span style="color:#f92672">(</span>JST<span style="color:#f92672">)]</span> INFO Connecting...
</span></span><span style="display:flex;"><span><span style="color:#f92672">[</span>Tue Dec <span style="color:#ae81ff">22</span> <span style="color:#ae81ff">2015</span> 01:32:21 GMT+0900 <span style="color:#f92672">(</span>JST<span style="color:#f92672">)]</span> INFO Logged in as &lt;むふふ&gt;, but not yet connected
</span></span><span style="display:flex;"><span><span style="color:#f92672">[</span>Tue Dec <span style="color:#ae81ff">22</span> <span style="color:#ae81ff">2015</span> 01:32:22 GMT+0900 <span style="color:#f92672">(</span>JST<span style="color:#f92672">)]</span> INFO Slack client now connected
</span></span><span style="display:flex;"><span>error: Forever detected script was killed by signal: SIGKILL
</span></span></code></pre></div><p>落ちてた時のログがこれ。<br>
どうもKILLシグナルが出てるみたいだから、プロセス監視できたら良いかなーって思ってたら、こちらの方と全く同じ要件でした。。確かに私もよくわからなかったです。(´・ω・｀)</p>
<aside class="cite-card">
    <img
      class="cite-card__image"
      src="https://cdn.image.st-hatena.com/image/scale/551911ae67467a33c05e6f4459000e9b05b5ccb7/backend=imagemagick;version=1;width=1300/http%3A%2F%2Fcdn-ak.f.st-hatena.com%2Fimages%2Ffotolife%2Fa%2Farata3da4%2F20150623%2F20150623003900.png"
      alt=""
      loading="lazy"
    >

  <a href="https://arata.hatenadiary.com/entry/2015/06/23/005339" target="_blank" rel="noopener noreferrer">
    <div class="cite-card__title">mackerelを利用してhubotが死んだ時に気がつくようにした</div>
      <div class="cite-card__description">
        趣味でhubotいじったりしてるんですが、たまに死んでる時があります。 Slackでコマンド打って何も返ってこないと切なくなるので、 死んだ時に死んでしまうとは情けないと言えるよう…
      </div>

    <div class="cite-card__site">日頃の行い</div>
  </a>
</aside>

<p>で、いろいろ調べてると、公式プラグイン集なるものがGitHubに集められていて、またまたrpmでインストールできる事が分かりました。で早速入れてみました。</p>
<p><a href="https://github.com/mackerelio/mackerel-agent-plugins">mackerelio/mackerel-agent-plugins</a></p>
<ul>
<li>mackerel-plugin-apache2</li>
<li>mackerel-plugin-php-apc</li>
<li>mackerel-plugin-memcached</li>
</ul>
<p>また特になんのひっかかりもなくインストールできて、<code>/usr/local/bin</code>に監視スクリプトが配置されていました。<a href="https://mackerel.io/ja/docs/entry/howto/mackerel-agent-plugins">ヘルプ</a>にある通り、<code>/etc/mackerel-agent/mackerel-agent.conf</code>のコメントアウトを解除してあげたら即反映されてました。<br>
Apacheだったらserver-statusを見れるようにしとくとか、段取りがあるプラグインもありますが、とってもお手軽でした。Sensuは触ったことないけど、munin触ったことあったらつまづく箇所ないんじゃないかっていうぐらいでした。</p>
<p>ということで、どうやら<code>/usr/local/bin</code>にmackerel-pluginから始まるスクリプトを用意して食わせるって感じだったので、シェルスクリプトだけど作ってみました。</p>
<p><em>at /usr/local/bin/mackerel-plugin-hubot</em></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#75715e">#!/bin/sh
</span></span></span><span style="display:flex;"><span>echo -e <span style="color:#e6db74">&#34;&lt;むふふ&gt;-hubot\t`ps aux|grep hubot|grep adapter|wc -l`\t`date -u +%s`&#34;</span>
</span></span></code></pre></div><p><em>at /etc/mackerel-agent/mackerel-agent.conf</em></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#f92672">[</span>plugin.metrics.&lt;むふふ&gt;-hubot<span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>command <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;/usr/local/bin/mackerel-plugin-hubot&#34;</span>
</span></span></code></pre></div><p>文字列 Tab 数字 Tab <code>date -u +%s</code>な感じで標準出力したら、うまいこと読んでくれました。こんなんでも食ってくれるんだったら、perlでもphpでもなんでも作れそうです。公式プラグイン集はGo言語が多かったようです。agentがGo言語製だからかな？</p>
<h4 id="no3">監視ルールを設定してみる<a href="#no3" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h4>
<p>Monitorsの監視ルールを追加から、作ったメトリックのルールを追加してみました。監視対象のメトリックから、絞り込んで設定。プロセスが1未満だったらWarningにもCriticalにもする的な設定にしてみました。<br>
どうでもええけど、不等号がどっちやったっけ？ってちょっとだけ迷いました。</p>
<h4 id="no4">Slackに投稿<a href="#no4" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h4>
<p>Monitorsのチャンネル設定から設定しました。アラートはEmailもSlackもチャンネルって呼ぶそうです。<br>
SlackはIncoming WebhooksのURLを設定すればいいみたいですね。<br>
で、おもむろにHubotをstopしてみたら、グラフ付きでちゃんと通知来ました！メールボムみたいにギャンギャン通知くるのかなー？どうなのかなー？って10分ほどおいてみましたけど、そうでもなかったです。これは嬉しいですね。<br>
待ってるの飽きてきたので、startしたら、グラフ付きでちゃんとokきました。</p>
<h4 id="no5">SlackからHubotを再起動<a href="#no5" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h4>
<p>Slash CommandsからJenkinsAPIを叩いて行けそうだったんですが、認証通すのがしんどかったので、それ用のWebAPIを用意した方が速そうって気付きました。<br>
でも、もはやMackerel関係ないし、時間切れだしで、また今度作ろうと心に誓って作業終了にしました。</p>
<h4 id="no6">まとめ<a href="#no6" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h4>
<p>一通りmackerelを触ってみた感想は、既存のツールを意識した作りにしてるのかなーって思いました。今使ってるツールのこうならんかなー的な欲求を汲んでくれてるかなと。<br>
Zabbixのグラフ探すのが未だに苦手、muninの通知設定苦手〜とか。。あれ、俺だけか・・・</p>
<p>ブログは、、あれですね。書くのに超時間かかりました。。世のブロガーさんはすげーなって感心です。もっと画像とか入れたら華があったんだろうなぁ〜。</p>
]]></content></item></channel></rss>