yuhei.kagaya 2016-04-21T14:12:35+09:00 yuhei_kagaya Hatena::Blog hatenablog://blog/13208692334729894569 Ansibleのselectattrとmapとlist hatenablog://entry/6653812171392283180 2016-04-21T14:12:35+09:00 2016-04-21T14:15:16+09:00 最近またAnsibleでAWSの構成を書き始めました。 selectattrとmapが便利 次のような値を with_items で回してサブネットを作るとともに、publicなものを取り出してルートテーブルを作りたくなったのですが、selectattr()とmap()を使うと取り出すことができました。 --- vpc_subnets: - { name: bastion, az: ap-northeast-1a, cidr: 10.0.1.0/28, tier: bastion, public: true } - { name: web1a, az: ap-northeast-1a, cid… <p>最近またAnsibleで<a class="keyword" href="http://d.hatena.ne.jp/keyword/AWS">AWS</a>の構成を書き始めました。</p> <h2>selectattrとmapが便利</h2> <p>次のような値を <code>with_items</code> で回してサブネットを作るとともに、publicなものを取り出してルートテーブルを作りたくなったのですが、<code>selectattr()</code>と<code>map()</code>を使うと取り出すことができました。</p> <pre class="code lang-yaml" data-lang="yaml" data-unlink><span class="synPreProc">---</span> <span class="synIdentifier">vpc_subnets</span><span class="synSpecial">:</span> <span class="synStatement">- </span><span class="synSpecial">{</span> <span class="synIdentifier">name</span><span class="synSpecial">:</span> bastion, <span class="synIdentifier">az</span><span class="synSpecial">:</span> ap-northeast-1a, <span class="synIdentifier">cidr</span><span class="synSpecial">:</span> 10.0.1.0/28, <span class="synIdentifier">tier</span><span class="synSpecial">:</span> bastion, <span class="synIdentifier">public</span><span class="synSpecial">:</span> <span class="synConstant">true</span> <span class="synSpecial">}</span> <span class="synStatement">- </span><span class="synSpecial">{</span> <span class="synIdentifier">name</span><span class="synSpecial">:</span> web1a, <span class="synIdentifier">az</span><span class="synSpecial">:</span> ap-northeast-1a, <span class="synIdentifier">cidr</span><span class="synSpecial">:</span> 10.0.10.0/24, <span class="synIdentifier">tier</span><span class="synSpecial">:</span> web, <span class="synIdentifier">public</span><span class="synSpecial">:</span> <span class="synConstant">true</span> <span class="synSpecial">}</span> <span class="synStatement">- </span><span class="synSpecial">{</span> <span class="synIdentifier">name</span><span class="synSpecial">:</span> web1c, <span class="synIdentifier">az</span><span class="synSpecial">:</span> ap-northeast-1c, <span class="synIdentifier">cidr</span><span class="synSpecial">:</span> 10.0.11.0/24, <span class="synIdentifier">tier</span><span class="synSpecial">:</span> web, <span class="synIdentifier">public</span><span class="synSpecial">:</span> <span class="synConstant">true</span> <span class="synSpecial">}</span> <span class="synStatement">- </span><span class="synSpecial">{</span> <span class="synIdentifier">name</span><span class="synSpecial">:</span> db1a, <span class="synIdentifier">az</span><span class="synSpecial">:</span> ap-northeast-1a, <span class="synIdentifier">cidr</span><span class="synSpecial">:</span> 10.0.20.0/24, <span class="synIdentifier">tier</span><span class="synSpecial">:</span> db <span class="synSpecial">}</span> <span class="synStatement">- </span><span class="synSpecial">{</span> <span class="synIdentifier">name</span><span class="synSpecial">:</span> db1c, <span class="synIdentifier">az</span><span class="synSpecial">:</span> ap-northeast-1c, <span class="synIdentifier">cidr</span><span class="synSpecial">:</span> 10.0.21.0/24, <span class="synIdentifier">tier</span><span class="synSpecial">:</span> db <span class="synSpecial">}</span> </pre> <pre class="code lang-yaml" data-lang="yaml" data-unlink><span class="synStatement">- </span><span class="synIdentifier">name</span><span class="synSpecial">:</span> get public cidr list <span class="synIdentifier">set_fact</span><span class="synSpecial">:</span> <span class="synIdentifier">v</span><span class="synSpecial">:</span> <span class="synConstant">'{{ vpc_subnets | selectattr(&quot;public&quot;, &quot;defined&quot;) | selectattr(&quot;public&quot;, &quot;equalto&quot;, true) | map(attribute=&quot;cidr&quot;) | list}}'</span> <span class="synStatement">- </span><span class="synIdentifier">debug</span><span class="synSpecial">:</span> var=v </pre> <p>結果</p> <pre class="code" data-lang="" data-unlink>TASK [vpc : get public cidr list] ********************************************** ok: [localhost] TASK [vpc : debug] ************************************************************* ok: [localhost] =&gt; { &#34;v&#34;: [ &#34;10.0.1.0/28&#34;, &#34;10.0.10.0/24&#34;, &#34;10.0.11.0/24&#34; ] }</pre> <p>ドキュメント</p> <ul> <li><a href="http://jinja2.readthedocs.org/en/latest/templates.html#selectattr">selectattr()</a></li> <li><a href="http://jinja2.readthedocs.org/en/latest/templates.html#map">map()</a></li> </ul> <h2>generator object _select_or_<a class="keyword" href="http://d.hatena.ne.jp/keyword/reject">reject</a>やgenerator object do_mapの中身を見るにはlist</h2> <p><code>selectattr()</code>や<code>map()</code>をかました変数を<code>debug</code>で出力しようとするとオブジェクトになってしまって中身が見られないのですが、<code>list</code>を使ってあげると確認できるのも学びました。便利。</p> <pre class="code" data-lang="" data-unlink>ok: [localhost] =&gt; { &#34;v&#34;: &#34;&lt;generator object do_map at 0x1039fd730&gt;&#34; }</pre> <p>とか</p> <pre class="code" data-lang="" data-unlink>ok: [localhost] =&gt; { &#34;v&#34;: &#34;&lt;generator object do_map at 0x1039fd730&gt;&#34; }</pre> <p>が、<code>list</code>を使うと</p> <pre class="code" data-lang="" data-unlink>ok: [localhost] =&gt; { &#34;v&#34;: [ { &#34;az&#34;: &#34;ap-northeast-1a&#34;, &#34;cidr&#34;: &#34;10.0.1.0/28&#34;, &#34;name&#34;: &#34;bastion&#34;, &#34;public&#34;: true, &#34;tier&#34;: &#34;bastion&#34; }, { &#34;az&#34;: &#34;ap-northeast-1a&#34;, &#34;cidr&#34;: &#34;10.0.10.0/24&#34;, &#34;name&#34;: &#34;web1a&#34;, &#34;public&#34;: true, &#34;tier&#34;: &#34;web&#34; }, { &#34;az&#34;: &#34;ap-northeast-1c&#34;, &#34;cidr&#34;: &#34;10.0.11.0/24&#34;, &#34;name&#34;: &#34;web1c&#34;, &#34;public&#34;: true, &#34;tier&#34;: &#34;web&#34; } ] }</pre> <h2>その他のフィルター</h2> <ul> <li><a href="http://docs.ansible.com/ansible/playbooks_filters.html">Jinja2 filters &mdash; Ansible Documentation</a></li> <li><a href="http://jinja2.readthedocs.org/en/latest/templates.html#list-of-builtin-filters">Template Designer Documentation &mdash; Jinja2 2.8 documentation</a></li> </ul> <p>他にもいろんなフィルターがあって便利です。 ただ、できるからといっていろいろやりすぎるのは良くないですね。 1ヶ月後の自分が見ても分かるように、できるだけシンプルにわかりやすく記述したいところです。</p> yuhei_kagaya Vimプラグインの管理にdein.vimを使う hatenablog://entry/10328537792367756657 2016-03-20T17:19:07+09:00 2016-03-20T17:30:05+09:00 家の前の日当たりがいい坂道にある桜がだいぶ咲いてきました。穏やかな春の陽気を感じます。 この週末は3連休ということもあり、いつかやろうと思っていたVimプラギンのパッケージマネージャの移行をしました。 今まで大変お世話になっていたneobundle.vimを卒業し、これからはdein.vimを使い始めます。 デインデイーン。闇の力を感じます。 こんな感じで.vimrcもスッキリしました。素敵です。 基本的な設定の形 call dein#begin('プラグインを管理する一番上のディレクトリ') call dein#add('プラグイン名') call dein#add('プラグイン名') ..… <p>家の前の日当たりがいい坂道にある桜がだいぶ咲いてきました。穏やかな春の陽気を感じます。</p> <p>この週末は3連休ということもあり、いつかやろうと思っていた<a class="keyword" href="http://d.hatena.ne.jp/keyword/Vim">Vim</a>プラギンのパッケージマネージャの移行をしました。 今まで大変お世話になっていた<a href="https://github.com/Shougo/neobundle.vim">neobundle.vim</a>を卒業し、これからは<a href="https://github.com/Shougo/dein.vim">dein.vim</a>を使い始めます。</p> <p>デインデイーン。闇の力を感じます。</p> <p><a href="https://github.com/violetyk/dotfiles/blob/daa76ff008d3fb9c457f2808f05a23d9dba61500/roles/home/files/vimrc#L5-L231">&#x3053;&#x3093;&#x306A;&#x611F;&#x3058;</a>で<code>.vimrc</code>もスッキリしました。素敵です。</p> <h2>基本的な設定の形</h2> <pre class="code lang-vim" data-lang="vim" data-unlink><span class="synStatement">call</span> dein#begin<span class="synSpecial">(</span><span class="synConstant">'プラグインを管理する一番上のディレクトリ'</span><span class="synSpecial">)</span> <span class="synStatement">call</span> dein#<span class="synIdentifier">add</span><span class="synSpecial">(</span><span class="synConstant">'プラグイン名'</span><span class="synSpecial">)</span> <span class="synStatement">call</span> dein#<span class="synIdentifier">add</span><span class="synSpecial">(</span><span class="synConstant">'プラグイン名'</span><span class="synSpecial">)</span> <span class="synStatement">...</span> <span class="synStatement">call</span> dein#end<span class="synSpecial">()</span> </pre> <p><code>vimrc</code>の中で、上のように<code>dein#begin()</code>と<code>dein#end()</code>の行の間にインストールしたい<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3">プラグイン</a>の名前を<code>dein#add('プラグイン名')</code>で書いていけばオッケーなのでやさしかったです。</p> <h3>いろいろな設定</h3> <p><code>dein#add('プラグイン名', { オプション } )</code>のように、第二引数には辞書形式でオプションを指定することができます。オプションを使うと<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3">プラグイン</a>の管理がもっと便利になります。 少しですがオプションを使った設定をしてみました。また、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Vim">Vim</a>を起動するだけで<a href="https://github.com/Shougo/dein.vim">dein.vim</a>とともに各<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3">プラグイン</a>がインストールされるようにもしてみました。</p> <pre class="code lang-vim" data-lang="vim" data-unlink><span class="synStatement">set</span> <span class="synPreProc">nocompatible</span> <span class="synComment">&quot; Vim起動完了時にインストール</span> <span class="synStatement">augroup</span> PluginInstall <span class="synStatement">autocmd</span>! <span class="synStatement">autocmd</span> <span class="synType">VimEnter</span> * <span class="synStatement">if</span> dein#check_install<span class="synSpecial">()</span> | <span class="synIdentifier">call</span> dein#install<span class="synSpecial">()</span> | <span class="synStatement">endif</span> <span class="synStatement">augroup</span> END <span class="synComment">&quot; 各プラグインをインストールするディレクトリ</span> <span class="synStatement">let</span> <span class="synIdentifier">s</span>:plugin_dir <span class="synStatement">=</span> <span class="synIdentifier">expand</span><span class="synSpecial">(</span><span class="synConstant">'~/.vim/bundle/'</span><span class="synSpecial">)</span> <span class="synComment">&quot; dein.vimをインストールするディレクトリをランタイムパスへ追加</span> <span class="synStatement">let</span> <span class="synIdentifier">s</span>:dein_dir <span class="synStatement">=</span> <span class="synIdentifier">s:plugin_dir</span> <span class="synStatement">.</span> <span class="synConstant">'repos/github.com/Shougo/dein.vim'</span> <span class="synStatement">execute</span> <span class="synConstant">'set runtimepath+='</span> <span class="synStatement">.</span> <span class="synIdentifier">s</span>:<span class="synIdentifier">dein_dir</span> <span class="synComment">&quot; dein.vimがまだ入ってなければ 最初に`git clone`</span> <span class="synStatement">if</span> !<span class="synIdentifier">isdirectory</span><span class="synSpecial">(</span>s:dein_dir<span class="synSpecial">)</span> <span class="synStatement">call</span> <span class="synIdentifier">mkdir</span><span class="synSpecial">(</span>s:dein_dir, <span class="synConstant">'p'</span><span class="synSpecial">)</span> <span class="synStatement">silent</span> <span class="synStatement">execute</span> <span class="synIdentifier">printf</span><span class="synSpecial">(</span><span class="synConstant">'!git clone %s %s'</span>, <span class="synConstant">'https://github.com/Shougo/dein.vim'</span>, s:dein_dir<span class="synSpecial">)</span> <span class="synStatement">endif</span> <span class="synStatement">if</span> dein#load_state<span class="synSpecial">(</span>s:plugin_dir<span class="synSpecial">)</span> <span class="synStatement">call</span> dein#begin<span class="synSpecial">(</span>s:plugin_dir<span class="synSpecial">)</span> <span class="synComment"> &quot; ここからインストールするプラグインを書いていく</span> <span class="synStatement">call</span> dein#<span class="synIdentifier">add</span><span class="synSpecial">(</span><span class="synConstant">'Shougo/dein.vim'</span><span class="synSpecial">)</span> <span class="synComment"> &quot; インストール後ビルドする場合</span> <span class="synStatement">call</span> dein#<span class="synIdentifier">add</span>(<span class="synConstant">'Shougo/vimproc.vim'</span>, { <span class="synSpecial"> \</span> <span class="synConstant">'build'</span>: { <span class="synSpecial"> \</span> <span class="synConstant">'mac'</span>: <span class="synConstant">'make -f make_mac.mak'</span>, <span class="synSpecial"> \</span> <span class="synConstant">'linux'</span>: <span class="synConstant">'make'</span>, <span class="synSpecial"> \</span> <span class="synConstant">'unix'</span>: <span class="synConstant">'gmake'</span>, <span class="synSpecial"> \</span> }, <span class="synSpecial"> \</span> }<span class="synError">)</span> <span class="synComment"> &quot; 条件によって使ったり使わなかったり制御する場合</span> <span class="synStatement">call</span> dein#<span class="synIdentifier">add</span>(<span class="synConstant">'Shougo/neocomplete.vim'</span>, { <span class="synSpecial"> \</span> <span class="synConstant">'if'</span> : <span class="synIdentifier">has</span><span class="synSpecial">(</span><span class="synConstant">'lua'</span><span class="synSpecial">)</span> <span class="synSpecial"> \</span> }<span class="synError">)</span> <span class="synComment"> &quot; 依存関係がある場合</span> <span class="synStatement">call</span> dein#<span class="synIdentifier">add</span><span class="synSpecial">(</span><span class="synConstant">'Shougo/unite.vim'</span><span class="synSpecial">)</span> <span class="synStatement">call</span> dein#<span class="synIdentifier">add</span><span class="synSpecial">(</span><span class="synConstant">'ujihisa/unite-colorscheme'</span>, <span class="synSpecial">{</span><span class="synConstant">'depends'</span> : <span class="synConstant">'Shougo/unite.vim'</span><span class="synSpecial">})</span> <span class="synComment"> &quot; 手動でcall dein#source('プラグイン名')して使い始める場合</span> <span class="synStatement">call</span> dein#<span class="synIdentifier">add</span><span class="synSpecial">(</span><span class="synConstant">'Shougo/vimfiler'</span>, <span class="synSpecial">{</span><span class="synConstant">'lazy'</span> : <span class="synConstant">1</span><span class="synSpecial">})</span> <span class="synComment"> &quot; 指定のファイルタイプ使う場合</span> <span class="synStatement">call</span> dein#<span class="synIdentifier">add</span><span class="synSpecial">(</span><span class="synConstant">'tpope/vim-rails'</span>, <span class="synSpecial">{</span><span class="synConstant">'on_ft'</span> : <span class="synConstant">'ruby'</span><span class="synSpecial">})</span> <span class="synComment"> &quot; dein.vimで管理して更新だけするリポジトリ(NeoBundleFetchとおなじ)</span> <span class="synStatement">call</span> dein#<span class="synIdentifier">add</span><span class="synSpecial">(</span><span class="synConstant">'jszakmeister/markdown2ctags'</span>, <span class="synSpecial">{</span><span class="synConstant">'rtp'</span>: <span class="synConstant">''</span><span class="synSpecial">})</span> <span class="synComment"> &quot; サブディレクトリを指定してdein#add()する場合</span> <span class="synComment"> &quot; frozenオプションは自動で更新しない</span> <span class="synComment"> &quot; 自分で開発するプラグインの管理に便利</span> <span class="synStatement">call</span> dein#local(<span class="synConstant">'~/src/github.com/violetyk'</span>, <span class="synSpecial"> \</span> { <span class="synSpecial"> \</span> <span class="synConstant">'frozen'</span> : <span class="synConstant">1</span>, <span class="synSpecial"> \</span> <span class="synConstant">'depends'</span> : [ <span class="synSpecial"> \</span> <span class="synConstant">'kana/vim-gf-user'</span>, <span class="synSpecial"> \</span> <span class="synConstant">'Shougo/neosnippet.vim'</span>, <span class="synSpecial"> \</span> <span class="synConstant">'vim-jp/vital.vim'</span> <span class="synSpecial"> \</span> ] <span class="synSpecial"> \</span> }, <span class="synSpecial"> \</span> [ <span class="synSpecial"> \</span> <span class="synConstant">'*.vim'</span>, <span class="synSpecial"> \</span> <span class="synConstant">'neosnippet-*'</span>, <span class="synSpecial"> \</span> <span class="synConstant">'neocomplete-*'</span>, <span class="synSpecial"> \</span> <span class="synConstant">'scratch-utility'</span> <span class="synSpecial"> \</span> ]<span class="synError">)</span> <span class="synStatement">call</span> dein#end<span class="synSpecial">()</span> <span class="synStatement">call</span> dein#save_state<span class="synSpecial">()</span> <span class="synStatement">endif</span> <span class="synStatement">filetype</span> <span class="synType">plugin</span> <span class="synType">indent</span> <span class="synType">on</span> </pre> yuhei_kagaya はじめての絵本 hatenablog://entry/8454420450106690607 2015-08-23T20:42:33+09:00 2015-08-23T20:50:50+09:00 息子のはじめての絵本は「はらぺこあおむし」でした。 はらぺこあおむし|絵本ナビ : エリック・カール,もり ひさし みんなの声・通販www.ehonnavi.net 絵の色がとてもきれいな本。穴の開いたページをめくるのが楽しい。 検索して知ったんだけど、絵本ナビがとてもよい。試し読みができたり、年齢別におすすめの絵本が載っている。定期的にチェックしよう。 たくさんの本が入った本棚を作ってあげたい。そのために良い本をたくさん知ろう、そして良い本は本で買おうと思う。 もう少し大きくなったら図書館にも行こう。 <p><a href="https://instagram.com/p/6tz_oaFdmm/"><img src="https://instagram.com/p/6tz_oaFdmm/media/?size=l" alt="" /></a></p> <p>息子のはじめての絵本は「<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A4%CF%A4%E9%A4%DA%A4%B3%A4%A2%A4%AA%A4%E0%A4%B7">はらぺこあおむし</a>」でした。</p> <p><iframe src="//hatenablog-parts.com/embed?url=http%3A%2F%2Fwww.ehonnavi.net%2Fehon%2F23%2F%25E3%2581%25AF%25E3%2582%2589%25E3%2581%25BA%25E3%2581%2593%25E3%2581%2582%25E3%2581%258A%25E3%2582%2580%25E3%2581%2597%2F" title="はらぺこあおむし|絵本ナビ : エリック・カール,もり ひさし みんなの声・通販" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"><a href="http://www.ehonnavi.net/ehon/23/%E3%81%AF%E3%82%89%E3%81%BA%E3%81%93%E3%81%82%E3%81%8A%E3%82%80%E3%81%97/">はらぺこあおむし|絵本ナビ : エリック・カール,もり ひさし みんなの声・通販</a></iframe><cite class="hatena-citation"><a href="http://www.ehonnavi.net/ehon/23/%E3%81%AF%E3%82%89%E3%81%BA%E3%81%93%E3%81%82%E3%81%8A%E3%82%80%E3%81%97/">www.ehonnavi.net</a></cite></p> <p>絵の色がとてもきれいな本。穴の開いたページをめくるのが楽しい。</p> <p>検索して知ったんだけど、<a href="http://www.ehonnavi.net/">絵本ナビ</a>がとてもよい。試し読みができたり、年齢別におすすめの絵本が載っている。定期的にチェックしよう。</p> <p>たくさんの本が入った本棚を作ってあげたい。そのために良い本をたくさん知ろう、そして良い本は本で買おうと思う。</p> <p>もう少し大きくなったら図書館にも行こう。</p> yuhei_kagaya ゲームボーイの思い出 hatenablog://entry/8454420450103227739 2015-07-26T17:16:24+09:00 2015-07-26T21:51:12+09:00 先週の昼休み、会社でお弁当を食べながらゲームボーイの話になった。 みんなどんなカセットがあったか写真を撮ってこよう、ということで引っ張り出してならべてみた。 カセットをしまっていたのは牛乳パックの空き箱。牛乳パックを横に置き、1面を切り取って作った箱にカセットを入れていた。大きさが収納にちょうど良い。 良くやったソフト やっぱり一番はサガ2。あと、リトルマスター2が好きだった。 カービィは、クリア後に知ることができる裏コマンドに驚き、「ウル技です」と一生懸命はがきに鉛筆で書いてファミリーコンピューターマガジンに送ってドキドキ待ってたけど何も無かった。好きな子の名前をヒロインにつけてた聖剣伝説は… <p><a href="https://instagram.com/p/5leGbCFdi8/"><img src="https://instagram.com/p/5leGbCFdi8/media/?size=l" alt="" /></a></p> <p>先週の昼休み、会社でお弁当を食べながら<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B2%A1%BC%A5%E0%A5%DC%A1%BC%A5%A4">ゲームボーイ</a>の話になった。<br/> みんなどんなカセットがあったか写真を撮ってこよう、ということで引っ張り出してならべてみた。</p> <p><a href="https://instagram.com/p/5lerjlldkB/"><img src="https://instagram.com/p/5lerjlldkB/media/?size=l" alt="" /></a></p> <p>カセットをしまっていたのは牛乳パックの空き箱。牛乳パックを横に置き、1面を切り取って作った箱にカセットを入れていた。大きさが収納にちょうど良い。</p> <h2>良くやったソフト</h2> <p>やっぱり一番はサガ2。あと、リトルマスター2が好きだった。<br/> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AB%A1%BC%A5%D3%A5%A3">カービィ</a>は、クリア後に知ることができる裏コマンドに驚き、「ウル技です」と一生懸命はがきに鉛筆で書いて<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A5%DF%A5%EA%A1%BC%A5%B3%A5%F3%A5%D4%A5%E5%A1%BC%A5%BF%A1%BC">ファミリーコンピューター</a>マガジンに送ってドキドキ待ってたけど何も無かった。好きな子の名前をヒロインにつけてた<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%BB%B7%F5%C5%C1%C0%E2">聖剣伝説</a>は、恥ずかしくて友達には貸せなかった。</p> <h2>初めての<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B2%A1%BC%A5%E0%A5%DC%A1%BC%A5%A4">ゲームボーイ</a></h2> <p>小学校高学年ぐらいの時かも。周りではみんな<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C6%A5%C8%A5%EA%A5%B9">テトリス</a>かマリオランドをやっていた。外でやってる子の画面をのぞき込んでみていた。</p> <p>初めて買ってもらったカセットが<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B2%A1%BC%A5%E0%A5%DC%A1%BC%A5%A4%A5%A6%A5%A9%A1%BC%A5%BA">ゲームボーイウォーズ</a>。ばあちゃんにもらったお年玉を握りしめて<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B2%E6%C2%B9%BB%D2">我孫子</a>の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BC%EA%B2%EC%BE%C2">手賀沼</a>前にあったライフに行った気がする。妹は<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C9%A5%AF%A5%BF%A1%BC%A5%DE%A5%EA%A5%AA">ドクターマリオ</a>を買ってもらった。本体は1つしかないから、交代でやっていた。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DF%A5%CB%BB%CD%B6%EE">ミニ四駆</a>にも使う貴重な単三電池を4本も使うし、電池が切れたら二人ともできないので早く変わって欲しくて必死だった。</p> <h2><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C9%A5%AF%A5%BF%A1%BC%A5%DE%A5%EA%A5%AA">ドクターマリオ</a>と母</h2> <p>中学生の頃になると、母親が毎晩寝る前に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B2%A1%BC%A5%E0%A5%DC%A1%BC%A5%A4">ゲームボーイ</a>をやっていた。やるのはいつも<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C9%A5%AF%A5%BF%A1%BC%A5%DE%A5%EA%A5%AA">ドクターマリオ</a>。 15レベルくらいから初めて20レベルを突破し、23か4ぐらいまでいってた。 21レベルより先は1回でも失敗すると20レベルに戻ってしまう仕様なので、母親のプレーを横に寝そべって見てて素直にスゲーと思っていた。</p> <p>レベルよりすごいと思ったのが、縦消しではなく横消しをメインでプレーしていたこと。 「縦4つでも消えるよ」って教えてあげたけど、「横で消えるからいいの」と母流を貫いていた。</p> <p>今思えば、そういうのがいいんだよね。自分で遊び方を見つけるのが楽しいんだ。</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%B9%E2%C0%EC">高専</a>の頃になっても、母親は寝る前に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C9%A5%AF%A5%BF%A1%BC%A5%DE%A5%EA%A5%AA">ドクターマリオ</a>をやっていた。でかくて重い充電式アダプタは壊れ、お父さんお手製のラジコンパーツで作ったアダプタを使っていた。</p> <p>なので、すこし小ぶりになった<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B2%A1%BC%A5%E0%A5%DC%A1%BC%A5%A4%A5%AB%A5%E9%A1%BC">ゲームボーイカラー</a>を買ってあげた。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C9%A5%AF%A5%BF%A1%BC%A5%DE%A5%EA%A5%AA">ドクターマリオ</a>にも少し色が付いた。</p> <h2>謎のカセット</h2> <p><a href="https://instagram.com/p/5le1AqldkX/"><img src="https://instagram.com/p/5le1AqldkX/media/?size=l" alt="" /></a> 貸し借りもするので無くさないようによくカセットにマジックで名前を書いてことはあった。けど、黒いマジックとテープで塗りつぶされているコレはなんだろう?</p> yuhei_kagaya 最近学んだRuby hatenablog://entry/8454420450101952923 2015-07-17T19:10:47+09:00 2015-07-17T19:11:09+09:00 Rangeの範囲 p (1..10).to_a p (1...10).to_a [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] [1, 2, 3, 4, 5, 6, 7, 8, 9] 多重代入とflatten 複数の引数でも、配列でも、どっちでも引数にとれて便利 def f(*params) params.flatten.reduce { |sum, v| sum + v } end p f 10, 20, 30 p f [10, 20, 30] p f 10, [20, 30] 60 60 60 Proc#curry カリー化したProcオブジェクトを返す def f(&bl… <h2>Rangeの範囲</h2> <pre class="code lang-ruby" data-lang="ruby" data-unlink>p (<span class="synConstant">1</span>..<span class="synConstant">10</span>).to_a p (<span class="synConstant">1</span>...<span class="synConstant">10</span>).to_a </pre> <pre class="code" data-lang="" data-unlink>[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] [1, 2, 3, 4, 5, 6, 7, 8, 9]</pre> <h2>多重代入とflatten</h2> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%CA%A3%BF%F4">複数</a>の引数でも、配列でも、どっちでも引数にとれて便利</p> <pre class="code lang-ruby" data-lang="ruby" data-unlink><span class="synPreProc">def</span> <span class="synIdentifier">f</span>(*params) params.flatten.reduce { |<span class="synIdentifier">sum</span>, <span class="synIdentifier">v</span>| sum + v } <span class="synPreProc">end</span> p f <span class="synConstant">10</span>, <span class="synConstant">20</span>, <span class="synConstant">30</span> p f [<span class="synConstant">10</span>, <span class="synConstant">20</span>, <span class="synConstant">30</span>] p f <span class="synConstant">10</span>, [<span class="synConstant">20</span>, <span class="synConstant">30</span>] </pre> <pre class="code" data-lang="" data-unlink>60 60 60</pre> <h2>Proc#curry</h2> <ul> <li>カリー化したProcオブジェクトを返す</li> </ul> <pre class="code lang-ruby" data-lang="ruby" data-unlink><span class="synPreProc">def</span> <span class="synIdentifier">f</span>(&amp;block) b1 = block.curry p b1.class <span class="synComment">#=&gt; Proc</span> b2 = b1.(<span class="synConstant">10</span>) p b2.class <span class="synComment">#=&gt; Proc</span> <span class="synComment"># f(10, x, y) みたいな状態</span> b3 = b2.(<span class="synConstant">20</span>) p b3.class <span class="synComment">#=&gt; Proc</span> <span class="synComment"># f(10, 20, y) みたいな状態</span> p b3.(<span class="synConstant">30</span>) <span class="synComment">#=&gt; 60</span> p b3.class <span class="synComment">#=&gt; Proc</span> <span class="synComment"># f(10, 20, 30) みたいな状態</span> b4 = b3.(<span class="synConstant">30</span>) p b4.class <span class="synComment">#=&gt; Fixnum</span> <span class="synComment"># f(10, 20, 30) の実行結果、60の型だから</span> p block.curry.(<span class="synSpecial">'</span><span class="synConstant">あ</span><span class="synSpecial">'</span>).(<span class="synSpecial">'</span><span class="synConstant">べ</span><span class="synSpecial">'</span>).(<span class="synSpecial">'</span><span class="synConstant">し</span><span class="synSpecial">'</span>) <span class="synComment">#=&gt; &quot;あべし&quot;</span> <span class="synPreProc">end</span> f { |<span class="synIdentifier">x</span>, <span class="synIdentifier">y</span> ,<span class="synIdentifier">z</span>| x + y + z } <span class="synComment"># こういうのはそもそできない</span> <span class="synComment"># f { |*x| x.reduce { |sum, v| sum + v } }</span> </pre> <pre class="code" data-lang="" data-unlink>Proc Proc Proc 60 Proc Fixnum &#34;あべし&#34;</pre> <p>Proc#curryは使いどころがまだないけど...。</p> <p><a href="https://twitter.com/hagiyat">hagiyat師匠</a>に教えてもらって、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Ruby">Ruby</a>コネコネしてるの楽しいです。</p> yuhei_kagaya 7月のVimmerランチ hatenablog://entry/8454420450101737378 2015-07-16T13:37:18+09:00 2015-07-16T13:37:47+09:00 毎月第三木曜は社内のVimmerが集結して昼飯を食いに行く。 今日はVimの日。ここへ行った。 ふーみん (表参道/台湾料理)tabelog.com 油淋鶏が上にのった麺ものを食べた。 意外にボリュームがあった。からあげは柔らかくて美味し。 今日話題に上がったのは、golangをVimで書くときの快適さについて。 最近はWebアプリケーション作るならRails、API書くならGoかなぁ。 <p>毎月第三木曜は社内の<a class="keyword" href="http://d.hatena.ne.jp/keyword/Vimmer">Vimmer</a>が集結して昼飯を食いに行く。<br/> 今日は<a class="keyword" href="http://d.hatena.ne.jp/keyword/Vim">Vim</a>の日。ここへ行った。</p> <p><iframe src="//hatenablog-parts.com/embed?url=http%3A%2F%2Ftabelog.com%2Ftokyo%2FA1306%2FA130602%2F13002096%2F" title="ふーみん (表参道/台湾料理)" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"><a href="http://tabelog.com/tokyo/A1306/A130602/13002096/">ふーみん (表参道/台湾料理)</a></iframe><cite class="hatena-citation"><a href="http://tabelog.com/tokyo/A1306/A130602/13002096/">tabelog.com</a></cite></p> <p>油淋鶏が上にのった麺ものを食べた。<br/> 意外にボリュームがあった。からあげは柔らかくて美味し。</p> <p>今日話題に上がったのは、<a class="keyword" href="http://d.hatena.ne.jp/keyword/golang">golang</a>を<a class="keyword" href="http://d.hatena.ne.jp/keyword/Vim">Vim</a>で書くときの快適さについて。 最近はWebアプリケーション作るなら<a class="keyword" href="http://d.hatena.ne.jp/keyword/Rails">Rails</a>、<a class="keyword" href="http://d.hatena.ne.jp/keyword/API">API</a>書くならGoかなぁ。</p> yuhei_kagaya Rubyのブロックについての理解 hatenablog://entry/8454420450099760261 2015-07-01T17:32:08+09:00 2015-07-17T17:17:26+09:00 [Ruby] ブロックとProcをちゃんと理解する - Qiitaqiita.com 実際手を動かすと理解しやすいので、書いてみるのがおすすめ。 基本 def give_me_block yield # yieldで暗黙引数のブロックが実行される感じ end give_me_block do # --- ここから p 'Hello, block1' p 'Hello, block2' p 'Hello, block3' # --- ここまでを def give_me_blockに渡す end do〜endで囲んだところをProcオブジェクトにしてgive_me_blockに渡し、yieldでは… <p><iframe src="//hatenablog-parts.com/embed?url=http%3A%2F%2Fqiita.com%2Fkidach1%2Fitems%2F15cfee9ec66804c3afd2" title="[Ruby] ブロックとProcをちゃんと理解する - Qiita" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"><a href="http://qiita.com/kidach1/items/15cfee9ec66804c3afd2">[Ruby] ブロックとProcをちゃんと理解する - Qiita</a></iframe><cite class="hatena-citation"><a href="http://qiita.com/kidach1/items/15cfee9ec66804c3afd2">qiita.com</a></cite></p> <p>実際手を動かすと理解しやすいので、書いてみるのがおすすめ。</p> <h2>基本</h2> <pre class="code lang-ruby" data-lang="ruby" data-unlink><span class="synPreProc">def</span> <span class="synIdentifier">give_me_block</span> <span class="synStatement">yield</span> <span class="synComment"># yieldで暗黙引数のブロックが実行される感じ</span> <span class="synPreProc">end</span> give_me_block <span class="synStatement">do</span> <span class="synComment"># --- ここから</span> p <span class="synSpecial">'</span><span class="synConstant">Hello, block1</span><span class="synSpecial">'</span> p <span class="synSpecial">'</span><span class="synConstant">Hello, block2</span><span class="synSpecial">'</span> p <span class="synSpecial">'</span><span class="synConstant">Hello, block3</span><span class="synSpecial">'</span> <span class="synComment"># --- ここまでを def give_me_blockに渡す</span> <span class="synStatement">end</span> </pre> <ul> <li><code>do〜end</code>で囲んだところをProcオブジェクトにして<code>give_me_block</code>に渡し、<code>yield</code>ではProcオブジェクトを<code>.call</code>している</li> </ul> <p>結果</p> <pre class="code" data-lang="" data-unlink>&#34;Hello, block1&#34; &#34;Hello, block2&#34; &#34;Hello, block3&#34;</pre> <h2>ブロックを受け取るときのルール</h2> <ul> <li>&amp;をつけることでブロックをうけとることを明示している</li> <li>引数に渡すことができるブロックはひとつまで</li> <li>引数のブロックは最後に定義されていないとダメ</li> <li>ブロックはProcのオブジェクト。<code>.call</code>で実行できる</li> </ul> <pre class="code lang-ruby" data-lang="ruby" data-unlink><span class="synComment"># def give_me_block_with_param(&amp;block1, &amp;block2) # これはダメ</span> <span class="synComment"># def give_me_block_with_param(&amp;block1, params) # これはダメ</span> <span class="synPreProc">def</span> <span class="synIdentifier">give_me_block_with_param</span>(params, &amp;block1) p params p block1.class block1.call <span class="synPreProc">end</span> </pre> <h3>引数の渡し方</h3> <ul> <li><code>give_me_block_with_param</code> は引数ひとつ(とブロック)なので、そもそもカンマで区切ることはできない</li> </ul> <pre class="code lang-ruby" data-lang="ruby" data-unlink><span class="synComment"># give_me_block_with_param 123, do #これはダメ</span> give_me_block_with_param <span class="synConstant">123</span> <span class="synStatement">do</span> p <span class="synSpecial">'</span><span class="synConstant">Block1</span><span class="synSpecial">'</span> <span class="synStatement">end</span> </pre> <p>結果</p> <pre class="code" data-lang="" data-unlink>123 Proc &#34;Block1&#34;</pre> <ul> <li>do〜endの代わりに {〜}するときは、どこまでが引数、どこからブロックなのかわからないので括弧をつけてあげる</li> </ul> <pre class="code lang-ruby" data-lang="ruby" data-unlink><span class="synComment"># give_me_block_with_param 456 { これはダメ</span> give_me_block_with_param (<span class="synConstant">456</span>) { p <span class="synSpecial">'</span><span class="synConstant">Block2</span><span class="synSpecial">'</span> } </pre> <p>結果</p> <pre class="code" data-lang="" data-unlink>456 Proc &#34;Block2&#34;</pre> <h2>ブロックをうけとるメリットのひとつは、見た目そのままで後処理など拡張ができること</h2> <pre class="code lang-ruby" data-lang="ruby" data-unlink><span class="synPreProc">def</span> <span class="synIdentifier">sum_and_exec_block</span>(x, y) z = x + y z = <span class="synStatement">yield</span> z <span class="synStatement">if</span> block_given? z <span class="synPreProc">end</span> p sum_and_exec_block(<span class="synConstant">1</span>, <span class="synConstant">2</span>) <span class="synComment"># 3</span> <span class="synComment"># ブロックの引数valueで受け取るのは上の yieldの引数 z</span> hoge = sum_and_exec_block(<span class="synConstant">10</span>, <span class="synConstant">20</span>) <span class="synStatement">do</span> |<span class="synIdentifier">value</span>| value + <span class="synConstant">10</span> <span class="synStatement">end</span> p hoge <span class="synComment"># 40</span> p( sum_and_exec_block(<span class="synConstant">10</span>, <span class="synConstant">20</span>) { |<span class="synIdentifier">value</span>| value + <span class="synConstant">20</span> }) <span class="synComment"># 50</span> </pre> yuhei_kagaya gitで最近コミットしたブランチを探す hatenablog://entry/8454420450098783644 2015-06-23T00:00:00+09:00 2015-06-24T18:15:29+09:00 gitを使った開発で複数のブランチが平行で走っていて、チェックアウトしようとしたときに「アレ名前なんだっけ」と忘れることがよくある。 適当なブランチ名をつけているわけではないんだけど。ちなみにブランチ名はこんな感じでつけてる。 feature/<GitHubのIssue番号>/<機能を表す名前> hotfix/<GitHubのIssue番号>/<修正対象機能> たとえば、feature/1234/optimize-top-page 最近コミットしたブランチの一覧 git for-each-refを使えば良いことが分かった。 git for-each-ref --count=10 --sort=… <p>gitを使った開発で<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CA%A3%BF%F4">複数</a>のブランチが平行で走っていて、チェックアウトしようとしたときに「アレ名前なんだっけ」と忘れることがよくある。 適当なブランチ名をつけているわけではないんだけど。ちなみにブランチ名はこんな感じでつけてる。</p> <ul> <li>feature/&lt;<a class="keyword" href="http://d.hatena.ne.jp/keyword/GitHub">GitHub</a>のIssue番号>/&lt;機能を表す名前></li> <li>hotfix/&lt;<a class="keyword" href="http://d.hatena.ne.jp/keyword/GitHub">GitHub</a>のIssue番号>/&lt;修正対象機能></li> </ul> <p>たとえば、<code>feature/1234/optimize-top-page</code></p> <h2>最近コミットしたブランチの一覧</h2> <p><a href="http://git-scm.com/docs/git-for-each-ref">git for-each-ref</a>を使えば良いことが分かった。</p> <pre class="code" data-lang="" data-unlink>git for-each-ref --count=10 --sort=-committerdate refs/heads/ --format=&#39;%(authordate:iso8601) %(refname:short)&#39; </pre> <p>上の例だと、</p> <ul> <li>ローカルの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EA%A5%DD%A5%B8%A5%C8%A5%EA">リポジトリ</a>を</li> <li>最近のコミット順に</li> <li>フォーマットは、<code>iso8601形式の日時 短いブランチ名</code>で</li> <li>10件取得する</li> </ul> <p>という意味。</p> <p><a href="http://git-scm.com/docs/git-for-each-ref">git for-each-refのドキュメント</a>を見ると、フォーマットには<code>%(subject)</code>や<code>%(authorname)</code>なども指定できるみたいなので、いろいろできそう。</p> <h2>.gitconfigにaliasとして追加した</h2> <pre class="code" data-lang="" data-unlink>[alias] mru = for-each-ref --format=&#39;%(refname:short) (%(authordate:relative))&#39; --sort=-committerdate refs/heads/</pre> <p>便利。</p> <h2>pecoのsourceにした</h2> <p><a href="[https://github.com/hagiyat/dotfiles/blob/master/zshrc">hagiyatさんのzshrc</a>からそのままコピーさせていただきました。</p> <p><iframe src="//hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2Fhagiyat%2Fdotfiles%2Fblob%2Fmaster%2Fzshrc" title="hagiyat/dotfiles" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"><a href="https://github.com/hagiyat/dotfiles/blob/master/zshrc">hagiyat/dotfiles</a></iframe><cite class="hatena-citation"><a href="https://github.com/hagiyat/dotfiles/blob/master/zshrc">github.com</a></cite></p> <pre class="code lang-zsh" data-lang="zsh" data-unlink><span class="synPreProc">#!/bin/zsh</span> <span class="synStatement">function</span> peco-git-branches () { <span class="synComment"> # exists? .git/</span> git rev-parse --git-dir <span class="synStatement">&gt;</span>/dev/null <span class="synConstant">2</span><span class="synStatement">&gt;</span>&amp;<span class="synConstant">1</span> <span class="synStatement">if</span> [[ <span class="synPreProc">$?</span> == <span class="synConstant">0</span> ]]; <span class="synStatement">then</span> <span class="synType">local</span> selected=<span class="synConstant">&quot;</span><span class="synPreProc">$(</span><span class="synConstant">git for-each-ref --format=&quot;%(refname) (%(authordate:relative))&quot; --sort=-committerdate refs/heads/ refs/remotes/ refs/tags/ </span><span class="synStatement">|</span><span class="synConstant"> sed -e &quot;s/^refs</span><span class="synSpecial">\/</span><span class="synConstant">//g&quot; </span><span class="synStatement">|</span><span class="synConstant"> peco --query &quot;</span><span class="synPreProc">$LBUFFER</span><span class="synConstant">&quot; --prompt &quot;[GIT BRANCH] &gt;&quot;</span><span class="synPreProc">)</span><span class="synConstant">&quot;</span> <span class="synStatement">if</span> [ -n <span class="synConstant">&quot;</span><span class="synPreProc">$selected</span><span class="synConstant">&quot;</span> ]; <span class="synStatement">then</span> <span class="synType">local</span> branch_type=<span class="synPreProc">${selected%%/*}</span> <span class="synType">local</span> branch_name=<span class="synPreProc">${selected[(w)1]#(heads|remotes|tags)/}</span> <span class="synStatement">case</span> <span class="synConstant">&quot;</span><span class="synPreProc">$branch_type</span><span class="synConstant">&quot;</span> <span class="synStatement">in</span> <span class="synConstant">&quot;heads&quot;</span><span class="synStatement">|</span><span class="synConstant">&quot;tags&quot;</span>) BUFFER=<span class="synConstant">&quot;git checkout </span><span class="synPreProc">$branch_name</span><span class="synConstant">&quot;</span> <span class="synStatement">zle</span> accept-line ;; <span class="synConstant">&quot;remotes&quot;</span>) BUFFER=<span class="synConstant">&quot;git checkout -t </span><span class="synPreProc">$branch_name</span><span class="synConstant">&quot;</span> <span class="synStatement">zle</span> accept-line ;; <span class="synStatement">esac</span> <span class="synStatement">fi</span> <span class="synStatement">fi</span> <span class="synStatement">zle</span> redisplay } <span class="synStatement">zle</span> -N peco-git-branches </pre> <p>かなり便利。</p> <h2><a class="keyword" href="http://d.hatena.ne.jp/keyword/bash">bash</a>や<a class="keyword" href="http://d.hatena.ne.jp/keyword/zsh">zsh</a>で文字列操作する方法いろいろ</h2> <p><iframe src="//hatenablog-parts.com/embed?url=http%3A%2F%2Ftim.vanwerkhoven.org%2Fpost%2F2012%2F10%2F28%2FZSH%2FBash-string-manipulation" title="ZSH/Bash string manipulation - Tim&#39;s blag" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"><a href="http://tim.vanwerkhoven.org/post/2012/10/28/ZSH/Bash-string-manipulation">ZSH/Bash string manipulation - Tim&#39;s blag</a></iframe><cite class="hatena-citation"><a href="http://tim.vanwerkhoven.org/post/2012/10/28/ZSH/Bash-string-manipulation">tim.vanwerkhoven.org</a></cite> とても勉強になった。すぐ<a class="keyword" href="http://d.hatena.ne.jp/keyword/sed">sed</a>とかしたくなっちゃうので。</p> yuhei_kagaya 内向型人間のための人生戦略大全 hatenablog://entry/8454420450098783394 2015-06-22T00:00:00+09:00 2015-06-24T18:15:23+09:00 内向型人間のための人生戦略大全作者: シルビア・レーケン出版社/メーカー: CCCメディアハウス発売日: 2014/11/20メディア: Kindle版この商品を含むブログを見る 例えばストレスを抱えたとき、たくさんの人に会って元気を充電するよりも、ひとりでゆっくり考えていたい。社会性がないわけでは無いと思う。右利きに対して左利きの人がいるように、割と内気な人もいるだけ。 最近、この本をたまたま青山ブックセンターで見つけて、救われた感がある。 きっかけは仕事上の悩みだけど、自分が思うに外交的な妻(あとで本人にこの本のチェックシートをやってみてもらったら中庸型だった)ともっとよりよく生きていくた… <p><div class="hatena-asin-detail"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B00PLC32NE/violetyk-22/"><img src="http://ecx.images-amazon.com/images/I/51jnrrKk12L._SL160_.jpg" class="hatena-asin-detail-image" alt="内向型人間のための人生戦略大全" title="内向型人間のための人生戦略大全"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B00PLC32NE/violetyk-22/">内向型人間のための人生戦略大全</a></p><ul><li><span class="hatena-asin-detail-label">作者:</span> シルビア・レーケン</li><li><span class="hatena-asin-detail-label">出版社/メーカー:</span> CCCメディアハウス</li><li><span class="hatena-asin-detail-label">発売日:</span> 2014/11/20</li><li><span class="hatena-asin-detail-label">メディア:</span> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Kindle">Kindle</a>版</li><li><a href="http://d.hatena.ne.jp/asin/B00PLC32NE/violetyk-22" target="_blank">この商品を含むブログを見る</a></li></ul></div><div class="hatena-asin-detail-foot"></div></div> 例えばストレスを抱えたとき、たくさんの人に会って元気を充電するよりも、ひとりでゆっくり考えていたい。社会性がないわけでは無いと思う。右利きに対して左利きの人がいるように、割と内気な人もいるだけ。</p> <p>最近、この本をたまたま<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%C4%BB%B3%A5%D6%A5%C3%A5%AF%A5%BB%A5%F3%A5%BF%A1%BC">青山ブックセンター</a>で見つけて、救われた感がある。 きっかけは仕事上の悩みだけど、自分が思うに外交的な妻(あとで本人にこの本のチェックシートをやってみてもらったら中庸型だった)ともっとよりよく生きていくためや、子が内向的・外交的どちらであっても内向的な親はどう接していけば良いか知りたかったので買ってみた。</p> <p>今までそれでよかったんだ。もっと小さな頃から知りたかった。そうすれば、なんか人と違ってうまくいかないんだよな、、、と悩むことも少なくなったかもしれない。</p> yuhei_kagaya 6月のVimmerランチ hatenablog://entry/8454420450098783296 2015-06-18T00:00:00+09:00 2015-06-24T18:15:18+09:00 毎月第三木曜は社内のVimmerが集結して昼飯を食いに行く。 今日はVimの日。ここへ行った。 青山 鶏味座 本店 (表参道/焼鳥)tabelog.com 南青山の落ち着いた雰囲気のなか、究極の親子丼に舌鼓を打ちながらVimの話にも花が咲いた。 うましうまし。 夜もよさそう。 <p>毎月第三木曜は社内の<a class="keyword" href="http://d.hatena.ne.jp/keyword/Vimmer">Vimmer</a>が集結して昼飯を食いに行く。<br/> 今日は<a class="keyword" href="http://d.hatena.ne.jp/keyword/Vim">Vim</a>の日。ここへ行った。</p> <p><iframe src="//hatenablog-parts.com/embed?url=http%3A%2F%2Ftabelog.com%2Ftokyo%2FA1306%2FA130602%2F13043454%2F" title="青山 鶏味座 本店 (表参道/焼鳥)" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"><a href="http://tabelog.com/tokyo/A1306/A130602/13043454/">青山 鶏味座 本店 (表参道/焼鳥)</a></iframe><cite class="hatena-citation"><a href="http://tabelog.com/tokyo/A1306/A130602/13043454/">tabelog.com</a></cite></p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%C6%EE%C0%C4%BB%B3">南青山</a>の落ち着いた雰囲気のなか、究極の親子丼に舌鼓を打ちながら<a class="keyword" href="http://d.hatena.ne.jp/keyword/Vim">Vim</a>の話にも花が咲いた。</p> <p>うましうまし。<br/> 夜もよさそう。</p> yuhei_kagaya RubyやRailsでメソッドを上書き・処理追加する方法いろいろ hatenablog://entry/8454420450098783207 2015-06-16T00:00:00+09:00 2015-06-24T18:15:11+09:00 オープンクラス class Hoge def hello 'HELLO' end end class Hoge def hello 'hello taro!' end end p Hoge.new.hello #=> "hello taro!" aliasでいったんメソッド名を退避するテクニック class Hoge def hello 'HELLO' end end class Hoge # (3) hello2のなかでold_method(旧helloを使う) def hello2 old_method + " taro!" end alias old_method hello # (1)… <h2><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AA%A1%BC%A5%D7%A5%F3%A5%AF%A5%E9%A5%B9">オープンクラス</a></h2> <pre class="code lang-ruby" data-lang="ruby" data-unlink><span class="synPreProc">class</span> <span class="synType">Hoge</span> <span class="synPreProc">def</span> <span class="synIdentifier">hello</span> <span class="synSpecial">'</span><span class="synConstant">HELLO</span><span class="synSpecial">'</span> <span class="synPreProc">end</span> <span class="synPreProc">end</span> <span class="synPreProc">class</span> <span class="synType">Hoge</span> <span class="synPreProc">def</span> <span class="synIdentifier">hello</span> <span class="synSpecial">'</span><span class="synConstant">hello taro!</span><span class="synSpecial">'</span> <span class="synPreProc">end</span> <span class="synPreProc">end</span> p <span class="synType">Hoge</span>.new.hello <span class="synComment">#=&gt; &quot;hello taro!&quot;</span> </pre> <h2>aliasでいったん<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E1%A5%BD%A5%C3%A5%C9">メソッド</a>名を退避するテクニック</h2> <pre class="code lang-ruby" data-lang="ruby" data-unlink><span class="synPreProc">class</span> <span class="synType">Hoge</span> <span class="synPreProc">def</span> <span class="synIdentifier">hello</span> <span class="synSpecial">'</span><span class="synConstant">HELLO</span><span class="synSpecial">'</span> <span class="synPreProc">end</span> <span class="synPreProc">end</span> <span class="synPreProc">class</span> <span class="synType">Hoge</span> <span class="synComment"># (3) hello2のなかでold_method(旧helloを使う)</span> <span class="synPreProc">def</span> <span class="synIdentifier">hello2</span> old_method + <span class="synSpecial">&quot;</span><span class="synConstant"> taro!</span><span class="synSpecial">&quot;</span> <span class="synPreProc">end</span> <span class="synPreProc">alias</span> <span class="synIdentifier">old_method</span> <span class="synIdentifier">hello</span> <span class="synComment"># (1) helloをold_methodに</span> <span class="synPreProc">alias</span> <span class="synIdentifier">hello</span> <span class="synIdentifier">hello2</span> <span class="synComment"># (2) hello2を(1)で置き換えたhelloに</span> <span class="synPreProc">end</span> p <span class="synType">Hoge</span>.new.hello <span class="synComment">#=&gt; &quot;HELLO taro!&quot;</span> </pre> <h2><a class="keyword" href="http://d.hatena.ne.jp/keyword/ActiveSupport">ActiveSupport</a>のalias_method_chainで上記aliasテクと同じことをする</h2> <pre class="code lang-ruby" data-lang="ruby" data-unlink><span class="synPreProc">class</span> <span class="synType">Hoge</span> <span class="synPreProc">def</span> <span class="synIdentifier">hello</span> <span class="synSpecial">'</span><span class="synConstant">HELLO</span><span class="synSpecial">'</span> <span class="synPreProc">end</span> <span class="synPreProc">end</span> <span class="synPreProc">require</span> <span class="synSpecial">'</span><span class="synConstant">active_support/core_ext/module/aliasing</span><span class="synSpecial">'</span> <span class="synPreProc">class</span> <span class="synType">Hoge</span> <span class="synPreProc">def</span> <span class="synIdentifier">hello_with_taro</span> hello_without_taro + <span class="synSpecial">&quot;</span><span class="synConstant"> taro!</span><span class="synSpecial">&quot;</span> <span class="synPreProc">end</span> alias_method_chain <span class="synConstant">:hello</span>, <span class="synConstant">:taro</span> <span class="synPreProc">end</span> </pre> <ul> <li>alias_method_chainは2つのルールが自動的に発動する <ul> <li>新しい<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E1%A5%BD%A5%C3%A5%C9">メソッド</a>名は<old>_with_xxxとして実装する必要がある</li> <li>旧<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E1%A5%BD%A5%C3%A5%C9">メソッド</a>は<old>_without_xxxという名前に変わる</li> </ul> </li> </ul> <h2>Module.prependを使って、モジュールに定義した<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E1%A5%BD%A5%C3%A5%C9">メソッド</a>でクラスの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E1%A5%BD%A5%C3%A5%C9">メソッド</a>を上書きする</h2> <pre class="code lang-ruby" data-lang="ruby" data-unlink><span class="synPreProc">class</span> <span class="synType">Hoge</span> <span class="synPreProc">def</span> <span class="synIdentifier">hello</span> <span class="synSpecial">'</span><span class="synConstant">HELLO</span><span class="synSpecial">'</span> <span class="synPreProc">end</span> <span class="synPreProc">end</span> <span class="synPreProc">module</span> <span class="synType">HelloFix</span> <span class="synPreProc">def</span> <span class="synIdentifier">hello</span> <span class="synStatement">super</span> + <span class="synSpecial">&quot;</span><span class="synConstant"> taro!</span><span class="synSpecial">&quot;</span> <span class="synComment"># superはHoge#hello</span> <span class="synPreProc">end</span> <span class="synPreProc">end</span> <span class="synType">Hoge</span>.send <span class="synConstant">:prepend</span>, <span class="synType">HelloFix</span> p <span class="synType">Hoge</span>.new.hello <span class="synComment">#=&gt; &quot;HELLO taro!&quot;</span> </pre> <ul> <li>app/config/initializers/配下に置いて、モンキーパッチするときに便利</li> </ul> <h2>参考</h2> <p>とても勉強になりました。 <iframe src="//hatenablog-parts.com/embed?url=http%3A%2F%2Fwww.techscore.com%2Fblog%2F2013%2F01%2F22%2Fruby2-0%25E3%2581%25AEmodule-prepend%25E3%2581%25AF%25E5%25A6%2582%25E4%25BD%2595%25E3%2581%25AB%25E3%2581%2597%25E3%2581%25A6alias_method_chain%25E3%2582%2592%25E6%2592%25B2%25E6%25BB%2585%25E3%2581%2599%25E3%2582%258B%25E3%2581%25AE%25E3%2581%258B%25EF%25BC%2581%25EF%25BC%259F%2F" title=" » Ruby2.0のModule#prependは如何にしてalias_method_chainを撲滅するのか!? | TECHSCORE BLOG" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"><a href="http://www.techscore.com/blog/2013/01/22/ruby2-0%E3%81%AEmodule-prepend%E3%81%AF%E5%A6%82%E4%BD%95%E3%81%AB%E3%81%97%E3%81%A6alias_method_chain%E3%82%92%E6%92%B2%E6%BB%85%E3%81%99%E3%82%8B%E3%81%AE%E3%81%8B%EF%BC%81%EF%BC%9F/"> » Ruby2.0のModule#prependは如何にしてalias_method_chainを撲滅するのか!? | TECHSCORE BLOG</a></iframe><cite class="hatena-citation"><a href="http://www.techscore.com/blog/2013/01/22/ruby2-0%E3%81%AEmodule-prepend%E3%81%AF%E5%A6%82%E4%BD%95%E3%81%AB%E3%81%97%E3%81%A6alias_method_chain%E3%82%92%E6%92%B2%E6%BB%85%E3%81%99%E3%82%8B%E3%81%AE%E3%81%8B%EF%BC%81%EF%BC%9F/">www.techscore.com</a></cite></p> yuhei_kagaya Vimでいい感じにMarkdownを書く hatenablog://entry/8454420450098782964 2015-06-05T00:00:00+09:00 2015-06-24T18:15:02+09:00 理想のMarkdown編集環境を求めて ブログやQiita::Teamへの投稿はMarkdownで書いている。 Markdown中にコードやコマンドを貼り付けることがよくあるのだけど、iTerm + tmux + vimのCUI環境で開発しているので、MarkdownもVimで書けたら便利だなぁと思っていた。 課題 MarkdownをVimで気持ちよく書くためには、この辺が気になっていた。 リストのインデント リストの操作 タスクリストの簡単入力、チェックをつける操作 コードのシンタックスハイライト プレビュー 見出しのアウトライン表示 このうち、プレビューとアウトライン以外の機能を満たすMa… <h2>理想のMarkdown編集環境を求めて</h2> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/y/yuhei_kagaya/20150605/20150605114815.png" alt="f:id:yuhei_kagaya:20150605114815p:plain" title="f:id:yuhei_kagaya:20150605114815p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>ブログやQiita::Teamへの投稿はMarkdownで書いている。<br/> Markdown中にコードやコマンドを貼り付けることがよくあるのだけど、iTerm + tmux + <a class="keyword" href="http://d.hatena.ne.jp/keyword/vim">vim</a>の<a class="keyword" href="http://d.hatena.ne.jp/keyword/CUI">CUI</a>環境で開発しているので、Markdownも<a class="keyword" href="http://d.hatena.ne.jp/keyword/Vim">Vim</a>で書けたら便利だなぁと思っていた。</p> <h2>課題</h2> <p>Markdownを<a class="keyword" href="http://d.hatena.ne.jp/keyword/Vim">Vim</a>で気持ちよく書くためには、この辺が気になっていた。</p> <ul> <li>リストのインデント</li> <li>リストの操作</li> <li>タスクリストの簡単入力、チェックをつける操作</li> <li>コードの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B7%A5%F3%A5%BF%A5%C3%A5%AF%A5%B9">シンタックス</a>ハイライト</li> <li>プレビュー</li> <li>見出しのアウトライン表示</li> </ul> <p>このうち、プレビューとアウトライン以外の機能を満たすMarkdown用の設定や関数を集めた<a class="keyword" href="http://d.hatena.ne.jp/keyword/Vim">Vim</a><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3">プラグイン</a>を作った。なかなか快適。</p> <p><iframe src="//hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2Fvioletyk%2Fiikanji-markdown.vim" title="violetyk/iikanji-markdown.vim" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"><a href="https://github.com/violetyk/iikanji-markdown.vim">violetyk/iikanji-markdown.vim</a></iframe><cite class="hatena-citation"><a href="https://github.com/violetyk/iikanji-markdown.vim">github.com</a></cite></p> <h2>Markdownのプレビュー</h2> <p><a href="https://github.com/kannokanno/previm">previm</a>が最高。<code>:PrevimOpen</code>とコマンドを実行するだけで、Makdownのプレビューがブラウザで確認できる。</p> <p><iframe src="//hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2Fkannokanno%2Fprevim" title="kannokanno/previm" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"><a href="https://github.com/kannokanno/previm">kannokanno/previm</a></iframe><cite class="hatena-citation"><a href="https://github.com/kannokanno/previm">github.com</a></cite></p> <h2>見出しのアウトライン表示</h2> <p>普段、コードを書くときの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%A6%A5%C8%A5%E9%A5%A4%A5%CA%A1%BC">アウトライナー</a>に<a href="https://github.com/majutsushi/tagbar/">tagbar</a>を使っているので、Markdownを編集中もTagbarでアウトライン表示したい。</p> <p><iframe src="//hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2Fmajutsushi%2Ftagbar%2F" title="majutsushi/tagbar" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"><a href="https://github.com/majutsushi/tagbar/">majutsushi/tagbar</a></iframe><cite class="hatena-citation"><a href="https://github.com/majutsushi/tagbar/">github.com</a></cite></p> <p><a href="https://github.com/majutsushi/tagbar/wiki#markdown">Home &middot; majutsushi/tagbar Wiki &middot; GitHub</a> にMarkdownをTagbar連携するやりかたが載っている。<br/> ctagsを使うやりかたより、<a href="https://github.com/jszakmeister/markdown2ctags">markdown2ctags</a>を使ったほうが見出しのネストに対応して直感的な表示になるので好みだった。</p> <h2>設定まとめ</h2> <p>次のような設定で、気持ちよくMarkdownが書ける環境になる!</p> <pre class="code lang-vim" data-lang="vim" data-unlink>NeoBundle <span class="synConstant">'kannokanno/previm'</span> NeoBundle <span class="synConstant">'majutsushi/tagbar'</span> NeoBundleFetch <span class="synConstant">'jszakmeister/markdown2ctags'</span> NeoBundle <span class="synConstant">'violetyk/iikanji-markdown.vim'</span> <span class="synStatement">let</span> <span class="synIdentifier">g</span>:tagbar_type_markdown <span class="synStatement">=</span> { <span class="synSpecial"> \</span> <span class="synConstant">'ctagstype'</span>: <span class="synConstant">'markdown'</span>, <span class="synSpecial"> \</span> <span class="synConstant">'ctagsbin'</span> : <span class="synPreProc">$HOME</span> <span class="synStatement">.</span> <span class="synConstant">'/.vim/bundle/markdown2ctags/markdown2ctags.py'</span>, <span class="synSpecial"> \</span> <span class="synConstant">'ctagsargs'</span> : <span class="synConstant">'-f - --sort=yes'</span>, <span class="synSpecial"> \</span> <span class="synConstant">'kinds'</span> : [ <span class="synSpecial"> \</span> <span class="synConstant">'s:sections'</span>, <span class="synSpecial"> \</span> <span class="synConstant">'i:images'</span> <span class="synSpecial"> \</span> ], <span class="synSpecial"> \</span> <span class="synConstant">'sro'</span> : <span class="synConstant">'|'</span>, <span class="synSpecial"> \</span> <span class="synConstant">'kind2scope'</span> : { <span class="synSpecial"> \</span> <span class="synConstant">'s'</span> : <span class="synConstant">'section'</span>, <span class="synSpecial"> \</span> }, <span class="synSpecial"> \</span> <span class="synConstant">'sort'</span>: <span class="synConstant">0</span>, <span class="synSpecial">\</span> } </pre> yuhei_kagaya Rails キャッシュとセッションを別々のmemcachedで管理 hatenablog://entry/8454420450098782823 2015-05-29T00:00:00+09:00 2015-06-24T18:14:53+09:00 Rails 4.2 Dalli require 'action_dispatch/middleware/session/dalli_store' Rails.application.configure do config.cache_store = :dalli_store, 'localhost:22222', { namespace: 'myapp_cache', compress: true, expires_in: 1.minute } config.session_store ActionDispatch::Session::DalliStore, key: 'myapp_sessi… <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Rails">Rails</a> 4.2</li> <li><a href="https://github.com/mperham/dalli">Dalli</a></li> </ul> <pre class="code lang-ruby" data-lang="ruby" data-unlink><span class="synPreProc">require</span> <span class="synSpecial">'</span><span class="synConstant">action_dispatch/middleware/session/dalli_store</span><span class="synSpecial">'</span> <span class="synType">Rails</span>.application.configure <span class="synStatement">do</span> config.cache_store = <span class="synConstant">:dalli_store</span>, <span class="synSpecial">'</span><span class="synConstant">localhost:22222</span><span class="synSpecial">'</span>, { <span class="synConstant">namespace</span>: <span class="synSpecial">'</span><span class="synConstant">myapp_cache</span><span class="synSpecial">'</span>, <span class="synConstant">compress</span>: <span class="synConstant">true</span>, <span class="synConstant">expires_in</span>: <span class="synConstant">1</span>.minute } config.session_store <span class="synType">ActionDispatch</span>::<span class="synType">Session</span>::<span class="synType">DalliStore</span>, <span class="synConstant">key</span>: <span class="synSpecial">'</span><span class="synConstant">myapp_session</span><span class="synSpecial">'</span>, <span class="synConstant">:expire_after</span> =&gt; <span class="synConstant">1</span>.month, <span class="synConstant">memcache_server</span>: <span class="synSpecial">'</span><span class="synConstant">localhost:33333</span><span class="synSpecial">'</span> <span class="synStatement">end</span> </pre> <p>デフォルト、session_storeは<code>:cookie_store</code>なので<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%E1%A5%F3%A5%C8%A5%A2%A5%A6%A5%C8">コメントアウト</a>した。</p> <p>config/initializers/session_store.rb</p> <pre class="code lang-ruby" data-lang="ruby" data-unlink><span class="synComment"># Rails.application.config.session_store :cookie_store</span> </pre> <p>この辺とか見てた。 <a href="https://github.com/mperham/dalli/blob/71de05f2db6a66e0c8a77b410310f3cb16a11d24/lib/action_dispatch/middleware/session/dalli_store.rb">dalli/dalli_store.rb at 71de05f2db6a66e0c8a77b410310f3cb16a11d24 &middot; mperham/dalli &middot; GitHub</a></p> <p>あと、ソースを追うにはやっぱりpry便利。</p> <pre class="code" data-lang="" data-unlink>&gt; cd Rails::Application::Configuration &gt; ls &gt; $ &gt; $ session_store &gt; cd ../ &gt; cd -</pre> yuhei_kagaya リストの差分 hatenablog://entry/8454420450098782742 2015-05-27T00:00:00+09:00 2015-06-24T18:14:48+09:00 id:celt69cobra「Vimscriptでリストの差分を抽出する関数ってあんの?」 :h functionsをみても分からなかったのでやってみた。 function! s:diff(list1, list2) abort return filter(copy(a:list1), 'index(a:list2, v:val) == -1') \ + filter(copy(a:list2), 'index(a:list1, v:val) == -1') endfunction let list1 = ['foo', 'bar', 'buzz'] let list2 = ['buzz', … <p><a href="http://blog.hatena.ne.jp/celt69cobra/">id:celt69cobra</a>「Vimscriptでリストの差分を抽出する関数ってあんの?」</p> <p><code>:h functions</code>をみても分からなかったのでやってみた。</p> <pre class="code lang-vim" data-lang="vim" data-unlink><span class="synStatement">function</span>! <span class="synSpecial">s:</span>diff<span class="synSpecial">(</span>list1, list2<span class="synSpecial">)</span> abort <span class="synStatement">return</span> <span class="synIdentifier">filter</span><span class="synSpecial">(</span><span class="synIdentifier">copy</span><span class="synSpecial">(</span><span class="synIdentifier">a:list1</span><span class="synSpecial">)</span>, <span class="synConstant">'index(a:list2, v:val) == -1'</span><span class="synSpecial">)</span> <span class="synSpecial"> \</span> <span class="synStatement">+</span> <span class="synIdentifier">filter</span><span class="synSpecial">(</span><span class="synIdentifier">copy</span><span class="synSpecial">(</span><span class="synIdentifier">a:list2</span><span class="synSpecial">)</span>, <span class="synConstant">'index(a:list1, v:val) == -1'</span><span class="synSpecial">)</span> <span class="synStatement">endfunction</span> <span class="synStatement">let</span> <span class="synIdentifier">list1</span> <span class="synStatement">=</span> [<span class="synConstant">'foo'</span>, <span class="synConstant">'bar'</span>, <span class="synConstant">'buzz'</span>] <span class="synStatement">let</span> <span class="synIdentifier">list2</span> <span class="synStatement">=</span> [<span class="synConstant">'buzz'</span>, <span class="synConstant">'foo'</span>, <span class="synConstant">'piyo'</span>] <span class="synStatement">echo</span> s:diff(<span class="synIdentifier">list1</span>, <span class="synIdentifier">list2</span>) <span class="synComment">&quot; ['bar', 'piyo']</span> <span class="synStatement">echo</span> s:diff(<span class="synIdentifier">list2</span>, <span class="synIdentifier">list1</span>) <span class="synComment">&quot; ['piyo', 'bar'] </span> </pre> <p>こんな感じ?</p> yuhei_kagaya AWS CloudFormationの勉強 hatenablog://entry/8454420450098782660 2015-05-27T00:00:00+09:00 2015-06-24T18:14:41+09:00 基本的な構成を作ってみた VPC、InternetGateway、RouteTable、Subnetの基本セット NetworkAclはとりあえず空 SecurityGroupはWebサーバ用、DB用の2つ Webサーバ用EC2インスタンス2つにPublicIPが振られる Amazon Linux RDBはMutiAZ、MutiAZで必要なDBSubnetGroup MySQL 図はCacooで書いた JSONテンプレート { "AWSTemplateFormatVersion" : "2010-09-09", "Description" : "01 Start Cloud Formation… <h1>基本的な構成を作ってみた</h1> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/y/yuhei_kagaya/20150527/20150527150328.png" alt="f:id:yuhei_kagaya:20150527150328p:plain" title="f:id:yuhei_kagaya:20150527150328p:plain" class="hatena-fotolife" itemprop="image"></span></p> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/VPC">VPC</a>、InternetGateway、RouteTable、Subnetの基本セット</li> <li>NetworkAclはとりあえず空</li> <li>SecurityGroupはWebサーバ用、DB用の2つ</li> <li>Webサーバ用EC2<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>2つにPublicIPが振られる <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Amazon">Amazon</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Linux">Linux</a></li> </ul> </li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/RDB">RDB</a>はMutiAZ、MutiAZで必要なDBSubnetGroup <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/MySQL">MySQL</a></li> </ul> </li> <li>図は<a href="https://cacoo.com/store/items/10246">Cacoo</a>で書いた</li> </ul> <h1><a class="keyword" href="http://d.hatena.ne.jp/keyword/JSON">JSON</a>テンプレート</h1> <pre class="code" data-lang="" data-unlink>{ &#34;AWSTemplateFormatVersion&#34; : &#34;2010-09-09&#34;, &#34;Description&#34; : &#34;01 Start Cloud Formation&#34;, &#34;Parameters&#34; : { &#34;InstanceType&#34; : { &#34;Description&#34; : &#34;WebServer EC2 instance type&#34;, &#34;Type&#34; : &#34;String&#34;, &#34;Default&#34; : &#34;t2.micro&#34;, &#34;AllowedValues&#34; : [ &#34;t2.micro&#34;,&#34;t2.small&#34;,&#34;t2.medium&#34;,&#34;m3.medium&#34;,&#34;m3.large&#34;,&#34;m3.xlarge&#34;,&#34;m3.2xlarge&#34;,&#34;c4.large&#34;,&#34;c4.xlarge&#34;,&#34;c4.2xlarge&#34;,&#34;c4.4xlarge&#34;,&#34;c4.8xlarge&#34;,&#34;c3.large&#34;,&#34;c3.xlarge&#34;,&#34;c3.2xlarge&#34;,&#34;c3.4xlarge&#34;,&#34;c3.8xlarge&#34;,&#34;r3.large&#34;,&#34;r3.xlarge&#34;,&#34;r3.2xlarge&#34;,&#34;r3.4xlarge&#34;,&#34;r3.8xlarge&#34;,&#34;i2.xlarge&#34;,&#34;i2.2xlarge&#34;,&#34;i2.4xlarge&#34;,&#34;i2.8xlarge&#34;,&#34;d2.xlarge&#34;,&#34;d2.2xlarge&#34;,&#34;d2.4xlarge&#34;,&#34;d2.8xlarge&#34;,&#34;g2.2xlarge&#34;,&#34;g2.8xlarge&#34; ], &#34;ConstraintDescription&#34; : &#34;must be a valid EC2 instance type.&#34; }, &#34;KeyName&#34;: { &#34;Description&#34; : &#34;Name of an existing EC2 KeyPair to enable SSH access to the instance&#34;, &#34;Type&#34;: &#34;String&#34;, &#34;MinLength&#34;: &#34;1&#34;, &#34;MaxLength&#34;: &#34;255&#34;, &#34;AllowedPattern&#34; : &#34;[\\x20-\\x7E]*&#34;, &#34;ConstraintDescription&#34; : &#34;can contain only ASCII characters.&#34; }, &#34;SSHLocation&#34; : { &#34;Description&#34; : &#34; The IP address range that can be used to SSH to the EC2 instances&#34;, &#34;Type&#34;: &#34;String&#34;, &#34;MinLength&#34;: &#34;9&#34;, &#34;MaxLength&#34;: &#34;18&#34;, &#34;Default&#34;: &#34;0.0.0.0/0&#34;, &#34;AllowedPattern&#34;: &#34;(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})&#34;, &#34;ConstraintDescription&#34;: &#34;must be a valid IP CIDR range of the form x.x.x.x/x.&#34; }, &#34;DBUser&#34;: { &#34;NoEcho&#34;: &#34;true&#34;, &#34;Description&#34; : &#34;The database admin account username&#34;, &#34;Type&#34;: &#34;String&#34;, &#34;MinLength&#34;: &#34;1&#34;, &#34;MaxLength&#34;: &#34;16&#34;, &#34;AllowedPattern&#34; : &#34;[a-zA-Z][a-zA-Z0-9]*&#34;, &#34;ConstraintDescription&#34; : &#34;must begin with a letter and contain only alphanumeric characters.&#34; }, &#34;DBPassword&#34;: { &#34;NoEcho&#34;: &#34;true&#34;, &#34;Description&#34; : &#34;The database admin account password&#34;, &#34;Type&#34;: &#34;String&#34;, &#34;MinLength&#34;: &#34;8&#34;, &#34;MaxLength&#34;: &#34;41&#34;, &#34;AllowedPattern&#34; : &#34;[a-zA-Z0-9]*&#34;, &#34;ConstraintDescription&#34; : &#34;must contain only alphanumeric characters.&#34; } }, &#34;Mappings&#34; : { }, &#34;Conditions&#34; : { }, &#34;Resources&#34; : { &#34;VPC&#34;: { &#34;Type&#34;: &#34;AWS::EC2::VPC&#34;, &#34;Properties&#34;: { &#34;CidrBlock&#34; : &#34;10.0.0.0/16&#34;, &#34;EnableDnsSupport&#34;: &#34;true&#34;, &#34;EnableDnsHostnames&#34;: &#34;true&#34;, &#34;InstanceTenancy&#34;: &#34;default&#34;, &#34;Tags&#34;: [ { &#34;Key&#34;: &#34;Application&#34;, &#34;Value&#34;: { &#34;Ref&#34; : &#34;AWS::StackId&#34; } } ] } }, &#34;SubnetPublicAZa&#34; : { &#34;Type&#34; : &#34;AWS::EC2::Subnet&#34;, &#34;Properties&#34; : { &#34;VpcId&#34; : { &#34;Ref&#34; : &#34;VPC&#34; }, &#34;CidrBlock&#34; : &#34;10.0.10.0/24&#34;, &#34;AvailabilityZone&#34;: &#34;ap-northeast-1a&#34;, &#34;Tags&#34;: [ { &#34;Key&#34;: &#34;Application&#34;, &#34;Value&#34;: { &#34;Ref&#34; : &#34;AWS::StackId&#34; } } ] } }, &#34;SubnetPublicAZc&#34; : { &#34;Type&#34; : &#34;AWS::EC2::Subnet&#34;, &#34;Properties&#34; : { &#34;VpcId&#34; : { &#34;Ref&#34; : &#34;VPC&#34; }, &#34;CidrBlock&#34; : &#34;10.0.11.0/24&#34;, &#34;AvailabilityZone&#34;: &#34;ap-northeast-1c&#34;, &#34;Tags&#34;: [ { &#34;Key&#34;: &#34;Application&#34;, &#34;Value&#34;: { &#34;Ref&#34; : &#34;AWS::StackId&#34; } } ] } }, &#34;SubnetPrivateAZa&#34; : { &#34;Type&#34; : &#34;AWS::EC2::Subnet&#34;, &#34;Properties&#34; : { &#34;VpcId&#34; : { &#34;Ref&#34; : &#34;VPC&#34; }, &#34;CidrBlock&#34; : &#34;10.0.20.0/24&#34;, &#34;AvailabilityZone&#34;: &#34;ap-northeast-1a&#34;, &#34;Tags&#34;: [ { &#34;Key&#34;: &#34;Application&#34;, &#34;Value&#34;: { &#34;Ref&#34; : &#34;AWS::StackId&#34; } } ] } }, &#34;SubnetPrivateAZc&#34; : { &#34;Type&#34; : &#34;AWS::EC2::Subnet&#34;, &#34;Properties&#34; : { &#34;VpcId&#34; : { &#34;Ref&#34; : &#34;VPC&#34; }, &#34;CidrBlock&#34; : &#34;10.0.21.0/24&#34;, &#34;AvailabilityZone&#34;: &#34;ap-northeast-1c&#34;, &#34;Tags&#34;: [ { &#34;Key&#34;: &#34;Application&#34;, &#34;Value&#34;: { &#34;Ref&#34; : &#34;AWS::StackId&#34; } } ] } }, &#34;InternetGateway&#34; : { &#34;Type&#34;: &#34;AWS::EC2::InternetGateway&#34;, &#34;Properties&#34;: { &#34;Tags&#34;: [ { &#34;Key&#34;: &#34;Application&#34;, &#34;Value&#34;: { &#34;Ref&#34; : &#34;AWS::StackId&#34; } } ] } }, &#34;InternetGatewayAttach&#34; : { &#34;Type&#34;: &#34;AWS::EC2::VPCGatewayAttachment&#34;, &#34;Properties&#34;: { &#34;VpcId&#34;: { &#34;Ref&#34; : &#34;VPC&#34; }, &#34;InternetGatewayId&#34;: { &#34;Ref&#34; : &#34;InternetGateway&#34; } } }, &#34;RouteTable&#34; : { &#34;Type&#34;: &#34;AWS::EC2::RouteTable&#34;, &#34;Properties&#34; : { &#34;VpcId&#34;: { &#34;Ref&#34; : &#34;VPC&#34; }, &#34;Tags&#34;: [ { &#34;Key&#34;: &#34;Application&#34;, &#34;Value&#34;: { &#34;Ref&#34; : &#34;AWS::StackId&#34; } } ] } }, &#34;Route&#34; : { &#34;Type&#34;: &#34;AWS::EC2::Route&#34;, &#34;DependsOn&#34;: &#34;InternetGatewayAttach&#34;, &#34;Properties&#34;: { &#34;RouteTableId&#34;: { &#34;Ref&#34; : &#34;RouteTable&#34; }, &#34;DestinationCidrBlock&#34;: &#34;0.0.0.0/0&#34;, &#34;GatewayId&#34;: { &#34;Ref&#34; : &#34;InternetGateway&#34; } } }, &#34;SubnetRouteTableAssociationPublicAZa&#34; : { &#34;Type&#34;: &#34;AWS::EC2::SubnetRouteTableAssociation&#34;, &#34;Properties&#34;: { &#34;SubnetId&#34;: { &#34;Ref&#34; : &#34;SubnetPublicAZa&#34; }, &#34;RouteTableId&#34;: { &#34;Ref&#34; : &#34;RouteTable&#34; } } }, &#34;SubnetRouteTableAssociationPublicAZc&#34; : { &#34;Type&#34;: &#34;AWS::EC2::SubnetRouteTableAssociation&#34;, &#34;Properties&#34;: { &#34;SubnetId&#34;: { &#34;Ref&#34; : &#34;SubnetPublicAZc&#34; }, &#34;RouteTableId&#34;: { &#34;Ref&#34; : &#34;RouteTable&#34; } } }, &#34;SubnetRouteTableAssociationPrivateAZa&#34; : { &#34;Type&#34;: &#34;AWS::EC2::SubnetRouteTableAssociation&#34;, &#34;Properties&#34;: { &#34;SubnetId&#34;: { &#34;Ref&#34; : &#34;SubnetPublicAZa&#34; }, &#34;RouteTableId&#34;: { &#34;Ref&#34; : &#34;RouteTable&#34; } } }, &#34;SubnetRouteTableAssociationPrivateAZc&#34; : { &#34;Type&#34;: &#34;AWS::EC2::SubnetRouteTableAssociation&#34;, &#34;Properties&#34;: { &#34;SubnetId&#34;: { &#34;Ref&#34; : &#34;SubnetPublicAZc&#34; }, &#34;RouteTableId&#34;: { &#34;Ref&#34; : &#34;RouteTable&#34; } } }, &#34;NetworkAcl&#34; : { &#34;Type&#34;: &#34;AWS::EC2::NetworkAcl&#34;, &#34;Properties&#34;: { &#34;VpcId&#34;: {&#34;Ref&#34; : &#34;VPC&#34;}, &#34;Tags&#34;: [ {&#34;Key&#34; : &#34;Application&#34;, &#34;Value&#34; : { &#34;Ref&#34; : &#34;AWS::StackId&#34;} } ] } }, &#34;SecurityGroupWeb&#34; : { &#34;Type&#34;: &#34;AWS::EC2::SecurityGroup&#34;, &#34;Properties&#34;: { &#34;VpcId&#34;: { &#34;Ref&#34; : &#34;VPC&#34; }, &#34;GroupDescription&#34;: &#34;Web Server security group&#34;, &#34;SecurityGroupIngress&#34;: [ { &#34;IpProtocol&#34; : &#34;tcp&#34;, &#34;FromPort&#34; : &#34;22&#34;, &#34;ToPort&#34; : &#34;22&#34;, &#34;CidrIp&#34; : { &#34;Ref&#34; : &#34;SSHLocation&#34;} }, { &#34;IpProtocol&#34; : &#34;tcp&#34;, &#34;FromPort&#34; : &#34;80&#34;, &#34;ToPort&#34; : &#34;80&#34;, &#34;CidrIp&#34; : &#34;0.0.0.0/0&#34; } ] } }, &#34;SecurityGroupDb&#34; : { &#34;Type&#34;: &#34;AWS::EC2::SecurityGroup&#34;, &#34;Properties&#34;: { &#34;VpcId&#34;: { &#34;Ref&#34; : &#34;VPC&#34; }, &#34;GroupDescription&#34;: &#34;Database Server security group&#34;, &#34;SecurityGroupIngress&#34;: [ { &#34;IpProtocol&#34; : &#34;tcp&#34;, &#34;FromPort&#34; : &#34;3306&#34;, &#34;ToPort&#34; : &#34;3306&#34;, &#34;SourceSecurityGroupId&#34; : { &#34;Ref&#34; : &#34;SecurityGroupWeb&#34;} } ] } }, &#34;InstanceWebServerAZa&#34;: { &#34;Type&#34;: &#34;AWS::EC2::Instance&#34;, &#34;Properties&#34;: { &#34;ImageId&#34;: &#34;ami-cbf90ecb&#34;, &#34;InstanceType&#34;: { &#34;Ref&#34; : &#34;InstanceType&#34; }, &#34;NetworkInterfaces&#34;: [ { &#34;AssociatePublicIpAddress&#34;: true, &#34;DeviceIndex&#34;: 0, &#34;GroupSet&#34;: [ { &#34;Ref&#34; : &#34;SecurityGroupWeb&#34; } ], &#34;SubnetId&#34;: { &#34;Ref&#34;: &#34;SubnetPublicAZa&#34; } } ], &#34;Monitoring&#34;: false, &#34;KeyName&#34;: { &#34;Ref&#34; : &#34;KeyName&#34; }, &#34;UserData&#34;: &#34;&#34;, &#34;Tags&#34;: [ { &#34;Key&#34;: &#34;Name&#34;, &#34;Value&#34;: &#34;app-web&#34; } ] } }, &#34;InstanceWebServerAZc&#34;: { &#34;Type&#34;: &#34;AWS::EC2::Instance&#34;, &#34;Properties&#34;: { &#34;ImageId&#34;: &#34;ami-cbf90ecb&#34;, &#34;InstanceType&#34;: { &#34;Ref&#34; : &#34;InstanceType&#34; }, &#34;NetworkInterfaces&#34;: [ { &#34;AssociatePublicIpAddress&#34;: true, &#34;DeviceIndex&#34;: 0, &#34;GroupSet&#34;: [ { &#34;Ref&#34; : &#34;SecurityGroupWeb&#34; } ], &#34;SubnetId&#34;: { &#34;Ref&#34;: &#34;SubnetPublicAZc&#34; } } ], &#34;Monitoring&#34;: false, &#34;KeyName&#34;: { &#34;Ref&#34; : &#34;KeyName&#34; }, &#34;UserData&#34;: &#34;&#34;, &#34;Tags&#34;: [ { &#34;Key&#34;: &#34;Name&#34;, &#34;Value&#34;: &#34;app-web&#34; } ] } }, &#34;DBSubnetGroup&#34;: { &#34;Type&#34;: &#34;AWS::RDS::DBSubnetGroup&#34;, &#34;Properties&#34; : { &#34;DBSubnetGroupDescription&#34; : &#34;db subnet group&#34;, &#34;SubnetIds&#34; : [ { &#34;Ref&#34;: &#34;SubnetPrivateAZa&#34; }, { &#34;Ref&#34;: &#34;SubnetPrivateAZc&#34; } ] } }, &#34;DBParameterGroup&#34;: { &#34;Type&#34;: &#34;AWS::RDS::DBParameterGroup&#34;, &#34;Properties&#34; : { &#34;Description&#34;: &#34;My Parameter group&#34;, &#34;Family&#34;: &#34;Mysql5.6&#34; } }, &#34;DBInstance&#34;: { &#34;Type&#34;: &#34;AWS::RDS::DBInstance&#34;, &#34;Properties&#34;: { &#34;AllocatedStorage&#34; : &#34;20&#34;, &#34;AutoMinorVersionUpgrade&#34; : false, &#34;BackupRetentionPeriod&#34; : &#34;7&#34;, &#34;DBInstanceClass&#34; : &#34;db.t2.micro&#34;, &#34;DBInstanceIdentifier&#34; : &#34;mydbinstance&#34;, &#34;DBName&#34; : &#34;myapp&#34;, &#34;DBParameterGroupName&#34; : { &#34;Ref&#34; : &#34;DBParameterGroup&#34; }, &#34;DBSubnetGroupName&#34; : { &#34;Ref&#34; : &#34;DBSubnetGroup&#34; }, &#34;Engine&#34; : &#34;MySQL&#34;, &#34;EngineVersion&#34; : &#34;5.6.22&#34;, &#34;MasterUsername&#34; : { &#34;Ref&#34; : &#34;DBUser&#34; }, &#34;MasterUserPassword&#34; : { &#34;Ref&#34; : &#34;DBPassword&#34; }, &#34;MultiAZ&#34; : true, &#34;Port&#34; : &#34;3306&#34;, &#34;PreferredBackupWindow&#34; : &#34;04:00-04:30&#34;, &#34;PubliclyAccessible&#34; : false, &#34;StorageType&#34; : &#34;gp2&#34;, &#34;VPCSecurityGroups&#34; : [ { &#34;Ref&#34; : &#34;SecurityGroupDb&#34; } ] } } }, &#34;Outputs&#34; : { } }</pre> <h1><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EA%A5%DD%A5%B8%A5%C8%A5%EA">リポジトリ</a></h1> <p>勉強の成果はこの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EA%A5%DD%A5%B8%A5%C8%A5%EA">リポジトリ</a>にコミットしてる<br/> <a href="https://github.com/violetyk/study-aws-cloud-formation">https://github.com/violetyk/study-aws-cloud-formation</a></p> yuhei_kagaya AWS CloudFormationの効率的な学び方 hatenablog://entry/8454420450098782591 2015-05-22T00:00:00+09:00 2015-06-24T18:14:35+09:00 RDSとかは特に設定項目が多く、JSONの各項目に何を指定すれば良いかリファレンスを見て理解するのが大変。 ConfigとCloudTail マネジメントコンソールからポチポチやって立ち上げたときに、裏側でよしなに作ってくれているJSONが見えたら捗る。 そこで、ConfigとCloudTail。 Config リソースのIDを指定して、設定内容がJSONで分かる CloudTail ユーザやリソースのイベント履歴を追うことができる 画面からViewEventをみると変更内容がJSONで分かる マネジメントコンソールでリソースを立ち上げてみる ↓ ConfigやCloudTailでJSONを確… <p>RDSとかは特に設定項目が多く、<a class="keyword" href="http://d.hatena.ne.jp/keyword/JSON">JSON</a>の各項目に何を指定すれば良いかリファレンスを見て理解するのが大変。</p> <h1>ConfigとCloudTail</h1> <p>マネジメントコンソールからポチポチやって立ち上げたときに、裏側でよしなに作ってくれている<a class="keyword" href="http://d.hatena.ne.jp/keyword/JSON">JSON</a>が見えたら捗る。 そこで、ConfigとCloudTail。</p> <ul> <li>Config <ul> <li>リソースのIDを指定して、設定内容が<a class="keyword" href="http://d.hatena.ne.jp/keyword/JSON">JSON</a>で分かる</li> </ul> </li> <li>CloudTail <ul> <li>ユーザやリソースのイベント履歴を追うことができる</li> <li>画面から<code>ViewEvent</code>をみると変更内容が<a class="keyword" href="http://d.hatena.ne.jp/keyword/JSON">JSON</a>で分かる</li> </ul> </li> </ul> <pre class="code" data-lang="" data-unlink>マネジメントコンソールでリソースを立ち上げてみる ↓ ConfigやCloudTailでJSONを確認 ↓ リファレンスを読む ↓ CloudFormationのJSONを書く</pre> <p>という流れで効率的に学ぶことができる。</p> yuhei_kagaya AWS::IAM::InstanceProfileの理解 hatenablog://entry/8454420450098782553 2015-05-21T00:30:00+09:00 2015-06-24T18:14:30+09:00 AWS::EC2::Instanceを立ち上げるときに指定できるIamInstanceProfileがよく分からなかった。 セキュリティグループやネットワークACLでアクセス制御できるのに... EC2インスタンスからS3へアップロードするとしても、Webアプリケーション内でAWSのユーザ(アクセスキーID、シークレットアクセスキー)を指定すればできるのに... こんな感じ?不安だけど、今んところの理解を次にまとめてみた。 そもそもAWSのユーザができることは「AWSを操作するAPIをたたくこと」 起動したEC2インスタンスの中に入っていろんな操作はできない。RDSで起動したMySQLの操作は… <p><code>AWS::EC2::Instance</code>を立ち上げるときに指定できる<a href="https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-iaminstanceprofile">IamInstanceProfile</a>がよく分からなかった。</p> <ul> <li>セキュリティグループやネットワーク<a class="keyword" href="http://d.hatena.ne.jp/keyword/ACL">ACL</a>でアクセス制御できるのに...</li> <li>EC2<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>からS3へアップロードするとしても、Webアプリケーション内で<a class="keyword" href="http://d.hatena.ne.jp/keyword/AWS">AWS</a>のユーザ(アクセスキーID、シークレットアクセスキー)を指定すればできるのに...</li> </ul> <p>こんな感じ?不安だけど、今んところの理解を次にまとめてみた。</p> <h2>そもそも<a class="keyword" href="http://d.hatena.ne.jp/keyword/AWS">AWS</a>のユーザができることは「<a class="keyword" href="http://d.hatena.ne.jp/keyword/AWS">AWS</a>を操作する<a class="keyword" href="http://d.hatena.ne.jp/keyword/API">API</a>をたたくこと」</h2> <p>起動したEC2<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>の中に入っていろんな操作はできない。RDSで起動した<a class="keyword" href="http://d.hatena.ne.jp/keyword/MySQL">MySQL</a>の操作は「<a class="keyword" href="http://d.hatena.ne.jp/keyword/MySQL">MySQL</a>クライアント」から行う。</p> <h2>ロールとプロファイルについて</h2> <ul> <li>S3のバケット一覧が参照できるよ、S3へアップロードできるよという権限の集まり</li> <li>ユーザにロールをつけておけば、その権限で許可されている操作ができる</li> <li>プロファイルは<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CA%A3%BF%F4">複数</a>のロールをまとめたもの <ul> <li>例:Web<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%D7%A5%EA%A5%B1%A1%BC%A5%B7%A5%E7%A5%F3%A5%B5%A1%BC%A5%D0">アプリケーションサーバ</a>用のプロファイル <ul> <li>S3が使えるロール</li> <li>CloudSearchが操作できるロール</li> </ul> </li> </ul> </li> </ul> <h2>結局、プロファイルをEC2<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>につけると何が良いのか</h2> <ul> <li>EC2<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>自体がS3やCloudSearchを操作できる権限を得る</li> <li>アプリケーションの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BD%A1%BC%A5%B9%A5%B3%A1%BC%A5%C9">ソースコード</a>にユーザのアクセスキーIDとシークレットアクセスキーを含める必要が無くなる</li> </ul> <p>そもそもユーザは退職などでカジュアルに削除することがあるので、アクセスキーIDとシークレットアクセスキーを<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BD%A1%BC%A5%B9%A5%B3%A1%BC%A5%C9">ソースコード</a>にハードコーディングするのは危険。動かなくなる恐れがある。</p> <p>あと、あまりユーザに直接ロールをつけたりしない。ユーザをグループでまとめ、グループに対してロールをつけるとよい。</p> yuhei_kagaya Cloud Formationのテンプレートを何で書くか hatenablog://entry/8454420450098782439 2015-05-21T00:30:00+09:00 2015-06-24T18:14:21+09:00 CloudFormationのテンプレートを書いているけど、大量のJSON記述&コメントが書けないのがちょっとつらい。 Cloud FormationのJSON生成ツール探し いろいろある。 VisualOps 画面からネットワークをつくってJSONを生成。 Visual DevOps Automation for Amazon Web Services | VisualOpswww.visualops.io CoffeeFormation CoffeeScriptのコードからJSONを生成。コメントが書けるのが嬉しい。繰り返しの定義が書ける。 j3tm0t0/csfngithub.com s… <p>CloudFormationのテンプレートを書いているけど、大量の<a class="keyword" href="http://d.hatena.ne.jp/keyword/JSON">JSON</a>記述&コメントが書けないのがちょっとつらい。</p> <h1>Cloud Formationの<a class="keyword" href="http://d.hatena.ne.jp/keyword/JSON">JSON</a>生成<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C4%A1%BC%A5%EB">ツール</a>探し</h1> <p>いろいろある。</p> <h2>VisualOps</h2> <p>画面からネットワークをつくって<a class="keyword" href="http://d.hatena.ne.jp/keyword/JSON">JSON</a>を生成。</p> <p><iframe src="//hatenablog-parts.com/embed?url=http%3A%2F%2Fwww.visualops.io%2F" title="Visual DevOps Automation for Amazon Web Services | VisualOps" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"><a href="http://www.visualops.io/">Visual DevOps Automation for Amazon Web Services | VisualOps</a></iframe><cite class="hatena-citation"><a href="http://www.visualops.io/">www.visualops.io</a></cite></p> <h2>CoffeeFormation</h2> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/CoffeeScript">CoffeeScript</a>のコードから<a class="keyword" href="http://d.hatena.ne.jp/keyword/JSON">JSON</a>を生成。コメントが書けるのが嬉しい。繰り返しの定義が書ける。</p> <p><iframe src="//hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2Fj3tm0t0%2Fcsfn" title="j3tm0t0/csfn" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"><a href="https://github.com/j3tm0t0/csfn">j3tm0t0/csfn</a></iframe><cite class="hatena-citation"><a href="https://github.com/j3tm0t0/csfn">github.com</a></cite></p> <h2>sparkle_formation</h2> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Ruby">Ruby</a>のコードから<a class="keyword" href="http://d.hatena.ne.jp/keyword/JSON">JSON</a>を生成。</p> <p><iframe src="//hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2Fsparkleformation%2Fsparkle_formation" title="sparkleformation/sparkle_formation" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"><a href="https://github.com/sparkleformation/sparkle_formation">sparkleformation/sparkle_formation</a></iframe><cite class="hatena-citation"><a href="https://github.com/sparkleformation/sparkle_formation">github.com</a></cite></p> <h1>結局は生の<a class="keyword" href="http://d.hatena.ne.jp/keyword/JSON">JSON</a>を書くのが良い</h1> <p>CloudFormationを学び始めの頃から生成<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C4%A1%BC%A5%EB">ツール</a>を使ってしまうと<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C4%A1%BC%A5%EB">ツール</a>の記法(設定操作)と実際生成される<a class="keyword" href="http://d.hatena.ne.jp/keyword/JSON">JSON</a>の両方を結びつけて学ぶことになるので、結構大変。 <a href="http://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/template-reference.html">テンプレートリファレンス</a>を見て地道に<a class="keyword" href="http://d.hatena.ne.jp/keyword/JSON">JSON</a>を書いていった方がよいかも。</p> <p>普段<a class="keyword" href="http://d.hatena.ne.jp/keyword/Vim">Vim</a>でコードも<a class="keyword" href="http://d.hatena.ne.jp/keyword/JSON">JSON</a>も書いているので、テンプレートリファレンスで学んだ内容を<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%CB%A5%DA%A5%C3%A5%C8">スニペット</a>として落とし込んでいくことにした。 neosnippetの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%CB%A5%DA%A5%C3%A5%C8">スニペット</a>にすると、neocompleteで補完も効くし高速に書けるので便利。</p> <p><iframe src="//hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2Fvioletyk%2Fneosnippet-aws-cloud-formation" title="violetyk/neosnippet-aws-cloud-formation" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"><a href="https://github.com/violetyk/neosnippet-aws-cloud-formation">violetyk/neosnippet-aws-cloud-formation</a></iframe><cite class="hatena-citation"><a href="https://github.com/violetyk/neosnippet-aws-cloud-formation">github.com</a></cite></p> yuhei_kagaya AWSのSecurityGroupとNetworkACL hatenablog://entry/8454420450098782363 2015-05-21T00:00:00+09:00 2015-06-24T18:14:04+09:00 違い 違いは簡単にこんな感じ。 セキュリティグループ ネットワークACL EC2インスタンスのファイアーフォール サブネットのファイアーウォール 許可のみ設定できる(ホワイトリスト形式) 許可と拒否が設定できる ユーザーガイドの図がとてもわかりやすい。 どう使い分けるか デフォルトのネットワークACLひとつだけ用意しておいて特に何もせず、通常はセキュリティグループを使うのが良いかも。 セキュリティグループ 細かい用途ごとにたくさん作る 外からのアクセス制御 -> CiderIp 一般ユーザのHTTP nagios 内部のアクセスの制御 -> SourceSecurityGroupIdでRef … <h1>違い</h1> <p>違いは簡単にこんな感じ。</p> <table> <thead> <tr> <th style="text-align:left;">セキュリティグループ</th> <th style="text-align:left;">ネットワーク<a class="keyword" href="http://d.hatena.ne.jp/keyword/ACL">ACL</a></th> </tr> </thead> <tbody> <tr> <td style="text-align:left;">EC2<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>のファイアーフォール</td> <td style="text-align:left;">サブネットのファイアーウォール</td> </tr> <tr> <td style="text-align:left;">許可のみ設定できる(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DB%A5%EF%A5%A4%A5%C8%A5%EA%A5%B9%A5%C8">ホワイトリスト</a>形式)</td> <td style="text-align:left;">許可と拒否が設定できる</td> </tr> </tbody> </table> <p><a href="http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/VPC_Security.html">ユーザーガイドの図</a>がとてもわかりやすい。</p> <h1>どう使い分けるか</h1> <p>デフォルトのネットワーク<a class="keyword" href="http://d.hatena.ne.jp/keyword/ACL">ACL</a>ひとつだけ用意しておいて特に何もせず、通常はセキュリティグループを使うのが良いかも。</p> <h2>セキュリティグループ</h2> <ul> <li>細かい用途ごとにたくさん作る <ul> <li>外からのアクセス制御 -> <code>CiderIp</code> <ul> <li>一般ユーザのHTTP</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/nagios">nagios</a></li> </ul> </li> <li>内部のアクセスの制御 -> <code>SourceSecurityGroupId</code>で<code>Ref</code> <ul> <li>データベースへの通信</li> <li>Fluentdの通信</li> </ul> </li> </ul> </li> </ul> <h2>ネットワーク<a class="keyword" href="http://d.hatena.ne.jp/keyword/ACL">ACL</a></h2> <ul> <li>ネットワーク外部からのアクセスの全体制御などに(<a class="keyword" href="http://d.hatena.ne.jp/keyword/DoS">DoS</a>アタックの防御とか)</li> </ul> <h1>CloudFormationでのリソース名</h1> <ul> <li>セキュリティグループ <ul> <li>作成・ルール設定: <code>AWS::EC2::SecurityGroup</code></li> </ul> </li> <li>ネットワーク<a class="keyword" href="http://d.hatena.ne.jp/keyword/ACL">ACL</a> <ul> <li>作成: <code>AWS::EC2::NetworkAcl</code></li> <li>ルール設定:<code>AWS::EC2::NetworkAclEntry</code></li> <li>サブネットの関連づけ: <code>AWS::EC2::SubnetNetworkAclAssociation</code></li> </ul> </li> </ul> yuhei_kagaya AWS CloudFormation 入門 hatenablog://entry/8454420450098782231 2015-05-20T00:00:00+09:00 2015-06-24T18:13:56+09:00 概要 CloudFormationは、今までマネジメントコンソールやawscliでやってたシステム構築を自動化する仕組み VPCつくってSubnetつくってルートテーブル作ってEC2つくって...の一連の流れが一発で起動できる 自動化の設定は「テンプレート」と呼ばれるJSONファイルに記述する VPC, Subnet, EC2など作成するものは「リソース」と呼ぶ リソースの集まりをは「スタック」と呼ばれる CloudFormationはスタック単位でシステム構築、スタック単位で削除できる マネジメントコンソールでやってみる流れ ローカルでテンプレートを書く 拡張子は.jsonか.templat… <h1>概要</h1> <ul> <li>CloudFormationは、今までマネジメントコンソールやawscliでやってたシステム構築を自動化する仕組み</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/VPC">VPC</a>つくってSubnetつくってルートテーブル作ってEC2つくって...の一連の流れが一発で起動できる</li> <li>自動化の設定は「テンプレート」と呼ばれる<a class="keyword" href="http://d.hatena.ne.jp/keyword/JSON">JSON</a>ファイルに記述する</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/VPC">VPC</a>, Subnet, EC2など作成するものは「リソース」と呼ぶ</li> <li>リソースの集まりをは「スタック」と呼ばれる</li> <li>CloudFormationはスタック単位でシステム構築、スタック単位で削除できる</li> </ul> <h1>マネジメントコンソールでやってみる流れ</h1> <ul> <li>ローカルでテンプレートを書く <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%B3%C8%C4%A5%BB%D2">拡張子</a>は<code>.json</code>か<code>.template</code>か<code>.txt</code></li> </ul> </li> <li>マネジメントコンソール><a class="keyword" href="http://d.hatena.ne.jp/keyword/AWS">AWS</a> Cloud Formation</li> <li>スタックの作成</li> <li>作成したテンプレートをアップロード(S3)して保存</li> <li>スタックの起動</li> <li>できたか確認 <ul> <li>Eventsタブで実行結果が確認できる</li> <li>途中で失敗しても、スタック全体が<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%ED%A1%BC%A5%EB%A5%D0%A5%C3%A5%AF">ロールバック</a>されるので安心</li> </ul> </li> </ul> <h1>テンプレートの基本構造</h1> <p>Resourcesだけ必須。とりあえず最初はResourcesだけ書けるようになろう。</p> <pre class="code" data-lang="" data-unlink>{ &#34;AWSTemplateFormatVersion&#34; : &#34;version date&#34;, &#34;Description&#34; : &#34;JSON string&#34;, &#34;Parameters&#34; : { }, &#34;Mappings&#34; : { }, &#34;Conditions&#34; : { }, &#34;Resources&#34; : { }, &#34;Outputs&#34; : { } }</pre> <ul> <li>AWSTemplateFormatVersion <ul> <li>テンプレートが準拠しているAWSCloudFormationのテンプレートバージョン</li> </ul> </li> <li>Description <ul> <li>テンプレートの説明</li> <li>AWSTemplateFormatVersionの後に書く必要がある</li> </ul> </li> <li>Parameters <ul> <li>スタック作成/更新時に、外から渡すことができるパラメータの定義</li> <li>テンプレート内から <code>Ref演算子</code> を使って参照できる</li> <li>パラメータの名前は自分で決めることができる(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CD%BD%CC%F3%B8%EC">予約語</a>以外。<a href="http://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html">制限</a>)</li> </ul> </li> <li>Mappings <ul> <li>テンプレート内から参照できるkey-value構造のパラメータ定義</li> <li><code>Fn::FindInMap</code>組み込み関数を使ってここで定義したvalueを参照できる</li> </ul> </li> <li>Resources <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/VPC">VPC</a>, Subnet, EC2など、リソースの設定</li> </ul> </li> <li>Outputs <ul> <li>テンプレートを実行した結果をどう出力するかの設定</li> <li>組み込み関数などを使って情報を整形する</li> <li>たとえば、CloudFormationでたち上げたサイトのURLを返すようにしておいて、<code>aws</code>コマンドで実行したらすぐにサイトのトップページにアクセスできる</li> </ul> </li> </ul> <h1>テンプレートの書き方を学ぶ</h1> <h2>Resourcesのパラメータをどう見つければ良いか</h2> <ul> <li>Webでリファレンスを見る <ul> <li><a href="https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-template-resource-type-ref.html">リソースプロパティのリファレンス</a></li> </ul> </li> <li>コマンドのヘルプを見る <ul> <li><code>aws ec2 create-vpc help</code></li> </ul> </li> </ul> <h2>サンプルで勉強する</h2> <ul> <li>EC2やRDSなどリソースの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%CB%A5%DA%A5%C3%A5%C8">スニペット</a> => <a href="http://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/CHAP_TemplateQuickRef.html">テンプレートスニペット</a></li> <li>そのまま使えるスタックのサンプル => <a href="http://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/sample-templates-services-us-west-2.html">サンプルテンプレート</a></li> </ul> <h2>テンプレート内で使える組み込み関数を知る</h2> <p>条件分岐も書くことができるので、<code>EnvironmentType</code>をみてprodなら本番環境、testならテスト環境を立ち上げるなどできる。</p> <ul> <li><a href="http://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference.html">組み込み関数リファレンス</a> <ul> <li>Ref</li> <li>Fn::<a class="keyword" href="http://d.hatena.ne.jp/keyword/Base64">Base64</a></li> <li>Fn::FindInMap</li> <li>Fn::GetAtt</li> <li>Fn::GetAZs</li> <li>Fn::Join</li> <li>Fn::Select</li> <li>Fn::And</li> <li>Fn::Equals</li> <li>Fn::If</li> <li>Fn::Not</li> <li>Fn::Or</li> </ul> </li> </ul> yuhei_kagaya ピアノの曲に癒やされる hatenablog://entry/8454420450098782110 2015-05-19T00:30:00+09:00 2015-06-24T18:13:41+09:00 最近、通勤中や作業中にピアノの曲をよく聴く。 NewdaysSchroeder-Headzジャズ¥200provided courtesy of iTunes Blue BirdSchroeder-Headzジャズ¥250provided courtesy of iTunes きときと - 四本足の踊り高木正勝サウンドトラック¥250provided courtesy of iTunes Yubi Piano高木正勝ワールド¥150provided courtesy of iTunes girls高木正勝エレクトロニック¥150provided courtesy of iTunes The P… <p>最近、通勤中や作業中にピアノの曲をよく聴く。</p> <p><div class="itunes-embed freezed itunes-kind-song"><a href="https://itunes.apple.com/jp/album/newdays/id383566180?i=383566223&uo=4&at=10lNLj" rel="nofollow" target="_blank"><img src="http://cdn.image.st-hatena.com/image/scale/e0615666d99e8d0bc7cf09ab63a66f01d5e19f8f/enlarge=0;height=200;version=1;width=200/http%3A%2F%2Fis4.mzstatic.com%2Fimage%2Fpf%2Fus%2Fr30%2FMusic%2F52%2F46%2F84%2Fmzi.bouhjntk.100x100-75.jpg" alt="Newdays" title="Newdays" class="itunes-embed-image"/></a><div class="itunes-embed-info"><p class="itunes-embed-title"><a href="https://itunes.apple.com/jp/album/newdays/id383566180?i=383566223&uo=4&at=10lNLj" rel="nofollow" target="_blank">Newdays</a></p><ul><li class="itunes-embed-artist"><a class="keyword" href="http://d.hatena.ne.jp/keyword/Schroeder-Headz">Schroeder-Headz</a></li><li class="itunes-embed-genre">ジャズ</li><li class="itunes-embed-price">¥200</li><li class="itunes-embed-badge"><a href="https://itunes.apple.com/jp/album/newdays/id383566180?i=383566223&uo=4&at=10lNLj" rel="nofollow" target="_blank"><img src="/images/theme/itunes/itunes-badge-itunes@2x.png" width="44px" height="15px" /></a></li></ul><ul><li class="itunes-embed-preview"><audio src="http://a1462.phobos.apple.com/us/r1000/119/Music/v4/4f/97/80/4f9780c6-ad15-66ed-78a8-4dacb397f339/mzaf_1542950565812700266.aac.m4a" controls></audio></li><li><small class="provided-courtesy-of-itunes">provided courtesy of <a class="keyword" href="http://d.hatena.ne.jp/keyword/iTunes">iTunes</a></small></li></ul></div></div></p> <p><div class="itunes-embed freezed itunes-kind-song"><a href="https://itunes.apple.com/jp/album/blue-bird/id808178312?i=808178373&uo=4&at=10lNLj" rel="nofollow" target="_blank"><img src="http://cdn.image.st-hatena.com/image/scale/fa01b9f9d3dcd0262739a8d0f3f06f658f5aff2a/enlarge=0;height=200;version=1;width=200/http%3A%2F%2Fis4.mzstatic.com%2Fimage%2Fpf%2Fus%2Fr30%2FMusic4%2Fv4%2F23%2Fed%2F1a%2F23ed1aae-b1cb-4e28-29c2-e5edc664320b%2FVICL-64128.100x100-75.jpg" alt="Blue Bird" title="Blue Bird" class="itunes-embed-image"/></a><div class="itunes-embed-info"><p class="itunes-embed-title"><a href="https://itunes.apple.com/jp/album/blue-bird/id808178312?i=808178373&uo=4&at=10lNLj" rel="nofollow" target="_blank">Blue Bird</a></p><ul><li class="itunes-embed-artist"><a class="keyword" href="http://d.hatena.ne.jp/keyword/Schroeder-Headz">Schroeder-Headz</a></li><li class="itunes-embed-genre">ジャズ</li><li class="itunes-embed-price">¥250</li><li class="itunes-embed-badge"><a href="https://itunes.apple.com/jp/album/blue-bird/id808178312?i=808178373&uo=4&at=10lNLj" rel="nofollow" target="_blank"><img src="/images/theme/itunes/itunes-badge-itunes@2x.png" width="44px" height="15px" /></a></li></ul><ul><li class="itunes-embed-preview"><audio src="http://a1442.phobos.apple.com/us/r20/Music/v4/90/5d/55/905d5555-241e-23f5-f89e-100b1a63f291/mzaf_3142245891558201220.plus.aac.p.m4a" controls></audio></li><li><small class="provided-courtesy-of-itunes">provided courtesy of <a class="keyword" href="http://d.hatena.ne.jp/keyword/iTunes">iTunes</a></small></li></ul></div></div></p> <p><div class="itunes-embed freezed itunes-kind-song"><a href="https://itunes.apple.com/jp/album/kitokito-si-ben-zuno-yongri/id547892108?i=547892483&uo=4&at=10lNLj" rel="nofollow" target="_blank"><img src="http://cdn.image.st-hatena.com/image/scale/15df19f8d7dad146002df286b3a2cec886d44be0/enlarge=0;height=200;version=1;width=200/http%3A%2F%2Fis3.mzstatic.com%2Fimage%2Fpf%2Fus%2Fr30%2FMusic%2Fv4%2Ff5%2F3e%2F7b%2Ff53e7be8-5c65-632c-97d8-875831a46eb3%2Fookami.100x100-75.jpg" alt="きときと - 四本足の踊り" title="きときと - 四本足の踊り" class="itunes-embed-image"/></a><div class="itunes-embed-info"><p class="itunes-embed-title"><a href="https://itunes.apple.com/jp/album/kitokito-si-ben-zuno-yongri/id547892108?i=547892483&uo=4&at=10lNLj" rel="nofollow" target="_blank">きときと - 四本足の踊り</a></p><ul><li class="itunes-embed-artist"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%B9%E2%CC%DA%C0%B5%BE%A1">高木正勝</a></li><li class="itunes-embed-genre">サウンドトラック</li><li class="itunes-embed-price">¥250</li><li class="itunes-embed-badge"><a href="https://itunes.apple.com/jp/album/kitokito-si-ben-zuno-yongri/id547892108?i=547892483&uo=4&at=10lNLj" rel="nofollow" target="_blank"><img src="/images/theme/itunes/itunes-badge-itunes@2x.png" width="44px" height="15px" /></a></li></ul><ul><li class="itunes-embed-preview"><audio src="http://a432.phobos.apple.com/us/r20/Music/d7/cc/0b/mzi.ffjgdwpz.aac.p.m4a" controls></audio></li><li><small class="provided-courtesy-of-itunes">provided courtesy of <a class="keyword" href="http://d.hatena.ne.jp/keyword/iTunes">iTunes</a></small></li></ul></div></div></p> <p><div class="itunes-embed freezed itunes-kind-song"><a href="https://itunes.apple.com/jp/album/yubi-piano/id546112877?i=546112887&uo=4&at=10lNLj" rel="nofollow" target="_blank"><img src="http://cdn.image.st-hatena.com/image/scale/ca8a880b36e312b96c68ad36807fbb0a9e8f8677/enlarge=0;height=200;version=1;width=200/http%3A%2F%2Fis1.mzstatic.com%2Fimage%2Fpf%2Fus%2Fr30%2FMusic%2Fv4%2F68%2F57%2Fcd%2F6857cdca-d753-53fa-c43a-8fc0e8e0d787%2F859708603620_cover.100x100-75.jpg" alt="Yubi Piano" title="Yubi Piano" class="itunes-embed-image"/></a><div class="itunes-embed-info"><p class="itunes-embed-title"><a href="https://itunes.apple.com/jp/album/yubi-piano/id546112877?i=546112887&uo=4&at=10lNLj" rel="nofollow" target="_blank">Yubi Piano</a></p><ul><li class="itunes-embed-artist"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%B9%E2%CC%DA%C0%B5%BE%A1">高木正勝</a></li><li class="itunes-embed-genre">ワールド</li><li class="itunes-embed-price">¥150</li><li class="itunes-embed-badge"><a href="https://itunes.apple.com/jp/album/yubi-piano/id546112877?i=546112887&uo=4&at=10lNLj" rel="nofollow" target="_blank"><img src="/images/theme/itunes/itunes-badge-itunes@2x.png" width="44px" height="15px" /></a></li></ul><ul><li class="itunes-embed-preview"><audio src="http://a138.phobos.apple.com/us/r30/Music/53/90/db/mzi.kdopyipk.aac.p.m4a" controls></audio></li><li><small class="provided-courtesy-of-itunes">provided courtesy of <a class="keyword" href="http://d.hatena.ne.jp/keyword/iTunes">iTunes</a></small></li></ul></div></div></p> <p><div class="itunes-embed freezed itunes-kind-song"><a href="https://itunes.apple.com/jp/album/girls/id255067321?i=255068188&uo=4&at=10lNLj" rel="nofollow" target="_blank"><img src="http://cdn.image.st-hatena.com/image/scale/49d0d10b30197adb72ecd3610dc103207b3e17e0/enlarge=0;height=200;version=1;width=200/http%3A%2F%2Fis3.mzstatic.com%2Fimage%2Fpf%2Fus%2Fr30%2FMusic%2F65%2F00%2F05%2Fmzi.epdaxuce.100x100-75.jpg" alt="girls" title="girls" class="itunes-embed-image"/></a><div class="itunes-embed-info"><p class="itunes-embed-title"><a href="https://itunes.apple.com/jp/album/girls/id255067321?i=255068188&uo=4&at=10lNLj" rel="nofollow" target="_blank">girls</a></p><ul><li class="itunes-embed-artist"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%B9%E2%CC%DA%C0%B5%BE%A1">高木正勝</a></li><li class="itunes-embed-genre">エレクトロニック</li><li class="itunes-embed-price">¥150</li><li class="itunes-embed-badge"><a href="https://itunes.apple.com/jp/album/girls/id255067321?i=255068188&uo=4&at=10lNLj" rel="nofollow" target="_blank"><img src="/images/theme/itunes/itunes-badge-itunes@2x.png" width="44px" height="15px" /></a></li></ul><ul><li class="itunes-embed-preview"><audio src="http://a1111.phobos.apple.com/us/r1000/100/Music/v4/08/9a/00/089a00ed-3206-a829-3d0e-d27097badb09/mzaf_5684841755310956837.aac.m4a" controls></audio></li><li><small class="provided-courtesy-of-itunes">provided courtesy of <a class="keyword" href="http://d.hatena.ne.jp/keyword/iTunes">iTunes</a></small></li></ul></div></div></p> <p><div class="itunes-embed freezed itunes-kind-Album"><a href="https://itunes.apple.com/jp/album/the-p.i.a.n.o.-set/id168926649?uo=4&at=10lNLj" rel="nofollow" target="_blank"><img src="http://cdn.image.st-hatena.com/image/scale/fd8345e6994035e5febf992328b4ea2347cf2d34/enlarge=0;height=200;version=1;width=200/http%3A%2F%2Fis3.mzstatic.com%2Fimage%2Fpf%2Fus%2Fr30%2FMusic%2F6e%2Fec%2F80%2Fmzi.iknbfhqs.100x100-75.jpg" alt="The P.I.A.N.O. Set" title="The P.I.A.N.O. Set" class="itunes-embed-image"/></a><div class="itunes-embed-info"><p class="itunes-embed-title"><a href="https://itunes.apple.com/jp/album/the-p.i.a.n.o.-set/id168926649?uo=4&at=10lNLj" rel="nofollow" target="_blank">The P.I.A.N.O. Set</a></p><ul><li class="itunes-embed-artist"><a class="keyword" href="http://d.hatena.ne.jp/keyword/DAISHI%20DANCE">DAISHI DANCE</a></li><li class="itunes-embed-genre">ダンス</li><li class="itunes-embed-price"></li><li class="itunes-embed-badge"><a href="https://itunes.apple.com/jp/album/the-p.i.a.n.o.-set/id168926649?uo=4&at=10lNLj" rel="nofollow" target="_blank"><img src="/images/theme/itunes/itunes-badge-itunes@2x.png" width="44px" height="15px" /></a></li></ul></div></div></p> <p><div class="itunes-embed freezed itunes-kind-song"><a href="https://itunes.apple.com/jp/album/flower-dance/id445788118?i=445788320&uo=4&at=10lNLj" rel="nofollow" target="_blank"><img src="http://cdn.image.st-hatena.com/image/scale/cb4f7b463f4fd001bce23755aa80286a33c8fef8/enlarge=0;height=200;version=1;width=200/http%3A%2F%2Fis5.mzstatic.com%2Fimage%2Fpf%2Fus%2Fr30%2FMusic%2Fa6%2F9b%2F3e%2Fmzi.dvbxvyey.100x100-75.jpg" alt="Flower Dance" title="Flower Dance" class="itunes-embed-image"/></a><div class="itunes-embed-info"><p class="itunes-embed-title"><a href="https://itunes.apple.com/jp/album/flower-dance/id445788118?i=445788320&uo=4&at=10lNLj" rel="nofollow" target="_blank">Flower Dance</a></p><ul><li class="itunes-embed-artist">DJ OKAWARI</li><li class="itunes-embed-genre">ヒップホップ/ラップ</li><li class="itunes-embed-price">¥150</li><li class="itunes-embed-badge"><a href="https://itunes.apple.com/jp/album/flower-dance/id445788118?i=445788320&uo=4&at=10lNLj" rel="nofollow" target="_blank"><img src="/images/theme/itunes/itunes-badge-itunes@2x.png" width="44px" height="15px" /></a></li></ul><ul><li class="itunes-embed-preview"><audio src="http://a687.phobos.apple.com/us/r1000/112/Music/v4/c0/ea/c5/c0eac5d3-5352-09b8-b732-cf02069a9431/mzaf_404808515990102095.aac.m4a" controls></audio></li><li><small class="provided-courtesy-of-itunes">provided courtesy of <a class="keyword" href="http://d.hatena.ne.jp/keyword/iTunes">iTunes</a></small></li></ul></div></div></p> <p><div class="itunes-embed freezed itunes-kind-song"><a href="https://itunes.apple.com/jp/album/luv-letter/id322094298?i=322094334&uo=4&at=10lNLj" rel="nofollow" target="_blank"><img src="http://cdn.image.st-hatena.com/image/scale/5646f811f0758d4200c4c5810871550c18064435/enlarge=0;height=200;version=1;width=200/http%3A%2F%2Fis3.mzstatic.com%2Fimage%2Fpf%2Fus%2Fr30%2FMusic%2Fea%2Fb8%2F2e%2Fmzi.wtyppwsu.100x100-75.jpg" alt="Luv Letter" title="Luv Letter" class="itunes-embed-image"/></a><div class="itunes-embed-info"><p class="itunes-embed-title"><a href="https://itunes.apple.com/jp/album/luv-letter/id322094298?i=322094334&uo=4&at=10lNLj" rel="nofollow" target="_blank">Luv Letter</a></p><ul><li class="itunes-embed-artist">DJ OKAWARI</li><li class="itunes-embed-genre">ヒップホップ/ラップ</li><li class="itunes-embed-price">¥150</li><li class="itunes-embed-badge"><a href="https://itunes.apple.com/jp/album/luv-letter/id322094298?i=322094334&uo=4&at=10lNLj" rel="nofollow" target="_blank"><img src="/images/theme/itunes/itunes-badge-itunes@2x.png" width="44px" height="15px" /></a></li></ul><ul><li class="itunes-embed-preview"><audio src="http://a1237.phobos.apple.com/us/r1000/093/Music/v4/87/b9/43/87b94335-e221-fd1c-f840-8d9f985852bc/mzaf_1678649308555007950.aac.m4a" controls></audio></li><li><small class="provided-courtesy-of-itunes">provided courtesy of <a class="keyword" href="http://d.hatena.ne.jp/keyword/iTunes">iTunes</a></small></li></ul></div></div></p> <p><div class="itunes-embed freezed itunes-kind-song"><a href="https://itunes.apple.com/jp/album/minamo/id322094298?i=322094675&uo=4&at=10lNLj" rel="nofollow" target="_blank"><img src="http://cdn.image.st-hatena.com/image/scale/5646f811f0758d4200c4c5810871550c18064435/enlarge=0;height=200;version=1;width=200/http%3A%2F%2Fis3.mzstatic.com%2Fimage%2Fpf%2Fus%2Fr30%2FMusic%2Fea%2Fb8%2F2e%2Fmzi.wtyppwsu.100x100-75.jpg" alt="Minamo" title="Minamo" class="itunes-embed-image"/></a><div class="itunes-embed-info"><p class="itunes-embed-title"><a href="https://itunes.apple.com/jp/album/minamo/id322094298?i=322094675&uo=4&at=10lNLj" rel="nofollow" target="_blank">Minamo</a></p><ul><li class="itunes-embed-artist">DJ OKAWARI</li><li class="itunes-embed-genre">ヒップホップ/ラップ</li><li class="itunes-embed-price">¥150</li><li class="itunes-embed-badge"><a href="https://itunes.apple.com/jp/album/minamo/id322094298?i=322094675&uo=4&at=10lNLj" rel="nofollow" target="_blank"><img src="/images/theme/itunes/itunes-badge-itunes@2x.png" width="44px" height="15px" /></a></li></ul><ul><li class="itunes-embed-preview"><audio src="http://a1741.phobos.apple.com/us/r1000/070/Music/v4/29/36/3e/29363e54-9b18-f99d-a32c-0b14979d06d7/mzaf_3353949508247179811.aac.m4a" controls></audio></li><li><small class="provided-courtesy-of-itunes">provided courtesy of <a class="keyword" href="http://d.hatena.ne.jp/keyword/iTunes">iTunes</a></small></li></ul></div></div></p> <p><div class="itunes-embed freezed itunes-kind-song"><a href="https://itunes.apple.com/jp/album/light-dance/id287562252?i=287562314&uo=4&at=10lNLj" rel="nofollow" target="_blank"><img src="http://cdn.image.st-hatena.com/image/scale/6421584dc870244c43d6dbc720e31f0931a98145/enlarge=0;height=200;version=1;width=200/http%3A%2F%2Fis2.mzstatic.com%2Fimage%2Fpf%2Fus%2Fr30%2FMusic%2Fb7%2F56%2Fd7%2Fmzi.uxfiryoi.100x100-75.jpg" alt="Light Dance" title="Light Dance" class="itunes-embed-image"/></a><div class="itunes-embed-info"><p class="itunes-embed-title"><a href="https://itunes.apple.com/jp/album/light-dance/id287562252?i=287562314&uo=4&at=10lNLj" rel="nofollow" target="_blank">Light Dance</a></p><ul><li class="itunes-embed-artist"><a class="keyword" href="http://d.hatena.ne.jp/keyword/Akira">Akira</a> Kosemura</li><li class="itunes-embed-genre">エレクトロニック</li><li class="itunes-embed-price">¥150</li><li class="itunes-embed-badge"><a href="https://itunes.apple.com/jp/album/light-dance/id287562252?i=287562314&uo=4&at=10lNLj" rel="nofollow" target="_blank"><img src="/images/theme/itunes/itunes-badge-itunes@2x.png" width="44px" height="15px" /></a></li></ul><ul><li class="itunes-embed-preview"><audio src="http://a1980.phobos.apple.com/us/r30/Music/d5/64/75/mzm.vhylorkz.aac.p.m4a" controls></audio></li><li><small class="provided-courtesy-of-itunes">provided courtesy of <a class="keyword" href="http://d.hatena.ne.jp/keyword/iTunes">iTunes</a></small></li></ul></div></div></p> <p><div class="itunes-embed freezed itunes-kind-song"><a href="https://itunes.apple.com/jp/album/5-centimeters-per-second-distant/id876663347?i=876663360&uo=4&at=10lNLj" rel="nofollow" target="_blank"><img src="http://cdn.image.st-hatena.com/image/scale/cf5e3e5db4c3be8151be11645fc7d5d84269d2b7/enlarge=0;height=200;version=1;width=200/http%3A%2F%2Fis2.mzstatic.com%2Fimage%2Fpf%2Fus%2Fr30%2FMusic4%2Fv4%2F0f%2Fb1%2F8a%2F0fb18a0b-a7c8-b316-30f5-86035f644928%2FaRd74.100x100-75.jpg" alt="5 Centimeters Per Second - Distant Everyday Memories (秒速5センチメートル - 想い出は遠くの日々)" title="5 Centimeters Per Second - Distant Everyday Memories (秒速5センチメートル - 想い出は遠くの日々)" class="itunes-embed-image"/></a><div class="itunes-embed-info"><p class="itunes-embed-title"><a href="https://itunes.apple.com/jp/album/5-centimeters-per-second-distant/id876663347?i=876663360&uo=4&at=10lNLj" rel="nofollow" target="_blank">5 Centimeters Per Second - Distant Everyday Memories (秒速5センチメートル - 想い出は遠くの日々)</a></p><ul><li class="itunes-embed-artist">Michael Tai</li><li class="itunes-embed-genre">サウンドトラック</li><li class="itunes-embed-price">¥200</li><li class="itunes-embed-badge"><a href="https://itunes.apple.com/jp/album/5-centimeters-per-second-distant/id876663347?i=876663360&uo=4&at=10lNLj" rel="nofollow" target="_blank"><img src="/images/theme/itunes/itunes-badge-itunes@2x.png" width="44px" height="15px" /></a></li></ul><ul><li class="itunes-embed-preview"><audio src="http://a1264.phobos.apple.com/us/r30/Music/v4/c5/f6/9f/c5f69f02-d8ff-bd34-f70b-98e93cc4a8b1/mzaf_5836926770708680300.plus.aac.p.m4a" controls></audio></li><li><small class="provided-courtesy-of-itunes">provided courtesy of <a class="keyword" href="http://d.hatena.ne.jp/keyword/iTunes">iTunes</a></small></li></ul></div></div></p> <p>こういうのが好きです。<br/> おすすめがあったら教えてください。</p> yuhei_kagaya AWS CLI 入門 hatenablog://entry/8454420450098781954 2015-05-19T00:00:00+09:00 2015-06-24T18:13:36+09:00 管理画面コンソールでも操作できるけど、CLIを覚えた方が奥深くAWSの機能が学べて良いっぽい https://github.com/aws/aws-cli/ READMEやってみた インストール pip install awscli pip install --upgrade awscli コマンド補完を有効にする bashの場合 complete -C aws_completer aws zshの場合 source /usr/local/bin/aws_zsh_completer.sh .zshrcに書いとくとべんり [[ -s /usr/local/bin/aws_zsh_complete… <ul> <li>管理画面コンソールでも操作できるけど、<a class="keyword" href="http://d.hatena.ne.jp/keyword/CLI">CLI</a>を覚えた方が奥深く<a class="keyword" href="http://d.hatena.ne.jp/keyword/AWS">AWS</a>の機能が学べて良いっぽい</li> <li><a href="https://github.com/aws/aws-cli/">https://github.com/aws/aws-cli/</a></li> <li>READMEやってみた</li> </ul> <h1>インストール</h1> <pre class="code" data-lang="" data-unlink>pip install awscli pip install --upgrade awscli</pre> <h2>コマンド補完を有効にする</h2> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/bash">bash</a>の場合</p> <pre class="code" data-lang="" data-unlink>complete -C aws_completer aws</pre> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/zsh">zsh</a>の場合</p> <pre class="code lang-zsh" data-lang="zsh" data-unlink><span class="synStatement">source</span> /usr/<span class="synType">local</span>/bin/aws_zsh_completer.sh </pre> <p>.zshrcに書いとくとべんり</p> <pre class="code lang-zsh" data-lang="zsh" data-unlink>[[ -s /usr/<span class="synType">local</span>/bin/aws_zsh_completer.sh ]] &amp;&amp; <span class="synStatement">source</span> /usr/<span class="synType">local</span>/bin/aws_zsh_completer.sh </pre> <h2><a class="keyword" href="http://d.hatena.ne.jp/keyword/AWS">AWS</a> credentialsの設定</h2> <p>次のどれか</p> <h3>コマンドで</h3> <ul> <li><code>aws configure</code></li> <li>設定するとファイルが2つできる <ul> <li>~/.<a class="keyword" href="http://d.hatena.ne.jp/keyword/aws">aws</a>/config/config</li> <li>~/.<a class="keyword" href="http://d.hatena.ne.jp/keyword/aws">aws</a>/config/credentials</li> </ul> </li> </ul> <pre class="code" data-lang="" data-unlink>aws configure AWS Access Key ID [None]: hoge AWS Secret Access Key [None]: fuga Default region name [None]: ap-northeast-1 Default output format [None]: json</pre> <h3><a class="keyword" href="http://d.hatena.ne.jp/keyword/%B4%C4%B6%AD%CA%D1%BF%F4">環境変数</a>で</h3> <pre class="code" data-lang="" data-unlink>export AWS_ACCESS_KEY_ID=&lt;access_key&gt; export AWS_SECRET_ACCESS_KEY=&lt;secret_key&gt;</pre> <h3>設定ファイルで</h3> <ul> <li><code>~/.aws/config</code>に書く</li> <li>設定ファイルに各方法だと<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CA%A3%BF%F4">複数</a>のプロファイルを使い分けできて便利 <ul> <li><code>[profile hogehoge]</code></li> <li>使うときに <code>--profile=hogehoge</code> 指定</li> </ul> </li> </ul> <pre class="code" data-lang="" data-unlink>[default] aws_access_key_id=&lt;default access key&gt; aws_secret_access_key=&lt;default secret key&gt; # Optional, to define default region for this profile. region=us-west-1 [profile testing] aws_access_key_id=&lt;testing access key&gt; aws_secret_access_key=&lt;testing secret key&gt; region=us-west-2</pre> <pre class="code" data-lang="" data-unlink>$ export AWS_DEFAULT_PROFILE=testing</pre> <h1>基本</h1> <p>ユーザの一覧を取得してみる</p> <pre class="code" data-lang="" data-unlink>aws iam list-users</pre> <h2>ドキュメント</h2> <p><a href="http://docs.aws.amazon.com/cli/latest/index.html">http://docs.aws.amazon.com/cli/latest/index.html</a></p> <h2>引数のパラメータ指定のやり方いろいろ</h2> <ul> <li>文字列 <ul> <li><code>--ip-permissions '{"FromPort":22,"ToPort":22,"IpProtocol":"tcp","IpRanges":[{"CidrIp": "0.0.0.0/0"}]}'</code></li> </ul> </li> <li>ファイル <ul> <li><code>--ip-permissions file://ip_perms.json</code></li> </ul> </li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/URI">URI</a> <ul> <li><code>--ip-permissions http://mybucket.s3.amazonaws.com/ip_perms.json</code></li> </ul> </li> </ul> <h2>戻り値の<a class="keyword" href="http://d.hatena.ne.jp/keyword/JSON">JSON</a>から値を抽出</h2> <ul> <li><code>--query</code> オプションに<a href="http://jmespath.org/">JMESPath</a>のパス文字列を渡す</li> <li><a href="http://jmespath.org/tutorial.html">JMESPathチュートリアル</a></li> </ul> <pre class="code" data-lang="" data-unlink>aws iam list-users --query=&#34;Users[].UserName&#34;</pre> yuhei_kagaya AWSのRDS hatenablog://entry/8454420450098781867 2015-05-15T01:00:00+09:00 2015-06-24T18:13:30+09:00 バックアップ S3への自動バックアップ 5分以上前の任意時点のデータをリストア可能 Multi-AZ スタンバイ用のレプリカを別のアベイラビリティゾーンに配置し、マスタ障害時には自動的にスタンバイへフェイルオーバーする機能 ディスクレベルで同期 仕組みは、RDSのエンドポイントのCNAME参照先がスタンバイのインスタンスへ切り替えている MySQLで約3分程度 +- - - - - - - - + + - - - - - - + + - - - - - - + ' S3: ' ' AZ1: ' ' AZ2: ' ' ' ' ' ' ' ' +------------+ ' back up ' … <h1>バックアップ</h1> <ul> <li>S3への自動バックアップ</li> <li>5分以上前の任意時点のデータをリストア可能</li> </ul> <h1>Multi-AZ</h1> <ul> <li>スタンバイ用のレプリカを別の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%D9%A5%A4%A5%E9%A5%D3%A5%EA%A5%C6%A5%A3">アベイラビリティ</a>ゾーンに配置し、マスタ障害時には自動的にスタンバイへフェイルオーバーする機能</li> <li>ディスクレベルで同期</li> <li>仕組みは、RDSのエンドポイントのCNAME参照先がスタンバイの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>へ切り替えている</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/MySQL">MySQL</a>で約3分程度</li> </ul> <pre class="code" data-lang="" data-unlink>+- - - - - - - - + + - - - - - - + + - - - - - - + &#39; S3: &#39; &#39; AZ1: &#39; &#39; AZ2: &#39; &#39; &#39; &#39; &#39; &#39; &#39; &#39; +------------+ &#39; back up &#39; +---------+ &#39; sync &amp; failover &#39; +---------+ &#39; &#39; | snap shots | &#39; &lt;-------- &#39; | master |=&#39;=================&#39;=| standby | &#39; &#39; +------------+ &#39; &#39; +---------+ &#39; &#39; +---------+ &#39; &#39; &#39; &#39; | &#39; &#39; &#39; &#39; &#39; &#39; | &#39; &#39; +---------+ &#39; &#39; &#39; &#39; binary log -&#39;-----------------&#39;&gt;| replica | &#39; &#39; &#39; &#39; | &#39; &#39; +---------+ &#39; &#39; &#39; &#39; v &#39; &#39; +---------+ &#39; &#39; +------------+ &#39; &#39; +---------+ &#39; &#39; | replica | &#39; &#39; | binary logs| &#39; &#39; | replica | &#39; &#39; +---------+ &#39; &#39; +------------+ &#39; &#39; +---------+ &#39; &#39; &#39; &#39; &#39; &#39; +---------+ &#39; &#39; &#39; &#39; &#39; &#39; | replica | &#39; &#39; &#39; &#39; &#39; &#39; +---------+ &#39; &#39; &#39; +- - - - - - - - + +- - - - - - + +- - - - - - +</pre> <h1>リードレプリカ</h1> <ul> <li>読込処理のスケールができる</li> <li>非同期<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EC%A5%D7%A5%EA%A5%B1%A1%BC%A5%B7%A5%E7%A5%F3">レプリケーション</a></li> <li>リードレプリカのマスタ昇格もできる(Promote Read Replica) <ul> <li>マスタのエンドポイントは引き継がないのでアプリケーション側で修正する必要あり</li> </ul> </li> </ul> yuhei_kagaya 心を整える hatenablog://entry/8454420450098781766 2015-05-15T00:30:00+09:00 2015-06-24T18:13:18+09:00 スーパー銭湯がスーパー好きなのです。 最近の入り方を紹介します。 流す サウナ 洗う 寝湯orジャグジー サウナ 佇む 外湯 内湯 出る マッサージ 心がへこんだときや飲み過ぎた次の日によく来ています。 精神力は整心力。 銭湯に頼らない力を得たい。 平常心のコツ──「乱れた心」を整える93の言葉作者: 植西聰出版社/メーカー: 自由国民社発売日: 2013/12/04メディア: 単行本(ソフトカバー)この商品を含むブログを見る <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A1%BC%A5%D1%A1%BC%C1%AC%C5%F2">スーパー銭湯</a>がスーパー好きなのです。<br/> 最近の入り方を紹介します。</p> <ul> <li>流す</li> <li>サウナ</li> <li>洗う</li> <li>寝湯orジャグジー</li> <li>サウナ</li> <li>佇む</li> <li>外湯</li> <li>内湯</li> <li>出る</li> <li>マッサージ</li> </ul> <p>心がへこんだときや飲み過ぎた次の日によく来ています。</p> <p>精神力は整心力。<br/> 銭湯に頼らない力を得たい。</p> <p><div class="hatena-asin-detail"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4426117534/violetyk-22/"><img src="http://ecx.images-amazon.com/images/I/410aRv5iekL._SL160_.jpg" class="hatena-asin-detail-image" alt="平常心のコツ──「乱れた心」を整える93の言葉" title="平常心のコツ──「乱れた心」を整える93の言葉"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4426117534/violetyk-22/">平常心のコツ──「乱れた心」を整える93の言葉</a></p><ul><li><span class="hatena-asin-detail-label">作者:</span> 植西聰</li><li><span class="hatena-asin-detail-label">出版社/メーカー:</span> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%BC%AB%CD%B3%B9%F1%CC%B1%BC%D2">自由国民社</a></li><li><span class="hatena-asin-detail-label">発売日:</span> 2013/12/04</li><li><span class="hatena-asin-detail-label">メディア:</span> 単行本(ソフトカバー)</li><li><a href="http://d.hatena.ne.jp/asin/4426117534/violetyk-22" target="_blank">この商品を含むブログを見る</a></li></ul></div><div class="hatena-asin-detail-foot"></div></div></p> yuhei_kagaya EC2でDockerを動かす hatenablog://entry/8454420450098781680 2015-05-15T00:00:00+09:00 2015-07-27T15:32:20+09:00 これやってみた http://docs.aws.amazon.com/AmazonECS/latest/developerguide/docker-basics.html ここでの完成形 EC2 + Docker ローカルのMacでDockerイメージをビルド、DockerHubへプッシュ EC2上でDockerHubからDockerイメージをプル、Dockerコンテナ起動 +-----+ docker push +------------+ docker pull +--------------+ | Mac | -------------> | Docker Hub | ---------… <h1>これやってみた</h1> <p><a href="http://docs.aws.amazon.com/AmazonECS/latest/developerguide/docker-basics.html">http://docs.aws.amazon.com/AmazonECS/latest/developerguide/docker-basics.html</a></p> <h1>ここでの完成形</h1> <ul> <li>EC2 + Docker</li> <li>ローカルの<a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac">Mac</a>でDockerイメージをビルド、DockerHubへプッシュ</li> <li>EC2上でDockerHubからDockerイメージをプル、Dockerコンテナ起動</li> </ul> <pre class="code" data-lang="" data-unlink>+-----+ docker push +------------+ docker pull +--------------+ | Mac | -------------&gt; | Docker Hub | -------------&gt; | EC2 + Docker | +-----+ +------------+ +--------------+</pre> <h1>1. ローカルの<a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac">Mac</a>にて Docker環境を立ち上げる</h1> <ul> <li><p>Boot2Dockerの仕組み</p> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/OS%20X">OS X</a> 上に docker clientとboot2dockerを入れて、clientからboot2docker <a class="keyword" href="http://d.hatena.ne.jp/keyword/VM">VM</a>を操作 <ul> <li>Docker client</li> <li>Boot2Docker <a class="keyword" href="http://d.hatena.ne.jp/keyword/VM">VM</a> <ul> <li>Docker <a class="keyword" href="http://d.hatena.ne.jp/keyword/Daemon">Daemon</a> <ul> <li>コンテナ</li> <li>コンテナ</li> <li>コンテナ</li> </ul> </li> </ul> </li> </ul> </li> </ul> </li> <li><p>ローカルの<a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac">Mac</a>に<a href="https://github.com/boot2docker/osx-installer/releases/latest">Boot2Docker</a>をインストール</p></li> <li>boot2dockrを開始して、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B4%C4%B6%AD%CA%D1%BF%F4">環境変数</a>をセット</li> <li>これでdockerコマンドが動くようになる</li> </ul> <pre class="code lang-sh" data-lang="sh" data-unlink>which docker which boot2docker boot2docker init boot2docker <span class="synStatement">start</span> <span class="synStatement">eval</span> <span class="synStatement">&quot;</span><span class="synPreProc">$(</span><span class="synSpecial">boot2docker shellinit</span><span class="synPreProc">)</span><span class="synStatement">&quot;</span> boot2docker <span class="synStatement">status</span> </pre> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/VM">VM</a>にログインするには <code>boot2docker ssh</code></li> <li>停止するには<code>boot2docker stop</code></li> </ul> <h1>2. <a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac">Mac</a>にて コンテナをビルド&amp;起動、Docker<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EC%A5%B8%A5%B9%A5%C8%A5%EA">レジストリ</a>にpush</h1> <ul> <li>DockerHubのアカウントを取得しておく</li> <li>サンプルアプリケーションをclone</li> <li>Dockerfileを開いてビルドの内容を確認してみる</li> </ul> <pre class="code lang-sh" data-lang="sh" data-unlink>git clone https://github.com/awslabs/ecs-demo-php-simple-app <span class="synStatement">cd</span> ecs-demo-php-simple-app cat Dockerfile </pre> <ul> <li></li> <li><p>カレントディレクトリをビルド(名前には自分のDockerHubアカウントを入れる)</p></li> <li>できあがったimageの確認</li> <li>コンテナを起動</li> <li><code>-p</code>オプションでコンテナ内外のポートを接続する <ul> <li>左 = ホストマシンのポート</li> <li>右 = コンテナのポート</li> </ul> </li> </ul> <pre class="code lang-sh" data-lang="sh" data-unlink>docker build <span class="synSpecial">-t</span> my-repo/amazon-ecs-sample . docker images docker run <span class="synSpecial">-p</span> <span class="synConstant">80</span>:<span class="synConstant">80</span> my-repo/amazon-ecs-sample </pre> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/VM">VM</a>のIPを確認</li> <li><code>http://boot2docker ip の結果IPアドレス/</code></li> <li>DockerHubへpush</li> </ul> <pre class="code lang-sh" data-lang="sh" data-unlink>boot2docker ip docker login docker push my-repo/amazon-ecs-sample </pre> <h1>3. EC2にDockerを入れる</h1> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/AWS">AWS</a>マネジメントコンソール <ul> <li>EC2 <a class="keyword" href="http://d.hatena.ne.jp/keyword/Amazon">Amazon</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Linux">Linux</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>起動</li> <li>ec2-userで<a class="keyword" href="http://d.hatena.ne.jp/keyword/SSH">SSH</a>接続</li> <li>dockerをインストール</li> <li>ec2-userからdockerコマンドを叩くために、dockerグループにいれていったんログアウト</li> </ul> </li> </ul> <pre class="code lang-sh" data-lang="sh" data-unlink>sudo yum update <span class="synSpecial">-y</span> sudo yum <span class="synStatement">install</span> <span class="synSpecial">-y</span> docker sudo service docker <span class="synStatement">start</span> sudo usermod <span class="synSpecial">-a</span> <span class="synSpecial">-G</span> docker ec2-user id ec2-user <span class="synStatement">exit</span> </pre> <pre class="code lang-sh" data-lang="sh" data-unlink>docker info </pre> <h1>4. EC2にDockerイメージをダウンロード</h1> <pre class="code" data-lang="" data-unlink>docker login docker pull my-repo/amazon-ecs-sample docker images</pre> <h1>5. EC2でDockerコンテナを起動</h1> <pre class="code" data-lang="" data-unlink>docker run -p 80:80 my-repo/amazon-ecs-sample</pre> <ul> <li>停止するにはCtrl-c</li> </ul> yuhei_kagaya AWSの各サービスについて学ぶ hatenablog://entry/8454420450098781594 2015-05-14T00:30:00+09:00 2015-06-24T18:11:59+09:00 3つのレイヤに分かれる インフラストラクチャ アプリケーション デプロイ/アドミニストレーション サービスの種類 ネットワーク VPC / 仮想プライベートクラウド Direct Connect / AWS への専用線接続 Route 53 / DNS コンピューティング EC2 / クラウド内の仮想サーバー Lambda / イベント発生時にコードを実行 EC2 Container Service / Dockerコンテナの実行と管理 ストレージ&コンテンツ配信 S3 / スケーラブルなクラウドストレージ Glacier / クラウド内のアーカイブストレージ CloudFront / グロー… <ul> <li>3つのレイヤに分かれる <ul> <li>インフラストラクチャ</li> <li>アプリケーション</li> <li>デプロイ/アドミニストレーション</li> </ul> </li> </ul> <h1>サービスの種類</h1> <ul> <li><p>ネットワーク</p> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/VPC">VPC</a> / 仮想<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%E9%A5%A4%A5%D9%A1%BC%A5%C8%A5%AF%A5%E9%A5%A6%A5%C9">プライベートクラウド</a></li> <li>Direct Connect / <a class="keyword" href="http://d.hatena.ne.jp/keyword/AWS">AWS</a> への<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%EC%CD%D1%C0%FE">専用線</a>接続</li> <li>Route 53 / <a class="keyword" href="http://d.hatena.ne.jp/keyword/DNS">DNS</a></li> </ul> </li> <li><p>コンピューティング</p> <ul> <li>EC2 / <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%E9%A5%A6%A5%C9">クラウド</a>内の仮想サーバー</li> <li>Lambda / イベント発生時にコードを実行</li> <li>EC2 Container Service / Dockerコンテナの実行と管理</li> </ul> </li> <li><p>ストレージ&コンテンツ配信</p> <ul> <li>S3 / スケーラブルな<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%E9%A5%A6%A5%C9">クラウド</a>ストレージ</li> <li>Glacier / <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%E9%A5%A6%A5%C9">クラウド</a>内のアーカイブストレージ</li> <li>CloudFront / グローバルなコンテンツ配信ネットワーク</li> <li>Storage <a class="keyword" href="http://d.hatena.ne.jp/keyword/Gateway">Gateway</a> / オンプレミスのストレージをS3へ連携する機能</li> </ul> </li> <li><p>データベース</p> <ul> <li>RDS / リレーショナルデータベース</li> <li>DynamoDB / 予測可能でスケーラブルな NoSQL データストア</li> <li>ElastiCache / インメモリキャッシュ</li> <li>Redshift / データウェアハウスサービス</li> </ul> </li> <li><p>アプリケーションサービス</p> <ul> <li>SQS / メッセージキューサービス</li> <li>SWF / アプリケーション<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%DD%A1%BC%A5%CD%A5%F3%A5%C8">コンポーネント</a>を連携させるワークフローサービス</li> <li>AppStream / 低<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EC%A5%A4%A5%C6%A5%F3%A5%B7%A1%BC">レイテンシー</a>のアプリケーションストリーミング</li> <li>Elastic Transcoder / 使いやすいスケーラブルなメディア変換サービス</li> <li>SES / Eメール送信サービス</li> <li>CloudSearch / マネージド型検索サービス</li> </ul> </li> <li><p>モバイルサービス</p> <ul> <li>Cognito / ユーザー ID およびアプリケーションデータの同期</li> <li>Mobile Analytics / 大規模なアプリケーションの使用状況データの把握</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/SNS">SNS</a> / プッシュ通知サービス</li> </ul> </li> <li><p>デプロイ &amp; マネジメント</p> <ul> <li>Elastic Beanstalk / <a class="keyword" href="http://d.hatena.ne.jp/keyword/AWS">AWS</a> アプリケーションコンテナ</li> <li>OpsWorks / DevOps アプリケーション管理サービス</li> <li>CloudFormation / テンプレートによる <a class="keyword" href="http://d.hatena.ne.jp/keyword/AWS">AWS</a> リソース作成</li> <li>CodeDeploy / 自動デプロイ</li> </ul> </li> <li><p>管理およびセキュリティ</p> <ul> <li>Directory Service / <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%E9%A5%A6%A5%C9">クラウド</a>上の管理型ディレクトリ</li> <li>Identity &amp; <a class="keyword" href="http://d.hatena.ne.jp/keyword/Access">Access</a> Management / アクセスコントロールとキー管理</li> <li>Trusted Advisor / <a class="keyword" href="http://d.hatena.ne.jp/keyword/AWS">AWS</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%E9%A5%A6%A5%C9">クラウド</a>最適化エキスパート</li> <li>CloudTrail / ユーザーアクティビティと変更の追跡</li> <li>Config / リソース設定およびインベントリ</li> <li>CloudWatch / リソースとアプリケーションの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E2%A5%CB%A5%BF%A5%EA%A5%F3%A5%B0">モニタリング</a></li> </ul> </li> <li><p>分析</p> <ul> <li>Elastic <a class="keyword" href="http://d.hatena.ne.jp/keyword/MapReduce">MapReduce</a> / マネージド型 <a class="keyword" href="http://d.hatena.ne.jp/keyword/Hadoop">Hadoop</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%EC%A1%BC%A5%E0%A5%EF%A1%BC%A5%AF">フレームワーク</a></li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Kinesis">Kinesis</a> / <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D3%A5%C3%A5%B0%A5%C7%A1%BC%A5%BF">ビッグデータ</a>ストリームのリアルタイム処理</li> <li>Data Pipeline / データ駆動型ワークフローに対する<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AA%A1%BC%A5%B1%A5%B9%A5%C8%A5%EC%A1%BC%A5%B7%A5%E7%A5%F3">オーケストレーション</a>サービス</li> <li>Machine Learning / すばやく簡単にスマートアプリケーションを構築</li> </ul> </li> <li><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%F3%A5%BF%A1%BC%A5%D7%A5%E9%A5%A4%A5%BA">エンタープライズ</a>アプリケーション</p> <ul> <li>WorkSpaces / <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%E9%A5%A6%A5%C9">クラウド</a>内のデスクトップ</li> <li>WorkDocs / セキュアな<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%F3%A5%BF%A1%BC%A5%D7%A5%E9%A5%A4%A5%BA">エンタープライズ</a>向けストレージおよび共有サービス</li> <li>WorkMail / セキュリティ保護された E メールとカレンダーサービス</li> </ul> </li> </ul> <h1>EC2</h1> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>タイプによって CPU、メモリ、帯域などリソースが決まっている</li> <li>ディスク <ul> <li>揮発性(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%D5%A5%A7%A5%E1%A5%E9">エフェメラ</a>ルディスク) <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>を落とすとデータが消える</li> </ul> </li> <li>非揮発性(EBSディスク) <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>を落とすとデータが消えない</li> </ul> </li> </ul> </li> </ul> <h1>ストレージ</h1> <ul> <li>I/O <ul> <li>EBS > S3 > Gracier</li> </ul> </li> <li><p>アーカイブ</p> <ul> <li>EBS -> S3 -> Gracier</li> </ul> </li> <li><p>EBS(Elastic Block Store)</p> <ul> <li>仮想ディスク</li> <li>EC2にアタッチしてつかう</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/SSD">SSD</a>と、IOPS(Input Output Per Second)を指定することも可能</li> <li>S3へバックアップをとるスナップショット機能 <ul> <li>世代管理</li> </ul> </li> <li>Provisioned IOPS <ul> <li>IOPS(Input Output Per Second)を指定できる機能</li> <li>高いI/O要件でも安定</li> </ul> </li> </ul> </li> <li>S3 <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%E9%A5%A6%A5%C9">クラウド</a>上のオブジェクトストレージ</li> <li>概念 <ul> <li>バケット = 名前付きの箱</li> <li>オブジェクト = 箱の中のファイル</li> </ul> </li> <li>高い耐久性</li> <li>容量無制限</li> <li>従量課金</li> </ul> </li> <li>Glacier <ul> <li>長期間保存用ストレージ</li> <li>概念 <ul> <li>ボルト = 名前付きの箱</li> <li>アーカイブ = ファイルに相当するもの</li> </ul> </li> <li>ファイルをアーカイブすると、ファイル名の代わりにArchiveIDが発効される</li> </ul> </li> </ul> <h1>データベース</h1> <h2>RDS</h2> <ul> <li>エンジンは選択できる <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/MySQL">MySQL</a></li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Oracle">Oracle</a></li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/SQL%20Server">SQL Server</a></li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/PostgreSQL">PostgreSQL</a></li> </ul> </li> <li>自動バックアップ <ul> <li>31日分保存</li> <li>5分前以前の任意の状態に戻すことが可能</li> </ul> </li> <li>Muiti-Availability Zone構成を有効にするとでAZ間<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EC%A5%D7%A5%EA%A5%B1%A1%BC%A5%B7%A5%E7%A5%F3">レプリケーション</a>と自動フェールオーバーを実現</li> <li>読み取り専用のリードレプリカ <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/MySQL">MySQL</a>であればマスタ配下に5レプリカ、さらに各レプリカの下に5レプリカ配置可能(最大30のリードレプリカ)</li> </ul> </li> </ul> <h2>DynamoDB</h2> <ul> <li>key-valueストア</li> <li>無限スケール</li> <li>バックアップ不要</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%EB%A1%BC%A5%D7%A5%C3%A5%C8">スループット</a>の指定による高I/O要件への対応</li> </ul> <h2>ElastiCache</h2> <ul> <li>キャッシュ <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/memcached">memcached</a></li> <li>Redis</li> </ul> </li> </ul> <h2>Redshift</h2> <ul> <li>集計処理に最適化</li> <li>列指向データベースマネジメントシステム</li> </ul> <h1>デプロイ</h1> <p>各サービスとも、<a class="keyword" href="http://d.hatena.ne.jp/keyword/AWS">AWS</a>リソースをどのようにたちあげるかが違う</p> <h2>CloudFormation</h2> <ul> <li>テンプレートから一括でシステム構成を立ち上げる</li> <li>各リソースの依存関係を検出して自動で起動順番を調整してくれる</li> <li>テンプレートには<a class="keyword" href="http://d.hatena.ne.jp/keyword/AWS">AWS</a>サービスのリソース定義を<a class="keyword" href="http://d.hatena.ne.jp/keyword/JSON">JSON</a>で記述</li> </ul> <h2>OpsWorks</h2> <ul> <li>Chefのレシピを利用してEC2<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>などのリソースを立ち上げるサービス</li> <li>レイヤにChefのレシピを割り当てる</li> <li>概念 <ul> <li>スタック <ul> <li>レイヤ(例:ロードバランサ)</li> <li>レイヤ(例:<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%D7%A5%EA%A5%B1%A1%BC%A5%B7%A5%E7%A5%F3%A5%B5%A1%BC%A5%D0">アプリケーションサーバ</a>)</li> <li>レイヤ(例:DBサーバ)</li> </ul> </li> </ul> </li> <li>OpsWorksで立ち上げるEC2<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>にはChefSoloが入っている</li> </ul> <h2>Beanstalk</h2> <ul> <li>Herokuみたいにまるっと動作環境を構築・管理する</li> <li>ELBやAutoScalingなどを自動で設定してデプロイするだけ</li> <li>Webアプリケーションのバージョン管理に対応</li> </ul> yuhei_kagaya AWS入門 最初の最初 hatenablog://entry/8454420450098781517 2015-05-14T00:00:00+09:00 2015-06-24T18:11:25+09:00 サインアップ 必要な物 メールアドレス 請求先住所 クレジットカード 無料利用枠がついてくる https://aws.amazon.com/jp/free/ 注意点 ここでサインアップして作成したルートアカウントは使わないこと 権限の管理の基本 ユーザの作成 AWS操作用の自分のユーザを作る Identity and Access Management (IAM) IAMはリージョンをまたぐいでグローバル ユーザをつくる キーが発効されるのでメモorCSVダウンロードしておく(2度と出ないので) アクセスキーID シークレットアクセスキー パスワードの管理 ユーザを作っただけではなにもできない… <h1>サインアップ</h1> <ul> <li>必要な物 <ul> <li>メールアドレス</li> <li>請求先住所</li> <li>クレジットカード</li> </ul> </li> <li>無料利用枠がついてくる <ul> <li><a href="https://aws.amazon.com/jp/free/">https://aws.amazon.com/jp/free/</a></li> </ul> </li> <li>注意点 <ul> <li>ここでサインアップして作成したルートアカウントは使わないこと</li> </ul> </li> </ul> <h1>権限の管理の基本</h1> <h2>ユーザの作成</h2> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/AWS">AWS</a>操作用の自分のユーザを作る <ul> <li>Identity and <a class="keyword" href="http://d.hatena.ne.jp/keyword/Access">Access</a> Management (IAM) <ul> <li>IAMはリージョンをまたぐいでグローバル</li> </ul> </li> <li>ユーザをつくる <ul> <li>キーが発効されるのでメモorCSVダウンロードしておく(2度と出ないので) <ul> <li>アクセスキーID</li> <li>シークレットアクセスキー</li> </ul> </li> <li>パスワードの管理</li> <li>ユーザを作っただけではなにもできない、ここから必要な権限をつけていく</li> </ul> </li> </ul> </li> </ul> <h2>グループの作成</h2> <ul> <li>グループを作って、権限を割り当てる</li> <li>テンプレートから権限をつける</li> <li>グループにユーザを追加する</li> </ul> <h1>概念</h1> <p>大外から順に、こんな感じ。</p> <ul> <li>アカウント(最初にサインアップしたやつ) <ul> <li>リージョン <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/VPC">VPC</a></li> <li>インターネット<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B2%A1%BC%A5%C8%A5%A6%A5%A7%A5%A4">ゲートウェイ</a></li> <li>ルートテーブル <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%D9%A5%A4%A5%E9%A5%D3%A5%EA%A5%C6%A5%A3">アベイラビリティ</a>ゾーン <ul> <li>サブネット <ul> <li>EC2</li> <li>EC2</li> </ul> </li> <li>サブネット <ul> <li>EC2</li> <li>EC2</li> </ul> </li> </ul> </li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%D9%A5%A4%A5%E9%A5%D3%A5%EA%A5%C6%A5%A3">アベイラビリティ</a>ゾーン <ul> <li>サブネット <ul> <li>EC2</li> <li>EC2</li> </ul> </li> <li>サブネット <ul> <li>EC2</li> <li>EC2</li> </ul> </li> </ul> </li> </ul> </li> </ul> </li> </ul> </li> </ul> <p>以下、これを外から作成(選択)していく。</p> <h1>リージョンの選択</h1> <ul> <li>プロジェクトのメインユーザ物理的に近い位置を選ぶと良い</li> <li>今回はアジアパシフィック(東京, ap-northeast-1)を選択した</li> <li>マネジメントコンソール(管理画面)の右上から選択</li> </ul> <h1><a class="keyword" href="http://d.hatena.ne.jp/keyword/VPC">VPC</a></h1> <ul> <li>大体の場合、会社のプロジェクトごとに<a class="keyword" href="http://d.hatena.ne.jp/keyword/VPC">VPC</a>を作成する</li> <li>ネームタグとCIDRを指定して作成</li> <li>テナンシーで占有にするとその分コスト高</li> <li>例 172.13.0.0/16 <ul> <li>みんなだいたい65,000個のIPで落ち着く感じらしい</li> </ul> </li> </ul> <h1>サブネット</h1> <ul> <li>サービスの役割(Webサーバ用、DB用など)にサブネットを作る</li> <li>CIDRブロックを指定</li> <li>さっき作った<a class="keyword" href="http://d.hatena.ne.jp/keyword/VPC">VPC</a>を選択する</li> <li>例 <ul> <li>172.13.1.0/24 をWebサーバ用</li> <li>172.13.2.0/24 をDBサーバ用</li> <li>あとは、ロードバランサ(ELB)のサブネットなど</li> </ul> </li> </ul> <h1>インターネット<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B2%A1%BC%A5%C8%A5%A6%A5%A7%A5%A4">ゲートウェイ</a></h1> <ul> <li>インターネットへ接続する、ネットワークの出入り口</li> <li>作成したら、先に作った<a class="keyword" href="http://d.hatena.ne.jp/keyword/VPC">VPC</a>にアタッチ</li> </ul> <h1>ルートテーブル</h1> <ul> <li>サブネットを束ねるのにつかう</li> <li>ルートテーブルとインターネット<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B2%A1%BC%A5%C8%A5%A6%A5%A7%A5%A4">ゲートウェイ</a>を繋ぐ <ul> <li>ルートの編集 <ul> <li>各サブネットからルートテーブルの設定に従って<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B2%A1%BC%A5%C8%A5%A6%A5%A7%A5%A4">ゲートウェイ</a>に行くように設定する <ul> <li>0.0.0.0/0 (それ以外の送信先全部)をターゲット(さっきつくった<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B2%A1%BC%A5%C8%A5%A6%A5%A7%A5%A4">ゲートウェイ</a>)に設定</li> </ul> </li> </ul> </li> </ul> </li> <li>ルートテーブルとサブネットを繋ぐ <ul> <li>先に作ったサブネットはまだ作成されただけで、ルートテーブルの中にいない状態。ここでルートテーブルの中に持ってくるように関連づける</li> <li>サブネットの関連づけ <ul> <li>編集してチェックして保存</li> <li>データベースのサブネットはネットワーク外へ出る必要が無いので、関連づけない</li> </ul> </li> </ul> </li> </ul> <h1>EC2</h1> <ul> <li>キーペアを作成する <ul> <li>EC2への<a class="keyword" href="http://d.hatena.ne.jp/keyword/SSH">SSH</a>接続に使う</li> <li>インポート <ul> <li>キーペア名をつける</li> <li>公開鍵(事前に作っておく)を貼り付けて登録</li> </ul> </li> </ul> </li> <li>EC2<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>の作成</li> <li>AMIの選択</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>タイプの選択 <ul> <li>インスタイプごとに、メモリ、CPU、ストレージ、ネットワーク帯域などの性能が違う</li> </ul> </li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>の設定 <ul> <li>ネットワーク -> 最初に作った<a class="keyword" href="http://d.hatena.ne.jp/keyword/VPC">VPC</a></li> <li>サブネット -> Web用につくったサブネット</li> <li>自動割り当てパブリックIPを有効にする</li> <li>ストレージの追加</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>のタグ付け <ul> <li>名前</li> </ul> </li> <li>セキュリティグループの設定 <ul> <li>グループ名</li> <li>たとえば、<a class="keyword" href="http://d.hatena.ne.jp/keyword/SSH">SSH</a>は会社からのみ接続可能にしておくなど</li> <li>IPテーブルの設定 <ul> <li>送信元にマイIPを選択すると、今のパソコンのネットワークのIPが補完入力されて便利</li> </ul> </li> </ul> </li> <li>作成 <ul> <li>キーペアの指定</li> </ul> </li> </ul> </li> <li>EC2へのログイン <ul> <li>デフォルトでec2-userというユーザが作成されているので、それをつかう</li> <li><code>ssh ec2-user@割り当てられたパブリックIP</code></li> <li>ログインできたら無事成功</li> </ul> </li> </ul> <h1>いままでの設定の確認</h1> <ul> <li>EC2へログイン</li> <li>ネットワーク外へでていけること <code>curl yahoo.co.jp</code></li> <li>ルートテーブルからインターネットゲーとウェイを外す</li> <li>ネットワーク外へ出て行けないこと <code>curl yahoo.co.jp</code></li> </ul> <h1>補足</h1> <h2><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%D9%A5%A4%A5%E9%A5%D3%A5%EA%A5%C6%A5%A3">アベイラビリティ</a>ゾーン(AZ)</h2> <ul> <li>サービスごとのサブネットは<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%D9%A5%A4%A5%E9%A5%D3%A5%EA%A5%C6%A5%A3">アベイラビリティ</a>ゾーンごとにつくっておいたほうがよい <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%D9%A5%A4%A5%E9%A5%D3%A5%EA%A5%C6%A5%A3">アベイラビリティ</a>ゾーンA <ul> <li>Web用サブネット1</li> </ul> </li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%D9%A5%A4%A5%E9%A5%D3%A5%EA%A5%C6%A5%A3">アベイラビリティ</a>ゾーンB <ul> <li>Web用サブネット2</li> </ul> </li> </ul> </li> </ul> <h2>ルートテーブルの切り方例</h2> <ul> <li>public用 <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B2%A1%BC%A5%C8%A5%A6%A5%A7%A5%A4">ゲートウェイ</a>と結びつける</li> </ul> </li> <li><p>private用</p> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B2%A1%BC%A5%C8%A5%A6%A5%A7%A5%A4">ゲートウェイ</a>と結びつけない</li> </ul> </li> <li><p>あとはサービスの役割(Web、DBなど)ごとにルートテーブルを切るやり方とか</p></li> </ul> <h2>セキュリティグループ</h2> <ul> <li>名前付き<a class="keyword" href="http://d.hatena.ne.jp/keyword/iptables">iptables</a>みたいなものかも</li> <li>コレを使いこなすのが<a class="keyword" href="http://d.hatena.ne.jp/keyword/AWS">AWS</a>のメリット</li> <li>例えば、 <ul> <li>Web用、DB用のセキュリティグループを作っておいて、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%D0%A5%A6%A5%F3%A5%C9">インバウンド</a>ルールを設定する <ul> <li>DB 22番は必要ないので閉じる</li> <li>Web 80番は空ける</li> <li>DBへはWebのグループからしかアクセスできないようにする</li> </ul> </li> <li>このように<a class="keyword" href="http://d.hatena.ne.jp/keyword/IP%A5%A2%A5%C9%A5%EC%A5%B9">IPアドレス</a>単位ではなく、グループ単位でアクセス管理ができるのが便利</li> </ul> </li> </ul> yuhei_kagaya 美味しいお煎餅屋さん hatenablog://entry/8454420450098781272 2015-05-13T00:00:00+09:00 2015-06-24T18:10:49+09:00 美味しいお煎餅やさん紹介。 茨城・老舗の煎餅(せんべい)おかきの専門店 都炉美煎本舗 通販サイト 三州製菓・三州総本舗ホームページsanshu.com 越後の菓子処 瑞花 オンラインショップwww.zuika.jp 玉井屋 (下北沢/和菓子)tabelog.com 東京のあられ・おせんべい | 萬寿金製菓www.arareosenbei.com 個人的に、おかきや揚げ餅、醤油味が好きです。 <p>美味しいお煎餅やさん紹介。</p> <p><a href="http://www.torobisen.jp">&#x8328;&#x57CE;&#x30FB;&#x8001;&#x8217;&#x306E;&#x714E;&#x9905;&#xFF08;&#x305B;&#x3093;&#x3079;&#x3044;&#xFF09;&#x304A;&#x304B;&#x304D;&#x306E;&#x5C02;&#x9580;&#x5E97; &#x90FD;&#x7089;&#x7F8E;&#x714E;&#x672C;&#x8217; &#x901A;&#x8CA9;&#x30B5;&#x30A4;&#x30C8;</a></p> <p><iframe src="//hatenablog-parts.com/embed?url=http%3A%2F%2Fsanshu.com%2F" title="三州製菓・三州総本舗ホームページ" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"><a href="http://sanshu.com/">三州製菓・三州総本舗ホームページ</a></iframe><cite class="hatena-citation"><a href="http://sanshu.com/">sanshu.com</a></cite></p> <p><iframe src="//hatenablog-parts.com/embed?url=http%3A%2F%2Fwww.zuika.jp%2F" title="越後の菓子処 瑞花 オンラインショップ" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"><a href="http://www.zuika.jp/">越後の菓子処 瑞花 オンラインショップ</a></iframe><cite class="hatena-citation"><a href="http://www.zuika.jp/">www.zuika.jp</a></cite></p> <p><iframe src="//hatenablog-parts.com/embed?url=http%3A%2F%2Ftabelog.com%2Ftokyo%2FA1318%2FA131802%2F13091620%2F" title="玉井屋 (下北沢/和菓子)" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"><a href="http://tabelog.com/tokyo/A1318/A131802/13091620/">玉井屋 (下北沢/和菓子)</a></iframe><cite class="hatena-citation"><a href="http://tabelog.com/tokyo/A1318/A131802/13091620/">tabelog.com</a></cite></p> <p><iframe src="//hatenablog-parts.com/embed?url=http%3A%2F%2Fwww.arareosenbei.com%2Fshops%2F_masukinseika%2F" title="東京のあられ・おせんべい | 萬寿金製菓" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"><a href="http://www.arareosenbei.com/shops/_masukinseika/">東京のあられ・おせんべい | 萬寿金製菓</a></iframe><cite class="hatena-citation"><a href="http://www.arareosenbei.com/shops/_masukinseika/">www.arareosenbei.com</a></cite></p> <p>個人的に、おかきや揚げ餅、醤油味が好きです。</p> yuhei_kagaya Golangで画像プロキシサーバをつくった hatenablog://entry/8454420450085788502 2015-02-27T13:41:06+09:00 2015-02-27T14:00:02+09:00 Graidという画像プロキシサーバをつくりました。 外のサーバから画像を取得してリサイズしたりして返す、ということをするサーバです。 Golangでなんかミドルウェア的なものが作ってみたかったのでやってみました。 Graidについてのスライド エンジニアが集まってお昼ご飯を食べながら技術的なネタを話すテックランチという会が社内で定期的に開催されているので、Graidについて話してきました。 Graid // Speaker Deck 機能 http://localhost:8080/path/to/image.jpg:w400:h300:q80 例えば8080ポートで起動させてURLにアクセス… <p><a href="https://github.com/violetyk/graid">Graid</a>という画像プロキシサーバをつくりました。<br/> 外のサーバから画像を取得してリサイズしたりして返す、ということをするサーバです。</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Golang">Golang</a>でなんか<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DF%A5%C9%A5%EB%A5%A6%A5%A7%A5%A2">ミドルウェア</a>的なものが作ってみたかったのでやってみました。</p> <h2>Graidについてのスライド</h2> <p>エンジニアが集まってお昼ご飯を食べながら技術的なネタを話すテックランチという会が社内で定期的に開催されているので、Graidについて話してきました。</p> <p><iframe allowfullscreen="true" allowtransparency="true" frameborder="0" height="596" id="talk_frame_289820" mozallowfullscreen="true" src="//speakerdeck.com/player/3da57330894e490fa3af79cebd1798b7" style="border:0; padding:0; margin:0; background:transparent;" webkitallowfullscreen="true" width="710"></iframe></p> <p><a href="https://speakerdeck.com/violetyk/graid">Graid // Speaker Deck</a></p> <h1>機能</h1> <pre class="code" data-lang="" data-unlink>http://localhost:8080/path/to/image.jpg:w400:h300:q80</pre> <p>例えば8080ポートで起動させてURLにアクセスすると、</p> <ul> <li>オリジンの画像サーバ(設定ファイルに設定する)の/path/to/image.jpgを取ってきて</li> <li>横400px、縦300pxにリサイズして画質80%に加工して</li> <li>レスポンスを返す</li> </ul> <p>という処理をします。<code>:w400:h300:q80</code>の部分が画像加工のクエリ、その中の<code>:w</code>とか<code>:h</code>が処理内容を決定するオペレータです。つなげて<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CA%A3%BF%F4">複数</a>することができます。</p> <h2>オペレータ</h2> <p>リサイズの他に、今のところ以下のオペレータがあります。</p> <table> <thead> <tr> <th style="text-align:center;">オペレータ</th> <th style="text-align:left;">説明</th> <th style="text-align:left;">例</th> </tr> </thead> <tbody> <tr> <td style="text-align:center;">:w</td> <td style="text-align:left;">画像の横幅を指定してリサイズ。(:hを指定しない場合は横幅に合わせてリサイズ)</td> <td style="text-align:left;">:w400</td> </tr> <tr> <td style="text-align:center;">:h</td> <td style="text-align:left;">画像の縦幅を指定してリサイズ。(:wを指定しない場合は縦幅に合わせてリサイズ)</td> <td style="text-align:left;">:h300</td> </tr> <tr> <td style="text-align:center;">:q</td> <td style="text-align:left;"><a class="keyword" href="http://d.hatena.ne.jp/keyword/jpeg">jpeg</a>の品質(1〜100)</td> <td style="text-align:left;">:q80</td> </tr> <tr> <td style="text-align:center;">:c</td> <td style="text-align:left;">クロップ。2点の座標をカンマ区切りで指定する。</td> <td style="text-align:left;">:c40,10,220,240</td> </tr> <tr> <td style="text-align:center;">:grayscale</td> <td style="text-align:left;">白黒フィルター。</td> <td style="text-align:left;">:grayscale1</td> </tr> <tr> <td style="text-align:center;">:sepia</td> <td style="text-align:left;">セピアフィルター。(1〜100)</td> <td style="text-align:left;">:sepia100</td> </tr> <tr> <td style="text-align:center;">:contrast</td> <td style="text-align:left;"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%C8%A5%E9">コントラ</a>ストの調整。</td> <td style="text-align:left;">:contrast50</td> </tr> <tr> <td style="text-align:center;">:brightness</td> <td style="text-align:left;">明るさの調整。</td> <td style="text-align:left;">:brightness-50</td> </tr> <tr> <td style="text-align:center;">:saturation</td> <td style="text-align:left;">彩度の調整。</td> <td style="text-align:left;">:saturation80</td> </tr> <tr> <td style="text-align:center;">:colorize</td> <td style="text-align:left;">カラーフィルター。</td> <td style="text-align:left;">:colorize240,50,100</td> </tr> <tr> <td style="text-align:center;">:colorbalance</td> <td style="text-align:left;">カラーバランスフィルター。</td> <td style="text-align:left;">:colorbalance20,-20,0</td> </tr> </tbody> </table> <h2>画像処理</h2> <p>いまのところ<a class="keyword" href="http://d.hatena.ne.jp/keyword/jpeg">jpeg</a>だけ対応しています。</p> <p>画像処理部分は<a href="https://github.com/disintegration/gift">gift</a>に渡す仕組みになっています。簡単に加工ができて便利です。 最初はリサイズとクロップができればいいなぐらいに考えていたのですが、<a href="https://github.com/disintegration/gift">gift</a>がとても便利なので他のオペレータもつくってみました。</p> <p>フィルターを組み合わせてインスタグラムみたいなオペレータがつくれそうですね。</p> <p><a href="https://github.com/gographics/imagick">ImageMagickのラッパーであるgographics/imagick</a>を使うか<a class="keyword" href="http://d.hatena.ne.jp/keyword/ImageMagick">ImageMagick</a>のconvertをキックするか、迷ってライブラリを探していたのですが、 <a href="https://github.com/fawick/speedtest-resize">fawick/speedtest-resize</a>をみてgiftを知りました。各ライブラリで計測した画像リサイズ速度が載っています。</p> <h2>キャッシュ</h2> <p>外部から取得して加工した画像はクエリごとにキャッシュして、次のアクセスから速くレスポンスを返します。キャッシュの保存先はファイルかRedisです。設定ファイルで指定することができます。</p> <p>また、クエリのURLに<code>?nocache=1</code>をつけるとキャッシュを無視してもう一度リモートから画像を取得します。</p> <h2>設定ファイル</h2> <p><a href="https://github.com/violetyk/graid/blob/master/graid.toml">graid/graid.toml at master &middot; violetyk/graid &middot; GitHub</a>が設定ファイルです。起動するポート、ワー<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AB%A1%BC%A5%D7">カープ</a>ールサイズ、キャッシュ、オリジンサーバの指定などを設定します。</p> <p><a href="https://github.com/toml-lang/toml">TOML</a>で記述します。TOMLは<a href="https://github.com/spf13/hugo">Golang製静的サイトジェネレータのHugo</a>で使われています。階層構造や配列がかけるiniファイルのようなフォーマットで、よさげです。各種言語で実装されたパーサやエディタの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B7%A5%F3%A5%BF%A5%C3%A5%AF%A5%B9">シンタックス</a>ハイライトもそろっています。</p> <h2>今後</h2> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/daemon">daemon</a>といいつつまだデーモンとして実装できていないのでなのとかしたいです。 <iframe src="//hatenablog-parts.com/embed?url=http%3A%2F%2Fqiita.com%2Fk0kubun%2Fitems%2Fd6d332697ef7a369e6e2" title="Goでデーモンを実装する - Qiita" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"><a href="http://qiita.com/k0kubun/items/d6d332697ef7a369e6e2">Goでデーモンを実装する - Qiita</a></iframe></p> <p>あとは、</p> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/jpeg">jpeg</a>以外の画像フォーマットへ対応</li> <li>オペレータの指定をコロンではなくてGETパラメータにするモードの作成</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BF%A5%A4%A5%E0%A5%A2%A5%A6%A5%C8">タイムアウト</a>の指定ができるように</li> <li>HTTPクライアントの同一ホストへの最大コネクション数の指定</li> <li>各処理の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%F3%A5%C1%A5%DE%A1%BC%A5%AF">ベンチマーク</a>する仕組み</li> </ul> <p>を実装しようかと思っています。</p> yuhei_kagaya Hugoを使ってみた hatenablog://entry/8454420450084666306 2015-02-22T01:31:07+09:00 2015-02-22T01:31:07+09:00 Hugo :: A fast and modern static website engine brew install hugo hugo new site /path/to/site cd /path/to/site hugo new post/start.md git clone --recursive https://github.com/spf13/hugoThemes themes hugo server --buildDrafts --theme=nofancy テーマはシンプルなnofancyがよかった。 http://localhost:1313/ http://localh… <p><a href="http://gohugo.io">Hugo :: A fast and modern static website engine</a></p> <pre class="code lang-sh" data-lang="sh" data-unlink>brew <span class="synStatement">install</span> hugo hugo new site /path/to/site <span class="synStatement">cd</span> /path/to/site hugo new post/start.md git clone <span class="synSpecial">--recursive</span> https://github.com/spf13/hugoThemes themes hugo server <span class="synSpecial">--buildDrafts</span> <span class="synSpecial">--theme=nofancy</span> </pre> <p>テーマはシンプルなnofancyがよかった。</p> <ul> <li><a href="http://localhost:1313/">http://localhost:1313/</a></li> <li><a href="http://localhost:1313/post/start/">http://localhost:1313/post/start/</a></li> </ul> <h2>hugo new &amp; edit with <a class="keyword" href="http://d.hatena.ne.jp/keyword/vim">vim</a></h2> <pre class="code lang-sh" data-lang="sh" data-unlink>hugo new post/edit-with-vim.md <span class="synSpecial">--editor=vim</span> </pre> <h2>watch mode</h2> <pre class="code lang-sh" data-lang="sh" data-unlink>hugo server <span class="synSpecial">--watch</span> </pre> <h2>Syntax highlighting</h2> <ul> <li>themeのheaderをカスタマイズして、<a href="https://highlightjs.org/">highlight.js</a>を入れる</li> <li>テーマのファイルをコピーして/layoutsへ入れればこちらが優先される仕組みっぽい</li> </ul> <pre class="code lang-sh" data-lang="sh" data-unlink>cp themes/nofancy/layouts/partials/header.html layouts/partials/ </pre> <ul> <li><code>&lt;/head&gt;</code>の前あたりに入れる</li> <li>カラー<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AD%A1%BC%A5%DE">スキーマ</a>のライブプレビュー</li> <li><a href="https://highlightjs.org/static/demo/">https://highlightjs.org/static/demo/</a></li> </ul> <pre class="code lang-html" data-lang="html" data-unlink><span class="synIdentifier">&lt;</span><span class="synStatement">link</span><span class="synIdentifier"> </span><span class="synType">rel</span><span class="synIdentifier">=</span><span class="synConstant">&quot;stylesheet&quot;</span><span class="synIdentifier"> </span><span class="synType">href</span><span class="synIdentifier">=</span><span class="synConstant">&quot;https://yandex.st/highlightjs/8.0/styles/default.min.css&quot;</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;</span><span class="synStatement">script</span><span class="synIdentifier"> </span><span class="synType">src</span><span class="synIdentifier">=</span><span class="synConstant">&quot;https://yandex.st/highlightjs/8.0/highlight.min.js&quot;</span><span class="synIdentifier">&gt;&lt;/</span><span class="synStatement">script</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;</span><span class="synStatement">script</span><span class="synIdentifier">&gt;</span> <span class="synSpecial">hljs.configure</span>(<span class="synIdentifier">{</span><span class="synSpecial"> tabReplace: </span><span class="synConstant">&quot; &quot;</span><span class="synSpecial"> </span><span class="synIdentifier">}</span>)<span class="synSpecial">;</span> <span class="synSpecial">hljs.initHighlightingOnLoad</span>()<span class="synSpecial">;</span> <span class="synIdentifier">&lt;/</span><span class="synStatement">script</span><span class="synIdentifier">&gt;</span> </pre> <ul> <li>VimscriptとGoのハイライトが標準のhighlight.jsに入ってないぽいのでカスタマイズしてダウンロード</li> <li><a href="https://highlightjs.org/download/">https://highlightjs.org/download/</a></li> </ul> <pre class="code lang-sh" data-lang="sh" data-unlink><span class="synStatement">mkdir</span> static/<span class="synSpecial">{</span>css,js<span class="synSpecial">}</span> cp ~/Downloads/highlight/highlight.pack.js ./static/js/ cp ~/Downloads/highlight/styles/hybrid.css ./static/css/ </pre> <pre class="code lang-html" data-lang="html" data-unlink><span class="synIdentifier">&lt;</span><span class="synStatement">script</span><span class="synIdentifier"> </span><span class="synType">src</span><span class="synIdentifier">=</span><span class="synConstant">&quot;{{ .Site.BaseUrl }}/js/highlight.pack.js&quot;</span><span class="synIdentifier">&gt;&lt;/</span><span class="synStatement">script</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;</span><span class="synStatement">link</span><span class="synIdentifier"> </span><span class="synType">rel</span><span class="synIdentifier">=</span><span class="synConstant">&quot;stylesheet&quot;</span><span class="synIdentifier"> </span><span class="synType">href</span><span class="synIdentifier">=</span><span class="synConstant">&quot;{{ .Site.BaseUrl }}/css/hybrid.css&quot;</span><span class="synIdentifier">&gt;</span> <span class="synIdentifier">&lt;</span><span class="synStatement">script</span><span class="synIdentifier">&gt;</span> <span class="synSpecial">hljs.configure</span>(<span class="synIdentifier">{</span><span class="synSpecial"> tabReplace: </span><span class="synConstant">&quot; &quot;</span><span class="synSpecial"> </span><span class="synIdentifier">}</span>)<span class="synSpecial">;</span> <span class="synSpecial">hljs.initHighlightingOnLoad</span>()<span class="synSpecial">;</span> <span class="synIdentifier">&lt;/</span><span class="synStatement">script</span><span class="synIdentifier">&gt;</span> </pre> <h2>Hosting on <a class="keyword" href="http://d.hatena.ne.jp/keyword/Github">Github</a> pages</h2> <ul> <li><a href="http://gohugo.io/tutorials/github-pages-blog/">http://gohugo.io/tutorials/github-pages-blog/</a></li> <li>username.<a class="keyword" href="http://d.hatena.ne.jp/keyword/github">github</a>.io-hugo<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EA%A5%DD%A5%B8%A5%C8%A5%EA">リポジトリ</a>に本体を入れて、publicをusername.<a class="keyword" href="http://d.hatena.ne.jp/keyword/github">github</a>.ioのサブモジュールにするようにしてる方法など。</li> </ul> <p>gitのorphanブランチを知った。 元のブランチから歴史を引き継がずに新しく歴史を始めることができる。</p> <p><iframe src="//hatenablog-parts.com/embed?url=http%3A%2F%2Fd.hatena.ne.jp%2Feldesh%2F20120715%2F1342343316" title=" gitのorphanブランチを理解する - ::Eldesh a b = LEFT a | RIGHT b" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"><a href="http://d.hatena.ne.jp/eldesh/20120715/1342343316"> gitのorphanブランチを理解する - ::Eldesh a b = LEFT a | RIGHT b</a></iframe></p> <pre class="code lang-sh" data-lang="sh" data-unlink>git checkout <span class="synSpecial">--orphan</span> <span class="synStatement">&lt;</span>new_branch<span class="synStatement">&gt;</span> git <span class="synStatement">rm</span> <span class="synSpecial">-rf</span> . git add 新しいファイル git commit </pre> yuhei_kagaya