<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>oinume journal</title>
		<link>https://journal.lampetty.net/</link>
		<description>Recent content on oinume journal</description>
		<generator>Hugo</generator>
		<language>ja</language>
		
		
		
		
			<lastBuildDate>Sat, 18 Jul 2026 21:32:39 +0900</lastBuildDate>
		
			<atom:link href="https://journal.lampetty.net/rss.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>macOSで日本語／英語入力の切り替えを改善</title>
				<link>https://journal.lampetty.net/posts/toggle-japanese-input/</link>
				<pubDate>Sat, 18 Jul 2026 21:32:39 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/toggle-japanese-input/</guid>
				<description>&lt;p&gt;自分はmacOS + USキーボードを使っているため、今までは日本語／英語の入力切り替えは標準の&lt;code&gt;Ctrl + Space&lt;/code&gt;キーでトグルで切り替えるようにしていた。このトグル方式での切り替えの問題点として、「必ず英語入力にしたい」みたいなケースに対応できていなかった。&lt;/p&gt;&#xA;&lt;p&gt;AIに相談したところ、以下のようにキーを割り当てれば問題を解決できる、と言われたので試しにやってみた。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;左Commandキー: 英語&lt;/li&gt;&#xA;&lt;li&gt;右Commandキー: 日本語&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;上記のキーの設定自体はKarabiner-Elementsで設定している。設定ファイルの該当部分だけ抜き出すと以下のような感じ。&lt;/p&gt;&#xA;&lt;details&gt;&#xA;&lt;summary&gt;karabiner-elementsの設定&lt;/summary&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;json&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;#34;profiles&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Default profile&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;err&#34;&gt;...&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;nt&#34;&gt;&amp;#34;complex_modifications&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;nt&#34;&gt;&amp;#34;rules&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                    &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                        &lt;span class=&#34;nt&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Left Command -&amp;gt; Eisuu / Right Command -&amp;gt; Kana (when pressed alone)&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                        &lt;span class=&#34;nt&#34;&gt;&amp;#34;manipulators&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                            &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                &lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;basic&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                &lt;span class=&#34;nt&#34;&gt;&amp;#34;from&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                    &lt;span class=&#34;nt&#34;&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;left_command&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                    &lt;span class=&#34;nt&#34;&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;&amp;#34;optional&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;any&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                &lt;span class=&#34;nt&#34;&gt;&amp;#34;to&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[{&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;left_command&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;&amp;#34;lazy&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}],&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                &lt;span class=&#34;nt&#34;&gt;&amp;#34;to_if_alone&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[{&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;japanese_eisuu&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                            &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                            &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                &lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;basic&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                &lt;span class=&#34;nt&#34;&gt;&amp;#34;from&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                    &lt;span class=&#34;nt&#34;&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;right_command&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                    &lt;span class=&#34;nt&#34;&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;&amp;#34;optional&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;any&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                &lt;span class=&#34;nt&#34;&gt;&amp;#34;to&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[{&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;right_command&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;&amp;#34;lazy&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}],&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                &lt;span class=&#34;nt&#34;&gt;&amp;#34;to_if_alone&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[{&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;&amp;#34;key_code&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;japanese_kana&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                            &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                        &lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;nt&#34;&gt;&amp;#34;virtual_hid_keyboard&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;&amp;#34;keyboard_type_v2&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;ansi&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;&#xA;&lt;p&gt;1ヶ月これで運用してみて、結果としてはなかなか良い。特にtmuxを使っている場合に&lt;code&gt;prefix + 数字&lt;/code&gt;でタブを頻繁に切り替えるのだけど、IMEが日本語入力モードになっているとタブが移動できない問題があったが、今はタブ切り替えの前に必ず左Commandをタイプすれば良くなった。&lt;/p&gt;&#xA;&lt;p&gt;また、MacBookから別のMac Miniに画面共有アプリで接続している際に、Ctrl + Spaceのトグルが接続元のMacBookの方に効いてしまって、接続先で日本語・英語が切り替えられないという問題を抱えていた。しかし、この問題も上の設定をしたおかげで接続先で日本語・英語が切り替えられるようになるという副次的な改善効果もあった。&lt;/p&gt;&#xA;&lt;p&gt;というわけでちょっとした困りごともAIに聞いてみると良いもんだなぁと思ったエピソードでした。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>はてなブログから移行</title>
				<link>https://journal.lampetty.net/posts/migrate-to-hugo-from-hatena-blog/</link>
				<pubDate>Sat, 06 Jun 2026 19:05:41 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/migrate-to-hugo-from-hatena-blog/</guid>
				<description>&lt;p&gt;このブログをはてなブログからHugo + Firebase Hostingに移行した。はてなブログは2014年から12年間もの間使っていたのでなんとも感慨深い。はてなブログProを年間契約していて、毎年サブスクの更新前になると「そろそろブログ移行しないとな〜」と思ってずっとやれていなかった。しかし、今年はコーディングエージェントの力を借りて課金前に滑り込みで移行することができた。本当にコーディングエージェントはすごい＆ありがたいことこの上ない。&lt;/p&gt;&#xA;&lt;h2 id=&#34;なんで移行したの&#34;&gt;なんで移行したの？&lt;/h2&gt;&#xA;&lt;p&gt;独自ドメインで運用したかったためはてなブログは有料のProプランに入っていたのだけど、年間8400円かかっている割にはブログは月に1本記事を書くかどうかの頻度で、「コスパが悪かった」というのが大きな理由。はてなブログの機能自体は便利だったので、そこには全く不満はなかった。むしろHugoだと機能が少なくて不満に思うことがよくある。&lt;/p&gt;&#xA;&lt;h2 id=&#34;なんでhugo&#34;&gt;なんでHugo?&lt;/h2&gt;&#xA;&lt;p&gt;AstroかHugoかで悩み、Astroはテーマごとに記事の属性(Frontmatterでつけるやつ)が異なるという思想が気に入らなかったのでHugoにした。ただ、色々とテーマを変えている最中に、AstroほどひどくはないけどHugoも似たような思想だと気づいたが😇、もう諦めている。&lt;/p&gt;&#xA;&lt;p&gt;Hugoのテーマは&lt;a href=&#34;https://themes.gohugo.io/themes/hugo-primer-blog/&#34;&gt;primer-blog&lt;/a&gt;にした。検索機能がないのがネックだったけど、AIに作ってもらえばいいかと思いそこは妥協した。&lt;/p&gt;&#xA;&lt;p&gt;なおHugoのブログ記事のコンテンツはもちろんGitHubリポジトリにプッシュしている。&lt;/p&gt;&#xA;&lt;h2 id=&#34;なんでfirebase-hosting&#34;&gt;なんでFirebase Hosting?&lt;/h2&gt;&#xA;&lt;p&gt;Firebaseでは設定ファイルでリダイレクトの設定が簡単にでき、そのついでにホスティング環境としても使わせてもらったというだけ。候補としてはCloudflare Pagesも魅力的だったが、わざわざ別のホスティング環境の設定をするのが面倒だったというだけで、それ以上の理由はない。&lt;/p&gt;&#xA;&lt;h2 id=&#34;記事の移行&#34;&gt;記事の移行&lt;/h2&gt;&#xA;&lt;p&gt;MT形式のはてなブログの記事をHugoのMarkdown形式に変換するスクリプトはClaude Codeに生成してもらった。はてなブログからはエクスポートの機能を使ってMT形式でファイルとしてエクスポートし、それをこのスクリプトに食わせる。&lt;/p&gt;&#xA;&lt;p&gt;落とし穴だったのは、Proプランに加入していてもエクスポートした記事にはてなキーワードへのリンクがあって、これを変換時に削除する必要があったこと。ってかなんでProなのにはてなキーワードへのリンクが入ってくるねん、、、&lt;/p&gt;&#xA;&lt;h2 id=&#34;移行手順&#34;&gt;移行手順&lt;/h2&gt;&#xA;&lt;p&gt;まずはてなブログにある記事をエクスポートし、Hugo側のフォーマット(Markdown)に変換して、Firebase Hostingに生成したHTMLをデプロイしておく。&lt;/p&gt;&#xA;&lt;p&gt;次にFirease Hostingの機能を使って、以下のようなリダイレクトの設定を行い、はてなブログの記事URLでアクセスされた場合はリダイレクトするように設定する。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;json&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;hosting&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;#34;public&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;hugo/public&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;#34;ignore&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;s2&#34;&gt;&amp;#34;firebase.json&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;s2&#34;&gt;&amp;#34;**/.*&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;s2&#34;&gt;&amp;#34;**/node_modules/**&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;],&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;#34;redirects&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;&amp;#34;source&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;/entry/:slug*&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;&amp;#34;destination&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;/posts/:slug*&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;301&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;&amp;#34;source&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;/archive/category/:name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;&amp;#34;destination&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;/categories/:name/&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;301&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;&amp;#34;source&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;/archive/:year/:month&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;&amp;#34;destination&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;/archives/:year/:month/&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;301&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;&amp;#34;source&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;/archive/:year&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;&amp;#34;destination&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;/archives/:year/&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;301&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;最後にFirebase Hostingで &lt;code&gt;journal.lampetty.net&lt;/code&gt; のカスタムドメインの設定を行う。DNSに以下のレコードの定義で、CNAMEの向き先を以下のように変更する&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;CNAME journal.lampetty.net hatenablog.com.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  ↓&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;CNAME journal.lampetty.net blog-lampetty-net.web.app.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;しばらく待っているとFirebase側で journal.lampetty.net に対するTLS証明書を取得してくれるので、これのセットアップが終わるまで待つ。自分の場合は10分ぐらいで終わっていた。&lt;/p&gt;&#xA;&lt;p&gt;あとはリダイレクトがちゃんとされるかなどの確認をして終わりだった。&lt;/p&gt;&#xA;&lt;h2 id=&#34;hugoで足りない機能&#34;&gt;Hugoで足りない機能&lt;/h2&gt;&#xA;&lt;p&gt;以下ははてなブログにはあった機能だが、Hugo単体では存在しないものだったので、自作した。長くなるので今回は割愛するけど、別記事で詳しく説明したい。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;デフォルトのOGP画像生成&lt;/li&gt;&#xA;&lt;li&gt;年・月ごとのアーカイブページ&lt;/li&gt;&#xA;&lt;li&gt;予約投稿&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;最後に&#34;&gt;最後に&lt;/h2&gt;&#xA;&lt;p&gt;Hugoには機能が色々足りなくてこれからも自作していく必要があるけど、コーディングエージェントのおかげで足りないものが一瞬で出来上がるので、そのうちはてなブログより便利になりそうな予感がしている。テーマについても自作したいな。&lt;/p&gt;&#xA;&lt;p&gt;まだGitHub上やエディタでブログ記事を書くということに慣れていないけど、慣れた環境で記事を書けるのは便利かもしれない。あとリポジトリで管理しておけば生成AIの力を借りて記事を書きやすくなるかも？という気もしている。&lt;/p&gt;&#xA;&lt;h2 id=&#34;appendix&#34;&gt;Appendix&lt;/h2&gt;&#xA;&lt;h3 id=&#34;はてなブログの記事をhugoのmarkdown形式に変換するスクリプト&#34;&gt;はてなブログの記事をHugoのMarkdown形式に変換するスクリプト&lt;/h3&gt;&#xA;&lt;p&gt;convert.ts&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;typescript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;fs&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;node:fs&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;path&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;node:path&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;TurndownService&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;turndown&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// --- CLI args ---&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;args&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;process&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;argv&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;slice&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;length&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;===&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;||&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;===&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;--help&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;error&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;Usage: tsx convert.ts &amp;lt;input-file&amp;gt; --out &amp;lt;output-dir&amp;gt; [--format astro|hugo] [--limit N]&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;process&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;exit&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;inputFile&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;];&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;outDir&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;out&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;outIdx&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;indexOf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;--out&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;outIdx&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!==&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;outIdx&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;outDir&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;outIdx&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;];&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;format&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;astro&amp;#39;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;hugo&amp;#39;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;astro&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;fmtIdx&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;indexOf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;--format&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fmtIdx&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!==&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fmtIdx&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;val&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fmtIdx&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;];&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;val&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;===&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;hugo&amp;#39;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;||&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;val&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;===&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;astro&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;format&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;val&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;limit&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;Infinity&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;limitIdx&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;indexOf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;--limit&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;limitIdx&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!==&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;limitIdx&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;limit&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;parseInt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;limitIdx&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// --- Turndown setup ---&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;td&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;TurndownService&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;({&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;headingStyle&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;atx&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;codeBlockStyle&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;fenced&amp;#39;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;});&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// Strip Hatena keyword links: &amp;lt;a class=&amp;#34;keyword&amp;#34; href=&amp;#34;...&amp;#34;&amp;gt;text&amp;lt;/a&amp;gt; -&amp;gt; text&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;td&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;addRule&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;hatena-keyword&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;filter&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;node&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;node&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;nodeName&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;===&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;A&amp;#39;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;typeof&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;node&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;as&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Element&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;getAttribute&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;===&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;function&amp;#39;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;node&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;as&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Element&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;getAttribute&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;class&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;===&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;keyword&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;replacement&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;content&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;content&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;});&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// Convert &amp;lt;pre class=&amp;#34;code LANG&amp;#34; ...&amp;gt; to fenced code blocks&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;td&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;addRule&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;hatena-pre&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;filter&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;node&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;node&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;nodeName&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;===&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;PRE&amp;#39;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;typeof&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;node&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;as&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Element&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;getAttribute&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;===&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;function&amp;#39;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;node&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;as&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Element&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;getAttribute&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;class&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;??&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;startsWith&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;code&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;replacement&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;_content&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;node&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;el&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;node&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;as&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Element&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;cls&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;el&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;getAttribute&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;class&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;??&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;langMatch&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;cls&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;match&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sr&#34;&gt;/\bcode\s+(\S+)/&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;lang&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;langMatch&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;?&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;langMatch&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;code&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;node&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;as&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;HTMLElement&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;textContent&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;??&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;\&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;n\`\`\`&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;lang&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;\&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;code&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;\&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;n\`\`\`&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;\&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;n`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;});&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// --- MT format parser ---&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;interface&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Entry&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;title&lt;/span&gt;: &lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;basename&lt;/span&gt;: &lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;status&lt;/span&gt;: &lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;date&lt;/span&gt;: &lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;categories&lt;/span&gt;: &lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[];&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;body&lt;/span&gt;: &lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;parseDate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;raw&lt;/span&gt;: &lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;// MM/DD/YYYY HH:MM:SS -&amp;gt; YYYY-MM-DD&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;m&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;raw&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;match&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sr&#34;&gt;/^(\d{2})\/(\d{2})\/(\d{4})/&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;m&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;raw&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;m&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;m&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;m&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;parseDateRFC3339&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;raw&lt;/span&gt;: &lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;// MM/DD/YYYY HH:MM:SS -&amp;gt; YYYY-MM-DDTHH:MM:SS+09:00&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;m&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;raw&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;match&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sr&#34;&gt;/^(\d{2})\/(\d{2})\/(\d{4})\s+(\d{2}):(\d{2}):(\d{2})/&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;m&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;parseDate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;raw&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;m&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;m&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;m&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;T&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;m&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;m&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;m&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;6&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;+09:00`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;extractDescription&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;markdown&lt;/span&gt;: &lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;maxLen&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;150&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;// Strip markdown syntax, take first non-empty paragraph&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;text&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;markdown&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;replace&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sr&#34;&gt;/```[\s\S]*?```/g&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;replace&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sr&#34;&gt;/[#*`\[\]]/g&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;replace&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sr&#34;&gt;/\n+/g&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;trim&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;text&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;slice&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;maxLen&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;replace&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sr&#34;&gt;/\s+$/&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;parseEntries&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;content&lt;/span&gt;: &lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Entry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;rawEntries&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;content&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;split&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sr&#34;&gt;/^--------$/m&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;map&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;trim&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()).&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;filter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;Boolean&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;entries&lt;/span&gt;: &lt;span class=&#34;kt&#34;&gt;Entry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[];&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;raw&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;of&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;rawEntries&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;// Split into header section and body sections by &amp;#34;-----&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;sections&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;raw&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;split&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sr&#34;&gt;/^-----$/m&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;header&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;sections&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;];&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;fields&lt;/span&gt;: &lt;span class=&#34;kt&#34;&gt;Record&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{};&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;categories&lt;/span&gt;: &lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[];&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;line&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;of&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;header&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;split&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;\n&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;match&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;line&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;match&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sr&#34;&gt;/^([A-Z ]+):\s*(.*)/&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;match&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;key&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;match&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;].&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;trim&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;key&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;===&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;CATEGORY&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          &lt;span class=&#34;nx&#34;&gt;categories&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;push&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;match&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;].&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;trim&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;());&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          &lt;span class=&#34;nx&#34;&gt;fields&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;match&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;].&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;trim&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;// Find BODY section&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;body&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;sections&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;length&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;sec&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;sections&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;].&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;trim&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;bodyMatch&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;sec&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;match&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sr&#34;&gt;/^BODY:\n([\s\S]*)/&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;bodyMatch&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nx&#34;&gt;body&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;bodyMatch&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;].&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;trim&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;entries&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;push&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;({&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nx&#34;&gt;title&lt;/span&gt;: &lt;span class=&#34;kt&#34;&gt;fields&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;TITLE&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;??&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nx&#34;&gt;basename&lt;/span&gt;: &lt;span class=&#34;kt&#34;&gt;fields&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;BASENAME&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;??&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nx&#34;&gt;status&lt;/span&gt;: &lt;span class=&#34;kt&#34;&gt;fields&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;STATUS&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;??&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nx&#34;&gt;date&lt;/span&gt;: &lt;span class=&#34;kt&#34;&gt;fields&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;DATE&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;??&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nx&#34;&gt;categories&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nx&#34;&gt;body&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;});&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;entries&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;toFrontmatter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;entry&lt;/span&gt;: &lt;span class=&#34;kt&#34;&gt;Entry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;description&lt;/span&gt;: &lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;astro&amp;#39;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;hugo&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;title&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;entry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;replace&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sr&#34;&gt;/&amp;#39;/g&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#39;&amp;#39;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;desc&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;description&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;replace&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sr&#34;&gt;/&amp;#39;/g&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#39;&amp;#39;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;date&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;parseDate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;entry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;date&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fmt&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;===&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;hugo&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;dateRFC3339&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;parseDateRFC3339&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;entry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;date&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;lines&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;s1&#34;&gt;&amp;#39;---&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;sb&#34;&gt;`title: &amp;#39;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;&amp;#39;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;sb&#34;&gt;`date: &amp;#39;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;dateRFC3339&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;&amp;#39;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;sb&#34;&gt;`description: &amp;#39;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;desc&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;&amp;#39;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;sb&#34;&gt;`draft: false`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;];&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;entry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;categories&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;length&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;cats&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;entry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;categories&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;map&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;sb&#34;&gt;`&amp;#39;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;replace&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sr&#34;&gt;/&amp;#39;/g&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#39;&amp;#39;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;&amp;#39;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;join&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;, &amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nx&#34;&gt;lines&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;push&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`categories: [&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;cats&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;]`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nx&#34;&gt;lines&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;push&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`tags: [&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;cats&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;]`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;lines&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;push&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;---&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;lines&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;join&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;\n&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;// astro (default)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;lines&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s1&#34;&gt;&amp;#39;---&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;sb&#34;&gt;`title: &amp;#39;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;&amp;#39;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;sb&#34;&gt;`description: &amp;#39;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;desc&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;&amp;#39;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;sb&#34;&gt;`pubDate: &amp;#39;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;date&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;&amp;#39;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;];&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;entry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;categories&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;length&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;cat&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;entry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;categories&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;].&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;replace&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sr&#34;&gt;/&amp;#39;/g&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#39;&amp;#39;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;lines&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;push&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`category: &amp;#39;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;cat&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;&amp;#39;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;lines&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;push&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;---&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;lines&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;join&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;\n&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// --- Main ---&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;content&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;fs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;readFileSync&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;inputFile&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;utf-8&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;entries&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;parseEntries&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;content&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;published&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;entries&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;filter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;status&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;===&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;Publish&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;fs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;mkdirSync&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;outDir&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;recursive&lt;/span&gt;: &lt;span class=&#34;kt&#34;&gt;true&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;});&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;count&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;entry&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;of&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;published&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;count&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;limit&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;entry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;basename&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;continue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;markdown&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;td&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;turndown&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;entry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;body&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;description&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;extractDescription&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;markdown&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;frontmatter&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;toFrontmatter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;entry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;description&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;format&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;output&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;frontmatter&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;\&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;\&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;markdown&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;\&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;n`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;outPath&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;join&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;outDir&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;entry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;basename&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;.md`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;fs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;mkdirSync&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;dirname&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;outPath&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;recursive&lt;/span&gt;: &lt;span class=&#34;kt&#34;&gt;true&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;});&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;fs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;writeFileSync&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;outPath&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;output&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;utf-8&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;count&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`Converted &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;count&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt; posts to &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;outDir&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;/`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
			</item>
			<item>
				<title>iOSのショートカットで朝ごはんの内容を音声でメモアプリに記録する</title>
				<link>https://journal.lampetty.net/posts/add-text-to-apple-notes-with-voice-input/</link>
				<pubDate>Thu, 30 Apr 2026 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/add-text-to-apple-notes-with-voice-input/</guid>
				<description>&lt;p&gt;毎朝息子に朝ごはんを作っているのだけど、レパートリーが少ないため3日間同じメニューになってしまったりするので、最近はメモアプリに何を食べたか記録してなるべく違うものになるように工夫していた。でで、スマホからメモアプリを起動して入力するのが面倒だったので、ショートカットアプリで音声入力でメモアプリに残すように半自動化してみたという話。&lt;/p&gt;&#xA;&lt;p&gt;具体的には「ぼうやの朝ごはん」というノートに以下のようにテキストが追記されていくイメージ。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;04/27月: 夜ご飯のおかずの残り&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;04/28火: 食パンと目玉焼き&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;04/29水: ツナサンド&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;...&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;完成したショートカットのイメージ&#34;&gt;完成したショートカットのイメージ&lt;/h2&gt;&#xA;&lt;h2 id=&#34;ショートカットの設定手順&#34;&gt;ショートカットの設定手順&lt;/h2&gt;&#xA;&lt;p&gt;iOSのショートカットアプリはできることが豊富であるがゆえに、必要な処理を探すのがわかりづらいと感じたので具体的な手順を書いておく。ちなみにiOS 26での手順なのでバージョンが違うと若干異なるかもしれない。&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;ショートカットアプリを起動&lt;/li&gt;&#xA;&lt;li&gt;右上の&lt;code&gt;+&lt;/code&gt;ボタンで新規ショートカットを作成&lt;/li&gt;&#xA;&lt;li&gt;スクリプティングを選択して、「テキストを音声入力」を選択&lt;/li&gt;&#xA;&lt;li&gt;アクションを検索 -&amp;gt; スクリプティング -&amp;gt; 日付をフォーマットを選択。日付のフォーマットは &lt;code&gt;05/01水&lt;/code&gt; のようにしたいので、&lt;code&gt;MM/ddEEE&lt;/code&gt;を設定&#xA;&lt;ul&gt;&#xA;&lt;li&gt;日付のフォーマット文字列については&lt;a href=&#34;https://unicode.org/reports/tr35/tr35-dates.html#Date_Format_Patterns&#34;&gt;ここ&lt;/a&gt;を参照&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;そのままだと「音声入力されたテキスト」を書式設定することになってしまっているので、「音声入力されたテキスト」をタップして「変数を消去」し、「現在の日付」をかわりに設定する&lt;/li&gt;&#xA;&lt;li&gt;アクションを検索 -&amp;gt; スクリプティング -&amp;gt; 「テキスト」を選択&lt;/li&gt;&#xA;&lt;li&gt;「変数を選択」の部分から上2つの入力を組み合わせて「 &lt;code&gt;フォーマット済みの日付&lt;/code&gt;: &lt;code&gt;音声入力されたテキスト&lt;/code&gt;」を入力するように設定する&lt;/li&gt;&#xA;&lt;li&gt;アクションを検索 -&amp;gt; 「メモ」アプリを選択 -&amp;gt; 「メモに追加」を選択&lt;/li&gt;&#xA;&lt;li&gt;追記したい先のメモを選択(自分のケースでは「ぼうやの朝ごはん」)&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;ショートカットの起動&#34;&gt;ショートカットの起動&lt;/h2&gt;&#xA;&lt;p&gt;毎回ショートカットアプリを開いて作成したショートカットを起動するの面倒なので、自分はウィジェットで起動できるようにしている。あとはSiriを起動して「ぼうやの朝ごはん」と言うとショートカットを起動してくれる。&lt;/p&gt;&#xA;&lt;p&gt;Siri経由は、最初のうちはなぜかカレンダーから「ぼうやの朝ごはん」を探そうとして「そんなものはありません」と言われていたのだけど、ウィジェットに登録した後からちゃんと認識してくれるようになった 🤔&lt;/p&gt;&#xA;&lt;h2 id=&#34;実際使ってみて&#34;&gt;実際使ってみて&lt;/h2&gt;&#xA;&lt;p&gt;音声認識の精度が心配だったのだけど、朝ごはんの内容ぐらいであれば音声が誤認識されることはなく特に問題なく運用できている。より難しいテキストを入力する場合はOpenAIなどのAPIと&lt;a href=&#34;https://scriptable.app/&#34;&gt;Scriptable&lt;/a&gt;を使えば良いと思われる。&lt;/p&gt;&#xA;&lt;p&gt;初めてiOSショートカットで複雑なフローを組んでみたけど、これ単体でかなり高度なことができそうなので他にも音声入力系で自動化を頑張ってみたい&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Bashの起動を高速化した</title>
				<link>https://journal.lampetty.net/posts/optimizing-bash-startup/</link>
				<pubDate>Mon, 16 Mar 2026 08:30:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/optimizing-bash-startup/</guid>
				<description>&lt;p&gt;最近Bashを起動する速度がどんどん遅くなっているなと感じたので、Claude Codeに高速化を依頼した。&lt;/p&gt;&#xA;&lt;h2 id=&#34;パフォーマンスの可視化&#34;&gt;パフォーマンスの可視化&lt;/h2&gt;&#xA;&lt;p&gt;まず手始めに、Bash起動時に何に時間がかかっているのかをわかるようにしてもらった(&lt;a href=&#34;https://github.com/oinume/dotfiles/pull/13&#34;&gt;PR&lt;/a&gt;)。&lt;/p&gt;&#xA;&lt;p&gt;以下のように&lt;code&gt;BASH_PROFILE_PROFILING=1 bash -l&lt;/code&gt;で起動することで、以下のようにどこに時間がかかっているかが計測可能になる。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;BASH_PROFILE_PROFILING&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; bash -l&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;profile&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;      &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; ms &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;+   &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; ms&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; prompt/history&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;profile&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;     &lt;span class=&#34;m&#34;&gt;48&lt;/span&gt; ms &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;+  &lt;span class=&#34;m&#34;&gt;47&lt;/span&gt; ms&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; brew --prefix&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;profile&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;     &lt;span class=&#34;m&#34;&gt;49&lt;/span&gt; ms &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;+   &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; ms&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; .bash_local&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;profile&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;    &lt;span class=&#34;m&#34;&gt;118&lt;/span&gt; ms &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;+  &lt;span class=&#34;m&#34;&gt;69&lt;/span&gt; ms&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; bash-completion&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;profile&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;   &lt;span class=&#34;m&#34;&gt;1361&lt;/span&gt; ms &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;+1243 ms&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; bash-it&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;profile&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;   &lt;span class=&#34;m&#34;&gt;1401&lt;/span&gt; ms &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;+  &lt;span class=&#34;m&#34;&gt;40&lt;/span&gt; ms&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; fzf&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;profile&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;   &lt;span class=&#34;m&#34;&gt;1402&lt;/span&gt; ms &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;+   &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; ms&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; bash-powerline&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;profile&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;   &lt;span class=&#34;m&#34;&gt;1403&lt;/span&gt; ms &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;+   &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; ms&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; tmuxinator&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;profile&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;   &lt;span class=&#34;m&#34;&gt;1404&lt;/span&gt; ms &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;+   &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; ms&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; completion &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;git&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;profile&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;   &lt;span class=&#34;m&#34;&gt;1410&lt;/span&gt; ms &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;+   &lt;span class=&#34;m&#34;&gt;6&lt;/span&gt; ms&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; google-cloud-sdk&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;profile&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;   &lt;span class=&#34;m&#34;&gt;1505&lt;/span&gt; ms &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;+  &lt;span class=&#34;m&#34;&gt;95&lt;/span&gt; ms&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; rbenv&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;profile&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;   &lt;span class=&#34;m&#34;&gt;1516&lt;/span&gt; ms &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;+  &lt;span class=&#34;m&#34;&gt;11&lt;/span&gt; ms&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; JDK &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;java_home&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;profile&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;   &lt;span class=&#34;m&#34;&gt;1917&lt;/span&gt; ms &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;+ &lt;span class=&#34;m&#34;&gt;401&lt;/span&gt; ms&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; nvm&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;profile&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;   &lt;span class=&#34;m&#34;&gt;1947&lt;/span&gt; ms &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;+  &lt;span class=&#34;m&#34;&gt;30&lt;/span&gt; ms&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; mise&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;profile&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;   &lt;span class=&#34;m&#34;&gt;1970&lt;/span&gt; ms &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;+  &lt;span class=&#34;m&#34;&gt;23&lt;/span&gt; ms&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; wtp&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;profile&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;   &lt;span class=&#34;m&#34;&gt;1980&lt;/span&gt; ms &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;+  &lt;span class=&#34;m&#34;&gt;10&lt;/span&gt; ms&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; direnv&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;profile&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;   &lt;span class=&#34;m&#34;&gt;1981&lt;/span&gt; ms &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;+   &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; ms&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; nvm bash_completion&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;profile&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;   &lt;span class=&#34;m&#34;&gt;1982&lt;/span&gt; ms &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;+   &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; ms&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=====&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;TOTAL&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=====&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;高速化&#34;&gt;高速化&lt;/h2&gt;&#xA;&lt;p&gt;とりあえず &lt;a href=&#34;https://github.com/Bash-it/bash-it&#34;&gt;bash-it&lt;/a&gt; が遅すぎるのでこれを読み込まないようにした。これだけど 1243ms 速くなり、体感的にもかなり快適になった。&lt;/p&gt;&#xA;&lt;p&gt;次に遅いのがnvm関連。ちょうどmiseに移行しようと思っていたので、移行を済ませてnvmを読み込まないようにした。これで400ms速くなった。&lt;/p&gt;&#xA;&lt;p&gt;同様にrbenvもmiseに移行して消せるので削除。&lt;/p&gt;&#xA;&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;&#xA;&lt;p&gt;そんなこんなで色々削って起動時間が 1982ms -&amp;gt; 273ms になり爆速になりましたとさ&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>mineoに乗り換えて1年経った</title>
				<link>https://journal.lampetty.net/posts/mineo-1-year/</link>
				<pubDate>Sun, 01 Mar 2026 10:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/mineo-1-year/</guid>
				<description>&lt;p&gt;スマホのSIMをMVNOのmineoに切り替えて1年以上が経って、かなり満足しているのでここにその良さを書いておく。mineoの前は、新規契約はストップしている&lt;a href=&#34;https://service.ocn.ne.jp/mobile/&#34;&gt;OCNモバイルONE&lt;/a&gt;を使っていた。&lt;/p&gt;&#xA;&lt;h2 id=&#34;mineoに切り替えた理由&#34;&gt;mineoに切り替えた理由&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;新規契約をストップしていることから、OCNモバイルONEには将来性がなさそう&lt;/li&gt;&#xA;&lt;li&gt;mineoは以前も契約していたことがあり、速度制限がある状態でも1.5Mbps(当時は1Mbpsだったかも?)の速度が出ることは知っていた&lt;/li&gt;&#xA;&lt;li&gt;価格的には日本通信も候補に上がったけど、DoCoMoではなくauの回線を使いたかったのでmineoに決めた&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;自分のユースケース&#34;&gt;自分のユースケース&lt;/h2&gt;&#xA;&lt;p&gt;週3,4は通勤しているので主にその隙間時間で以下をやっている。mineoに切り替えてからは月に30GBぐらいのギガを使っている。&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;ストリーミングで音楽を聴く&lt;/li&gt;&#xA;&lt;li&gt;YouTubeを見る&lt;/li&gt;&#xA;&lt;li&gt;移動中にテザリングでPC作業をする&lt;/li&gt;&#xA;&lt;li&gt;Podcastを聴く&lt;/li&gt;&#xA;&lt;li&gt;SNSを見る&lt;/li&gt;&#xA;&lt;li&gt;Kindleなどで本を読む&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;mineoにしてどうだったか&#34;&gt;mineoにしてどうだったか&lt;/h2&gt;&#xA;&lt;p&gt;OCNモバイルONEは10GB / 月の容量しかなかったので通勤中にYouTubeを観ることは不可能だったけど、mineoにしてからは移動中に動画を見れるようになったので生活が大きく変わった。Netflixも見たいものがあれば事前にダウンロードする必要があったけど、これもストリーミングで再生できるようになったので便利になった。&lt;/p&gt;&#xA;&lt;p&gt;また、速度制限がある状態でもテザリングでなんとか作業できるため、移動中にやれることの幅が広がったように思う。&lt;/p&gt;&#xA;&lt;p&gt;さらに、2026年3月から速度制限状態でも最大で1.5 -&amp;gt; 3Mbps出るようになり&lt;a href=&#34;#fn:1&#34;&gt;1&lt;/a&gt;、より快適になった。自分は 15GB / 月のプランを契約しているけど、速度制限がある状態でもほとんど用が済んでしまうため、ギガが毎月半分以上使い切れていないという状態になっている。&lt;/p&gt;&#xA;&lt;h2 id=&#34;というわけで&#34;&gt;というわけで&lt;/h2&gt;&#xA;&lt;p&gt;よほど改悪されない限りは、ずっとmineoでいこうと思うほどに快適です。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://support.mineo.jp/news/1810/&#34;&gt;ちょうどいい使い放題オプション「パケット放題 3Mbps」の正式リリースについて｜mineoユーザーサポート&lt;/a&gt;&lt;a href=&#34;#fnref:1&#34;&gt;↩&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;</description>
			</item>
			<item>
				<title>Claude Codeの設定の差分を吸収するsettings.jsonの管理方法</title>
				<link>https://journal.lampetty.net/posts/managing-claude-code-settings/</link>
				<pubDate>Sun, 15 Feb 2026 00:05:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/managing-claude-code-settings/</guid>
				<description>&lt;h2 id=&#34;背景&#34;&gt;背景&lt;/h2&gt;&#xA;&lt;p&gt;会社のPCと個人PCでClaude Codeを使っているのだけど、&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;会社PCではAPI Keyによる従量課金方式&lt;/li&gt;&#xA;&lt;li&gt;個人PCはサブスクのProプラン&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;となっている。permissionsの設定などで秘伝のタレ化している ~/.claude/settings.json は共通化して管理したいが、会社PCの ~/.claude/settings.json にはAPIキーやその他会社環境固有の環境変数を定義する必要があるため、会社PCと個人PCで発生する差分をどうにかしたい。&lt;/p&gt;&#xA;&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;macOSの場合は、PC固有の設定を &lt;code&gt;/Library/Application\ Support/ClaudeCode/managed-settings.json&lt;/code&gt; に保存する&lt;/li&gt;&#xA;&lt;li&gt;共通の設定は &lt;a href=&#34;https://github.com/oinume/dotfiles&#34;&gt;dotfiles&lt;/a&gt; リポジトリ内で settings.json を管理&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;このやり方でうまいこと差分を吸収できたよ、というただそれだけの記事。&lt;/p&gt;&#xA;&lt;p&gt;参考リンク: &lt;a href=&#34;https://code.claude.com/docs/en/settings#available-scopes&#34;&gt;Claude Code settings - Claude Code Docs&lt;/a&gt;&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Apple Developer Programに加入せずにReact Native(expo)でiOSアプリを実機にインストール</title>
				<link>https://journal.lampetty.net/posts/deploy-ios-app-without-adp/</link>
				<pubDate>Sat, 14 Feb 2026 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/deploy-ios-app-without-adp/</guid>
				<description>&lt;p&gt;「こんなアプリがほしい」と思ってExpoで作ってみたものを実機にインストールして使ってみたかった。調べたらApple Developer Programのお布施を払わなくてもインストールする方法があったのでメモ。&lt;/p&gt;&#xA;&lt;h3 id=&#34;必要なもの&#34;&gt;必要なもの&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Xcode&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://developer.apple.com/xcode/resources/&#34;&gt;https://developer.apple.com/xcode/resources/&lt;/a&gt; からダウンロードしておく&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;cocoapods (Homebrewとかでインストールしておく)&lt;/li&gt;&#xA;&lt;li&gt;iPhoneをmacに接続しておく&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;手順&#34;&gt;手順&lt;/h3&gt;&#xA;&lt;p&gt;expoは&lt;a href=&#34;https://docs.expo.dev/workflow/continuous-native-generation/&#34;&gt;expo prebuild&lt;/a&gt;コマンドでネイティブのコードを生成できるので、これを使ってXcodeでアプリを実機にインストールする。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npx expo prebuild&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;次に&lt;a href=&#34;https://github.com/expo/expo/discussions/27489#discussioncomment-8707035&#34;&gt;この投稿&lt;/a&gt;に書いてある設定をする&lt;/p&gt;&#xA;&lt;p&gt;なお、上の投稿では6.で以下のように書かれているが、&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Build&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;bundle&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;with&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;npx&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;expo&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;export&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;embed&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;entry&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;node_modules/expo/AppEntry.js&amp;#39;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bundle&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;output&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;./ios/main.jsbundle&amp;#39;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dev&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;bp&#34;&gt;false&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;platform&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;ios&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;自分の場合は以下のように&lt;code&gt;--entry-file&lt;/code&gt;を修正する必要があった。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;npx&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;expo&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;export&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;embed&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;entry&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;node_modules/expo-router/entry.js&amp;#39;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bundle&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;output&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;./ios/main.jsbundle&amp;#39;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dev&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;bp&#34;&gt;false&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;platform&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;ios&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;あと依存ライブラリがインストールされずにビルドに失敗していたので、以下を実行する必要があるかもしれない&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cd ios&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pod install&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
			</item>
			<item>
				<title>2026年1月時点での作業環境</title>
				<link>https://journal.lampetty.net/posts/work-environment-202601/</link>
				<pubDate>Mon, 26 Jan 2026 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/work-environment-202601/</guid>
				<description>&lt;h2 id=&#34;マシンos&#34;&gt;マシン＆OS&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;メインPCはmacOS&lt;/li&gt;&#xA;&lt;li&gt;VPSではUbuntu&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;アプリ&#34;&gt;アプリ&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Browser: ChromeたまにSafari&lt;/li&gt;&#xA;&lt;li&gt;IDE: IntelliJ IDEA&lt;/li&gt;&#xA;&lt;li&gt;Editor: VScode。コードを書くときはIntelliJで、ちょっとしたテキストの編集をする際はVScode&lt;/li&gt;&#xA;&lt;li&gt;Terminal: iTerm + tmux + fzf&#xA;&lt;ul&gt;&#xA;&lt;li&gt;tmuxがちゃんと動くならGhosttyに乗り換えたいかも&lt;/li&gt;&#xA;&lt;li&gt;fzf, tmuxは10年以上使ってる気がする&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Shell: Bash&#xA;&lt;ul&gt;&#xA;&lt;li&gt;昔はZsh使っていたがカスタマイズが面倒になってBashにした&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Coding Agent: Claude Code, たまにCodex。去年はCursorを使っていたが最近は使ってない&lt;/li&gt;&#xA;&lt;li&gt;Launcher: Raycast&lt;/li&gt;&#xA;&lt;li&gt;タスク管理: Reminder&lt;/li&gt;&#xA;&lt;li&gt;パスワード管理: 1Password&lt;/li&gt;&#xA;&lt;li&gt;その他: Homerow, Giphy&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;メモアプリ&#34;&gt;メモアプリ&lt;/h2&gt;&#xA;&lt;p&gt;去年はObsidianを使ってみたが、あまり馴染まずで結局macOSのメモアプリ＋Notionに戻った。Notionはスマホからの編集が絶望的にやりにくいので、一時的にメモアプリに書いて、長期で保存する必要があるメモをNotionに入れるスタイル。Notionのデータベースは情報を整理するのには向いているので、長期記憶のデータベースとして活用している&lt;/p&gt;&#xA;&lt;h2 id=&#34;hot-key&#34;&gt;Hot Key&lt;/h2&gt;&#xA;&lt;p&gt;Raycastを使って以下のHot keyを割り当てている。どこかに書いておかないと忘れて使わなくなるものがあるのでメモ&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Ctrl + Cmd + c: クリップボード履歴&lt;/li&gt;&#xA;&lt;li&gt;Ctrl + Cmd + s: 開いているウィンドウ一覧&lt;/li&gt;&#xA;&lt;li&gt;Ctrl + 5: Homerow起動&lt;/li&gt;&#xA;&lt;li&gt;Ctrl + Cmd + 1: (Chrome上のみ)1Password起動&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>2025年の振り返りと2026年</title>
				<link>https://journal.lampetty.net/posts/2025-and-2026/</link>
				<pubDate>Tue, 20 Jan 2026 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/2025-and-2026/</guid>
				<description>&lt;p&gt;時間が無さすぎて完全に振り返りを忘れていた😇&lt;/p&gt;&#xA;&lt;p&gt;2025年は仕事以外にいくつか新しいことを始められた良い年であった。&lt;/p&gt;&#xA;&lt;h2 id=&#34;音楽&#34;&gt;音楽&lt;/h2&gt;&#xA;&lt;p&gt;2025年に行ったライブは&lt;a href=&#34;https://journal.lampetty.net/entry/lives-in-2025&#34;&gt;2025年振り返り(ライブ編) - oinume journal&lt;/a&gt;にまとめた。2024年よりもライブに行った回数が増えたのは良いこと。&lt;/p&gt;&#xA;&lt;p&gt;新しいバンドを好きになるということは特になかったけど、2025年後半からSaosinの曲を再び聴くことが多くなった。このバンドはボーカルが変わったり脱退したりでなかなか安定しなかったバンドではあるけど、2016年から初代ボーカルのアンソニーが復帰して活動を再開していたらしく、さらに2024年には2代目のコーブ・リバーにバトンタッチしていてツアーも積極的にやるようになったらしい。ただ、なぜか日本には来ることができないようで、今年か来年に海外で観てみたいなぁと思っている。&lt;/p&gt;&#xA;&lt;h2 id=&#34;放送大学&#34;&gt;放送大学&lt;/h2&gt;&#xA;&lt;p&gt;昨今の地球温暖化についてもう少し深く学びたい気持ちと学割で色々と安く買えることを目的に入学。単位をたくさん取って卒業する気はないので、半期に気になる科目を履修して緩く学習するという感じにしている。というか、履修しなくてもWebで全ての授業動画が見れるので、「Audibleより質の高い学習サブスク」という位置付けで続けている。そんなわけで2024年に始めたAudibleは解約してしまった。&lt;/p&gt;&#xA;&lt;h2 id=&#34;youtube&#34;&gt;YouTube&lt;/h2&gt;&#xA;&lt;p&gt;前年にスマホのキャリアをOCN MobileからMineoに変更して、速度制限がかかっている状態でも1.5Mbps出るようになり、常時YouTubeを見れるようになった。これが功を奏して、色々なバンドのライブ動画をいつでもどこでも見れるようになったし、また教育系のコンテンツもよく見るようになった。油断してると時間泥棒になってしまう側面はあるけど、今のところ自分にとってはプラスになっている気がする。主に以下のコンテンツをよく見てる。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;音楽：ライブ動画だったり「〜を弾いてみた」系のコンテンツ&lt;/li&gt;&#xA;&lt;li&gt;医療：&lt;a href=&#34;https://www.youtube.com/watch?v=6Sqfr2us9ts&#34;&gt;https://www.youtube.com/watch?v=6Sqfr2us9ts&lt;/a&gt;のような専門医が語る系&lt;/li&gt;&#xA;&lt;li&gt;政治：特定の政党の代表が話している公式の動画など&#xA;&lt;ul&gt;&#xA;&lt;li&gt;政治切り抜き系の動画は恣意的な内容かつ2次情報なのでみない&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;あとは放送大学の学割でYouTube Premiumが安く加入できるので(1280円 -&amp;gt; 780円)、広告なしで快適に視聴できている。&lt;/p&gt;&#xA;&lt;h2 id=&#34;ベース&#34;&gt;ベース&lt;/h2&gt;&#xA;&lt;p&gt;ずっとベースをやりたいと思っていて、年末の休みの間に勢いで買ってしまった。手が小さいのでバッカスのWJB-Miniというモデルにした。メルカリShopsで欲しい色が6000円引きで売っていたので即決。ベース本体だけではなくて色々機材も購入したので別の記事で詳細を書きたいけど、YouTubeの音源に合わせてベースをあわせて弾くことが簡単にできて楽しい。テープやCDに合わせて練習していた頃に比べると本当にいい時代になった。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B07W47MMJ4?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;&lt;img src=&#34;https://m.media-amazon.com/images/I/41mSOr6L58S._SL500_.jpg&#34; alt=&#34;バッカス BACCHUS WJB-Mini DLPB ミニエレキベース&#34; loading=&#34;lazy&#34; title=&#34;バッカス BACCHUS WJB-Mini DLPB ミニエレキベース&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B07W47MMJ4?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;バッカス BACCHUS WJB-Mini DLPB ミニエレキベース&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Bacchus バッカス&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B07W47MMJ4?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;Amazon&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;仕事&#34;&gt;仕事&lt;/h2&gt;&#xA;&lt;p&gt;担当していたサービスがクローズになってしまい、かなりやる気をなくしている。色々と思うところはあるけどネガティブな内容になるため自重&lt;/p&gt;&#xA;&lt;h2 id=&#34;2026年に向けて&#34;&gt;2026年に向けて&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;今年はサマソニが25周年なので今年こそ行きたい&lt;/li&gt;&#xA;&lt;li&gt;引き続き健康には気をつける&lt;/li&gt;&#xA;&lt;li&gt;趣味プロダクトをVibe Codingで頑張る&lt;/li&gt;&#xA;&lt;li&gt;このブログをはてなブログから移行する&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>2025年振り返り(ライブ編)</title>
				<link>https://journal.lampetty.net/posts/lives-in-2025/</link>
				<pubDate>Tue, 30 Dec 2025 19:08:25 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/lives-in-2025/</guid>
				<description>&lt;p&gt;今年は合計12本のライブに行った。去年は9本だったので少し増えている...!&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;2/18 ROTTENGRAFFTY x Dragon Ash - Blown in the Reborn Tour 2025&lt;/li&gt;&#xA;&lt;li&gt;2/23 MIXTURE INSTITUTE PABLO with friends&lt;/li&gt;&#xA;&lt;li&gt;4/16 STATE CHAMPS x The BONEZ&lt;/li&gt;&#xA;&lt;li&gt;4/17 The Ravens GHOST NOTES TOUR&lt;/li&gt;&#xA;&lt;li&gt;6/6 Nothing’s Carved in stone x Dragon Ash - Hand In Hand Tour 2025 at Gorilla Hall Osaka&lt;/li&gt;&#xA;&lt;li&gt;9/22 I-SCREAM NIGHT FINAL&lt;/li&gt;&#xA;&lt;li&gt;9/25 Muse Japan Tour at K-Arena&lt;/li&gt;&#xA;&lt;li&gt;10/13 LOUD PARK 2025&lt;/li&gt;&#xA;&lt;li&gt;11/6 The BONEZ - I&#39;m Not Your King Tour at KT Zepp Yokohama&lt;/li&gt;&#xA;&lt;li&gt;11/19 The Theory of SCIENCE at Zepp Shinjuku&lt;/li&gt;&#xA;&lt;li&gt;11/25 The Ravens x Dragon Ash at Nagoya Bottom Line&lt;/li&gt;&#xA;&lt;li&gt;12/11 The Ravens x 10-FEET LIVE TOUR 共鳴夜光 at Shibuya O-West&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;一番印象に残ったのはやっぱり11/25のRavensとDragon Ashの対バン。SHANKが体調不良により偶発的に発生したこの対バン、3日前ぐらいに発表されて当日チケットが取れたので🚅に飛び乗って日帰りでいざ名古屋へ！&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;まさかこんな対バンを見れる日が来るとは…！ &lt;a href=&#34;https://t.co/GOD57ns574&#34;&gt;pic.twitter.com/GOD57ns574&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;— oinume (@oinume) &lt;a href=&#34;https://twitter.com/oinume/status/1993250146227044515?ref_src=twsrc%5Etfw&#34;&gt;2025年11月25日&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;Dragon Ashのセトリも普段と違う仕様でAmploudやDrugs can&#39;t ~ をやったり大盤振る舞いで本当に行ってよかった。ダイブするKjをTSUYOSHIが助けに行くシーンもあってほっこりした。Ravens、実は今年の4月まではそんなに好きじゃなかったんだけど、今年は合計4回ライブを見に行って、見るたびにオーディエンスとの一体感が増していてライブバンドとしての力強さを感じた1年でした。&lt;/p&gt;&#xA;&lt;p&gt;あとは8年ぶりのMuse！はスタンディングではなく席ありのホールだったけど、ショーとしての完成度が高くてやっぱMuseだなぁと。Stockholm Syndromeをやってくれなかったのは「なぜ？？？」と思ったけど、次回来日に期待かなぁ&lt;/p&gt;&#xA;&lt;p&gt;来年はサマソニ25周年ということで3日間やるらしいのでぜひ行きたいな。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Claude Code GitHub Actionsでモデルを指定する</title>
				<link>https://journal.lampetty.net/posts/claude-code-github-actions-model/</link>
				<pubDate>Fri, 31 Oct 2025 08:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/claude-code-github-actions-model/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;https://docs.claude.com/en/docs/claude-code/github-actions&#34;&gt;Claude Code GitHub Actions&lt;/a&gt;を使っていて、自分は以下のような2種類のタスクを依頼することが多い。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;実装計画を立ててもらう&lt;/li&gt;&#xA;&lt;li&gt;実装をしてもらう&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Claude Codeであれば実装計画は&lt;code&gt;Opus&lt;/code&gt;を使って、実装タスクは&lt;code&gt;Sonnet&lt;/code&gt;を使うみたいな使い分けが簡単にできるのにClaude Code GitHub Actionsではデフォルトだとそれができなかったのでちょっとやってみた。&lt;/p&gt;&#xA;&lt;p&gt;具体的には、以下のようなclaude.ymlのWorkflowファイルを追加して、GitHub Issueなどのコメントで &lt;code&gt;@claude このタスクの実装計画を Opus で立てて&lt;/code&gt; とコメント内に&lt;code&gt;opus&lt;/code&gt;, &lt;code&gt;sonnet&lt;/code&gt;, &lt;code&gt;haiku&lt;/code&gt; のキーワードを含めることで指定したモデルでClaudeが動くようになる。&lt;/p&gt;&#xA;&lt;p&gt;やっていることは単純で、メッセージ内に&lt;code&gt;opus&lt;/code&gt;などのキーワードをgrepで引っ掛けてmodelを決めているだけ。注意点としては&lt;code&gt;grep &#39;\bopus\b&#39;&lt;/code&gt;で検索しているため、「このタスクをopusでお願い」ではマッチしないようになっている。かわりに「このタスクを opus でお願い」のようにopusの前後にスペースを入れる必要がある。&lt;/p&gt;&#xA;&lt;p&gt;そんなわけでClaude Code GitHub Actionsからもモデルが指定できるようになりタスクが捗るようになった(気がする)&lt;/p&gt;&#xA;&lt;p&gt;claude.yml&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;name: claude-code&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;on:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  issue_comment:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    types: [created]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  pull_request_review_comment:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    types: [created]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  issues:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    types: [opened, assigned]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  pull_request_review:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    types: [submitted]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;jobs:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  claude:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    if: |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      (github.event_name == &amp;#39;issue_comment&amp;#39; &amp;amp;&amp;amp; contains(github.event.comment.body, &amp;#39;@claude&amp;#39;)) ||&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      (github.event_name == &amp;#39;pull_request_review_comment&amp;#39; &amp;amp;&amp;amp; contains(github.event.comment.body, &amp;#39;@claude&amp;#39;)) ||&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      (github.event_name == &amp;#39;pull_request_review&amp;#39; &amp;amp;&amp;amp; contains(github.event.review.body, &amp;#39;@claude&amp;#39;)) ||&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      (github.event_name == &amp;#39;issues&amp;#39; &amp;amp;&amp;amp; (contains(github.event.issue.body, &amp;#39;@claude&amp;#39;) || contains(github.event.issue.title, &amp;#39;@claude&amp;#39;)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    runs-on: ubuntu-latest&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    permissions:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      contents: read&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      pull-requests: read&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      issues: read&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      id-token: write&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      actions: read # Required for Claude to read CI results on PRs&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    steps:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      - uses: actions/checkout@v5&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        with:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          fetch-depth: 1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      # Extract model from comment/issue body&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      - name: Determine Claude Model&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        id: determine-claude-model&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        run: |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          # Get the comment/issue body based on event type&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          if [ &amp;#34;${{ github.event_name }}&amp;#34; = &amp;#34;issue_comment&amp;#34; ]; then&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            BODY=$(cat &amp;lt;&amp;lt;&amp;#39;EOF&amp;#39;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          ${{ github.event.comment.body }}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          EOF&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          )&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          elif [ &amp;#34;${{ github.event_name }}&amp;#34; = &amp;#34;pull_request_review_comment&amp;#34; ]; then&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            BODY=$(cat &amp;lt;&amp;lt;&amp;#39;EOF&amp;#39;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          ${{ github.event.comment.body }}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          EOF&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          )&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          elif [ &amp;#34;${{ github.event_name }}&amp;#34; = &amp;#34;pull_request_review&amp;#34; ]; then&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            BODY=$(cat &amp;lt;&amp;lt;&amp;#39;EOF&amp;#39;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          ${{ github.event.review.body }}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          EOF&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          )&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          elif [ &amp;#34;${{ github.event_name }}&amp;#34; = &amp;#34;issues&amp;#34; ]; then&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            BODY=$(cat &amp;lt;&amp;lt;&amp;#39;EOF&amp;#39;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          ${{ github.event.issue.body }}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          EOF&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          )&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          fi&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          # Convert to lowercase for case-insensitive matching&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          BODY_LOWER=$(echo &amp;#34;$BODY&amp;#34; | tr &amp;#39;[:upper:]&amp;#39; &amp;#39;[:lower:]&amp;#39;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          # Determine model based on keywords&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          if echo &amp;#34;$BODY_LOWER&amp;#34; | grep -q &amp;#39;\bopus\b&amp;#39;; then&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            MODEL=&amp;#34;claude-opus-4-1&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          elif echo &amp;#34;$BODY_LOWER&amp;#34; | grep -q &amp;#39;\bhaiku\b&amp;#39;; then&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            MODEL=&amp;#34;claude-haiku-4-5&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          else&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            # Default to sonnet (including when &amp;#39;sonnet&amp;#39; keyword is present)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            MODEL=&amp;#34;claude-sonnet-4-5&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          fi&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          echo &amp;#34;model=$MODEL&amp;#34; &amp;gt;&amp;gt; $GITHUB_OUTPUT&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          echo &amp;#34;Selected model: $MODEL&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      - name: Run Claude Code&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        id: run-claude-code&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        uses: anthropics/claude-code-action@v1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        with:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          # This is an optional setting that allows Claude to read CI results on PRs&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          additional_permissions: |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            actions: read&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          allowed_bots: &amp;#34;claude-bot,claude&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          claude_args: |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            --model ${{ steps.determine-claude-model.outputs.model }}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            --allowedTools &amp;#34;Agent&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;           (必要に応じてMCPなどを設定)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
			</item>
			<item>
				<title>放送大学入学後に知った制度</title>
				<link>https://journal.lampetty.net/posts/unknown-ouj-system/</link>
				<pubDate>Mon, 25 Aug 2025 08:30:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/unknown-ouj-system/</guid>
				<description>&lt;p&gt;放送大学に入学して約4ヶ月が経ったので、入学後に知った制度を書いておく(学割についてはたくさん情報があるけど、制度についての情報が少ないので)&lt;/p&gt;&#xA;&lt;p&gt;ちなみに自分はきちんと単位を取って卒業する気はあまりなく、以下の2つの理由で入学した意識の低い学生です。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;気象学など気になる授業の動画を見たかった&lt;/li&gt;&#xA;&lt;li&gt;学割で色々安くなる&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;0-全ての授業の動画が見れる&#34;&gt;0. 全ての授業の動画が見れる&lt;/h2&gt;&#xA;&lt;p&gt;元々知ってはいたのだけど、大学院含めて全ての授業の動画が見れるのがすごい。YouTubeに上がっている動画を見る方がわかりやすいものもあるけど、&lt;a href=&#34;https://www.ouj.ac.jp/kamoku/kyouyou/C/&#34;&gt;これだけ多様な分野&lt;/a&gt;の動画が全て見れるというのはすごいと思う。&lt;/p&gt;&#xA;&lt;h2 id=&#34;1-大学のメールがgmail&#34;&gt;1. 大学のメールがGmail&lt;/h2&gt;&#xA;&lt;p&gt;(制度ではないけど完全に意外だったので書いておく)放送大学に入学すると &lt;code&gt;&amp;lt;学生番号&amp;gt;@campus.ouj.ac.jp&lt;/code&gt; というメールアドレスが発行されるのだけど、これが実はGmail(Google Workspace)になっている。なので普段Gmail使っている自分にとってはとてもありがたかった。&lt;/p&gt;&#xA;&lt;h2 id=&#34;2-単位を落としても次の半期に無料で再試験が受けられる&#34;&gt;2. 単位を落としても次の半期に無料で再試験が受けられる&lt;/h2&gt;&#xA;&lt;p&gt;放送大学では試験期間が決まっておりその間にWebから試験を受けるのだが、自分は運悪く風邪を引いてしまって試験が受けられず不合格になってしまった。そんな怠惰な人間のために再試験という制度があり、次の半期に無料で再試験が受けられるという神な制度。ちなみに放送大学は科目を履修すると1万2000円費用がかかるが、再試験の場合は履修が不要なので費用がかからない&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;再試験について&lt;/p&gt;&#xA;&lt;p&gt;本学の学生の多くが有職者であることから、仕事の都合により受験の機会を逸したり、やむを得ず受験準備に必要な時間が取れなかった学生の利便を図るため、新規に科目登録した学期において、単位を修得出来なかった場合は、次の学期に学籍がある場合に限り（休学中の場合を除く）、次学期に再試験を受験できます（再試験に係る授業料等はかかりません）。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.ouj.ac.jp/gakubu/about/tani-nintei/&#34;&gt;単位の認定基準（学部） | 放送大学 – BS放送・ネットで学ぶ通信制大学&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;3-再入学時に以前に履修した単位を引き継げる&#34;&gt;3. 再入学時に以前に履修した単位を引き継げる&lt;/h2&gt;&#xA;&lt;p&gt;放送大学は最大で10年間在籍でき、その間に卒業できなかったとしても再入学すれば以前履修した単位をそのまま引き継げるらしい。また、再入学するときの入学金が25%割引になる。つまり入学金＋履修選択した授業料を支払っていれば無限に在籍できるということ...! 自分のような1年に4単位ぐらいしか履修しないような堕落した生徒にとってこれはありがたい制度である。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;放送大学は、卒業後や選科履修生、科目履修生で在学期間満了後でも再度入学ができます。修得済単位は全科履修生に入学時に卒業要件として認定されますので、卒業後に他コースに再入学をし、再度卒業を目指すこともできます。（全コースを卒業すること等により「名誉学生」の称号が付与されることもあります。）また選科履修生、科目履修生として再びご入学することもできます。&lt;/p&gt;&#xA;&lt;p&gt;過去3年以内に教養学部に在籍していた方は入学料の25%割引が適用されます。 全科履修生･･･24,000円⇒18,000円 選科履修生･･･9,000円⇒6,750円 科目履修生･･･7,000円⇒5,250円&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.ouj.ac.jp/about/readmission/&#34;&gt;継続入学・再入学について | 放送大学&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;最後に&#34;&gt;最後に&lt;/h2&gt;&#xA;&lt;p&gt;放送大学はいいぞ！&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>ghコマンドでよく使ってるヤツ</title>
				<link>https://journal.lampetty.net/posts/gh-command-use-cases/</link>
				<pubDate>Sun, 17 Aug 2025 17:47:28 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/gh-command-use-cases/</guid>
				<description>&lt;p&gt;このポストがなぜかやたらバズっていたので、調子に乗って自分がよく使っているghコマンドのサブコマンドを書いてみる。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;gh pr checks --watch でCIの状況をコマンドで確認できるの便利&lt;/p&gt;&#xA;&lt;p&gt;— oinume (@oinume) &lt;a href=&#34;https://twitter.com/oinume/status/1956692727648645225?ref_src=twsrc%5Etfw&#34;&gt;August 16, 2025&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h2 id=&#34;gh-pr-view--w&#34;&gt;gh pr view -w&lt;/h2&gt;&#xA;&lt;p&gt;Usage&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;gh pr view &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&amp;lt;number&amp;gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; &amp;lt;url&amp;gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; &amp;lt;branch&amp;gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;flags&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;該当のpull requestをブラウザで開くために使っている。自分は何かとブラウザ上で作業することが多いのでかなり多用してる。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;-w&lt;/code&gt; を省略するとターミナル上でPRの内容が表示される。&lt;/li&gt;&#xA;&lt;li&gt;引数の&lt;code&gt;&amp;lt;number&amp;gt;&lt;/code&gt;などを省略するとカレントブランチのpull requestになる&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;gh-pr-checks---watch&#34;&gt;gh pr checks --watch&lt;/h2&gt;&#xA;&lt;p&gt;Usage&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; gh pr checks &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&amp;lt;number&amp;gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; &amp;lt;url&amp;gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; &amp;lt;branch&amp;gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;flags&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;カレントブランチのpull requestのchecks(CI)の状況を確認するのに使ってる。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;gh pr checks --watch -i 3&lt;/code&gt; のように&lt;code&gt;-i&lt;/code&gt;でリフレッシュする間隔を秒数で指定できる。デフォルトは10秒&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;gh pr checks --json=name,state&lt;/code&gt; のように指定すると以下のようにJSON形式で出力できる&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &amp;#34;name&amp;#34;: &amp;#34;triage&amp;#34;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &amp;#34;state&amp;#34;: &amp;#34;SUCCESS&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &amp;#34;name&amp;#34;: &amp;#34;lint&amp;#34;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &amp;#34;state&amp;#34;: &amp;#34;SUCCESS&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &amp;#34;name&amp;#34;: &amp;#34;test&amp;#34;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &amp;#34;state&amp;#34;: &amp;#34;SUCCESS&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;gh-pr-checkout&#34;&gt;gh pr checkout&lt;/h2&gt;&#xA;&lt;p&gt;Usage&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;gh pr checkout [&amp;lt;number&amp;gt; | &amp;lt;url&amp;gt; | &amp;lt;branch&amp;gt;] [flags]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;主に他の人のpull requestのコードを自分のPC上でcheckoutしたい時に使う。&lt;/p&gt;&#xA;&lt;h2 id=&#34;gh-pr-create&#34;&gt;gh pr create&lt;/h2&gt;&#xA;&lt;p&gt;Usage&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;gh pr create [flags]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;カレントブランチにコミットがある場合、&lt;code&gt;gh pr create -w&lt;/code&gt; を実行するとコミットをpushしてpull request をopenする画面をブラウザで開いてくれる。(コメントで教えてもらってから重宝してます)&lt;/p&gt;&#xA;&lt;h2 id=&#34;fzf-との組み合わせ&#34;&gt;fzf との組み合わせ&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/junegunn/fzf&#34;&gt;fzf&lt;/a&gt;と組み合わせて以下のようなfunctionを定義している。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# fghpr - list pull requests with search query, then open selected pull-request with browser&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Use like `fghpr -A &amp;#39;@me&amp;#39; -s closed`&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;fghpr&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    gh pr list &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$@&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; --json number,title -q &lt;span class=&#34;s1&#34;&gt;&amp;#39;.[] | &amp;#34;\(.number) \(.title)&amp;#34;&amp;#39;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; fzf --delimiter&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt; --with-nth&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;2.. &lt;span class=&#34;se&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; awk &lt;span class=&#34;s1&#34;&gt;&amp;#39;{print $1}&amp;#39;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; xargs -I &lt;span class=&#34;o&#34;&gt;{}&lt;/span&gt; gh pr view -w &lt;span class=&#34;o&#34;&gt;{}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;例えば &lt;code&gt;fghpr -A &#39;@me&#39; -s closed&lt;/code&gt; で自分が過去にマージ or クローズしたPRをターミナル上に一覧表示して、Fuzzy検索しつつ選択したものをブラウザで開くことができる。&lt;/p&gt;&#xA;&lt;h2 id=&#34;claude-code&#34;&gt;Claude Code&lt;/h2&gt;&#xA;&lt;p&gt;あとはClaude Codeと共に使うと色々便利らしいです。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;こうんな感じで便利で使えるよって教えてくれる人がたくさんいて良いインターネッツだ。ありがとうございます。 &lt;a href=&#34;https://t.co/WSNd4Pe5UI&#34;&gt;https://t.co/WSNd4Pe5UI&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;— V (@voluntas) &lt;a href=&#34;https://twitter.com/voluntas/status/1955990178327355696?ref_src=twsrc%5Etfw&#34;&gt;August 14, 2025&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;</description>
			</item>
			<item>
				<title>複数のプロダクトのリポジトリをMonorepoに移行する</title>
				<link>https://journal.lampetty.net/posts/migrate-polyrepo-to-monorepo/</link>
				<pubDate>Tue, 22 Jul 2025 08:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/migrate-polyrepo-to-monorepo/</guid>
				<description>&lt;p&gt;表題の通り、技術スタックがほぼ同じプロダクト群のリポジトリを1つのMonorepoにまとめてみたという雑な記録。&lt;/p&gt;&#xA;&lt;p&gt;元々は以下のようなPolyrepo構造になっていた。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;product-a (repository)&#xA;&lt;ul&gt;&#xA;&lt;li&gt;backend&lt;/li&gt;&#xA;&lt;li&gt;web&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;product-b (repository)&#xA;&lt;ul&gt;&#xA;&lt;li&gt;backend&lt;/li&gt;&#xA;&lt;li&gt;native&lt;/li&gt;&#xA;&lt;li&gt;web&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;これを以下のような構成に移行した。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;products (repository)&#xA;&lt;ul&gt;&#xA;&lt;li&gt;apps&#xA;&lt;ul&gt;&#xA;&lt;li&gt;product-a&#xA;&lt;ul&gt;&#xA;&lt;li&gt;backend&lt;/li&gt;&#xA;&lt;li&gt;web&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;product-b&#xA;&lt;ul&gt;&#xA;&lt;li&gt;backend&lt;/li&gt;&#xA;&lt;li&gt;native&lt;/li&gt;&#xA;&lt;li&gt;web&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;大まかには以下のような流れで移行する。&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;移行元のリポジトリで移行用ブランチを作成する&lt;/li&gt;&#xA;&lt;li&gt;移行先のリポジトリで移行用ブランチを作成し、1.の移行用ブランチをmergeする&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;では実際に移行してみよう。&lt;code&gt;product-a&lt;/code&gt;のリポジトリで以下のコマンドを実行する。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mkdir -p apps/product-a&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git checkout -b monorepo&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git mv -k * apps/product-a/  # -k is used to ignore the error that it can&amp;#39;t move the projects directory&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git mv -k .* apps/product-a/  # .* to move .gitignore and other dot files&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;次に移行先の&lt;code&gt;products&lt;/code&gt;リポジトリで以下のコマンドを実行する。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git remote add -f product-a https://github.com/&amp;lt;owner&amp;gt;/product-a.git&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git checkout -b import-product-a&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git merge product-a/monorepo --allow-unrelated-histories&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これで products リポジトリの &lt;code&gt;import-product-a&lt;/code&gt;というブランチにproduct-aリポジトリのファイルが追加されているので、pull-requestを作るなどしてこのブランチをmainブランチにマージすればOK&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# on main branch&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git merge import-product-a&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これを移行したいプロダクトの数だけ繰り返せばOKである。なお、.github/workflows などリポジトリ直下にないといけないディレクトリはMonorepoに取り込んだ後に手動でファイルを移動する必要があるので気をつけること。&lt;/p&gt;&#xA;&lt;p&gt;というわけで私はこれで素敵なMonorepo lifeを送れるようになりました。おしまい。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B096TH798S?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;&lt;img src=&#34;https://m.media-amazon.com/images/I/51fsPIs9pTS._SL500_.jpg&#34; alt=&#34;改訂2版 わかばちゃんと学ぶ Git使い方入門&#34; loading=&#34;lazy&#34; title=&#34;改訂2版 わかばちゃんと学ぶ Git使い方入門&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B096TH798S?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;改訂2版 わかばちゃんと学ぶ Git使い方入門&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者:湊川あい,DQNEO&lt;/li&gt;&#xA;&lt;li&gt;シーアンドアール研究所&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B096TH798S?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;Amazon&lt;/a&gt;&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>RaycastのScript Commandsを試してみた</title>
				<link>https://journal.lampetty.net/posts/raycast-script-commands/</link>
				<pubDate>Wed, 07 May 2025 08:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/raycast-script-commands/</guid>
				<description>&lt;p&gt;Raycastには&lt;a href=&#34;https://manual.raycast.com/script-commands&#34;&gt;Script Commands&lt;/a&gt;という機能があり、ずっとずっと気になっていたのでGW中に重い腰を上げて試してみた。最近会社の人にRaycastをオススメすることが多くなってきたのだけれども、「Raycast歴1年以上経つのにScript Commandsも使ったことないの？」みたいに後ろ指差されないようにするためにも...&lt;/p&gt;&#xA;&lt;h2 id=&#34;script-commandsとは&#34;&gt;Script Commandsとは？&lt;/h2&gt;&#xA;&lt;p&gt;簡単にいうとCUIのコマンドをRaycastから呼び出せるというただそれだけのものっぽい。「っぽい」というのは単純に自分がちゃんと調べてないだけです。はいテキトーですいません。&lt;/p&gt;&#xA;&lt;h2 id=&#34;なにを作るか&#34;&gt;なにを作るか？&lt;/h2&gt;&#xA;&lt;p&gt;Hello Worldを出力するだけのScript Commandsを作っても仕方がないので、よく自分でやっている単純作業を自動化するスクリプトを考えてみた。結果として生まれたのは、以下のような beforeの文字列をafterに整形するだけのスクリプトである。なんでこんなものが必要かというと、スプレッドシートからIDなどのリストをコピーしてSQLのWHERE句のINに指定する、ということをよくやっているから。&lt;/p&gt;&#xA;&lt;p&gt;before&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;aaa&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bbb&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ccc&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;after&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;#39;aaa&amp;#39;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;#39;bbb&amp;#39;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;#39;ccc&amp;#39;,&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;script-commandsの登録方法&#34;&gt;Script Commandsの登録方法&lt;/h2&gt;&#xA;&lt;p&gt;めちゃくちゃ簡単なので&lt;a href=&#34;https://github.com/raycast/script-commands&#34;&gt;このページ&lt;/a&gt;を見てもらうのが良いと思う。テキストで手順を書くと以下の4ステップしかない。&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Raycastを起動する&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Create Script Command&lt;/code&gt;と入力する&lt;/li&gt;&#xA;&lt;li&gt;必要な情報を入力する&lt;/li&gt;&#xA;&lt;li&gt;スクリプトにコマンドを記述する&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;ちなみに上で書いたScript Commandのスクリプトは以下のような感じである。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#!/bin/bash&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Required parameters:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# @raycast.schemaVersion 1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# @raycast.title single-quote-with-trailing-comma&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# @raycast.mode fullOutput&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Optional parameters:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# @raycast.icon 🤖&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# @raycast.needsConfirmation true&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Documentation:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# @raycast.description single-quote-with-trailing-comma&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# @raycast.author oinume&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# @raycast.authorURL https://github.com/oinume&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pbpaste &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; perl -pe &lt;span class=&#34;s2&#34;&gt;&amp;#34;s/.*/&amp;#39;\$&amp;amp;&amp;#39;,/&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;作成したscript-commandを呼び出す&#34;&gt;作成したScript Commandを呼び出す&lt;/h2&gt;&#xA;&lt;p&gt;あとはRaycastから作成した&lt;code&gt;single-quote-with-trailing-comma&lt;/code&gt;を呼び出すだけである。以下の動画ではsingle-quote-with-trailing-commaによって生成された出力をクリップボードにコピーしている。&lt;/p&gt;&#xA;&lt;h2 id=&#34;最後に一言&#34;&gt;最後に一言&lt;/h2&gt;&#xA;&lt;p&gt;というわけで駆け足でScript Commandsについて説明した。Apple Scriptを使って特定のSlack Channelを開くということもできるらしいので夢は広がりそうである。Raycast、本当によくできていてこれがあるおかげでmacOSから離れられない。次はExtensionの作成にチャレンジしてみたい。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>GraphQL Codegenで自動生成されたファイルでNamed export &#39;gql&#39; not foundのビルドエラーを回避する</title>
				<link>https://journal.lampetty.net/posts/avoid-gql-not-found/</link>
				<pubDate>Thu, 10 Apr 2025 08:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/avoid-gql-not-found/</guid>
				<description>&lt;p&gt;Vite + Apollo Client + GraphQL Codegenの組み合わせでgraphql-codegenを実行すると、&lt;code&gt;gql&lt;/code&gt;関数を以下のようにimportするためにエラーが出る。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import { gql } from &amp;#39;@apollo/client&amp;#39;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;vite&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Named&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;gql&amp;#39;&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;found&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;The&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;requested&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;module&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;@apollo/client&amp;#39;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;CommonJS&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;module&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;which&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;may&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;support&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;all&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;module&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;exports&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;as&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;named&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;exports&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;CommonJS&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;modules&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;can&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;always&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;be&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;imported&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;via&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;the&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;default&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;export&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;example&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;using&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pkg&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;@apollo/client&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;gql&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pkg&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;解決方法としては graphql-codegenの設定ファイルに&lt;a href=&#34;https://the-guild.dev/graphql/codegen/plugins/typescript/typescript-apollo-next#gqlimport&#34;&gt;gqlImport&lt;/a&gt;の設定を追加して再度コード生成する。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;config&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;CodegenConfig&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;...&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;generates&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;...&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;.&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nx&#34;&gt;config&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nx&#34;&gt;gqlImport&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;@apollo/client/core#gql&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;そうすると &lt;code&gt;import { gql } from &#39;@apollo/client/core&#39;;&lt;/code&gt; が生成されるのでビルドエラーが回避できた 🎉&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>PostgreSQL &#43; HasuraでUUID v7を生成できるようにする</title>
				<link>https://journal.lampetty.net/posts/define-uuid-v7-function-in-hasura/</link>
				<pubDate>Sat, 01 Mar 2025 12:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/define-uuid-v7-function-in-hasura/</guid>
				<description>&lt;p&gt;2024年に&lt;a href=&#34;https://datatracker.ietf.org/doc/rfc9562/&#34;&gt;RFC 9562&lt;/a&gt;としてUUID v7が標準化された。今までは主キーにUUID v4を使っていたけど、時間軸でソートできるUUID v7を使いたいと思ったのでメモ。&lt;/p&gt;&#xA;&lt;p&gt;簡単に書くとPostgreSQLでUUID v7形式のUUIDを生成するには以下を行えば実現できる。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;PostgreSQLには&lt;a href=&#34;https://www.postgresql.org/docs/current/datatype-uuid.html&#34;&gt;UUID型&lt;/a&gt;が標準装備されているのでこれを使用する&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/Betterment/postgresql-uuid-generate-v7&#34;&gt;postgres-uuid-generate-v7&lt;/a&gt;にあるUUID v7を生成するFUNCTIONを定義する&lt;/li&gt;&#xA;&lt;li&gt;カラムを &lt;code&gt;&amp;quot;id&amp;quot; uuid NOT NULL DEFAULT uuid_generate_v7()&lt;/code&gt; のように定義する&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;上記を踏まえてHasura consoleでUUID v7のFUNCTIONを定義して使えるようにするには、&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;consoleからであれば&lt;code&gt;DATA&lt;/code&gt;タブの&lt;code&gt;SQL&lt;/code&gt;を選択&lt;/li&gt;&#xA;&lt;li&gt;エディター部分にpostgres-uuid-generate-v7リポジトリの&lt;code&gt;uuid_generate_v7.sql&lt;/code&gt;の中身をそのままコピペ&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;This is a migration&lt;/code&gt; にチェックを入れてMigration nameに適当な名前をつける&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;をやれば良い(以下スクショ参照)&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>IntelliJ IDEAでよく使うショートカットキーをVSCodeでも使えるようにする</title>
				<link>https://journal.lampetty.net/posts/keymap-of-intellij-and-vscode/</link>
				<pubDate>Fri, 21 Feb 2025 08:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/keymap-of-intellij-and-vscode/</guid>
				<description>&lt;p&gt;コードを書くためのエディタとして、IntelliJ IDEAとVSCode(Cursor)を併用して使っている。そのため、この2つのエディタのショートカットキーを同じように設定したい。&lt;a href=&#34;https://marketplace.visualstudio.com/items?itemName=k--kato.intellij-idea-keybindings&#34;&gt;IntelliJ IDEA Keybindings&lt;/a&gt;を過去に使ったのだが、自分が想定してないキーも変更されてしまって使いづらいと感じたので、自分でキーバインドをカスタマイズすることにした。&lt;/p&gt;&#xA;&lt;p&gt;ちなみにここで紹介する技はもちろんIntelliJ IDEAのみではなく、GoLand, PHPStorm, PyCharm, WebStormなどでもできる。&lt;/p&gt;&#xA;&lt;h2 id=&#34;1-intellij-ideaでよく使っている機能とショートカットキーを調べる&#34;&gt;1. IntelliJ IDEAでよく使っている機能とショートカットキーを調べる&lt;/h2&gt;&#xA;&lt;p&gt;まず、IntelliJで自分がよく使っているキーを把握するために、Help -&amp;gt; My Productivityで&lt;code&gt;Productivity Guide&lt;/code&gt;を開く。そうすると以下のような画面が出るので、&lt;code&gt;Used&lt;/code&gt;の列でソートして使用頻度の高い機能名とショートカットキーを調べておく。&lt;/p&gt;&#xA;&lt;h2 id=&#34;2-vscode側の機能名を調べる&#34;&gt;2. VSCode側の機能名を調べる&lt;/h2&gt;&#xA;&lt;p&gt;次に、1.で調べた機能名に対するVSCodeの機能名をChatGPTなどの生成AIを使って調べる。プロンプトは以下のような感じ。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;以下のIntelliJ IDEAの機能名に対するVSCodeの機能名(英語)を教えてください。&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* Search Everywhere&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* Go to declaration&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* Go to Implementation(s)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;(以下略)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&#34;https://www.perplexity.ai/search/yi-xia-nointellij-ideanoji-nen-90JBt.p0QZ2kE_P7w0M_Dw&#34;&gt;www.perplexity.ai&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;3-vscodeのkeybindingを変更する&#34;&gt;3. VSCodeのKeybindingを変更する&lt;/h2&gt;&#xA;&lt;p&gt;コマンドパレットから&lt;code&gt;Open Keyboard Shortcuts&lt;/code&gt;を開き、2.で調べた機能名に合致するCommandを調べて、IntelliJ IDEAと同じショートカットキーを登録する。生成されるkeybindings.jsonはこんな感じ。このファイルはmacOSだと &lt;code&gt;~/Library/Application Support/Code/User/keybindings.json&lt;/code&gt;に保存されているので、このファイルをGitHubなどでバージョン管理しておくと良い。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;// Place your key bindings in this file to override the defaults&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;key&amp;#34;: &amp;#34;ctrl+d&amp;#34;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;command&amp;#34;: &amp;#34;-workbench.action.debug.run&amp;#34;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;when&amp;#34;: &amp;#34;debuggersAvailable &amp;amp;&amp;amp; !inDebugMode &amp;amp;&amp;amp; !terminalFocus&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;key&amp;#34;: &amp;#34;cmd+b&amp;#34;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;command&amp;#34;: &amp;#34;editor.action.revealDefinition&amp;#34;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;when&amp;#34;: &amp;#34;editorHasDefinitionProvider &amp;amp;&amp;amp; editorTextFocus&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;key&amp;#34;: &amp;#34;f12&amp;#34;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;command&amp;#34;: &amp;#34;-editor.action.revealDefinition&amp;#34;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;when&amp;#34;: &amp;#34;editorHasDefinitionProvider &amp;amp;&amp;amp; editorTextFocus&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;key&amp;#34;: &amp;#34;alt+cmd+b&amp;#34;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;command&amp;#34;: &amp;#34;editor.action.goToImplementation&amp;#34;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;when&amp;#34;: &amp;#34;editorHasImplementationProvider &amp;amp;&amp;amp; editorTextFocus&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;key&amp;#34;: &amp;#34;cmd+f12&amp;#34;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;command&amp;#34;: &amp;#34;-editor.action.goToImplementation&amp;#34;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;when&amp;#34;: &amp;#34;editorHasImplementationProvider &amp;amp;&amp;amp; editorTextFocus&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;key&amp;#34;: &amp;#34;cmd+r&amp;#34;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;command&amp;#34;: &amp;#34;editor.action.startFindReplaceAction&amp;#34;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;when&amp;#34;: &amp;#34;editorFocus || editorIsOpen&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;key&amp;#34;: &amp;#34;alt+cmd+f&amp;#34;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;command&amp;#34;: &amp;#34;-editor.action.startFindReplaceAction&amp;#34;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;when&amp;#34;: &amp;#34;editorFocus || editorIsOpen&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;key&amp;#34;: &amp;#34;shift+f6&amp;#34;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;command&amp;#34;: &amp;#34;editor.action.rename&amp;#34;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;when&amp;#34;: &amp;#34;editorHasRenameProvider &amp;amp;&amp;amp; editorTextFocus &amp;amp;&amp;amp; !editorReadonly&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;key&amp;#34;: &amp;#34;f2&amp;#34;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;command&amp;#34;: &amp;#34;-editor.action.rename&amp;#34;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;when&amp;#34;: &amp;#34;editorHasRenameProvider &amp;amp;&amp;amp; editorTextFocus &amp;amp;&amp;amp; !editorReadonly&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;key&amp;#34;: &amp;#34;f1&amp;#34;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;command&amp;#34;: &amp;#34;editor.action.showDefinitionPreviewHover&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;key&amp;#34;: &amp;#34;ctrl+alt+h&amp;#34;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;command&amp;#34;: &amp;#34;references-view.showCallHierarchy&amp;#34;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;when&amp;#34;: &amp;#34;editorHasCallHierarchyProvider&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;key&amp;#34;: &amp;#34;shift+alt+h&amp;#34;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;command&amp;#34;: &amp;#34;-references-view.showCallHierarchy&amp;#34;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;when&amp;#34;: &amp;#34;editorHasCallHierarchyProvider&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;key&amp;#34;: &amp;#34;alt+f7&amp;#34;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;command&amp;#34;: &amp;#34;references-view.findReferences&amp;#34;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;when&amp;#34;: &amp;#34;editorHasReferenceProvider&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;key&amp;#34;: &amp;#34;shift+alt+f12&amp;#34;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;command&amp;#34;: &amp;#34;-references-view.findReferences&amp;#34;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;when&amp;#34;: &amp;#34;editorHasReferenceProvider&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;key&amp;#34;: &amp;#34;f2&amp;#34;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;command&amp;#34;: &amp;#34;editor.action.marker.next&amp;#34;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;when&amp;#34;: &amp;#34;editorFocus&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;key&amp;#34;: &amp;#34;alt+f8&amp;#34;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;command&amp;#34;: &amp;#34;-editor.action.marker.next&amp;#34;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;when&amp;#34;: &amp;#34;editorFocus&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ここまで書いて、こんな回りくどいことをしなくとも、1.で調べた機能名とショートカットキーからVSCodeのkeybindings.json(キーバインドの設定ファイル)を生成AIに生成してもらえばいいことに気づいたw&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Cursorで開いているファイルをIntelliJ IDEAで開く</title>
				<link>https://journal.lampetty.net/posts/open-cursor-current-file-with-intellij/</link>
				<pubDate>Thu, 13 Feb 2025 18:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/open-cursor-current-file-with-intellij/</guid>
				<description>&lt;p&gt;最近Cursorを使い始めているのだけど、ガッツリコードを書きたい時はIntelliJに頼ることもまだ多い。なので、Cursorでユーザータスクを定義して、Cmd + Shift + p でコマンドパレットを開いて &lt;code&gt;Tasks: Run Task&lt;/code&gt; でIntelliJでそのファイルを開けるようにした。&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;Tasks: Open User Tasks&lt;/code&gt; で以下のタスクの定義を記述する。(macOSの場合、このファイルは &lt;code&gt;~/Library/Application Support/Cursor/User/tasks.json&lt;/code&gt; に保存される)&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &amp;#34;version&amp;#34;: &amp;#34;2.0.0&amp;#34;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &amp;#34;tasks&amp;#34;: [&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &amp;#34;label&amp;#34;: &amp;#34;Open Current File with IntelliJ IDEA&amp;#34;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &amp;#34;type&amp;#34;: &amp;#34;shell&amp;#34;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &amp;#34;command&amp;#34;: &amp;#34;idea&amp;#34;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &amp;#34;args&amp;#34;: [&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &amp;#34;${file}&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            ],&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &amp;#34;group&amp;#34;: {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &amp;#34;kind&amp;#34;: &amp;#34;build&amp;#34;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &amp;#34;isDefault&amp;#34;: true&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;             &amp;#34;problemMatcher&amp;#34;: []&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    ]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;参考: &lt;a href=&#34;https://code.visualstudio.com/docs/editor/tasks&#34;&gt;https://code.visualstudio.com/docs/editor/tasks&lt;/a&gt;&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;ここからアフィリエイト広告&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B0CRV56KVH?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;&lt;img src=&#34;https://m.media-amazon.com/images/I/41-9rw&amp;#43;zpHL._SL500_.jpg&#34; alt=&#34;改訂新版 Visual Studio Code実践ガイド —— 定番コードエディタを使い倒すテクニック&#34; loading=&#34;lazy&#34; title=&#34;改訂新版 Visual Studio Code実践ガイド —— 定番コードエディタを使い倒すテクニック&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B0CRV56KVH?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;改訂新版 Visual Studio Code実践ガイド —— 定番コードエディタを使い倒すテクニック&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者:森下 篤&lt;/li&gt;&#xA;&lt;li&gt;技術評論社&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B0CRV56KVH?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;Amazon&lt;/a&gt;&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>2024年の振り返りと2025年</title>
				<link>https://journal.lampetty.net/posts/2024-and-2025/</link>
				<pubDate>Sat, 04 Jan 2025 11:33:07 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/2024-and-2025/</guid>
				<description>&lt;p&gt;年末年始はハワイに行っていたので全く正月感がない感じで過ごしてしまった。1年の振り返りをしたり新年の抱負を書いたりしてもどうせ達成できないし、徒然なるままに生きたい人間なのだけれども、暇なので雑に振り返りと今年への意気込みをアウトプットしておく。&lt;/p&gt;&#xA;&lt;h2 id=&#34;ライブ&#34;&gt;ライブ&lt;/h2&gt;&#xA;&lt;p&gt;2024年は合計9本のライブに行った。ハイライトは5年ぶりにサマソニに行ってManeskinが好きになったこと。あとはThe Bonez x Dragon AshのStraigh Upが、久しぶりにライブで酸欠になるぐらい激しくて久しぶりにライブで死を感じた。ずっとミクスチャーをやっている2つのバンドが対バンするとこんなにエネルギーが湧き出てくるのかというぐらいの熱気だった。12/30の追加公演ではPABLOも参戦してPTPの曲もやったようで本当に本当に行きたかった...!&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Straight Up Tour Extra🔥&lt;br&gt;&#xA;at Zepp Haneda&lt;/p&gt;&#xA;&lt;p&gt;photo by &lt;a href=&#34;https://twitter.com/YSZ_PHOTO?ref_src=twsrc%5Etfw&#34;&gt;@YSZ_PHOTO&lt;/a&gt; &lt;a href=&#34;https://twitter.com/hashtag/StraightUp?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#StraightUp&lt;/a&gt;&lt;a href=&#34;https://twitter.com/hashtag/DragonAsh?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#DragonAsh&lt;/a&gt;&lt;a href=&#34;https://twitter.com/hashtag/TheBONEZ?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#TheBONEZ&lt;/a&gt; &lt;a href=&#34;https://t.co/LGO1sL1Z03&#34;&gt;pic.twitter.com/LGO1sL1Z03&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;— DA＿OFFICIAL (@Dragon_Ash) &lt;a href=&#34;https://twitter.com/Dragon_Ash/status/1874042558579695970?ref_src=twsrc%5Etfw&#34;&gt;December 31, 2024&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;あと12月にKORNのライブがオーストラリアであって行こうかどうかとても悩んだけど金銭的な理由で断念した。来年こそは日本に来てくれないかなと祈っている。&lt;/p&gt;&#xA;&lt;p&gt;(以下は今年に参戦したライブとフェスの一覧)&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;1/21: マサラーフェース2024&lt;/li&gt;&#xA;&lt;li&gt;3/17: PUNK SPRING 2024&lt;/li&gt;&#xA;&lt;li&gt;3/31: Dragon Ash x SHANK&lt;/li&gt;&#xA;&lt;li&gt;4/6: The Ravens&lt;/li&gt;&#xA;&lt;li&gt;7/18: TMC at CLUB CITTA&lt;/li&gt;&#xA;&lt;li&gt;8/7: SUMMER SONIC&lt;/li&gt;&#xA;&lt;li&gt;11/10: The BONEZ x Dragon Ash Straight Up Tour&lt;/li&gt;&#xA;&lt;li&gt;11/30: ビクターロック祭り2024&lt;/li&gt;&#xA;&lt;li&gt;12/8: REDLINE ALL THE FINAL&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;仕事&#34;&gt;仕事&lt;/h2&gt;&#xA;&lt;p&gt;特筆することはないけど、生成AIのおかげでコードを書くモチベーションが激減したので、自分で手を動かすような機会が減った。つまりMTGと目の前の課題をひたすらやっつけることをしている。「BackendなんてHasura使えばいいんでないの？」と思っている人間なので、Backendの開発に楽しみが見い出せなくなっている。&lt;/p&gt;&#xA;&lt;p&gt;事業ドメイン的には楽しい領域なので、ビジネス的に成長していればそれでよし。&lt;/p&gt;&#xA;&lt;h2 id=&#34;その他&#34;&gt;その他&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;今年からAudible始めたので読書が捗った&lt;/li&gt;&#xA;&lt;li&gt;Audibleと併せてウォーキングを始めたので体重が2.5kg減った&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;2025年に向けて&#34;&gt;2025年に向けて&lt;/h2&gt;&#xA;&lt;p&gt;今年は趣味プロダクトで作りたいアプリがあるので、なんとしても今年中に完成してリリースしたい。ライブは10回は行きたいけど行けるかなぁ。2024年は勉強会にほとんど参加せず技術的なことに興味を失いつつあるので、今年はもう少し参加したい。サマソニは観たいバンドがなくても行くべきだと昨年痛感したので、今年も行きたい。&lt;/p&gt;&#xA;&lt;p&gt;そんな感じで今年もゆるふわに生きます。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>2024年に買ってよかったもの</title>
				<link>https://journal.lampetty.net/posts/good-items-in-2024/</link>
				<pubDate>Sat, 04 Jan 2025 10:59:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/good-items-in-2024/</guid>
				<description>&lt;p&gt;あまりものを買わない主義なのだけど、ささやかながら買ってよかったものを。(Amazonのリンクはアフィリエイトが入ってる)&lt;/p&gt;&#xA;&lt;h2 id=&#34;ニューバランス-インソール-サポーティブリバウンドインソール&#34;&gt;[ニューバランス] インソール サポーティブリバウンドインソール&lt;/h2&gt;&#xA;&lt;p&gt;1年以上履いていたニューバランスのスニーカーのインソールがボロボロになったのでこれに入れ替えてみた。そしたらなんとびっくり、クッション効果が凄くて歩くのが大変快適になりQoLが爆上がりした。2000円弱の投資でここまで快適になるのならとてもコスパ良いと思う。なんだかんだでスニーカーは毎日履くものだし。とにかく快適すぎるので他のニューバランスのスニーカーも全部このインソールに替えた。デフォルトでこれを搭載してほしい&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B09Z99DMYN?tag=kazzhomeunixo-22&amp;amp;linkCode=osi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;&lt;img src=&#34;https://m.media-amazon.com/images/I/416C9Bl4lyL._SL500_.jpg&#34; alt=&#34;[ニューバランス] インソール サポーティブリバウンドインソール (RCP280 / LAM35689) 中敷き インサート LAM35689 GR(新) medium&#34; loading=&#34;lazy&#34; title=&#34;[ニューバランス] インソール サポーティブリバウンドインソール (RCP280 / LAM35689) 中敷き インサート LAM35689 GR(新) medium&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B09Z99DMYN?tag=kazzhomeunixo-22&amp;amp;linkCode=osi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;[ニューバランス] インソール サポーティブリバウンドインソール (RCP280 / LAM35689) 中敷き インサート LAM35689 GR(新) medium&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;new balance(ニューバランス)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B09Z99DMYN?tag=kazzhomeunixo-22&amp;amp;linkCode=osi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;Amazon&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;anker-511-charger-nano-3-30w-充電器-usb-c&#34;&gt;Anker 511 Charger (Nano 3, 30W) (充電器 USB-C)&lt;/h2&gt;&#xA;&lt;p&gt;常にPCを持ち歩いているため充電器も持ち運ぶ必要があり購入。元々は65Wのもの(150g)を持ち歩いていたのだけど、こっちは40gと超軽量なので買い換えた。100g減るだけでも持ち運び時の腰への負担が減るのでQoLが上がった。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B0B2QR8HN9?tag=kazzhomeunixo-22&amp;amp;linkCode=osi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;&lt;img src=&#34;https://m.media-amazon.com/images/I/31V3jY6sgqL._SL500_.jpg&#34; alt=&#34;Anker 511 Charger (Nano 3, 30W) (充電器 USB-C)【USB PD 対応/PSE技術基準適合/PPS規格対応】MacBook Windows PC iPad iPhone Galaxy Android スマートフォン ノートPC 各種 その他機器対応 (ホワイト)&#34; loading=&#34;lazy&#34; title=&#34;Anker 511 Charger (Nano 3, 30W) (充電器 USB-C)【USB PD 対応/PSE技術基準適合/PPS規格対応】MacBook Windows PC iPad iPhone Galaxy Android スマートフォン ノートPC 各種 その他機器対応 (ホワイト)&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B0B2QR8HN9?tag=kazzhomeunixo-22&amp;amp;linkCode=osi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;Anker 511 Charger (Nano 3, 30W) (充電器 USB-C)【USB PD 対応/PSE技術基準適合/PPS規格対応】MacBook Windows PC iPad iPhone Galaxy Android スマートフォン ノートPC 各種 その他機器対応 (ホワイト)&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Anker&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B0B2QR8HN9?tag=kazzhomeunixo-22&amp;amp;linkCode=osi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;Amazon&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;タニタ-体重計-体組成計-スマホ連動-50g単位-バックライト-bc-332l-wh-ホワイト&#34;&gt;タニタ 体重計 体組成計 スマホ連動 50g単位 バックライト BC-332L WH ホワイト&lt;/h2&gt;&#xA;&lt;p&gt;元々はAnkerの体重計を使っていたのだけど、たまに1kg単位でズレることがあり信憑性に疑問を持ったので安心安定のタニタのものを購入。スマホと連動する機能はAnkerの方が便利だったけどまぁよし。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B08R3B8CSM?tag=kazzhomeunixo-22&amp;amp;linkCode=osi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;&lt;img src=&#34;https://m.media-amazon.com/images/I/4146HddebvL._SL500_.jpg&#34; alt=&#34;タニタ 体重計 体組成計 スマホ連動 50g単位 バックライト BC-332L WH ホワイト 子供の成長を見守る&#34; loading=&#34;lazy&#34; title=&#34;タニタ 体重計 体組成計 スマホ連動 50g単位 バックライト BC-332L WH ホワイト 子供の成長を見守る&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B08R3B8CSM?tag=kazzhomeunixo-22&amp;amp;linkCode=osi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;タニタ 体重計 体組成計 スマホ連動 50g単位 バックライト BC-332L WH ホワイト 子供の成長を見守る&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;タニタ(Tanita)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B08R3B8CSM?tag=kazzhomeunixo-22&amp;amp;linkCode=osi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;Amazon&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;ヘリーハンセン-スカンザライトジャケット-scandza-light-jkt-ユニセックス&#34;&gt;[ヘリーハンセン] スカンザライトジャケット SCANDZA LIGHT JKT ユニセックス&lt;/h2&gt;&#xA;&lt;p&gt;風を通さないので、中にフリースを着れば東京の冬はこのアウターで乗り切れる。あまりにも気に入ったので同じものをもう一つ購入した。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B0BJJF1L4N?tag=kazzhomeunixo-22&amp;amp;linkCode=osi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;&lt;img src=&#34;https://m.media-amazon.com/images/I/31ROhsS&amp;#43;EqL._SL500_.jpg&#34; alt=&#34;[ヘリーハンセン] ジャケット 撥水 防水 防風 防寒 透湿 保温 スカンザライトジャケット SCANDZA LIGHT JKT ユニセックス HOE12272 ブラックブラック S&#34; loading=&#34;lazy&#34; title=&#34;[ヘリーハンセン] ジャケット 撥水 防水 防風 防寒 透湿 保温 スカンザライトジャケット SCANDZA LIGHT JKT ユニセックス HOE12272 ブラックブラック S&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B0BJJF1L4N?tag=kazzhomeunixo-22&amp;amp;linkCode=osi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;[ヘリーハンセン] ジャケット 撥水 防水 防風 防寒 透湿 保温 スカンザライトジャケット SCANDZA LIGHT JKT ユニセックス HOE12272 ブラックブラック S&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;HELLY HANSEN(ヘリーハンセン)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B0BJJF1L4N?tag=kazzhomeunixo-22&amp;amp;linkCode=osi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;Amazon&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;logicool-signature-m750lgr-ワイヤレスマウス&#34;&gt;Logicool Signature M750LGR ワイヤレスマウス&lt;/h2&gt;&#xA;&lt;p&gt;クロールがなめらかでホイール音も静か。2台のPCにBluetooth接続できるのが便利&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B0BKPR1SPC?tag=kazzhomeunixo-22&amp;amp;linkCode=osi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;&lt;img src=&#34;https://m.media-amazon.com/images/I/31pKUXkrCpL._SL500_.jpg&#34; alt=&#34;Logicool Signature M750LGR ワイヤレスマウス ラージ グラファイト Bluetooth Logi Bolt Unifying非対応 windows mac iPad Android Chrome OS スクロールホイール 無線マウス 静音マウス M750 国内正規品&#34; loading=&#34;lazy&#34; title=&#34;Logicool Signature M750LGR ワイヤレスマウス ラージ グラファイト Bluetooth Logi Bolt Unifying非対応 windows mac iPad Android Chrome OS スクロールホイール 無線マウス 静音マウス M750 国内正規品&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B0BKPR1SPC?tag=kazzhomeunixo-22&amp;amp;linkCode=osi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;Logicool Signature M750LGR ワイヤレスマウス ラージ グラファイト Bluetooth Logi Bolt Unifying非対応 windows mac iPad Android Chrome OS スクロールホイール 無線マウス 静音マウス M750 国内正規品&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Logicool(ロジクール)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B0BKPR1SPC?tag=kazzhomeunixo-22&amp;amp;linkCode=osi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;Amazon&lt;/a&gt;&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>OCNモバイルONEからmineoにMNPした</title>
				<link>https://journal.lampetty.net/posts/ocn-to-mineo/</link>
				<pubDate>Sat, 30 Nov 2024 16:25:29 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/ocn-to-mineo/</guid>
				<description>&lt;p&gt;最近ドコモ回線があまりにも詰まったり繋がらなかったりすることが多くてどうにも我慢できなくなったことと、たまたまmineoがキャンペーンをやっていてコストダウンできそうなので勢いでmineoに乗り換えた。後悔は全くしていない。&lt;/p&gt;&#xA;&lt;p&gt;数ヶ月前まではドコモ回線がつながりにくいこと以外はOCNは特に不満もなく、Musicカウントフリーオプションの存在もあり3年ほど使っていた。ただ、最近は新規契約を停止していてirumoという改悪されたMVNOに軸足を移す流れがあるのと、その影響でOCNモバイルONE自体がもう改善されないリビングデッド状態になっていたので、緩く乗り換え先を探していた。&lt;/p&gt;&#xA;&lt;p&gt;mineoにしようと思ったのは&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;1.5Mbpsなら使い放題のオプションがある&lt;/li&gt;&#xA;&lt;li&gt;ドコモ以外の回線も選べる&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;という点で、実際乗り換えてみてよかったと思った。それ以外にも通話系のオプションが充実してたり、ギガを永遠に貯められるオプションなどユニークなオプションがあっていいなと思う。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Audibleにハマったのでオススメする記事</title>
				<link>https://journal.lampetty.net/posts/audible/</link>
				<pubDate>Tue, 17 Sep 2024 08:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/audible/</guid>
				<description>&lt;p&gt;AmazonでAudibleが3ヶ月無料キャンペーンをやっていたので試しに使ってみたところ、かなり自分のツボに刺さったので良いポイントをまとめてみた。&lt;/p&gt;&#xA;&lt;h2 id=&#34;自分的にaudibleが刺さったポイント&#34;&gt;自分的にAudibleが刺さったポイント&lt;/h2&gt;&#xA;&lt;p&gt;「本を読みたいけど時間がない...」というのが、Audibleに出会う前の自分だった。いや、正確には「読書したいけどスマホのKindleで読んでいると気付いたら他のことをしている」というのが実態だった。Audibleであれば、ウォーキング中や通勤時間などのスキマ時間に「耳」から本の内容をインプットできるので、「気付いたらスマホで違うことをしていた」ということが起きにくい。そのため、Audibleで本を聴くようになってから圧倒的に読書習慣が根付いた。&lt;/p&gt;&#xA;&lt;h2 id=&#34;豊富なコンテンツ&#34;&gt;豊富なコンテンツ&lt;/h2&gt;&#xA;&lt;p&gt;詳しくは &lt;a href=&#34;https://www.audible.co.jp/&#34;&gt;Audibleのサイト&lt;/a&gt; を見てもらうとして、対象の書籍の幅の多さに驚く。たとえば小説であれば、「三体」「プロジェクトヘイルメアリー」などヒットしたものは大体あるイメージ。ビジネス書も「イシューからはじめよ」「コンサル一年目が学ぶこと」などそれなりのラインナップがある。&lt;/p&gt;&#xA;&lt;p&gt;もともと自分はウォーキング中にはPodcastを聴いていたのだけど、あまり興味のあるPodcastもなく惰性で聴いていた。Audibleであれば書籍が対象なので得られる情報の質がPodcastに比べて高いし、密度が濃いと感じる。&lt;/p&gt;&#xA;&lt;p&gt;なお、Audibleは本の内容を人間が読み上げているため、小説だと「その声じゃないんだよなぁ」と思うこともあるがこれはしょうがない。&lt;/p&gt;&#xA;&lt;h2 id=&#34;audibleアプリのクオリティが高い&#34;&gt;Audibleアプリのクオリティが高い&lt;/h2&gt;&#xA;&lt;p&gt;Audibleアプリは、単純にただのAudiobookよりさらに良い体験を提供していると思っている。具体的には、再生速度が0.05刻みで細かく調節できるのと、クリップ＆メモ機能が便利だ。&lt;/p&gt;&#xA;&lt;p&gt;クリップ機能は、読まれている本の位置を保存する機能でいわゆるしおりみたいなもの。クリップしておいた場所に後からジャンプできるのと、そのクリップに対して自分用のメモを保存することができる。メモをする場合は自動で再生が止まるようになっているのも気が利いていて良い。&lt;/p&gt;&#xA;&lt;h2 id=&#34;月1500円で聴き放題&#34;&gt;月1500円で聴き放題&lt;/h2&gt;&#xA;&lt;p&gt;中には別途お金を払う必要がある本もあるが、大体のものは1500円で聴けるので、聴いてみて「これはイマイチだな」と思ったらやめればいいし、逆に気に入ったら書籍を購入するのも良い。本屋での立ち読み感覚で色々聴くことができるのがグッド。&lt;/p&gt;&#xA;&lt;h2 id=&#34;目にやさしい&#34;&gt;目にやさしい&lt;/h2&gt;&#xA;&lt;p&gt;Audibleを再生している間はなるべくスマホは見ないで外界を見るようにしている。本を読んでいるとどうしても目が疲れてしまう問題があるけど、Audibleではスマホさえ見なければ目は疲れない。&lt;/p&gt;&#xA;&lt;h2 id=&#34;イマイチな点&#34;&gt;イマイチな点&lt;/h2&gt;&#xA;&lt;p&gt;再生速度を2倍にするなどして速度を上げることでカバーできるが、書籍を読む速読に比べると遅いという問題はある。あと上で書いたように小説はナレーターの声が自分のイメージと違うことが多いので、Audibleで聴くには向かないかもしれない。&lt;/p&gt;&#xA;&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;&#xA;&lt;p&gt;「Amazonから金でももらっているのか？」というような記事になってしまったけど、Audibleは自分の読書週間を大幅に改善してくれたプロダクトなのでオススメ記事を勢いで書いた。以前Audibleを試して「コンテンツが少ない」と思って使わなくなった人ももう1回見てみるといいかも。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Go言語でcodemod</title>
				<link>https://journal.lampetty.net/posts/codemod-in-go/</link>
				<pubDate>Tue, 13 Aug 2024 08:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/codemod-in-go/</guid>
				<description>&lt;p&gt;大規模なコードベースでリファクタリングを省エネ化するためにcodemodを最近調べていて、軽く試行錯誤したのでそのメモ。&lt;/p&gt;&#xA;&lt;h2 id=&#34;やりたいこと&#34;&gt;やりたいこと&lt;/h2&gt;&#xA;&lt;p&gt;例えば以下のようなTable Driven TestなコードをBEFOREからAFTERに書き換えたい。コード量が多いため人間がやるのは現実的ではなく、codemodで機械的に書き換えたい。&lt;/p&gt;&#xA;&lt;p&gt;BEFORE&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;package&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;slices&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;testing&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;TestContains&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;t&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;testing&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;T&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;type&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;ss&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;  &lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;tests&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;name&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;want&lt;/span&gt; &lt;span class=&#34;ne&#34;&gt;bool&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;empty: false&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{[]&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{},&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;want&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;bp&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;found: true&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{[]&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;a&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;b&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;b&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;want&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;bp&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;not found: false&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{[]&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;a&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;b&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;want&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;bp&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tt&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;range&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tests&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Run&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;t&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;testing&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;T&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;got&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;contains&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ss&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;got&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;want&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;n&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Errorf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;contains(): want=%v, got=%v&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;got&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;want&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;})&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;contains&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ss&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;ne&#34;&gt;bool&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;slices&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Contains&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ss&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;AFTER&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;TestContains&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;t&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;testing&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;T&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;type&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;ss&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;  &lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;tests&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;map&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;want&lt;/span&gt; &lt;span class=&#34;ne&#34;&gt;bool&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;empty: false&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{[]&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{},&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;want&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;bp&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;...&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;DIFF&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;---&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tools_eg&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;table_driven_test&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;go&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;+++&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tools_eg&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;table_driven_test&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;go&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;@@&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;29&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;25&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;@@&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;TestContains&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;t&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;testing&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;T&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;ss&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;  &lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;  &lt;span class=&#34;n&#34;&gt;tests&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;      &lt;span class=&#34;n&#34;&gt;name&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;   &lt;span class=&#34;n&#34;&gt;tests&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;map&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;want&lt;/span&gt; &lt;span class=&#34;ne&#34;&gt;bool&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;      &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;          &lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;empty: false&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;       &lt;span class=&#34;s2&#34;&gt;&amp;#34;empty: false&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{[]&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{},&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;want&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;bp&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;      &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;          &lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;found: true&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;       &lt;span class=&#34;s2&#34;&gt;&amp;#34;found: true&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{[]&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;a&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;b&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;b&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;want&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;bp&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;      &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;          &lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;not found: false&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;       &lt;span class=&#34;s2&#34;&gt;&amp;#34;not found: false&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{[]&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;a&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;b&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;want&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;bp&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;  &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tt&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;range&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tests&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;      &lt;span class=&#34;n&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Run&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;t&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;testing&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;T&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;   &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tt&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;range&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tests&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;       &lt;span class=&#34;n&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Run&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;t&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;testing&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;T&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;got&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;contains&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ss&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;got&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;want&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;n&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Errorf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;contains(): want=%v, got=%v&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;got&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;want&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;試したこと&#34;&gt;試したこと&lt;/h2&gt;&#xA;&lt;h3 id=&#34;eg&#34;&gt;eg&lt;/h3&gt;&#xA;&lt;p&gt;&lt;code&gt;eg&lt;/code&gt;というのは golang.org/x/tools 配下で提供されているコード書き換えのコマンドのこと(&lt;a href=&#34;https://github.com/golang/tools/blob/master/refactor/eg/eg.go&#34;&gt;link&lt;/a&gt;)。例えば以下のようにdeprecatedな &lt;code&gt;ioutil.ReadAll&lt;/code&gt; を呼び出している箇所をtemplateのGoコードを用いて &lt;code&gt;io.ReadAll&lt;/code&gt; に書き換えることができる。&lt;/p&gt;&#xA;&lt;p&gt;http_get.go&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;go&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;package&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;io/ioutil&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;//nolint:staticcheck&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;net/http&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;resp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;DefaultClient&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;https://github.com/golang/go&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nil&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;panic&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;defer&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;resp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Body&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Close&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;body&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ioutil&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;ReadAll&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;resp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Body&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nil&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;panic&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;body&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;http_get.template&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;package&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;io&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;io/ioutil&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;before&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;r&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;io&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Reader&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;([]&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;byte&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;error&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ioutil&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ReadAll&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;after&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;r&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;io&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Reader&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;([]&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;byte&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;error&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;io&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ReadAll&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;egを使って書き換える&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ eg -t http_get.template -w http_get.go&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ただ、egでは先ほどのようなTable Driven Testの struct -&amp;gt; map[string]struct にするのは &lt;code&gt;eg: map[string]struct{} is not a safe replacement for struct{name string}&lt;/code&gt; のエラーでできなかった(&lt;a href=&#34;https://github.com/oinume/playground-go/blob/main/tools_eg/table_driven_test.template&#34;&gt;ref&lt;/a&gt;)。&lt;/p&gt;&#xA;&lt;p&gt;なので、次に紹介するast-grepを試してみた。&lt;/p&gt;&#xA;&lt;h3 id=&#34;ast-grep&#34;&gt;ast-grep&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/ast-grep/ast-grep&#34;&gt;ast-grep&lt;/a&gt;は様々な言語に対応した、ASTベースでコードの検索、Linterの作成、コード書き換えを行えるコマンドラインツールである。YAMLファイルによる独自のルールを定義することによって、かなり複雑なパターンマッチングを行うことができる。&lt;/p&gt;&#xA;&lt;p&gt;ASTツリーを表示しながらパターンにマッチした部分をハイライトする&lt;a href=&#34;https://ast-grep.github.io/playground.html&#34;&gt;Playground&lt;/a&gt;も用意されているので、AST初心者でも試行錯誤すればルールが定義できそうな雰囲気を感じる。自分はまだ使いこなせてないので、とりあえず紹介だけ。&lt;/p&gt;&#xA;&lt;p&gt;これを使えばおそらく先ほどのTable Driven Testのコードは書き換えられそうな気がする。&lt;/p&gt;&#xA;&lt;h2 id=&#34;その他のツール&#34;&gt;その他のツール&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;TypeScriptだと&lt;a href=&#34;https://ts-morph.com/&#34;&gt;ts-morph&lt;/a&gt;というものがあり、これのGo版が欲しい...!!!&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://codemod.com/&#34;&gt;Codemod&lt;/a&gt;というコード書き換えのためのSaaSがある。内部的にはast-grepなどを呼び出すっぽい&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;最後に&#34;&gt;最後に&lt;/h2&gt;&#xA;&lt;p&gt;とりあえずast-grepで試行錯誤して上手くいったらまた記事を書きます。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Markdown Style Guide</title>
				<link>https://journal.lampetty.net/posts/markdown-style-guide/</link>
				<pubDate>Wed, 19 Jun 2024 00:00:00 +0000</pubDate>
				<guid>https://journal.lampetty.net/posts/markdown-style-guide/</guid>
				<description>&lt;p&gt;Here is a sample of some basic Markdown syntax that can be used when writing Markdown content in Astro.&lt;/p&gt;&#xA;&lt;h2 id=&#34;headings&#34;&gt;Headings&lt;/h2&gt;&#xA;&lt;p&gt;The following HTML &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt;—&lt;code&gt;&amp;lt;h6&amp;gt;&lt;/code&gt; elements represent six levels of section headings. &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; is the highest section level while &lt;code&gt;&amp;lt;h6&amp;gt;&lt;/code&gt; is the lowest.&lt;/p&gt;&#xA;&lt;h1 id=&#34;h1&#34;&gt;H1&lt;/h1&gt;&#xA;&lt;h2 id=&#34;h2&#34;&gt;H2&lt;/h2&gt;&#xA;&lt;h3 id=&#34;h3&#34;&gt;H3&lt;/h3&gt;&#xA;&lt;h4 id=&#34;h4&#34;&gt;H4&lt;/h4&gt;&#xA;&lt;h5 id=&#34;h5&#34;&gt;H5&lt;/h5&gt;&#xA;&lt;h6 id=&#34;h6&#34;&gt;H6&lt;/h6&gt;&#xA;&lt;h2 id=&#34;paragraph&#34;&gt;Paragraph&lt;/h2&gt;&#xA;&lt;p&gt;Xerum, quo qui aut unt expliquam qui dolut labo. Aque venitatiusda cum, voluptionse latur sitiae dolessi aut parist aut dollo enim qui voluptate ma dolestendit peritin re plis aut quas inctum laceat est volestemque commosa as cus endigna tectur, offic to cor sequas etum rerum idem sintibus eiur? Quianimin porecus evelectur, cum que nis nust voloribus ratem aut omnimi, sitatur? Quiatem. Nam, omnis sum am facea corem alique molestrunt et eos evelece arcillit ut aut eos eos nus, sin conecerem erum fuga. Ri oditatquam, ad quibus unda veliamenimin cusam et facea ipsamus es exerum sitate dolores editium rerore eost, temped molorro ratiae volorro te reribus dolorer sperchicium faceata tiustia prat.&lt;/p&gt;&#xA;&lt;p&gt;Itatur? Quiatae cullecum rem ent aut odis in re eossequodi nonsequ idebis ne sapicia is sinveli squiatum, core et que aut hariosam ex eat.&lt;/p&gt;&#xA;&lt;h2 id=&#34;images&#34;&gt;Images&lt;/h2&gt;&#xA;&lt;h3 id=&#34;syntax&#34;&gt;Syntax&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;markdown&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;![&lt;span class=&#34;nt&#34;&gt;Alt text&lt;/span&gt;](&lt;span class=&#34;na&#34;&gt;./full/or/relative/path/of/image&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;output&#34;&gt;Output&lt;/h3&gt;&#xA;&lt;p&gt;&lt;img src=&#34;../../astro/src/assets/blog-placeholder-about.jpg&#34; alt=&#34;blog placeholder&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/p&gt;&#xA;&lt;h2 id=&#34;blockquotes&#34;&gt;Blockquotes&lt;/h2&gt;&#xA;&lt;p&gt;The blockquote element represents content that is quoted from another source, optionally with a citation which must be within a &lt;code&gt;footer&lt;/code&gt; or &lt;code&gt;cite&lt;/code&gt; element, and optionally with in-line changes such as annotations and abbreviations.&lt;/p&gt;&#xA;&lt;h3 id=&#34;blockquote-without-attribution&#34;&gt;Blockquote without attribution&lt;/h3&gt;&#xA;&lt;h4 id=&#34;syntax-1&#34;&gt;Syntax&lt;/h4&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;markdown&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;&amp;gt; &lt;/span&gt;&lt;span class=&#34;ge&#34;&gt;Tiam, ad mint andaepu dandae nostion secatur sequo quae.  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;gt; &lt;span class=&#34;gs&#34;&gt;**Note**&lt;/span&gt; that you can use &lt;span class=&#34;ge&#34;&gt;_Markdown syntax_&lt;/span&gt; within a blockquote.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;output-1&#34;&gt;Output&lt;/h4&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Tiam, ad mint andaepu dandae nostion secatur sequo quae.&lt;br&gt;&#xA;&lt;strong&gt;Note&lt;/strong&gt; that you can use &lt;em&gt;Markdown syntax&lt;/em&gt; within a blockquote.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h3 id=&#34;blockquote-with-attribution&#34;&gt;Blockquote with attribution&lt;/h3&gt;&#xA;&lt;h4 id=&#34;syntax-2&#34;&gt;Syntax&lt;/h4&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;markdown&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;&amp;gt; &lt;/span&gt;&lt;span class=&#34;ge&#34;&gt;Don&amp;#39;t communicate by sharing memory, share memory by communicating.&amp;lt;br&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;gt; — &amp;lt;cite&amp;gt;Rob Pike[^1]&amp;lt;/cite&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;output-2&#34;&gt;Output&lt;/h4&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Don&#39;t communicate by sharing memory, share memory by communicating.&lt;br&gt;&#xA;— &lt;cite&gt;Rob Pike&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/cite&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h2 id=&#34;tables&#34;&gt;Tables&lt;/h2&gt;&#xA;&lt;h3 id=&#34;syntax-3&#34;&gt;Syntax&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;markdown&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;| Italics   | Bold     | Code   |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;| --------- | -------- | ------ |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;| &lt;span class=&#34;ge&#34;&gt;_italics_&lt;/span&gt; | &lt;span class=&#34;gs&#34;&gt;**bold**&lt;/span&gt; | &lt;span class=&#34;sb&#34;&gt;`code`&lt;/span&gt; |&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;output-3&#34;&gt;Output&lt;/h3&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Italics&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Bold&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Code&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;em&gt;italics&lt;/em&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;strong&gt;bold&lt;/strong&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;code&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;code-blocks&#34;&gt;Code Blocks&lt;/h2&gt;&#xA;&lt;h3 id=&#34;syntax-4&#34;&gt;Syntax&lt;/h3&gt;&#xA;&lt;p&gt;we can use 3 backticks ``` in new line and write snippet and close with 3 backticks on new line and to highlight language specific syntax, write one word of language name after first 3 backticks, for eg. html, javascript, css, markdown, typescript, txt, bash&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;markdown&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;```html&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;&amp;lt;!doctype html&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;html&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;lang&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;en&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;head&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;meta&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;charset&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;/&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;Example HTML5 Document&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;head&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;body&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;p&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;Test&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;p&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;body&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;html&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;```&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;output-4&#34;&gt;Output&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;html&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;&amp;lt;!doctype html&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;html&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;lang&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;en&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;head&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;meta&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;charset&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;/&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;Example HTML5 Document&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;head&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;body&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;p&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;Test&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;p&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;body&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;html&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;list-types&#34;&gt;List Types&lt;/h2&gt;&#xA;&lt;h3 id=&#34;ordered-list&#34;&gt;Ordered List&lt;/h3&gt;&#xA;&lt;h4 id=&#34;syntax-5&#34;&gt;Syntax&lt;/h4&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;markdown&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;1.&lt;/span&gt; First item&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;2.&lt;/span&gt; Second item&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;3. Third item&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;output-5&#34;&gt;Output&lt;/h4&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;First item&lt;/li&gt;&#xA;&lt;li&gt;Second item&lt;/li&gt;&#xA;&lt;li&gt;Third item&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;unordered-list&#34;&gt;Unordered List&lt;/h3&gt;&#xA;&lt;h4 id=&#34;syntax-6&#34;&gt;Syntax&lt;/h4&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;markdown&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; List item&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; Another item&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- And another item&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;output-6&#34;&gt;Output&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;List item&lt;/li&gt;&#xA;&lt;li&gt;Another item&lt;/li&gt;&#xA;&lt;li&gt;And another item&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;nested-list&#34;&gt;Nested list&lt;/h3&gt;&#xA;&lt;h4 id=&#34;syntax-7&#34;&gt;Syntax&lt;/h4&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;markdown&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; Fruit&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; Apple&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; Orange&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; Banana&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; Dairy&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; Milk&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  - Cheese&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;output-7&#34;&gt;Output&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Fruit&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Apple&lt;/li&gt;&#xA;&lt;li&gt;Orange&lt;/li&gt;&#xA;&lt;li&gt;Banana&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Dairy&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Milk&lt;/li&gt;&#xA;&lt;li&gt;Cheese&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;other-elements--abbr-sub-sup-kbd-mark&#34;&gt;Other Elements — abbr, sub, sup, kbd, mark&lt;/h2&gt;&#xA;&lt;h3 id=&#34;syntax-8&#34;&gt;Syntax&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;markdown&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt;abbr title=&amp;#34;Graphics Interchange Format&amp;#34;&amp;gt;GIF&amp;lt;/abbr&amp;gt; is a bitmap image format.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;H&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;O&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;X&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; + Y&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; = Z&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Press &amp;lt;kbd&amp;gt;CTRL&amp;lt;/kbd&amp;gt; + &amp;lt;kbd&amp;gt;ALT&amp;lt;/kbd&amp;gt; + &amp;lt;kbd&amp;gt;Delete&amp;lt;/kbd&amp;gt; to end the session.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Most &amp;lt;mark&amp;gt;salamanders&amp;lt;/mark&amp;gt; are nocturnal, and hunt for insects, worms, and other small creatures.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;output-8&#34;&gt;Output&lt;/h3&gt;&#xA;&lt;p&gt;&lt;abbr title=&#34;Graphics Interchange Format&#34;&gt;GIF&lt;/abbr&gt; is a bitmap image format.&lt;/p&gt;&#xA;&lt;p&gt;H&lt;sub&gt;2&lt;/sub&gt;O&lt;/p&gt;&#xA;&lt;p&gt;X&lt;sup&gt;n&lt;/sup&gt; + Y&lt;sup&gt;n&lt;/sup&gt; = Z&lt;sup&gt;n&lt;/sup&gt;&lt;/p&gt;&#xA;&lt;p&gt;Press &lt;kbd&gt;CTRL&lt;/kbd&gt; + &lt;kbd&gt;ALT&lt;/kbd&gt; + &lt;kbd&gt;Delete&lt;/kbd&gt; to end the session.&lt;/p&gt;&#xA;&lt;p&gt;Most &lt;mark&gt;salamanders&lt;/mark&gt; are nocturnal, and hunt for insects, worms, and other small creatures.&lt;/p&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;The above quote is excerpted from Rob Pike&#39;s &lt;a href=&#34;https://www.youtube.com/watch?v=PAAkCSZUG1c&#34;&gt;talk&lt;/a&gt; during Gopherfest, November 18, 2015.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
			</item>
			<item>
				<title>Raycastを使い始めて1年経った</title>
				<link>https://journal.lampetty.net/posts/raycast-one-year-later/</link>
				<pubDate>Mon, 08 Jan 2024 08:30:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/raycast-one-year-later/</guid>
				<description>&lt;p&gt;Raycastを使い始めて1年経ったので、どういうことに使っているかを振り返ってみる。去年書いた &lt;a href=&#34;https://journal.lampetty.net/entry/alfred-to-raycast&#34;&gt;AlfredからRaycastに移行した - oinume journal&lt;/a&gt; の記事から少し使い方が変わっているところもあるのでメモがてら。&lt;/p&gt;&#xA;&lt;h2 id=&#34;基本的な使い方&#34;&gt;基本的な使い方&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;Ctrl + Q&lt;/code&gt;をRaycast起動のショートカットとして割り当てている。Pro版は使っていないのでAI機能などは使ったことがない。&lt;/li&gt;&#xA;&lt;li&gt;ブラウザのブックマーク検索など、よく使うけどHotKeyを割り当てるほどでもないRaycastコマンドは&lt;code&gt;bm&lt;/code&gt;のようにAliasを設定している。&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;Ctrl + Q&lt;/code&gt;でRaycastを起動して&lt;code&gt;bm&lt;/code&gt;と入力するとブックマークの検索ができるので楽ちん&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;アプリケーションランチャー機能&#34;&gt;アプリケーションランチャー機能&lt;/h2&gt;&#xA;&lt;p&gt;アプリケーションを起動するときのランチャーとして使っている。よく使うアプリにはHot Key(ショートカット)を割り当ててる。&lt;/p&gt;&#xA;&lt;h2 id=&#34;clipboard-history&#34;&gt;Clipboard History&lt;/h2&gt;&#xA;&lt;p&gt;クリップボードの履歴を溜めておいて、後から検索してペーストできる機能。&lt;code&gt;Ctrl + Cmd + C&lt;/code&gt;をHotKeyとして割り当てて瞬時に起動できるようにしている。&lt;/p&gt;&#xA;&lt;h2 id=&#34;絵文字検索&#34;&gt;絵文字検索&lt;/h2&gt;&#xA;&lt;p&gt;正確にはSearch Emoji &amp;amp; Symbolsという機能。これが地味に便利な機能で、こんな感じで英語で絵文字を検索して選択するとクリップボードにコピーされるのですぐにペーストできる。&lt;/p&gt;&#xA;&lt;h2 id=&#34;スクリーンショットの検索クリップボードへのコピーslackやgithubへ貼り付け&#34;&gt;スクリーンショットの検索＆クリップボードへのコピー＆SlackやGitHubへ貼り付け&lt;/h2&gt;&#xA;&lt;p&gt;これも便利な機能で、以下のような流れで使うのだけど、スクショを貼り付けるのがキーボード操作だけでできるようになる。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;スクリーンショットを撮った後にRaycastを起動&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;screenshot&lt;/code&gt;で検索して機能を起動して、スクショをサムネイルで検索して選択&lt;/li&gt;&#xA;&lt;li&gt;するとクリップボードにスクショがコピーされるので、SlackやGitHubなどにペーストするとスクショが貼り付けられる。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;ブラウザのブックマーク検索&#34;&gt;ブラウザのブックマーク検索&lt;/h2&gt;&#xA;&lt;p&gt;正式名称はSearch Browser Bookmarks。ブラウザのブックマークを検索することができる。SafariとChromeがある場合は、Cmd + Kで&lt;code&gt;Select Browsers&lt;/code&gt;を選ぶと対象のブラウザを選択することができる(Safari, Chromeの両方を対象にすることも可能)。&lt;/p&gt;&#xA;&lt;h2 id=&#34;開いているウィンドウの検索切り替え&#34;&gt;開いているウィンドウの検索・切り替え&lt;/h2&gt;&#xA;&lt;p&gt;正式名称はSwitch Windows。今開いているウィンドウをfuzzy検索できる。自分はIntelliJ IDEAを使っていてたくさんウィンドウを開いているので、これで検索してウィンドウを切り替えることが多い。&lt;code&gt;Ctrl + Cmd + S&lt;/code&gt;をHotKeyとして割り当てている。&lt;/p&gt;&#xA;&lt;h2 id=&#34;chromeの履歴検索&#34;&gt;Chromeの履歴検索&lt;/h2&gt;&#xA;&lt;p&gt;「あの閉じてしまったタブをもう1回開きたいなぁ」という時に意外と重宝するのがChromeの履歴検索である。&lt;a href=&#34;https://www.raycast.com/Codely/google-chrome&#34;&gt;Chrome Extension&lt;/a&gt;をインストールすると使えるようになる。&lt;/p&gt;&#xA;&lt;h2 id=&#34;使わなくなった機能&#34;&gt;使わなくなった機能&lt;/h2&gt;&#xA;&lt;p&gt;最初便利だなと思っていたけど使わなくなった機能もある。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Quicklink: ブラウザのブックマークで十分だと感じた&lt;/li&gt;&#xA;&lt;li&gt;カレンダー連携(My Schedule): ChromeでGoogleカレンダーを固定タブで開いているのでRaycastから飛べなくてもいいかなと思った。あと、MacのカレンダーとGoogle Calendarを連携するのが嫌になったというのもある。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;raycastの使いこなせていない機能&#34;&gt;Raycastの使いこなせていない機能&lt;/h2&gt;&#xA;&lt;p&gt;Raycast便利に使っているけど、Script CommandsやExtensionを作れるほどのレベルにはなっていないので、今年はそれらに挑戦してみたい。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>HasuraをDokku上で動かす</title>
				<link>https://journal.lampetty.net/posts/hasura-on-dokku/</link>
				<pubDate>Sat, 30 Dec 2023 15:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/hasura-on-dokku/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;https://journal.lampetty.net/entry/install-dokku-on-vps&#34;&gt;VPS上にDokkuを構築した&lt;/a&gt;ので、そこに&lt;a href=&#34;https://hasura.io/&#34;&gt;Hasura&lt;/a&gt;を動かしてみるテスト。Hasuraとは簡単に言うとPostgreSQLのテーブルスキーマからGraphQLサーバーを構築してくれるミドルウェア。&lt;/p&gt;&#xA;&lt;p&gt;前提として、Dokkuはすでに構築済みとする。(自分の場合はUbuntu 22.04 上にDokku 0.32.3を構築済み)&lt;/p&gt;&#xA;&lt;h2 id=&#34;手順&#34;&gt;手順&lt;/h2&gt;&#xA;&lt;p&gt;まずは最初に&lt;code&gt;hasura&lt;/code&gt;という名前のアプリケーションを作成する&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ dokku apps:create hasura&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;次に、HasuraのためのPostgreSQL databaseを建てる。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ dokku postgres:create hasura-db&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       Waiting &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; container to be ready&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       Creating container database&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       Securing connection to &lt;span class=&#34;nv&#34;&gt;database&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;=====&lt;/span&gt;&amp;gt; Postgres container created: hasura-db&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;=====&lt;/span&gt;&amp;gt; hasura-db postgres service information&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       Config dir:          /var/lib/dokku/services/postgres/hasura-db/data&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       Config options:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       Data dir:            /var/lib/dokku/services/postgres/hasura-db/data&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       Dsn:                 postgres://postgres:&amp;lt;redacted&amp;gt;@dokku-postgres-hasura-db:5432/hasura_db&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       Exposed ports:       -&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       Id:                  272a6f8b722310887317b3d7e10821ed3cfcc88dae7911945c10590be338c09c&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       Internal ip:         172.17.0.4&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       Initial network:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       Links:               -&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       Post create network:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       Post start network:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       Service root:        /var/lib/dokku/services/postgres/hasura-db&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       Status:              running&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       Version:             postgres:15.4&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上で構築したhasura-dbをhasuraアプリケーションにリンクする。ただし、この時点ではまだ&lt;code&gt;hasura&lt;/code&gt;はアプリケーションの設定がされていないので&lt;code&gt;App image (dokku/hasura:latest) not found&lt;/code&gt;のエラーが出るけどOK。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ dokku postgres:link hasura-db hasura&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-----&amp;gt; Setting config vars&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       DATABASE_URL:  postgres://postgres:&amp;lt;redacted&amp;gt;@dokku-postgres-hasura-db:5432/hasura_db&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-----&amp;gt; Restarting app hasura&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; !     App image &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;dokku/hasura:latest&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; not found&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;次にhasura向けの環境変数を設定する。HASURA_GRAPHQL_DATABASE_URLで指定するDSNは上のコマンドで得られた&lt;code&gt;DATABASE_URL&lt;/code&gt;をコピーしてくる。また、&lt;code&gt;your_admin_secret&lt;/code&gt;はパスワードみたいなものなので、ランダム文字列にするのが良い。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ dokku config:set hasura \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; HASURA_GRAPHQL_DATABASE_URL=&amp;#34;postgres://postgres:&amp;lt;redacted&amp;gt;@dokku-postgres-hasura-db:5432/hasura_db&amp;#34; \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; HASURA_GRAPHQL_ADMIN_SECRET=&amp;#34;your_admin_secret&amp;#34; \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; HASURA_GRAPHQL_ENABLE_CONSOLE=&amp;#34;true&amp;#34; \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; HASURA_GRAPHQL_SERVER_PORT=5000&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;次にhasuraアプリケーションのためのdocker imageをpullしてくる。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ docker pull hasura/graphql-engine:v2.36.1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;FAIL&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上のコマンドを実行するユーザーが&lt;code&gt;docker&lt;/code&gt;グループに所属していないと権限がなくてpullできないので、自分の場合は&lt;code&gt;dokku&lt;/code&gt;ユーザーになってpullした。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ sudo su - dokku&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ docker pull hasura/graphql-engine:v2.36.1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;そして最後に &lt;code&gt;dokku git:from-image&lt;/code&gt;コマンドでhasuraアプリケーションにpullしてきたimageを指定してアプリケーションとしてデプロイする。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ dokku git:from-image hasura hasura/graphql-engine:v2.36.1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これで &lt;code&gt;http://hasura.&amp;lt;your_dokku_domain&amp;gt;/&lt;/code&gt; のURLにアクセスするとHasura Consoleが表示されるはず。もしエラー画面が出ている場合は、/var/log/nginx/hasura-error.log を見てみると何かヒントがあるかもしれない。&lt;/p&gt;&#xA;&lt;h2 id=&#34;ハマった点&#34;&gt;ハマった点&lt;/h2&gt;&#xA;&lt;p&gt;Dokku上のコンテナのlisten portはデフォルトだと&lt;code&gt;5000&lt;/code&gt;になるということを知らずに、環境変数&lt;code&gt;HASURA_GRAPHQL_SERVER_PORT&lt;/code&gt;を指定していなかったため、Hasuraはデフォルトの8080でlistenしていてDokkuのNginxからDocker containerへのproxyがうまくできていなかった。&lt;/p&gt;&#xA;&lt;p&gt;そのため&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;We&#39;re sorry, but something went wrong. If you are the application owner check the logs for more information.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;のエラーがずっと出ていたけど(スクショ)、解決方法がなかなかググっても出てこずにハマった。&lt;/p&gt;&#xA;&lt;p&gt;Dokkuの&lt;a href=&#34;https://dokku.com/docs/networking/port-management/&#34;&gt;Port Managementのドキュメント&lt;/a&gt;に書いてはあるのだが、正直そんなの知らんわって思った。でもおかげでDokkuのport mappingの仕組みが理解できたので良かったけど。&lt;/p&gt;&#xA;&lt;h2 id=&#34;成功したら&#34;&gt;成功したら...&lt;/h2&gt;&#xA;&lt;p&gt;以下のような画面が出るので、&lt;code&gt;HASURA_GRAPHQL_ADMIN_SECRET&lt;/code&gt;の環境変数で指定したシークレットを入力するとめでたくHasuraのConsoleが見れるようになる。&lt;/p&gt;&#xA;&lt;p&gt;※この記事を書き終わってHasura on Dokkuの構築自体に満足してしまい、肝心のアプリケーションの作成はまだできていない。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B0BV8VCCYX?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;&lt;img src=&#34;https://m.media-amazon.com/images/I/518YvXHcICL._SL500_.jpg&#34; alt=&#34;Docker実践ガイド 第3版 impress top gearシリーズ&#34; loading=&#34;lazy&#34; title=&#34;Docker実践ガイド 第3版 impress top gearシリーズ&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B0BV8VCCYX?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;Docker実践ガイド 第3版 impress top gearシリーズ&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者:古賀政純&lt;/li&gt;&#xA;&lt;li&gt;インプレス&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B0BV8VCCYX?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;Amazon&lt;/a&gt;&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>squash mergeの環境でCascading PRsでコンフリクトした時</title>
				<link>https://journal.lampetty.net/posts/resolve-squash-merge-conflict/</link>
				<pubDate>Mon, 04 Dec 2023 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/resolve-squash-merge-conflict/</guid>
				<description>&lt;p&gt;最近以下のような記事を目にすることがあり、ちょうど自分もsquash mergeの環境でひとつ問題を抱えていたので、その話を自分のメモ代わりに書きたくなった。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tech.mobilefactory.jp/entry/2023/11/29/160000&#34;&gt;Git の Squash マージをやめた話 - Mobile Factory Tech Blog&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://wp.jmuk.org/2023/11/30/squash-and-merge%E3%81%97%E3%81%8B%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%AA%E3%81%84%E3%81%91%E3%81%A9%E5%85%A8%E3%81%8F%E5%9B%B0%E3%81%A3%E3%81%A6%E3%81%AA%E3%81%84/&#34;&gt;squash and mergeしか使ってないけど全く困ってない – Jun Mukai&#39;s blog&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;問題とは、上にある記事の&lt;code&gt;cascading PRs&lt;/code&gt;の話で、feature1 -&amp;gt; feature2 というようにbranchを派生して作った場合に、feature1 をmainにマージした後に作業ブランチを feature2 にして git rebase main すると、必ずコンフリクトが発生するので悩んでいた、ということ。&lt;/p&gt;&#xA;&lt;p&gt;解決策としては、以下にあるように&lt;code&gt;git rebase --onto main &amp;lt;last commit on feature1&amp;gt; &amp;lt;feature2 branch&amp;gt;&lt;/code&gt; をすればいい&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://stackoverflow.com/questions/68229841/avoiding-conflicts-in-git-when-merging-a-squashed-commit-from-main-into-feature&#34;&gt;stackoverflow.com&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;もしくは&lt;a href=&#34;https://wp.jmuk.org/2023/11/30/squash-and-merge%e3%81%97%e3%81%8b%e4%bd%bf%e3%81%a3%e3%81%a6%e3%81%aa%e3%81%84%e3%81%91%e3%81%a9%e5%85%a8%e3%81%8f%e5%9b%b0%e3%81%a3%e3%81%a6%e3%81%aa%e3%81%84/&#34;&gt;Jun Mukai&#39;s blog&lt;/a&gt;に書いてあるような以下の方法でもいいのかもしれない。そういえば &lt;code&gt;git rebase --skip&lt;/code&gt; って使ったことなかったな。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;PR1に由来するコンフリクトは自分にとっては自明だし、ほとんどの場合にはgit rebase –skipするだけだ。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/4774185930?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;&lt;img src=&#34;https://m.media-amazon.com/images/I/516gEDDGmoL._SL500_.jpg&#34; alt=&#34;【改訂新版】Gitポケットリファレンス&#34; loading=&#34;lazy&#34; title=&#34;【改訂新版】Gitポケットリファレンス&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/4774185930?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;【改訂新版】Gitポケットリファレンス&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者:岡本 隆史,武田 健太郎,相良 幸範&lt;/li&gt;&#xA;&lt;li&gt;技術評論社&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/4774185930?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;Amazon&lt;/a&gt;&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>VPSにDokkuをインストールする</title>
				<link>https://journal.lampetty.net/posts/install-dokku-on-vps/</link>
				<pubDate>Sat, 07 Oct 2023 20:10:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/install-dokku-on-vps/</guid>
				<description>&lt;p&gt;VPS上に&lt;a href=&#34;https://dokku.com/&#34;&gt;Dokku&lt;/a&gt;というものをインストールして、Dokku上でHello WorldするRailsアプリを動かすまでのメモ。&lt;/p&gt;&#xA;&lt;h2 id=&#34;why-dokku&#34;&gt;Why Dokku?&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://dokku.com/&#34;&gt;DokkuのWebサイト&lt;/a&gt;に書いてあるように、Dokkuはオープンソース版のHerokuという立ち位置のソフトウェア。かれこれ7年ぐらいHerokuを使い続けていてとても便利だと思っているのだけど、アプリケーションを1つ動かすのに$5かかるようになってしまった。昨今の円安で750円ぐらいかかるし、アプリを複数作るとなるとそれなりにお金がかかるので、VPSでDokkuを動かしその上でアプリケーションを稼働させるようにしたいと思った。&lt;/p&gt;&#xA;&lt;p&gt;また、&lt;a href=&#34;https://web.arena.ne.jp/indigo/&#34;&gt;WebARENA Indigo&lt;/a&gt;のVPSだと、2vCPUでメモリ2GBで税込814円 / 月という安さなので、これを使うとかなりコスト抑えられそうだなと思ったからだった。&lt;/p&gt;&#xA;&lt;h2 id=&#34;インストール&#34;&gt;インストール&lt;/h2&gt;&#xA;&lt;p&gt;以下の環境にDokku 0.32.3をインストールする。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;WebARENA IndigoのVPS(4vCPU, MEM 4GB, SSD 80GB)&lt;/li&gt;&#xA;&lt;li&gt;OS: Ubuntu 22.04&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;インストール自体は&lt;a href=&#34;https://dokku.com/docs/getting-started/install/debian/&#34;&gt;Dokkuのドキュメント&lt;/a&gt;の通り、aptを使ってインストールすれば特にハマることはないはず。&lt;/p&gt;&#xA;&lt;h2 id=&#34;sshの公開鍵の登録&#34;&gt;SSHの公開鍵の登録&lt;/h2&gt;&#xA;&lt;p&gt;アプリケーションのデプロイ時に&lt;code&gt;git push dokku ...&lt;/code&gt;とやる場合、sshの公開鍵が登録されていないと失敗するので、以下のコマンドで登録しておく。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ echo &amp;#39;CONTENTS_OF_ID_RSA_PUB_FILE&amp;#39; | sudo dokku ssh-keys:add admin&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;ドメインの設定&#34;&gt;ドメインの設定&lt;/h2&gt;&#xA;&lt;p&gt;インターネット上にDokkuを使ってアプリケーションを公開するためには、当然ながらドメインが必要なので用意しておく。自分は dokku.lampetty.net をベースドメインにして、これのサブドメインでアプリケーションを公開していくつもりなので、必要な設定をした。&lt;/p&gt;&#xA;&lt;p&gt;まず、 &lt;code&gt;domains:report&lt;/code&gt; コマンドで現状のドメインを確認する。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ dokku domains:report --global&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;=====&lt;/span&gt;&amp;gt; Global domains information&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       Domains global enabled:        &lt;span class=&#34;nb&#34;&gt;true&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       Domains global vhosts:         i-xxxxxxxxx&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;Domains global vhosts&lt;/code&gt;はデフォルトではホストマシンのホスト名になっているので、これを以下のコマンドで変更する。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;dokku domains:set-global dokku.lampetty.net&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;次に、&lt;code&gt;dokku.lampetty.net&lt;/code&gt; サブドメインがこのVPSのIPアドレスになるようにDNSレコードを定義する。Aレコードの方は別になくてもいいけど、IPとのマッピングは1箇所にしたいのでこうしている。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;dokku.lampetty.net A &amp;lt;VPSのIP&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;*.dokku.lampetty.net CNAME dokku.lampetty.net&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;digコマンドでDNSレコードを確認して、以下のように返ってくればOK。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ dig example.dokku.lampetty.net&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;example.dokku.lampetty.net. &lt;span class=&#34;m&#34;&gt;300&lt;/span&gt; IN      CNAME   dokku.lampetty.net.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これでドメインの設定は完了したので、サンプルアプリケーションをデプロイする。&lt;/p&gt;&#xA;&lt;h2 id=&#34;アプリケーションのデプロイ&#34;&gt;アプリケーションのデプロイ&lt;/h2&gt;&#xA;&lt;p&gt;サンプルアプリケーションのデプロイは&lt;a href=&#34;https://dokku.com/docs/deployment/application-deployment/&#34;&gt;ドキュメント&lt;/a&gt;通りにやって、最後に&lt;code&gt;git remote add dokku ...&lt;/code&gt;のところだけ、自分の環境に合わせて以下のようにやった。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ &lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; ruby-getting-started&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ git remote add dokku dokku@dokku.lampetty.net:ruby-getting-started&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ git push dokku main&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;動作確認&#34;&gt;動作確認&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://ruby-getting-started.dokku.lampetty.net/&#34;&gt;http://ruby-getting-started.dokku.lampetty.net/&lt;/a&gt; にアクセスして、以下の画面が表示されればアプリケーションがデプロイされている。(ruby-getting-started 以降のドメインは先ほど設定したドメイン)&lt;/p&gt;&#xA;&lt;p&gt;あとはアプリケーションを https でアクセスできるようにする対応なども必要だけど、いったんこれでVPS上にアプリケーションをデプロイできるようになりましたとさ。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/4798153222?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;&lt;img src=&#34;https://m.media-amazon.com/images/I/5130HDgosML._SL500_.jpg&#34; alt=&#34;プログラマのためのDocker教科書 第2版 インフラの基礎知識&amp;amp;コードによる環境構築の自動化&#34; loading=&#34;lazy&#34; title=&#34;プログラマのためのDocker教科書 第2版 インフラの基礎知識&amp;amp;コードによる環境構築の自動化&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/4798153222?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;プログラマのためのDocker教科書 第2版 インフラの基礎知識&amp;amp;コードによる環境構築の自動化&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者:WINGSプロジェクト 阿佐 志保&lt;/li&gt;&#xA;&lt;li&gt;翔泳社&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/4798153222?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;Amazon&lt;/a&gt;&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>ししまるとしろ</title>
				<link>https://journal.lampetty.net/posts/shishimaru-and-shiro/</link>
				<pubDate>Sat, 30 Sep 2023 20:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/shishimaru-and-shiro/</guid>
				<description>&lt;p&gt;最近、新しい猫を我が家に迎え入れた。名前は「しろ」。保護猫で年齢は5~6歳。岡山で多頭飼育の崩壊後ゴミ屋敷となった民家から保護された。その後、地元の預かりボランティアのお宅では他の猫と折り合いが悪く、ほぼケージ生活となったため、他に猫のいない家庭に譲渡したいということで東京に移動してきたところで、我が家で迎え入れることになった。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://cdn-ak.f.st-hatena.com/images/fotolife/o/oinume/20230930/20230930160943.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;ウチに来て間もない頃のしろ&lt;/p&gt;&#xA;&lt;p&gt;しろの話をする前に、このブログやTwitterにも登場していたししまるの話をしなければ、と思っている。ししまるは昨年の12月に虹の橋を渡ってしまった。昨年の夏から肺炎の症状があり投薬などで治療を続けていたが、(おそらく)間質性肺炎という難治性の病気で治ることなく他界してしまった。自分にとってはペットを飼うことが初めてで、当然その死に立ち会うのも初めてだったのでとてつもなく悲しかった。3ヶ月間は毎日ししまるの写真や動画を見ては泣いてしまうという状態が続いていたし、今でも病気で辛そうだったししまるのことを思い出すと泣いてしまう。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://cdn-ak.f.st-hatena.com/images/fotolife/o/oinume/20230930/20230930163317.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;ししまる&lt;/p&gt;&#xA;&lt;p&gt;その悲しさに一区切りつけられたのは、今年の4月に近所のお寺でペットの合同供養祭に参加したことだと思う。ペットを亡くした飼い主たちがお寺に集まり、お坊さんが供養のお経を唱えて線香をあげるという葬儀。人間と同じように葬儀を行うことで気持ちも少し整理された気がして、その後から「また猫を迎え入れる？」という話を妻とするようになった。そんな中で妻が保護猫のサイトで見つけたのがしろだった。色が白いところや雰囲気がなんとなくししまるに似ている...! ということで、本物を見に行ったところ、体重6.5kgの大きさがししまるっぽく、とてもビビりだけど人懐っこいということで、譲渡の申請＋トライアルで2週間ほどわが家に来てもらうことになった。&lt;/p&gt;&#xA;&lt;p&gt;うちに来た当初はずっと机の下に隠れていたけど、2,3日で家の中を探検するようになり、息子含めた全員になでなでをお願いするぐらい懐いていった。ししまるは息子にはあまり甘えなかったので、息子もとても嬉しかったらしい。&lt;/p&gt;&#xA;&lt;p&gt;ただ、ここで一つ問題が発生。ししまるの時は全然問題なかったのに、妻と息子の猫アレルギーが発動して、薬を飲まないとアレルギーの症状が抑えられず、「これだと迎え入れるのは厳しいかも」という状況になっていた。ひとまずトライアルを延長して、猫のアレルゲンを減らすキャットフードを試したり、体をまめにふく＆ブラッシングしたりして、なんとか薬を飲まなくても大丈夫な状態にまでなった。一緒に生活していると慣れてきてアレルギーがおさまったりすることもあるそうで、何が効いたのかはいまでもよくわかってないけど、問題が解決したので一旦良しとしている。&lt;/p&gt;&#xA;&lt;p&gt;というわけで、無事に9月にしろを正式に迎え入れることができて、また家に猫がいる生活が始まった。白猫のため、黒いシャツを着ているとしろの抜け毛が目立ってしまい頻繁にコロコロをかけないといけないあの生活がまた戻ってきたと思うと、面倒くさいながらちょっとニヤニヤしてしまう。ししまるは家に知らない人がきても興味を持って挨拶していたりしたけど、しろはビビりで引きこもってしまうところなど、さまざまな違いを発見できて面白い。&lt;/p&gt;&#xA;&lt;p&gt;ししまる、今まで本当に本当にありがとう。しろ、これからよろしくね。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Next.js &#43; Auth0でLogin handler failedのエラーを解消する</title>
				<link>https://journal.lampetty.net/posts/nextjs-auth0-resolve-login-handler-failed/</link>
				<pubDate>Tue, 02 May 2023 08:30:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/nextjs-auth0-resolve-login-handler-failed/</guid>
				<description>&lt;p&gt;Next.js + Auth0で認証機能を実装しようとして、&lt;a href=&#34;https://www.npmjs.com/package/@auth0/nextjs-auth0&#34;&gt;nextjs-auth0&lt;/a&gt;をセットアップしつつ、&lt;a href=&#34;https://auth0.com/docs/quickstart/webapp/nextjs/01-login&#34;&gt;このドキュメント&lt;/a&gt;通りにやっていたら、&lt;code&gt;AUTH0_ISSUER_BASE_URL&lt;/code&gt; の設定を間違えていて以下のエラーが出ていた。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;LoginHandlerError: Login handler failed. CAUSE: Discovery requests failing for http://localhost:3000, expected 200 OK, got: 404 Not Found&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上のauth0のドキュメントでは &lt;code&gt;AUTH0_ISSUER_BASE_URL=&#39;https://{yourDomain}&#39;&lt;/code&gt; との記述だったので、&lt;a href=&#34;http://localhost:3000&#34;&gt;http://localhost:3000&lt;/a&gt;を指定したのだけど、どうやらこれは&lt;code&gt;https://YOUR_AUTH0_DOMAIN.auth0.com&lt;/code&gt;を記述するのが正しいらしい。というわけでAuth0の該当アプリケーションのページから&lt;code&gt;Domain&lt;/code&gt;の部分をコピーしてきて&lt;code&gt;https://oinume.us.auth0.com&lt;/code&gt;のように指定すればOK。というか&lt;a href=&#34;https://www.npmjs.com/package/@auth0/nextjs-auth0&#34;&gt;nextjs-auth0&lt;/a&gt;にはそのように記載されていたのではじめからこっちを読んでおけばよかった...&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>multipassでAnsibleの動作確認用のVMを作る</title>
				<link>https://journal.lampetty.net/posts/multipass/</link>
				<pubDate>Wed, 12 Apr 2023 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/multipass/</guid>
				<description>&lt;h2 id=&#34;モチベーション&#34;&gt;モチベーション&lt;/h2&gt;&#xA;&lt;p&gt;趣味で開発しているプロダクトのためにVPSを立てていて、Ansibleで各種ミドルウェアの設定をしているんだけど、VirtualBoxのApple Silicon への対応が微妙なのでmultipassを使ってVMを立てる＋Ansible Playbookを流してセットアップするということをやってみたのでそのメモ。&lt;/p&gt;&#xA;&lt;h2 id=&#34;multipassでvmを立ち上げる&#34;&gt;multipassでVMを立ち上げる&lt;/h2&gt;&#xA;&lt;p&gt;まず初めにssh用の秘密鍵と公開鍵を生成する。multipassでVMを立ち上げるときはデフォルトでSSH用の鍵を生成してくれるけど、Ansibleでsshするときの鍵を作っておく。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ssh-keygen -t rsa -b &lt;span class=&#34;m&#34;&gt;4096&lt;/span&gt; -C multipass -f multipass&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;次に、以下のようなcloud-init.ymlを作成する。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;users:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  - default&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  - name: multipass&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    sudo: ALL=(ALL) NOPASSWD:ALL&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    ssh_authorized_keys:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      - &amp;#34;ssh-rsa &amp;lt;上で生成した公開鍵&amp;gt;&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;multipass launchでVMを立ち上げる時に、&lt;code&gt;--cloud-init&lt;/code&gt; オプションで先ほどのcloud-init.ymlを指定する。これを行うことでmultipassユーザーの authorized_keys に上で作成したSSHの公開鍵がセットされる。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;multipass launch -n vps -c=1 -m=1G -d=5G --cloud-init=cloud-init.yml&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;次にVMのIPアドレスを確認する。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;multipass info vps&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Name:           vps&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;State:          Running&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;IPv4:           192.168.64.13&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Release:        Ubuntu 22.04.2 LTS&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Image hash:     f6b5b3a980f2 &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;Ubuntu 22.04 LTS&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;CPU&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;s&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;:         &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Load:           0.20 0.11 0.04&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Disk usage:     1.4GiB out of 4.7GiB&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Memory usage:   151.3MiB out of 962.5MiB&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Mounts:         --&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ansibleのinventoryファイルを以下のようにする。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[local]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;default ansible_host=&amp;lt;上で調べたIP&amp;gt; ansible_port=22 ansible_user=&amp;#39;multipass&amp;#39; ansible_ssh_private_key_file=&amp;#39;multipass&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;最後にansible-playbookを実行する。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ANSIBLE_SSH_ARGS=&amp;#39;-o IdentitiesOnly=yes -o ControlMaster=auto -o ControlPersist=60s&amp;#39; ansible-playbook  --inventory-file=ansible/inventory/multipass  --timeout=30 -v -D ./ansible/hoge.yml&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;multipassのコマンドメモ&#34;&gt;multipassのコマンドメモ&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://multipass.run/docs/transfer-command&#34;&gt;multipass transfer&lt;/a&gt; : VMからファイルをコピーする or ホストからVMにファイルをコピーする&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;multipass shell&lt;/code&gt; : VM内にシェルでログインする&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B072K1NH76?tag=kazzhomeunixo-22&amp;amp;linkCode=osi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;&lt;img src=&#34;https://m.media-amazon.com/images/I/51h3XbUE5EL._SL500_.jpg&#34; alt=&#34;新しいLinuxの教科書&#34; loading=&#34;lazy&#34; title=&#34;新しいLinuxの教科書&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B072K1NH76?tag=kazzhomeunixo-22&amp;amp;linkCode=osi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;新しいLinuxの教科書&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者:三宅 英明,大角 祐介&lt;/li&gt;&#xA;&lt;li&gt;SBクリエイティブ&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B072K1NH76?tag=kazzhomeunixo-22&amp;amp;linkCode=osi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;Amazon&lt;/a&gt;&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>whisper.cppで文字起こしをやってみた</title>
				<link>https://journal.lampetty.net/posts/try-whisper-cpp/</link>
				<pubDate>Wed, 15 Mar 2023 08:30:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/try-whisper-cpp/</guid>
				<description>&lt;p&gt;自分の備忘録としてのやってみた系の話。OpenAIが提供するモデルを使って文字起こしをするC++実装の&lt;a href=&#34;https://github.com/ggerganov/whisper.cpp&#34;&gt;whisper.cpp&lt;/a&gt;を試してみた。&lt;/p&gt;&#xA;&lt;h2 id=&#34;環境&#34;&gt;環境&lt;/h2&gt;&#xA;&lt;p&gt;Apple M1 MacBook Air 2020 (Memory 16GB)&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;uname -a&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Darwin hogehoge.local 22.3.0 Darwin Kernel Version 22.3.0: Mon Jan &lt;span class=&#34;m&#34;&gt;30&lt;/span&gt; 20:39:35 PST 2023&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; root:xnu-8792.81.3~2/RELEASE_ARM64_T8103 x86_64&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;whispercppのビルド&#34;&gt;whisper.cppのビルド&lt;/h2&gt;&#xA;&lt;p&gt;以下のコマンドを実行してビルドする。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git clone https://github.com/ggerganov/whisper.cpp.git&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; whisper.cpp&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;make&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ビルドが成功すると、カレントディレクトリに main という名前のバイナリが出来上がる。&lt;/p&gt;&#xA;&lt;h2 id=&#34;モデルのダウンロード&#34;&gt;モデルのダウンロード&lt;/h2&gt;&#xA;&lt;p&gt;次にモデルのダウンロードをしておく。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;./&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;models&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;download&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ggml&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;model&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sh&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;large&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;文字起こしする音声ファイルのwavファイルを用意&#34;&gt;文字起こしする音声ファイルのwavファイルを用意&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;whisper.cppはwavファイルしか受け付けないので、ffmpegで動画ファイルをwavにする。&lt;/li&gt;&#xA;&lt;li&gt;ちょうど手元に会社で公開している&lt;a href=&#34;https://www.youtube.com/watch?v=k30W2Wz6GQw&#34;&gt;勉強会の動画&lt;/a&gt;があったので、これを使ってみる&lt;/li&gt;&#xA;&lt;li&gt;あと長いので最初の2分間だけを抽出。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;ffmpeg&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;~/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Downloads&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2023&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;02&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;13.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mp4&lt;/span&gt;  &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ar&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;16000&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;to&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;120&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2023&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;02&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;13.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;wav&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;whispercppで文字起こし&#34;&gt;whisper.cppで文字起こし&lt;/h2&gt;&#xA;&lt;p&gt;先ほど出力したwavファイルからwhisper.cppを使って文字起こしする。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;./main -m models/ggml-large.bin -f 2023-02-13.wav -l auto&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;注意点&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;-m&lt;/code&gt; でダウンロードしたモデルファイルを使う。&lt;code&gt;large&lt;/code&gt;だと精度が高い&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;-l auto&lt;/code&gt; を指定しないと日本語の文字起こししてくれないので指定する。もしくは&lt;code&gt;-l ja&lt;/code&gt;でもOK&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;文字起こしの結果。ちなみに2分の音声ファイルを文字起こしするのに82秒ぐらいかかっている。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[00:00:00.000 --&amp;gt; 00:00:01.000]  お願いします&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[00:00:01.000 --&amp;gt; 00:00:02.000]  お願いします&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[00:00:02.000 --&amp;gt; 00:00:11.120]  はい 本日 Dpエンジニアリングまで 第60回始めていきたいと思います&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[00:00:11.120 --&amp;gt; 00:00:12.120]  お願いします&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[00:00:12.120 --&amp;gt; 00:00:13.120]  お願いします&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[00:00:13.120 --&amp;gt; 00:00:14.120]  お願いします&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[00:00:14.120 --&amp;gt; 00:00:21.840]  今日は React 18かな 18から新しく 出たディファードバリューっていう&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[00:00:21.840 --&amp;gt; 00:00:28.440]  やつの紹介ですね もともとデバウンス とかスロットルみたいな感じで&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[00:00:28.440 --&amp;gt; 00:00:33.840]  各種ライブラリーが似たような やつやってたんですけど そうじゃ&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[00:00:33.840 --&amp;gt; 00:00:38.800]  なくて結構UIのアップデートで 最適化したやつが出ましたよっていう&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[00:00:38.800 --&amp;gt; 00:00:44.320]  ので もともとデバウンスっていう 本当はスロットルも出したかったん&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[00:00:44.320 --&amp;gt; 00:00:49.200]  ですけど React 18でスロットルのやつ がバグっていてとあるライブラリー&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[00:00:49.200 --&amp;gt; 00:00:54.000]  でパッてデモが用意できなかったん ですけど 一応デバウンスだけ紹介&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[00:00:54.000 --&amp;gt; 00:01:04.120]  しておくと 18入力した後に時間差 で18入力されるという 今これ1秒&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[00:01:04.120 --&amp;gt; 00:01:09.680]  かな 1秒ってやってるので 最後に 入力した後1秒後に値が更新される&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[00:01:09.680 --&amp;gt; 00:01:15.400]  ってやつですね 連続で入力してる 間はデバウンスバリューは変わん&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[00:01:15.400 --&amp;gt; 00:01:20.840]  ないけれど 止めてから1秒すると デバウンスバリューは変わる これ&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[00:01:20.840 --&amp;gt; 00:01:27.120]  何使いたいかっていうと インクリメンタル サーチとか オリジンのところを&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[00:01:27.120 --&amp;gt; 00:01:31.600]  見てもらうと 一文字変わるごとに サーチ検索API叩きまくってると&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[00:01:31.600 --&amp;gt; 00:01:38.320]  重すぎるし 重すぎるので デバウンス みたいにユーザーの操作が終わった&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[00:01:38.320 --&amp;gt; 00:01:44.560]  後にAPI一回叩くみたいな感じで やってあげるっていう スロットル&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[00:01:44.560 --&amp;gt; 00:01:50.280]  の場合は1秒ごとに発火される っていうイメージなので 例えば&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[00:01:50.280 --&amp;gt; 00:01:55.240]  デバウンスバリューはこれ 最後 操作終わるまではデバウンスバリュー&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[00:01:55.240 --&amp;gt; 00:02:00.040]  更新されないですけど スロットル だった場合は1秒ごとに発火されて&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;最後に会社の勉強会の宣伝&#34;&gt;最後に会社の勉強会の宣伝&lt;/h2&gt;&#xA;&lt;p&gt;ドクターズプライムでは、DP Engineering Mondayという名前で毎週勉強会をやってます。月に1回、社外向けに開催したものをYouTubeで配信しているので、よかったらチャンネル登録してください。技術スタックはReact, TypeScript, ChakraUI, Go, GCP, Hasura, PostgreSQLなので、その周辺の話が多いです。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/@dr.sprimedev8416&#34;&gt;www.youtube.com&lt;/a&gt;&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>2023年に読みたい本</title>
				<link>https://journal.lampetty.net/posts/want-to-read-books-in-2023/</link>
				<pubDate>Mon, 30 Jan 2023 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/want-to-read-books-in-2023/</guid>
				<description>&lt;p&gt;最近読書量が減ってきたので、今年は読書を頑張ろう！と思ったのでまずは読みたい本をリストアップしてみる。&lt;/p&gt;&#xA;&lt;h2 id=&#34;プロを目指す人のためのtypescript入門&#34;&gt;プロを目指す人のためのTypeScript入門&lt;/h2&gt;&#xA;&lt;p&gt;仕事でTypeScript書いてるんだけど、型システムが難しすぎて詰まっているので、体系的に理解したい。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/4297127474?tag=kazzhomeunixo-22&amp;amp;linkCode=osi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;&lt;img src=&#34;https://m.media-amazon.com/images/I/510GhCOD1FL._SL500_.jpg&#34; alt=&#34;プロを目指す人のためのTypeScript入門 安全なコードの書き方から高度な型の使い方まで (Software Design plus)&#34; loading=&#34;lazy&#34; title=&#34;プロを目指す人のためのTypeScript入門 安全なコードの書き方から高度な型の使い方まで (Software Design plus)&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/4297127474?tag=kazzhomeunixo-22&amp;amp;linkCode=osi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;プロを目指す人のためのTypeScript入門 安全なコードの書き方から高度な型の使い方まで (Software Design plus)&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者:鈴木 僚太&lt;/li&gt;&#xA;&lt;li&gt;技術評論社&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/4297127474?tag=kazzhomeunixo-22&amp;amp;linkCode=osi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;Amazon&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;データ指向アプリケーションデザイン&#34;&gt;データ指向アプリケーションデザイン&lt;/h2&gt;&#xA;&lt;p&gt;分厚いけど良書だと噂の本。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/4873118700?tag=kazzhomeunixo-22&amp;amp;linkCode=osi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;&lt;img src=&#34;https://m.media-amazon.com/images/I/51T&amp;#43;k4VRzpL._SL500_.jpg&#34; alt=&#34;データ指向アプリケーションデザイン ―信頼性、拡張性、保守性の高い分散システム設計の原理&#34; loading=&#34;lazy&#34; title=&#34;データ指向アプリケーションデザイン ―信頼性、拡張性、保守性の高い分散システム設計の原理&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/4873118700?tag=kazzhomeunixo-22&amp;amp;linkCode=osi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;データ指向アプリケーションデザイン ―信頼性、拡張性、保守性の高い分散システム設計の原理&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者:Martin Kleppmann&lt;/li&gt;&#xA;&lt;li&gt;オライリー・ジャパン&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/4873118700?tag=kazzhomeunixo-22&amp;amp;linkCode=osi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;Amazon&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;モダンソフトウェアエンジニアリング&#34;&gt;モダン・ソフトウェアエンジニアリング&lt;/h2&gt;&#xA;&lt;p&gt;これも良書だと噂なので。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/4798165220?tag=kazzhomeunixo-22&amp;amp;linkCode=osi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;&lt;img src=&#34;https://m.media-amazon.com/images/I/61-mYyDfR1L._SL500_.jpg&#34; alt=&#34;モダン・ソフトウェアエンジニアリング&#34; loading=&#34;lazy&#34; title=&#34;モダン・ソフトウェアエンジニアリング&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/4798165220?tag=kazzhomeunixo-22&amp;amp;linkCode=osi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;モダン・ソフトウェアエンジニアリング&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者:Ivar Jacobson,Harold “Bud&amp;quot; Lawson,Pan-Wei Ng,Paul E. McMahon,Michael Goedicke&lt;/li&gt;&#xA;&lt;li&gt;翔泳社&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/4798165220?tag=kazzhomeunixo-22&amp;amp;linkCode=osi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;Amazon&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;a-philosophy-of-software-design-2nd-edition&#34;&gt;A Philosophy of Software Design, 2nd Edition&lt;/h2&gt;&#xA;&lt;p&gt;いい加減読み終わりたい...&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B09B8LFKQL?tag=kazzhomeunixo-22&amp;amp;linkCode=osi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;&lt;img src=&#34;https://m.media-amazon.com/images/I/51MaNQzHTQL._SL500_.jpg&#34; alt=&#34;A Philosophy of Software Design, 2nd Edition (English Edition)&#34; loading=&#34;lazy&#34; title=&#34;A Philosophy of Software Design, 2nd Edition (English Edition)&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B09B8LFKQL?tag=kazzhomeunixo-22&amp;amp;linkCode=osi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;A Philosophy of Software Design, 2nd Edition (English Edition)&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者:Ousterhout, John K.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B09B8LFKQL?tag=kazzhomeunixo-22&amp;amp;linkCode=osi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;Amazon&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;詳解-システムパフォーマンス-第2版&#34;&gt;詳解 システム・パフォーマンス 第2版&lt;/h2&gt;&#xA;&lt;p&gt;めちゃくちゃ評判がいい本なので。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/4814400071?tag=kazzhomeunixo-22&amp;amp;linkCode=osi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;&lt;img src=&#34;https://m.media-amazon.com/images/I/41HM64PoOdL._SL500_.jpg&#34; alt=&#34;詳解 システム・パフォーマンス 第2版&#34; loading=&#34;lazy&#34; title=&#34;詳解 システム・パフォーマンス 第2版&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/4814400071?tag=kazzhomeunixo-22&amp;amp;linkCode=osi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;詳解 システム・パフォーマンス 第2版&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者:Brendan Gregg&lt;/li&gt;&#xA;&lt;li&gt;オライリージャパン&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/4814400071?tag=kazzhomeunixo-22&amp;amp;linkCode=osi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;Amazon&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;lifespanライフスパン-老いなき世界&#34;&gt;LIFESPAN(ライフスパン): 老いなき世界&lt;/h2&gt;&#xA;&lt;p&gt;最近老いが気になってきたので...&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/4492046747?tag=kazzhomeunixo-22&amp;amp;linkCode=osi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;&lt;img src=&#34;https://m.media-amazon.com/images/I/51RhzsLtSAL._SL500_.jpg&#34; alt=&#34;LIFESPAN(ライフスパン): 老いなき世界&#34; loading=&#34;lazy&#34; title=&#34;LIFESPAN(ライフスパン): 老いなき世界&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/4492046747?tag=kazzhomeunixo-22&amp;amp;linkCode=osi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;LIFESPAN(ライフスパン): 老いなき世界&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者:デビッド・A・シンクレア,マシュー・D・ラプラント&lt;/li&gt;&#xA;&lt;li&gt;東洋経済新報社&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/4492046747?tag=kazzhomeunixo-22&amp;amp;linkCode=osi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;Amazon&lt;/a&gt;&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>AlfredからRaycastに移行した</title>
				<link>https://journal.lampetty.net/posts/alfred-to-raycast/</link>
				<pubDate>Mon, 02 Jan 2023 08:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/alfred-to-raycast/</guid>
				<description>&lt;p&gt;最近は&lt;a href=&#34;https://www.raycast.com/&#34;&gt;Raycast&lt;/a&gt;が巷で流行っているので、自分もAlfredから乗り換えてみた。Alfredはv5への移行をずっと保留にしていてタイミング的にも良かったというのが一番大きい。ちなみに自分はAlfredの有料課金のライトユーザーで、以下の機能を使っていた。&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;通常のランチャー機能&lt;/li&gt;&#xA;&lt;li&gt;HotKey - よく使うアプリをHotKeyとして登録&lt;/li&gt;&#xA;&lt;li&gt;Clipboard history - クリップボードの履歴&lt;/li&gt;&#xA;&lt;li&gt;ブラウザのブックマーク検索&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;ライトユーザーなので、とてもスムーズに移行できた。&lt;/p&gt;&#xA;&lt;p&gt;また、Raycastの拡張機能でいいなと思ったのは&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Screenshotの検索とコピーが簡単にできる&lt;/li&gt;&#xA;&lt;li&gt;Emojiの検索が簡単にできる&lt;/li&gt;&#xA;&lt;li&gt;カレンダー連携すると直近のMeeting URLにRaycastから飛べる&#xA;&lt;ul&gt;&#xA;&lt;li&gt;なので「あ、Meetingだ！」って思ったらRaycastを開いておけばいい、という体験が良い&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Switch Windowsで開いているウィンドウを選択して開ける&#xA;&lt;ul&gt;&#xA;&lt;li&gt;これまではcontextsというアプリを使っていたけど不要になった&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Quicklinkの機能で簡単に指定のURLに飛ぶリンクが作成できる&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;の5点。色んな拡張が&lt;a href=&#34;https://www.raycast.com/store&#34;&gt;Store&lt;/a&gt;にあるので、有用そうなものを日々探してインストールしている。まだ使い始めて3日ぐらいだけど、そろそろAlfredはアンインストールしようかなと思うぐらい馴染んでいる。&lt;/p&gt;&#xA;&lt;p&gt;続編: &lt;a href=&#34;https://journal.lampetty.net/entry/raycast-one-year-later&#34;&gt;Raycastを使い始めて1年経った - oinume journal&lt;/a&gt;&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>OpenTelemetryとhttptrace.ClientTraceを使ってHTTPリクエストのlatencyを可視化する</title>
				<link>https://journal.lampetty.net/posts/opentelemetry-httptrace/</link>
				<pubDate>Mon, 11 Jul 2022 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/opentelemetry-httptrace/</guid>
				<description>&lt;p&gt;この記事は &lt;a href=&#34;https://journal.lampetty.net/entry/opencensus-httptrace&#34;&gt;OpenCensusとhttptrace.ClientTraceを使ってHTTPリクエストのlatencyを可視化する - oinume journal&lt;/a&gt; のOpenTelemetry版。OpenTelemetryについては &lt;a href=&#34;https://newrelic.com/jp/blog/best-practices/what-is-opentelemetry&#34;&gt;OpenTelemetryとは何か、そしてなぜそれが計装器の未来なのか？ | New Relic&lt;/a&gt; を見てもらうのが手っ取り早くて、&lt;a href=&#34;https://pkg.go.dev/net/http/httptrace#ClientTrace&#34;&gt;httptrace.ClientTrace&lt;/a&gt;については先のブログを見てもらえればと。&lt;/p&gt;&#xA;&lt;h2 id=&#34;opentelemetry-tracing--httptraceclienttrace&#34;&gt;OpenTelemetry Tracing + httptrace.ClientTrace&lt;/h2&gt;&#xA;&lt;p&gt;早速本題に入ってしまうと、以下のようなコードを書くことでhttp.ClientでHTTPリクエストを送った際のlatencyを可視化することが可能になる。&lt;/p&gt;&#xA;&lt;p&gt;以下のように otelhttptrace.NewClientTraceで生成したClientTraceを&lt;code&gt;ctx&lt;/code&gt;にセットし、その&lt;code&gt;ctx&lt;/code&gt;をhttp.Requestにセットするだけで良い。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;clientTrace := otelhttptrace.NewClientTrace(ctx)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ctx = httptrace.WithClientTrace(ctx, clientTrace)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;req, err := http.NewRequestWithContext(ctx, &amp;#34;GET&amp;#34;, url, nil)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;...&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;jaeger-uiでの確認&#34;&gt;Jaeger UIでの確認&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/oinume/go-http-client-trace-sample/&#34;&gt;https://github.com/oinume/go-http-client-trace-sample/&lt;/a&gt; のリポジトリをcloneして&lt;code&gt;docker-compose up -d&lt;/code&gt;するとJaegerが立ち上げることができる。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ git clone https://github.com/oinume/go-http-client-trace-sample&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ docker-compose up -d&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ go run ./examples/otelhttp_client_trace/main.go&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;のように、Jaegerを立ち上げてサンプルコードを実行するとJaegerのexporterにトレースの情報が送られる。そのトレースの情報は &lt;a href=&#34;http://localhost:16686/search&#34;&gt;http://localhost:16686/search&lt;/a&gt; にブラウザでアクセスすると見ることができる。以下のスクショを見てもらうとわかるように、&lt;code&gt;http.getconn&lt;/code&gt;や&lt;code&gt;http.dns&lt;/code&gt;や&lt;code&gt;http.tls&lt;/code&gt;など、httptrace.ClientTraceのコールバックメソッドごとにSpanが作成され、それがどのぐらい時間がかかっているのかがわかるようになっている。&lt;/p&gt;&#xA;&lt;h2 id=&#34;opencensusとopentelemetryの違い&#34;&gt;OpenCensusとOpenTelemetryの違い&lt;/h2&gt;&#xA;&lt;p&gt;httptrace.ClientTraceに関わるところで、OpenCensusとOpenTelemetryで微妙に挙動が違うところがあったので、メモしておく。&lt;/p&gt;&#xA;&lt;p&gt;OpenCensusの場合はデフォルトでは&lt;code&gt;http.getconn&lt;/code&gt;や&lt;code&gt;http.dns&lt;/code&gt;などの情報がSpanにならないが、OpenTelemetryの場合はそれぞれSpanになっている。この挙動で注意した方が良いのは、例えばGCPのCloud Traceだと&lt;a href=&#34;https://cloud.google.com/stackdriver/pricing#trace-costs&#34;&gt;スパン単位で従量課金される&lt;/a&gt;ので、場合によっては金額が大きくなってしまうかもしれない。しかし、以下のように&lt;a href=&#34;https://pkg.go.dev/go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace#WithoutSubSpans&#34;&gt;WithoutSubSpans&lt;/a&gt;を指定することでSpanを生成しないようにすることができる。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;clientTrace := otelhttptrace.NewClientTrace(ctx, otelhttptrace.WithoutSubSpans())&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;最後に&#34;&gt;最後に&lt;/h2&gt;&#xA;&lt;p&gt;OpenTelemetryのTracingについては各言語のSDKも揃ってきて、クラウドベンダーの対応もされてきているので、そろそろ実戦投入していこうと思った。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/4873118700?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;&lt;img src=&#34;https://m.media-amazon.com/images/I/51T&amp;#43;k4VRzpL._SL500_.jpg&#34; alt=&#34;データ指向アプリケーションデザイン ―信頼性、拡張性、保守性の高い分散システム設計の原理&#34; loading=&#34;lazy&#34; title=&#34;データ指向アプリケーションデザイン ―信頼性、拡張性、保守性の高い分散システム設計の原理&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/4873118700?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;データ指向アプリケーションデザイン ―信頼性、拡張性、保守性の高い分散システム設計の原理&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者:Martin Kleppmann&lt;/li&gt;&#xA;&lt;li&gt;オライリー・ジャパン&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/4873118700?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;Amazon&lt;/a&gt;&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Chapter 5 - Information Hiding (and Leakage) / A Philosophy of Software Design</title>
				<link>https://journal.lampetty.net/posts/chapter5-software-design-book/</link>
				<pubDate>Tue, 15 Mar 2022 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/chapter5-software-design-book/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B09B8LFKQL?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;&lt;img src=&#34;https://m.media-amazon.com/images/I/51MaNQzHTQL._SL500_.jpg&#34; alt=&#34;A Philosophy of Software Design, 2nd Edition (English Edition)&#34; loading=&#34;lazy&#34; title=&#34;A Philosophy of Software Design, 2nd Edition (English Edition)&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B09B8LFKQL?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;A Philosophy of Software Design, 2nd Edition (English Edition)&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者:Ousterhout, John K.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B09B8LFKQL?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;Amazon&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;第5章は&lt;code&gt;Information Hiding (and Leakage)&lt;/code&gt;というタイトル。いいモジュールを作るには情報の隠蔽(カプセル化)を行うことが大事だよ、という話。&lt;/p&gt;&#xA;&lt;h2 id=&#34;51-information-hiding&#34;&gt;5.1 Information hiding&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Deep Moduleを作る上で最も大事なのは情報の隠蔽&lt;/li&gt;&#xA;&lt;li&gt;モジュールを実装する上で必要なメカニズムをinterfaceとして表には出さないこと&#xA;&lt;ul&gt;&#xA;&lt;li&gt;ex)&#xA;&lt;ul&gt;&#xA;&lt;li&gt;B-treeにどういう情報を保存するか&lt;/li&gt;&#xA;&lt;li&gt;ファイルの中身が物理的なディスクのブロックのどこに存在するかを認識する方法&lt;/li&gt;&#xA;&lt;li&gt;TCPプロトコルの実装の詳細&lt;/li&gt;&#xA;&lt;li&gt;マルチコアCPUでのスレッドの実装&lt;/li&gt;&#xA;&lt;li&gt;JSONをどうやってパースしているか&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;情報の隠蔽は2つの方法で複雑性を減らす&#xA;&lt;ul&gt;&#xA;&lt;li&gt;情報の隠蔽はモジュールのインターフェースをシンプルにする&#xA;&lt;ul&gt;&#xA;&lt;li&gt;具体例) B-tree classを開発者が使うときに、理想的なノードの広がりやツリー内部の均衡化については、利用者は気にしなくて良い&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;情報の隠蔽はシステムの発展を容易にする&#xA;&lt;ul&gt;&#xA;&lt;li&gt;情報がモジュール外には隠蔽されている＝(モジュール外からみて)その情報への依存性がなくなっているので、その情報に関する内部的な設計の変更の影響はモジュール内部のみである&#xA;&lt;ul&gt;&#xA;&lt;li&gt;例えば、TCPでネットワーク混雑時の制御についてプロトコルの仕様が新しく追加されても、TCPのデータの送受信のコードには影響がないはずである&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;52-information-leakage&#34;&gt;5.2 Information leakage&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;直訳すると情報の漏洩。情報の隠蔽の反対の概念&lt;/li&gt;&#xA;&lt;li&gt;これはモジュール間の依存を作り出してしまう&lt;/li&gt;&#xA;&lt;li&gt;情報の漏洩はインターフェースだけで起こるものではない&#xA;&lt;ul&gt;&#xA;&lt;li&gt;例えば特定のファイルフォーマットを扱う2つのクラスがあり、片方がファイルを読み込み、もう片方が書き込みをするような場合。ファイルのフォーマットが変更された時は両方のクラスを修正する必要がある。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;情報の漏洩もまたred flag(危険信号)&lt;/li&gt;&#xA;&lt;li&gt;情報の漏洩をどうやって防ぐか？&#xA;&lt;ul&gt;&#xA;&lt;li&gt;先ほどの2つのクラスの例であれば、クラスが小さくて密接に関連しているのであればマージして1つにしてしまうのが良い&lt;/li&gt;&#xA;&lt;li&gt;情報をpull(取得)してカプセル化するクラスを新しく作る、という方法もある。&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Another possible approach is to pull the information out of all of the affected classes and create a new class that encapsulates just that information. However, this approach will be effective only if you can find a simple interface that abstracts away from the details; if the new class exposes most of the knowledge through its interface, then it won’t provide much value (you’ve simply replaced back-door leakage with leakage through an interface).&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;53-temporal-decomposition&#34;&gt;5.3 Temporal decomposition&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;時間による分解&lt;/li&gt;&#xA;&lt;li&gt;Temporal decompositionの考え方で「ファイルを読み込んで、その内容を変更して、新しいバージョンを書き出す」というアプリケーションを考えると、3つのクラスに分解される。&#xA;&lt;ul&gt;&#xA;&lt;li&gt;ファイルを読むクラスと新しいバージョンを書き出すクラスはそれぞれファイルのフォーマットを知っている必要があるので、ここで情報の漏洩が発生する&lt;/li&gt;&#xA;&lt;li&gt;情報の漏洩を防ぐには、ファイルを読むクラスと書き込むクラスは同じものにする必要がある&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;時間による処理の順番でクラスを分解するのではなく、そのクラスが行う処理が知識として何を持っているべきか(先程の例だとファイルのフォーマット)に着目してクラスを分解するべき&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;54-example-http-server&#34;&gt;5.4  Example: HTTP server&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;生徒がHTTPプロトコルの実装をした際のデザインの意思決定について、実際の例を交えて考察&lt;/li&gt;&#xA;&lt;li&gt;HTTPプロトコル説明の図&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;55-example-too-many-classes&#34;&gt;5.5 Example: too many classes&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;生徒がよくやってしまう間違いとしては、たくさんのShallow Classに分割してそのクラス間での情報漏洩をもたらしてしまうこと&#xA;&lt;ul&gt;&#xA;&lt;li&gt;例) ネットワークコネクションからHTTPリクエストを読み込んでstringに変換するクラスを作り、別のクラスでそのstringをパースする&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Temporal Decompositionのダメな例&lt;/li&gt;&#xA;&lt;li&gt;例えばContent-Length headerでbodyの長さが指定されているので、Bodyの長さを計算するにはまずContent-Lengthをパースしないといけない&#xA;&lt;ul&gt;&#xA;&lt;li&gt;stringになったリクエストをパースする時にBodyの長さがわからないとパースできない&lt;/li&gt;&#xA;&lt;li&gt;コードの具体例がなかったのでちょっとここはよくわからなかった&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;結果として、2つのクラスに分割してもそれぞれがHTTPリクエストの構造を知っていないとダメな実装になっている&lt;/li&gt;&#xA;&lt;li&gt;さらに呼び出し側も2つのクラスの使い方を知っている必要が出てくるので、呼び出し側に余計な認知負荷がかかる&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;よって、上の例ではリクエストを読み込むクラスとパースするクラスは一つにマージした方が良い&#xA;&lt;ul&gt;&#xA;&lt;li&gt;HTTPリクエストをパースという処理を１クラスに集約することで情報の漏洩が発生しない&lt;/li&gt;&#xA;&lt;li&gt;クラスの数を減らすことで利用者から見たインターフェースはシンプルになる&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;56-example-http-parameter-handling&#34;&gt;5.6 Example: HTTP parameter handling&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;HTTP requestがサーバーに来ると、サーバーはリクエストの情報を参照する必要がある&lt;/li&gt;&#xA;&lt;li&gt;例えば、以前のFigure 5.1で言うとphoto_idというリクエストパラメーター&#xA;&lt;ul&gt;&#xA;&lt;li&gt;パラメーターはURLのQuery Stringとして送られてくることもあれば、ボディで送られてくることもある&lt;/li&gt;&#xA;&lt;li&gt;Query Stringの場合はURLEncodeされているが、処理する時にはこれはデコードされている必要がある&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;著者の生徒の大半は以下の良い情報の隠蔽を行なっていた&#xA;&lt;ul&gt;&#xA;&lt;li&gt;パラメータはQuery StringまたはBody経由で送信されてくるが、それを利用する人にはどちらから来ているかは重要ではないのでマージしている&lt;/li&gt;&#xA;&lt;li&gt;2つ目の良いところは、パラメーターのデコードについて利用者が意識しなくて済むようにしていること&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;ただし、生徒が作るモジュールは以下の点でShallow Moduleだった&#xA;&lt;ul&gt;&#xA;&lt;li&gt;HTTPRequestというクラスを作ってその中に &lt;code&gt;Map&amp;lt;String, String&amp;gt; getParams()&lt;/code&gt; というメソッドを定義していた&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    public Map&amp;lt;String, String&amp;gt; getParams() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      return this.params;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;Map&amp;lt;String, String&amp;gt;&lt;/code&gt; という内部のデータ型を利用者に公開するのではなく、&lt;code&gt;String getParam(String name)&lt;/code&gt; という形にした方が、仮に内部のデータ構造を変えたいときに利用者に影響を与えずに済む&lt;/li&gt;&#xA;&lt;li&gt;パフォーマンスチューニングのために内部のデータ構造を変更することもあるので、なるべく内部のデータ構造は利用者からは見えないようにした方が良い&lt;/li&gt;&#xA;&lt;li&gt;あとはこのMapを利用者側で変更できないようにImmutableにする必要があるなどの問題もある&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;57-example-defaults-in-http-responses&#34;&gt;5.7  Example: defaults in HTTP responses&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;HTTP Responseに関する、生徒たちがよくやる不適切なデフォルト値について説明&lt;/li&gt;&#xA;&lt;li&gt;HTTP ResponseのHTTPのバージョンに関して&#xA;&lt;ul&gt;&#xA;&lt;li&gt;(生徒の)あるチームはメソッドの呼び出し元にHTTPのバージョンを指定させるようにしていた&lt;/li&gt;&#xA;&lt;li&gt;しかし、HTTPのバージョンはリクエストで指定されているものと一致しているべき&lt;/li&gt;&#xA;&lt;li&gt;なので、リクエストのHTTPバージョンをそのままレスポンスのバージョンとすることが望ましい&lt;/li&gt;&#xA;&lt;li&gt;呼び出し元がHTTPのバージョンを指定すると、このHTTPのライブラリと呼び出し元の間で情報の漏洩が発生してしまう&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;HTTPレスポンスに必要なものとしてDateヘッダーもある&#xA;&lt;ul&gt;&#xA;&lt;li&gt;これもHTTPライブラリが気の利いたデフォルト値を提供すると良い&lt;/li&gt;&#xA;&lt;li&gt;もし呼び出し元が何かしらの理由でDateヘッダーをオーバーライドしたい場合は、専用のメソッドを用意する&lt;/li&gt;&#xA;&lt;li&gt;クラス or モジュールはできる限りいい感じのデフォルト値を用意する&lt;/li&gt;&#xA;&lt;li&gt;P.26のJavaのIOバッファリングは、この点でよくない例となっている&#xA;&lt;ul&gt;&#xA;&lt;li&gt;IOライブラリのほとんどのユーザーはバッファリングするのでそれがデフォルトになっているべきだが、Javaの標準ライブラリではバッファリングのために別のクラスを使ってラップする必要がある&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    FileInputStream fileStream = new FileInputStream(fileName);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    BufferedInputStream bufferedStream = new BuffferedInputStream(fileStream);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#xA;&lt;li&gt;Red Flag: Overexposure(過度の露出)&#xA;&lt;ul&gt;&#xA;&lt;li&gt;よく使われるAPIが、たまにしか使われない機能もユーザーに覚えさせるようにしてしまうと、認知負荷を増大させてしまう(意味がよくわからなかった)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;510-conclusion&#34;&gt;5.10 Conclusion&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;情報の隠蔽とDeep Modulesは密接に関連している&lt;/li&gt;&#xA;&lt;li&gt;モジュールがたくさんの情報を隠蔽することで、インタフェースをシンプルにしつつ多くの機能が提供される&lt;/li&gt;&#xA;&lt;li&gt;システムをモジュールに分解するときに、実行時に行われる処理の順番を意識しないようにすること&#xA;&lt;ul&gt;&#xA;&lt;li&gt;以前に説明したTemporal decompositionが発生し情報の漏洩やShallow modulesの問題を引き起こす&lt;/li&gt;&#xA;&lt;li&gt;モジュールが知っているべき知識を考慮してそれを各モジュールがカプセル化することで、Deep modulesを作ることができる&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>2022年の抱負</title>
				<link>https://journal.lampetty.net/posts/resolution-in-2022/</link>
				<pubDate>Mon, 31 Jan 2022 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/resolution-in-2022/</guid>
				<description>&lt;p&gt;もうすっかり年が明けてしまって1月末ですが、今年の目標というか抱負を書いておこうかなと思います。&lt;/p&gt;&#xA;&lt;h2 id=&#34;健康第一&#34;&gt;健康第一&lt;/h2&gt;&#xA;&lt;p&gt;最近は風邪をひいたりすると仕事でもプライベートでも明らかに悪影響が出るので、健康第一で生きたい。その意味で以下を引き続き習慣として頑張る。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;筋トレ&lt;/li&gt;&#xA;&lt;li&gt;有酸素運動&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;有酸素運動はジョギングや早歩きの散歩だと膝が痛くなってしまい、色々と試した結果、マンションの階段昇降が一番コスパ良いかつ膝へのダメージが少ないということが昨年分かったので、1日20分 / 週4を目安に頑張る。&lt;/p&gt;&#xA;&lt;h2 id=&#34;graphqlnextjsでwebアプリを作れるようになる&#34;&gt;GraphQL+Next.jsでWebアプリを作れるようになる&lt;/h2&gt;&#xA;&lt;p&gt;昨年は趣味プロダクトのReact Hooks + React Query化が終わったので、今年はGraphQL+Next.jsを導入しつつ学びたい。具体的には以下を使っていきたい。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Next.js&lt;/li&gt;&#xA;&lt;li&gt;GraphQL&#xA;&lt;ul&gt;&#xA;&lt;li&gt;gqlgen&lt;/li&gt;&#xA;&lt;li&gt;apollo-client&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;英語&#34;&gt;英語&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;iKnowを週5&lt;/li&gt;&#xA;&lt;li&gt;Camblyが良さそうなのでトライ&lt;/li&gt;&#xA;&lt;li&gt;TOEICを年に2回受ける&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;をやる。DMM英会話はやめてしまったけど、値段的にはCamblyが良さそうなので試してみる。&lt;/p&gt;&#xA;&lt;h2 id=&#34;アウトプット&#34;&gt;アウトプット&lt;/h2&gt;&#xA;&lt;p&gt;1ヶ月に1つはちゃんとした記事を書く。昨年に引き続き継続は力なり、ということで。&lt;/p&gt;&#xA;&lt;h2 id=&#34;というわけで&#34;&gt;というわけで&lt;/h2&gt;&#xA;&lt;p&gt;2022年もやっていきだ！&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://cdn-ak.f.st-hatena.com/images/fotolife/o/oinume/20220130/20220130100849.png&#34; alt=&#34;f:id:oinume:20220130100849p:plain&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>2021年の振り返り</title>
				<link>https://journal.lampetty.net/posts/review-2021/</link>
				<pubDate>Fri, 31 Dec 2021 23:53:43 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/review-2021/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;https://journal.lampetty.net/entry/resolution-in-2021&#34;&gt;2021年の抱負 - oinume journal&lt;/a&gt;で年初に考えていた抱負がどうだったのか？を振り返ってみる。&lt;/p&gt;&#xA;&lt;h2 id=&#34;習慣化&#34;&gt;習慣化&lt;/h2&gt;&#xA;&lt;p&gt;Habitifyというアプリを1年使い続けてみたけど、習慣化するものとそうじゃないものがあった。ある程度習慣化したものはiKnow(英単語)だけで、その他は習慣化しなかった。Habitify、通知してくれるのはいいんだけど習慣化するにはモチベーションも維持する必要があるので、その点ではあまり役に立たなかったように思う。何かいいアプリがあったら乗り換えたい。&lt;/p&gt;&#xA;&lt;p&gt;というわけでこれは達成度20%ぐらい。&lt;/p&gt;&#xA;&lt;h2 id=&#34;reactでspa作れるようになる&#34;&gt;ReactでSPA作れるようになる&lt;/h2&gt;&#xA;&lt;p&gt;趣味で開発しているプロダクトで、ログイン後の動的なページはReact化が終わった。まだSPAにはできていないけど、React + React Queryを使って動的なページを作るのはできるようになったので、来年はGraphQL + Next.jsを導入してみたい。&lt;/p&gt;&#xA;&lt;h2 id=&#34;英語&#34;&gt;英語&lt;/h2&gt;&#xA;&lt;p&gt;今年は6月にTOEICを受けて自己ベストを更新 &amp;amp; 800点超えしたのが地味に嬉しかった(この時の問題が異常に簡単だったという説もある)。来年も自己ベストを更新できるように頑張りたい。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;TOEIC自己ベストを更新していたので思わずガッツポーズしてしまった。&lt;/p&gt;&#xA;&lt;p&gt;— oinume@Dr.’s Prime (@oinume) &lt;a href=&#34;https://twitter.com/oinume/status/1204629862327021569?ref_src=twsrc%5Etfw&#34;&gt;December 11, 2019&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;英語のレッスン自体は週1でやっていたのだけど、DMM英会話時代からお世話になっていた先生が育休に入ってしまうということで3ヶ月ぐらい中断している。来年は再開してこれも習慣化したい。&lt;/p&gt;&#xA;&lt;h2 id=&#34;アウトプット&#34;&gt;アウトプット&lt;/h2&gt;&#xA;&lt;p&gt;月に1エントリは書くという目標だったけど、2,3,4,5,10月が達成できず。いつものように仕事が忙しくなってしまうとアウトプットが疎かになってしまうので、月初からちゃんとネタを仕込みつつアウトプットできるようにする。&lt;/p&gt;&#xA;&lt;h2 id=&#34;ライブ&#34;&gt;ライブ&lt;/h2&gt;&#xA;&lt;p&gt;海外アーティストが来れないので、そっちは諦めて邦楽のライブに3回ほど参戦。本当はGWのビバラも行くはずだったんだけどコロナが怖くて断念。これがずっと心残りだったので、デルタ株がピークだったけど散々悩んだ挙句、死ぬ気で8/6にZeppまで足を運んだ。もはや生き甲斐がライブぐらいしかないので、不謹慎で危険な行為だとは思ったけど行って良かったと思う。神経すり減らしながらも爆音が鳴っている中で「生きてる」って感じがして、なんとも言えない感覚だった。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;8/6 Straightener &amp;amp; Dragon Ash @ Zepp Tokyo&lt;/li&gt;&#xA;&lt;li&gt;10/14 ROTTENGRAFFTY @ Zepp DiverCity&lt;/li&gt;&#xA;&lt;li&gt;12/28 Creepy Nuts &amp;amp; Dragon Ash @ Zepp Tokyo&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;昨日はZepp Tokyoでライブ納め。Creepy Nutsかっこ良かったしDragon Ashは神セトリで締めにふさわしいライブだった。来年ももっとライブ行きたい &lt;a href=&#34;https://t.co/uQDgXqX4vh&#34;&gt;pic.twitter.com/uQDgXqX4vh&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;— oinume@Dr.’s Prime (@oinume) &lt;a href=&#34;https://twitter.com/oinume/status/1476163912135770112?ref_src=twsrc%5Etfw&#34;&gt;December 29, 2021&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;&#xA;&lt;p&gt;2021年もパンデミックであまり旅行も行けなかったけど、ライブにも映画にも行けたし2020年よりはパンデミックに慣れてきた気がする。2022年はライブハウスでモッシュとかダイブができる世の中になるといいなぁと思っている。海外旅行も行きたいですね。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Chapter 4 - Modules Should Be Deep / A Philosophy of Software Design</title>
				<link>https://journal.lampetty.net/posts/chapter4-software-design-book/</link>
				<pubDate>Mon, 27 Dec 2021 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/chapter4-software-design-book/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B09B8LFKQL?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;&lt;img src=&#34;https://m.media-amazon.com/images/I/51MaNQzHTQL._SL500_.jpg&#34; alt=&#34;A Philosophy of Software Design, 2nd Edition (English Edition)&#34; loading=&#34;lazy&#34; title=&#34;A Philosophy of Software Design, 2nd Edition (English Edition)&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B09B8LFKQL?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;A Philosophy of Software Design, 2nd Edition (English Edition)&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者:Ousterhout, John K.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B09B8LFKQL?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;Amazon&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;第4章は&lt;code&gt;Modules Should Be Deep&lt;/code&gt;というタイトル。&lt;/p&gt;&#xA;&lt;h2 id=&#34;41-modular-design&#34;&gt;4.1 Modular Design&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;ソフトウェアの複雑性を管理するためのもっとも大事なテクニックの一つとして、全体の複雑性の一部分だけに直面するようにシステムを設計するということが挙げられる。このアプローチは modular design と呼ばれている。&lt;/li&gt;&#xA;&lt;li&gt;この手法を用いると、ソフトウェアシステムは複数のモジュール(クラス, サブシステム, サービス)に分解される。&lt;/li&gt;&#xA;&lt;li&gt;それぞれのモジュールは相互に依存せず独立しているため、開発者はあるモジュールの開発をしている時に他のモジュールのことを考えなくて良い&lt;/li&gt;&#xA;&lt;li&gt;しかし、上記の独立性の話はあくまで理想で実際にはそんなことはない&#xA;&lt;ul&gt;&#xA;&lt;li&gt;例えば、あるメソッドに引数を追加した場合はその呼び出し元のコードも変更しないといけない&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;依存の認識と管理をするためには、モジュールをinterfaceとimplementationの2つに分けることが大事である&lt;/li&gt;&#xA;&lt;li&gt;Typically, the interface describes what the module does but not how it does it.&#xA;&lt;ul&gt;&#xA;&lt;li&gt;interfaceはそのモジュールが「何をするか」を表明し、それを「どうやるか」については表明しない&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;あるモジュールの開発者は、そのモジュールのinterfaceと実装、およびそのモジュールが依存している他のモジュールのinterfaceを知っている必要があるが、他のモジュールの実装については知らなくても大丈夫である&lt;/li&gt;&#xA;&lt;li&gt;interfaceが実装に比べてとてもシンプルに表現されているモジュールがベスト&lt;/li&gt;&#xA;&lt;li&gt;上記のようなモジュールは2つのメリットがある&#xA;&lt;ul&gt;&#xA;&lt;li&gt;シンプルなインタフェースを提供するモジュールは、他のモジュールにもたらす複雑性を少なくする&lt;/li&gt;&#xA;&lt;li&gt;インターフェースが変更されない限り、他のモジュールには影響がない。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;42-whats-in-an-interface&#34;&gt;4.2 What&#39;s in an Interface?&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;interfaceにはformal, informalな情報がある&lt;/li&gt;&#xA;&lt;li&gt;formal: メソッドのシグネチャ(引数およびその型、戻り値およびその型)&#xA;&lt;ul&gt;&#xA;&lt;li&gt;プログラミング言語の機能によってもたらされる&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;informal: そのメソッドを呼び出した時にもたらされる結果など&#xA;&lt;ul&gt;&#xA;&lt;li&gt;eg) 引数で与えられたファイル名のファイルを削除するなど&lt;/li&gt;&#xA;&lt;li&gt;informalな情報はメソッドのコメントで説明されることが多い&lt;/li&gt;&#xA;&lt;li&gt;Method Bを呼ぶ前にMethod Aを呼ぶ必要がある、みたいなものもinformalな情報である。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;43-abstraction&#34;&gt;4.3 Abstraction&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Abstractionとは、実体から重要ではない詳細を除外したもの&lt;/li&gt;&#xA;&lt;li&gt;間違った抽象化には以下の2つがある&#xA;&lt;ul&gt;&#xA;&lt;li&gt;抽象化したが、重要ではないものを含んでしまう&#xA;&lt;ul&gt;&#xA;&lt;li&gt;結果的に他の開発者の認知負荷をあげてしまう&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;抽象化して重要なものを隠してしまう(false abstraction)&#xA;&lt;ul&gt;&#xA;&lt;li&gt;そのモジュールがシンプルなものだと誤解させてしまう&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;良い抽象化の例として、ファイルシステムが挙げられる&#xA;&lt;ul&gt;&#xA;&lt;li&gt;ファイルにデータを書き込む時に、ユーザーはそのデータがストレージデバイスのどのブロックに書き込まれるかなどは意識しない&lt;/li&gt;&#xA;&lt;li&gt;これはファイルシステムがうまく抽象化されていて、ユーザーにとっての不必要な情報を除外しているから&lt;/li&gt;&#xA;&lt;li&gt;一方で、書き込んだデータのフラッシュについての情報は除外されていない&#xA;&lt;ul&gt;&#xA;&lt;li&gt;例えばデータベースのようなソフトウェアだと、「システムがクラッシュしてもファイルに必ず書き込まれているか」を保証するために、「実際のストレージにいつデータが書き込まれるか(=フラッシュされるか)」は知っておく必要がある。そのためこの情報は抽象化されても利用者からわかるようになっている。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;44-deep-modules&#34;&gt;4.4 Deep Modules&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;モジュールの深さはコストとベネフィットで考える&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;モジュールのコスト：システムの複雑性。interfaceによって表現される&lt;/li&gt;&#xA;&lt;li&gt;小さくてシンプルなインターフェースだと複雑性は少なくなる&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;以下がコストとベネフィットの説明の図&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;UnixのFile I/O はdeep interfaceの良い例&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;以下の図のようにinterfaceはシンプルだが、実装は以下のような複雑である&#xA;&lt;ul&gt;&#xA;&lt;li&gt;ディスク上での効率的なアクセスのためのファイルの実装&lt;/li&gt;&#xA;&lt;li&gt;ディレクトリ構造とその階層構造&lt;/li&gt;&#xA;&lt;li&gt;ファイルのパーミッション&lt;/li&gt;&#xA;&lt;li&gt;interruption, background code、およびこれらのやりとり&lt;/li&gt;&#xA;&lt;li&gt;同時アクセスが発生した場合のスケジューリング&lt;/li&gt;&#xA;&lt;li&gt;アクセスしたファイルのメモリ上のキャッシュ&lt;/li&gt;&#xA;&lt;li&gt;セカンダリのストレージデバイス(ディスク、Flashドライブなど)を一つのファイルシステムに統合する&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;上記のような複雑なものは利用者からは見えない一方で、何年もの時間を経て大幅に進化している&lt;/li&gt;&#xA;&lt;li&gt;別の例だと、ガベージコレクションもdeep interfaceである&#xA;&lt;ul&gt;&#xA;&lt;li&gt;利用者がほとんど意識しなくていいものだが、実装はとても複雑という意味で。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;45-shallow-modules&#34;&gt;4.5 Shallow modules&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;interfaceが(提供する機能と比較して)複雑であること&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  private void addNullValueForAttribute(String attirubte) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      data.put(attribute, null);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;上のコードは何も抽象化していない&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;もしこのメソッドのドキュメントを適切に書いたとしたら、コードより長いドキュメントになる&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Shallow moduleはRed Flag&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;A shallow module is one whose interface is complicated relative to the functionality it provides. Shallow modules don’t help much in the battle against complexity, because the benefit they provide (not having to learn about how they work internally) is negated by the cost of learning and using their interfaces. Small modules tend to be shallow.&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Shallow moduleは提供するベネフィットをラーニングコストで打ち消してしまっている&#xA;&lt;ul&gt;&#xA;&lt;li&gt;小さいモジュールがshallow moduleになりやすい&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;(個人的に思ったこと)Clean Architectureって割とshallow moduleになりやすいのでは？と思った。例えばinfrastructure層とか、クライアントライブラリのメソッド呼ぶだけみたいなのが多い&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;クライアントライブラリ自体をinfrastructure層に見立てるというやり方もあるっぽい&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;46-classitis&#34;&gt;4.6 Classitis&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;昨今だとクラスは小さくする方が好まれている。メソッドも同様で「N行超えたら分割するべき」みたいな風潮がある&lt;/li&gt;&#xA;&lt;li&gt;しかし、Deep Classを目指すのであれば、クラスは大きくなる傾向にある&lt;/li&gt;&#xA;&lt;li&gt;Classitis&#xA;&lt;ul&gt;&#xA;&lt;li&gt;The extreme of the “classes should be small” approach is a syndrome&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Classitisはたくさんのクラスを生み出し、それぞれのクラスはシンプルになるが全体のシステムとして見ると複雑性が高まる&#xA;&lt;ul&gt;&#xA;&lt;li&gt;小さいクラスはそれ単体では十分な機能を提供できない&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;47-examples-java-and-unix-io&#34;&gt;4.7 Examples: Java and Unix I/O&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Classitisの典型的な例としてJavaのIOまわりのクラスの話がある。例えばJavaでオブジェクトをファイルから読むときのコードは以下のようになっている。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;FileInputStream fileStream = new FileInputStream(fileName);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;BufferedInputStream bufferedStream = new BuffferedInputStream(fileStream);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ObjectInputStream objectStream = new ObjetInputStream(bufferedStream);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;....&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#xA;&lt;li&gt;バッファリングは基本的にみんな使うので、上記のように専用のクラスを使わないと有効にならないデザインよりかは、よくあるケースに対してシンプルなデザインになっていた方が良い&#xA;&lt;ul&gt;&#xA;&lt;li&gt;この例だとデフォルトでバッファリングを有効にして、オプションで無効にできるとか。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;対照的な例として、Unix Filesystemはシンプルになっている。&#xA;&lt;ul&gt;&#xA;&lt;li&gt;シーケンシャルIOが最も一般的に使われるので、それをデフォルトの挙動にしている&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;read&lt;/code&gt;はシーケンシャルアクセスで、 &lt;code&gt;lseek&lt;/code&gt; でランダムアクセスもできるようになっている&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;48-conclusion&#34;&gt;4.8 Conclusion&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;interfaceを抽象化してシンプルなものにして、複雑な実装はinterfaceから除外することが大事&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>Chapter 3 - Working Code Isn’t Enough / A Philosophy of Software Design</title>
				<link>https://journal.lampetty.net/posts/chapter3-software-design-book/</link>
				<pubDate>Wed, 01 Dec 2021 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/chapter3-software-design-book/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/exec/obidos/ASIN/B09B8LFKQL/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://m.media-amazon.com/images/I/51MaNQzHTQL._SL500_.jpg&#34; alt=&#34;A Philosophy of Software Design, 2nd Edition (English Edition)&#34; loading=&#34;lazy&#34; title=&#34;A Philosophy of Software Design, 2nd Edition (English Edition)&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/exec/obidos/ASIN/B09B8LFKQL/kazzhomeunixo-22/&#34;&gt;A Philosophy of Software Design, 2nd Edition (English Edition)&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者:Ousterhout, John&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/exec/obidos/ASIN/B09B8LFKQL/kazzhomeunixo-22/&#34;&gt;Amazon&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;第3章は&lt;code&gt;Working Code Isn’t Enough (Strategic vs. Tactical Programming)&lt;/code&gt;というタイトル。&lt;/p&gt;&#xA;&lt;h2 id=&#34;tactical-programming&#34;&gt;Tactical Programming&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;近視眼的に目の前のタスクを終わらせるためにコードを書く&lt;/li&gt;&#xA;&lt;li&gt;目の前のタスクを終わらせることが最優先になるので、これだといい設計はもたらされない&lt;/li&gt;&#xA;&lt;li&gt;これが積もり積もってシステムに複雑性をもたらす&lt;/li&gt;&#xA;&lt;li&gt;開発メンバー全員がこのアプローチで開発すると一気に複雑性が高まる&lt;/li&gt;&#xA;&lt;li&gt;tactical tornado&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Almost every software development organization has at least one developer who takes tactical programming to the extreme: a tactical tornado.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;strategic-programming&#34;&gt;Strategic Programming&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;The first step towards becoming a good software designer is to realize that working code isn’t enough.&#xA;&lt;ul&gt;&#xA;&lt;li&gt;working code = 動くコードの意味？&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Your primary goal must be to produce a great design, which also happens to work. This is strategic programming.&#xA;&lt;ul&gt;&#xA;&lt;li&gt;第一のゴールを素晴らしいデザインでかつきちんと動作するものにするべき&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;良いデザインに対して投資する、という考え方を持つべき&#xA;&lt;ul&gt;&#xA;&lt;li&gt;最初に思い浮かんだ設計のアイデアをそのまま実装するのではなく、少し時間をかけてよりシンプルな設計がないかを模索する時間をかけるべき&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;どのぐらい良い設計のために時間をさくべきか？&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作業の10-20%とこの本ではいっている&lt;/li&gt;&#xA;&lt;li&gt;良いデザインにそのぐらいコストをかけると、数ヶ月後にはそのベネフィットを感じることができる&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;スタートアップと良い設計への投資&#xA;&lt;ul&gt;&#xA;&lt;li&gt;スタートアップで10-20%コストをかけることは現実的ではないと考えられているため、大抵のスタートアップではTacticalなアプローチが採用される&lt;/li&gt;&#xA;&lt;li&gt;Facebook is an example of a startup that encouraged tactical programming&lt;/li&gt;&#xA;&lt;li&gt;the company’s motto was “Move fast and break things.”&lt;/li&gt;&#xA;&lt;li&gt;Over time the company realized that its culture was unsustainable. Eventually, Facebook changed its motto to “Move fast with solid infrastructure”&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>Chapter 2 - The Nature of Complexity / A Philosophy of Software Design</title>
				<link>https://journal.lampetty.net/posts/chapter2-software-design-book/</link>
				<pubDate>Tue, 30 Nov 2021 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/chapter2-software-design-book/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/exec/obidos/ASIN/B09B8LFKQL/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://m.media-amazon.com/images/I/51MaNQzHTQL._SL500_.jpg&#34; alt=&#34;A Philosophy of Software Design, 2nd Edition (English Edition)&#34; loading=&#34;lazy&#34; title=&#34;A Philosophy of Software Design, 2nd Edition (English Edition)&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/exec/obidos/ASIN/B09B8LFKQL/kazzhomeunixo-22/&#34;&gt;A Philosophy of Software Design, 2nd Edition (English Edition)&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者:Ousterhout, John&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/exec/obidos/ASIN/B09B8LFKQL/kazzhomeunixo-22/&#34;&gt;Amazon&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;第2章は&amp;quot;The Nature of Complexity&amp;quot;というタイトルで、ソフトウェアのComplexityつまり複雑性についてじっくり説明されている。&lt;/p&gt;&#xA;&lt;h2 id=&#34;complexityの定義&#34;&gt;Complexityの定義&lt;/h2&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Complexity is anything related to the structure of a software system that makes it hard to understand and modify the system.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;Complexityの3つの症状&lt;/p&gt;&#xA;&lt;h2 id=&#34;1-change-amplification&#34;&gt;1. Change amplification&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- とある機能追加・変更をしたいだけなのに、いろんなところを変更しないといけない。以下の図で言うと、背景色を変更したいだけなのに`bg = &amp;#34;red&amp;#34;`の定義が複数箇所あるため、これらを全て修正しないといけない、みたいな。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;2-cognitive-load&#34;&gt;2. Cognitive load&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;認知負荷。開発者が機能追加・変更のタスクを完了させるためにどのぐらいシステムの内部を知っている必要があるか、と言うこと。多ければ多いほど把握できなくなり、修正漏れなどのバグが発生することになる。&lt;/li&gt;&#xA;&lt;li&gt;システム設計者は時々コードの行数で複雑性を表そうとするが、1行に処理が集約されてすぎていて逆に認知負荷を高めるケースもある。1行より複数行のコードの方がシンプルになっている場合もある&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;3-unknown-unknowns&#34;&gt;3. Unknown unknowns&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;開発者が機能追加・変更のタスクを完了させるために、どの部分を変更すればいいのかが明らかではないこと。もしくはどの部分を変更すればいいのかの情報が明らかではないこと&lt;/li&gt;&#xA;&lt;li&gt;上の図だと、「背景色を変更したい」と言うタスクがある時に、bannerBgを変更しても全てのページの背景色が変わらないので、どの部分を変更すればいいのかが分かりにくい&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>Chapter 1 - Intruduction / A Philosophy of Software Design</title>
				<link>https://journal.lampetty.net/posts/chapter1-software-design-book/</link>
				<pubDate>Mon, 29 Nov 2021 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/chapter1-software-design-book/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/exec/obidos/ASIN/B09B8LFKQL/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://m.media-amazon.com/images/I/51MaNQzHTQL._SL500_.jpg&#34; alt=&#34;A Philosophy of Software Design, 2nd Edition (English Edition)&#34; loading=&#34;lazy&#34; title=&#34;A Philosophy of Software Design, 2nd Edition (English Edition)&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/exec/obidos/ASIN/B09B8LFKQL/kazzhomeunixo-22/&#34;&gt;A Philosophy of Software Design, 2nd Edition (English Edition)&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者:Ousterhout, John&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/exec/obidos/ASIN/B09B8LFKQL/kazzhomeunixo-22/&#34;&gt;Amazon&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;A Philosophy of Software Design の第1章を読んだのでそのまとめ。&lt;/p&gt;&#xA;&lt;h2 id=&#34;intro&#34;&gt;Intro&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;プログラムは機能が増えるごとに複雑さが増していく。複雑さが増えると、開発スピードが遅くなりバグが増える&lt;/li&gt;&#xA;&lt;li&gt;開発ツールは複雑性に対処するに役立つが、これには限界がある。一方、シンプルなソフトウェアのデザインはより大きくてパワフルなプログラムを導いてくれる。&lt;/li&gt;&#xA;&lt;li&gt;複雑性に対処するには2つのアプローチがある。&#xA;&lt;ul&gt;&#xA;&lt;li&gt;1つ目はコードをシンプルかつ明らか（わかりやすく）すること。例えば複雑性は特殊ケースを削除することで減らすことができる。&lt;/li&gt;&#xA;&lt;li&gt;2つ目のアプローチはカプセル化でmodular design とよばれている。&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Modular designではソフトウェアをモジュールに分割して管理して(OOPだとクラスとか)それぞれのモジュールは他のものに依存しない。&lt;/li&gt;&#xA;&lt;li&gt;そのため、プログラマーはあるモジュールの開発をするときに、他のモジュールの詳細を知らなくて済む。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;ウォーターフォールモデルの紹介&#34;&gt;ウォーターフォールモデルの紹介&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;ウォーターフォールだと基本的には設計フェーズではすべてを設計し、開発のフェーズでは設計をしない。ソフトウェアは物理的なシステムより複雑で目に見えないので、特に大きなシステムであるほど全体を細部まで理解することは難しい。&lt;/li&gt;&#xA;&lt;li&gt;開発フェーズで初めて問題がわかるケースもよくあり、場合によっては設計のやり直しが発生する。ウォーターフォールモデルだとこれは大きな手戻りになってしまう。&lt;/li&gt;&#xA;&lt;li&gt;この問題があるため、最近のソフトウェア開発ではアジャイルのようなインクリメンタルなアプローチが使われている。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;how-to-use-this-book&#34;&gt;How to use this book&lt;/h2&gt;&#xA;&lt;p&gt;ソフトウェアの設計スキルを向上させるための良い手法の一つは、&amp;quot;red flags&amp;quot;という複雑なソースコードの断片のサインを認識することである。この本ではその&amp;quot;red flags&amp;quot;を、メジャーな設計の問題を通じて説明する。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>A Philosophy of Software Designを読み始めた</title>
				<link>https://journal.lampetty.net/posts/a-philosophy-of-software-design/</link>
				<pubDate>Sun, 28 Nov 2021 14:54:17 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/a-philosophy-of-software-design/</guid>
				<description>&lt;p&gt;タイトル通りで、最近第2版が発売されたのと、いろんなところでオススメされていたのでこの本を読んでいる。やっと第6章まで読み終わったので、それぞれの章のまとめをブログにアップしていく予定。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B09B8LFKQL?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;&lt;img src=&#34;https://m.media-amazon.com/images/I/51MaNQzHTQL._SL500_.jpg&#34; alt=&#34;A Philosophy of Software Design, 2nd Edition (English Edition)&#34; loading=&#34;lazy&#34; title=&#34;A Philosophy of Software Design, 2nd Edition (English Edition)&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B09B8LFKQL?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;A Philosophy of Software Design, 2nd Edition (English Edition)&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者:Ousterhout, John K.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B09B8LFKQL?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;Amazon&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;以下は読んだ章のINDEX.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://journal.lampetty.net/entry/chapter1-software-design-book&#34;&gt;Chapter 1 - Intruduction / A Philosophy of Software Design - oinume journal&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://journal.lampetty.net/entry/chapter2-software-design-book&#34;&gt;Chapter 2 - The Nature of Complexity / A Philosophy of Software Design - oinume journal&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://journal.lampetty.net/entry/chapter3-software-design-book&#34;&gt;Chapter 3 - Working Code Isn’t Enough / A Philosophy of Software Design - oinume journal&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://journal.lampetty.net/entry/chapter4-software-design-book&#34;&gt;Chapter 4 - Modules Should Be Deep / A Philosophy of Software Design - oinume journal&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://journal.lampetty.net/entry/chapter5-software-design-book&#34;&gt;Chapter 5 - Information Hiding (and Leakage) / A Philosophy of Software Design - oinume journal&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>JavaScriptの記号の演算子と構文</title>
				<link>https://journal.lampetty.net/posts/javascript-operators-and-syntaxes/</link>
				<pubDate>Tue, 07 Sep 2021 18:09:10 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/javascript-operators-and-syntaxes/</guid>
				<description>&lt;p&gt;JavaScript / TypeScript では一見すると「これなんだ？」という記号の演算子や構文がよく出てくるので、自分用の備忘録としてメモしておく。&lt;a href=&#34;https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators&#34;&gt;式と演算子 - JavaScript | MDN&lt;/a&gt;には演算子の一覧のページがあるため、わからない記号が出てきたら以下のページを見るとだいたい載っているはず。&lt;/p&gt;&#xA;&lt;h2 id=&#34;---nullish-coalescing-operator&#34;&gt;?? - Nullish coalescing operator&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing_operator&#34;&gt;Null 合体 (??) - JavaScript | MDN&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Null 合体演算子 (??) は論理演算子の一種です。この演算子は左辺が null または undefined の場合に右の値を返し、それ以外の場合に左の値を返します。&lt;/li&gt;&#xA;&lt;li&gt;例えば以下のコードだと、aがnull or undefinedの場合は &lt;code&gt;a is null or undefined&lt;/code&gt; がvalに代入される&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;val&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;??&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;a is null or undefined&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;---double-not-operator&#34;&gt;!! - Double not operator&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_NOT#double_not_!!&#34;&gt;Logical NOT (!) - JavaScript | MDN&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;複数の否定演算子を連続して使用することで、明示的にあらゆる値を対応する論理型プリミティブに変換することができます。&lt;/li&gt;&#xA;&lt;li&gt;否定の否定なので肯定ということになり、元の値をbooleanに変換するということらしい&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;val&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!!&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// val is always boolean&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;---optional-chaining-operator&#34;&gt;?. - Optional chaining operator&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Optional_chaining&#34;&gt;オプショナルチェーン (?.) - JavaScript | MDN&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;?.&lt;/code&gt; 演算子の機能は . チェーン演算子と似ていますが、参照が nullish (null または undefined) の場合にエラーとなるのではなく、式が短絡され undefined が返されるところが異なります。関数呼び出しで使用すると、与えられた関数が存在しない場合、 undefined を返します。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;val&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;?&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;?&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// aがnull or undefinedの場合 val が undefinedになる&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;---spread-syntax&#34;&gt;... - Spread syntax&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Spread_syntax&#34;&gt;スプレッド構文 - JavaScript | MDN&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;スプレッド構文 (...) を使うと、配列式や文字列などの反復可能オブジェクトを、0 個以上の引数 (関数呼び出しの場合) や要素 (配列リテラルの場合) を期待された場所で展開したり、オブジェクト式を、0 個以上のキーと値のペア (オブジェクトリテラルの場合) を期待された場所で展開したりすることができます。&lt;/li&gt;&#xA;&lt;li&gt;一番多用されるのは配列やオブジェクトをコピーするときなのではないかと思われる&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;arr&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;];&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;arr2&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[...&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;arr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;];&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// arr.slice()みたいな&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;---non-null-assertion-operator&#34;&gt;! - Non-null assertion operator&lt;/h2&gt;&#xA;&lt;p&gt;これはJavaScriptではなくてTypeScriptにしかない演算子。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-0.html#non-null-assertion-operator&#34;&gt;TypeScript: Documentation - TypeScript 2.0&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;以下のようなコードの時に、&lt;code&gt;e&lt;/code&gt;がundefinedまたはnullではないことを保証して、&lt;code&gt;name&lt;/code&gt;にアクセスできる&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// Compiled with --strictNullChecks&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;validateEntity&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;?:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Entity&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;// Throw exception if e is null or invalid entity&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;processEntity&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;?:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Entity&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;validateEntity&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;s&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// Assert that e is non-null and access name&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
			</item>
			<item>
				<title>TypeScriptのDestructuring assignment</title>
				<link>https://journal.lampetty.net/posts/typescript-destructuring-assignment/</link>
				<pubDate>Tue, 10 Aug 2021 10:08:43 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/typescript-destructuring-assignment/</guid>
				<description>&lt;p&gt;最近仕事でfrontendの開発を少しずつやるようになったのだけど、TypeScriptはGoに比べて演算子や記号を使う記法が多くて読むのに一苦労する。なので「これなんだろう？」と思ったやつをメモしておく。&lt;/p&gt;&#xA;&lt;p&gt;TypeScriptやっていて一番最初に「ん？」と思ったのは、以下のような構文だった。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;obj&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;hello&amp;#39;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;const&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;myTitle&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;obj&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;★&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;myTitle&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;hello&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;★のコードでは&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;obj というオブジェクトから title という要素を取り出して&lt;/li&gt;&#xA;&lt;li&gt;myTitleという定数を宣言&lt;/li&gt;&#xA;&lt;li&gt;myTitleに 1. で取り出した要素を代入する&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;ということをやっている。&lt;code&gt;myTitle&lt;/code&gt;が定数宣言であるのに対して、キーの&lt;code&gt;title&lt;/code&gt;は単純にオブジェクトのキーなので特に何かが宣言されているわけでない、ということが初めはわかっていなかったのでこの構文を見るたびに頭が混乱していた。&lt;/p&gt;&#xA;&lt;p&gt;調べてみると、これはJS由来の構文で&lt;code&gt;Destructuring assignment&lt;/code&gt;と呼ぶらしい。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment&#34;&gt;Destructuring assignment - JavaScript | MDN&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://basarat.gitbook.io/typescript/future-javascript/destructuring&#34;&gt;Destructuring - TypeScript Deep Dive&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;上の例ではオブジェクトから要素を取り出す例だったが、当然配列から特定の要素を取り出すこともできる。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;array&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;first&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;second&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;array&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;first&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;さらにスプレッド構文 &lt;code&gt;...&lt;/code&gt; を使って以下のような代入も可能。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[a, b, ...rest] = [10, 20, 30, 40, 50];&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;console.log(rest); [30, 40, 50] &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Goと違って多値が返せないからこういう構文が必要になるのかなと思ったのだけど、どうなんだろう？&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Go1.17beta1でGenericsに触れてみた</title>
				<link>https://journal.lampetty.net/posts/play-with-go-type-params/</link>
				<pubDate>Wed, 14 Jul 2021 08:30:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/play-with-go-type-params/</guid>
				<description>&lt;p&gt;Go1.17beta1がダウンロードできるようになったので、Generics(Type Parameters)でStackを書いて軽く遊んだメモ。&lt;/p&gt;&#xA;&lt;h2 id=&#34;generics-type-parametersについて&#34;&gt;Generics (Type Parameters)について&lt;/h2&gt;&#xA;&lt;p&gt;最新の仕様のProposalは以下を見ると良い。&lt;/p&gt;&#xA;&lt;p&gt;実際にどんな感じのコードになるのかは、&lt;a href=&#34;https://github.com/golang/go/blob/dev.typeparams/test/typeparam&#34;&gt;GitHubのdev.typeparams branch&lt;/a&gt;のコードを見ると良さそう。&lt;/p&gt;&#xA;&lt;h2 id=&#34;go117beta1のダウンロード&#34;&gt;Go1.17beta1のダウンロード&lt;/h2&gt;&#xA;&lt;p&gt;普段使っているgoコマンドから以下のようにGo1.17beta1をダウンロードできる。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;go&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;get&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;golang&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;org&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dl&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;go1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;beta1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;go1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;beta1&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;download&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これで ~/sdk/go1.17beta1 にインストールされる。&lt;/p&gt;&#xA;&lt;p&gt;FYI: Goは標準の機能で複数のバージョンをインストールできる。より詳しくは以下のドキュメントを読むと良い。&lt;/p&gt;&#xA;&lt;h2 id=&#34;genericsのサンプルコード&#34;&gt;Genericsのサンプルコード&lt;/h2&gt;&#xA;&lt;p&gt;Go1.17beta1に付属している以下のディレクトリに結構ある。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ ls $(go1.17beta1 env GOROOT)/test/typeparam&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;absdiff.go      fact.go         issue45738.go   min.go          slices.go       tparam1.go&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;adder.go        graph.go        list.go         ordered.go      smallest.go     typelist.go&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;append.go       importtest.go   list2.go        orderedmap.go   smoketest.go    value.go&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chans.go        index.go        lockable.go     pair.go         stringable.go&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;combine.go      interfacearg.go map.go          pragma.go       stringer.go&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cons.go         issue45547.go   maps.go         sets.go         struct.go&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;double.go       issue45722.go   metrics.go      settable.go     sum.go&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;genericsでstackを書いてみる&#34;&gt;GenericsでStackを書いてみる&lt;/h2&gt;&#xA;&lt;p&gt;こんな感じになった。現時点ではType Parametersの型をexportすることができないっぽいので、&lt;code&gt;stack&lt;/code&gt;と小文字で定義してmainパッケージに書いている。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;run&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;gcflags&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;G&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;package&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;ErrEmptyStack&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Errorf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;stack is empty&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;type&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;stack&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;T&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;any&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;     &lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;T&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;capacity&lt;/span&gt; &lt;span class=&#34;ne&#34;&gt;int&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;newStack&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;T&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;any&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;](&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;capacity&lt;/span&gt; &lt;span class=&#34;ne&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stack&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;T&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;capacity&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;panic&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;must be &amp;#39;capacity&amp;#39; &amp;gt; 0&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;make&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;([]&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;T&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;capacity&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stack&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;T&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;capacity&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;capacity&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stack&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;T&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Push&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;v&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;T&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;append&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;v&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stack&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;T&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Pop&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;T&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;error&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;zero&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;T&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;zero&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ErrEmptyStack&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;v&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;v&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;nil&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stack&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;T&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Peek&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;T&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;error&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;zero&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;T&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;zero&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ErrEmptyStack&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;nil&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stack&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;T&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;ne&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;newStack&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;ne&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;](&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Push&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Push&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Push&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Printf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;s = %+v&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\n&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Pop&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;nil&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;panic&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Printf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;s = %+v&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\n&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;コード書いてて少し悩んだのは、&lt;code&gt;func (s *stack[T]) Pop() (T, error)&lt;/code&gt; のようなメソッドでerrorを返す時にT型のゼロ値をどうやって返すのか、という点だった。どうやら以下のように &lt;code&gt;var zero T&lt;/code&gt; を定義してそれを返すのが良いらしい。&lt;code&gt;return nil, ErrEmptyStack&lt;/code&gt;という風に書くと、Tはポインタ型ではないのでコンパイルエラーになる。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stack&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;T&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Pop&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;T&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;error&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;zero&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;T&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;zero&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ErrEmptyStack&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;v&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;v&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;nil&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;実行&#34;&gt;実行&lt;/h2&gt;&#xA;&lt;p&gt;main関数があれば普通にgo1.17beta1 runコマンドで実行できる。&lt;code&gt;-gcflags=-G=3&lt;/code&gt;を付けないとgenericsのコードはコンパイルできないので注意。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ go1.17beta1 run -gcflags=-G=3 ./typeparam.go&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;s = &amp;amp;{data:[1 2 3] capacity:10}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;s = &amp;amp;{data:[1 2] capacity:10}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;感想&#34;&gt;感想&lt;/h2&gt;&#xA;&lt;p&gt;Type Parametersの機能が入るリリースは2022年の2月のGo 1.18だと思うけど、現時点でもモリモリ実装されているのでとても楽しみである。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Apple Silicon向けDocker Desktop for Macでコンテナがハングしないようにする</title>
				<link>https://journal.lampetty.net/posts/apple-silicon-docker-desktop-problem/</link>
				<pubDate>Mon, 14 Jun 2021 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/apple-silicon-docker-desktop-problem/</guid>
				<description>&lt;h2 id=&#34;tldr&#34;&gt;TL;DR&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Apple Silicon(M1) Docker Desktop for Macで&lt;a href=&#34;https://hub.docker.com/r/google/cloud-sdk/&#34;&gt;google/cloud-sdk&lt;/a&gt;のDocker Imageを使ってコンテナ内でCloud Datastore Emulatorを立ち上げると、CPUが100%で張り付いてハングするという問題があった。&lt;/li&gt;&#xA;&lt;li&gt;解決方法として、該当のDocker Imageをarm64v8アーキテクチャでビルドして、そのイメージでコンテナを立ち上げるようにしたら問題は起きなくなったので、その方法の紹介&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;問題の詳細&#34;&gt;問題の詳細&lt;/h2&gt;&#xA;&lt;p&gt;Apple Silicon版のDocker Desktop for MacはRosetta2を使いインテルアーキテクチャ(amd64 / x86_64)をエミュレーションして実行されている。エミュレーションが行われているため、ネイティブでarm64v8のコンテナを実行するよりCPUを使ってしまうという問題がある。これは&lt;a href=&#34;https://docs.docker.com/docker-for-mac/apple-silicon/#known-issues&#34;&gt;Known Issues&lt;/a&gt;として以下のように書かれている。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;However, attempts to run Intel-based containers on Apple Silicon machines under emulation can crash as qemu sometimes fails to run the container. In addition, filesystem change notification APIs (inotify) do not work under qemu emulation. Even when the containers do run correctly under emulation, they will be slower and use more memory than the native equivalent.&lt;/p&gt;&#xA;&lt;p&gt;In summary, running Intel-based containers on Arm-based machines should be regarded as “best effort” only. We recommend running arm64 containers on Apple Silicon machines whenever possible, and encouraging container authors to produce arm64, or multi-arch, versions of their containers.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;自分が遭遇した現象としては、google/cloud-sdkのイメージを使ってgcloudコマンドでDatastore Emulatorを立ち上げようとすると、3回に1回ぐらいの確率でCPUが100%になり、コンテナが全く応答しなくなるという問題だった。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;We recommend running arm64 containers on Apple Silicon machines whenever possible&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;とDocker Desktop on MacのKnown Issuesに書かれているので、これにしたがってgoogle/cloud-sdkのarm64v8のDocker Imageをビルドしてみた。&lt;/p&gt;&#xA;&lt;h2 id=&#34;googlecloud-sdk-arm64v8-imageをビルドする&#34;&gt;google/cloud-sdk arm64v8 Imageをビルドする&lt;/h2&gt;&#xA;&lt;p&gt;公式には提供されていないので、自分でDockerfileを作ってイメージをビルドする必要がある。 &lt;a href=&#34;https://hub.docker.com/u/arm64v8&#34;&gt;https://hub.docker.com/u/arm64v8&lt;/a&gt; には様々なarm64v8のDocker Imageがあるので、debian:buster-slimをベースにして以下のようなDockerfileを作る。ちなみに今回は&lt;code&gt;google-cloud-sdk-datastore-emulator&lt;/code&gt;しか使わないのでこれだけをインストールしているが、他のEmulatorが必要であれば&lt;a href=&#34;https://github.com/GoogleCloudPlatform/cloud-sdk-docker/blob/master/emulators/Dockerfile&#34;&gt;公式のDockerfile&lt;/a&gt;を参考にインストールすれば良い。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;FROM arm64v8/debian:buster-slim&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ARG CLOUD_SDK_VERSION=341.0.0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ENV CLOUD_SDK_VERSION=$CLOUD_SDK_VERSION&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;RUN groupadd -r -g 1000 cloudsdk &amp;amp;&amp;amp; \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    useradd -r -u 1000 -m -s /bin/bash -g cloudsdk cloudsdk&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;RUN mkdir -p /usr/share/man/man1/ &amp;amp;&amp;amp; \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    apt-get update &amp;amp;&amp;amp; \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    apt-get -y install \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        curl \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        gnupg \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        sudo \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        python3 \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        python3-crcmod \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        bash \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        openjdk-11-jre-headless&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;RUN echo &amp;#34;deb [signed-by=/usr/share/keyrings/cloud.google.gpg] http://packages.cloud.google.com/apt cloud-sdk main&amp;#34; | sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;RUN curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key --keyring /usr/share/keyrings/cloud.google.gpg add -&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;RUN apt-get update &amp;amp;&amp;amp; \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    apt-get install -y \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    google-cloud-sdk \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    google-cloud-sdk-datastore-emulator&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;RUN gcloud config set core/disable_usage_reporting true &amp;amp;&amp;amp; \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    gcloud config set component_manager/disable_update_check true &amp;amp;&amp;amp; \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    gcloud config set metrics/environment github_docker_image_emulator&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;そしてDocker Imageをビルドする。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ docker build -t cloud-sdk-emulators-arm64v8:341.0.0 .&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;最後に&#34;&gt;最後に&lt;/h2&gt;&#xA;&lt;p&gt;今回はGoのユニットテストから&lt;a href=&#34;https://github.com/ory/dockertest&#34;&gt;ory/dockertest&lt;/a&gt;を使ってDatastore Emulatorを立ち上げていたのだが、コンテナを何個立ち上げても全くハングしなくなりとても安定した。今回はDatastore Emulatorだったけど、他のImageでも起こりうる問題だとは思うので、もしApple siliconのマシンでDockerを動かしていて同じような症状で困っている人は参考にしてもらえると良いと思う。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>2021年の抱負</title>
				<link>https://journal.lampetty.net/posts/resolution-in-2021/</link>
				<pubDate>Sat, 30 Jan 2021 23:14:54 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/resolution-in-2021/</guid>
				<description>&lt;p&gt;年初に新年の抱負を書こうと思っていたがずっと後回しになってしまい、1月もそろそろ終わってしまう時期になった。というわけで明けましておめでとうございます。&lt;/p&gt;&#xA;&lt;p&gt;例によって全ては達成できないと思うけど、今年やりたいことを抱負としてまとめてみる。&lt;/p&gt;&#xA;&lt;h2 id=&#34;習慣化&#34;&gt;習慣化&lt;/h2&gt;&#xA;&lt;p&gt;これは抱負というよりかはよりメタなものだけど、継続していきたいことは習慣化させないと続かないため、習慣化を努力しようと思っている。昨年の11月から&lt;a href=&#34;https://www.habitify.me/&#34;&gt;Habitify&lt;/a&gt;というiOSアプリを試していてなかなか良いなと思ったので、年初に1年単位で課金してみた。このアプリは、例えば「ジョギング」のような習慣化したいものを登録しておいて、それを通知でリマインドしたり、実際にやったことを記録して週や月単位で振り返りするようなアプリだ。自分の場合は以下のような習慣を登録している。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;プロテインを飲む&lt;/li&gt;&#xA;&lt;li&gt;階段ジョギング&lt;/li&gt;&#xA;&lt;li&gt;筋トレ&lt;/li&gt;&#xA;&lt;li&gt;iKnow(英単語学習)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;このアプリ、特に何かすごい機能があるわけではないけど、リマインドを1日に2回するなど割と気が利いているのとストレスなく使えるので気に入っている。今年はこのアプリとともに習慣化に一番力を入れたいなと思っている。&lt;/p&gt;&#xA;&lt;h2 id=&#34;reactでspa作れるようになる&#34;&gt;ReactでSPA作れるようになる&lt;/h2&gt;&#xA;&lt;p&gt;仕事では専任のFrontend Engineerがいないため、自分もFrontのコードを触らなくてはいけないし、もともと自分ひとりでサービスを作ったりしたいので、今年はTypeScript + ReactでSPAのサービスを作れるようになりたい。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;TypeScript&lt;/li&gt;&#xA;&lt;li&gt;React&lt;/li&gt;&#xA;&lt;li&gt;React Hooks&lt;/li&gt;&#xA;&lt;li&gt;React Context&lt;/li&gt;&#xA;&lt;li&gt;React Router&lt;/li&gt;&#xA;&lt;li&gt;Jest&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;あたりを学べばいいのかなと漠然と思っている。余裕があったらNext.jsにもトライしてみたい。&lt;/p&gt;&#xA;&lt;h2 id=&#34;英語&#34;&gt;英語&lt;/h2&gt;&#xA;&lt;p&gt;毎日iKnowで英単語をやるのと、週に1回はSkype英会話のレッスンをやるようにして、英語力を下げない努力をしようと思っている。昨年まではDMM英会話をやっていたが&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;値段が高くなってきている&lt;/li&gt;&#xA;&lt;li&gt;英会話をやる時間を捻出するのが難しい&lt;/li&gt;&#xA;&lt;li&gt;単語を発声して覚える方が英語身についてそう(自分が発音できない単語は聞き取れないらしいので)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;と思ったのでiKnowをなるべくやるようにして、週1のSkypeレッスンに切り替えた。あと、実力値を安価に測るためにTOEICを年に2回受けるつもり。&lt;/p&gt;&#xA;&lt;h2 id=&#34;アウトプット&#34;&gt;アウトプット&lt;/h2&gt;&#xA;&lt;p&gt;1ヶ月に1つはちゃんとした記事を書く。昨年に引き続き継続は力なり、ということで。&lt;/p&gt;&#xA;&lt;h2 id=&#34;というわけで&#34;&gt;というわけで&lt;/h2&gt;&#xA;&lt;p&gt;2021年もやっていくぞい&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>2020年の振り返り</title>
				<link>https://journal.lampetty.net/posts/review-2020/</link>
				<pubDate>Thu, 31 Dec 2020 23:48:22 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/review-2020/</guid>
				<description>&lt;p&gt;早いもので2020も終わってしまう。歳をとるごとに1年が過ぎていくのが早く感じる気がするけど、ここまで早く過ぎ去ってかつ内容が薄い年は初めてなのではないかと思う。ただ、多くの人にとって大変な年になったのは間違いないと思うけど、自分はソフトウェアエンジニアという職業だったおかげで、相対的に見ればCOVID-19の経済的な影響は少なかったので、ラッキーだったとは思う。あらためてテクノロジーの進化とソフトウェアエンジニアになろうと決めた2000年頃の自分に感謝したい。&lt;/p&gt;&#xA;&lt;h2 id=&#34;1月&#34;&gt;1月&lt;/h2&gt;&#xA;&lt;p&gt;2019年末からインフルエンザにかかって実家に帰ったりもできず最悪のスタート。しかし、初めて家族でスキーに行ったり、その直後にGoDaysというベルリンで開催されたGoのカンファレンスに参加できたのはとてもラッキーだった。GoDaysのついでにワルシャワに1泊2日で個人旅行してきて、ポーランドという国の大変な歴史を学びつつ、社会主義から資本主義に移行している勢いも感じられたのでよかった。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Got gopher finally. Thank you! &lt;a href=&#34;https://twitter.com/hashtag/GoDays20?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#GoDays20&lt;/a&gt; &lt;a href=&#34;https://t.co/Afl5mm6X6u&#34;&gt;pic.twitter.com/Afl5mm6X6u&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;— oinume@Dr.’s Prime (@oinume) &lt;a href=&#34;https://twitter.com/oinume/status/1220075607289188354?ref_src=twsrc%5Etfw&#34;&gt;January 22, 2020&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;旧市街を一通り歩いてきた。ここは家族で来たかったなぁ。 &lt;a href=&#34;https://t.co/8gCFSjOD3f&#34;&gt;pic.twitter.com/8gCFSjOD3f&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;— oinume@Dr.’s Prime (@oinume) &lt;a href=&#34;https://twitter.com/oinume/status/1220760446329712640?ref_src=twsrc%5Etfw&#34;&gt;January 24, 2020&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;振り返ると2020年は私生活ではこの1月が最高に充実していたと思う。スタートアップへの転職について考え始めたのもこの1月からだったと思う。&lt;/p&gt;&#xA;&lt;h2 id=&#34;2月&#34;&gt;2月&lt;/h2&gt;&#xA;&lt;p&gt;会社の炎上プロジェクトが本格的に炎上し始めて仕事が大変になってきたのがこの時期だった。ただ、コロナも未だこの頃は猛威を奮っていなくて呑気に出社して仕事をしていた気がする。&lt;/p&gt;&#xA;&lt;h2 id=&#34;3月6月&#34;&gt;3月〜6月&lt;/h2&gt;&#xA;&lt;p&gt;会社が原則WFHに移行し、さらに子供が保育園に行けなくなり精神的に削られる日々が続いた。子供が家にいる状態で集中して作業できる時間が確保できなくなったため、自分でコードを書くのは諦めて、担当しているmicroserviceのproductivity teamのPM的な役割に徹した。コードが書けないのは個人的にはストレスだったけど、とても強い人たちが支えてくれたので、チームとしては結構うまく立ち回れたのではないかと思っている。&lt;/p&gt;&#xA;&lt;p&gt;また、GW前の仕事が一番炎上している時にSoftware Designの記事の締め切りがあり、生きている心地がしないぐらい忙しかった記憶がある。(みんな買ってくれ)&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://gihyo.jp/magazine/SD/archive/2020/202007&#34;&gt;gihyo.jp&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;7月8月&#34;&gt;7月〜8月&lt;/h2&gt;&#xA;&lt;p&gt;メルペイを退職する意向を固めて、本格的に転職活動をしていた時期。コロナ渦での最終出社は寂しかったけど、あまり盛大に送り出されるのも苦手なので、あのぐらいがちょうどよかった。たまたま会社に10人ぐらい人が来ていたので久しぶりに同僚といい話ができた気がする。&lt;/p&gt;&#xA;&lt;p&gt;8月後半にはグラファーとドクターズプライムからオファーをもらい、どちらに行くか決めきれなかったので9月と10月でそれぞれで働いてどちらかに決めることになった。悩みまくってとりあえず横浜のみなとみらいまで海を見に行ったりした。&lt;/p&gt;&#xA;&lt;h2 id=&#34;9月&#34;&gt;9月&lt;/h2&gt;&#xA;&lt;p&gt;この1ヶ月はグラファーで業務委託としてお試しで働かせてもらっていた。地方自治体向けのSaaS開発の裏側と急成長しているスタートアップの裏側を何一つ隠すところなく見せてもらい、とても有意義だった。「こういうことをやって欲しい」というお題をある程度与えてもらいつつ、自分的に課題だと感じたところを見つけて直していくようなことをやった。結果としてグラファーからのオファーは断ってしまったけど、CEOの石井さんの考え方がとても好きでファンなので、副業で少しだけ手伝わせてもらっている。&lt;/p&gt;&#xA;&lt;h2 id=&#34;10月&#34;&gt;10月&lt;/h2&gt;&#xA;&lt;p&gt;10月はドクターズプライムで1ヶ月働いてみた。グラファーはリモート中心で、こっちはオフィスに出社するのが中心であり、久々にオフィスメインで仕事することもあってか、人と雑談しながら仕事をするのがとても楽しかった。この頃は自分以外にまだエンジニアが誰もいなかったので、どういう風に仕事を進めればいいか悩ましいところもあったけど、他の人々が優しく接してくれたのであまり肩肘貼らずに仕事できたように思う。&lt;/p&gt;&#xA;&lt;h2 id=&#34;11月12月&#34;&gt;11月〜12月&lt;/h2&gt;&#xA;&lt;p&gt;最終的にドクターズプライムに決めて社員として働き始めた。正直コードを書く量は前職に比べて減った気がするけど、プロダクト開発やセキュリティ強化、採用など様々なことをやらなくてはいけないカオスな状況は楽しい。メルペイで働き続けていた方がバックエンドエンジニアとしてのキャリアは積めるだろうけど、社員10名規模で技術スタックが完全一致しているスタートアップで働ける機会なんてそうそうないと思ったので転職してよかったと思う。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;やっていきます💪💪&lt;a href=&#34;https://t.co/mgHx9JgpTD&#34;&gt;https://t.co/mgHx9JgpTD&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;— oinume@Dr.’s Prime (@oinume) &lt;a href=&#34;https://twitter.com/oinume/status/1325954390792916993?ref_src=twsrc%5Etfw&#34;&gt;November 10, 2020&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h2 id=&#34;ライブ&#34;&gt;ライブ&lt;/h2&gt;&#xA;&lt;p&gt;今年はこれらのライブに行くはずだったけど当然全部キャンセル or リスケされた。来年こそはと思うけどワクチン次第なのでどうなることやら。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Knotfest&lt;/li&gt;&#xA;&lt;li&gt;Green Day&lt;/li&gt;&#xA;&lt;li&gt;Avril Lavigne&lt;/li&gt;&#xA;&lt;li&gt;Viva La Rock&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;しかしストリーミングでDragon Ashのライブを3個も見れたので、これはこれでありなのでは？とも思い始めている。&lt;/p&gt;&#xA;&lt;h2 id=&#34;最後に&#34;&gt;最後に&lt;/h2&gt;&#xA;&lt;p&gt;何だかんだで今年は激動の1年だった。他にも大事なことがいろいろあった気がするけど思い出せないので気にしないことにします。 新型コロナに負けずに来年もよい年を迎えられると良いなと思っております。皆さんも良いお年を！！&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>O&#39;Reilly Online Learningで日本語の本を読む方法</title>
				<link>https://journal.lampetty.net/posts/japanese-books-oreilly-online-learning/</link>
				<pubDate>Fri, 27 Nov 2020 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/japanese-books-oreilly-online-learning/</guid>
				<description>&lt;p&gt;O&#39;ReillyのOnline Learning(旧O&#39;Reilly Safari Books Online)は月額$49でオライリーの本や動画などが見放題になるエンジニア向けのサブスクを提供している。以前は英語の本しか読めなかったが、いつからか日本語の本も読めるようになっていたのでメモ。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.oreilly.com/online-learning/&#34;&gt;www.oreilly.com&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Sign Inして、左のメニューのSettingsをクリックするとLanguage Preferencesがあるので、ここで&lt;code&gt;Japanese&lt;/code&gt;にチェックを入れて下の&lt;code&gt;Update Preferences&lt;/code&gt;をクリックして保存する。&lt;/p&gt;&#xA;&lt;p&gt;これでHomeに行き、例えばGraphQLで検索すると検索結果の画面でBooksのタブがあるのでこれを選択する。そうするとLanguageの選択ができるので、ここで&lt;code&gt;Japanese&lt;/code&gt;を選ぶと日本語の本だけに絞ることができる。(手っ取り早く検索結果を表示したい時は&lt;a href=&#34;https://learning.oreilly.com/search/?query=*&amp;amp;extended_publisher_data=true&amp;amp;highlight=true&amp;amp;include_assessments=false&amp;amp;include_case_studies=true&amp;amp;include_courses=true&amp;amp;include_playlists=true&amp;amp;include_collections=true&amp;amp;include_notebooks=true&amp;amp;include_sandboxes=true&amp;amp;include_scenarios=true&amp;amp;is_academic_institution_account=false&amp;amp;source=user&amp;amp;formats=book&amp;amp;languages=ja&amp;amp;sort=date_added&amp;amp;facet_json=true&amp;amp;json_facets=true&amp;amp;page=0&amp;amp;include_facets=false&#34;&gt;こちら&lt;/a&gt;)&lt;/p&gt;&#xA;&lt;p&gt;目的の本が見つかったらそれをPlaylistに入れるなりすればOK。なお、AndroidのO&#39;Reillyのアプリからだと日本語の本をダウンロードして読むことができたが、iOSはエラーになって読めなかった。&lt;/p&gt;&#xA;&lt;p&gt;2021年2月時点では合計57冊の日本語の本が読めるらしい。個人的に良さそうだなと思ったものをいくつか書いておく。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://learning.oreilly.com/library/view/untitled/9784873118703/&#34;&gt;データ指向アプリケーションデザイン ―信頼性、拡張性、保守性の高い分散システム設計の原理 [Book]&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://learning.oreilly.com/library/view/sre-google/9784873117911/&#34;&gt;SRE サイトリライアビリティエンジニアリング ―Googleの信頼性を支えるエンジニアリングチーム [Book]&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://learning.oreilly.com/library/view/untitled/9784873118888/&#34;&gt;ゼロトラストネットワーク ―境界防御の限界を超えるためのセキュアなシステム設計 [Book]&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://learning.oreilly.com/library/view/cto/9784873118482/&#34;&gt;エンジニアのためのマネジメントキャリアパス ―テックリードからCTOまでマネジメントスキル向上ガイド [Book]&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://learning.oreilly.com/library/view/go/9784873118468/&#34;&gt;Go言語による並行処理 [Book]&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://learning.oreilly.com/library/view/graphql-webapi/9784873118932/&#34;&gt;初めてのGraphQL ―Webサービスを作って学ぶ新世代API [Book]&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;なお、裏技としてACMの会員になると年$99でO&#39;Reilly Online Learningにアクセスできるようになるので、4冊ぐらい読めば元は取れることになる。ACMの登録方法については&lt;a href=&#34;https://agnozingdays.hatenablog.com/entry/2018/08/02/235021&#34;&gt;ここ&lt;/a&gt;によくまとまっているので参考になると思う。&lt;/p&gt;&#xA;&lt;p&gt;それでは素敵なO&#39;Reillyライフを！&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>ドクターズプライムに入社しました</title>
				<link>https://journal.lampetty.net/posts/join-to-drsprime/</link>
				<pubDate>Tue, 10 Nov 2020 09:09:46 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/join-to-drsprime/</guid>
				<description>&lt;h2 id=&#34;これはなに&#34;&gt;これはなに？&lt;/h2&gt;&#xA;&lt;p&gt;入社エントリー＆会社紹介です。表題の通りで、10月をもってメルカリ/メルペイを退職し、11月から&lt;a href=&#34;https://drsprime.com/company/&#34;&gt;ドクターズプライム&lt;/a&gt;という会社で働いています。&lt;/p&gt;&#xA;&lt;h2 id=&#34;なにやってるの&#34;&gt;なにやってるの？&lt;/h2&gt;&#xA;&lt;p&gt;Backend Engineerとして、救急車のたらい回しをなくすためのプロダクトを開発しています。救急車のたらい回しが発生する理由としては以下のスライドに書いてある通りなのですが、これを解決するのがDr.&#39;s Primeという医師の採用サービスになります。&lt;/p&gt;&#xA;&lt;p&gt;自分も子供を持つ親なので何度か病院のお世話になったことはあるし、子供が救急車で運ばれて手術＆入院したこともあるので、救急医療に関しては一当事者として良くしていきたいという思いがありました。ドクターズプライムは救急車の搬送を断らないための仕組みを採用サービスとして第三者の立場から提供していて、素直にいいソリューションだなと思っています。&lt;/p&gt;&#xA;&lt;h2 id=&#34;入社の経緯&#34;&gt;入社の経緯&lt;/h2&gt;&#xA;&lt;p&gt;今年に入ってからスタートアップで働くと言うことを意識し始めて、何社か話を聞かせてもらいました。時系列にするとこんな流れです。退職すること自体は昨年から別の理由で検討していたのですが、今年に入ってからスタートアップ良さそう！と思うようになりました。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;1月：スタートアップでDXをやっている会社に興味を持ち始める&lt;/li&gt;&#xA;&lt;li&gt;6,7月：メルペイを退職する意向を固めて、本格的に転職活動を始める&lt;/li&gt;&#xA;&lt;li&gt;8月：2社からオファーをもらって悩み始める&lt;/li&gt;&#xA;&lt;li&gt;10月末：入社を決める&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;8月は2社からオファーをもらっていて悩んでいた時期で、そのうちの一つがドクターズプライムでした。2社のうちどちらにするかを悩んでいたところ、「両方で働いてみて決めればいいんじゃない？」という提案をしてもらい、ありがたく両方の会社で1ヶ月ずつ働くことにしました。ちなみにもう一つは地方自治体向けのSaaSを提供している&lt;a href=&#34;https://graffer.jp/&#34;&gt;グラファー&lt;/a&gt;という会社です。&lt;/p&gt;&#xA;&lt;p&gt;最終的には、より会社規模が小さいドクターズプライムを選びました。エンジニアが自分を含めて2名しかいないため、必然的にプロダクト開発チームを作るところからスタートになります。1ヶ月お試しで働いてみてこのメンバーならチーム作りを含めて楽しくやれそうだと感じたこと、HRT(Humility, Respect, Trust)をはじめとしてカルチャーを大事にしていて、実際に中で働いてそれを体験できたことが決断の後押しになりました。&lt;/p&gt;&#xA;&lt;p&gt;ちなみにグラファーもいい会社です。こちらはリモート中心の働き方でしたが、相談事があったらすぐにZoom MTGが開催されたり、障害が発生した場合はポストモーテム(振り返り)をきちんと行い再発防止に努めていたり、プロフェッショナルさを感じることが多かったです。たまにオフィスに集まると和気藹々とランチを一緒に食べたり、スタートアップとしての一体感も強いです。&lt;/p&gt;&#xA;&lt;p&gt;取り組んでいる分野に違いはあれど、どちらの会社も日本に存在するペインを猛烈なスピードで解決するスタートアップであり、その両方で働く機会をもらったことはとてもいい経験になりました。両社とも楽しく仕事させてもらったので、分身できるのなら両方でフルタイムで働きたかったぐらいですw&lt;/p&gt;&#xA;&lt;h2 id=&#34;ドクターズプライムでやっていきたいこと&#34;&gt;ドクターズプライムでやっていきたいこと&lt;/h2&gt;&#xA;&lt;p&gt;創業時のリーンなプロダクト開発の結果として、GAS + Spreadsheet + Google Forms のシステムで売り上げが立つという、ある意味嬉しい誤算の状態になっていました。しかし、このGASベースのシステムもそろそろ綻びが見え始めており、一般的なFrontend + Backendの構成に置き換えていくことが当面やっていくことになります。&lt;/p&gt;&#xA;&lt;p&gt;これ以外にも&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;新しい病院向けプロダクトの開発&lt;/li&gt;&#xA;&lt;li&gt;GCPの設定をterraformで管理したい&lt;/li&gt;&#xA;&lt;li&gt;もっとTDDを押し進めたい&lt;/li&gt;&#xA;&lt;li&gt;社内の情報機器の管理をもっと効率的にやりたい&lt;/li&gt;&#xA;&lt;li&gt;勤怠システムの打刻がめんどいのでSlackで打刻できるようにしたい&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;などなど、やりたいことは山のようにあります。しかし、まだBackend engineer2名という体勢なので採用も頑張らなくてはなりません。特に初期設計から実装までまるっとお任せできる強いFrontend Engineerの助けを必要としています。(マジで助けてくれ！)&lt;/p&gt;&#xA;&lt;p&gt;その他にも多数の職種を募集しているので、興味がある人は以下の採用ページをみてもらえればと。オープンポジションもあるので、事業に興味はあるけど自分がマッチするポジションのイメージがなくても大丈夫です。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://drsprime.com/recruit/&#34;&gt;採用情報 | 株式会社ドクターズプライム&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;などと採用の話になってしまいましたが、とりあえず私は生きていて浅草で働いているので近くにいる人はぜひランチでも行きましょう！&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://cdn-ak.f.st-hatena.com/images/fotolife/o/oinume/20201109/20201109182914.jpg&#34; alt=&#34;f:id:oinume:20201109182914j:plain&#34; loading=&#34;lazy&#34; title=&#34;f:id:oinume:20201109182914j:plain&#34;&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;オフィス近くから見えるスカイツリー&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>moq - gomockを使わないMock生成</title>
				<link>https://journal.lampetty.net/posts/moq-instead-of-gomock/</link>
				<pubDate>Thu, 22 Oct 2020 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/moq-instead-of-gomock/</guid>
				<description>&lt;p&gt;Goでよく使われるMockの生成ツールとして&lt;a href=&#34;https://github.com/golang/mock&#34;&gt;gomock&lt;/a&gt;がある&lt;a href=&#34;#fn:1&#34;&gt;1&lt;/a&gt;。個人的にはgomockが生成したコードでモックを書くのが好きではないので、代替として&lt;a href=&#34;https://github.com/matryer/moq&#34;&gt;moq&lt;/a&gt;を使うやり方を取り上げてみようと思う。&lt;/p&gt;&#xA;&lt;p&gt;なお、本記事ではgithub.com/golang/mockではなく、&lt;a href=&#34;https://github.com/uber-go/mock&#34;&gt;go.uber.org/mock&lt;/a&gt;を使うように 2024-06-11 に改訂している。[^1]&lt;/p&gt;&#xA;&lt;h2 id=&#34;tldr&#34;&gt;TL;DR&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;moqは、mockしたいinterfaceで定義されているメソッドと同じシグネチャのメソッドを生成し、そのメソッドを実装することでmockが作れる&#xA;&lt;ul&gt;&#xA;&lt;li&gt;純粋にメソッドのモック実装のコードを書けばいいだけなので、gomockのようにライブラリとしての使い方を覚える必要はない&lt;/li&gt;&#xA;&lt;li&gt;生成されるコードもtype safeであり、gomockのように&lt;code&gt;any&lt;/code&gt;は登場しない&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;moqには、mock化したメソッドが呼び出された回数を取得するなど、最低限のことはできるようになっている。&#xA;&lt;ul&gt;&#xA;&lt;li&gt;それ以上のことをやりたければ自分で実装する&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;題材&#34;&gt;題材&lt;/h2&gt;&#xA;&lt;p&gt;GitHubのAPIを使い指定したリポジトリのブランチを出力するServiceを考えてみる。このServiceには以下の引数owner, repoで指定されたリポジトリのブランチを&lt;code&gt;w&lt;/code&gt;に出力するというメソッドを持っている。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;PrintBranches(ctx context.Context, w io.Writer, owner, repo string) error&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;servicego&#34;&gt;service.go&lt;/h3&gt;&#xA;&lt;p&gt;このServiceの実装コードは以下のようになっていて、githubClientを使ってGitHub APIを呼び出し引数のリポジトリのブランチの一覧を取得している。&lt;/p&gt;&#xA;&lt;h3 id=&#34;githubclientgo&#34;&gt;github/client.go&lt;/h3&gt;&#xA;&lt;p&gt;次にServiceから参照されているgithub.Client interfaceについて説明する。これは以下のように純粋なinterfaceとして定義している。そして、ユニットテストではGitHub APIへのアクセスをモックにしたいので、このinterfaceが定義している&lt;code&gt;ListBranches&lt;/code&gt;を実装するモックを&lt;code&gt;go:generate&lt;/code&gt;で生成するようにしている。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;go&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;package&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;github&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;//go:generate moq -out=client.moq.go . Client&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;//go:generate mockgen -destination=client.gomock.go -package=github . Client&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;context&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Client&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;interface&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;ListBranches&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ctx&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;context&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Context&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;owner&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;repo&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;([]&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;error&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;gomockを使ったテストコード&#34;&gt;gomockを使ったテストコード&lt;/h2&gt;&#xA;&lt;p&gt;それではgomockを使ってService.PrintBranchesのテストコードを書いてみよう。以下のようにgithub/client.go にgo generateでmockgenを呼び出すコードを追加し、&lt;code&gt;go generate ./mock/github&lt;/code&gt; を実行すると、./mock/github/client.mock.go が生成される。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;//go:generate mockgen -destination=client.gomock.go -package=github . Client&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;そして、以下が実際にgomockが生成するMockを使って書いたservice.goのテストコードである(&lt;a href=&#34;https://github.com/oinume/playground-go/blob/main/mock/service_test.go#L75-L88&#34;&gt;service_test.go&lt;/a&gt;)。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ctrl := gomock.NewController(t)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;defer ctrl.Finish()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;githubClient := github.NewMockClient(ctrl)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;githubClient.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    EXPECT().&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    ListBranches(context.Background(), &amp;#34;oinume&amp;#34;, &amp;#34;playground-go&amp;#34;).&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    Return([]string{&amp;#34;main&amp;#34;, &amp;#34;develop&amp;#34;, &amp;#34;feature/a&amp;#34;}, nil)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;s := Service{githubClient: githubClient}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;out := new(bytes.Buffer)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;if err := s.PrintBranches(context.Background(), out, &amp;#34;oinume&amp;#34;, &amp;#34;playground-go&amp;#34;); err != nil {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    t.Fatal(err)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;fmt.Printf(&amp;#34;--- out ---\n%v\n&amp;#34;, out.String())&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;注目して欲しいのは、&lt;code&gt;以下のEXPECT()&lt;/code&gt;以降の部分。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mockGitHubClient.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    EXPECT().&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    ListBranches(context.Background(), &amp;#34;oinume&amp;#34;, &amp;#34;playground-go&amp;#34;).&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    Return([]string{&amp;#34;main&amp;#34;, &amp;#34;develop&amp;#34;, &amp;#34;feature/a&amp;#34;}, nil)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このEXPECT()が返すのは&lt;code&gt;*MockClientMockRecorder&lt;/code&gt;型で、これに定義されているメソッドListBranchesのシグネチャは&lt;code&gt;ListBranches(arg0, arg1, arg2 interface{}) *gomock.Call&lt;/code&gt;になっている。これは本来のListBranchesのシグネチャとは異なるものになり、引数の型が&lt;code&gt;interface{}&lt;/code&gt;になっているため、オリジナルの引数の型である&lt;code&gt;string&lt;/code&gt;以外の型も渡せてしまう。テストコードの実行には問題がないかもしれないが、本来であればClient interfaceに定義されている引数の型と同じにしておいた方が変な誤解を生まなくてすむと思う。&lt;/p&gt;&#xA;&lt;p&gt;また、MockClientMockRecorder.ListBranchesが返す&lt;code&gt;*gomock.Call&lt;/code&gt;に対してモックが返す値を&lt;code&gt;Return([]string{&amp;quot;main&amp;quot;, &amp;quot;develop&amp;quot;, &amp;quot;feature/a&amp;quot;}, nil)&lt;/code&gt;のようにセットする必要があるが、戻り値の数を間違えてもコンパイル時にはエラーにならず、実行時にエラーになることもイケてないと思う。&lt;/p&gt;&#xA;&lt;p&gt;また、Mockのために以下のようなboilerplateのコードを毎回書くのも個人的には好きではない。俺はメソッドをmockしたいだけなのになぜこんなことをしなければならないのか&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ctrl := gomock.NewController(t)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;defer ctrl.Finish()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;...&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;moqを使ったテストコード&#34;&gt;moqを使ったテストコード&lt;/h2&gt;&#xA;&lt;p&gt;では次に、moqが生成したコードとそれを使った場合のコードを見てみる。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;moqが生成したコード &lt;a href=&#34;https://github.com/oinume/playground-go/blob/main/mock/github/client.moq.go#L30-L67&#34;&gt;client.moq.go&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;moqを使う&lt;a href=&#34;https://github.com/oinume/playground-go/blob/main/mock/service_test.go#L19-L30&#34;&gt;service_test.go&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;まずmoqが生成したコードは以下のようになっている。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;type&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ClientMock&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ListBranchesFunc&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mocks&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;the&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ListBranches&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;method&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;ListBranchesFunc&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ctx&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;context&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Context&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;owner&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;repo&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;([]&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;error&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;calls&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tracks&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;calls&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;to&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;the&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;methods&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;calls&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ListBranches&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;holds&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;details&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;about&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;calls&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;to&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;the&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ListBranches&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;method&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;ListBranches&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Ctx&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;the&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ctx&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;argument&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;Ctx&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;context&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Context&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Owner&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;the&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;owner&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;argument&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;Owner&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Repo&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;the&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;repo&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;argument&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;Repo&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;lockListBranches&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sync&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;RWMutex&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ListBranches&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;calls&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ListBranchesFunc&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mock&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ClientMock&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ListBranches&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ctx&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;context&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Context&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;owner&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;repo&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;([]&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;error&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mock&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ListBranchesFunc&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;nil&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;panic&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;ClientMock.ListBranchesFunc: method is nil but Client.ListBranches was just called&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;callInfo&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;Ctx&lt;/span&gt;   &lt;span class=&#34;n&#34;&gt;context&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Context&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;Owner&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;Repo&lt;/span&gt;  &lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;Ctx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;   &lt;span class=&#34;n&#34;&gt;ctx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;Owner&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;owner&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;Repo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;  &lt;span class=&#34;n&#34;&gt;repo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;mock&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;lockListBranches&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Lock&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;mock&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;calls&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ListBranches&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;append&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mock&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;calls&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ListBranches&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;callInfo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;mock&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;lockListBranches&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Unlock&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mock&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ListBranchesFunc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ctx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;owner&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;repo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;そして、上記のmoqが生成したClientMockを使うコードはこんな感じになる。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;githubClient := &amp;amp;github.ClientMock{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    ListBranchesFunc: func(ctx context.Context, owner string, repo string) ([]string, error) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        return []string{&amp;#34;main&amp;#34;, &amp;#34;develop&amp;#34;, &amp;#34;feature/a&amp;#34;}, nil&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;s := Service{githubClient: githubClient}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;out := new(bytes.Buffer)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;if err := s.PrintBranches(context.Background(), out, &amp;#34;oinume&amp;#34;, &amp;#34;playground-go&amp;#34;); err != nil {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    t.Fatal(err)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;fmt.Printf(&amp;#34;--- out ---\n%v\n&amp;#34;, out.String())&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;moqの場合はモックしたいメソッドをstructの初期化時にセットする。これはただのメソッドなので、中身の実装は好きなように書けばよくて、引数の型や戻り値の型も元のClient interfaceと全く同じである。つまり、戻り値の数を間違えてもコンパイル時に検出してくれる。このmoqを使ったコードの方がboilerplateなコードもなく純粋にモックにフォーカスできるのではないかと思う。&lt;/p&gt;&#xA;&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;&#xA;&lt;p&gt;gomockではなくmoqを使うとモックを使ったテストコードがよりわかりやすく、かつ使い方を間違えた時の実行時のエラーもなくなることが伝わったのではないかと思う。個人的にはモック化する対象のメソッドが少なければ、moqを使わずにmoqが生成するような該当メソッドを置き換えるfuncを手で書くのもありだと思う。というわけで、gomock割といろんなところで使われているけどより良いツールがあるよ、という紹介でした。おしまい。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B07VPSXF6N?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;&lt;img src=&#34;https://m.media-amazon.com/images/I/51jif840ScL._SL500_.jpg&#34; alt=&#34;改訂2版 みんなのGo言語&#34; loading=&#34;lazy&#34; title=&#34;改訂2版 みんなのGo言語&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B07VPSXF6N?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;改訂2版 みんなのGo言語&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者:松木 雅幸,mattn,藤原 俊一郎,中島 大一,上田 拓也,牧 大輔,鈴木 健太&lt;/li&gt;&#xA;&lt;li&gt;技術評論社&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B07VPSXF6N?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;Amazon&lt;/a&gt;&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;2023年1月時点で github.com/golang/mock がアーカイブされたため、go.uber.org/mock としてforkされたものが継続的に開発されているため&lt;a href=&#34;#fnref:1&#34;&gt;↩&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;</description>
			</item>
			<item>
				<title>2020年8月までの振り返り</title>
				<link>https://journal.lampetty.net/posts/review-2020-08/</link>
				<pubDate>Sat, 12 Sep 2020 00:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/review-2020-08/</guid>
				<description>&lt;p&gt;ずいぶんと振り返りをサボってしまったので、頑張って7ヶ月分を書く&lt;/p&gt;&#xA;&lt;h2 id=&#34;2月&#34;&gt;2月&lt;/h2&gt;&#xA;&lt;p&gt;この頃は各国のコロナの感染者数を毎日チェックしていた気がする。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;国別の罹患者数。Cruise Shipが国に格上げされているｗ&lt;a href=&#34;https://t.co/rp6wUIvCrS&#34;&gt;https://t.co/rp6wUIvCrS&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;— oinume (@oinume) &lt;a href=&#34;https://twitter.com/oinume/status/1229400667837489152?ref_src=twsrc%5Etfw&#34;&gt;February 17, 2020&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;そしてコロナの影響で2月終わりから在宅勤務、英語でカッコよく言うとWFHというヤツに会社が全体的に移行した。仕事的にはGitHub Actionsを使って何かいろいろ自動化しようとしていて、そんなに切羽詰まっている感じではなかった気がする。&lt;/p&gt;&#xA;&lt;h2 id=&#34;3月&#34;&gt;3月&lt;/h2&gt;&#xA;&lt;p&gt;新型コロナの影響で3月〜5月に行く予定だったライブやフェスがことごとく延期もしくは中止になり、個人的な趣味を奪われてしまって、仕事で溜まったストレスが発散できなくなった。仕事はプロジェクトが炎上し始めたのと、WFHになったおかげでこの月から労働時間が著しく増えた気がする。&lt;/p&gt;&#xA;&lt;h2 id=&#34;4月6月&#34;&gt;4月〜6月&lt;/h2&gt;&#xA;&lt;p&gt;保育園から「在宅勤務の家庭は登園を自粛して欲しい」という状態になり、子供の面倒を家で見ながら仕事をするというとてもストレスフルな状態になった。そして仕事ではプロジェクトが炎上し始め、さらにSoftware Designの原稿の締め切りがGW明けとバッティングして苦しい状況だった。&lt;/p&gt;&#xA;&lt;p&gt;仕事では4月にProductivity Teamなるものを立ち上げ、炎上プロジェクトに対して人を増やすと言うアンチパターンにアンチテーゼを投げかけた。自分一人でやっていたものに対してチームで取り組めるようになったので、自分はリーダー業務に徹して実作業はチームメンバーにお願いすることになるのだが、子供の面倒をみなくてはいけないという状況においてはこれはかなり良かった。&lt;/p&gt;&#xA;&lt;p&gt;というのは、子供が家にいるととにかく集中して作業することができない。奥さんが見てくれる時間もあるとはいえ、となりの部屋で叫び声が聞こえてくるとどうしても気になってしまう。なので、集中力が必要なタスクは深夜または早朝にやるようにして、昼間はSlackでのやりとりやMTGに終始するようにした。ただし、労働時間は平常時の1.25倍ぐらいになっているにもかかわらず、アウトプットはほぼ変わらない OR 下がっているという状態で、この期間が精神的にも肉体的にも一番つらかった。&lt;/p&gt;&#xA;&lt;h2 id=&#34;7月&#34;&gt;7月&lt;/h2&gt;&#xA;&lt;p&gt;保育園の登園自粛が解除され、平日昼間も集中できる時間が増えた。また、炎上プロジェクトもなんとかリリースが終わり、自分はもう退職することが決まっていたので引き継ぎを徐々に始めた。&lt;/p&gt;&#xA;&lt;p&gt;リリースしたとはいえ、リリースがむしろスタートであり、特にリリース直後のオンコールはつらかった。未知の問題のアラートが多発し、過去のSlackのログなどを漁ってなんとか対応するというやり方で逃げ切った感がある。途中からOperation Reportなるものを作るようにしたおかげで、過去にどういう対応をしたのかなどがわかりやすくなり、手間はかかるがこの仕組みはやって良かったと思う。&lt;/p&gt;&#xA;&lt;h2 id=&#34;8月&#34;&gt;8月&lt;/h2&gt;&#xA;&lt;p&gt;8/14が最終(物理)出社日だった。オフィスに珍しく10人ぐらい人がいたので集合写真を撮ったりした。会社のアカウント類は本来は最終出社日で無効化されるはずが、なぜか1週間ぐらい無効化されてなかったのでSlackは毎日のように見ていた。&lt;/p&gt;&#xA;&lt;p&gt;退職エントリーというやつを人生で初めて書いたところ、反響がすごくてこれだけでTwitterのフォロワーが200人ぐらい増えたw メルカリ/メルペイのブランド力というヤツはすごいなーとあらためて思う。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;現況です&lt;br&gt;&#xA;メルカリ/メルペイを退職します - oinume journal&lt;a href=&#34;https://t.co/ThfsB9DEhn&#34;&gt;https://t.co/ThfsB9DEhn&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;— oinume (@oinume) &lt;a href=&#34;https://twitter.com/oinume/status/1297700172164526083?ref_src=twsrc%5Etfw&#34;&gt;August 24, 2020&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h2 id=&#34;買ったもの&#34;&gt;買ったもの&lt;/h2&gt;&#xA;&lt;h3 id=&#34;dell-4kモニター-27インチ-usb-type-c-モデル&#34;&gt;Dell 4Kモニター 27インチ USB Type-C モデル&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B085TWLMF9?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;&lt;img src=&#34;https://m.media-amazon.com/images/I/515ukqEPSvL._SL500_.jpg&#34; alt=&#34;【Amazon.co.jp限定】Dell U2720QM 27インチ 4K モニター (3年間無輝点交換保証/IPS非光沢/USB Type-C・DP・HDMI/縦横回転・高さ調整/DCI-P3 95%/VESA DisplayHDR 400)&#34; loading=&#34;lazy&#34; title=&#34;【Amazon.co.jp限定】Dell U2720QM 27インチ 4K モニター (3年間無輝点交換保証/IPS非光沢/USB Type-C・DP・HDMI/縦横回転・高さ調整/DCI-P3 95%/VESA DisplayHDR 400)&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B085TWLMF9?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;【Amazon.co.jp限定】Dell U2720QM 27インチ 4K モニター (3年間無輝点交換保証/IPS非光沢/USB Type-C・DP・HDMI/縦横回転・高さ調整/DCI-P3 95%/VESA DisplayHDR 400)&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Dell&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B085TWLMF9?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;Amazon&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;この半年の中で買ったものの中ではこれが満足度が一番高い。このモニタからMacBookが充電できるし、場所もそこまで取らない。23.8インチと迷ったけど1万円しか違わなかったのでこっちを購入。&lt;/p&gt;&#xA;&lt;h3 id=&#34;galaxy-buds&#34;&gt;Galaxy Buds+&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/exec/obidos/ASIN/B084HSPN1X/kazzhomeunixo-22/&#34;&gt;[asin:B084HSPN1X:detail]&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;3月〜7月はとにかくオンラインの会議が多くて、AirPodsだと充電が持たなかったので購入。バッテリーは11時間確かにもつし、音もなかなか良いので気に入っている。難点はBluetoothが弱くて満員電車など人が多いところだと混戦して音が飛んでしまうことがある。この点ではAirPodsに軍配が上がるけどそれ以外では重宝している。&lt;/p&gt;&#xA;&lt;h3 id=&#34;kuman-35インチ-hdmi-小型モニター-480320-ラズベリーパイ向け&#34;&gt;Kuman 3.5インチ HDMI 小型モニター 480*320 ラズベリーパイ向け&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B07TXTSJBY?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;&lt;img src=&#34;https://m.media-amazon.com/images/I/51-cp1ql&amp;#43;bL._SL500_.jpg&#34; alt=&#34;Kuman 3.5インチ HDMI 小型モニター 480*320 ラズベリーパイ3b タッチスクリーン ディスプレイ ビデオ/ゲーム可能 保護ケースセット raspberry pi 3 b&amp;#43; 2 Model B A&amp;#43; A に対応 ラズベリー パイ SC6AC&#34; loading=&#34;lazy&#34; title=&#34;Kuman 3.5インチ HDMI 小型モニター 480*320 ラズベリーパイ3b タッチスクリーン ディスプレイ ビデオ/ゲーム可能 保護ケースセット raspberry pi 3 b&amp;#43; 2 Model B A&amp;#43; A に対応 ラズベリー パイ SC6AC&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B07TXTSJBY?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;Kuman 3.5インチ HDMI 小型モニター 480*320 ラズベリーパイ3b タッチスクリーン ディスプレイ ビデオ/ゲーム可能 保護ケースセット raspberry pi 3 b+ 2 Model B A+ A に対応 ラズベリー パイ SC6AC&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Kuman&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B07TXTSJBY?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;Amazon&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;もともとラズパイは32インチのテレビにつなげていたのだけど、そのテレビをメルカリで処分してしまったので代わりに購入。ターミナルの文字が視力検査ばりに見えないけど、安くてコンパクトだったのでまぁ良いかという気がしている。&lt;/p&gt;&#xA;&lt;h2 id=&#34;個人的な取り組み&#34;&gt;個人的な取り組み&lt;/h2&gt;&#xA;&lt;p&gt;今まで通勤中にやっていたこと・習慣がWFHになったため全て消え去ってしまった。特に英会話はオフィスでやっていたため、家でやる時間も習慣も根付かなかった。とりあえずなんとか家でも習慣作りをしていかないと。WFHはあと1年ぐらいは続くと思うので、これは今後の課題。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;英語: ほぼやれてない。英会話をする時間がないのでiKnowで単語や文章を発音することだけ毎日やっている&lt;/li&gt;&#xA;&lt;li&gt;アルゴリズム: 全然やれてない&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>Gatsby &#43; Firebase Hostingでプロフィールサイトを構築する</title>
				<link>https://journal.lampetty.net/posts/building-profile-site-with-gatsby-and-firebase-hosting/</link>
				<pubDate>Mon, 31 Aug 2020 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/building-profile-site-with-gatsby-and-firebase-hosting/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;https://www.gatsbyjs.com/&#34;&gt;Gatsby&lt;/a&gt;と&lt;a href=&#34;https://firebase.google.com/products/hosting&#34;&gt;Firebase Hosting&lt;/a&gt;を使って&lt;a href=&#34;https://www.lampetty.net/&#34;&gt;自分のプロフィールサイト&lt;/a&gt;を構築したのでそのメモ。&lt;/p&gt;&#xA;&lt;h2 id=&#34;前提&#34;&gt;前提&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;サイトの中身はGitHubリポジトリで管理&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/santosfrancisco/gatsby-starter-cv&#34;&gt;https://github.com/santosfrancisco/gatsby-starter-cv&lt;/a&gt;がプロフィールサイト向けだったのでこれを使った&lt;/li&gt;&#xA;&lt;li&gt;GitHub Actionsでmasterブランチにpushされたら自動的にFirebase Hostingに反映されるようにした&lt;/li&gt;&#xA;&lt;li&gt;今回は一つのGitHubリポジトリで複数のサイトをホスティングしたかったので、サブディレクトリを作成した。以下のような構成になっている。&#xA;&lt;ul&gt;&#xA;&lt;li&gt;lampetty-net-sites (リポジトリルート)&#xA;&lt;ul&gt;&#xA;&lt;li&gt;www (今回構築するプロフィールサイト)&lt;/li&gt;&#xA;&lt;li&gt;xyz (別のサイト)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;準備&#34;&gt;準備&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;GitHubリポジトリを作っておく&lt;/li&gt;&#xA;&lt;li&gt;NodeJSをインストールしておく&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.gatsbyjs.com/docs/quick-start/&#34;&gt;Quick Start | Gatsby&lt;/a&gt;に沿って以下を実行する。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;(on repository root)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npm install -g gatsby-cli&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;gatsby new www https://github.com/santosfrancisco/gatsby-starter-cv&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これで &lt;code&gt;www&lt;/code&gt; ディレクトリ配下にサイトの静的ファイルが生成される。次にこれをFirebase Hostingにデプロイする。&lt;/p&gt;&#xA;&lt;h2 id=&#34;firebase-hostingのセットアップ&#34;&gt;Firebase Hostingのセットアップ&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;プロジェクト作成する&lt;/li&gt;&#xA;&lt;li&gt;Firebase Hosting の設定を行う&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://firebase.google.com/docs/hosting&#34;&gt;公式ドキュメント&lt;/a&gt;に沿ってやればOK&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;on&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;repository&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;root&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;npm&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;install&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;g&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;firebase&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tools&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;firebase&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;login&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;firebase&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;init&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;今回は一つのリポジトリと一つのFirebaseプロジェクトで複数のサイトのファイルをホスティングしたかったので、以下のファイルを作成した。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://firebase.google.com/docs/hosting/multisites&#34;&gt;https://firebase.google.com/docs/hosting/multisites&lt;/a&gt; に沿ってFirebaseの設定を行い、以下のようなファイルを作成した。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;firebase target:apply hosting www lampetty-net-sites&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;firebase.json&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &amp;#34;hosting&amp;#34;: [&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &amp;#34;target&amp;#34;: &amp;#34;www&amp;#34;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &amp;#34;public&amp;#34;: &amp;#34;www/public&amp;#34;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &amp;#34;ignore&amp;#34;: [&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;firebase.json&amp;#34;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;**/.*&amp;#34;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;**/node_modules/**&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      ]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  ]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;.firebaserc&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &amp;#34;projects&amp;#34;: {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &amp;#34;default&amp;#34;: &amp;#34;&amp;lt;PROJECT_NAME&amp;gt;&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &amp;#34;targets&amp;#34;: {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &amp;#34;&amp;lt;RESOURCE_NAME&amp;gt;&amp;#34;: {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &amp;#34;hosting&amp;#34;: {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;www&amp;#34;: [&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          &amp;#34;&amp;lt;RESOURCE_NAME&amp;gt;&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        ]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;最終的にデプロイは以下のように行う。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;firebase deploy --only hosting:www&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;github-actionsの設定&#34;&gt;GitHub Actionsの設定&lt;/h2&gt;&#xA;&lt;p&gt;以下のような感じでnode_modules配下をキャッシュすることでビルド時間を短縮している。&lt;/p&gt;&#xA;&lt;h3 id=&#34;まとめ&#34;&gt;まとめ&lt;/h3&gt;&#xA;&lt;p&gt;静的サイトを構築するのは簡単&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/exec/obidos/ASIN/B07RWXSNRH/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://m.media-amazon.com/images/I/51Og7Ah5jvL._SL160_.jpg&#34; alt=&#34;Firebaseによるサーバーレスシングルページアプリケーション (技術の泉シリーズ（NextPublishing）)&#34; loading=&#34;lazy&#34; title=&#34;Firebaseによるサーバーレスシングルページアプリケーション (技術の泉シリーズ（NextPublishing）)&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/exec/obidos/ASIN/B07RWXSNRH/kazzhomeunixo-22/&#34;&gt;Firebaseによるサーバーレスシングルページアプリケーション (技術の泉シリーズ（NextPublishing）)&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者:小島 佑一&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2019/05/24&lt;/li&gt;&#xA;&lt;li&gt;メディア: Kindle版&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>メルカリ/メルペイを退職します</title>
				<link>https://journal.lampetty.net/posts/leaving-mercari-merpay/</link>
				<pubDate>Mon, 24 Aug 2020 10:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/leaving-mercari-merpay/</guid>
				<description>&lt;p&gt;いわゆる退職エントリーというヤツです。表題の通りで、10月をもって4年3ヶ月勤めたメルカリ/メルペイを退職します。思い返せば、退職エントリーというものをブログに書くのは初めてです。少し緊張してます。&lt;/p&gt;&#xA;&lt;h2 id=&#34;だれ&#34;&gt;だれ？&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://twitter.com/oinume&#34;&gt;oinume&lt;/a&gt; です。Goが好きなBackend engineerです。&lt;/p&gt;&#xA;&lt;h2 id=&#34;何をやっていたのか&#34;&gt;何をやっていたのか？&lt;/h2&gt;&#xA;&lt;p&gt;2016年5月に入社してからやってきたことを書き出すと以下のような感じです。メルカリ→ソウゾウ→メルペイと、気付いたらチームごと会社を異動しており、様々なプロジェクトに携わりました。一つの会社の中でこれだけたくさんのことをやったのは初めてで、様々な経験を積ませてもらい、とても刺激的でした。&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;ID Platform Teamでメルカリや周辺サービスのアカウントの統合 @メルカリ&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://mercan.mercari.com/articles/2018-02-23-113500/&#34;&gt;この記事&lt;/a&gt;でID Platform Teamについて詳しく説明されている&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://about.mercari.com/press/news/articles/20170605_monthlypay/&#34;&gt;メルカリ月イチ払い&lt;/a&gt;(現メルペイスマート払い)の立ち上げ @ソウゾウ&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://about.mercari.com/press/news/articles/20171127_mercari_now1/&#34;&gt;メルカリNOW&lt;/a&gt;の立ち上げ @ソウゾウ&lt;/li&gt;&#xA;&lt;li&gt;ID Platform Teamでmicroservice内の認証・認可を司るAuthority Serviceの開発・運用 @メルペイ&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://logmi.jp/tech/articles/321647&#34;&gt;この記事&lt;/a&gt;で軽くAuthority Serviceが説明されてる&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;メルカリ月イチ払いをメルペイスマート払いにリニューアル @メルペイ&lt;/li&gt;&#xA;&lt;li&gt;メルペイスマート払いのモノリス→microserviceへの移行 @メルペイ&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;最も思い入れが強かったプロジェクト&#34;&gt;最も思い入れが強かったプロジェクト&lt;/h2&gt;&#xA;&lt;p&gt;どれもこれもやりがいの多い仕事だったのですが、一番思い入れが強いのはメルカリ月イチ払いの立ち上げです。これはメルカリの中で使える「後払い」の機能だったのですが、当時は後払いというとお金を借りるというイメージがあり、あまり良くないイメージがありました(今でもまだあるかも)。しかし、以下のようなUXの良さがあったため、たくさんの人に使われる機能になりました。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;クレジットカードが作れなかったりする若い人向けに後払いの機能を提供することで欲しいものがすぐに購入できる&lt;/li&gt;&#xA;&lt;li&gt;コンビニ払いを使っていた人が後払いを使うことで売り手側の入金待ち状態が減らせる&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;さらに、この後払いの機能が&lt;a href=&#34;https://k-tai.watch.impress.co.jp/docs/news/1205287.html&#34;&gt;メルペイスマート払い&lt;/a&gt;とリニューアルすることで、メルカリ以外の店舗でも使えるようになり、かつ機械学習による与信枠(クレジット)の付与ができるようになりました。&lt;/p&gt;&#xA;&lt;p&gt;最後はメルペイスマート払いのBackendのTech Leadをやらせてもらい、&lt;a href=&#34;https://mercan.mercari.com/articles/14435/&#34;&gt;VPoEのhidekさんとなぜか腕相撲&lt;/a&gt;をするまでになりました(違&lt;/p&gt;&#xA;&lt;h2 id=&#34;メルカリメルペイの良いところ&#34;&gt;メルカリ/メルペイの良いところ&lt;/h2&gt;&#xA;&lt;p&gt;プロダクトの人だけではなく、コーポレートの人もお客様のことを常に考えているプロフェッショナルの人が多かったです。どうしてもプロダクトの部分にフォーカスされることが多いですが、人事・PR・BizDev・CS・プロダクト開発の部署がとにかく一体となっていることがこの会社の強みだと思います。周りの人が頼りがいのある人が多く、「この人だったらやりたいことだけ伝えておけばなんとかしてくれる」ということが多かったです。そんな人達に助けられながらどんな時も仕事を前に進めることができたので、本当に感謝しかありません。&lt;/p&gt;&#xA;&lt;p&gt;また、技術面では #tech-golang や #tech-gcpなどの技術系のSlack channelが活発で、例えばGCP関連で質問があったら #tech-gcp に軽く質問をすると詳しい人がすぐ回答してくれます。何かしらその道のエキスパートがいるので、これはエンジニアとしては最高の福利厚生だと思います。&lt;/p&gt;&#xA;&lt;h2 id=&#34;なんで辞めるの&#34;&gt;なんで辞めるの？&lt;/h2&gt;&#xA;&lt;p&gt;もう少し小さな会社で事業を伸ばすフェーズに立ち会いたい、というのが一番の理由になります。日本には主にDX(Digital Transformation)の面で、たくさんの「未開の地」があり、様々な分野で圧倒的に成長の余地があると思っています。なお、これを書いている時点ではまだ転職先は決まっていませんが、おそらくこの「未開の地」を切り開くスタートアップに行くと思います。&lt;/p&gt;&#xA;&lt;p&gt;※9/2時点で2社からオファーをもらっているので、どちらかに転職することになると思います。&lt;/p&gt;&#xA;&lt;h2 id=&#34;さいごに&#34;&gt;さいごに&lt;/h2&gt;&#xA;&lt;p&gt;もう40歳を超えて脂の乗りまくった年齢になってきたので、そろそろ真面目に今後のキャリアのことを考えたほうがいいかなと思いつつも、やはりプロダクト開発が好きなので生涯現場でコードを書いていきたいです。&lt;/p&gt;&#xA;&lt;p&gt;次もGoをメインでやっていきたいと思っているので、私を知っている人は勉強会などで会った時にはぜひ声をかけてもらえればと思います。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>go testを並列で動かして速くする</title>
				<link>https://journal.lampetty.net/posts/go-test-in-parallel/</link>
				<pubDate>Wed, 12 Aug 2020 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/go-test-in-parallel/</guid>
				<description>&lt;h2 id=&#34;はじめに&#34;&gt;はじめに&lt;/h2&gt;&#xA;&lt;p&gt;アプリケーションが大きくなってくると、テストを並列で実行しないとどんどん&lt;code&gt;go test&lt;/code&gt;の実行時間が長くなってしまい、いわゆる「CI待ち」というものが発生してしまう。この記事は自分用のメモだが、テストを少しでも速くしたいという人のための記事。おそらく会社の誰かがもっと丁寧な説明のブログ記事を書いてくれるはず。&lt;/p&gt;&#xA;&lt;h2 id=&#34;go-testを速くする方法&#34;&gt;go testを速くする方法&lt;/h2&gt;&#xA;&lt;p&gt;方法としては以下がある。それぞれ細かく説明していく。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;go test実行時に&lt;code&gt;-p&lt;/code&gt;オプションを使う&lt;/li&gt;&#xA;&lt;li&gt;Test関数に&lt;code&gt;t.Parallel&lt;/code&gt;を入れる&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;go-testの実行方法&#34;&gt;go testの実行方法&lt;/h2&gt;&#xA;&lt;p&gt;go testコマンドでは大きく分けて以下の2つを行っている。&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;em&gt;.go,&lt;/em&gt; _test.goをコンパイルしてバイナリを生成&lt;/li&gt;&#xA;&lt;li&gt;生成したバイナリの実行(=テストの実行)&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;この時 &lt;code&gt;go test ./...&lt;/code&gt; のように実行するとパッケージごとにバイナリを生成してテストを実行する。&lt;code&gt;-p&lt;/code&gt;フラグはこのパッケージごとのコンパイルとテスト実行の並列数を設定するもので、デフォルトではGOMAXPROCSの数になっている。&lt;/p&gt;&#xA;&lt;h2 id=&#34;tparallel&#34;&gt;t.Parallel&lt;/h2&gt;&#xA;&lt;p&gt;上では&lt;code&gt;-p&lt;/code&gt;によってパッケージごとのテストの実行を並列にすることができると説明したが、同じパッケージ内のTest関数は直列で実行されている。これを並列で実行したい場合はどうするのかというと、&lt;a href=&#34;https://golang.org/pkg/testing/#T.Parallel&#34;&gt;(*T).Parallel&lt;/a&gt;を使えば良い。これを入れることで「そのTest関数は並列実行できる」ということを伝えられる。&lt;/p&gt;&#xA;&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;パッケージごとのテストのコンパイルと実行を並列にしたい場合は&lt;code&gt;-p&lt;/code&gt;を指定する(デフォルトはGOMAXPROCS(&lt;/li&gt;&#xA;&lt;li&gt;t.Parallel()の呼び出しがあると、そのTest関数は並列で実行される&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>Resolving 3rd party proto file on IntelliJ IDEA</title>
				<link>https://journal.lampetty.net/posts/resolving-3rd-party-proto-file-on-intellij-idea/</link>
				<pubDate>Thu, 25 Jun 2020 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/resolving-3rd-party-proto-file-on-intellij-idea/</guid>
				<description>&lt;p&gt;I use &lt;a href=&#34;https://plugins.jetbrains.com/plugin/8277-protobuf-support/reviews&#34;&gt;Protobuf Support Plugin&lt;/a&gt; for syntax highlighting. However, it can&#39;t resolve 3rd party proto file like this:&lt;/p&gt;&#xA;&lt;p&gt;In my case, the file which is not resolved is located in &lt;code&gt;proto/third_party&lt;/code&gt; directory.&lt;/p&gt;&#xA;&lt;h2 id=&#34;solution&#34;&gt;Solution&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Open Project Structure (&lt;code&gt;File -&amp;gt; Project Structure&lt;/code&gt; or &lt;code&gt;Cmd + ;&lt;/code&gt; )&lt;/li&gt;&#xA;&lt;li&gt;Choose the directory as &lt;code&gt;Resource root&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Finally, unresolved error was gone 🎉🎉🎉&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Touch BarありでIntelliJ IDEAのShift &#43; F6などのショートカットキーが効かない場合の対処方法</title>
				<link>https://journal.lampetty.net/posts/touch-bar-intellij-function-keys/</link>
				<pubDate>Tue, 16 Jun 2020 00:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/touch-bar-intellij-function-keys/</guid>
				<description>&lt;h2 id=&#34;tldr&#34;&gt;TL;DR&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Touch BarありのMacBookProで、IntelliJ IDEAでShift + F6などのFunction Keyと他のキーを組み合わせた場合のショートカットキーが効かないという問題があった&lt;/li&gt;&#xA;&lt;li&gt;Karabinar Elementsを使っている場合は &lt;code&gt;Devices&lt;/code&gt; で &lt;code&gt;No product name (No manufacturer name)&lt;/code&gt; にチェックを入れることで解決する&lt;/li&gt;&#xA;&lt;li&gt;スクショ: &lt;a href=&#34;https://github.com/pqrs-org/Karabiner-Elements/issues/535#issuecomment-350522019&#34;&gt;https://github.com/pqrs-org/Karabiner-Elements/issues/535#issuecomment-350522019&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;問題の詳細&#34;&gt;問題の詳細&lt;/h2&gt;&#xA;&lt;p&gt;IntelliJ IDEAをTouch BarありのMacBookProを使っている場合、Shift + F6(Rename)やOpt + F7(Find Usages)のようなFunction Keyと組み合わせたショートカットキーが動作しないという問題に長年苦しめられてきた。特にIntelliJはFunction Keyとなにかを組み合わるショートカットが多くて、これはIntelliJ使いとしては死活問題だった。&lt;/p&gt;&#xA;&lt;p&gt;この問題のせいで「MacBook ProもTouch Barついてるのか？じゃあ買うのやーめよ」と本気で考えるぐらい困っていた。そして実際Touch BarがないMacBook Airを買う寸前だった。&lt;/p&gt;&#xA;&lt;h2 id=&#34;どうやって解決したのか&#34;&gt;どうやって解決したのか？&lt;/h2&gt;&#xA;&lt;p&gt;MacBook Airを購入する寸前で「もしかしたら解決方法があるかもしれない」と思い、いろいろとググってみた。しかし検索しても引っかかるのはIntelliJのTouch Bar Supportの記事ばかり... しかし、IntelliJのフォーラムのコメントを熟読していたところ、以下のような&lt;a href=&#34;https://intellij-support.jetbrains.com/hc/en-us/community/posts/115000087984/comments/115000379344&#34;&gt;コメント&lt;/a&gt;があった。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Ok, did som further debugging and tracked it down to Karabiner Elements (which I have installed) - quitting it fixed the problem. It seems that they have a number of conflicts with the touchbar&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;おっ、もしかしてKarabinar Elementsがなにか悪さしているのか？と思い、試しにKarabinar-Elementsを落としてShift + F6を試したところ Renameが動く。動くぞ...！！！&lt;/p&gt;&#xA;&lt;p&gt;というわけで、 &lt;code&gt;IntelliJ Touch Bar Karabinar Elements function keys&lt;/code&gt; というキーワードでググったところ、冒頭で紹介したKarabinar-Elementsの&lt;a href=&#34;https://github.com/pqrs-org/Karabiner-Elements/issues/535#issuecomment-350522019&#34;&gt;Issue&lt;/a&gt;にたどりついた。そして以下のスクショのように&lt;code&gt;No product name (No manufacturer name)&lt;/code&gt;のチェックを入れて見事Shift + F6が効くようになりましたとさ。&lt;/p&gt;&#xA;&lt;p&gt;というか、2017年に解決されていたのね、、、ググる力が足りなくて3年も我慢してしまっていた。&lt;/p&gt;&#xA;&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;&#xA;&lt;p&gt;Touch Bar + IntelliJ のファンクションキーが効くようになり人権を取り戻しました。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/exec/obidos/ASIN/4774193836/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://m.media-amazon.com/images/I/51Q6TDdmpHL._SL160_.jpg&#34; alt=&#34;IntelliJ IDEAハンズオン――基本操作からプロジェクト管理までマスター&#34; loading=&#34;lazy&#34; title=&#34;IntelliJ IDEAハンズオン――基本操作からプロジェクト管理までマスター&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/exec/obidos/ASIN/4774193836/kazzhomeunixo-22/&#34;&gt;IntelliJ IDEAハンズオン――基本操作からプロジェクト管理までマスター&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者:山本 裕介,今井 勝信&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2017/11/08&lt;/li&gt;&#xA;&lt;li&gt;メディア: 大型本&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>使ってみて便利だったGitHub Actions</title>
				<link>https://journal.lampetty.net/posts/useful-github-actions/</link>
				<pubDate>Mon, 08 Jun 2020 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/useful-github-actions/</guid>
				<description>&lt;p&gt;今年の2月ぐらいからGitHub Actionsを仕事で使うようになったので、実際に使ってみて便利だったものを紹介する。&lt;/p&gt;&#xA;&lt;h2 id=&#34;slackへの通知を行うaction-slack&#34;&gt;Slackへの通知を行うaction-slack&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/marketplace/actions/action-slack&#34;&gt;github.com&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Slackへ通知するActionはいくつかあるけど、これが一番きめ細かく送る内容を設定できてかゆいところに手が届く感じだった。&lt;/p&gt;&#xA;&lt;h2 id=&#34;branchにcommitがあったらsyncするpull-requestを作るsync-branches&#34;&gt;branchにcommitがあったらSyncするPull requestを作るSync branches&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/marketplace/actions/sync-branches&#34;&gt;github.com&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;たとえばmasterとdevelop branchがあるとして、masterにcommitがあった時にmaster -&amp;gt; develop に対して差分のpull requestを自動で作ってくれる。自分たちはそれを確認してマージすればよい。&lt;/p&gt;&#xA;&lt;h2 id=&#34;特定のファイルに更新があった場合にラベルをつけるlabeler&#34;&gt;特定のファイルに更新があった場合にラベルをつけるLabeler&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/marketplace/actions/labeler&#34;&gt;github.com&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;設定ファイルを書くことで「このディレクトリ配下のファイルが更新されたら」とか「この拡張子のファイルが更新されたら」とかの条件でPull requestにラベルをつけることができる。難点なのは、以下のような時にラベルを自動で削除してくれないこと。&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;条件にマッチするファイルが更新される(差分がある)&lt;/li&gt;&#xA;&lt;li&gt;ラベルがつく&lt;/li&gt;&#xA;&lt;li&gt;別のコミットによって1.のファイルの差分がなくなる&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;</description>
			</item>
			<item>
				<title>GoでLRU Cacheを実装する</title>
				<link>https://journal.lampetty.net/posts/implementing-lru-cache-in-go/</link>
				<pubDate>Thu, 12 Mar 2020 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/implementing-lru-cache-in-go/</guid>
				<description>&lt;p&gt;LRU Cacheは何かをキャッシュする際によく使うデータ構造の一つだと思う。よく使う一方でその実装はやったことがなかったので、今回Goで実装してみたよ、という話。&lt;/p&gt;&#xA;&lt;h2 id=&#34;lrucacheとは&#34;&gt;LRUCacheとは？&lt;/h2&gt;&#xA;&lt;p&gt;&lt;code&gt;Least Recently Used Cache&lt;/code&gt; のこと。一定のキャパシティを持つもので、キャパシティを超える場合使用された時間がもっとも古い要素から削除される。詳しくは&lt;a href=&#34;https://en.wikipedia.org/wiki/Cache_replacement_policies#LRU&#34;&gt;Wikipedia&lt;/a&gt;を見てもらうと良いと思う。&lt;/p&gt;&#xA;&lt;h2 id=&#34;goでの実装とその解説&#34;&gt;Goでの実装とその解説&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/oinume/algo/blob/master/datastructure/lru_cache/lru_cache.go&#34;&gt;https://github.com/oinume/algo/blob/master/datastructure/lru_cache/lru_cache.go&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/oinume/algo/blob/master/datastructure/lru_cache/default.go&#34;&gt;https://github.com/oinume/algo/blob/master/datastructure/lru_cache/default.go&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/oinume/algo/blob/master/datastructure/lru_cache/default_test.go&#34;&gt;https://github.com/oinume/algo/blob/master/datastructure/lru_cache/default_test.go&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;まずは単純に実装してみた。テストも含めると上記の3つのファイルから構成されている。lru_cache.goには以下のようなGetとPutメソッドがinterfaceとして定義されており、その実装がdefault.goにある。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;mysql&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;LRUCache&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;interface&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Get&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;returns&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Returns&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;not&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;found&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Put&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sets&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;with&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Put&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;使用例&#34;&gt;使用例&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/oinume/algo/blob/lru-cache/datastructure/lru_cache/example_test.go&#34;&gt;example_test.go&lt;/a&gt; で使用例が書かれており、これを&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   cache := lru_cache.NewDefault(2)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    cache.Put(1, 1)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    cache.Put(2, 2)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    fmt.Println(cache.Get(1)) // References key `1`&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    cache.Put(3, 3) // This operation evicts key `2`&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    // Output:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    // 1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    // -1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    fmt.Println(cache.Get(2))&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上のコードにあるように、&lt;code&gt;cache.Put(3, 3)&lt;/code&gt; によって一番参照が古いkey &lt;code&gt;2&lt;/code&gt; がcacheから削除される。結果として、&lt;code&gt;cache.Get(2)&lt;/code&gt;は-1を返す。これがLRU Cacheの基本的な動作である。&lt;/p&gt;&#xA;&lt;h3 id=&#34;キャッシュのアイテム&#34;&gt;キャッシュのアイテム&lt;/h3&gt;&#xA;&lt;p&gt;キャッシュするアイテムはmapを使って管理する。この時、「いつ参照されたのか」を判断するために、mapのvalueには以下のような&lt;code&gt;item&lt;/code&gt;構造体を保存する。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;type item struct {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    value int&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    age   int&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;なお、item.ageはそのアイテムがGetで参照された時またはPutで追加された時のageとなる。そのため、LRU Cacheの実装をしている defaultLRUCache ではGet/Putが呼ばれるたびに&lt;code&gt;currentAge&lt;/code&gt;というフィールドをインクリメントする。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;type defaultLRUCache struct {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    capacity   int&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    values     map[int]*item&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    currentAge int&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    mutex      *sync.Mutex&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;get&#34;&gt;Get&lt;/h3&gt;&#xA;&lt;p&gt;Getの実装はシンプルで、以下を行うだけである&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;keyが存在しない場合: -1を返す&lt;/li&gt;&#xA;&lt;li&gt;keyが存在する場合: 参照されたitemのageを更新し、currentAgeをインクリメントしてreturnする&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;c&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;defaultLRUCache&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;key&lt;/span&gt; &lt;span class=&#34;ne&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;ne&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ok&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;values&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ok&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mutex&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Lock&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;age&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;currentAge&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Get&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;`&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;also&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;increment&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;current&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;age&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;currentAge&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mutex&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Unlock&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;put&#34;&gt;Put&lt;/h3&gt;&#xA;&lt;p&gt;Getに比べるとPutはやや複雑である。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;すでにitemがある場合: mapに存在するitemのageを更新する&lt;/li&gt;&#xA;&lt;li&gt;itemがない場合&#xA;&lt;ul&gt;&#xA;&lt;li&gt;LRU Cacheのcapacityを超えている場合: mapの中で一番ageが小さいitemを見つけて削除する&lt;/li&gt;&#xA;&lt;li&gt;上記に加えて、mapにitemをセットする&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;という操作を行う。またそれぞれの操作で currentAgeをインクリメントする。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;c&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;defaultLRUCache&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Put&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;key&lt;/span&gt; &lt;span class=&#34;ne&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt; &lt;span class=&#34;ne&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mutex&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Lock&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;defer&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mutex&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Unlock&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ok&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;values&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;];&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ok&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;If&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;the&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;key&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;exists&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;update&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;its&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;increment&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;its&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;age&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;this&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;age&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;currentAge&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;currentAge&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;values&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;capacity&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Search&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;key&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;with&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;least&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;age&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;when&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;over&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;capacity&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;before&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;setting&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;key&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;leastAge&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;math&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MaxInt32&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;leastAgeKey&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;item&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;range&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;values&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;item&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;age&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;leastAge&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                    &lt;span class=&#34;n&#34;&gt;leastAge&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;item&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;age&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                    &lt;span class=&#34;n&#34;&gt;leastAgeKey&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;leastAgeKey&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Evict&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;least&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;age&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;key&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cache&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;n&#34;&gt;delete&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;values&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;leastAgeKey&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Set&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;key&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;to&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cache&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;values&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;item&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;age&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;   &lt;span class=&#34;n&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;currentAge&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;currentAge&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;この実装の問題点&#34;&gt;この実装の問題点&lt;/h2&gt;&#xA;&lt;p&gt;このdefaultLRUCacheの実装には一つ大きな問題がある。というのは、capacityを超えている場合、ループで一番ageが小さいものを探しているため、O(n)のコストがかかる。これについては長くなるので別の記事でまとめようと思う。&lt;/p&gt;&#xA;&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;&#xA;&lt;p&gt;LRU Cacheのとてもシンプルな実装をやってみた。簡単なので面接の時の課題として出してみるのも面白いかなと思った。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B078WPYHGN?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;&lt;img src=&#34;https://m.media-amazon.com/images/I/510SEnzHpbL._SL500_.jpg&#34; alt=&#34;アルゴリズムイントロダクション 第3版 総合版：世界標準MIT教科書&#34; loading=&#34;lazy&#34; title=&#34;アルゴリズムイントロダクション 第3版 総合版：世界標準MIT教科書&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B078WPYHGN?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;アルゴリズムイントロダクション 第3版 総合版：世界標準MIT教科書&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者:Thomas H. Cormen,Clifford Stein,Ronald L. Rivest,Charles E. Leiserson&lt;/li&gt;&#xA;&lt;li&gt;近代科学社&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B078WPYHGN?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;Amazon&lt;/a&gt;&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Review on Jan 2020</title>
				<link>https://journal.lampetty.net/posts/review-2020-01/</link>
				<pubDate>Tue, 04 Feb 2020 09:47:09 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/review-2020-01/</guid>
				<description>&lt;h2 id=&#34;what-i-did-on-jan-2020&#34;&gt;What I did on Jan 2020&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Got flu on the beginning of this year...&lt;/li&gt;&#xA;&lt;li&gt;Went to GoDays 2020 in Berlin!&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Went to Warsaw as a persona trip&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Work, work, work&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;output&#34;&gt;Output&lt;/h2&gt;&#xA;&lt;p&gt;Wrote a &lt;a href=&#34;https://journal.lampetty.net/entry/create-a-release-branch-with-github-actions&#34;&gt;blog post&lt;/a&gt; about GitHub Actions.&lt;/p&gt;&#xA;&lt;h2 id=&#34;sleep&#34;&gt;Sleep&lt;/h2&gt;&#xA;&lt;p&gt;6 hours 50 min.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;1st week: many sleep hours but less deep sleep because of flu&lt;/li&gt;&#xA;&lt;li&gt;2nd week: OK&lt;/li&gt;&#xA;&lt;li&gt;3rd week: few sleep hours because of jet lag&lt;/li&gt;&#xA;&lt;li&gt;4th week: OK&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;algorithms-and-datastructures&#34;&gt;Algorithms and datastructures&lt;/h2&gt;&#xA;&lt;p&gt;No progress...&lt;/p&gt;&#xA;&lt;h2 id=&#34;english&#34;&gt;English&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Had 4 lessons in DMMEikaiwa&lt;/li&gt;&#xA;&lt;li&gt;Learned new words with iKnow on almost every day&lt;/li&gt;&#xA;&lt;li&gt;English chat lunch once every week&#xA;&lt;ul&gt;&#xA;&lt;li&gt;This is supported by my company, having a lunch with 4 people. This is very good to listen &lt;code&gt;live&lt;/code&gt; English.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;This blog post!&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>GitHub ActionsでReleaseが作成されたら次のバージョンのrelease branchを自動的に作る</title>
				<link>https://journal.lampetty.net/posts/create-a-release-branch-with-github-actions/</link>
				<pubDate>Mon, 03 Feb 2020 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/create-a-release-branch-with-github-actions/</guid>
				<description>&lt;h2 id=&#34;はじめに&#34;&gt;はじめに&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;自分のチームでは&lt;a href=&#34;https://nvie.com/posts/a-successful-git-branching-model/&#34;&gt;A successful Git branching model&lt;/a&gt;に近い感じで、リリースする前にrelease branchを作りそこにfeature branchをmergeしてからテストしてリリースする、という流れで開発からリリースまでのサイクルを回している。&lt;/li&gt;&#xA;&lt;li&gt;リリースする前に誰かがrelease branchを作成するという作業が手間だったため、GitHub Actionsで自動化できないかと思い、実際やってみたところ意外と簡単にできたので、そこで得られた知識をこの記事にまとめる&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;実際のコードと説明&#34;&gt;実際のコードと説明&lt;/h2&gt;&#xA;&lt;p&gt;それでは実際のactionsのYAMLファイルをもとに細かく説明する。今回使用したYAMLファイルは&lt;a href=&#34;https://github.com/oinume/playground-github-actions/blob/master/.github/workflows/new-pull-request.yml&#34;&gt;ここ&lt;/a&gt;にあがっている。&lt;/p&gt;&#xA;&lt;h3 id=&#34;on-でフックしたいイベントを定義する&#34;&gt;&lt;code&gt;on&lt;/code&gt; でフックしたいイベントを定義する&lt;/h3&gt;&#xA;&lt;p&gt;GitHub Actionsを作成すると、&lt;code&gt;.github/workflows/xxx.yml&lt;/code&gt; が作成される。まずこのYAMLに定義するべきものが&lt;code&gt;on&lt;/code&gt;である。これはワークフローを実行するためのトリガーの定義である。今回の例だと以下のように、releaseがpublish(公開)されたらワークフローを動かすようにしている。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;on:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  release:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    types:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      - published&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;他にも branchにpushされたら、pull-requestが作成されたらなどをトリガーすることができる。詳細は以下の公式ドキュメントで詳しく説明されている。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://help.github.com/en/actions/automating-your-workflow-with-github-actions/workflow-syntax-for-github-actions#on&#34;&gt;Workflow syntax for GitHub Actions - GitHub Help&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://help.github.com/en/actions/automating-your-workflow-with-github-actions/events-that-trigger-workflows&#34;&gt;Events that trigger workflows - GitHub Help&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;jobsで実行する処理を定義する&#34;&gt;&lt;code&gt;jobs&lt;/code&gt;で実行する処理を定義する&lt;/h3&gt;&#xA;&lt;p&gt;jobsの下に行いたい処理の名前(job_id)を書いて、その下に行いたい処理を記述していく。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://help.github.com/en/actions/automating-your-workflow-with-github-actions/workflow-syntax-for-github-actions#jobsjob_idruns-on&#34;&gt;runs-on&lt;/a&gt;: 実行するmachine typeを指定する。指定できるmachine typeについては公式ドキュメントに書いてある&lt;/li&gt;&#xA;&lt;li&gt;stepには&lt;code&gt;uses&lt;/code&gt;や&lt;code&gt;run&lt;/code&gt;が定義できる&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://help.github.com/en/actions/automating-your-workflow-with-github-actions/workflow-syntax-for-github-actions#jobsjob_idstepsuses&#34;&gt;uses&lt;/a&gt;: 他のGitHub Actionsを使う&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.hatena.ne.jp/oinume/oinume.hatenablog.com/edit?entry=26006613505018291&#34;&gt;run&lt;/a&gt;: コマンドをshellで実行する。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;例&#34;&gt;例&lt;/h4&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;jobs:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  build:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    runs-on: ubuntu-latest&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    steps:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    - uses: actions/checkout@v2&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;環境変数のセット&#34;&gt;環境変数のセット&lt;/h3&gt;&#xA;&lt;p&gt;何かしら計算した結果を保存して、次のstepで参照できるようにしたいことがある。そういう場合は環境変数をセットする。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    steps:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    ...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    - name: Create local changes&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      run: |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        CURRENT_VERSION=$(echo $GITHUB_REF | sed &amp;#39;s/refs\/tags\///&amp;#39;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        echo &amp;#34;CURRENT_VERSION = $CURRENT_VERSION&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        NEXT_VERSION=$(echo $CURRENT_VERSION | perl -ne &amp;#39;if ($_ =~ /^(\d+)\.(\d+)\.\d+$/) { $v = $2; $v++; print &amp;#34;$1.$v.0\n&amp;#34; } else { print &amp;#34;Invalid tag format.&amp;#34;; exit 1 }&amp;#39;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        echo &amp;#34;NEXT_VERSION = $NEXT_VERSION&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        echo &amp;#34;::set-env name=NEXT_VERSION::$(echo $NEXT_VERSION)&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;例えば上記のコードは以下の処理を行っている。&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;GITHUB_REFにあるタグの値(refs/tags/0.1.0)を取得&lt;/li&gt;&#xA;&lt;li&gt;そこからバージョン部分を抜き出してCURRENT_VERSIONにセット&lt;/li&gt;&#xA;&lt;li&gt;perlで次のバージョンにインクリメントしてNEXT_VERSIONにセット&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;::set-env&lt;/code&gt;を使って環境変数&lt;code&gt;NEXT_VERSION&lt;/code&gt;をセット&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;構文が気持ち悪いが、&lt;a href=&#34;https://help.github.com/en/actions/automating-your-workflow-with-github-actions/development-tools-for-github-actions#set-an-environment-variable-set-env&#34;&gt;set-env&lt;/a&gt;を使うことで環境変数をセットすることができ、後続のstepで参照することができる。&lt;/p&gt;&#xA;&lt;h3 id=&#34;secrets&#34;&gt;secrets&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    steps:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    ...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    - name: Create a pull request with a new release branch&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      uses: peter-evans/create-pull-request@v2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      with:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        token: ${{ secrets.GITHUB_TOKEN }}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        branch: release/${{ env.NEXT_VERSION }}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        base: master&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        title: &amp;#34;Release ${{ env.NEXT_VERSION }}&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        body: &amp;#34;## Pull-requests in this release\n- TBD&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上記のコードはpull-requestを作る例だが、GitHub上のリポジトリに対して何か操作を行う場合はGitHubのTokenが必要になる。そういう場合は secrets に定義されているGITHUB_TOKENを使用する。また、secretsはリポジトリの設定画面から自分で値をセットすることもできるので、秘匿したい文字列などはsecretsを通してstep内で使用するのが良い。&lt;/p&gt;&#xA;&lt;p&gt;GitHub Actionsの良いところは、デフォルトのsecretsとしてGITHUB_TOKENが定義されていて、GitHubのリポジトリに対して操作を行う場合はTokenのことを気にする必要がないことだと思う。&lt;/p&gt;&#xA;&lt;h3 id=&#34;contexts-expressions-functions&#34;&gt;contexts, expressions, functions&lt;/h3&gt;&#xA;&lt;p&gt;GitHub ActionsのYAMLでは式を書くことができる。例えば以下のコードはpeter-evans/create-pull-request@v2の引数として&lt;code&gt;branch: release/${{ env.NEXT_VERSION }}&lt;/code&gt; を渡しているが、&lt;code&gt;{{ ... }}&lt;/code&gt;の中には式を書くことができる。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    - name: Create a pull request with a new release branch&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      uses: peter-evans/create-pull-request@v2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      with:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        token: ${{ secrets.GITHUB_TOKEN }}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        branch: release/${{ env.NEXT_VERSION }}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        base: master&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        title: &amp;#34;Release ${{ env.NEXT_VERSION }}&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        body: &amp;#34;## Pull-requests in this release\n- TBD&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;また、この式の部分では &lt;code&gt;env&lt;/code&gt; のようなあらかじめ定義されている&lt;a href=&#34;https://help.github.com/en/actions/automating-your-workflow-with-github-actions/contexts-and-expression-syntax-for-github-actions#contexts&#34;&gt;contexts&lt;/a&gt;が使える。他にどのようなcontextsがあるかはドキュメントを読むと良い。&lt;/p&gt;&#xA;&lt;p&gt;さらに、あらかじめ定義された&lt;a href=&#34;https://help.github.com/en/actions/automating-your-workflow-with-github-actions/contexts-and-expression-syntax-for-github-actions#functions&#34;&gt;functions&lt;/a&gt;があり、expressionの部分で呼び出すことが可能である。&lt;/p&gt;&#xA;&lt;h2 id=&#34;github-actions-marketplace&#34;&gt;GitHub Actions Marketplace&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/marketplace?type=actions&#34;&gt;GitHub Marketplace · Actions to improve your workflow · GitHub&lt;/a&gt;を見るとたくさんのActionがあることがわかると思う。他の人が作った汎用的なActionがたくさん転がっているので、これを見ているだけでも「ああこんなこともできるのか」と参考になるし、いろいろ組み合わせて面倒な作業を自動化することができる。&lt;/p&gt;&#xA;&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;&#xA;&lt;p&gt;エンジニアの業務であるコードを書く、コードレビュー、リリースに関連した作業を自動化するならGitHub Actionsはとてもオススメ。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>2020の抱負</title>
				<link>https://journal.lampetty.net/posts/resolution-in-2020/</link>
				<pubDate>Thu, 16 Jan 2020 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/resolution-in-2020/</guid>
				<description>&lt;p&gt;新年あけましておめでとうございます。年末年始はインフルエンザになって寝込んでいて、そういえば今年は厄年だったことを思い出しました。もう1/15になってだけど2020年の抱負をあらためて書いておこうと思います。&lt;/p&gt;&#xA;&lt;h2 id=&#34;1日6時間15分以上寝る&#34;&gt;1日6時間15分以上寝る&lt;/h2&gt;&#xA;&lt;p&gt;昨年は1日6時間以上寝る、ということが目標だったので今年は15分長くしてみる。理想は1日7時間睡眠なので最終的にはこれを目指したい。&lt;/p&gt;&#xA;&lt;h2 id=&#34;アルゴリズムとデータ構造をもっと勉強する&#34;&gt;アルゴリズムとデータ構造をもっと勉強する&lt;/h2&gt;&#xA;&lt;p&gt;昨年途中で投げ出してしまったヤツ。なお、ちゃんと解説をブログにアウトプットする。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Graph&lt;/li&gt;&#xA;&lt;li&gt;オートマトン&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;アウトプット&#34;&gt;アウトプット&lt;/h2&gt;&#xA;&lt;p&gt;1ヶ月に1つはちゃんとした記事を書く。昨年に引き続き継続は力なり、ということで。&lt;/p&gt;&#xA;&lt;h2 id=&#34;英語&#34;&gt;英語&lt;/h2&gt;&#xA;&lt;p&gt;IELTS Overall 6.0を目指す。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>2019年の振り返り</title>
				<link>https://journal.lampetty.net/posts/review-2019/</link>
				<pubDate>Mon, 23 Dec 2019 08:30:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/review-2019/</guid>
				<description>&lt;p&gt;2019年も早いものであっという間に終わってしまった。以下が2019年初頭に考えていた抱負だったので、これをベースに振り返りをしてみよう。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://journal.lampetty.net/entry/resolution-in-2019&#34;&gt;journal.lampetty.net&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;アウトプット&#34;&gt;アウトプット&lt;/h2&gt;&#xA;&lt;p&gt;ちゃんとした記事を月に一つは書く！というの目標に対しては以下のように未達だったけど、&lt;a href=&#34;https://journal.lampetty.net/archive/2019&#34;&gt;合計25個の記事&lt;/a&gt;を書いたし、未達だったのは3月と10月だけだったのでほぼ達成と言って良いのではないかと。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;1月: ◯&lt;/li&gt;&#xA;&lt;li&gt;2月: ◯&lt;/li&gt;&#xA;&lt;li&gt;3月: ✕&lt;/li&gt;&#xA;&lt;li&gt;4月: ◯&lt;/li&gt;&#xA;&lt;li&gt;5月: ◯&lt;/li&gt;&#xA;&lt;li&gt;6月: ◎&lt;/li&gt;&#xA;&lt;li&gt;8月: ◯&lt;/li&gt;&#xA;&lt;li&gt;9月: ◯&lt;/li&gt;&#xA;&lt;li&gt;10月: ✕&lt;/li&gt;&#xA;&lt;li&gt;11月: ◯&lt;/li&gt;&#xA;&lt;li&gt;12月: ◎&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;また、会社のAdvent Calendarでも以下の記事を書いた。3年半も勤めているのにこれが初めての記事だった...! &lt;a href=&#34;https://b.hatena.ne.jp/entry/s/tech.mercari.com/entry/2019/12/22/080000&#34;&gt;はてブ&lt;/a&gt;や&lt;a href=&#34;https://twitter.com/search?q=https%3A%2F%2Ftech.mercari.com%2Fentry%2F2019%2F12%2F22%2F080000&amp;amp;src=typed_query&amp;amp;f=live&#34;&gt;Twitter&lt;/a&gt;でもいろいろフィードバックされているのを見てとても勉強になったし、来年はもっとアウトプットしていこうという気持ちが強くなった。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://tech.mercari.com/entry/2019/12/22/080000&#34;&gt;tech.mercari.com&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;1日6時間以上寝る&#34;&gt;1日6時間以上寝る&lt;/h2&gt;&#xA;&lt;p&gt;iPhoneのヘルスケアアプリによると各月の平均睡眠時間は以下のような結果だった。2,4,5,9月以外は達成できているし、実感として昨年より良く寝れていて毎日のパフォーマンスも上がっている気がする。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;1月: データなし&lt;/li&gt;&#xA;&lt;li&gt;2月: 5h11min&lt;/li&gt;&#xA;&lt;li&gt;3月: 6h2min&lt;/li&gt;&#xA;&lt;li&gt;4月: 5h56min&lt;/li&gt;&#xA;&lt;li&gt;5月: 5h56min&lt;/li&gt;&#xA;&lt;li&gt;6月: 6h20min&lt;/li&gt;&#xA;&lt;li&gt;7月: 6h25min&lt;/li&gt;&#xA;&lt;li&gt;8月: 6h10min&lt;/li&gt;&#xA;&lt;li&gt;9月: 5h59min&lt;/li&gt;&#xA;&lt;li&gt;10月: 6h27min&lt;/li&gt;&#xA;&lt;li&gt;11月: 6h19min&lt;/li&gt;&#xA;&lt;li&gt;12月: 6h13min&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;アルゴリズムもっと勉強する&#34;&gt;アルゴリズムもっと勉強する&lt;/h2&gt;&#xA;&lt;p&gt;以下のような結果だった。Graphは中途半端なところで終わっているので再開したい。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/oinume/algo/tree/master/datastructure/btree&#34;&gt;BTree&lt;/a&gt;: ◯&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/oinume/algo/tree/master/datastructure/graph&#34;&gt;Graph&lt;/a&gt;: △&lt;/li&gt;&#xA;&lt;li&gt;オートマトン: ✕&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;暗号技術を勉強する&#34;&gt;暗号技術を勉強する&lt;/h2&gt;&#xA;&lt;p&gt;これはまったくやる暇がなかったのと、特に何かで必要なものではないので、目標設定をミスったかなという気がしている。&lt;/p&gt;&#xA;&lt;h2 id=&#34;業務で必要なものを身につける&#34;&gt;業務で必要なものを身につける&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;gRPC: ☓&lt;/li&gt;&#xA;&lt;li&gt;Cloud Spanner: △&lt;/li&gt;&#xA;&lt;li&gt;Cloud PubSub: ◯&lt;/li&gt;&#xA;&lt;li&gt;SQLを復習する: ☓&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;これはそれぞれの項目でどこまでやるというゴールをちゃんと決めたほうが良かった。&lt;/p&gt;&#xA;&lt;h2 id=&#34;英語を再開する&#34;&gt;英語を再開する&lt;/h2&gt;&#xA;&lt;p&gt;いつかは海外で働きたいと思っていて、自分の英語力をどう伸ばすかはずっと課題だったのでまずはIELTSを受けてみた。結果としては &lt;code&gt;Overall: 5.0&lt;/code&gt; であり「6.0ぐらいはあるかなー」という予想を大きく下回っていた。でも自分の実力がわかったし、これまでやってきたDMM英会話ベースでデイリーニュースを読むみたいな学習法だと英語力は伸びないということがわかったので、来年からは違う方法(カランメソッド)でやっていこうと思う。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Overall: 5.0&lt;/li&gt;&#xA;&lt;li&gt;Listening: 5.5&lt;/li&gt;&#xA;&lt;li&gt;Reading: 5.0&lt;/li&gt;&#xA;&lt;li&gt;Writing: 5.0&lt;/li&gt;&#xA;&lt;li&gt;Speaking: 5.0&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;あと、2年前から伸び悩んでいたTOEICも受けてみたのだけど、2年前より30点だけスコアが上がっていて自己ベストを更新したのが嬉しかった。DMM英会話をやめて単語ぐらいしか真面目に勉強していなかったけど、それでもまだスコアが伸びる余地があるということが実感できた。何よりも40歳を過ぎても何かの能力・スコアが上がるという実感が得られたのが嬉しい。&lt;/p&gt;&#xA;&lt;h2 id=&#34;読んだ本&#34;&gt;読んだ本&lt;/h2&gt;&#xA;&lt;p&gt;今年はほとんど本を読まなかった。真面目に読んだのは以下のみ。&lt;/p&gt;&#xA;&lt;h3 id=&#34;googleを支える技術&#34;&gt;Googleを支える技術&lt;/h3&gt;&#xA;&lt;p&gt;Googleの初期の検索システムの内部構造などについて詳しく書かれている本。とてもわかりやすく説明してあって楽しく読めた。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/exec/obidos/ASIN/4774134325/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/51m8phYZbyL._SL160_.jpg&#34; alt=&#34;Googleを支える技術 ‾巨大システムの内側の世界 (WEB&amp;#43;DB PRESSプラスシリーズ)&#34; loading=&#34;lazy&#34; title=&#34;Googleを支える技術 ‾巨大システムの内側の世界 (WEB&amp;#43;DB PRESSプラスシリーズ)&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/exec/obidos/ASIN/4774134325/kazzhomeunixo-22/&#34;&gt;Googleを支える技術 ‾巨大システムの内側の世界 (WEB+DB PRESSプラスシリーズ)&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者:西田 圭介&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: 技術評論社&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2008/03/28&lt;/li&gt;&#xA;&lt;li&gt;メディア: 単行本（ソフトカバー）&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;脳を鍛えるには運動しかない&#34;&gt;脳を鍛えるには運動しかない!&lt;/h3&gt;&#xA;&lt;p&gt;運動後に何かを勉強すると学習効率が上がるなど、実験結果の事例から運動と脳の関係性について説明する本。運動することはメンタルヘルスにも良い影響があるということで、これを読んだあとから必ず週に2回はジムで有酸素運動をするようにしている。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/exec/obidos/ASIN/4140813539/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/51hm6jleZOL._SL160_.jpg&#34; alt=&#34;脳を鍛えるには運動しかない!  最新科学でわかった脳細胞の増やし方&#34; loading=&#34;lazy&#34; title=&#34;脳を鍛えるには運動しかない!  最新科学でわかった脳細胞の増やし方&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/exec/obidos/ASIN/4140813539/kazzhomeunixo-22/&#34;&gt;脳を鍛えるには運動しかない! 最新科学でわかった脳細胞の増やし方&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者:ジョン J. レイティ,エリック ヘイガーマン&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: NHK出版&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2009/03/20&lt;/li&gt;&#xA;&lt;li&gt;メディア: 単行本（ソフトカバー）&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;go言語による並行処理&#34;&gt;Go言語による並行処理&lt;/h3&gt;&#xA;&lt;p&gt;Goの並行処理についてとにかく丁寧にわかりやすく解説している良い本。Goは一通り書けるけど、channelやgoroutineを使いこなせていないと感じている人にはぜひオススメしたい。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/exec/obidos/ASIN/4873118468/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/51pUKQajnaL._SL160_.jpg&#34; alt=&#34;Go言語による並行処理&#34; loading=&#34;lazy&#34; title=&#34;Go言語による並行処理&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/exec/obidos/ASIN/4873118468/kazzhomeunixo-22/&#34;&gt;Go言語による並行処理&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者:Katherine Cox-Buday&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: オライリージャパン&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2018/10/26&lt;/li&gt;&#xA;&lt;li&gt;メディア: 単行本（ソフトカバー）&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;intellij-ideaハンズオン&#34;&gt;IntelliJ IDEAハンズオン&lt;/h3&gt;&#xA;&lt;p&gt;IntelliJについて詳しく解説してある本。ほぼ独学で使っているIntelliJについて、体系的に学び直せたのは良かった。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/exec/obidos/ASIN/4774193836/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/51Q6TDdmpHL._SL160_.jpg&#34; alt=&#34;IntelliJ IDEAハンズオン――基本操作からプロジェクト管理までマスター&#34; loading=&#34;lazy&#34; title=&#34;IntelliJ IDEAハンズオン――基本操作からプロジェクト管理までマスター&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/exec/obidos/ASIN/4774193836/kazzhomeunixo-22/&#34;&gt;IntelliJ IDEAハンズオン――基本操作からプロジェクト管理までマスター&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者:山本 裕介,今井 勝信&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: 技術評論社&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2017/11/08&lt;/li&gt;&#xA;&lt;li&gt;メディア: 大型本&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;エンジニアの知的生産術&#34;&gt;エンジニアの知的生産術&lt;/h3&gt;&#xA;&lt;p&gt;これが2019年の中でベストな本だった。まだ読み終わっていないけど、どうすれば効率的に本を読めるかなどが体系的に書かれているし、すぐに実践できる内容でもある。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/exec/obidos/ASIN/4774198765/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/510ppvAzSeL._SL160_.jpg&#34; alt=&#34;エンジニアの知的生産術 ──効率的に学び、整理し、アウトプットする (WEB&amp;#43;DB PRESS plusシリーズ)&#34; loading=&#34;lazy&#34; title=&#34;エンジニアの知的生産術 ──効率的に学び、整理し、アウトプットする (WEB&amp;#43;DB PRESS plusシリーズ)&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/exec/obidos/ASIN/4774198765/kazzhomeunixo-22/&#34;&gt;エンジニアの知的生産術 ──効率的に学び、整理し、アウトプットする (WEB+DB PRESS plusシリーズ)&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者:西尾 泰和&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: 技術評論社&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2018/08/10&lt;/li&gt;&#xA;&lt;li&gt;メディア: 単行本（ソフトカバー）&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;育児&#34;&gt;育児&lt;/h2&gt;&#xA;&lt;p&gt;息子も5歳になって、0歳〜2歳の時に比べると本当に手がかからなくなってきたように思う。元気に育っていてそれが一番ありがたいし(元気すぎて困る)、今年だけで以下のアビリティを習得している(すごい!)。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;自転車に乗れるようになった!&lt;/li&gt;&#xA;&lt;li&gt;ひらがなを全部読めるようになった&lt;/li&gt;&#xA;&lt;li&gt;自分の名前をひらがなで書けるようになった&lt;/li&gt;&#xA;&lt;li&gt;(体操の)前転と後転がすごく上手になった&lt;/li&gt;&#xA;&lt;li&gt;レゴをほぼ自分だけで組み立てられるようになった&lt;/li&gt;&#xA;&lt;li&gt;英単語を少しだけ覚え始めた&lt;/li&gt;&#xA;&lt;li&gt;箸を持てるようになった(練習中)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;また、奥さんの海外出張が今年も2回あったけど、去年よりはうまく乗り切れた気がする。去年は出張中は寂しくて泣いてしまう時が多かったけど、今年は1,2回しか泣かなかったし、なるべく休みの日は鉄道博物館とか、今までに行ったことがないところに連れて行って楽しくやれたんじゃないかと思う。&lt;/p&gt;&#xA;&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;&#xA;&lt;p&gt;2019年は2018年に比べると仕事も忙しかったけど、学びやアウトプットは昨年よりこなせたかなと思う。2020年も引き続き目標を明確にして頑張っていきたいなと思う。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>OpenCensusとhttptrace.ClientTraceを使ってHTTPリクエストのlatencyを可視化する</title>
				<link>https://journal.lampetty.net/posts/opencensus-httptrace/</link>
				<pubDate>Thu, 19 Dec 2019 08:30:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/opencensus-httptrace/</guid>
				<description>&lt;h2 id=&#34;はじめに&#34;&gt;はじめに&lt;/h2&gt;&#xA;&lt;p&gt;みなさんこんにちは。これは&lt;a href=&#34;https://qiita.com/advent-calendar/2019/go5&#34;&gt;Go5 Advent Calendar 2019&lt;/a&gt;の19日目の記事です。この記事はOpenCensusとhttptrace.ClientTraceを使ってHTTPリクエストの内部的なlatencyを可視化する話です。「内部的なlatency」というのは、HTTPリクエストの中で名前解決にどのぐらいかかったとか、コネクションを張るのにどのぐらいかかったなどです。&lt;/p&gt;&#xA;&lt;p&gt;なお、この記事に記載しているコードは全て&lt;a href=&#34;https://github.com/oinume/go-http-client-trace-sample&#34;&gt;GitHub repository&lt;/a&gt;に上げてあります。&lt;/p&gt;&#xA;&lt;h2 id=&#34;やりたいこと&#34;&gt;やりたいこと&lt;/h2&gt;&#xA;&lt;p&gt;とあるアプリケーションでHTTP Clientを使ってHTTPリクエストを大量に送る処理がありました。そのサーバーはUS Regionで動いていて、そこからHTTPリクエストを日本にあるサーバーに送るというもので、この処理のlatencyが非常に気になっていました。そのため、HTTPリクエストのどの部分が遅いのかを可視化したいと思って調べたところ、OpenCensusとhttptrace.ClientTraceに行き着いたのでその紹介をしたいと思います。&lt;/p&gt;&#xA;&lt;h2 id=&#34;opencensusと分散トレーシング&#34;&gt;OpenCensusと分散トレーシング&lt;/h2&gt;&#xA;&lt;p&gt;今回使うのは&lt;a href=&#34;https://opencensus.io/tracing/&#34;&gt;OpenCensusのTracing&lt;/a&gt;という機能です。いわゆる分散トレーシングと呼ばれるものですが、詳しく説明していると長くなるので、詳細は以下の記事を読んでみて下さい。OpenCensusや分散トレーシングについてとてもよくまとまっています。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://future-architect.github.io/articles/20190604/&#34;&gt;future-architect.github.io&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;span&#34;&gt;Span&lt;/h3&gt;&#xA;&lt;p&gt;分散トレーシングではSpanというものを一つの処理の単位として登録します。例えば以下のようなGoのコードでは、main関数でSpanを1つ作り、main関数からfunc1, func2を呼び出して、それぞれの関数でも新しくSpanを作っています。&lt;/p&gt;&#xA;&lt;p&gt;これを&lt;a href=&#34;https://www.jaegertracing.io/&#34;&gt;Jaeger&lt;/a&gt;という分散トレーシングを可視化するソフトウェアで表示したものが以下になります。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;trace: main&#xA;&lt;ul&gt;&#xA;&lt;li&gt;trace: func1&lt;/li&gt;&#xA;&lt;li&gt;trace: func2&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;というようにSpanがツリー構造になっていて、それぞれのSpanでどのぐらい時間がかかっているかがわかると思います。この論理的にまとまったSpanたちがTraceと呼ばれています。&lt;/p&gt;&#xA;&lt;h2 id=&#34;httptraceclienttrace&#34;&gt;httptrace.ClientTrace&lt;/h2&gt;&#xA;&lt;p&gt;httprace.ClientTraceはHTTPリクエストの中で行われる以下の処理について、処理が開始したタイミングと終了したタイミングでコールバックを設定してイベントを受け取ることができるライブラリで、以下のようなコールバックが定義されています。詳しくは&lt;a href=&#34;https://golang.org/pkg/net/http/httptrace/#ClientTrace&#34;&gt;ClientTraceのgodoc&lt;/a&gt;を読むと良いでしょう。参考までに、以下に定義されているコールバックのコメントとその日本語訳を記載しておきます。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;GetConn&#xA;&lt;ul&gt;&#xA;&lt;li&gt;GetConn is called before a connection is created or retrieved from an idle pool&lt;/li&gt;&#xA;&lt;li&gt;コネクションが生成されたもしくはアイドルプールから取得された時に呼ばれる&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;GotConn&#xA;&lt;ul&gt;&#xA;&lt;li&gt;GotConn is called after a successful connection is obtained&lt;/li&gt;&#xA;&lt;li&gt;コネクションの確立が成功した時に呼ばれる&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;DNSStart&#xA;&lt;ul&gt;&#xA;&lt;li&gt;DNSStart is called when a DNS lookup begins.&lt;/li&gt;&#xA;&lt;li&gt;名前解決が始まった時に呼ばれる&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;DNSDone&#xA;&lt;ul&gt;&#xA;&lt;li&gt;DNSDone is called when a DNS lookup ends.&lt;/li&gt;&#xA;&lt;li&gt;名前解決が終了した時に呼ばれる&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;ConnectStart:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;ConnectStart is called when a new connection&#39;s Dial begins&lt;/li&gt;&#xA;&lt;li&gt;新しいコネクションのDialが始まった時に呼ばれる&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;ConnectDone&#xA;&lt;ul&gt;&#xA;&lt;li&gt;ConnectDone is called when a new connection&#39;s Dial completes.&lt;/li&gt;&#xA;&lt;li&gt;新しいコネクションのDialが完了した時に呼ばれる&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;TLSHandshakeStart&#xA;&lt;ul&gt;&#xA;&lt;li&gt;TLSHandshakeStart is called when the TLS handshake is started&lt;/li&gt;&#xA;&lt;li&gt;TLSハンドシェイクが始まった時に呼ばれる&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;TLSHandshakeDone&#xA;&lt;ul&gt;&#xA;&lt;li&gt;TLSHandshakeDone is called after the TLS handshake with either the successful handshake&#39;s connection state, or a non-nil error on handshake failure.&lt;/li&gt;&#xA;&lt;li&gt;TLSHandshakeDoneは、TLSハンドシェイクの接続に成功している場合か、ハンドシェイクがerrorで失敗している場合のどちらでも、TLSハンドシェイクが完了した後に呼ばれる。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;WroteHeaderField&#xA;&lt;ul&gt;&#xA;&lt;li&gt;WroteHeaderField is called after the Transport has written each request header&lt;/li&gt;&#xA;&lt;li&gt;それぞれのリクエストヘッダーのが書き込まれた後に呼ばれる。ヘッダーが複数ある場合は何回も呼ばれることになる。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;WroteHeaders: WroteHeaders is called after the Transport has written all request headers.&#xA;&lt;ul&gt;&#xA;&lt;li&gt;全てのリクエストヘッダーが書き込まれた後に呼ばれる。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;WroteRequest: WroteRequest is called with the result of writing the request and any body.&#xA;&lt;ul&gt;&#xA;&lt;li&gt;リクエストのBodyも含めてリクエストが書き込まれた後に呼ばれる。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;GotFirstResponseByte&#xA;&lt;ul&gt;&#xA;&lt;li&gt;GotFirstResponseByte is called when the first byte of the response headers is available.&lt;/li&gt;&#xA;&lt;li&gt;レスポンスヘッダーの最初の1バイトが読み込める状態になった時に呼ばれる&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;試しにそれぞれのコールバック関数でfmt.Printするだけの&lt;a href=&#34;https://github.com/oinume/opencensus-client-trace-sample/blob/master/examples/client_trace/main.go&#34;&gt;簡単な実装&lt;/a&gt;を書いて実行してみると、以下のように出力されました。どうやらこの順番でコールバックが呼ばれていることがわかります。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ go run examples/client_trace/main.go&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;GetConn&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;DNSStart&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;DNSDone&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ConnectStart&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ConnectDone&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;TLSHandshakeStart&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;TLSHandshakeDone&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;GotConn&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;WroteHeaderField: Host&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;WroteHeaderField: User-Agent&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;WroteHeaderField: Accept-Encoding&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;WroteHeaders&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;WroteRequest&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;GotFirstResponseByte&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ということで、httptrace.ClientTraceを使うとHTTPのコネクションの接続のタイミングやリクエストを送信したタイミングのイベントが受け取れるということがわかりました。&lt;/p&gt;&#xA;&lt;h2 id=&#34;opencensus-tracing--httptraceclienttrace&#34;&gt;OpenCensus Tracing + httptrace.ClientTrace&lt;/h2&gt;&#xA;&lt;p&gt;それではOpenCensusの分散トレーシングとhttptrace.ClientTraceの2つを組み合わせてみましょう。以下のように&lt;a href=&#34;https://godoc.org/go.opencensus.io/plugin/ochttp#NewSpanAnnotatingClientTrace&#34;&gt;ochttp.NewSpanAnnotatingClientTrace&lt;/a&gt;を使うことで、簡単にhttptrace.ClientTraceの情報をTraceのSpanに入れることができます。&lt;/p&gt;&#xA;&lt;p&gt;上記のプログラムを実行して、Jaegerに送られたSpanを可視化したものが以下のスクリーンショットになります。先ほど紹介したGetConnやDNSStartなどがどのぐらい時間がかかったかが相対的にわかるようになっています。例えば、DNSStartは0.25msでDNSDoneは59.84msなので、59.84 - 0.25 = 59.59ms かかっていることになります。&lt;/p&gt;&#xA;&lt;p&gt;これは以下の手順で見ることができます。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ docker-compose up #jaegerを起動&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ go run examples/ochttp_client_trace/main.go #プログラムを実行&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ open http://localhost:16686/search # ブラウザでjaegerを開く&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;newspanannotatingclienttraceとspanannotator&#34;&gt;NewSpanAnnotatingClientTraceとspanAnnotator&lt;/h2&gt;&#xA;&lt;p&gt;先ほどのNewSpanAnnotatingClientTraceでは、内部的にコールバックを定義した&lt;code&gt;spanAnnotator&lt;/code&gt;を用意して、これをhttptrace.ClientTraceのそれぞれのコールバックとして登録しています。spanAnnotatorはSpanを持っていて、それぞれのコールバック関数の中でSpanに対してAnnotationを登録しています。&lt;/p&gt;&#xA;&lt;p&gt;Annotationを登録する時にはtimestampも記録されているため、上のJaegerのスクリーンショットのように各コールバック関数のタイミングで相対的にどのぐらい時間がかかったのかがわかるようになっています。&lt;/p&gt;&#xA;&lt;p&gt;参考までに、以下はspanAnnotatorのDNSStartとDNSDoneのコードです。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;spanAnnotator&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dnsStart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;info&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;httptrace&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;DNSStartInfo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;attrs&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;trace&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Attribute&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;trace&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;StringAttribute&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;httptrace.dns_start.host&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;info&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sp&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Annotate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;attrs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;DNSStart&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;spanAnnotator&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dnsDone&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;info&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;httptrace&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;DNSDoneInfo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;addrs&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;addr&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;range&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;info&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Addrs&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;addrs&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;append&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;addrs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;addr&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;attrs&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;trace&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Attribute&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;trace&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;StringAttribute&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;httptrace.dns_done.addrs&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;strings&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Join&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;addrs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34; , &amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)),&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;info&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Err&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;nil&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;attrs&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;append&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;attrs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;trace&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;StringAttribute&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;httptrace.dns_done.error&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;info&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Err&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Error&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sp&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Annotate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;attrs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;DNSDone&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;&#xA;&lt;p&gt;OpenCensusとhttptrace.ClientTraceを組み合わせることで、HTTPリクエストの詳細なlatencyを可視化する方法を紹介しました。&lt;/p&gt;&#xA;&lt;p&gt;私の場合は、この情報を元にして「コネクションの確立に時間がかかっているから、KeepAliveを長い時間有効にしてなるべくコネクションを使いまわそう」という感じでパフォーマンスチューニングの役に立てています。この記事が何かしらのパフォーマンスチューニングの役に立てば嬉しいです。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/4297107279?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;&lt;img src=&#34;https://m.media-amazon.com/images/I/51X8b0rJEbL._SL500_.jpg&#34; alt=&#34;改訂2版 みんなのGo言語&#34; loading=&#34;lazy&#34; title=&#34;改訂2版 みんなのGo言語&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/4297107279?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;改訂2版 みんなのGo言語&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者:松木 雅幸,mattn,藤原 俊一郎,中島 大一,上田 拓也,牧 大輔,鈴木 健太&lt;/li&gt;&#xA;&lt;li&gt;技術評論社&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/4297107279?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;Amazon&lt;/a&gt;&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Go言語における並行処理 - ユースケース編</title>
				<link>https://journal.lampetty.net/posts/concurrency-in-go-usecases/</link>
				<pubDate>Sat, 16 Nov 2019 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/concurrency-in-go-usecases/</guid>
				<description>&lt;h2 id=&#34;はじめに&#34;&gt;はじめに&lt;/h2&gt;&#xA;&lt;p&gt;これは以下の記事の続きの記事。以下の2つではgoroutineとchannelについて説明したので、これらを使って具体的な並行処理のユースケースを書いてみる。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://journal.lampetty.net/entry/concurrency-in-go-goroutines&#34;&gt;Goにおける並行処理 - goroutine編 - oinume journal&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://journal.lampetty.net/entry/concurrency-in-go-channels&#34;&gt;Goにおける並行処理 - channel編 - oinume journal&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;goroutineによる並行処理がすべて終わるまで待つ&#34;&gt;goroutineによる並行処理がすべて終わるまで待つ&lt;/h2&gt;&#xA;&lt;p&gt;処理を複数のgoroutineで並行で実行したい、というのはよくある例。起動したgoroutineがすべて終わるまで待ちたいときには、以下のように&lt;a href=&#34;https://golang.org/pkg/sync/#WaitGroup&#34;&gt;sync.WaitGroup&lt;/a&gt;を使う。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;package&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;sync&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;wg&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sync&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;WaitGroup&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;20&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;wg&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Add&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;カウンターをインクリメントする&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;go&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;ne&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Printf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;i = &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;%02d&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;, fibonacci = &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;%04d&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\n&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fibonacci&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;defer&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;wg&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Done&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;処理が終わったのでカウンターをデクリメントする&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;}(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;wg&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Wait&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;カウンターが&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;になるまで待つ&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Done&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fibonacci&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;n&lt;/span&gt; &lt;span class=&#34;ne&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;ne&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;n&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;n&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fibonacci&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fibonacci&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;goroutineで並行処理する数に上限を設けたい&#34;&gt;goroutineで並行処理する数に上限を設けたい&lt;/h2&gt;&#xA;&lt;p&gt;よくある要件として「同時に実行する数を制限したい」があるが、この場合はセマフォというパターンで実装する。具体的には、Goであればchannelにバッファが付けられるので、このバッファの数で同時実行数を制限できる。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;package&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;flag&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;io/ioutil&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;net/http&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;regexp&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;sync&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;time&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;concurrency&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;flag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;num of concurrency&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;flag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Parse&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;semaphore&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;make&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;chan&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;struct&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{},&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;concurrency&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;同時実行数&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;wg&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sync&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;WaitGroup&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;urls&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://journal.lampetty.net/entry/what-i-like-about-heroku&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://journal.lampetty.net/entry/e2e-test-with-agouti-in-go&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://journal.lampetty.net/entry/heroku-custom-clock-processes&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://journal.lampetty.net/entry/mac-settings-on-sierra&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://journal.lampetty.net/entry/mysqldump-option-where&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://journal.lampetty.net/entry/introducing-lekcije&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://journal.lampetty.net/entry/intellij-shortcuts-for-reading-source-code&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://journal.lampetty.net/entry/introducing-dead-mans-snitch&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://journal.lampetty.net/entry/concurrency-in-go-channels&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://journal.lampetty.net/entry/concurrency-in-go-goroutines&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://journal.lampetty.net/entry/cancel-and-timeout-with-context-in-go&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://journal.lampetty.net/entry/gcp-cloud-pubsub-memo&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://journal.lampetty.net/entry/oauth2-client-handson-in-go-authorization-code-grant&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://journal.lampetty.net/entry/satisfying-a-large-interface-quickly-in-go&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;u&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;range&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;urls&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;wg&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Add&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;u&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;u&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;go&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;defer&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;wg&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Done&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;fetch&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;semaphore&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;u&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;}()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;wg&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Wait&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;r&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;regexp&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MustCompile&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.*&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fetch&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;semaphore&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;chan&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;struct&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{},&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;url&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;semaphore&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;struct&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{}{}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;defer&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;o&#34;&gt;&amp;lt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;semaphore&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;time&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Sleep&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;time&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Second&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;resp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;url&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;nil&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Printf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;err = %v&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\n&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;defer&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;resp&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Body&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Close&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;bytes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ioutil&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ReadAll&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;resp&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Body&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;nil&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Printf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;err = %v&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\n&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;body&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bytes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;group&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;FindStringSubmatch&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;body&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;group&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Printf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;%v&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\n&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;group&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上記のプログラムはURLのリストからhttp.Getしてtitleだけを表示するプログラムである。ここでは&lt;code&gt;semaphore&lt;/code&gt;というバッファ付きのchannelを使って、以下のように同時実行数を制限できるようにしている。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;mainの中でsemaphoreを生成&lt;/li&gt;&#xA;&lt;li&gt;fetch関数にsemaphoreを渡す&lt;/li&gt;&#xA;&lt;li&gt;fetchの内部で、処理を実行する前にsemaphoreにデータを入れて、処理が終わったらdeferでsemaphoreからデータを取り出している。これによりchannelのバッファを超える場合は処理がブロックされるようになる&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;以下のように実行時に&lt;code&gt;-c 3&lt;/code&gt;と指定することで、同時にhttp.Getする数が3つに制限されてコンソールに出力される数が3行ずつになるはず。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ go run semaphore.go -c 3&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Herokuの好きなところ - oinume journal&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Better Heroku Schedulerを探したらCustom clock processesにたどり着いた - oinume journal&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;WebアプリケーションのE2EテストをGoで書く - oinume journal&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;...&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;バックグラウンドで一定の間隔で処理を行いたい&#34;&gt;バックグラウンドで一定の間隔で処理を行いたい&lt;/h2&gt;&#xA;&lt;p&gt;これは&lt;a href=&#34;https://golang.org/pkg/time/#Ticker&#34;&gt;time.Ticker&lt;/a&gt;とselectを使うことで簡単に実装できる。以下は1秒ごとにdoSomethingを呼び出すプログラム。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;go&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;package&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;time&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ticker&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;time&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;NewTicker&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;time&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Second&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;defer&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ticker&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Stop&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;select&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;case&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;-&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ticker&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;C&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;doSomething&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;doSomething&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;v&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Printf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;%d\n&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;v&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;&#xA;&lt;p&gt;ユースケースについては探せばもっとありそうだけど、よくありそうな並行処理の実装パターン3つを紹介した。何かのためになれば幸いです。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/exec/obidos/ASIN/4873118468/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/51pUKQajnaL._SL160_.jpg&#34; alt=&#34;Go言語による並行処理&#34; loading=&#34;lazy&#34; title=&#34;Go言語による並行処理&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/exec/obidos/ASIN/4873118468/kazzhomeunixo-22/&#34;&gt;Go言語による並行処理&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者:Katherine Cox-Buday&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: オライリージャパン&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2018/10/26&lt;/li&gt;&#xA;&lt;li&gt;メディア: 単行本（ソフトカバー）&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>2019年9月の振り返り</title>
				<link>https://journal.lampetty.net/posts/review-2019-09/</link>
				<pubDate>Sat, 12 Oct 2019 10:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/review-2019-09/</guid>
				<description>&lt;p&gt;8月の振り返りをサボってしまったのでまとめて。&lt;/p&gt;&#xA;&lt;h2 id=&#34;アウトプット&#34;&gt;アウトプット&lt;/h2&gt;&#xA;&lt;p&gt;Goの並行処理の記事とMySQL 8.0へアップデートする記事を書いた。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://journal.lampetty.net/entry/concurrency-in-go-goroutines&#34;&gt;Goにおける並行処理 - goroutine編 - oinume journal&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://journal.lampetty.net/entry/concurrency-in-go-channels&#34;&gt;Goにおける並行処理 - channel編 - oinume journal&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://journal.lampetty.net/entry/problems-when-updating-mysql-5.8-8.0&#34;&gt;Problems when updating MySQL from 5.7 to 8.0 - oinume journal&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;睡眠&#34;&gt;睡眠&lt;/h2&gt;&#xA;&lt;p&gt;1日6時間以上寝る、ということを今年の目標にしている。ヘルスケアアプリによると&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;8月: 6h10min&lt;/li&gt;&#xA;&lt;li&gt;9月: 5h59min&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;という感じで9月はギリギリで未達成。しかもこれ平均で平日は大体5時間ぐらいなのでかなりやばめ。&lt;/p&gt;&#xA;&lt;h2 id=&#34;英語&#34;&gt;英語&lt;/h2&gt;&#xA;&lt;p&gt;9月にIELTSのテストを受けてきた。詳細については以下にまとめたけど、感触としては悪くない気がする。ちなみに11月にTOEICも受ける予定。あと来年前半にTOEFLもおそらく受ける。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://journal.lampetty.net/entry/taking-ielts-test-first-time:ttile&#34;&gt;https://journal.lampetty.net/entry/taking-ielts-test-first-time:ttile&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;アルゴリズム&#34;&gt;アルゴリズム&lt;/h2&gt;&#xA;&lt;p&gt;特に進捗なし&lt;/p&gt;&#xA;&lt;h2 id=&#34;go-grpc-sqlの復習&#34;&gt;Go, gRPC, SQLの復習&lt;/h2&gt;&#xA;&lt;p&gt;引き続き &lt;code&gt;Go言語による並行処理&lt;/code&gt; を読んでいる。あと一つ記事を書きたい。&lt;/p&gt;&#xA;&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;&#xA;&lt;p&gt;まぁボチボチ頑張る。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>初めてIELTSを受験した</title>
				<link>https://journal.lampetty.net/posts/taking-ielts-test-first-time/</link>
				<pubDate>Mon, 30 Sep 2019 08:30:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/taking-ielts-test-first-time/</guid>
				<description>&lt;h2 id=&#34;ieltsってなに&#34;&gt;IELTSってなに？&lt;/h2&gt;&#xA;&lt;p&gt;国際的な英語の試験。大学の入学の条件に使われたり、国によっては永住権を申請する時のポイントとして使われるもの。&lt;/p&gt;&#xA;&lt;h2 id=&#34;会場&#34;&gt;会場&lt;/h2&gt;&#xA;&lt;p&gt;自分は東京会場で、場所は幸ビルディングという新橋付近の貸し会議室っぽいところだった。&lt;/p&gt;&#xA;&lt;h2 id=&#34;持ち込みできるもの&#34;&gt;持ち込みできるもの&lt;/h2&gt;&#xA;&lt;p&gt;中に持っていけるものは&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;鉛筆&lt;/li&gt;&#xA;&lt;li&gt;消しゴム&lt;/li&gt;&#xA;&lt;li&gt;パスポート&lt;/li&gt;&#xA;&lt;li&gt;パスポートのコピー&lt;/li&gt;&#xA;&lt;li&gt;水&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;のみOK。なお、鉛筆はお願いすれば試験の最中に試験官が削ってくれるので、鉛筆削りは持っていなくても大丈夫。&lt;/p&gt;&#xA;&lt;h2 id=&#34;会場に着いてから&#34;&gt;会場に着いてから&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;荷物を預ける&lt;/li&gt;&#xA;&lt;li&gt;IDチェック&lt;/li&gt;&#xA;&lt;li&gt;試験室に入室&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;という流れ。&lt;/p&gt;&#xA;&lt;p&gt;会場のビルの会議室でビニール袋に荷物を詰めて預ける。8:40にはこの荷物置き場が物理的に閉鎖されるので、それまでに会場に着いて荷物を預ける必要がある。&lt;/p&gt;&#xA;&lt;p&gt;その後IDチェック。これをやったあとにトイレに行こうとすると再度指紋認証する必要がありめんどいので先にトイレは済ませておいたほうが良い。IDチェックでは指紋を採取されさらにカメラで写真を取られる。パスポートの顔写真と同一人物かも当然チェックされる。&lt;/p&gt;&#xA;&lt;p&gt;終わると、試験官と一緒に試験する別の部屋に行く。&lt;/p&gt;&#xA;&lt;h2 id=&#34;感想&#34;&gt;感想&lt;/h2&gt;&#xA;&lt;p&gt;受験者は予想通り若い人が多かった印象。驚いたのは、20%ぐらいは外国人(見た目で明らかに日本人じゃないとわかる人)だったこと。アフリカ系の人やインド系の人が多かった。もしかしたら中国人や韓国人も結構いたのかもしれない。カップルで受験している人もちらほらいた。自分みたいな40代のおっさんは1%ぐらいしかいない雰囲気だった。&lt;/p&gt;&#xA;&lt;h2 id=&#34;ieltsの試験&#34;&gt;IELTSの試験&lt;/h2&gt;&#xA;&lt;p&gt;意外なことに&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Writing&lt;/li&gt;&#xA;&lt;li&gt;Reading&lt;/li&gt;&#xA;&lt;li&gt;Listnening&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;という順番だった。というのは、参考書ではListening, Reading, Writing, Spreakingの順番で問題が構成されていたから、順番が全然違うことにびっくりした。もろもろのアナウンスが終わって9:20頃から試験がスタートした気がする。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Writing: 40分&lt;/li&gt;&#xA;&lt;li&gt;Reading: 60分&lt;/li&gt;&#xA;&lt;li&gt;Listening: 30分&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;という時間配分で、12:30ごろには終わった。それぞれのパートの合間で問題や解答用紙を回収する時間があるので、少し休めるのは良かった。TOEICと比べるとこの休憩時間があるおかげでそこまで疲労感を感じなかった気がする。なお、Speakingは午後にあり、自分は15:20開始だったので、昼ごはんを食べて新橋駅付近のカフェで時間を潰していた。&lt;/p&gt;&#xA;&lt;h3 id=&#34;writing&#34;&gt;Writing&lt;/h3&gt;&#xA;&lt;p&gt;トピックは&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Task1: 友人に仕事(求人)を薦める時に、仕事内容、なぜその人にオススメするのか、求人への応募方法をレター風味で書く&lt;/li&gt;&#xA;&lt;li&gt;Task2: 保育園に子供を預けることと、預けないで家族が育てることについての意見を述べよ&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;というもので、どちらも自分にとっては馴染みのあるものだった。なので、書く内容を日本語でまとめておいて、あとはそれをひたすら英語に訳すというスタイルで書いていった。Task1は130 word以上で、ギリギリかけた。一方、Task2は250 word以上なので、圧倒的に時間が足りなくて文章の途中で終わってしまった。Writingは「字数が足りないからあとから文章を付け足す」ということがとてもやりにくいので、英文を書き始める前にちゃんと書く内容を決めておくことが大事だと思った。Computer Basedなテストだったら文章の間に別の文を挿入したりするのが簡単にできたりするんだろうか、などと考えた。&lt;/p&gt;&#xA;&lt;p&gt;とにかく仕事ではこういう風に文章を書くことがあまりないので(デジタルなら後からいくらでも文章を付け足したり入れ替えたりできるので)、時間配分も含めて痛いミスをしてしまったように思う。Task2はおそらく100 wordぐらいしか書けていない。&lt;/p&gt;&#xA;&lt;h3 id=&#34;reading&#34;&gt;Reading&lt;/h3&gt;&#xA;&lt;p&gt;最後のsection以外はそこまで難しくなかった。あと時間が圧倒的に足りないかなと思ったけど、ギリギリ終わるレベルだった。例えばTOEICだと明らかに時間内に終わる量ではないので、それに比べれば時間的な厳しさはなかったように思う。&lt;/p&gt;&#xA;&lt;h3 id=&#34;listening&#34;&gt;Listening&lt;/h3&gt;&#xA;&lt;p&gt;Section1はたしかに一番簡単だった。ただ、選択式ではなく単語を埋めるタイプなので、冠詞をつけるかつけないかでけっこう悩んだ。Section4がやはり最高に難しくて、2,3問合っていればいいか、ぐらいのノリ。&lt;/p&gt;&#xA;&lt;h3 id=&#34;speaking&#34;&gt;Speaking&lt;/h3&gt;&#xA;&lt;p&gt;これは外国人の試験官に連れられて小さい会議室で実施された。&amp;quot;How are you?&amp;quot; とか少し雑談してice breakしてから本試験が始まる。内容としては&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;学生 or 仕事している？&lt;/li&gt;&#xA;&lt;li&gt;仕事で一番興味深いことはなに？&lt;/li&gt;&#xA;&lt;li&gt;どんな音楽を聴く？&lt;/li&gt;&#xA;&lt;li&gt;音楽を聴くときは一人で聴くのが好き？それとも他の人と聴くのが好き？&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;というような質問をされた。案の定Speakingが一番難易度が高いというか、普段の実力値が出てしまうのでこれが一番点数低そうだなと思った。&lt;/p&gt;&#xA;&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;&#xA;&lt;p&gt;試験の2週間前にIELTSの問題集をやって「うわっなにこれ難しすぎ」と絶望していたのだけど、本試験は意外と難しくなく、少しホッとした。スコアは10/13頃に送付されるらしいので、どのぐらいできているのか楽しみ。5.0〜6.0の間ぐらいだと思うんだけどどうなることやら。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4010940808/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/51Tn4pCvumL._SL160_.jpg&#34; alt=&#34;【音声ダウンロード付】IELTSブリティッシュ・カウンシル公認問題集&#34; loading=&#34;lazy&#34; title=&#34;【音声ダウンロード付】IELTSブリティッシュ・カウンシル公認問題集&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4010940808/kazzhomeunixo-22/&#34;&gt;【音声ダウンロード付】IELTSブリティッシュ・カウンシル公認問題集&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: ブリティッシュ・カウンシル,旺文社&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: 旺文社&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2015/09/24&lt;/li&gt;&#xA;&lt;li&gt;メディア: 単行本&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4010940808/kazzhomeunixo-22&#34;&gt;この商品を含むブログを見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>Problems when updating MySQL from 5.7 to 8.0</title>
				<link>https://journal.lampetty.net/posts/problems-when-updating-mysql-5.8-8.0/</link>
				<pubDate>Tue, 24 Sep 2019 08:45:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/problems-when-updating-mysql-5.8-8.0/</guid>
				<description>&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;I updated MySQL from 5.7 to 8.0. There were some problems when updating. This is just a memo how to solve the problems.&lt;/p&gt;&#xA;&lt;h2 id=&#34;innodb-deprecated-file-format-parameters&#34;&gt;InnoDB deprecated file format parameters&lt;/h2&gt;&#xA;&lt;p&gt;These parameters are deprecated in 8.0.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;innodb_file_format&lt;/li&gt;&#xA;&lt;li&gt;innodb_file_format_check&lt;/li&gt;&#xA;&lt;li&gt;innodb_file_format_max&lt;/li&gt;&#xA;&lt;li&gt;innodb_large_prefix&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;ref: &lt;a href=&#34;https://dev.mysql.com/worklog/task/?id=7704&#34;&gt;MySQL :: WL#7704: InnoDB: Remove deprecated file format parameters in 8.0&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;query-cache-parameters-are-deprecated&#34;&gt;Query cache parameters are deprecated&lt;/h2&gt;&#xA;&lt;p&gt;These parammeters are deprecated in 8.0.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;query_cache_limit&lt;/li&gt;&#xA;&lt;li&gt;query_cache_size&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;ref: &lt;a href=&#34;https://mysqlserverteam.com/mysql-8-0-retiring-support-for-the-query-cache/&#34;&gt;https://mysqlserverteam.com/mysql-8-0-retiring-support-for-the-query-cache/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;innodb_support_xa&#34;&gt;innodb_support_xa&lt;/h2&gt;&#xA;&lt;p&gt;&lt;code&gt;innodb_support_xa&lt;/code&gt; is deprecated as well.&lt;/p&gt;&#xA;&lt;p&gt;ref: &lt;a href=&#34;https://dev.mysql.com/worklog/task/?id=8843&#34;&gt;MySQL :: WL#8843: Deprecate and remove the parameter innodb_support_xa&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;cant-create-users-with-grant&#34;&gt;Can&#39;t create users with GRANT&lt;/h2&gt;&#xA;&lt;p&gt;You can&#39;t create users with &lt;code&gt;GRANT&lt;/code&gt; operation. For example, you need to change&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, LOCK TABLES ON db.* TO &amp;#39;user&amp;#39;@&amp;#39;%&amp;#39; IDENTIFIED BY &amp;#39;yourpassword&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;like this:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;CREATE USER IF NOT EXISTS &amp;#39;user&amp;#39;@&amp;#39;%&amp;#39; identified by &amp;#39;yourpassword&amp;#39;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, LOCK TABLES ON db.* TO &amp;#39;user&amp;#39;@&amp;#39;%&amp;#39;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ref: &lt;a href=&#34;https://stackoverflow.com/questions/50177216/how-to-grant-all-privileges-to-root-user-in-mysql-8-0&#34;&gt;How to grant all privileges to root user in MySQL 8.0 - Stack Overflow&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;default-authentication-plugin&#34;&gt;default-authentication-plugin&lt;/h2&gt;&#xA;&lt;p&gt;The default value of default-authentication-plugin is &lt;code&gt;caching_sha2_password&lt;/code&gt;. If your MySQL driver doesn&#39;t support the authentication method, you&#39;ll get an error &lt;code&gt;this authentication plugin is not supported&lt;/code&gt;. &lt;code&gt;mysql_native_password&lt;/code&gt; is the default value in MySQL 5.7 so you can specify it like this:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;default-authentication-plugin = mysql_native_password&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;other-problems-ive-faced-with&#34;&gt;Other problems I&#39;ve faced with&lt;/h2&gt;&#xA;&lt;h3 id=&#34;table_names-from-information_schema&#34;&gt;TABLE_NAMES from information_schema&lt;/h3&gt;&#xA;&lt;p&gt;My program executes following query.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;SELECT table_name FROM information_schema.tables WHERE table_schema = &amp;#39;mydb&amp;#39;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;+------------------------------------+&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;| TABLE_NAME                         |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;+------------------------------------+&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;| event_log_email                    |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;| following_teacher                  |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;| goose_db_version                   |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;| lesson                             |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;| lesson_status_log                  |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;| m_country                          |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;+------------------------------------+&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The result of the query is &lt;code&gt;TABLE_NAME&lt;/code&gt; in 8.0 although it was &lt;code&gt;table_name&lt;/code&gt; in 5.7. As a result, I changed my query like this:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;SELECT TABLE_NAME AS table_name FROM information_schema.tables WHERE table_schema = &amp;#39;mydb&amp;#39;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
			</item>
			<item>
				<title>Goにおける並行処理 - channel編</title>
				<link>https://journal.lampetty.net/posts/concurrency-in-go-channels/</link>
				<pubDate>Tue, 10 Sep 2019 08:30:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/concurrency-in-go-channels/</guid>
				<description>&lt;h2 id=&#34;はじめに&#34;&gt;はじめに&lt;/h2&gt;&#xA;&lt;p&gt;これは&lt;a href=&#34;https://journal.lampetty.net/entry/concurrency-in-go-goroutines&#34;&gt;Goにおける並行処理 - goroutine編 - oinume journal&lt;/a&gt;の続きの記事。goroutineに引き続き、Goの並行処理を支える重要な概念であるchannelについて説明する。&lt;/p&gt;&#xA;&lt;h2 id=&#34;channelとは&#34;&gt;channelとは？&lt;/h2&gt;&#xA;&lt;p&gt;channelはメモリに対するアクセスを同期するためやgoroutine間の通信(データの受け渡し)として使うものである。&lt;code&gt;Go言語による並行処理&lt;/code&gt;では&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;水が流れる川のように、チャネルは情報の流れの水路として機能します。値はチャネルに沿って 渡され、そこから下流に読み込まれます。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;と説明されている。例えば以下のプログラムでは、main関数から&lt;code&gt;Hello World&lt;/code&gt;をChannel &lt;code&gt;messageCh&lt;/code&gt;に書き込んで、それを無名goroutineが読み取って出力している(&lt;a href=&#34;https://play.golang.org/p/25dGor3IyoJ&#34;&gt;Playground&lt;/a&gt;)&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;go&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;package&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;messageCh&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;make&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;chan&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;go&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;-&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;messageCh&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;messageCh&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Hello World&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;channelを使う上で覚えておくべき基本的なものとしては以下である。&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;channelにデータを書き込む送信側とデータを受け取る受信側が存在している必要がある&#xA;&lt;ul&gt;&#xA;&lt;li&gt;例えば上のプログラムで &lt;code&gt;fmt.Println(&amp;lt;-messageCh)&lt;/code&gt; がない場合、 &lt;code&gt;fatal error: all goroutines are asleep - deadlock!&lt;/code&gt; というエラーになる&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;受信処理はchannelに書き込みがあるまでブロックされる&#xA;&lt;ul&gt;&#xA;&lt;li&gt;上のプログラムで &lt;code&gt;messageCh &amp;lt;- &amp;quot;Hello World&amp;quot;&lt;/code&gt; の書き込みがない場合は、goroutineとして実行されている無名関数がずっとブロックされ何も起こらずにプログラムが終了する。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;送信処理はchannelがいっぱいの場合、空きができるまでブロックされる&lt;/li&gt;&#xA;&lt;li&gt;channelは一般的には&lt;code&gt;make&lt;/code&gt;で生成する&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;make(chan, 3)&lt;/code&gt; のように、バッファをつけて生成することができる。この例だと3個のバッファがあるため、4個目を書き込む時にブロックされる。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;送信専用channelと受信専用channelがある&lt;/li&gt;&#xA;&lt;li&gt;channelをcloseする&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;channelのブロック&#34;&gt;channelのブロック&lt;/h2&gt;&#xA;&lt;p&gt;通常であれば、goroutineはsync.WaitGroupを使って起動元のgoroutineにjoinするようにしないと、タイミングにもよるがほぼ確実に実行されずにmain関数が終了されてしまう。しかし、上のHello Worldを出力するgoroutineでは、必ずHello Worldと出力される。これはいったいなぜだろうか？&lt;/p&gt;&#xA;&lt;p&gt;理由は、channelからデータを受信する場合データが送信されるまでブロックするからである。つまり、上のプログラムの実行順序は以下のようになる。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;messageCh&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;make&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;chan&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;  &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;channelを宣言&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;go&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;goroutineの実行&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;messageCh&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;channelからデータを受信&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;送信されるまでブロックされている&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;messageCh&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;-&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Hello World&amp;#34;&lt;/span&gt;      &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;channelへデータを送信&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;つまりchannelとgoroutineを使うことで、&lt;code&gt;何かデータを受信するまで待って、受信したら処理を開始する&lt;/code&gt; というようなWorker処理を簡単に実装することができる。&lt;/p&gt;&#xA;&lt;h2 id=&#34;channelのバッファ&#34;&gt;channelのバッファ&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ch := make(chan int, 3)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;のようにmakeの第2引数にバッファを指定することができる。バッファを指定することで、channelの読み込みが一度も行われなくても、キャパシティが3のバッファ付きchannelであればgoroutineは3回まで書き込みが可能になる。バッファを指定しない場合は1回書き込むとブロックされる。&lt;/p&gt;&#xA;&lt;h2 id=&#34;送信受信専用channel&#34;&gt;送信・受信専用channel&lt;/h2&gt;&#xA;&lt;p&gt;channelを宣言する時に何も指定しなければ書き込みも読み込みも可能になるが、以下のように宣言することで書き込み専用・読み込み専用のchannelを作ることができる。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;chan&amp;lt;- int&lt;/code&gt;: 読み込み専用&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;&amp;lt;-chan int&lt;/code&gt;: 書き込み専用&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;この文法は、関数の引数にchannelを受け取る場合や戻り値としてchannelを返す場合に「これは書き込みしかできない」「これは読み込みしかできない」ということを明示できるため有用である。&lt;/p&gt;&#xA;&lt;h2 id=&#34;channelのclose&#34;&gt;channelのclose&lt;/h2&gt;&#xA;&lt;p&gt;channelは使い終わったらcloseすることができる。closeされたchannelからはデータを読み込むことはできない。例えば以下のプログラムは&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;goroutineで&lt;code&gt;ch&lt;/code&gt;に書き込み、最後にchannelをcloseしている&lt;/li&gt;&#xA;&lt;li&gt;mainの中のforループでチャネル&lt;code&gt;ch&lt;/code&gt;からデータを読み込んでいる&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;というものであるが、closeされているのでその段階でchannelからの読み込みはブロックされずにforループが終了する。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;go&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;package&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ch&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;make&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;chan&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;go&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;defer&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;close&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ch&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ch&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;range&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ch&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Printf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;%v &amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;実践的な例&#34;&gt;実践的な例&lt;/h2&gt;&#xA;&lt;p&gt;最後に実践的なchannelの使い方を載せておく。上で紹介した以下のchannelの特徴を使っている。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;バッファ&lt;/li&gt;&#xA;&lt;li&gt;送信・受信専用channel&lt;/li&gt;&#xA;&lt;li&gt;close&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;このプログラムが行っていることは、URLをchannelで送って、http.Getした結果をchannelで返すというものである。main関数の中で以下のgoroutineを立ち上げて、最後にchannel &lt;code&gt;results&lt;/code&gt;を読み込んで標準出力にurl, status, errを出力している。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;httpGetを実行する(channel &lt;code&gt;urls&lt;/code&gt;を読み込んで、&lt;code&gt;results&lt;/code&gt;に書き込む)&lt;/li&gt;&#xA;&lt;li&gt;channel &lt;code&gt;urls&lt;/code&gt;に書き込む&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;go&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;package&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;net/http&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;result&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;struct&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;url&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;status&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;error&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;urls&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;make&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;chan&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;results&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;make&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;chan&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;result&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// Consumer&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;go&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;httpGet&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;urls&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;results&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// Producer&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;go&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;targetURLs&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;https://journal.lampetty.net/entry/review-2019-07&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;https://journal.lampetty.net/entry/review-2019-06&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;https://journal.lampetty.net/entry/review-2019-05&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;https://journal.lampetty.net/entry/review-2019-04&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;https://journal.lampetty.net/entry/review-2019-03&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;https://journal.lampetty.net/entry/review-2019-02&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;https://journal.lampetty.net/entry/review-2019-01&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;url&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;range&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;targetURLs&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;urls&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;url&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;close&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;urls&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;range&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;results&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Printf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;url = %v, status = %v, err = %v\n&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;url&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;status&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;httpGet&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;urls&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;-&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;chan&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;results&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;chan&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;result&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;url&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;range&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;urls&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;resp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;url&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nil&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;results&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;result&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;url&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;url&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;results&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;result&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;url&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;url&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;status&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;resp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;StatusCode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;resp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Body&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Close&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;close&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;results&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;&#xA;&lt;p&gt;Goの並行処理の基礎となっているchannelについて説明した。次のパートでは、応用編としてgoroutineとchannelを使った並行処理の実践的なパターンを紹介したいと思う。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4873118468/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/51pUKQajnaL._SL160_.jpg&#34; alt=&#34;Go言語による並行処理&#34; loading=&#34;lazy&#34; title=&#34;Go言語による並行処理&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4873118468/kazzhomeunixo-22/&#34;&gt;Go言語による並行処理&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: Katherine Cox-Buday,山口能迪&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: オライリージャパン&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2018/10/26&lt;/li&gt;&#xA;&lt;li&gt;メディア: 単行本（ソフトカバー）&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4873118468/kazzhomeunixo-22&#34;&gt;この商品を含むブログを見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>Goにおける並行処理 - goroutine編</title>
				<link>https://journal.lampetty.net/posts/concurrency-in-go-goroutines/</link>
				<pubDate>Wed, 28 Aug 2019 00:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/concurrency-in-go-goroutines/</guid>
				<description>&lt;h2 id=&#34;はじめに&#34;&gt;はじめに&lt;/h2&gt;&#xA;&lt;p&gt;Goでは、goroutineとchannelが言語仕様として組み込まれているため、他の言語に比べてとても並行処理のコードが書きやすい。この2つの基本的な動作原理についてまとめた自分用のメモである。(channelについては別の記事で書く予定)&lt;/p&gt;&#xA;&lt;h2 id=&#34;goroutineとは&#34;&gt;goroutineとは？&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;goroutine(ゴールーチン)とは、他のコードに対して並行に実行している関数のこと&lt;/li&gt;&#xA;&lt;li&gt;goroutineは&lt;code&gt;go&lt;/code&gt;というキーワードを関数呼び出しの前に置くことで起動できる。簡単!&lt;/li&gt;&#xA;&lt;li&gt;あらゆるGoのプログラムでは、main関数を動かすためのgoroutineが必ず存在する。つまりGoを支えるとてもプリミティブなものである。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;code&gt;go&lt;/code&gt;キーワードを使ってgoroutineを動かすとても簡単な例としては以下になる。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;go&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;package&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;     &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;go&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;sayHello&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;   &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 他の処理を続ける&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;sayHello&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;hello&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このコードは以下の2つのgoroutineで動作している。&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;main関数を動かしているgoroutine&lt;/li&gt;&#xA;&lt;li&gt;main関数から分岐した、sayHello関数を動かしているgoroutine&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;goroutineの正体&#34;&gt;goroutineの正体&lt;/h2&gt;&#xA;&lt;p&gt;ではgoroutineとは何なのだろうか？Javaなどの他の言語をやってきた人からすると、これはスレッドとして実行されているのか？と気になるところだが、実態はスレッドではない。Go言語による並行処理 P.38では以下のように説明されている。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;ゴルーチンは(他の言語にも似た並行処理のプリミティブは存在しますが)Go 特有のものです。ゴルーチンはOSスレッドではなく、また必ずしもグリーンスレッド――言語のランタイムにより管理されるスレッド――ではありません。ゴルーチンはコルーチン(coroutine)として知られる高水準の抽象化です。コルーチンは単に「プリエンプティブでない」並行処理のサブルーチン(Goでは関数、クロージャー、メソッドに相応)です。つまり、割り込みをされることがないということです。かわりに、コルーチンには一時停止や再エントリーを許す複数のポイントがあります。&lt;/p&gt;&#xA;&lt;p&gt;ゴルーチンが独特なのは、ゴルーチンが Go のランタイムと密結合していることです。ゴルーチンは 一時停止や再エントリーのポイントを定義していません。Go のランタイムはゴルーチンの実行時の振る舞いを観察し、ゴルーチンがブロックしたら自動的に一時停止し、ブロックが解放されたら再開します。これによってある意味ゴルーチンをプリエンプティブにしていますが、ゴルーチンがブロックしたときにしか割り込みません。このようにランタイムとゴルーチンのロジックには美しい関係性がありま す。以上のことから、ゴルーチンは特殊なコルーチンと考えられます。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;goroutineはGoのランタイムにより管理されるため、Goのコードから一時停止したりレジュームすることはできない(channelやcontextを使えば動作を止めるようにキャンセルすることは可能)。これがコルーチンとは違う点だと思う。また、goroutineとして関数を実行してもスレッドが新しく作られるわけではないので、スレッドよりも軽量である。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Go がゴルーチンをホストする機構は、いわゆる M:N スケジューラーと呼ばれる実装になっています。 これは M個のグリーンスレッドを N個の OS スレッドに対応させるものです。ゴルーチンはグリーンスレッドにスケジュールされます。グリーンスレッドの数よりも多い数のゴルーチンがある場合には、スケジューラーはゴルーチンを利用可能なグリーンスレッドに割り振って、これらのゴルーチンがブロックした場合には他のゴルーチンを実行するようにしています。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h2 id=&#34;fork-joinモデル&#34;&gt;fork-joinモデル&lt;/h2&gt;&#xA;&lt;p&gt;Goではfork-joinモデルと呼ばれる並行処理のモデルに従っている。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;fork: プログラムの特定の場所で子供の処理を分岐させて、親と平行に実行させること&lt;/li&gt;&#xA;&lt;li&gt;join: 分岐した時点より以降に、平行処理されている親と子が再び合流すること&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;図で表すと以下のようになる。&lt;/p&gt;&#xA;&lt;p&gt;ここで先ほどのsayHelloを使ったgoroutineの例を見てみる。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     &lt;span class=&#34;n&#34;&gt;go&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sayHello&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sayHello&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;hello&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;sayHelloはgoroutineとして実行された後にjoinしていないので、helloと表示されずにこのプログラムは終わってしまう。ではmainに合流させるにはどうしたらよいだろうか？&lt;/p&gt;&#xA;&lt;p&gt;一番簡単なやり方は以下のように&lt;a href=&#34;https://golang.org/pkg/sync/#WaitGroup&#34;&gt;sync.WaitGroup&lt;/a&gt;を使うことである。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;package&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;sync&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;wg&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sync&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;WaitGroup&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;wg&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Add&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;1.&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;起動する&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;goroutineの数を伝えるため&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;、カウンターに&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;を足す&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;go&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;defer&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;wg&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Done&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;2.&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;カウンターから&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;をマイナスする&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;sayHello&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;wg&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Wait&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;3.&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;ここで&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sayHelloのgoroutineが終わるまで待つ&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;finished&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sayHello&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;hello&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&#34;https://play.golang.org/p/-uPFeh_37mB&#34;&gt;https://play.golang.org/p/-uPFeh_37mB&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;&#xA;&lt;p&gt;これがgoroutineの基本的なことの全てである。&lt;code&gt;go&lt;/code&gt;というキーワードを使うだけで並行処理が簡単に書けるということがわかるはず。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4873118468/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/51pUKQajnaL._SL160_.jpg&#34; alt=&#34;Go言語による並行処理&#34; loading=&#34;lazy&#34; title=&#34;Go言語による並行処理&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4873118468/kazzhomeunixo-22/&#34;&gt;Go言語による並行処理&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: Katherine Cox-Buday,山口能迪&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: オライリージャパン&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2018/10/26&lt;/li&gt;&#xA;&lt;li&gt;メディア: 単行本（ソフトカバー）&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4873118468/kazzhomeunixo-22&#34;&gt;この商品を含むブログを見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>2019年7月の振り返り</title>
				<link>https://journal.lampetty.net/posts/review-2019-07/</link>
				<pubDate>Sun, 04 Aug 2019 00:07:46 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/review-2019-07/</guid>
				<description>&lt;h2 id=&#34;アウトプット&#34;&gt;アウトプット&lt;/h2&gt;&#xA;&lt;p&gt;7月も小ネタだけどブログを書いた。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://journal.lampetty.net/entry/pass-arguments-with-xargs&#34;&gt;xargsでファイルの内容をコマンドの引数として渡す - oinume journal&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://journal.lampetty.net/entry/intellij-20192-upgrading-problem&#34;&gt;Intellij IDEAを2019.2にアップグレードするとコピペや入力がおかしくなる問題のワークアラウンド - oinume journal&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;path-shrinker&#34;&gt;path-shrinker&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/oinume/path-shrinker&#34;&gt;path-shrinker&lt;/a&gt; というものを作った。ターミナルのプロンプトの /Users/go/src/github.com を &lt;code&gt;/U/g/s/github.com&lt;/code&gt; みたいにするやつ。zshのoh-my-zshではプラグインがあるんだけど、Bashでは見当たらなかったので作ってみた。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Bashでもzshやfishみたいにターミナルのプロンプトのディレクトリをシュッと短くしたかったので作った。&lt;a href=&#34;https://t.co/d3k5hWP6Gp&#34;&gt;https://t.co/d3k5hWP6Gp&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;— oinume (@oinume) &lt;a href=&#34;https://twitter.com/oinume/status/1150543119668039680?ref_src=twsrc%5Etfw&#34;&gt;July 14, 2019&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h2 id=&#34;cloud-next19&#34;&gt;Cloud Next&#39;19&lt;/h2&gt;&#xA;&lt;p&gt;GoogleのCloud Nextに参加した。AWSも含めてこういうクラウド系のイベントには参加したことがなかったのだけど、GoogleのSREの人のセッションは参考・刺激になったので自分も実践していきたいと思った。AWSに比べてGCPはServerlessがかなりいけてるという印象を持っていたのだけど、それが再確認できたのも良かった。&lt;/p&gt;&#xA;&lt;h2 id=&#34;opencensus&#34;&gt;OpenCensus&lt;/h2&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;US regionから日本のサーバにアクセスしていて、どうしてもレイテンシが気になってチューニングしたいので、手始めにhttptrace.ClientTrace + OpenCensusでtracingしてみてる。connectが遅いのか、TTFBが遅いのかなどがわかるので良い。&lt;/p&gt;&#xA;&lt;p&gt;— oinume (@oinume) &lt;a href=&#34;https://twitter.com/oinume/status/1155597817752145920?ref_src=twsrc%5Etfw&#34;&gt;July 28, 2019&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.lekcije.com/&#34;&gt;lekcije&lt;/a&gt;のパフォーマンスチューニングのためにOpenCensusを導入して、Stackdriver Traceでlatencyを見れるようにした。もともとボトルネックはわかっていたのだけど、httptrace.ClientTrace + OpenCensusを導入してHTTPクライアントでどこが遅いかも視覚化できたのはいい勉強になったと思う。けっきょくHTTP KeepAliveを長めに設定して少しだけパフォーマンスが良くなった。&lt;/p&gt;&#xA;&lt;h2 id=&#34;睡眠&#34;&gt;睡眠&lt;/h2&gt;&#xA;&lt;p&gt;1日6時間以上寝る、ということを今年の目標にしている。ヘルスケアアプリによると6月は平均6時間25分だった。ただ、毎日6時間以上の睡眠ができているわけではないので、引き続きこれは課題がある。特に平日は6時間寝れている日がほとんど皆無。&lt;/p&gt;&#xA;&lt;h2 id=&#34;英語&#34;&gt;英語&lt;/h2&gt;&#xA;&lt;p&gt;IELTSの攻略本を見ると、語彙力がすべてのパートにおいて重要なので、頑張って英単語を地味に覚えるようにしている。&lt;/p&gt;&#xA;&lt;h2 id=&#34;アルゴリズム&#34;&gt;アルゴリズム&lt;/h2&gt;&#xA;&lt;p&gt;特に進捗なし&lt;/p&gt;&#xA;&lt;h2 id=&#34;go-grpc-sqlの復習&#34;&gt;Go, gRPC, SQLの復習&lt;/h2&gt;&#xA;&lt;p&gt;引き続き &lt;code&gt;Go言語による並行処理&lt;/code&gt; を読んでいる。&lt;/p&gt;&#xA;&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;&#xA;&lt;p&gt;7月は体調を崩してしまって会社を2日を休んでしまったのと、あまりアウトプットはできてないので頑張っていきたい。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Intellij IDEAを2019.2にアップグレードするとコピペや入力がおかしくなる問題のワークアラウンド</title>
				<link>https://journal.lampetty.net/posts/intellij-20192-upgrading-problem/</link>
				<pubDate>Wed, 31 Jul 2019 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/intellij-20192-upgrading-problem/</guid>
				<description>&lt;p&gt;先日IntelliJ IDEAを2019.2にアップグレードしたところ、以下の問題に遭遇した。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;エディタでのコピー＆ペーストすると同じものが2回ペーストされる&lt;/li&gt;&#xA;&lt;li&gt;文字の入力に取りこぼしがある(publicって入力してもpubcみたいなる)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;バグトラッカーを見たところ、&lt;a href=&#34;https://youtrack.jetbrains.com/issue/IDEA-217058&#34;&gt;Copied text is pasted twice via Cmd+V (with Japanese input)&lt;/a&gt;が不具合として上がっていたが修正されそうな気配がなくて途方にくれていたところ、&lt;a href=&#34;https://support.samuraism.com/hc/ja/articles/360033223134-macOS%E3%81%A7%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B32019-2%E3%81%AB%E3%82%A2%E3%83%83%E3%83%97%E3%82%B0%E3%83%AC%E3%83%BC%E3%83%89%E3%81%97%E3%81%9F%E3%82%89%E6%97%A5%E6%9C%AC%E8%AA%9E%E5%85%A5%E5%8A%9B%E3%81%AA%E3%81%A9%E3%81%8C%E4%B8%8D%E5%AE%89%E5%AE%9A%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%9F-JBR8%E3%82%92%E9%81%A9%E7%94%A8%E3%81%97%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84&#34;&gt;こんなワークアラウンド&lt;/a&gt;があることをTwitter上で発見したので試してみた。&lt;/p&gt;&#xA;&lt;p&gt;JBR11というJava Runtimeが原因とのことなので、これを古いバージョンにすればよいらしい。&lt;/p&gt;&#xA;&lt;p&gt;自分は &lt;code&gt;jbrx-8u202&lt;/code&gt; をわざわざダウンロードするのが面倒だったので&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ brew cask install homebrew/cask-versions/adoptopenjdk8&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;してから&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ /usr/libexec/java_home -v &amp;#34;1.8&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;で出力されたディレクトリをSwitch Boot JDKで指定したところ問題が起きなくなった。めでたしめでたし。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4774193836/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/51Q6TDdmpHL._SL160_.jpg&#34; alt=&#34;IntelliJ IDEAハンズオン――基本操作からプロジェクト管理までマスター&#34; loading=&#34;lazy&#34; title=&#34;IntelliJ IDEAハンズオン――基本操作からプロジェクト管理までマスター&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4774193836/kazzhomeunixo-22/&#34;&gt;IntelliJ IDEAハンズオン――基本操作からプロジェクト管理までマスター&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: 山本裕介,今井勝信&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: 技術評論社&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2017/11/08&lt;/li&gt;&#xA;&lt;li&gt;メディア: 大型本&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4774193836/kazzhomeunixo-22&#34;&gt;この商品を含むブログを見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>xargsでファイルの内容をコマンドの引数として渡す</title>
				<link>https://journal.lampetty.net/posts/pass-arguments-with-xargs/</link>
				<pubDate>Sat, 20 Jul 2019 12:49:59 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/pass-arguments-with-xargs/</guid>
				<description>&lt;p&gt;dates.txt&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2019-01-01&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2019-02-01&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2019-03-01&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;みたいなファイルがあった時に、このファイルの行をxargsコマンド経由で任意のコマンドの引数として渡す方法。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ cat dates.txt &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; xargs -I&lt;span class=&#34;o&#34;&gt;{}&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;echo {}&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
			</item>
			<item>
				<title>MacBookAir 2019を買おうか悩み中</title>
				<link>https://journal.lampetty.net/posts/new-macbook-air-2019/</link>
				<pubDate>Tue, 16 Jul 2019 11:06:48 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/new-macbook-air-2019/</guid>
				<description>&lt;p&gt;今使っているのはMacBookPro 13inch late 2016 Two Thunderbolt3 portsなんだけど、2018年モデルのMacBookAirにCPUスコアは負けている...&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://browser.geekbench.com/v4/cpu/13899013&#34;&gt;browser.geekbench.com&lt;/a&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Single-Core Score: 3886&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Multi-Core Score: 7701&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以下は2018年モデルのGeekBenchのスコア。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://browser.geekbench.com/macs/437&#34;&gt;browser.geekbench.com&lt;/a&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Single-Core Score: 4008&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Multi-Core Score: 7396&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Touch IDがついていてTouch Barがないモデルだし、重さも100gぐらい軽いし買い替えようか検討中...&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B07PPMN92N/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/41bxaVI3LLL._SL160_.jpg&#34; alt=&#34;Apple MacBook Air (13インチ, 1.6GHzデュアルコアIntel Core i5, 8GB RAM, 256GB) - ゴールド (最新モデル)&#34; loading=&#34;lazy&#34; title=&#34;Apple MacBook Air (13インチ, 1.6GHzデュアルコアIntel Core i5, 8GB RAM, 256GB) - ゴールド (最新モデル)&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B07PPMN92N/kazzhomeunixo-22/&#34;&gt;Apple MacBook Air (13インチ, 1.6GHzデュアルコアIntel Core i5, 8GB RAM, 256GB) - ゴールド (最新モデル)&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;出版社/メーカー: アップル&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2019/07/10&lt;/li&gt;&#xA;&lt;li&gt;メディア: Personal Computers&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/B07PPMN92N/kazzhomeunixo-22&#34;&gt;この商品を含むブログを見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>2019年6月の振り返り</title>
				<link>https://journal.lampetty.net/posts/review-2019-06/</link>
				<pubDate>Mon, 01 Jul 2019 08:30:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/review-2019-06/</guid>
				<description>&lt;p&gt;2019年がもう半分が過ぎてしまった。やばい。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;▓▓▓▓▓▓▓▓░░░░░░░ 50%&lt;/p&gt;&#xA;&lt;p&gt;— Year Progress (@year_progress) &lt;a href=&#34;https://twitter.com/year_progress/status/1146025732805681153?ref_src=twsrc%5Etfw&#34;&gt;July 2, 2019&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h2 id=&#34;アウトプット&#34;&gt;アウトプット&lt;/h2&gt;&#xA;&lt;p&gt;6月は頑張ってブログを書いた。それなりの分量の記事を書こうとすると週に1個が限界な気がするので、良いペースだと思う。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://journal.lampetty.net/entry/terminal-env-from-peco-to-fzf&#34;&gt;ターミナル環境を見直す: pecoからfzfへ - oinume journal&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://journal.lampetty.net/entry/from-zsh-to-bash&#34;&gt;zshをやめてbashにした - oinume journal&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://journal.lampetty.net/entry/cancel-and-timeout-with-context-in-go&#34;&gt;Goのcontextによるキャンセルやタイムアウト - oinume journal&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;睡眠&#34;&gt;睡眠&lt;/h2&gt;&#xA;&lt;p&gt;1日6時間以上寝る、ということを今年の目標にしている。ヘルスケアアプリによると6月は平均6時間13分だった。ただ、毎日6時間以上の睡眠ができているわけではないので、これは今後の課題である。&lt;/p&gt;&#xA;&lt;h2 id=&#34;業務で必要なものを身につける&#34;&gt;業務で必要なものを身につける&lt;/h2&gt;&#xA;&lt;p&gt;これは以下の3つに絞る。これ以外は必要になったら勉強する。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Go&lt;/li&gt;&#xA;&lt;li&gt;gRPC&lt;/li&gt;&#xA;&lt;li&gt;SQLを復習する&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Goについては、Go言語による並行処理という本を読んでいるけどとてもわかりやすくてよい。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4873118468/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/51pUKQajnaL._SL160_.jpg&#34; alt=&#34;Go言語による並行処理&#34; loading=&#34;lazy&#34; title=&#34;Go言語による並行処理&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4873118468/kazzhomeunixo-22/&#34;&gt;Go言語による並行処理&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: Katherine Cox-Buday,山口能迪&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: オライリージャパン&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2018/10/26&lt;/li&gt;&#xA;&lt;li&gt;メディア: 単行本（ソフトカバー）&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4873118468/kazzhomeunixo-22&#34;&gt;この商品を含むブログを見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;英語&#34;&gt;英語&lt;/h2&gt;&#xA;&lt;p&gt;もともとの目標はIELTS 6.5だが、今の自分のレベルだと高すぎるのでOverall 6.0に下方修正する。そして勉強は相変わらずできていない。電車の中の隙間時間でなるべくやるのが良いのだろうけど、Goの本を読んだりするほうが楽しいのでそっちをやってしまっている。&lt;/p&gt;&#xA;&lt;h2 id=&#34;アルゴリズム&#34;&gt;アルゴリズム&lt;/h2&gt;&#xA;&lt;p&gt;特に進捗なし&lt;/p&gt;&#xA;&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;&#xA;&lt;p&gt;6月は仕事がかなり落ち着いてきたのでプライベートの勉強がかなり捗った。来月もこれぐらいのペースで頑張って行きたい。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Goのcontextによるキャンセルやタイムアウト</title>
				<link>https://journal.lampetty.net/posts/cancel-and-timeout-with-context-in-go/</link>
				<pubDate>Mon, 17 Jun 2019 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/cancel-and-timeout-with-context-in-go/</guid>
				<description>&lt;h2 id=&#34;これはなに&#34;&gt;これはなに？&lt;/h2&gt;&#xA;&lt;p&gt;Go言語における&lt;a href=&#34;https://godoc.org/context&#34;&gt;contextパッケージ&lt;/a&gt;を使ったキャンセルやタイムアウトについて説明する。この記事を読むと以下について詳しくなれるはず...!&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;context.WithCancel&lt;/li&gt;&#xA;&lt;li&gt;context.WithTimeout&lt;/li&gt;&#xA;&lt;li&gt;context.Done&lt;/li&gt;&#xA;&lt;li&gt;context.Err&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;とはいいつつも、かなり自分向けのまとめではあるし既出のトピックなので以下の記事を読むともっとわかりやすいはず。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.golang.org/context&#34;&gt;Go Concurrency Patterns: Context - The Go Programming Language&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://deeeet.com/writing/2016/07/22/context/&#34;&gt;Go1.7のcontextパッケージ | Taichi Nakashima&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;done-channelを使ったキャンセルの実装&#34;&gt;done channelを使ったキャンセルの実装&lt;/h2&gt;&#xA;&lt;p&gt;contextがあると何が嬉しいのかを説明するために、まずはdone channelを使ってキャンセルを行うコードを書いてみる。これは&lt;a href=&#34;https://www.amazon.co.jp/exec/obidos/ASIN/4873118468/kazzhomeunixo-22/&#34;&gt;Go言語による並行処理&lt;/a&gt;のP.137に記載されていたサンプルプログラムを少し修正したものである。&lt;/p&gt;&#xA;&lt;p&gt;このプログラムでやりたいことは、close(done)によってprintGreeting, printFarewell, genGreeting, genFarewell, localeの関数をキャンセルしたい、ということである。&lt;/p&gt;&#xA;&lt;p&gt;このプログラムを実行すると以下の出力が得られる(場合によっては先にhello world!が出力されるかもしれない)。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ go run context/done_chan/main.go&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;goodbye world!&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;hello world!&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;実行の流れとしては以下のようになっている(この図もGo言語による並行処理から引用)。&lt;/p&gt;&#xA;&lt;p&gt;この図をより詳細に説明すると&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;main関数からprintGreetingとprintFarewellをgoroutineを起動して呼び出し、sync.WaitGroup.Waitを使って待つようにしている(L38)&lt;/li&gt;&#xA;&lt;li&gt;printGreetingはgenGreeting -&amp;gt; locale の順番で関数を呼び出す&#xA;&lt;ul&gt;&#xA;&lt;li&gt;localeは select の中で &lt;code&gt;&amp;lt;-time.After(5 * time.Second)&lt;/code&gt; で５秒待ち、&lt;code&gt;EN/US&lt;/code&gt;を返す&lt;/li&gt;&#xA;&lt;li&gt;genGreetingはlocale()の呼び出しが&lt;code&gt;EN/US&lt;/code&gt;の場合 &lt;code&gt;hello&lt;/code&gt; を返す&lt;/li&gt;&#xA;&lt;li&gt;printGreetingはgenGreetingの戻り値を出力する&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;printFarewellもgenFarewell -&amp;gt; locale の順番で関数を呼び出す&#xA;&lt;ul&gt;&#xA;&lt;li&gt;localeは select の中で &lt;code&gt;&amp;lt;-time.After(5 * time.Second)&lt;/code&gt; で５秒待ち、&lt;code&gt;EN/US&lt;/code&gt;を返す&lt;/li&gt;&#xA;&lt;li&gt;genFarewellはlocale()の呼び出しが&lt;code&gt;EN/US&lt;/code&gt;の場合 &lt;code&gt;goodbye&lt;/code&gt; を返す&lt;/li&gt;&#xA;&lt;li&gt;printFarewellはgenGreetingの戻り値を出力する&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;printGreeting, printFarewellのgoroutineが終了したので、main関数は処理を抜ける。つまり &lt;code&gt;defer close(done)&lt;/code&gt; が実行される(L12)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;では、以下のように &lt;code&gt;defer close(done)&lt;/code&gt; の部分を、close(done)した後にprintGreetingを呼び出すようにしたらどうなるだろうか？&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;defer func() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    close(done)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    if err := printGreeting(done); err != nil {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        fmt.Printf(&amp;#34;err=%v\n&amp;#34;, err)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;}()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上のように修正して再度プログラムを実行すると、以下のように出力される。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ go run context/done_chan/main.go&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;goodbye world!&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;hello world!&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;err = canceled&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;canceled&lt;/code&gt;がprintGreetingのerrorとして返ってきた。このerrorはlocale関数の以下の部分で生成されたもので、done channelがすでにcloseされたため、selectのこのcaseに処理が来たということである。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;select {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;case &amp;lt;-done:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    return &amp;#34;&amp;#34;, fmt.Errorf(&amp;#34;canceled&amp;#34;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    ...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このようにprintGreetingやprintFarewellをchannelをcloseすることでキャンセルを実現することができた。それでは次に、contextパッケージを使ったキャンセルのやり方を見てみよう。&lt;/p&gt;&#xA;&lt;h2 id=&#34;contextを使ったキャンセルの実装&#34;&gt;contextを使ったキャンセルの実装&lt;/h2&gt;&#xA;&lt;p&gt;それでは、さきほどのdone channelの例をcontextを使って実装し直してみよう。&lt;/p&gt;&#xA;&lt;p&gt;done channelの実装と比べた場合のポイントとしては以下である。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;context.Background でroot contextを作成&lt;/li&gt;&#xA;&lt;li&gt;context.WithCancel(ctx) では戻り値として子のcontextとキャンセルするための関数が返ってくる&lt;/li&gt;&#xA;&lt;li&gt;このキャンセルするための関数 &lt;code&gt;cancel&lt;/code&gt; を呼び出すことでキャンセル処理を実行する&lt;/li&gt;&#xA;&lt;li&gt;printGreetingなどの関数の引数に &lt;code&gt;ctx&lt;/code&gt; を渡す。これによって末端のlocaleまでctxを引き回している&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;このプログラムを実行してみると、以下のような出力になりcontextを使ってキャンセルが実装できたことが確認できた。これがcontextパッケージの大きな機能の一つである。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ go run context/with_cancel/main.go&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;goodbye world!&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;hello world!&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;err = context canceled&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;ctx.Done&lt;/code&gt;はcontextがキャンセルされるまでブロックされる受信専用のchannelを返す。このchannelからデータを取得できたということはキャンセルされたということなので、ctx.Err() でエラーを返すようにしている&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;context canceled&lt;/code&gt; というエラーはlocale関数の&lt;code&gt;ctx.Err()&lt;/code&gt; の戻り値である。contextパッケージには&lt;code&gt;Canceled&lt;/code&gt;というグローバル変数が定義されており、これが返却されている&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;タイムアウト&#34;&gt;タイムアウト&lt;/h2&gt;&#xA;&lt;p&gt;一番最初のdone channelのプログラムでは単純にprintGreetingやprintFarewellなどの関数の実行をキャンセルしたいタイミングで&lt;code&gt;close(done)&lt;/code&gt;しているだけだが、例えばprintGreetingやprintFarewell(およびこれらが呼び出す関数)の呼び出しを、一定時間が経過した場合にキャンセルしたいと思った場合はどうすればよいだろうか？ context.WithTimeoutを使うことでそのような実装が簡単にできる。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;genGreetingでcontext.WithTimeoutで1秒後にタイムアウトするようにして新しい子のcontextを生成する。そしてlocaleにそれを渡し、 &lt;code&gt;defer cancel()&lt;/code&gt; する&lt;/li&gt;&#xA;&lt;li&gt;main関数のprintGreetingを呼び出すgoroutineで、printGreetingが失敗したら他の関数呼び出しをキャンセルするために&lt;code&gt;cancel&lt;/code&gt;を呼び出す&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;このプログラムの実行結果は以下のようになる。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ go run ./context/with_timeout/main.go&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cannot print greeting: context deadline exceeded&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cannot print farewell: context canceled&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;&#xA;&lt;p&gt;contextを使うことでキャンセルやタイムアウトが簡単に実装できることを説明した。この内容については以下のGo言語による並行処理にすべて書かれているし、よりgoroutineや並行処理について知りたい場合はこの本を読んでみることを強くオススメする。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/4873118468?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;&lt;img src=&#34;https://m.media-amazon.com/images/I/51pUKQajnaL._SL500_.jpg&#34; alt=&#34;Go言語による並行処理&#34; loading=&#34;lazy&#34; title=&#34;Go言語による並行処理&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/4873118468?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;Go言語による並行処理&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者:Katherine Cox-Buday&lt;/li&gt;&#xA;&lt;li&gt;オライリー・ジャパン&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/4873118468?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;Amazon&lt;/a&gt;&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>zshをやめてbashにした</title>
				<link>https://journal.lampetty.net/posts/from-zsh-to-bash/</link>
				<pubDate>Mon, 10 Jun 2019 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/from-zsh-to-bash/</guid>
				<description>&lt;h2 id=&#34;tldr&#34;&gt;TL;DR&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Bashを使うにあたって、zshが持つ標準機能のレベルと同じにするには初期設定が面倒だったけどなんとかいける。Bashは進化していると感じた。&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/Bash-it/bash-it&#34;&gt;bash-it&lt;/a&gt;が便利&lt;/li&gt;&#xA;&lt;li&gt;設定は .bash_profile も含めて&lt;a href=&#34;https://github.com/oinume/dotfiles/&#34;&gt;oinume/dotfiles&lt;/a&gt;に上げているので参考にどうぞ&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;動機&#34;&gt;動機&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://journal.lampetty.net/entry/improve-my-terminal-with-zsh-prezto&#34;&gt;ターミナル環境を見直す(1) - zsh + prezto編 - oinume journal&lt;/a&gt; の記事でデフォルトのshellをzshに切り替えたけど、tmuxでバンバン新しいタブを開くと起動の遅さが気になっていてそろそろどうにかしたいと思っていた。また、zshは便利だけど設定項目を覚えたり調べるのが大変だし、ほとんどの機能は使いこなせていなかったので、これを機にシンプルなbashに乗り換えてみた。この記事はその際にやったことのメモ。&lt;/p&gt;&#xA;&lt;p&gt;以下によると次期macOS Catalinaではbashに代わってzshがデフォルトになるらしく、時代と逆行していて面白い。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://support.apple.com/en-ca/HT208050&#34;&gt;support.apple.com&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;macos-mojaveに最新のbashをインストール&#34;&gt;macOS mojaveに最新のbashをインストール&lt;/h2&gt;&#xA;&lt;p&gt;maxOS mojaveのデフォルトのbashは3.2.57と古いので、まずは最新のbashをhomebrewでインストールする。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ brew install bash&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;chshでログインシェルを変更&#34;&gt;chshでログインシェルを変更&lt;/h2&gt;&#xA;&lt;p&gt;brewでインストールしたbashは /usr/local/bin/bash にあるので、これをログインシェルとして変更する。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ chsh -s /usr/local/bin/bash&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;パスワードを聞かれる&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chsh: /usr/local/bin/bash: non-standard shell&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;しかし、↑のようなエラーになってしまうので、 &lt;code&gt;sudo vi /etc/shells&lt;/code&gt; して &lt;code&gt;/usr/local/bin/bash&lt;/code&gt; を追記してもう一度 chsh コマンドで変更する。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ chsh -s /usr/local/bin/bash&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;prompt&#34;&gt;Prompt&lt;/h2&gt;&#xA;&lt;p&gt;やはり素のプロンプトだと味気ないので、Prompt関連はけっこう設定をいじった。以下に詳細を書く。&lt;/p&gt;&#xA;&lt;h3 id=&#34;powerline&#34;&gt;Powerline&lt;/h3&gt;&#xA;&lt;p&gt;定番のPowerline。&lt;a href=&#34;https://github.com/riobard/bash-powerline&#34;&gt;bash-powerline&lt;/a&gt;というものがあったので、これを以下のように少しカスタマイズして使っている。(Macの場合プロンプトの記号が&lt;code&gt;$&lt;/code&gt;ではなく&lt;code&gt;&lt;/code&gt;になるのがどうしても嫌だった)&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PS_SYMBOL&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;$&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;f&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;~/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dotfiles&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bash&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;powerline&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sh&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;.&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;~/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dotfiles&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bash&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;powerline&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sh&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;カレントディレクトリの表示&#34;&gt;カレントディレクトリの表示&lt;/h3&gt;&#xA;&lt;p&gt;デフォルトだとカレントディレクトリだけがプロンプトに表示されて、同じディレクトリが複数あるとどこにいるのかわからなくなる問題がある。zshだと ~/go/src/github.com/oinume/playground-go にいる場合は ~/g/s/g/o/playground-go のようにいい感じに省略してくれるので似たようなことがやりたかった。調べたところ、bashでも&lt;a href=&#34;https://www.gnu.org/software/bash/manual/html_node/Bash-Variables.html&#34;&gt;PROMPT_DIRTRIM&lt;/a&gt;という環境変数で似たようなことができる。&lt;code&gt;PROMPT_DIRTRIM=2&lt;/code&gt; にした場合は &lt;code&gt;~/.../oinume/playground-go&lt;/code&gt; のようになる。一つ上のディレクトリ名がわかれば良いと思ったので、自分としてはこれで満足している。&lt;/p&gt;&#xA;&lt;h2 id=&#34;コマンド履歴のターミナル間での共有&#34;&gt;コマンド履歴のターミナル間での共有&lt;/h2&gt;&#xA;&lt;p&gt;zshでは当たり前にできるやつ。以下を .bash_profile に追加すればOK。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;function&lt;/span&gt; share_history &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nb&#34;&gt;history&lt;/span&gt; -a&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nb&#34;&gt;history&lt;/span&gt; -c&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nb&#34;&gt;history&lt;/span&gt; -r&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;PROMPT_COMMAND&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;share_history&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;shopt&lt;/span&gt; -u histappend&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;HISTSIZE&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2000&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;過去に移動したディレクトリの検索&#34;&gt;過去に移動したディレクトリの検索&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.unixuser.org/~euske/doc/bashtips/&#34;&gt;Bash の小枝集&lt;/a&gt;のcdhist.sh + fzf で検索できるようにしている。.bash_profileでの設定は以下のようになっていて、Ctrl+@で呼び出せるようにしている。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt; -f ~/dotfiles/cdhist.sh &lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; . ~/dotfiles/cdhist.sh&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;_cd_cdhist&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(for&lt;/span&gt; i in &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;CDHIST_CDQ&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[@]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;do&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;done&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; fzf&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;bind&lt;/span&gt; -x &lt;span class=&#34;s1&#34;&gt;&amp;#39;&amp;#34;\C-@&amp;#34;: _cd_cdhist&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;bash-it&#34;&gt;bash-it&lt;/h2&gt;&#xA;&lt;p&gt;様々なalias、補完、プラグインが用意されている&lt;a href=&#34;https://github.com/Bash-it/bash-it&#34;&gt;bash-it&lt;/a&gt;というものを使ってみる。&lt;/p&gt;&#xA;&lt;p&gt;以下のようにインストールする。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ git clone --depth=1 https://github.com/Bash-it/bash-it.git ~/.bash_it&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ ~/.bash-it/install.sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;補完やプラグインを有効にする&#34;&gt;補完やプラグインを有効にする&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ bash-it enable completion bash-it&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ bash-it enable plugin xyz&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上記のコマンドを実行すると、~/.bash-it/enabled にsymlinkが作成される。以下のコマンドで alias, completion, pluginの一覧を見ることができるので、自分が使いそうなものを有効にしていくと良い。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bash-it show aliases&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bash-it show completions&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bash-it show plugins&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4774186945/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/41i956UyusL._SL160_.jpg&#34; alt=&#34;[改訂第3版]シェルスクリプト基本リファレンス ──#!/bin/shで、ここまでできる (WEB&amp;#43;DB PRESS plus)&#34; loading=&#34;lazy&#34; title=&#34;[改訂第3版]シェルスクリプト基本リファレンス ──#!/bin/shで、ここまでできる (WEB&amp;#43;DB PRESS plus)&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4774186945/kazzhomeunixo-22/&#34;&gt;[改訂第3版]シェルスクリプト基本リファレンス ──#!/bin/shで、ここまでできる (WEB+DB PRESS plus)&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: 山森丈範&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: 技術評論社&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2017/01/20&lt;/li&gt;&#xA;&lt;li&gt;メディア: 単行本（ソフトカバー）&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4774186945/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (1件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>2019年5月の振り返り</title>
				<link>https://journal.lampetty.net/posts/review-2019-05/</link>
				<pubDate>Fri, 07 Jun 2019 19:10:03 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/review-2019-05/</guid>
				<description>&lt;h2 id=&#34;仕事&#34;&gt;仕事&lt;/h2&gt;&#xA;&lt;p&gt;4月はもっぱら仕事が忙しく、最終的にGWは半分以上出勤するという体たらくだったので振り返りはスキップしてしまった。おかげで&lt;a href=&#34;https://www.mercari.com/jp/help_center/article/684/&#34;&gt;メルペイあと払い&lt;/a&gt;のリリースは何とかできたけど、技術的負債が多すぎて運用で死んでいる。&lt;/p&gt;&#xA;&lt;h2 id=&#34;アウトプット&#34;&gt;アウトプット&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://journal.lampetty.net/entry/gcp-cloud-pubsub-memo&#34;&gt;GCPのCloud PubSubをGoで動かしてみただけのメモ&lt;/a&gt; のみ。とにかく仕事が忙しくてプライベートで勉強したり何かをアウトプットすることを疎かにしてしまった。おかげで仕事は捗った。&lt;/p&gt;&#xA;&lt;h2 id=&#34;英語&#34;&gt;英語&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;8月にIELTSを申し込んだ。受験料が2万5千円もするのでなかなか気軽には受けられないので気合を入れて勉強する&lt;/li&gt;&#xA;&lt;li&gt;忙しくてDMM英会話が1回しか受講できていない&lt;/li&gt;&#xA;&lt;li&gt;IELTSを申し込んで自分を追い込んだことで、英単語の学習は少しずつ進んでいる&#xA;&lt;ul&gt;&#xA;&lt;li&gt;英単語の本をKindleで読むと便利。わからない単語にマークをつけて簡単に復習できる。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;アルゴリズム&#34;&gt;アルゴリズム&lt;/h2&gt;&#xA;&lt;p&gt;Graphは深さ優先探索を実装した&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/oinume/algo/tree/master/datastructure/graph&#34;&gt;algo/datastructure/graph at master · oinume/algo · GitHub&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;読んでいる本&#34;&gt;読んでいる本&lt;/h2&gt;&#xA;&lt;h3 id=&#34;go言語による並行処理&#34;&gt;Go言語による並行処理&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4873118468/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/51pUKQajnaL._SL160_.jpg&#34; alt=&#34;Go言語による並行処理&#34; loading=&#34;lazy&#34; title=&#34;Go言語による並行処理&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4873118468/kazzhomeunixo-22/&#34;&gt;Go言語による並行処理&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: Katherine Cox-Buday,山口能迪&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: オライリージャパン&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2018/10/26&lt;/li&gt;&#xA;&lt;li&gt;メディア: 単行本（ソフトカバー）&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4873118468/kazzhomeunixo-22&#34;&gt;この商品を含むブログを見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;まだ40ページしか読んでいないけど、並行処理の概念(CSP)についても詳しく書かれてあって良い本だと思う。ゴルーチンやチャネルについてはあまり体系的に理解していなかったので自分にとっては今年一番の買ってよかった本。&lt;/p&gt;&#xA;&lt;h2 id=&#34;ターミナル環境の見直し&#34;&gt;ターミナル環境の見直し&lt;/h2&gt;&#xA;&lt;p&gt;ずっとzshを使っていたけど、自分が使っているのは以下の機能しかないのでbashに乗り換えようかと思っている。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;補完&lt;/li&gt;&#xA;&lt;li&gt;Ctrl+@によるcdr&lt;/li&gt;&#xA;&lt;li&gt;コマンド履歴をpecoで検索&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;ついでにpeco -&amp;gt; fzfへの移行も試している。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>ターミナル環境を見直す: pecoからfzfへ</title>
				<link>https://journal.lampetty.net/posts/terminal-env-from-peco-to-fzf/</link>
				<pubDate>Wed, 05 Jun 2019 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/terminal-env-from-peco-to-fzf/</guid>
				<description>&lt;p&gt;コマンドの履歴やディレクトリ移動の履歴を選択するためのツールとして長らくpecoを使ってきたけど、fzfに移行してみた。理由は大したものではなく&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;pecoはshellで複数行のコマンドを検索して実行する場合に、 &lt;code&gt;\&lt;/code&gt; が &lt;code&gt;\\&lt;/code&gt; と2重になってしまうという問題があった&lt;/li&gt;&#xA;&lt;li&gt;日本国外だとpecoではなくてfzfの方が使われていそう&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;というもの。&lt;/p&gt;&#xA;&lt;h2 id=&#34;インストール&#34;&gt;インストール&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/junegunn/fzf&#34;&gt;github.com&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;リポジトリのREADMEに書いてあるので省略&lt;/p&gt;&#xA;&lt;h2 id=&#34;設定&#34;&gt;設定&lt;/h2&gt;&#xA;&lt;h3 id=&#34;cdr&#34;&gt;cdr&lt;/h3&gt;&#xA;&lt;p&gt;ディレクトリの移動履歴をfzfで検索するようにする。zshの設定は以下のような感じ。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;function&lt;/span&gt; fzf_cdr &lt;span class=&#34;o&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nb&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;selected_dir&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;cdr -l &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; awk &lt;span class=&#34;s1&#34;&gt;&amp;#39;{ print $2 }&amp;#39;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; fzf --query &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$LBUFFER&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt; -n &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$selected_dir&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;then&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;BUFFER&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;cd &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;selected_dir&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    zle accept-line&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;fi&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  zle clear-screen&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;zle -N fzf_cdr&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bindkey &lt;span class=&#34;s2&#34;&gt;&amp;#34;^@&amp;#34;&lt;/span&gt; fzf_cdr&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;function&lt;/span&gt; fzf_select_history&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nb&#34;&gt;local&lt;/span&gt; tac&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    exists gtac &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;tac&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;gtac&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;||&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt; exists tac &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;tac&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;tac&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;||&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;tac&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;tail -r&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;BUFFER&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;fc&lt;/span&gt; -l -n &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;eval&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$tac&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; peco --query &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$LBUFFER&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;CURSOR&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$#&lt;/span&gt;BUFFER         &lt;span class=&#34;c1&#34;&gt;# move cursor&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    zle -R -c               &lt;span class=&#34;c1&#34;&gt;# refresh&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;zle -N fzf_select_history&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bindkey &lt;span class=&#34;s1&#34;&gt;&amp;#39;^R&amp;#39;&lt;/span&gt; fzf_select_history&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;感想&#34;&gt;感想&lt;/h2&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;pecoはshellで複数行のコマンドを検索して実行する場合に、 &lt;code&gt;\&lt;/code&gt; が &lt;code&gt;\\&lt;/code&gt; と2重になってしまうという問題があった&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;この問題が解決されたので自分としてはこれだけでも満足度が高い。また、fzfは環境変数で見た目や挙動を変えられるのが良いと思っている。自分は以下のように設定している。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;FZF_DEFAULT_COMMAND&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;rg --files --hidden --glob &amp;#34;!.git&amp;#34;&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;FZF_DEFAULT_OPTS&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;--height 60% --border&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/479811815X/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/41hfmaKyVgL._SL160_.jpg&#34; alt=&#34;zsh最強シェル入門&#34; loading=&#34;lazy&#34; title=&#34;zsh最強シェル入門&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/479811815X/kazzhomeunixo-22/&#34;&gt;zsh最強シェル入門&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: 中島能和&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: 翔泳社&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2008/12/04&lt;/li&gt;&#xA;&lt;li&gt;メディア: 単行本（ソフトカバー）&lt;/li&gt;&#xA;&lt;li&gt;購入: 7人 クリック: 175回&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/479811815X/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (50件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>GCPのCloud Runを使って簡単なリダイレクタを作った話</title>
				<link>https://journal.lampetty.net/posts/running-redirector-on-gcp-cloud-run/</link>
				<pubDate>Fri, 17 May 2019 08:50:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/running-redirector-on-gcp-cloud-run/</guid>
				<description>&lt;p&gt;今年5月にbetaとしてリリースされたGCPの&lt;a href=&#34;https://cloud.google.com/run/&#34;&gt;Cloud Run&lt;/a&gt;を使って、もともとGAEで運用していたリダイレクタを移植してみたのでその紹介。&lt;/p&gt;&#xA;&lt;h2 id=&#34;cloud-runとは&#34;&gt;Cloud Runとは&lt;/h2&gt;&#xA;&lt;p&gt;HTTPリクエストを処理するためのFull ManagedなステートレスのContainerの実行環境。公式サイトには以下のように説明されている。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Cloud Run is a managed compute platform that enables you to run stateless containers that are invocable via HTTP requests&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;GCPでは、Full Managedな実行環境(PaaS)として&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Google App Engine(Standard Edition)&lt;/li&gt;&#xA;&lt;li&gt;Cloud Functions&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;が存在しているが、完全にContainerベースのCloud Runが新しく追加されたよ、という風に自分は認識している。&lt;/p&gt;&#xA;&lt;h2 id=&#34;リダイレクタの詳細&#34;&gt;リダイレクタの詳細&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;blog.lampetty.net, tech.lampetty.net に来たリクエストを &lt;a href=&#34;https://journal.lampetty.net&#34;&gt;https://journal.lampetty.net&lt;/a&gt; にリダイレクトする&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;というだけのもの。実際にはURLごとにリダイレクト先が異なるのでプログラムを書いている。もともとはGAE Standard Editionで動かしていた。&lt;/p&gt;&#xA;&lt;h2 id=&#34;準備&#34;&gt;準備&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;GCPのプロジェクトを作る&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;gcloud components update&lt;/code&gt; を実施する&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;gcloud components beta&lt;/code&gt; を実施する&lt;/li&gt;&#xA;&lt;li&gt;Cloud RunのRegionを設定する&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;gcloud config set run/region us-central1&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Cloud Buildを有効にする&lt;/li&gt;&#xA;&lt;li&gt;Container Registryを有効にする&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;cloud-runで実行するコード&#34;&gt;Cloud Runで実行するコード&lt;/h2&gt;&#xA;&lt;p&gt;実際にCloud Runで実行するコードは以下のような感じ&lt;/p&gt;&#xA;&lt;h2 id=&#34;dockerfile&#34;&gt;Dockerfile&lt;/h2&gt;&#xA;&lt;p&gt;Cloud RunはContainerを実行するので、Dockerfileを用意する。やっていることは ./cmd/server/main.go をコンパイルして &lt;code&gt;server&lt;/code&gt; というバイナリを生成しているだけ。&lt;/p&gt;&#xA;&lt;h2 id=&#34;cloud-buildでcontainer-imageをdeployする&#34;&gt;Cloud BuildでContainer Imageをdeployする&lt;/h2&gt;&#xA;&lt;p&gt;自動化も加味して、CircleCIからContainer Imageを生成してGCRにdeployするようにしてみる。CircleCIのconfig.ymlはこんな感じ。&lt;/p&gt;&#xA;&lt;p&gt;実際は Makefile で実行しているのは以下のコマンドになる。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ gcloud builds submit --project &lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;GCP_PROJECT_ID&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  --tag gcr.io/&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;GCP_PROJECT_ID&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;/server:&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;IMAGE_TAG&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#xA;&lt;li&gt;GCP_PROJECT_ID: あなたのGCPのプロジェクトID&lt;/li&gt;&#xA;&lt;li&gt;IMAGE_TAG: &lt;code&gt;master-123&lt;/code&gt; のような値になっている。CircleCI上でビルドするので &lt;code&gt;IMAGE_TAG=$(echo &amp;quot;${CIRCLE_BRANCH}&amp;quot; | tr &#39;._/&#39; &#39;-&#39; | tr &#39;[:upper:]&#39; &#39;[:lower:]&#39;)-&amp;quot;${CIRCLE_BUILD_NUM}&amp;quot;&lt;/code&gt; としている。ただこれはもっと良い生成方法があるかもしれない。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;なお、CircleCIからgcloud buildsでGCRにimageをpushするときに以下のエラーが発生してハマった。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Uploading tarball of &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;.&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; to &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;gs://blog-lampetty-net-redirector_cloudbuild/source/1557916060.04-0e599d9522c1400ebb47e942a96cb9b2.tgz&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Created &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;https://cloudbuild.googleapis.com/v1/projects/blog-lampetty-net-redirector/builds/ec22748d-e4c6-4e10-ba89-f4e108cac0d8&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Logs are available at &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;https://console.cloud.google.com/gcr/builds/ec22748d-e4c6-4e10-ba89-f4e108cac0d8?project&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;310764868638&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ERROR: &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;gcloud.builds.submit&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; HTTPError 403: &amp;lt;?xml &lt;span class=&#34;nv&#34;&gt;version&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;1.0&amp;#39;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;encoding&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;UTF-8&amp;#39;&lt;/span&gt;?&amp;gt;&amp;lt;Error&amp;gt;&amp;lt;Code&amp;gt;AccessDenied&amp;lt;/Code&amp;gt;&amp;lt;Message&amp;gt;Access denied.&amp;lt;/Message&amp;gt;&amp;lt;Details&amp;gt;circle-ci@blog-lampetty-net-redirector.iam.gserviceaccount.com does not have storage.objects.get access to 310764868638.cloudbuild-logs.googleusercontent.com/log-ec22748d-e4c6-4e10-ba89-f4e108cac0d8.txt.&amp;lt;/Details&amp;gt;&amp;lt;/Error&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;解決方法としては&lt;a href=&#34;https://github.com/sinmetal/godtf/commit/19d514628fba32b7f4eb14176dd69200c9bc4403&#34;&gt;ここ&lt;/a&gt;にあるように、Project ViewerのRoleをService Accountに対して付与しないといけない。もしくは、cloudbuild.yamlの設定で &lt;code&gt;logsBucket&lt;/code&gt; を指定してここへのロールを追加すれば良い。&lt;/p&gt;&#xA;&lt;h2 id=&#34;circleciからgcloudコマンドで最新のcontainer-imageをcloud-runに反映する&#34;&gt;CircleCIからgcloudコマンドで最新のcontainer imageをCloud Runに反映する&lt;/h2&gt;&#xA;&lt;p&gt;これはまだ自動化していない。以下のコマンドで自分のマシンからCloud Runに反映している。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ gcloud beta run deploy --project &lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;GCP_PROJECT_ID&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt; --image gcr.io/&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;GCP_PROJECT_ID&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;/server:&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;IMAGE_TAG&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Service name &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;server&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Deploying container to Cloud Run service &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;server&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; in project &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;GCP_PROJECT_ID&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; region &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;us-central1&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;✓ Deploying... Done.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  ✓ Creating Revision...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  ✓ Routing traffic...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Done.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Service &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;server&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; revision &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;server-00005&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; has been deployed and is serving traffic at https://xyz.a.run.app&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;コマンドを実行すると最後に表示される &lt;code&gt;https://xyz.a.run.app&lt;/code&gt; がアプリケーションが動いているURLである。&lt;/p&gt;&#xA;&lt;h2 id=&#34;独自ドメインの割り当て&#34;&gt;独自ドメインの割り当て&lt;/h2&gt;&#xA;&lt;p&gt;Cloud Runによって自分のアプリケーションに割り当てられたURLを独自ドメインに変更することができる。以下のコマンドを使うか、Consoleから設定ができる。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ gcloud beta run domain-mappings create&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4798137146/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/51YvCfG-tsL._SL160_.jpg&#34; alt=&#34;プログラマのためのGoogle Cloud Platform入門 サービスの全体像からクラウドネイティブアプリケーション構築まで&#34; loading=&#34;lazy&#34; title=&#34;プログラマのためのGoogle Cloud Platform入門 サービスの全体像からクラウドネイティブアプリケーション構築まで&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4798137146/kazzhomeunixo-22/&#34;&gt;プログラマのためのGoogle Cloud Platform入門 サービスの全体像からクラウドネイティブアプリケーション構築まで&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: 阿佐志保,中井悦司&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: 翔泳社&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2017/06/02&lt;/li&gt;&#xA;&lt;li&gt;メディア: 単行本（ソフトカバー）&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4798137146/kazzhomeunixo-22&#34;&gt;この商品を含むブログを見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;参考リンク&#34;&gt;参考リンク&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://medium.com/google-cloud-jp/cloud-run-%E3%82%92%E6%9C%80%E9%80%9F%E3%81%A7%E8%A7%A6%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B-6e42021307d4&#34;&gt;Cloud Run を最速で触ってみる - google-cloud-jp - Medium&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>2019年3月の振り返り</title>
				<link>https://journal.lampetty.net/posts/review-2019-03/</link>
				<pubDate>Fri, 05 Apr 2019 10:28:41 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/review-2019-03/</guid>
				<description>&lt;h2 id=&#34;アウトプット&#34;&gt;アウトプット&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://journal.lampetty.net/entry/gcp-cloud-pubsub-memo&#34;&gt;GCPのCloud PubSubをGoで動かしてみただけのメモ&lt;/a&gt; のみ。とにかく仕事が忙しくてプライベートで勉強したり何かをアウトプットすることを疎かにしてしまった(おかげで仕事は捗った)。&lt;/p&gt;&#xA;&lt;h2 id=&#34;英語&#34;&gt;英語&lt;/h2&gt;&#xA;&lt;p&gt;3月から会社がDMM英会話から試験的にNativeCampに切り替えたため1回しかレッスンを受けなかった。単語もiKnowを使っていたのだけど、DMM英会話がストップされた影響で使えなくなってやらなくなってしまった。4月からはまたDMM英会話に戻ったのでちゃんと再開する予定。&lt;/p&gt;&#xA;&lt;h2 id=&#34;アルゴリズム&#34;&gt;アルゴリズム&lt;/h2&gt;&#xA;&lt;p&gt;グラフはやりかけで放置してしまっている。&lt;/p&gt;&#xA;&lt;h2 id=&#34;スマートウォッチ&#34;&gt;スマートウォッチ&lt;/h2&gt;&#xA;&lt;p&gt;Fitbit Charge3が微妙だったのでいったんPebbleに戻していたけど、Fitbit Versa Liteなるものが発売されたのでこれを買ってみた。やっぱりPebbleの方が使いやすいとは思いつつ、基本機能は満足しているのでこれを使っていこうかなと思っている。一番良いのは心拍数が測れるところ。ウォーキングやジョギングで頑張りすぎないようにペースを調節したり、逆にまだまだいけそうだと思ったらペースを上げたりする目安になっている。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B07P65KF83/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://d.hatena.ne.jp/images/hatena_aws.gif&#34; alt=&#34;Fitbit Versa Lite スマートウォッチ Charcoal/Silver Aluminum L/Sサイズ  [日本正規品] FB415SRGY-FRCJK&#34; loading=&#34;lazy&#34; title=&#34;Fitbit Versa Lite スマートウォッチ Charcoal/Silver Aluminum L/Sサイズ  [日本正規品] FB415SRGY-FRCJK&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B07P65KF83/kazzhomeunixo-22/&#34;&gt;Fitbit Versa Lite スマートウォッチ Charcoal/Silver Aluminum L/Sサイズ [日本正規品] FB415SRGY-FRCJK&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;出版社/メーカー: Fitbit(フィットビット)&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2019/03/15&lt;/li&gt;&#xA;&lt;li&gt;メディア: エレクトロニクス&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/B07P65KF83/kazzhomeunixo-22&#34;&gt;この商品を含むブログを見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;読んだ本&#34;&gt;読んだ本&lt;/h2&gt;&#xA;&lt;h3 id=&#34;googleを支える技術&#34;&gt;Googleを支える技術&lt;/h3&gt;&#xA;&lt;p&gt;全部読んだわけではないけどGoogleのシステムの内部について詳細にわかりやすく書かれている良い本。初期のGoogle検索エンジンのシステムの内部構成がわかりやすく解説されていて、「おっこれなら自分でも作れるのでは？」と思うぐらいに理解ができた。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B07JHR1475/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/51ttWFEu1xL._SL160_.jpg&#34; alt=&#34;Googleを支える技術 ……巨大システムの内側の世界 WEB&amp;#43;DB PRESS plus&#34; loading=&#34;lazy&#34; title=&#34;Googleを支える技術 ……巨大システムの内側の世界 WEB&amp;#43;DB PRESS plus&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B07JHR1475/kazzhomeunixo-22/&#34;&gt;Googleを支える技術 ……巨大システムの内側の世界 WEB+DB PRESS plus&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: 西田圭介&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: 技術評論社&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2018/11/14&lt;/li&gt;&#xA;&lt;li&gt;メディア: Kindle版&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/B07JHR1475/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (1件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;脳を鍛えるには運動しかない&#34;&gt;脳を鍛えるには運動しかない!&lt;/h3&gt;&#xA;&lt;p&gt;まだ読んでいる途中だけど、脳細胞を活性化させるために運動が必要だと説く本。アメリカの小学校では、授業の前に朝一で運動することで学力が上がったという話を皮切りに運動が脳に与えるプラスの効果について延々と書かれている本。これを読んで、自分も出勤前にジムに行くように心がけるようになった。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4140813539/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/51hm6jleZOL._SL160_.jpg&#34; alt=&#34;脳を鍛えるには運動しかない!  最新科学でわかった脳細胞の増やし方&#34; loading=&#34;lazy&#34; title=&#34;脳を鍛えるには運動しかない!  最新科学でわかった脳細胞の増やし方&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4140813539/kazzhomeunixo-22/&#34;&gt;脳を鍛えるには運動しかない! 最新科学でわかった脳細胞の増やし方&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: ジョン J.レイティ,エリックヘイガーマン,John J. Ratey,Eric Hagerman,野中香方子&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: NHK出版&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2009/03/20&lt;/li&gt;&#xA;&lt;li&gt;メディア: 単行本（ソフトカバー）&lt;/li&gt;&#xA;&lt;li&gt;購入: 31人 クリック: 757回&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4140813539/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (75件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>GCPのCloud PubSubをGoで動かしてみただけのメモ</title>
				<link>https://journal.lampetty.net/posts/gcp-cloud-pubsub-memo/</link>
				<pubDate>Mon, 01 Apr 2019 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/gcp-cloud-pubsub-memo/</guid>
				<description>&lt;p&gt;これはGCPのCloud PubSubのチュートリアルをやってみただけの自分用のメモ。この記事で紹介されているサンプルコードは&lt;a href=&#34;https://github.com/oinume/pubsub-sample&#34;&gt;GitHub&lt;/a&gt;に置いてある。&lt;/p&gt;&#xA;&lt;h2 id=&#34;cloud-pubsubとは&#34;&gt;Cloud PubSubとは&lt;/h2&gt;&#xA;&lt;p&gt;GCPで提供されているメッセージキュー。メッセージの送信をして(publish)、複数のシステムがそのメッセージを受信(subscribe)することができる。&lt;/p&gt;&#xA;&lt;h2 id=&#34;登場する概念&#34;&gt;登場する概念&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Message: PubSubを通じて送受信したいメッセージ&lt;/li&gt;&#xA;&lt;li&gt;Publisher: Messageを生成しTopicに送るもの&lt;/li&gt;&#xA;&lt;li&gt;Topic: Messageの送信先&lt;/li&gt;&#xA;&lt;li&gt;Subscription: Topicに対して紐付けられるMessageを受信するもの。1つのTopicに対して複数のSubscriptionを設定することができる&lt;/li&gt;&#xA;&lt;li&gt;Subscriber: Subscriptionと関連付けられた、Messageを受信するシステム&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;詳細は&lt;a href=&#34;https://cloud.google.com/pubsub/docs/overview?hl=ja&#34;&gt;ドキュメント&lt;/a&gt;に書いてある。&lt;/p&gt;&#xA;&lt;h3 id=&#34;イメージ&#34;&gt;イメージ&lt;/h3&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://docs.google.com/drawings/d/e/2PACX-1vTdHb-HLccTGHckcbjD9MSh3giAaZARwTTZwnaoJmeKsyJ85G4yYTnn3Q6Unc22WhqtwdDyO4hcJzl2/pub?w=761&amp;amp;h=685&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/p&gt;&#xA;&lt;h2 id=&#34;使ってみる&#34;&gt;使ってみる&lt;/h2&gt;&#xA;&lt;h3 id=&#34;apiを有効にする&#34;&gt;APIを有効にする&lt;/h3&gt;&#xA;&lt;p&gt;gcloud services listで検索して&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ gcloud config &lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt; project oinume-pubsub-sample&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ gcloud services list --available &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep pubsub&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pubsub.googleapis.com Cloud Pub/Sub API&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;enableで有効にする。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ gcloud services &lt;span class=&#34;nb&#34;&gt;enable&lt;/span&gt; pubsub.googleapis.com&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Operation &lt;span class=&#34;s2&#34;&gt;&amp;#34;operations/acf.dd53c399-e6be-48c3-a087-ff01c982d0d8&amp;#34;&lt;/span&gt; finished successfully.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;topicの作成&#34;&gt;Topicの作成&lt;/h3&gt;&#xA;&lt;p&gt;&lt;code&gt;first-topic&lt;/code&gt; という名前のTopicを作る。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ gcloud pubsub topics create first-topic&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Created topic &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;projects/oinume-pubsub-sample/topics/first-topic&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;subscriptionの作成&#34;&gt;Subscriptionの作成&lt;/h3&gt;&#xA;&lt;p&gt;&lt;code&gt;first-topic&lt;/code&gt; へのSubscriptionを作る。SubscriptionはPull型とPush型の2つの種類があるが、今回はPush型を使っている。この2つについて詳しく知りたい場合は&lt;a href=&#34;https://cloud.google.com/pubsub/docs/subscriber?hl=ja&#34;&gt;ドキュメント&lt;/a&gt;を参照。&lt;code&gt;--push-endpoint&lt;/code&gt; の詳細については次で説明する。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ gcloud pubsub subscriptions create first-topic-subscription &lt;span class=&#34;se&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;—topic first-topic &lt;span class=&#34;se&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;—push-endpoint&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;https://oinume-pubsub-sample.appspot.com/_ah/push-handlers/first-topic“&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;google-app-engineでpush型のsubscriberを作る&#34;&gt;Google App Engineでpush型のsubscriberを作る&lt;/h3&gt;&#xA;&lt;p&gt;先ほど &lt;code&gt;--push-endpoint&lt;/code&gt; で指定したendpointをGAEで実装してみる。これはPubSubのmessageがpublishされたときにGCPから呼ばれるもの。&lt;a href=&#34;https://github.com/oinume/pubsub-sample/tree/master/gae&#34;&gt;GitHub&lt;/a&gt;にコードを上げてあるが、 &lt;code&gt;&amp;quot;/_ah/push-handlers/first-topic&lt;/code&gt; のURLのHandlerを定義して、標準出力に来たmessageを出力するだけのコードである。&lt;/p&gt;&#xA;&lt;p&gt;main.go&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;go&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;package&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;encoding/json&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;log&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;net/http&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;os&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;HandleFunc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;indexHandler&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;HandleFunc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;/_ah/push-handlers/first-topic&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;pushHandler&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;port&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;os&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Getenv&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;PORT&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;port&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;==&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;port&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;8080&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Printf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Defaulting to port %s\n&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;port&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Printf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Listening on port %s&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;port&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Fatal&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;ListenAndServe&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Sprintf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;:%s&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;port&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nil&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;indexHandler&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;w&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ResponseWriter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Request&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;URL&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Path&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;NotFound&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;w&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Fprint&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;w&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Hello, World!!&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;pushHandler&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;w&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ResponseWriter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Request&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;pushRequest&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;struct&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Message&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;struct&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Attributes&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;map&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Data&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;       &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;byte&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ID&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;         &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;`json:&amp;#34;message_id&amp;#34;`&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Subscription&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;message&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;pushRequest&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;NewDecoder&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Body&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Decode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;message&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nil&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Printf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Could not decode body: %v\n&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Error&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;w&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Sprintf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Could not decode body: %v&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;StatusBadRequest&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Printf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Data = %v\n&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;message&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Message&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Fprint&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;w&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;ok&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;messageをpublishしてみる&#34;&gt;messageをpublishしてみる&lt;/h3&gt;&#xA;&lt;p&gt;以下のような感じでpublisherを実行すると &lt;code&gt;first-topic&lt;/code&gt; にmessageがpublishされる。 &lt;code&gt;oinume-pubsub-sample&lt;/code&gt; は自身のGCPプロジェクト名に置き換えること。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ &lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;GOOGLE_CLOUD_PROJECT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;oinume-pubsub-sample&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ &lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;GO111MODULE&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;on&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ go run cmd/publisher/publisher.go first-topic &lt;span class=&#34;s2&#34;&gt;&amp;#34;Hello world&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;実際にmessageのsubscribeが成功したかどうかはGCPのStackdriver Loggingで見ることができる。&lt;/p&gt;&#xA;&lt;h2 id=&#34;疑問&#34;&gt;疑問&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;push-handlerがHTTPで200以外を返した場合、どのぐらいのタイミングで再送される？&lt;/li&gt;&#xA;&lt;li&gt;再送する回数の上限は指定できる？&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4798137146/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/51YvCfG-tsL._SL160_.jpg&#34; alt=&#34;プログラマのためのGoogle Cloud Platform入門 サービスの全体像からクラウドネイティブアプリケーション構築まで&#34; loading=&#34;lazy&#34; title=&#34;プログラマのためのGoogle Cloud Platform入門 サービスの全体像からクラウドネイティブアプリケーション構築まで&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4798137146/kazzhomeunixo-22/&#34;&gt;プログラマのためのGoogle Cloud Platform入門 サービスの全体像からクラウドネイティブアプリケーション構築まで&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: 阿佐志保,中井悦司&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: 翔泳社&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2017/06/02&lt;/li&gt;&#xA;&lt;li&gt;メディア: 単行本（ソフトカバー）&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4798137146/kazzhomeunixo-22&#34;&gt;この商品を含むブログを見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>2019年02月の振り返り</title>
				<link>https://journal.lampetty.net/posts/review-2019-02/</link>
				<pubDate>Mon, 04 Mar 2019 00:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/review-2019-02/</guid>
				<description>&lt;h2 id=&#34;アウトプット&#34;&gt;アウトプット&lt;/h2&gt;&#xA;&lt;p&gt;特になし&lt;/p&gt;&#xA;&lt;h2 id=&#34;英語&#34;&gt;英語&lt;/h2&gt;&#xA;&lt;p&gt;1月とほぼ変わらずという状態。ふと、2年前ぐらいに受けたTOEICの結果を見ていたら、Readingにおいて自分は単語力が弱いと書かれていたので、単語をちゃんと勉強するのが一番効果的っぽい。なお、今まで会社の補助で使えていたDMM英会話が使えなくなり途方にくれている。&lt;/p&gt;&#xA;&lt;h2 id=&#34;アルゴリズム&#34;&gt;アルゴリズム&lt;/h2&gt;&#xA;&lt;p&gt;やっと&lt;a href=&#34;https://github.com/oinume/algo/tree/master/datastructure/btree&#34;&gt;BTreeを実装した&lt;/a&gt;。写経していたはずが、些細なバグに悩まされ時間がかかってしまったけどやっと実装できてよかった。この&lt;a href=&#34;http://d.hatena.ne.jp/naoya/20090412/btree&#34;&gt;記事&lt;/a&gt;をおおいに参考にさせてもらった。多謝。&lt;/p&gt;&#xA;&lt;p&gt;来月はグラフをやる。&lt;/p&gt;&#xA;&lt;h2 id=&#34;fitbit-charge3&#34;&gt;Fitbit Charge3&lt;/h2&gt;&#xA;&lt;p&gt;時計をPebble TimeからFitbit Charge3に変えた。のだけど、Pebbleに比べてFitbitが微妙過ぎてつらい。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;時計盤が常に表示されているわけではないので、時刻を見たい時は常に腕を回す動作をしないといけない。場合によってはこれでも表示されないので、わざわざ画面をタップしないといけない。&#xA;&lt;ul&gt;&#xA;&lt;li&gt;これはいろいろ調べたけど設定変更で直せるものではないっぽいぞ... Pebbleは常に表示されていたので良かった。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;通知のバイブレーションが微妙。通知が連続できたのか、それとも電話が鳴っていているのかバイブのパターンではわからない。&lt;/li&gt;&#xA;&lt;li&gt;自転車に乗っている時でも歩いたことになっているようでステップ数がカウントされているっぽい&#xA;&lt;ul&gt;&#xA;&lt;li&gt;これはまだちゃんと確認してない&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;標準のFitbitアプリからiOSのヘルスケアにデータを同期してくれない。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;というわけでPebbleの完成度の高さをあらためて知るのであった。Pebble自体は会社がFitbitに買収されてディスコンなんだけど、Pebble2あたりを買い直そうか真剣に悩んでいる。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>楽天銀行のデビットカードはいいぞ</title>
				<link>https://journal.lampetty.net/posts/rakuten-ginko-debit-card/</link>
				<pubDate>Wed, 13 Feb 2019 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/rakuten-ginko-debit-card/</guid>
				<description>&lt;p&gt;最近メインバンクを三菱UFJから楽天銀行に移している。現在進行系なのは、様々な引き落としの手続きに時間がかかっているためだけど、近日中には終わると思う。&lt;/p&gt;&#xA;&lt;h2 id=&#34;デビットカードってなにメリットは&#34;&gt;デビットカードってなに？メリットは？&lt;/h2&gt;&#xA;&lt;p&gt;使うときはクレジットカードと同じように使える。例えばVISAブランドのデビットカードであればVISAの加盟店であればどこでも使える。クレジットカードみたいに請求が遅れてくることがないため、「気づいたら今月30万もクレカで使っていた」というようなことが起きにくい。また、銀行が発行するデビットカードはたいていキャッシュカードとの一体型になっているので、クレカとキャッシュカードの2枚持ちに終止符を打つことができる。デビットカードではなくクレジットカードを使いたい場合、楽天銀行のキャッシュカードと一体型のものも存在するのでこれを使うのもいいかもしれない。&lt;/p&gt;&#xA;&lt;p&gt;また、ほとんどの銀行においてクレジットカードのような審査がないという点も大きなメリットの一つだと思う。収入が少ない学生や定職についてない人などは審査がないことは大きなメリットのはず。&lt;/p&gt;&#xA;&lt;h2 id=&#34;なぜ楽天銀行なの&#34;&gt;なぜ楽天銀行なの？&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;楽天ポイントがつく。そして獲得したポイントをデビットカードでの支払いに使うことができる&lt;/li&gt;&#xA;&lt;li&gt;もともと楽天カードを使っていた&lt;/li&gt;&#xA;&lt;li&gt;ATM引き出しの手数料や振込手数料が無料になる条件が三菱UFJに比べると緩い&#xA;&lt;ul&gt;&#xA;&lt;li&gt;楽天銀行の場合: 給与振り込み口座にするとそれだけで他行への振込手数料が3回無料になる&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://help.rakuten-bank.co.jp/app/answers/detail/a_id/5662/related/1&#34;&gt;預ける資産が300万円以上&lt;/a&gt;でATM利用手数料7回無料、他行振込手数料が3回無料になる。&lt;/li&gt;&#xA;&lt;li&gt;三菱UFJの場合は、&lt;a href=&#34;https://www.bk.mufg.jp/kouza/yugu/mb/yugu_naiyo/index.html&#34;&gt;預ける資産が500万円以上&lt;/a&gt;ではないとATM手数料や振込手数料が無料にならない&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;(これは楽天銀行だけではなくネット銀行のメリットだけど)印鑑とか紙の通帳から開放されたかった&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;実際どうなのか&#34;&gt;実際どうなのか？&lt;/h2&gt;&#xA;&lt;h3 id=&#34;良いところ&#34;&gt;良いところ&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;クレジットカードだと明細に残るまでに数日から数週間のタイムラグがあるが、デビットカードだとそれがないのがやっぱりいい&lt;/li&gt;&#xA;&lt;li&gt;あとは楽天ポイントをデビットカード利用時に使えること。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;不便なところ&#34;&gt;不便なところ&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;デビットカードで決済すると、リアルタイムに自分の銀行口座から引き落としされるんだけど、明細には「どの店で利用したか」という情報が残らないっぽい。なので、マネーフォワードと連携していても「この5000円何に使ったんだっけ？」というのがわかりづらい。&lt;/li&gt;&#xA;&lt;li&gt;マネーフォーワードと連携する場合、クレカであれば単純に支出が記録されるだけだが、銀行口座の連携の場合は他の口座への振替や現金引き出しも連携されてデータが残ってしまうので、マネーフォーワードで都度計算対象から外すのが面倒&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;というのが感じているところ。まぁ我慢できる範囲かなと思ってこの2つに関しては諦めている。&lt;/p&gt;&#xA;&lt;h2 id=&#34;さいごに&#34;&gt;さいごに&lt;/h2&gt;&#xA;&lt;p&gt;メガバンクは早く淘汰されてほしいので、ネット銀行に移行しよう(煽り)&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4010110821/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/6134RgNFxeL._SL160_.jpg&#34; alt=&#34;学校では教えてくれない大切なこと3お金のこと&#34; loading=&#34;lazy&#34; title=&#34;学校では教えてくれない大切なこと3お金のこと&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4010110821/kazzhomeunixo-22/&#34;&gt;学校では教えてくれない大切なこと3お金のこと&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: 旺文社,関和之&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: 旺文社&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2015/07/17&lt;/li&gt;&#xA;&lt;li&gt;メディア: 単行本（ソフトカバー）&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4010110821/kazzhomeunixo-22&#34;&gt;この商品を含むブログを見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>クライアントを作って理解するOAuth2(実装編)</title>
				<link>https://journal.lampetty.net/posts/oauth2-client-handson-in-go-authorization-code-grant/</link>
				<pubDate>Tue, 12 Feb 2019 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/oauth2-client-handson-in-go-authorization-code-grant/</guid>
				<description>&lt;h2 id=&#34;はじめに&#34;&gt;はじめに&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://journal.lampetty.net/entry/oauth2-client-handson-in-go-setup&#34;&gt;クライアントを作って理解するOAuth2(準備編) - oinume journal&lt;/a&gt;の続編。前の記事ではGoogle APIsのプロジェクトを作成してOAuth2 clientを登録した。この記事では発行されたClient idを使って実際にAccess tokenを取得する部分をGoで実装してみたいと思う。&lt;/p&gt;&#xA;&lt;p&gt;ソースコードは &lt;a href=&#34;https://github.com/oinume/go-oauth2-client-sample&#34;&gt;GitHub - oinume/go-oauth2-client-sample: OAuth2 client sample in Go&lt;/a&gt; にあり、OAuthの実装は&lt;code&gt;server.go&lt;/code&gt;にまとまっている。main関数は&lt;code&gt;cmd/oauth2-client-sample/main.go&lt;/code&gt;にあるが、これはサーバーの起動処理があるだけの薄いものである。サーバーの起動方法などについてはGitHubのREADMEを見てほしい。&lt;/p&gt;&#xA;&lt;h2 id=&#34;前提&#34;&gt;前提&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;OAuth2のGrant typeはAuthorization code grantを使用する&lt;/li&gt;&#xA;&lt;li&gt;Webブラウザを使用する&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Webブラウザを使うことに関しては特に疑問はないと思うが、Authorization code grantって何？というのを説明しておく。&lt;/p&gt;&#xA;&lt;p&gt;これはEnd userから認可を得て、Access tokenを取得するための手法の一つ。Authorization codeというトークンをAuthorization server(今回だとGoogleの認可サーバー)から取得して、そのAuthorization codeとAccess tokenを交換する。なお、Authorization code grantを使用すると、Access token以外にもRefresh tokenも取得ができる。このgrant typeはConfidential clientから実行されることを想定している。Confidential clientについては次に説明する。&lt;/p&gt;&#xA;&lt;h3 id=&#34;public-clientとconfidential-client&#34;&gt;Public clientとConfidential client&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://tools.ietf.org/html/rfc6749#section-2.1&#34;&gt;OAuth2.0の仕様&lt;/a&gt;にその定義が書いてあるが以下のようになっている。(RFCの日本語訳より抜粋)&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;コンフィデンシャル (confidential): クレデンシャルの機密性を維持することができるクライアント (例えば, クライアントクレデンシャルへのアクセスが制限されたセキュアサーバー上に実装されたクライアント), または他の手段を使用したセキュアなクライアント認証ができるクライアント.&lt;/li&gt;&#xA;&lt;li&gt;パブリック (public): (例えば, インストールされたネイティブアプリケーションやブラウザベースのWebアプリケーションなど, リソースオーナーのデバイス上で実行されるクライアントのように) クライアントクレデンシャルの機密性を維持することができず, かつ他の手段を使用したセキュアなクライアント認証もできないクライアント.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;今回はGoで実装されたサーバーからGoogleのAuthorization serverに対して通信するため、コンフィデンシャルクライアントになる。&lt;/p&gt;&#xA;&lt;h2 id=&#34;access-tokenを取得するまでの流れ&#34;&gt;Access tokenを取得するまでの流れ&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;End userが&lt;code&gt;Sign in with Google&lt;/code&gt;ボタンをクリックし、Clientのサーバーにリクエストが送信される&lt;/li&gt;&#xA;&lt;li&gt;Clientが認可リクエストを認可サーバーに送信する&lt;/li&gt;&#xA;&lt;li&gt;認可サーバーが認可画面のHTMLをレスポンスで返す&lt;/li&gt;&#xA;&lt;li&gt;Webブラウザで認可画面を表示&lt;/li&gt;&#xA;&lt;li&gt;End userが認可を行い、認可サーバにリクエストが送信される&lt;/li&gt;&#xA;&lt;li&gt;認可サーバが認可コードを生成し、ClientのサーバーにRedirectする&lt;/li&gt;&#xA;&lt;li&gt;Clientのサーバーがstateをチェックし、認可コードからトークンリクエストを認可サーバーに送信する&lt;/li&gt;&#xA;&lt;li&gt;認可サーバーが認可コードをチェックしてAccess tokenを生成する&lt;/li&gt;&#xA;&lt;li&gt;認可サーバーからClientのサーバーにリダイレクトしてAccess tokenをClientに返す&lt;/li&gt;&#xA;&lt;li&gt;ClientはAccess tokenを取得する&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;ソースコードベースでの説明&#34;&gt;ソースコードベースでの説明&lt;/h2&gt;&#xA;&lt;p&gt;ソースコードの詳細な説明に入る前に全体の構成を説明する。今回作るAuth2 Clientのサーバーは以下のendpointを持っている。これらのendpointはソースコード上では&lt;a href=&#34;https://github.com/oinume/go-oauth2-client-sample/blob/master/server.go&#34;&gt;server.go&lt;/a&gt;に定義されている。今回は説明のしやすさのためGoのOAuth2ライブラリである&lt;a href=&#34;https://godoc.org/golang.org/x/oauth2&#34;&gt;golang.org/x/oauth2&lt;/a&gt;は使用せず独自で実装している。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;/: Sign in with Googleボタンを表示するためのHTMLを返す&lt;/li&gt;&#xA;&lt;li&gt;/oauth2/authorize: Sign in with GoogleボタンがクリックされるとこのURLが呼び出される。この処理の中でAuthorization serverへリダイレクトし、Authorization requestを送る。&lt;/li&gt;&#xA;&lt;li&gt;/oauth2/callback: Authorization serverからリダイレクトで呼び出される。Authorization codeを受け取るので、それをもとにToken requestを送ってAccess tokenを取得する&lt;/li&gt;&#xA;&lt;li&gt;/static: Sign in with Googleボタンのイメージの静的リソースを返す&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;それではendpointごとに詳細に説明していくとしよう。&lt;code&gt;/&lt;/code&gt; と &lt;code&gt;/static&lt;/code&gt; は特に難しいところはないので省略する。&lt;/p&gt;&#xA;&lt;h3 id=&#34;oauth2authorize&#34;&gt;/oauth2/authorize&lt;/h3&gt;&#xA;&lt;p&gt;以下がこのendpointに対するメソッドで、おおまかに説明すると以下のような流れになっている。&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;まずgenerateStateで&lt;code&gt;state&lt;/code&gt;を生成する&lt;/li&gt;&#xA;&lt;li&gt;createAuthorizationRequestURLでURLを生成する。このURLにはAuthorization requestに必要なquery stringなどが含まれている。&lt;/li&gt;&#xA;&lt;li&gt;stateをCookieにセットする&#xA;&lt;ul&gt;&#xA;&lt;li&gt;これはあとで検証に使用するため。stateの検証がなぜ必要かは&lt;a href=&#34;https://tools.ietf.org/html/rfc6749#section-10.12&#34;&gt;OAuth 2.0のRFC&lt;/a&gt;を参照&lt;/li&gt;&#xA;&lt;li&gt;日本語だと&lt;a href=&#34;http://d.hatena.ne.jp/ritou/20121008/1349695124&#34;&gt;OAuth 2.0のstateとredirect_uriとOpenID ConnectのnonceとID Tokenについて - r-weblife&lt;/a&gt;が詳しい&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Authorization server(Google)にリダイレクトする&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;server&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;authorize&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;w&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ResponseWriter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;r&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Request&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;state&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;generateState&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;nil&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;writeError&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;w&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;StatusInternalServerError&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;u&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;createAuthorizationRequestURL&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;redirectURI&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;scopes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;state&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;nil&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;writeError&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;w&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;StatusInternalServerError&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nb&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Printf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;authorization request url = %v&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\n&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;u&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Set&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;state&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;to&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cookie&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;cookie&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Cookie&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;Name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;     &lt;span class=&#34;n&#34;&gt;stateCookieName&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;Value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;    &lt;span class=&#34;n&#34;&gt;state&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;ne&#34;&gt;Path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;     &lt;span class=&#34;s2&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;Expires&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;  &lt;span class=&#34;n&#34;&gt;time&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Now&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Add&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;time&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Minute&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;HttpOnly&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;bp&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;SetCookie&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;w&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cookie&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Send&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;authorization&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;request&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;by&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;redirection&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Redirect&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;w&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;u&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(),&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;StatusFound&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;createAuthorizationRequestURL&lt;/code&gt;が重要なので、次にこのメソッドを詳細に説明する。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;server&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;createAuthorizationRequestURL&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;redirectURI&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;scopes&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;state&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;url&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;URL&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;error&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;u&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;url&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Parse&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;authorizationEndpoint&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;nil&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;nil&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;q&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;u&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Query&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;q&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Set&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;response_type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;code&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;q&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Set&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;client_id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;clientID&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;redirectURI&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;q&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Set&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;redirect_uri&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;redirectURI&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;scopes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;q&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Set&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;scope&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;strings&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Join&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;scopes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;q&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Set&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;state&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;state&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;q&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Set&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;prompt&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;consent&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;u&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;RawQuery&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;q&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Encode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;u&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;nil&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このメソッドは引数にredirectURI, scopes, stateを受け取る。redirectURIおよびscopesは動的に生成されるものではないのでハードコードしてもよいが、再利用性を考慮してメソッド外部から渡せるようにしている。&lt;/p&gt;&#xA;&lt;p&gt;このメソッドでは&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;authorizationEndpointからurl.URLを生成する&lt;/li&gt;&#xA;&lt;li&gt;必要なパラメータをquery stringとしてセットする&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;u&lt;/code&gt;にquery stringをURL encodeしてセットする&lt;/li&gt;&#xA;&lt;li&gt;生成したAuthorization requestのURLである&lt;code&gt;u&lt;/code&gt;を返す&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;という処理を行っている。必要なパラメータについては&lt;a href=&#34;https://tools.ietf.org/html/rfc6749#section-4.1.1&#34;&gt;OAuth2.0の仕様&lt;/a&gt;に定義されているが、簡単に説明すると以下である。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;response_type: Authorization code grantのため&lt;code&gt;code&lt;/code&gt;を指定&lt;/li&gt;&#xA;&lt;li&gt;client_id: Googleから発行されたClient id&lt;/li&gt;&#xA;&lt;li&gt;redirect_uri: Googleに登録したRedirect URI&lt;/li&gt;&#xA;&lt;li&gt;scope&#xA;&lt;ul&gt;&#xA;&lt;li&gt;email: Googleアカウントのメールアドレスを参照できる権限&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.googleapis.com/auth/gmail.readonly:&#34;&gt;https://www.googleapis.com/auth/gmail.readonly:&lt;/a&gt; Gmailの情報を参照できる権限&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;state: 先に生成したランダム文字列&lt;/li&gt;&#xA;&lt;li&gt;prompt: 今回は認可画面を必ず表示するために&lt;code&gt;consent&lt;/code&gt;を指定しているが、なくても良い。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;話をもとに戻して、&lt;code&gt;createAuthorizationRequestURL&lt;/code&gt;で生成されたURLに対してHTTPリダイレクトを行い、GoogleのAuthorization serverにAuthorization requestを送るのがこのメソッドで行っている全てである。&lt;/p&gt;&#xA;&lt;h3 id=&#34;認可画面の表示&#34;&gt;認可画面の表示&lt;/h3&gt;&#xA;&lt;p&gt;Authorization requestが成功すると、Authorization serverから認可画面のHTMLがレスポンスとして返ってくるので、Webブラウザはそれを表示する。Googleの場合だと以下のような画面になる。(Googleにログインしていない場合は、認可画面の前にログイン画面が表示される)&lt;/p&gt;&#xA;&lt;p&gt;認可画面で表示されている内容は、gmail-fetcherというClient(3rd party application)が、表示されているGoogleアカウントの&lt;code&gt;メール メッセージと設定の表示&lt;/code&gt;(scope)を行うことを許可するかどうかを確認するというものだ。ここで&lt;code&gt;許可する&lt;/code&gt;というボタンをクリックすると、gmail-fetcherというClientに対してアクセスする許可を与えたので、Access tokenが発行されることになる。&lt;/p&gt;&#xA;&lt;h3 id=&#34;oauth2callback&#34;&gt;/oauth2/callback&lt;/h3&gt;&#xA;&lt;p&gt;End userが認可画面で&lt;code&gt;許可する&lt;/code&gt;ボタンをクリックすると、Authorization serverからこのendpointにリダイレクトでコールバックされる。メソッドのコードは以下。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;server&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;callback&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;w&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ResponseWriter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;r&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Request&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nb&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Printf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;callback: state=%v, code=%v&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;FormValue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;state&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;FormValue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;code&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;e&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;FormValue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;error&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;e&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Should&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;handler&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;error&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;correctly&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;as&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;described&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;https&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tools&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ietf&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;org&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;html&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rfc6749&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;#section-4.2.2.1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;writeError&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;w&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;StatusBadRequest&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Errorf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;error returned in authorization: %v&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;validateState&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;nil&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;writeError&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;w&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;StatusBadRequest&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;code&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;FormValue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;code&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;code&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;writeError&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;w&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;StatusBadRequest&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Errorf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;code is required&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;ctx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cancel&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;context&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;WithTimeout&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;context&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Background&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(),&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;time&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Second&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;defer&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cancel&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;token&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;exchange&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ctx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;code&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;nil&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;writeError&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;w&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;StatusInternalServerError&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;w&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;WriteHeader&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;StatusOK&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Fprintf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;w&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;accessToken = %v&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;token&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;AccessToken&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;save&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;token&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;to&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;database&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;or&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;do&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;something&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;やっていることとしては以下になる。OAuth2.0の仕様としては&lt;a href=&#34;https://tools.ietf.org/html/rfc6749#section-4.1.2&#34;&gt;Authorization Response&lt;/a&gt;に記載されている。&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;errorが渡って来ているかどうかをチェック&#xA;&lt;ul&gt;&#xA;&lt;li&gt;今回の実装では、errorがある場合は400エラーを返すようにしているが、本来であればこれはエラーの種類に応じて適切なエラー画面を表示するのが正しい実装だと思う。エラーの種類に関してもOAuth2.0の仕様に&lt;a href=&#34;https://tools.ietf.org/html/rfc6749#section-4.1.2.1&#34;&gt;定義&lt;/a&gt;されている。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;checkStateを呼び出して、Cookieに保存したstateとcallbackのパラメータで来たstateが一致しているかをチェック&#xA;&lt;ul&gt;&#xA;&lt;li&gt;なぜこのようなチェックをしているかは長くなるので別の記事で説明する予定&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;codeが渡って来ているかをチェック&lt;/li&gt;&#xA;&lt;li&gt;exchangeを呼び出して&lt;code&gt;code&lt;/code&gt;からAccess tokenを取得&lt;/li&gt;&#xA;&lt;li&gt;Access tokenをレスポンスとして返す&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Webブラウザに取得したAccess tokenが表示される&lt;/li&gt;&#xA;&lt;li&gt;ちゃんと実装するなら、Access tokenをDBに保存したりするはず&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;exchangeメソッドについては長くなるので次で詳細に説明する。&lt;/p&gt;&#xA;&lt;h3 id=&#34;exchangeメソッド&#34;&gt;exchangeメソッド&lt;/h3&gt;&#xA;&lt;p&gt;これはAuthorization codeからAccess tokenを取得するメソッドである。&lt;a href=&#34;https://tools.ietf.org/html/rfc6749#section-4.1.3&#34;&gt;Access Token Request&lt;/a&gt;に仕様が書かれている。&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;リクエストに必要なquery stringをセットする&lt;/li&gt;&#xA;&lt;li&gt;Authorization serverがクライアント認証を行うため、Client idとClient secretをセットする&lt;/li&gt;&#xA;&lt;li&gt;Token endpointにHTTPリクエストを送る&lt;/li&gt;&#xA;&lt;li&gt;返ってきたHTTPレスポンスを受け取って内容をパースし、Access tokenなどを得る&lt;/li&gt;&#xA;&lt;li&gt;Webブラウザで表示するためにAccess tokenをレスポンスにセット&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;ということがやっていることだ。query stringにセットしているパラメータはそれぞれ以下になる。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;grant_type: Authorization code grantなので&lt;code&gt;authorization_code&lt;/code&gt;をセット&lt;/li&gt;&#xA;&lt;li&gt;code: Authorization codeをセット&lt;/li&gt;&#xA;&lt;li&gt;redirect_uri: Authorization requestで使ったredirect_uriと同じものをセット&lt;/li&gt;&#xA;&lt;li&gt;client_id: Client idをセット&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;また、仕様には以下のように書かれているので、Client credentialsとしてreq.SetBasicAuthでClient idとClient secretをセットしている。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;The authorization server MUST:&lt;/p&gt;&#xA;&lt;p&gt;o require client authentication for confidential clients or for any client that was issued client credentials (or with other authentication requirements),&lt;/p&gt;&#xA;&lt;p&gt;o authenticate the client if client authentication is included,&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;server&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;exchange&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ctx&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;context&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Context&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;code&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tokenEntity&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;error&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;v&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;url&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Values&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;grant_type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;   &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;authorization_code&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;code&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;         &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;code&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;redirect_uri&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;redirectURI&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;client_id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;    &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;clientID&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;req&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;NewRequest&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tokenEndpoint&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;strings&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;NewReader&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;v&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Encode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;nil&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;nil&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;req&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Header&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Set&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Content-Type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;application/x-www-form-urlencoded&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Client&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;authentication&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;https&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tools&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ietf&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;org&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;html&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rfc6749&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;#section-4.1.3&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;req&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;SetBasicAuth&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;url&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;QueryEscape&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;clientID&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;url&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;QueryEscape&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;clientSecret&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Send&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;token&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;request&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;resp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;DefaultClient&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Do&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;req&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;WithContext&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ctx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;nil&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;nil&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;defer&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;resp&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Body&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Close&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;body&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ioutil&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ReadAll&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;resp&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Body&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;nil&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;nil&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Errorf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;oauth2: cannot fetch token: %v&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;code&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;resp&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;StatusCode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;code&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;200&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;||&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;code&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;299&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Should&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;handler&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;error&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;correctly&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;as&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;described&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;https&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tools&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ietf&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;org&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;html&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rfc6749&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;#section-5.2&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Printf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;token request failed: statusCode=%v, body=%v&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\n&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;code&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;body&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;nil&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Errorf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;oauth2: token request failed: statusCode=%v&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;code&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Create&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tokenEntity&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;token&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tokenEntity&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;contentType&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mime&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ParseMediaType&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;resp&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Header&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Content-Type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;nil&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;nil&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Errorf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;oauth2: failed to parse Content-Type header: %v&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;contentType&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;application/json&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;nil&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Errorf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;oauth2: invalid Content-Type in response: %v&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;contentType&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;token&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tokenEntity&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;json&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Unmarshal&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;body&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;token&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;nil&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;nil&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;token&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ExpiresIn&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;token&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;expiry&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;time&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Now&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Add&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;time&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Duration&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;token&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ExpiresIn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;time&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Second&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;token&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;nil&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;なお、Access tokenには有効期限があり、あとどのぐらいで有効期限が切れるのか？がレスポンスの&lt;code&gt;expires_in&lt;/code&gt;というフィールドにセットされている。通常であればAccess tokenをDBに保存すると同時にこの有効期限も保存しておき、有効期限が切れたらRefresh tokenを使ってAccess tokenをリフレッシュするという処理が必要になる。&lt;/p&gt;&#xA;&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;&#xA;&lt;p&gt;細かいところは飛ばしつつも、Authorization code grantによるAccess tokenの発行まで、ライブラリを使わずに一通り実装してみた。ところどころにOAuth2.0のRFCへのリンクを入れたので、適宜参照してもらうと仕様の理解が深まるのではないかと思う。自分で実装していて思ったのは、「エラーハンドリングとか細かいところは面倒なポイントがあるけど、全体的にOAuth2.0のClientの実装って簡単じゃん！」ということ。OAuthって聞くとなんか大変そうなイメージがあったけど自分的には攻略できた感じ。この記事が仕事で外部サービスとの連携でクライアントとか認可サーバーの実装しなくてはいけない人たちの役にたてば嬉しいです。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B07L5M7DXS/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/51CFJ7sk6ML._SL160_.jpg&#34; alt=&#34;OAuth徹底入門&#34; loading=&#34;lazy&#34; title=&#34;OAuth徹底入門&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B07L5M7DXS/kazzhomeunixo-22/&#34;&gt;OAuth徹底入門&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: Justin Richer,Antonio Sanso&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: 翔泳社&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2019/02/16&lt;/li&gt;&#xA;&lt;li&gt;メディア: Kindle版&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/B07L5M7DXS/kazzhomeunixo-22&#34;&gt;この商品を含むブログを見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>2019年01月の振り返り</title>
				<link>https://journal.lampetty.net/posts/review-2019-01/</link>
				<pubDate>Mon, 11 Feb 2019 13:19:51 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/review-2019-01/</guid>
				<description>&lt;h2 id=&#34;アウトプット&#34;&gt;アウトプット&lt;/h2&gt;&#xA;&lt;p&gt;OAuth 2.0について以下の記事を書いた。少しかじった程度だけど、その知識をアウトプットした感じ。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://journal.lampetty.net/entry/oauth2-client-handson-in-go-setup&#34;&gt;journal.lampetty.net&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;英語&#34;&gt;英語&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.dailytechnewsshow.com/&#34;&gt;Daily Tech News Show&lt;/a&gt;をほぼ毎日聞いている&#xA;&lt;ul&gt;&#xA;&lt;li&gt;1エピソードが5分以内なので聞きやすい。長い英語のpodcastは途中で集中が切れてしまうと離脱してしまうけど、5分なら集中できる&lt;/li&gt;&#xA;&lt;li&gt;また、テック業界のニュースが多いので基本的な文脈はわかっているため内容も理解しやすい&lt;/li&gt;&#xA;&lt;li&gt;これを聞いていて思ったのは、日本に流れてこないニュースが意外とあるのだということ。なんとなく得した気分になる&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;DMM英会話で、Daily Newsだけではなく文法をやり始めた。難易度が高い方から逆順にやっているのだけど、意外と忘れていることが多いので良い。&lt;/li&gt;&#xA;&lt;li&gt;6月にIELTSの試験を受ける予定&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;アルゴリズム&#34;&gt;アルゴリズム&lt;/h2&gt;&#xA;&lt;p&gt;本は読んでいるけど特にアウトプットはなし。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B078WPYHGN/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/510SEnzHpbL._SL160_.jpg&#34; alt=&#34;アルゴリズムイントロダクション 第3版 総合版：世界標準MIT教科書&#34; loading=&#34;lazy&#34; title=&#34;アルゴリズムイントロダクション 第3版 総合版：世界標準MIT教科書&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B078WPYHGN/kazzhomeunixo-22/&#34;&gt;アルゴリズムイントロダクション 第3版 総合版：世界標準MIT教科書&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: Thomas H. Cormen,Clifford Stein,Ronald L. Rivest,Charles E. Leiserson&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: 近代科学社&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2018/01/09&lt;/li&gt;&#xA;&lt;li&gt;メディア: Kindle版&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/B078WPYHGN/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (4件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;睡眠時間&#34;&gt;睡眠時間&lt;/h2&gt;&#xA;&lt;p&gt;今年に入ってからなるべく早くベッドに入るようにしていい感じのペースができている。1月の平均だと5時間59分だった。6時間以上寝た次の日は頭がちゃんと働いているのがよい。&lt;/p&gt;&#xA;&lt;h2 id=&#34;仕事&#34;&gt;仕事&lt;/h2&gt;&#xA;&lt;p&gt;チームが変わってそのチームにさらにインターナショナルなメンバーが増えて、英語を使うことがさらに多くなった。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;インド&lt;/li&gt;&#xA;&lt;li&gt;台湾&lt;/li&gt;&#xA;&lt;li&gt;中国&lt;/li&gt;&#xA;&lt;li&gt;ノルウェー&lt;/li&gt;&#xA;&lt;li&gt;日本&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;というめちゃくちゃ多国籍なチームになっている。隣に座っている人はノルウェーの人は日本語もけっこう得意なんだけど、彼と話す時はだいたい英語。Slackも3分の1ぐらいは英語になっている気がする。意外なのは、英語を覚えても日本語自体の語彙や会話力は衰えていなさそうなので、これは良いことだ。&lt;/p&gt;&#xA;&lt;h2 id=&#34;2月重点的に頑張ること&#34;&gt;2月重点的に頑張ること&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;アルゴリズム&lt;/li&gt;&#xA;&lt;li&gt;Spannerの勉強&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>クライアントを作って理解するOAuth2(準備編)</title>
				<link>https://journal.lampetty.net/posts/oauth2-client-handson-in-go-setup/</link>
				<pubDate>Wed, 16 Jan 2019 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/oauth2-client-handson-in-go-setup/</guid>
				<description>&lt;h2 id=&#34;はじめに&#34;&gt;はじめに&lt;/h2&gt;&#xA;&lt;p&gt;GoogleやFacebookなどの外部サービスのAPIを利用する上で欠かせないのがOAuth2という仕様なんだけど、この仕様だけ読んでいてもつまらないしよーわからんので、実際に手を動かしてみて理解を深めよう、というのがこの記事の趣旨です。実際にはOAuth2素人が少し仕事でかじった知識をアウトプットしたものです。&lt;/p&gt;&#xA;&lt;h2 id=&#34;oauthとは&#34;&gt;OAuthとは&lt;/h2&gt;&#xA;&lt;p&gt;エンドユーザーのデータを3rd party applicationに渡すための仕組み。日本語だとこのページの説明が一番わかりやすい。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://qiita.com/TakahikoKawasaki/items/e37caf50776e00e733be&#34;&gt;qiita.com&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;OAuth 2.0自体のRFCの仕様は以下にある。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;en: &lt;a href=&#34;https://tools.ietf.org/html/rfc6749&#34;&gt;RFC 6749 - The OAuth 2.0 Authorization Framework&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;ja: &lt;a href=&#34;https://openid-foundation-japan.github.io/rfc6749.ja.html&#34;&gt;The OAuth 2.0 Authorization Framework&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;必要なもの&#34;&gt;必要なもの&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Googleアカウント。GCPプロジェクトを作成するために必要&lt;/li&gt;&#xA;&lt;li&gt;Go runtime(optional)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;準備&#34;&gt;準備&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;今回はOAuth 2.0の&lt;a href=&#34;https://oauth.net/2/grant-types/authorization-code/&#34;&gt;Authorization Code grant&lt;/a&gt;というGrant typeを使って認可を行う&lt;/li&gt;&#xA;&lt;li&gt;この記事で作成する&lt;code&gt;Gmail Fetcher&lt;/code&gt;というものを3rd party applicationとしてGoogleに登録し、Access tokenを取得してGoogleのAPIを呼び出す&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;そのためには以下の手順でGoogleにアプリケーションを登録する必要がある。まずは&lt;a href=&#34;https://console.cloud.google.com/projectcreate&#34;&gt;GCPのConsole&lt;/a&gt;からプロジェクトを作成する。詳細は以下の動画を見てほしい。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://youtu.be/-uRinLqpx84&#34;&gt;youtu.be&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;プロジェクト名は&lt;code&gt;oinume-gmail-fetcher&lt;/code&gt;にする。ただ、他の人がプロジェクトを作る場合、&lt;code&gt;oinume&lt;/code&gt;は自分のアカウント名とか適当な文字列にしておく。でないと重複して作れないので。&lt;/li&gt;&#xA;&lt;li&gt;次に、左上のメニューから&lt;code&gt;APIs &amp;amp; Services&lt;/code&gt;を選んで、APIs &amp;amp; Servicesのページを開き、&lt;code&gt;ENABLE APIS AND SERVICES&lt;/code&gt; のボタンをクリックする。&lt;/li&gt;&#xA;&lt;li&gt;そうするとAPIの一覧の画面に行くので、スクロールしてGmailのAPIを探してクリックする。&lt;/li&gt;&#xA;&lt;li&gt;そして&lt;code&gt;ENABLE&lt;/code&gt;ボタンをクリックしてGmailのAPIを有効にする。&lt;/li&gt;&#xA;&lt;li&gt;次にCredentialsの画面を開き、&lt;code&gt;CREATE CREDENTIALS&lt;/code&gt;のボタンをクリックする。&lt;/li&gt;&#xA;&lt;li&gt;フォームが出てくるので以下のように入力し、&lt;code&gt;What credentials do I need?&lt;/code&gt;ボタンをクリックする。&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Which API are you using?: &lt;code&gt;Gmail API&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Where will you be calling the API from: &lt;code&gt;Web server&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;What data will you be accessing?: &lt;code&gt;User data&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;上の手続きを行ってClient idの発行が終わったら準備は完了。長くなるので、実際にOAuth2のフローの説明については次の記事で説明する。&lt;/p&gt;&#xA;&lt;h2 id=&#34;用語の説明&#34;&gt;用語の説明&lt;/h2&gt;&#xA;&lt;p&gt;ClientというのはGoogleで登録するあなたの3rd party applicationのこと。今回はgoogle profile getterというアプリケーションを作ってみるとする。&lt;/p&gt;&#xA;&lt;h3 id=&#34;resource-owner-or-end-user&#34;&gt;Resource owner or End user&lt;/h3&gt;&#xA;&lt;p&gt;エンドユーザー。Resource serverにデータ(リソース)を預けている。&lt;/p&gt;&#xA;&lt;h3 id=&#34;client&#34;&gt;Client&lt;/h3&gt;&#xA;&lt;p&gt;3rd party applicationのこと。今回だと&lt;code&gt;gmail-fetcher&lt;/code&gt;のことを指す。End userからの認可を得てResource serverのデータにアクセスするアプリケーションのこと。&lt;/p&gt;&#xA;&lt;h3 id=&#34;resource-server&#34;&gt;Resource server&lt;/h3&gt;&#xA;&lt;p&gt;End userのリソースを保持するサーバー。今回だとGoogleがこれに該当する。&lt;/p&gt;&#xA;&lt;h3 id=&#34;authorization-server&#34;&gt;Authorization server&lt;/h3&gt;&#xA;&lt;p&gt;End userからの認可を得てAccess tokenを生成するもの。日本語では認可サーバーと呼ばれる。&lt;/p&gt;&#xA;&lt;h3 id=&#34;client-id&#34;&gt;Client id&lt;/h3&gt;&#xA;&lt;p&gt;ClientのID&lt;/p&gt;&#xA;&lt;h3 id=&#34;client-secret&#34;&gt;Client secret&lt;/h3&gt;&#xA;&lt;p&gt;Clientごとに発行される秘密鍵のようなもの。access tokenを取得する際に使用する。これが漏洩すると自分のアプリケーションを詐称してEnd userのデータにアクセスできてしまうので、漏洩しないようにする。 参考 - &lt;a href=&#34;https://ja.stackoverflow.com/questions/26469/&#34;&gt;https://ja.stackoverflow.com/questions/26469/&lt;/a&gt; - &lt;a href=&#34;https://oauth.jp/blog/2012/08/03/re-oauth-20clientsecret/&#34;&gt;https://oauth.jp/blog/2012/08/03/re-oauth-20clientsecret/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;oauth-consent-screen&#34;&gt;OAuth consent screen&lt;/h3&gt;&#xA;&lt;p&gt;End userに表示する認可画面のこと。&lt;/p&gt;&#xA;&lt;h3 id=&#34;authorized-redirect-uris&#34;&gt;Authorized redirect URIs&lt;/h3&gt;&#xA;&lt;p&gt;End userが認可画面でClientに認可をしたあとにコールバックされるURI&lt;/p&gt;&#xA;&lt;h3 id=&#34;scopes-for-google-apis&#34;&gt;Scopes for Google APIs&lt;/h3&gt;&#xA;&lt;p&gt;End userがClientに対して認可を求めるスコープ。権限ともいう。例えばGmailのAPIを使ってメール送信したい場合は、メール送信をするためのscopeを要求する必要がある。&lt;/p&gt;&#xA;&lt;h3 id=&#34;access-token&#34;&gt;Access token&lt;/h3&gt;&#xA;&lt;p&gt;ClientからResource server(今回だとGoogle)のAPIを呼び出すためのトークン文字列。&lt;/p&gt;&#xA;&lt;h2 id=&#34;次回作&#34;&gt;次回作&lt;/h2&gt;&#xA;&lt;p&gt;1月中にはアップすると思うので乞うご期待。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4798159298/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/51CaA7dryjL._SL160_.jpg&#34; alt=&#34;OAuth徹底入門 セキュアな認可システムを適用するための原則と実践&#34; loading=&#34;lazy&#34; title=&#34;OAuth徹底入門 セキュアな認可システムを適用するための原則と実践&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4798159298/kazzhomeunixo-22/&#34;&gt;OAuth徹底入門 セキュアな認可システムを適用するための原則と実践&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: Justin Richer,Antonio Sanso,Inc. Authlete,須田智之&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: 翔泳社&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2019/01/30&lt;/li&gt;&#xA;&lt;li&gt;メディア: 単行本（ソフトカバー）&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4798159298/kazzhomeunixo-22&#34;&gt;この商品を含むブログを見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>2019年の抱負</title>
				<link>https://journal.lampetty.net/posts/resolution-in-2019/</link>
				<pubDate>Sat, 12 Jan 2019 09:30:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/resolution-in-2019/</guid>
				<description>&lt;p&gt;もう10日以上経ってしまったけど2019年の抱負。&lt;/p&gt;&#xA;&lt;h2 id=&#34;大方針アウトプット&#34;&gt;大方針：アウトプット&lt;/h2&gt;&#xA;&lt;p&gt;今年のテーマは &lt;code&gt;アウトプット&lt;/code&gt; を第一にする。昨年は本を読んだりUdemyでいろいろ勉強していたけど、雑でもいいからアウトプットすることで自分の血肉にしていきたいと思っている。&lt;/p&gt;&#xA;&lt;h2 id=&#34;1日6時間以上寝る&#34;&gt;1日6時間以上寝る&lt;/h2&gt;&#xA;&lt;p&gt;よい自分はショートスリーパーなので、去年はだいたい1日5時間ぐらいしか寝ていない。ただ、これだと仕事でやる気が出なかったり、体調を崩したりする原因になるので、最低でも6時間は寝るようにする。朝はだいたい6:30には起きるので、0時にはベッドに入るようにする。&lt;/p&gt;&#xA;&lt;h2 id=&#34;アルゴリズムもっと勉強する&#34;&gt;アルゴリズムもっと勉強する&lt;/h2&gt;&#xA;&lt;p&gt;とりあえずこの辺。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;BTree&lt;/li&gt;&#xA;&lt;li&gt;Graph&lt;/li&gt;&#xA;&lt;li&gt;オートマトン&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;暗号技術を勉強する&#34;&gt;暗号技術を勉強する&lt;/h2&gt;&#xA;&lt;p&gt;暗号技術に対する理解が圧倒的に低いため、アルゴリズムを終えたら以下の本を読んでしっかり勉強する。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4797382228/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/51V6l3panVL._SL160_.jpg&#34; alt=&#34;暗号技術入門 第3版&#34; loading=&#34;lazy&#34; title=&#34;暗号技術入門 第3版&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4797382228/kazzhomeunixo-22/&#34;&gt;暗号技術入門 第3版&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: 結城浩&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: SBクリエイティブ&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2015/08/26&lt;/li&gt;&#xA;&lt;li&gt;メディア: 単行本&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4797382228/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (19件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;業務で必要なものを身につける&#34;&gt;業務で必要なものを身につける&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;gRPC&lt;/li&gt;&#xA;&lt;li&gt;Cloud Spanner&lt;/li&gt;&#xA;&lt;li&gt;Cloud PubSub&lt;/li&gt;&#xA;&lt;li&gt;SQLを復習する&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;英語を再開する&#34;&gt;英語を再開する&lt;/h2&gt;&#xA;&lt;p&gt;惰性でDMM英会話を続けているけど、まだまだ文法も表現力も少ないのでちゃんと自分の今の状態をmeasurableにしてステップアップして行きたい。そのためにIELTSを今年は受ける。目標としては6.5以上を目指したい。なぜTOEICではなくIELTSかというと、海外の大学の入学基準だったり、例えばカナダだとVISAの条件になっていて、TOEICより圧倒的に汎用性が高いため。&lt;/p&gt;&#xA;&lt;h2 id=&#34;ブログ&#34;&gt;ブログ&lt;/h2&gt;&#xA;&lt;p&gt;ちゃんとした記事を月に1つは書く！&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>2018年の振り返り</title>
				<link>https://journal.lampetty.net/posts/review-2018/</link>
				<pubDate>Sat, 05 Jan 2019 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/review-2018/</guid>
				<description>&lt;p&gt;あけましておめでとうございます。年末年始は親戚とハワイで過ごしていました。冬なのに海に入るという謎の体験をして、正月感はまったくなかったけどこれはこれで新鮮でした。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;謹賀新年🎍 &lt;a href=&#34;https://t.co/kRXTEbvBCC&#34;&gt;pic.twitter.com/kRXTEbvBCC&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;— oinume (@oinume) &lt;a href=&#34;https://twitter.com/oinume/status/1080255134809055232?ref_src=twsrc%5Etfw&#34;&gt;January 2, 2019&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h2 id=&#34;仕事&#34;&gt;仕事&lt;/h2&gt;&#xA;&lt;p&gt;年始からチームを異動してPlatform開発の仕事をしていた。あまり具体的なことは言えないけど、メルカリのmicroservice化を進めるにあたり重要なコンポーネントの開発・運用をやっていた。自分にはこういうPlatformや基盤のようなものは向いていないかなと思っていたけど、やっていくうちにそれなりに知識がついてきて意外と楽しくなってきたのと、チームメンバーにも恵まれて自分の意見を臆せずバンバン言える雰囲気で良かったと思う。&lt;/p&gt;&#xA;&lt;p&gt;2019年からはそんなチームを離れて、エンドユーザーに近い機能開発をしていく予定。&lt;/p&gt;&#xA;&lt;h3 id=&#34;上海出張&#34;&gt;上海出張&lt;/h3&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;無人コンビニ &lt;a href=&#34;https://t.co/IK65DB6KBj&#34;&gt;pic.twitter.com/IK65DB6KBj&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;— oinume (@oinume) &lt;a href=&#34;https://twitter.com/oinume/status/975233928280748033?ref_src=twsrc%5Etfw&#34;&gt;March 18, 2018&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;無人カラオケボックス &lt;a href=&#34;https://t.co/L3jcGAkVk3&#34;&gt;pic.twitter.com/L3jcGAkVk3&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;— oinume (@oinume) &lt;a href=&#34;https://twitter.com/oinume/status/975249843835748352?ref_src=twsrc%5Etfw&#34;&gt;March 18, 2018&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;マグレブ殿〜 &lt;a href=&#34;https://t.co/IGaSWLMiTX&#34;&gt;pic.twitter.com/IGaSWLMiTX&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;— oinume (@oinume) &lt;a href=&#34;https://twitter.com/oinume/status/975274799508242438?ref_src=twsrc%5Etfw&#34;&gt;March 18, 2018&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h3 id=&#34;gopherconvn&#34;&gt;&lt;a href=&#34;https://gophercon.vn&#34;&gt;gophercon.vn&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://t.co/jUd0wTX34y&#34;&gt;pic.twitter.com/jUd0wTX34y&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;— oinume (@oinume) &lt;a href=&#34;https://twitter.com/oinume/status/1071218761749823489?ref_src=twsrc%5Etfw&#34;&gt;December 8, 2018&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;配布されたmerari.goのステッカーを胸につけてる人を何人か見つけて嬉しい😃&lt;/p&gt;&#xA;&lt;p&gt;— oinume (@oinume) &lt;a href=&#34;https://twitter.com/oinume/status/1071302957293948929?ref_src=twsrc%5Etfw&#34;&gt;December 8, 2018&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;ホーチミンに高島屋があって、地下の食料品売り場には日本の食べ物がたくさん。ここなら日本食恋しくなることなさそう。そして出前一丁懐かしいw &lt;a href=&#34;https://t.co/zpcIRhZZDS&#34;&gt;pic.twitter.com/zpcIRhZZDS&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;— oinume (@oinume) &lt;a href=&#34;https://twitter.com/oinume/status/1071731576399003649?ref_src=twsrc%5Etfw&#34;&gt;December 9, 2018&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h2 id=&#34;年初の抱負に対する実績&#34;&gt;年初の抱負に対する実績&lt;/h2&gt;&#xA;&lt;p&gt;今年は3ヶ月ごとに必ず振り返りをするということを行ったおかげでまったく目標が達成できない、ということはなかったように思う。ただ、やりたいことに対して圧倒的に時間が足りないというのは例年と変わらずで、2019年はやりたいことをもっと絞らないと駄目だと思っている。&lt;/p&gt;&#xA;&lt;h3 id=&#34;アルゴリズム&#34;&gt;アルゴリズム&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;ハッシュテーブルを実装した&lt;/li&gt;&#xA;&lt;li&gt;文字列検索でブルートフォースを実装した&lt;/li&gt;&#xA;&lt;li&gt;文字列検索でBoyer Moore法を実装した&lt;/li&gt;&#xA;&lt;li&gt;2分探索木を実装した&lt;/li&gt;&#xA;&lt;li&gt;B木を実装中&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;ブロックチェーン&#34;&gt;ブロックチェーン&lt;/h3&gt;&#xA;&lt;p&gt;機械学習をやめて途中からブロックチェーンを学ぼうと思ったけど、途中からやる気がなくなりあまり進捗が良くなかった&lt;/p&gt;&#xA;&lt;h3 id=&#34;lekcijeに課金機能をつける&#34;&gt;lekcijeに課金機能をつける&lt;/h3&gt;&#xA;&lt;p&gt;途中からGKEに移行することを優先したので進捗がほぼない。&lt;/p&gt;&#xA;&lt;h2 id=&#34;書いたブログ&#34;&gt;書いたブログ&lt;/h2&gt;&#xA;&lt;p&gt;2018年の前半はわりとブログを書く余裕があったのだけど、後半になって仕事が忙しくなってきてからはあまり書けていない。自分の学んだことをアウトプットしないとどんどん忘れてしまうので書きたいとは思いつつも後回しになってしまっていてこれは良くないなと思う。来年は月に1本ぐらいはちゃんとした内容のものを書きたい。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://journal.lampetty.net/entry/loop-over-dates-with-bash-in-linux&#34;&gt;Loop over dates with bash in Linux - oinume journal&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://journal.lampetty.net/entry/webpack-config-externals&#34;&gt;webpackで&lt;script&gt;タグでロードしたライブラリをbundleされたJSから外したい - oinume journal&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://journal.lampetty.net/entry/heroku-name-lookup-timeout-is-too-short&#34;&gt;HerokuのName lookup timeoutが短すぎて困ってる話 - oinume journal&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://journal.lampetty.net/entry/obtain-google-form-email-from-gas&#34;&gt;Googleフォームでメールアドレスを収集する場合にそのメールアドレスをGASから取得する - oinume journal&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://journal.lampetty.net/entry/embed-images-on-google-drive&#34;&gt;Google Driveの画像をブログに埋め込む - oinume journal&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://journal.lampetty.net/entry/call-external-api-in-gas&#34;&gt;Google Apps Scriptで外部のREST APIを呼び出す - oinume journal&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://journal.lampetty.net/entry/implement-restful-api-with-grpc-gateway&#34;&gt;grpc-gatewayでRESTful APIを実装する - oinume journal&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://journal.lampetty.net/entry/comparing-datetime-in-golang&#34;&gt;Comparing datetime in Golang - oinume journal&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://journal.lampetty.net/entry/paid-mac-apps&#34;&gt;課金している有料のMacアプリ - oinume journal&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://journal.lampetty.net/entry/generating-an-unpredictable-random-value-in-go&#34;&gt;Generating an unpredictable random value in Go - oinume journal&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://journal.lampetty.net/entry/understanding-http-handler-in-go&#34;&gt;Goのhttp.Handlerやhttp.HandlerFuncをちゃんと理解する - oinume journal&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://journal.lampetty.net/entry/2018/07/12/090000&#34;&gt;読書: 新しい文章力の教室 - oinume journal&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://journal.lampetty.net/entry/recommended-web-application-framework-in-go&#34;&gt;GoのWeb Application Frameworkでオススメは？ - oinume journal&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://journal.lampetty.net/entry/implementing-middleware-with-http-package-in-go&#34;&gt;Goのhttpパッケージだけでmiddlewareを実装する - oinume journal&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://journal.lampetty.net/entry/loading-dotenv-file-by-direnv&#34;&gt;direnvから.envをロードする - oinume journal&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://journal.lampetty.net/entry/satisfying-a-large-interface-quickly-in-go&#34;&gt;Satisfying a large interface quickly in Go - oinume journal&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;プライベート&#34;&gt;プライベート&lt;/h2&gt;&#xA;&lt;h3 id=&#34;サンフランシスコ行った&#34;&gt;サンフランシスコ行った&lt;/h3&gt;&#xA;&lt;p&gt;1月に奥さんの出張に付き合ってロス＋サンフランシスコに家族で行ってきた&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;息子氏の要望により2日連続で来た (at &lt;a href=&#34;https://twitter.com/exploratorium?ref_src=twsrc%5Etfw&#34;&gt;@Exploratorium&lt;/a&gt; in San Francisco, CA) &lt;a href=&#34;https://t.co/ZqFltnlNns&#34;&gt;https://t.co/ZqFltnlNns&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;— oinume (@oinume) &lt;a href=&#34;https://twitter.com/oinume/status/955168968997818369?ref_src=twsrc%5Etfw&#34;&gt;January 21, 2018&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h3 id=&#34;e-residencyカードとマイナンバーカードを作成&#34;&gt;e-Residencyカードとマイナンバーカードを作成&lt;/h3&gt;&#xA;&lt;p&gt;2017年の12月にエストニアに行った勢いでe-Residencyカードという、エストニアに住んでいなくても銀行口座が作れたり会社作れたりするマイナンバーカードみたいなものを作った。ついでに日本のマイナンバーカードも作った。&lt;/p&gt;&#xA;&lt;h3 id=&#34;病気になって人生初入院&#34;&gt;病気になって人生初入院&lt;/h3&gt;&#xA;&lt;p&gt;こいぬめ氏の扁桃炎を被弾して自分も扁桃炎にかかる。息子はなんと扁桃腺を手術で切除する事態に... 自分はそこまではいかなかったけど、血液検査したら「今すぐ入院しないとまずいレベル」と医者に言われて即日病院送りに... 5日間入院して、ひたすら点滴を打つ毎日。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;この季節を狙って日本に観光に来る外国人多いんだ。桜綺麗だもんなぁ。早く退院して花見したいぞ！&lt;/p&gt;&#xA;&lt;p&gt;— oinume (@oinume) &lt;a href=&#34;https://twitter.com/oinume/status/978403884413497344?ref_src=twsrc%5Etfw&#34;&gt;March 26, 2018&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h3 id=&#34;korn&#34;&gt;KORN&lt;/h3&gt;&#xA;&lt;p&gt;退院した直後にKORNのライブを観に行った。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://twitter.com/hashtag/KORN?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#KORN&lt;/a&gt; came to Japan! I was so happy to see them again! &lt;a href=&#34;https://t.co/0CGA9e3XPj&#34;&gt;pic.twitter.com/0CGA9e3XPj&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;— oinume (@oinume) &lt;a href=&#34;https://twitter.com/oinume/status/980083967276720128?ref_src=twsrc%5Etfw&#34;&gt;March 31, 2018&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h3 id=&#34;副業的なもの&#34;&gt;副業的なもの&lt;/h3&gt;&#xA;&lt;p&gt;友達の仕事を手伝うなどした。まぁWordPressのセットアップをしてデータをサルベージしただけなんだけど。&lt;/p&gt;&#xA;&lt;h2 id=&#34;2019年に向けて&#34;&gt;2019年に向けて&lt;/h2&gt;&#xA;&lt;p&gt;まず仕事が忙しくなるとブログを書かなくなったり個人の勉強をおろそかにしてしまうのが本当に良くないと思っている。そもそも仕事が忙しいこと自体、自分にも責任があるのでちゃんとコントロールするようにしないといけない。この辺の課題をクリアしつつ、もう40歳になってしまうので、人生設計を真面目に考えないとマズい...&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;達成したい目標を絞る&lt;/li&gt;&#xA;&lt;li&gt;仕事を忙しくし過ぎない&lt;/li&gt;&#xA;&lt;li&gt;今後10年の大まかな計画を立てる&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;あたりを2019年は頑張ろうと思う。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Satisfying a large interface quickly in Go</title>
				<link>https://journal.lampetty.net/posts/satisfying-a-large-interface-quickly-in-go/</link>
				<pubDate>Mon, 12 Nov 2018 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/satisfying-a-large-interface-quickly-in-go/</guid>
				<description>&lt;p&gt;Sometimes it&#39;s painful to safisfy a large interface in Go. Here is a simple answer for this, just embed interface on struct like bellow:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;go&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;package&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Foo&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;interface&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;MethodA&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;MethodB&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;MethodC&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;MethodD&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;   &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;FooImpl&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;struct&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Foo&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fi&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;FooImpl&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;MethodA&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;MethodA called&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;foo&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;FooImpl&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;foo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;MethodA&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// Implemented&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;foo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;MethodB&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// Not implemented, runtime error will happen&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You can check the result on &lt;a href=&#34;https://play.golang.org/p/0y8ICTWCfpy&#34;&gt;https://play.golang.org/p/0y8ICTWCfpy&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;MethodA called&lt;/code&gt; is printed&lt;/li&gt;&#xA;&lt;li&gt;And then a runtime error happens by calling &lt;code&gt;foo.MethodB&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;This technique is useful in unit test.&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>2018年10月の振り返り</title>
				<link>https://journal.lampetty.net/posts/review-2018-10/</link>
				<pubDate>Thu, 08 Nov 2018 10:39:36 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/review-2018-10/</guid>
				<description>&lt;h2 id=&#34;アルゴリズム&#34;&gt;アルゴリズム&lt;/h2&gt;&#xA;&lt;p&gt;BTreeをやっているけど、時間がなくて実装ができずに止まっている。&lt;/p&gt;&#xA;&lt;h2 id=&#34;ブロックチェーン&#34;&gt;ブロックチェーン&lt;/h2&gt;&#xA;&lt;p&gt;進捗なし&lt;/p&gt;&#xA;&lt;h2 id=&#34;lekcijeのインフラ引っ越し&#34;&gt;lekcijeのインフラ引っ越し&lt;/h2&gt;&#xA;&lt;p&gt;CircleCIでdocker buildしてGoogle Container Registryにpushするところまではできたので、あとはKubernetesのyamlをひたすら書いていく。&lt;/p&gt;&#xA;&lt;p&gt;↑に関連して、静的ファイルの配信をVPS + NginxからCloudFlare + GCSに切り替えた。少しハマりポイントがあったので今度ブログにでもまとめようと思う。&lt;/p&gt;&#xA;&lt;h2 id=&#34;読書&#34;&gt;読書&lt;/h2&gt;&#xA;&lt;h3 id=&#34;career-skills&#34;&gt;CAREER SKILLS&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4822255743/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/51WEQS8rl4L._SL160_.jpg&#34; alt=&#34;CAREER SKILLS ソフトウェア開発者の完全キャリアガイド&#34; loading=&#34;lazy&#34; title=&#34;CAREER SKILLS ソフトウェア開発者の完全キャリアガイド&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4822255743/kazzhomeunixo-22/&#34;&gt;CAREER SKILLS ソフトウェア開発者の完全キャリアガイド&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: ジョン・ソンメズ,まつもとゆきひろ,長尾高弘&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: 日経BP&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2018/06/22&lt;/li&gt;&#xA;&lt;li&gt;メディア: 単行本&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4822255743/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (2件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;これを読んだ。ソフトウェアエンジニアになる近道とか、プロのエンジニアとしてやっていくには、みたいな心得集のようなもの。情報のポイントがまとまっているので、一通り網羅したい人にはオススメできる内容だと思う。&lt;/p&gt;&#xA;&lt;h3 id=&#34;code-complete&#34;&gt;CODE COMPLETE&lt;/h3&gt;&#xA;&lt;p&gt;CAREER SKILLSで言及されていたので読んでいる。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/489100455X/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/51E1DYKHW7L._SL160_.jpg&#34; alt=&#34;CODE COMPLETE 第2版 上 完全なプログラミングを目指して&#34; loading=&#34;lazy&#34; title=&#34;CODE COMPLETE 第2版 上 完全なプログラミングを目指して&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/489100455X/kazzhomeunixo-22/&#34;&gt;CODE COMPLETE 第2版 上 完全なプログラミングを目指して&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: スティーブマコネル,Steve McConnell,クイープ&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: 日経BP&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2005/03/26&lt;/li&gt;&#xA;&lt;li&gt;メディア: 単行本&lt;/li&gt;&#xA;&lt;li&gt;購入: 44人 クリック: 1,166回&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/489100455X/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (288件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;プライベート&#34;&gt;プライベート&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;楽天マガジンを解約したので本を読む時間が増えた。&lt;/li&gt;&#xA;&lt;li&gt;10月はDMM英会話をほぼやらなかった。そして3週間ぶりにレッスンを受けたらすごく新鮮な気持ちで楽しかったし、意外と英語力が衰えていなかった。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>direnvから.envをロードする</title>
				<link>https://journal.lampetty.net/posts/loading-dotenv-file-by-direnv/</link>
				<pubDate>Fri, 19 Oct 2018 19:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/loading-dotenv-file-by-direnv/</guid>
				<description>&lt;p&gt;.envrcファイルに &lt;code&gt;dotenv&lt;/code&gt; と書くだけで、現在いるディレクトリの .env ファイルを読んでくれる素敵な仕様を発見した。これでdirenv使いながら.env形式しか受け付けないアプリケーションにも対応できてめでたしめでたし。&lt;/p&gt;&#xA;&lt;p&gt;以下は具体的な例。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ cat .env&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;PORT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;12345&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;ENV&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;local&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ cat .envrc&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;dotenv&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ direnv allow&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;direnv: loading .envrc&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;direnv: &lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; +ENV +PORT&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ &lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$ENV&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$PORT&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;12345&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
			</item>
			<item>
				<title>2018年9月の振り返り</title>
				<link>https://journal.lampetty.net/posts/review-2018-09/</link>
				<pubDate>Sun, 07 Oct 2018 16:15:39 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/review-2018-09/</guid>
				<description>&lt;p&gt;9月は10日間の奥さんの出張があったこともあり、本当にあっという間だった。&lt;/p&gt;&#xA;&lt;h2 id=&#34;アルゴリズム&#34;&gt;アルゴリズム&lt;/h2&gt;&#xA;&lt;p&gt;次はBTreeをやろうと思って、その前にAVLTreeやらないとダメそうで、そういえばBinarySearchTreeも実装したことないなって思って&lt;a href=&#34;https://github.com/oinume/algo/tree/master/src/datastructure/binary_search_tree&#34;&gt;BinarySearchTreeを実装した&lt;/a&gt;。&lt;/p&gt;&#xA;&lt;p&gt;10月こそはAVLTreeとBTreeやる。&lt;/p&gt;&#xA;&lt;h2 id=&#34;ブロックチェーン&#34;&gt;ブロックチェーン&lt;/h2&gt;&#xA;&lt;p&gt;進捗なし&lt;/p&gt;&#xA;&lt;h2 id=&#34;lekcijeの月額課金&#34;&gt;lekcijeの月額課金&lt;/h2&gt;&#xA;&lt;p&gt;月額課金の前に、インフラ環境をherokuからGCPの東京リージョンのGKEに移そうかなと思っている。&lt;/p&gt;&#xA;&lt;p&gt;というのは、7月ぐらいにeikaiwa.dmm.comがSSL対応されたことにより、スクレイピング時のレイテンシが大幅に悪化したため、通知処理に時間がかかるようになってしまった。よりeikaiwa.dmm.comに近い場所からスクレイピングを動かさないとダメそう、ということでGCPの東京リージョンに移したい。&lt;/p&gt;&#xA;&lt;p&gt;欲をいえばGKEではなくGAEで済ませたいのだけど(GKE高いし)、内部的にgRPCを使っているせいでGAEが使えない。早くGAE SEでgRPCが動かせるようになってほしい！(切実)&lt;/p&gt;&#xA;&lt;h2 id=&#34;読書&#34;&gt;読書&lt;/h2&gt;&#xA;&lt;p&gt;橋下さんの「政権奪取論　強い野党の作り方」を読んだ。日本はアメリカのように2大政党制ではないので、自民党が危機感を持たず政治が国民を向いてないっていうことを具体的なエピソードをもとに説明している本。最初の方は面白かったし納得することも多かったけど、途中から似たようなエピソードが多くなってきたので途中で読むのをやめた。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4022737875/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/51EQnZG5-7L._SL160_.jpg&#34; alt=&#34;政権奪取論 強い野党の作り方 (朝日新書)&#34; loading=&#34;lazy&#34; title=&#34;政権奪取論 強い野党の作り方 (朝日新書)&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4022737875/kazzhomeunixo-22/&#34;&gt;政権奪取論 強い野党の作り方 (朝日新書)&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: 橋下徹&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: 朝日新聞出版&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2018/09/13&lt;/li&gt;&#xA;&lt;li&gt;メディア: 新書&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4022737875/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (1件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;プライベート&#34;&gt;プライベート&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;ジャック・ライアンがAmazon Primeにあったので見てしまった&lt;/li&gt;&#xA;&lt;li&gt;24の新しいシーズンがAmazon Primeに来てたので見てしまった&lt;/li&gt;&#xA;&lt;li&gt;奥さんが出張で10日間不在だったので育児ワンオペしてた&#xA;&lt;ul&gt;&#xA;&lt;li&gt;めちゃくちゃ大変だったけど、息子氏とより親密な関係を築けた&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;楽天マガジンは雑誌を読む時間が確保できなくなってきたので解約した。時間が増えてきたらまた復活するかも。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>2018年8月の振り返り</title>
				<link>https://journal.lampetty.net/posts/review-2018-08/</link>
				<pubDate>Tue, 04 Sep 2018 21:40:45 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/review-2018-08/</guid>
				<description>&lt;h2 id=&#34;アルゴリズム&#34;&gt;アルゴリズム&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/oinume/algo/blob/master/src/string_finder/boyer_moore.go&#34;&gt;Boyer Moore法やった&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;次は何をやろうかと悩んだ結果、データベースでよく使うBTreeをやることにした。&lt;/p&gt;&#xA;&lt;h2 id=&#34;ブロックチェーン&#34;&gt;ブロックチェーン&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.udemy.com/ethereum-and-solidity-the-complete-developers-guide/?deal_code=JPA8DEAL2PERCENTAGE&amp;amp;aEightID=s00000016735001&#34;&gt;https://www.udemy.com/ethereum-and-solidity-the-complete-developers-guide/?deal_code=JPA8DEAL2PERCENTAGE&amp;amp;aEightID=s00000016735001&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;ノロノロと亀のように進めている。6%完了。やっとスマートコントラクトの話が出てきた。&lt;/p&gt;&#xA;&lt;p&gt;FLOCは受講料26万円の割には大した内容ではなかったので解約した。正直あれならUdemyのコースとか書籍で十分。とにかく、1ヶ月以内なら解約できるのはいい制度だと思う。&lt;/p&gt;&#xA;&lt;h2 id=&#34;lekcijeの月額課金&#34;&gt;lekcijeの月額課金&lt;/h2&gt;&#xA;&lt;p&gt;進捗なし&lt;/p&gt;&#xA;&lt;h2 id=&#34;bloglampettynetのリダイレクト&#34;&gt;blog.lampetty.netのリダイレクト&lt;/h2&gt;&#xA;&lt;p&gt;今まではVPS上のNginxでやっていたけど、GAEでやるようにした。nginx.confをメンテしたくないしそもそもVPSでNginxを動かしたくないのでその第一歩。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/oinume/blog-lampetty-net-redirector&#34;&gt;https://github.com/oinume/blog-lampetty-net-redirector&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;GoogleCloudFunctions for Goがalpha版プレビューになっていたので、正式版が出たらこっちに置き換えたい。&lt;/p&gt;&#xA;&lt;h2 id=&#34;読書&#34;&gt;読書&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4797395362/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/51M9N0Zg0LL._SL160_.jpg&#34; alt=&#34;Google流 疲れない働き方&#34; loading=&#34;lazy&#34; title=&#34;Google流 疲れない働き方&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4797395362/kazzhomeunixo-22/&#34;&gt;Google流 疲れない働き方&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: ピョートル・フェリークス・グジバチ&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: SBクリエイティブ&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2018/03/10&lt;/li&gt;&#xA;&lt;li&gt;メディア: 単行本&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4797395362/kazzhomeunixo-22&#34;&gt;この商品を含むブログを見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;ピョートルさんの本を呼んだ。途中でメルカリという社名が3回ぐらい出てきたのが気になったところ、Mercari Tech Confを手伝われていたということを知った。&lt;/p&gt;&#xA;&lt;h2 id=&#34;iijmioから楽天モバイルに乗り換えた&#34;&gt;IIJmioから楽天モバイルに乗り換えた&lt;/h2&gt;&#xA;&lt;p&gt;格安SIMのIIJmioが遅すぎるので乗り換えた。楽天モバイルだと低速回線モードでも1Mbpsぐらい出る。これはギリギリYouTubeが見れる速度。そして低速回線モードはいくら使ってもそれ以上は制限されない。IIJmioではありえないことに、低速回線モードでも3日で500MBを超えるとさらに速度制限をするという意味不明な仕様だった。なので、だいたい1Mbpsで生活して、困ったら高速回線モードに切り替えるという運用になった。おかげで一番安いプランになったので結果的に月額コストが下げられた。&lt;/p&gt;&#xA;&lt;h2 id=&#34;p20-liteを買った&#34;&gt;P20 Liteを買った&lt;/h2&gt;&#xA;&lt;p&gt;AndroidはずっとNexus4を使っていたのだけどさすがに限界だったので買い替えた。Android 8.0だとさすがに使いやすい。カメラ以外はiPhoneの代わりにメイン機にしても良いレベル。AndroidはGoogleと密結合されているのが良い。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B07DNPBXH1/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/318FLcV7fjL._SL160_.jpg&#34; alt=&#34;ファーウェイジャパン P20lite/MidnightBlack HUAWEI P20 lite/Midnight Black/51092NAH&#34; loading=&#34;lazy&#34; title=&#34;ファーウェイジャパン P20lite/MidnightBlack HUAWEI P20 lite/Midnight Black/51092NAH&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B07DNPBXH1/kazzhomeunixo-22/&#34;&gt;ファーウェイジャパン P20lite/MidnightBlack HUAWEI P20 lite/Midnight Black/51092NAH&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;出版社/メーカー: HUAWEI&lt;/li&gt;&#xA;&lt;li&gt;メディア: エレクトロニクス&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/B07DNPBXH1/kazzhomeunixo-22&#34;&gt;この商品を含むブログを見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;その他プライベート&#34;&gt;その他プライベート&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;MacBookPro(2016)のバッテリーが壊れて無償交換対象だったので交換してもらった。GeniusBarでお願いしたら2日後には家に届いていて早さにびっくり。Apple製品は高いけどアフターサービスはやっぱり良いよね。&lt;/li&gt;&#xA;&lt;li&gt;楽天マガジンはまだ継続課金してる&lt;/li&gt;&#xA;&lt;li&gt;1Password Familiesは使いやすくて最高なので年間課金した&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;8月はブログをまったく書かなかった。頑張ろう。&lt;/li&gt;&#xA;&lt;li&gt;暑かったせいか仕事以外のものがすべてにおいて疎かになってしまっていた&lt;/li&gt;&#xA;&lt;li&gt;2018年もあと4ヶ月しかない！&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>2018年7月の振り返り</title>
				<link>https://journal.lampetty.net/posts/review-2018-07/</link>
				<pubDate>Fri, 03 Aug 2018 10:23:55 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/review-2018-07/</guid>
				<description>&lt;h2 id=&#34;機械学習&#34;&gt;機械学習&lt;/h2&gt;&#xA;&lt;p&gt;進捗なし。次からは振り返り対象から外す。&lt;/p&gt;&#xA;&lt;h2 id=&#34;アルゴリズム&#34;&gt;アルゴリズム&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;文字列探索で力まかせのアルゴリズム実装した&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;ブロックチェーン&#34;&gt;ブロックチェーン&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.udemy.com/ethereum-and-solidity-the-complete-developers-guide/?deal_code=JPA8DEAL2PERCENTAGE&amp;amp;aEightID=s00000016735001&#34;&gt;https://www.udemy.com/ethereum-and-solidity-the-complete-developers-guide/?deal_code=JPA8DEAL2PERCENTAGE&amp;amp;aEightID=s00000016735001&lt;/a&gt;&lt;a href=&#34;https://www.udemy.com/ethereum-and-solidity-the-complete-developers-guide/?deal_code=JPA8DEAL2PERCENTAGE&amp;amp;aEightID=s00000016735001&#34;&gt;www.udemy.com&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;このコースを少しだけ進めた。まだブロックチェーンの基礎の部分だけど曖昧な理解だったところがクリアになって来ててよい。&lt;/p&gt;&#xA;&lt;p&gt;あと、FLOCのエンジニアコースを受講してみたのだけど、払った値段に対して内容がイマイチなので解約手続き中。(1ヶ月以内ならキャンセルできる)&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://floc.jp/&#34;&gt;floc.jp&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;lekcijeの月額課金&#34;&gt;lekcijeの月額課金&lt;/h2&gt;&#xA;&lt;p&gt;進捗なし&lt;/p&gt;&#xA;&lt;h2 id=&#34;プライベート&#34;&gt;プライベート&lt;/h2&gt;&#xA;&lt;h3 id=&#34;タスク管理&#34;&gt;タスク管理&lt;/h3&gt;&#xA;&lt;p&gt;5月ぐらいからTrelloでプライベートのタスク管理をしているけど、いい感じでワークしている。iPhoneアプリがよくできているのが大きな理由かも。タスクごとに「これはどこまで終わっていて、あとはどういうことをやるべきか」というのを簡単にメモできるのもありがたい。&lt;/p&gt;&#xA;&lt;p&gt;また、「今月何やったっけ？」っていう振り返りにも使える。&lt;/p&gt;&#xA;&lt;h3 id=&#34;ブログ&#34;&gt;ブログ&lt;/h3&gt;&#xA;&lt;p&gt;7月は真面目な記事を4つ書いた。Goのhttpパッケージまわりは以前からもやもや中途半端な理解だったものをちゃんと整理できてアウトプットできたのが嬉しい。忘れてしまったらこのブログを検索すれば良いので安心して忘れられる(違&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://oinume.hatenablog.com/entry/understanding-http-handler-in-go&#34;&gt;Goのhttp.Handlerやhttp.HandlerFuncをちゃんと理解する - oinume journal&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://oinume.hatenablog.com/entry/recommended-web-application-framework-in-go&#34;&gt;GoのWeb Application Frameworkでオススメは？ - oinume journal&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://oinume.hatenablog.com/entry/implementing-middleware-with-http-package-in-go&#34;&gt;Goのhttpパッケージだけでmiddlewareを実装する - oinume journal&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://oinume.hatenablog.com/entry/2018/07/12/090000&#34;&gt;読書: 新しい文章力の教室 - oinume journal&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;暗号技術入門&#34;&gt;暗号技術入門&lt;/h3&gt;&#xA;&lt;p&gt;小難しい話が可能な限りわかりやすく説明されていて良い。なんで今まで読まなかったのだろうという後悔しかない。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4797382228/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/51V6l3panVL._SL160_.jpg&#34; alt=&#34;暗号技術入門 第3版&#34; loading=&#34;lazy&#34; title=&#34;暗号技術入門 第3版&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4797382228/kazzhomeunixo-22/&#34;&gt;暗号技術入門 第3版&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: 結城浩&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: SBクリエイティブ&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2015/08/26&lt;/li&gt;&#xA;&lt;li&gt;メディア: 単行本&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4797382228/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (19件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;1password-families&#34;&gt;1Password Families&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;夫婦でアカウント管理を共通化したかったので契約&lt;/li&gt;&#xA;&lt;li&gt;今のところいい感じなので、$60とけっこうお高いけど必要経費だと思って年間サブスクリプションで課金した&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;資産運用&#34;&gt;資産運用&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;WealthNaviで2000円ぐらい利益出てきた。ただし手数料が預けている額の1%で高すぎ&lt;/li&gt;&#xA;&lt;li&gt;個別株はGoogleを売って利益が$200ぐらい&lt;/li&gt;&#xA;&lt;li&gt;クラウドバンクにアカウント作ったので入金しないと&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;読書&#34;&gt;読書&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4163907998/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/51MwniLqqPL._SL160_.jpg&#34; alt=&#34;中村俊輔 サッカー覚書&#34; loading=&#34;lazy&#34; title=&#34;中村俊輔 サッカー覚書&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4163907998/kazzhomeunixo-22/&#34;&gt;中村俊輔 サッカー覚書&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: 中村俊輔,二宮寿朗&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: 文藝春秋&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2018/02/09&lt;/li&gt;&#xA;&lt;li&gt;メディア: 単行本&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4163907998/kazzhomeunixo-22&#34;&gt;この商品を含むブログを見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;中村俊輔は自分と同い年だけどまだ現役でJリーグでプレイしていてすごいなぁと思っていたので本を読んでみた。イタリア、アイルランド、スペインと世界のサッカークラブでプレイしてきた感想が書いてあって面白かった。俊輔といえば&lt;a href=&#34;http://www.youtube.com/watch?v=Q8BudiIhYGQ&#34;&gt;セルティック時代の対マンUとのフリーキック&lt;/a&gt;が本当すごいなぁと思っている。サッカー選手は年齢が高くなるとやはり引退するしかないけれど、40歳でも現役でやっていくポイントみたいなのも書かれていて参考になる。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.football-zone.net/archives/4825&#34;&gt;この記事&lt;/a&gt;も面白かった。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4106107678/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/41O5Wvg2YdL._SL160_.jpg&#34; alt=&#34;コンビニ外国人 (新潮新書)&#34; loading=&#34;lazy&#34; title=&#34;コンビニ外国人 (新潮新書)&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4106107678/kazzhomeunixo-22/&#34;&gt;コンビニ外国人 (新潮新書)&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: 芹澤健介&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: 新潮社&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2018/05/16&lt;/li&gt;&#xA;&lt;li&gt;メディア: 新書&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4106107678/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (3件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;日本で働いている外国人が120万人を超えてたという記事をみかけたのと、&lt;code&gt;技能実習制度&lt;/code&gt;の闇が深そうだったので気になって読んでみた。最近は中国からだけでなく、ベトナムやネパールが増えてるらしい。日本のコンビニチェーンは海外展開もしているので、日本のコンビニで働いて自国に戻ってコンビニ関連の仕事をするという話はなんか良さそうだと思った。新宿のドラッグストアの店員とかほとんど中国人ですごいなぁと思う。&lt;/p&gt;&#xA;&lt;p&gt;参考：&lt;a href=&#34;https://www.mhlw.go.jp/file/04-Houdouhappyou-11655000-Shokugyouanteikyokuhakenyukiroudoutaisakubu-Gaikokujinkoyoutaisakuka/7584p57g.pdf&#34;&gt;「外国人雇用状況」の届出状況まとめ【本文】（平成 29 年 10 月末現在）&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;来月に向けて&#34;&gt;来月に向けて&lt;/h2&gt;&#xA;&lt;p&gt;7月はアルゴリズムがあまりできなかったので頑張らないと。最近、あらためて基礎を勉強することが大事だと痛感しているのだけど時間がいくらあっても足りない。何を勉強するべきかをまとめて効率良くやらないとなーと感じている。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Goのhttpパッケージだけでmiddlewareを実装する</title>
				<link>https://journal.lampetty.net/posts/implementing-middleware-with-http-package-in-go/</link>
				<pubDate>Mon, 30 Jul 2018 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/implementing-middleware-with-http-package-in-go/</guid>
				<description>&lt;p&gt;標準ライブラリのhttpパッケージだけでもmiddlewareは簡単に作れますよ、というお話。&lt;/p&gt;&#xA;&lt;h2 id=&#34;おさらい-httphandlerまたはhttphandlerfuncでやり取りする&#34;&gt;おさらい: http.Handlerまたはhttp.HandlerFuncでやり取りする&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://oinume.hatenablog.com/entry/understanding-http-handler-in-go&#34;&gt;Goのhttp.Handlerやhttp.HandlerFuncをちゃんと理解する - oinume journal&lt;/a&gt;に書いたとおり、&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;http.ListenAndServe&lt;/li&gt;&#xA;&lt;li&gt;ServeMux.Handle&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;に渡すのは &lt;code&gt;http.Handler&lt;/code&gt; なので、何かしらのmiddlewareもこのinterfaceを満たすことを考えればよい。もしくは &lt;code&gt;ServeMux.HandleFunc&lt;/code&gt; を使うのであれば &lt;code&gt;http.HandlerFunc&lt;/code&gt; を使うでもよし。&lt;/p&gt;&#xA;&lt;h2 id=&#34;middlewareはhttphandlerを引数に取りhttphandlerを返す&#34;&gt;middlewareはhttp.Handlerを引数に取り、http.Handlerを返す&lt;/h2&gt;&#xA;&lt;p&gt;例えば、 &lt;code&gt;admin&lt;/code&gt; という名前のCookieを持っていないとアクセスできないようなmiddlewareを考えてみる。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;mysql&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;requireAdminCookie&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;h&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Handler&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Handler&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fn&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;w&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ResponseWriter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Request&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Cookie&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;admin&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;Check&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;admin&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cookie&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nil&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Error&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;w&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;No admin cookie&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;StatusForbidden&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;h&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;ServeHTTP&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;w&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;HandlerFunc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;こんな感じで、&lt;code&gt;h.ServeHTTP&lt;/code&gt;を呼ぶ前にCookieがあるかをチェックする処理を入れる。&lt;/p&gt;&#xA;&lt;p&gt;このmiddlewareを使って、「特定のURLはadmin cookieがないとアクセスできないようにする」ためには、以下のようにmiddlewareと実際のHandlerを組み合わせる必要がある。以下のコードだと &lt;code&gt;/admin&lt;/code&gt; のURLはCookieがないと403 Forbiddenが返される。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;mux&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;NewServeMux&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;mux&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Handle&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;/admin&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;requireAdminCookie&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;HandlerFunc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;handleAdmin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ListenAndServe&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;:8080&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mux&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;nil&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Fatal&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;responseを返すHandler&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;handleAdmin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;w&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ResponseWriter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;r&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Request&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;w&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;WriteHeader&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;StatusOK&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Fprint&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;w&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;This is admin page&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;参考リンク&#34;&gt;参考リンク&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://medium.com/statuscode/how-i-write-go-http-services-after-seven-years-37c208122831&#34;&gt;How I write Go HTTP services after seven years&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/477418392X/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/61EL3Dc95dL._SL160_.jpg&#34; alt=&#34;みんなのGo言語【現場で使える実践テクニック】&#34; loading=&#34;lazy&#34; title=&#34;みんなのGo言語【現場で使える実践テクニック】&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/477418392X/kazzhomeunixo-22/&#34;&gt;みんなのGo言語【現場で使える実践テクニック】&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: 松木雅幸,mattn,藤原俊一郎,中島大一,牧大輔,鈴木健太,稲葉貴洋&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: 技術評論社&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2016/09/09&lt;/li&gt;&#xA;&lt;li&gt;メディア: 大型本&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/477418392X/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (4件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>GoのWeb Application Frameworkでオススメは？</title>
				<link>https://journal.lampetty.net/posts/recommended-web-application-framework-in-go/</link>
				<pubDate>Fri, 13 Jul 2018 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/recommended-web-application-framework-in-go/</guid>
				<description>&lt;p&gt;GoのWeb Application Frameworkでオススメは？という質問をよく受ける。 &lt;code&gt;標準ライブラリのhttpパッケージ使えばおｋ&lt;/code&gt; とまずは返答している。ただ、RESTで様々なHTTPメソッドをサポートする必要があり、かつ &lt;code&gt;/v1/users/{id}&lt;/code&gt; のようなPath内にIDが入る場合の対応を行いたい場合は&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/gorilla/mux&#34;&gt;gorilla/mux&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/go-chi/chi&#34;&gt;chi&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/goji/goji&#34;&gt;goji&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;あたりの標準のhttpパッケージに沿ったものをオススメしている。理由としては以下。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;ユニットテストで標準ライブラリのhttptestパッケージが使える(これ重要)&lt;/li&gt;&#xA;&lt;li&gt;他の標準のhttpパッケージに沿ったフレームワークに乗り換えやすい&#xA;&lt;ul&gt;&#xA;&lt;li&gt;もし乗り換えた場合でもテストコードは書き換えなくてよいはず&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;標準のhttpパッケージに沿ったもの、というのは、 ハンドラを登録する時に &lt;code&gt;http.Handler&lt;/code&gt; を受け付けられるものという意味で書いている。&lt;/p&gt;&#xA;&lt;p&gt;パフォーマンスが気になる人は以下を見ておけばいいのではないかと思うが、個人的にはWeb Application FrameworkのパフォーマンスはDBアクセスなどのNetwork I/Oに比べれば誤差だと思うのであんまり気にしなくていいのではないかと思う。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/smallnest/go-web-framework-benchmark&#34;&gt;github.com&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;参考までに、&lt;code&gt;gorilla/mux&lt;/code&gt; でRESTfulなAPIをサポートするコードは以下のような感じ&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;package&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;log&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;net/http&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;github.com/gorilla/mux&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;router&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mux&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;NewRouter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;router&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;HandleFunc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;/v1/users/{id:[0-9]+}&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;usersHandler&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Methods&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nb&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Fatal&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ListenAndServe&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;localhost:5000&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;router&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;usersHandler&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;w&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ResponseWriter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;r&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Request&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;vars&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mux&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Vars&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;w&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;WriteHeader&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;StatusOK&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Fprintf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;w&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Your id is %v&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;vars&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Path内のid&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4873117526/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/51UoREcNrnL._SL160_.jpg&#34; alt=&#34;Go言語によるWebアプリケーション開発&#34; loading=&#34;lazy&#34; title=&#34;Go言語によるWebアプリケーション開発&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4873117526/kazzhomeunixo-22/&#34;&gt;Go言語によるWebアプリケーション開発&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: Mat Ryer,鵜飼文敏,牧野聡&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: オライリージャパン&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2016/01/22&lt;/li&gt;&#xA;&lt;li&gt;メディア: 大型本&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4873117526/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (3件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>読書: 新しい文章力の教室</title>
				<link>https://journal.lampetty.net/posts/20180712-0900/</link>
				<pubDate>Thu, 12 Jul 2018 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/20180712-0900/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B013DX94FC?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;&lt;img src=&#34;https://m.media-amazon.com/images/I/418mpxoSVnL._SL500_.jpg&#34; alt=&#34;新しい文章力の教室　苦手を得意に変えるナタリー式トレーニング できるビジネスシリーズ&#34; loading=&#34;lazy&#34; title=&#34;新しい文章力の教室　苦手を得意に変えるナタリー式トレーニング できるビジネスシリーズ&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B013DX94FC?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;新しい文章力の教室　苦手を得意に変えるナタリー式トレーニング できるビジネスシリーズ&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者:唐木 元&lt;/li&gt;&#xA;&lt;li&gt;インプレス&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B013DX94FC?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;Amazon&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;自分の文章力を高めたいと思ってこの本を買ってみた。仕事ではドキュメントを書いたり、プライベートではこのブログを書いている。けれども、文章を書くということをちゃんと学んだことがなかったのと、自分の書いたものを読み返してみても「文才がないなぁ」という感想しか出てこないのでブラッシュアップしたかった。&lt;/p&gt;&#xA;&lt;p&gt;完全に自分用のメモだけどメモとして残しておく。&lt;/p&gt;&#xA;&lt;h2 id=&#34;良い文章の定義&#34;&gt;良い文章の定義&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;良い文章とは完読される文章である。&lt;/li&gt;&#xA;&lt;li&gt;適切な長さで、旬の話題で、テンポがいい文章&lt;/li&gt;&#xA;&lt;li&gt;レイヤーが大事。事実、ロジック、言葉遣いの順番で大切。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;主眼と骨子&#34;&gt;主眼と骨子&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;書き始める前に主眼と骨子を固めること。主眼はテーマ。主眼が目的地なら骨子は経路。&lt;/li&gt;&#xA;&lt;li&gt;テーマを決める。そしてテーマのために、何を、どれから、どのくらい話すかを決める。&lt;/li&gt;&#xA;&lt;li&gt;プラモデルのように考える。&lt;/li&gt;&#xA;&lt;li&gt;書きたい内容を箇条書きにしておく。この時順番は意識しなくて良い。主眼と骨子を考えるためにもひたすら書き出す。&lt;/li&gt;&#xA;&lt;li&gt;5W1Hに当てはめて考える。抜け漏れがないかのチェックになる&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Who, What, When, Where, Why, How&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;書き始める前に主眼を決めること。主眼はコンセプト。切り口。自分なりの切り口を考える&lt;/li&gt;&#xA;&lt;li&gt;骨子を立てるために大事なのは要素、順番、軽重の順で決めること。&lt;/li&gt;&#xA;&lt;li&gt;それぞれの話題をどれぐらいの重さで話すか、三段階で決める。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;構造シート&#34;&gt;構造シート&lt;/h2&gt;&#xA;&lt;p&gt;以下のような構造シートを書いて情報を整理する。&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;紙の上方に大きく線を引いて、テーマ（主眼）を書く欄を作る。この段階では空欄のままでよい。&lt;/li&gt;&#xA;&lt;li&gt;箇条書きで、書こうとする話題を列挙していく&lt;/li&gt;&#xA;&lt;li&gt;並んだ話題を眺めながらこれから各文章の主眼を見定め、テーマ欄に書き込む&lt;/li&gt;&#xA;&lt;li&gt;どの話題から切り出していくべきか、主眼に準じるよう吟味し、項目の左横に順番を数字で書き込んでいく&lt;/li&gt;&#xA;&lt;li&gt;紙を替え、テーマ欄に主眼を書き込み、順番通りに並べ直します。もししっくり来なければ、また順番を吟味して書き込み、紙を替えてやり直す&lt;/li&gt;&#xA;&lt;li&gt;アピールしたい優先度を、項目の右側にABCの3ランクで格付けしていく&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;実際の構造シートの例&#34;&gt;実際の構造シートの例&lt;/h3&gt;&#xA;&lt;h3 id=&#34;完読してもらうためのテクニック&#34;&gt;完読してもらうためのテクニック&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;ベテランのライターもいきなり文章を書き始めるのではなく、瞬間的に心の中に構造シートを書き込み、その後に文章を書き始めている&lt;/li&gt;&#xA;&lt;li&gt;話題は主眼に沿って取捨選択する。完読してもらうためにはすべての材料を使わない&lt;/li&gt;&#xA;&lt;li&gt;結論から先にいう&lt;/li&gt;&#xA;&lt;li&gt;構造シートに肉付けして行く形で文章を書いて行く&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;書けなくなった時は&#34;&gt;書けなくなった時は？&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;スタックしてしまった部分を置いて最後まで書いてしまう。また、2000字を超える場合はパートごとに構造シートを書くと良い。&lt;/li&gt;&#xA;&lt;li&gt;それでも書く手が止まってしまう場合は構造シートに問題がある場合が多い。 ￼&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;完成度を高める&#34;&gt;完成度を高める&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;事実とロジックがしっかりしていれば70点ぐらいにはなっている。あとは言葉遣いでブラッシュアップする。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>Goのhttp.Handlerやhttp.HandlerFuncをちゃんと理解する</title>
				<link>https://journal.lampetty.net/posts/understanding-http-handler-in-go/</link>
				<pubDate>Mon, 09 Jul 2018 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/understanding-http-handler-in-go/</guid>
				<description>&lt;h2 id=&#34;はじめに&#34;&gt;はじめに&lt;/h2&gt;&#xA;&lt;p&gt;GoでHTTP Serverを作ろうとすると、標準ライブラリを使う場合以下のようなコードをよく書くと思う。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;go&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;package&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;log&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;net/http&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;mux&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;NewServeMux&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;mux&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Handle&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;/hello&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;HandlerFunc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;hello&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Fatal&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;ListenAndServe&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;:8080&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;mux&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;hello&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;w&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ResponseWriter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Request&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;w&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;WriteHeader&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;StatusOK&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Fprintf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;w&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Hello World&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このコードの登場人物としては以下になるが、それぞれなんだっけ？というのをいっつも忘れてしまうのでメモしておく。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;http.ListenAndServe&lt;/li&gt;&#xA;&lt;li&gt;http.Handler&lt;/li&gt;&#xA;&lt;li&gt;http.HandleFunc&lt;/li&gt;&#xA;&lt;li&gt;http.ServeMux&lt;/li&gt;&#xA;&lt;li&gt;http.ServeMux.Handle&lt;/li&gt;&#xA;&lt;li&gt;http.ServeMux.HandleFunc&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;httplistenandserve&#34;&gt;&lt;a href=&#34;https://pkg.go.dev/net/http#ListenAndServe&#34;&gt;http.ListenAndServe&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;http.ListenAndServe はその名前の通りサーバーを起動するものである。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;第1引数にTCPのアドレス&lt;/li&gt;&#xA;&lt;li&gt;第2引数にhttp.Handler&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;を渡す。この第2引数のhttp.Handlerってなに？というのを次のセクションで説明する。&lt;/p&gt;&#xA;&lt;h2 id=&#34;httphandler&#34;&gt;&lt;a href=&#34;https://pkg.go.dev/net/http#Handler&#34;&gt;http.Handler&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;http.Handlerは&lt;code&gt;ServeHTTP&lt;/code&gt; というメソッドを定義しているinterface。以下がそのメソッドの定義。このServeHTTPメソッドはHTTPリクエストを受けてHTTPレスポンスを返す処理が記述されるものである。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;type Handler interface {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    ServeHTTP(ResponseWriter, *Request)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;後述する&lt;code&gt;http.ServeMux&lt;/code&gt;のHandleメソッドの引数がこのinterface型になっている。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mux&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ServeMux&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Handle&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pattern&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;handler&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Handler&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;....&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;httpservemux&#34;&gt;&lt;a href=&#34;https://pkg.go.dev/net/http#ServeMux&#34;&gt;http.ServeMux&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;http.ServeMuxには、HTTPリクエストのURLとそれに対応するハンドラを登録する。HTTPリクエストが来た時に、そのURLにマッチしたハンドラを呼び出すマルチプレクサである。pkg.go.devからの引用。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;ServeMux is an HTTP request multiplexer. It matches the URL of each incoming request against a list of registered patterns and calls the handler for the pattern that most closely matches the URL.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;ServeMux.Handleメソッドを呼び出して以下のようにURLのPathとHandlerを登録しておく。例えばHTTPリクエストのURLが &lt;code&gt;/echo&lt;/code&gt; の場合、&lt;code&gt;echoHandler&lt;/code&gt;のServeHTTPメソッドが呼び出される。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;mux&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;NewServeMux&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;mux&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Handle&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;/echo&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;echoHandler&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;...&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;type&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;echoHandler&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;struct&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;h&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;echoHandler&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ServeHTTP&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;w&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ResponseWriter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;r&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Request&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;w&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;WriteHeader&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;StatusOK&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Fprintf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;w&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Hello World&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;なお、http.ServeMuxはServeHTTPメソッドを実装しているので、http.ListenAndServeの第2引数に渡すことができる。&lt;/p&gt;&#xA;&lt;h3 id=&#34;httphandlerfunc&#34;&gt;&lt;a href=&#34;https://pkg.go.dev/net/http#HandlerFunc&#34;&gt;http.HandlerFunc&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;func(ResponseWriter, *Request)&lt;/code&gt; を別の型として定義したもの&lt;/li&gt;&#xA;&lt;li&gt;このHandlerFunc型には&lt;code&gt;ServeHTTP(ResponseWriter, *Request)&lt;/code&gt;メソッドが実装されている。&lt;code&gt;func(http.ResponseWriter, *http.Request)&lt;/code&gt; のシグネチャの関数を自分で定義しておき、このHandlerFuncにキャストするだけで構造体を宣言することなく http.Handler を実装することができる&lt;/li&gt;&#xA;&lt;li&gt;godocには &lt;code&gt;The HandlerFunc type is an adapter to allow the use of ordinary functions as HTTP handlers. If f is a function with the appropriate signature, HandlerFunc(f) is a Handler that calls f.&lt;/code&gt; と書かれている。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;実際のコードはこんな感じ。HandlerFunc自体にServeHTTPがあり、その中では元の関数である&lt;code&gt;f&lt;/code&gt;を呼び出しているだけ。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;type&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;HandlerFunc&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ResponseWriter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Request&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ServeHTTP&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;calls&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;w&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;f&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;HandlerFunc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ServeHTTP&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;w&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ResponseWriter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;r&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Request&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;w&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;いまいちイメージしづらいので、使う側のコードを書いてみる。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;hello&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;w&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ResponseWriter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;r&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Request&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;w&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;WriteHeader&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;StatusOK&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Fprintf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;w&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Hello World&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;mux&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;NewServeMux&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;mux&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Handle&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;/hello&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;HandlerFunc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;hello&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;helloをHandlerFuncにキャスト&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#xA;&lt;li&gt;helloをhttp.HandlerFuncにキャスト&lt;/li&gt;&#xA;&lt;li&gt;http.HandlerFuncは ServeHTTP を実装しているので、ServeMux.Handleの第2引数に指定することが可能。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;という仕組みになっている。先程のServeHTTPのサンプルコードだと、echoHandlerというstructを定義してそこにServeHTTPメソッドを定義する必要があったが、このコードではそのような構造体は必要ないことがわかると思う。&lt;/p&gt;&#xA;&lt;h2 id=&#34;httpservemuxhandlefunc&#34;&gt;&lt;a href=&#34;https://pkg.go.dev/net/http#ServeMux.HandleFunc&#34;&gt;http.ServeMux.HandleFunc&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;ServeMuxにはHandleメソッド以外にも&lt;code&gt;HandleFunc&lt;/code&gt;というメソッドが定義されている。コードとしてはこんな感じの実装になっている。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;HandleFunc&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;registers&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;the&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;handler&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;the&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;given&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pattern&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mux&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ServeMux&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;HandleFunc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pattern&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;handler&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ResponseWriter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Request&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;mux&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Handle&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pattern&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;HandlerFunc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;handler&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この実装を見ればわかるように、第２引数の&lt;code&gt;handler&lt;/code&gt;をHandlerFuncにキャストして、自身の&lt;code&gt;Handle&lt;/code&gt;を呼び出しているだけである。&lt;/p&gt;&#xA;&lt;p&gt;呼び出し側のコードはこんな感じになる。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mux := http.NewServeMux()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mux.HandleFunc(&amp;#34;/hello&amp;#34;, func(w http.ResponseWriter, r *http.Request) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    w.WriteHeader(http.StatusOK)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    fmt.Fprintf(w, &amp;#34;Hello World&amp;#34;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;})&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;何が嬉しいのかというと、&lt;code&gt;func(http.ResponseWriter, *http.Request)&lt;/code&gt;を自分でhttp.HandlerFuncにキャストしなくてもよいということ。自分はServeMux.HandleとServeMux.HandleFuncのどちらを使えばいいんだっけ？といつも混乱しているけど、HandleFuncはHandleのショートカットだと思えば良い。&lt;/p&gt;&#xA;&lt;h2 id=&#34;httphandleとdefaultservemux&#34;&gt;&lt;a href=&#34;https://pkg.go.dev/net/http#Handle&#34;&gt;http.Handle&lt;/a&gt;と&lt;a href=&#34;https://pkg.go.dev/net/http#pkg-variables&#34;&gt;DefaultServeMux&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;http.Handleもまたショートカットである。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;httpパッケージ内に&lt;code&gt;DefaultServeMux&lt;/code&gt;というグローバル変数が定義されている&lt;/li&gt;&#xA;&lt;li&gt;http.Handleを呼び出すとこのDefaultServeMux.Handleが呼び出される&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;という仕組み。http.HandleFuncも同様に定義されていて、これもDefaultServeMux.HandleFuncが呼び出されるだけだ。&lt;/p&gt;&#xA;&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;&#xA;&lt;p&gt;似たような名前のものがあってややこしいけど&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;http.HandlerはServeHTTPメソッドを定義するinterface&lt;/li&gt;&#xA;&lt;li&gt;http.HandlerFuncを使えばServeHTTPを実装するstructを作らなくて良い&lt;/li&gt;&#xA;&lt;li&gt;ServeMux.HandleメソッドでPathとhttp.Handlerのマッピングを登録する&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;というのだけ最低限覚えておけば良いのかなと思う。あとは応用。なお、例として挙げたサンプルコードは&lt;a href=&#34;https://github.com/oinume/playground-go/blob/master/http_handler/http_handler.go&#34;&gt;ここ&lt;/a&gt;にあがってる。&lt;/p&gt;&#xA;&lt;h2 id=&#34;参考リンク&#34;&gt;参考リンク&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://qiita.com/ruiu/items/85b72bc94e08d192d90b&#34;&gt;Goのメソッドは構造体以外にでも定義できるしそれが便利なこともよくある - Qiita&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/4621300253?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;&lt;img src=&#34;https://m.media-amazon.com/images/I/41meaSLNFfL._SL500_.jpg&#34; alt=&#34;プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)&#34; loading=&#34;lazy&#34; title=&#34;プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/4621300253?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者:Alan A.A. Donovan,Brian W. Kernighan&lt;/li&gt;&#xA;&lt;li&gt;丸善出版&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/4621300253?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;Amazon&lt;/a&gt;&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>2018年6月の振り返り</title>
				<link>https://journal.lampetty.net/posts/review-2018-06/</link>
				<pubDate>Thu, 28 Jun 2018 10:21:59 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/review-2018-06/</guid>
				<description>&lt;h2 id=&#34;機械学習&#34;&gt;機械学習&lt;/h2&gt;&#xA;&lt;p&gt;進捗なし&lt;/p&gt;&#xA;&lt;h2 id=&#34;アルゴリズム&#34;&gt;アルゴリズム&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/oinume/algo/blob/master/src/datastructure/hash_table/open_addressing.go&#34;&gt;hash tableのオープンアドレス法の実装した&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Boyer Mooreの文字列検索のアルゴリズム学んだ&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;ブロックチェーン&#34;&gt;ブロックチェーン&lt;/h2&gt;&#xA;&lt;p&gt;進捗なし&lt;/p&gt;&#xA;&lt;h2 id=&#34;lekcijeの月額課金&#34;&gt;lekcijeの月額課金&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Stripeでsubscriptionの初月無料が簡単にできるということがわかった&lt;/li&gt;&#xA;&lt;li&gt;その他細々とした修正&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;プライベート&#34;&gt;プライベート&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;文章力を磨きたくて、&lt;a href=&#34;https://amzn.to/2tKOLQX&#34;&gt;新しい文章力の教室　苦手を得意に変えるナタリー式トレーニング&lt;/a&gt;という本を読んだ。むっちゃ参考になった。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;資産運用&#34;&gt;資産運用&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;WealthNaviとクラウドバンクの口座を作った&lt;/li&gt;&#xA;&lt;li&gt;Netflixの株を少し買った&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;7月に向けて&#34;&gt;7月に向けて&lt;/h2&gt;&#xA;&lt;p&gt;Kubernetesも勉強しないとなー... 何を優先で勉強するか悩ましい...&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>2018年5月の振り返り</title>
				<link>https://journal.lampetty.net/posts/review-2018-05/</link>
				<pubDate>Sat, 02 Jun 2018 19:30:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/review-2018-05/</guid>
				<description>&lt;h2 id=&#34;機械学習&#34;&gt;機械学習&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.udemy.com/kikagaku_blackbox_1/?deal_code=JPA8DEAL2PERCENTAGE&amp;amp;aEightID=s00000016735001&#34;&gt;Udemyのキカガクのコース&lt;/a&gt;は全部やり終わって、単回帰分析ならできそうな気がしてきた&lt;/p&gt;&#xA;&lt;h2 id=&#34;アルゴリズム&#34;&gt;アルゴリズム&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;hash のオープンアドレス法の実装やってない&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;ブロックチェーンnew&#34;&gt;ブロックチェーン(New)&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;やりたいな。とりあえず&lt;a href=&#34;https://www.udemy.com/ethereum-and-solidity-the-complete-developers-guide/?deal_code=JPA8DEAL2PERCENTAGE&amp;amp;aEightID=s00000016735001&#34;&gt;Udemyのこの講座&lt;/a&gt;に課金した&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;lekcijeの月額課金&#34;&gt;lekcijeの月額課金&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Stripeの機能はだいたい調べ終わって、ちょっとずつ実装しているところ。進捗10%&lt;/li&gt;&#xA;&lt;li&gt;関係ないけどGoogle Data Studioが便利だった。MySQLのデータもDataSourceに指定できる。&lt;/li&gt;&#xA;&lt;li&gt;Reactで実装しているページにLoadingが出るようにした。&lt;a href=&#34;https://github.com/derrickpelletier/react-loading-overlay/blob/master/__tests__/LoadingOverlay.test.js&#34;&gt;react-loading-overlay&lt;/a&gt;というやつを使ったんだけど楽ちんだった。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;プライベート&#34;&gt;プライベート&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Netflixの&lt;a href=&#34;https://www.netflix.com/jp/title/80122179&#34;&gt;ザ・キーパーズ&lt;/a&gt;観始めて面白すぎてはまった。&lt;/li&gt;&#xA;&lt;li&gt;楽天マガジンに課金した。月410円で雑誌読み放題の破壊力はすごい。本屋だと立ち読みできない女性誌とか見るのが楽しい。Twitter見るぐらいだったら雑誌読んでいた方が知識が増えてよい。&lt;/li&gt;&#xA;&lt;li&gt;昨年末に申請したe-Redisdencyカードをやっと受け取った。これは詳しくブログに書きたい。&lt;/li&gt;&#xA;&lt;li&gt;OculusGo買った。ホラー系のゲームが怖すぎてすごい。バイオとか出ないかな？&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;dropbox-paper&#34;&gt;Dropbox Paper&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;個人で開発しているサービスの仕様書やメモをwri.peからDropbox Paperに移行した&lt;/li&gt;&#xA;&lt;li&gt;Markdownで書けるのとGoogle docsより動作が軽快なのが好き&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;6月に向けて&#34;&gt;6月に向けて&lt;/h2&gt;&#xA;&lt;p&gt;イーサリアムやっていくぞ！&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Generating an unpredictable random value in Go</title>
				<link>https://journal.lampetty.net/posts/generating-an-unpredictable-random-value-in-go/</link>
				<pubDate>Mon, 14 May 2018 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/generating-an-unpredictable-random-value-in-go/</guid>
				<description>&lt;p&gt;There are a lot of examples to use &lt;a href=&#34;https://golang.org/pkg/math/rand/&#34;&gt;math/rand&lt;/a&gt;. However, should use &lt;a href=&#34;https://golang.org/pkg/crypto/rand/&#34;&gt;crypto/rand&lt;/a&gt; if you want to generate an unpredictable random value. That&#39;s because crypto/rand uses getrandom(2) if available, /dev/urandom otherwise on Linux.&lt;/p&gt;&#xA;&lt;p&gt;As a real world example, UUID v4 uses crypto/rand internally. &lt;a href=&#34;https://en.wikipedia.org/wiki/Universally_unique_identifier#Version_4_(random&#34;&gt;UUID v4&lt;/a&gt;) is randomly generated. An implementation of UUID v4 in Go uses &lt;code&gt;crypto/rand&lt;/code&gt; internally.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/google/uuid/blob/master/version4.go#L29-L38&#34;&gt;https://github.com/google/uuid/blob/master/version4.go#L29-L38&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/google/uuid/blob/master/uuid.go#L36&#34;&gt;https://github.com/google/uuid/blob/master/uuid.go#L36&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Here is an example to generate random values with crypto/rand.&lt;/p&gt;&#xA;&lt;h3 id=&#34;generate-random-integer&#34;&gt;Generate random integer&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;generateInt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;n&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;int64&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;int64&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;error&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;rand&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rand&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Reader&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;big&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;NewInt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;nil&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Int64&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(),&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;nil&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;generate-random-string&#34;&gt;Generate random string&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;generateString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;length&lt;/span&gt; &lt;span class=&#34;ne&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;error&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;b&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;make&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;([]&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;byte&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;length&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;rand&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Read&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;nil&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;base64&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;URLEncoding&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;EncodeToString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;nil&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;whole-source-code&#34;&gt;Whole source code&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;go&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;package&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;crypto/rand&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;encoding/base64&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;log&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;math/big&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;v&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;generateInt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1000&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nil&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Fatal&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Printf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;random int = %v\n&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;v&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;generateString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nil&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Fatal&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Printf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;random string = %v\n&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;generateInt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int64&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int64&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;error&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;rand&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;rand&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Reader&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;big&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;NewInt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nil&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Int64&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(),&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nil&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;generateString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;length&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;error&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;make&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;([]&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;byte&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;length&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;rand&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Read&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nil&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;base64&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;URLEncoding&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;EncodeToString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nil&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
			</item>
			<item>
				<title>課金している有料のMacアプリ</title>
				<link>https://journal.lampetty.net/posts/paid-mac-apps/</link>
				<pubDate>Wed, 02 May 2018 18:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/paid-mac-apps/</guid>
				<description>&lt;p&gt;自分的に &lt;code&gt;もうこれがないと生活できない&lt;/code&gt; というMacの有料アプリ集。&lt;/p&gt;&#xA;&lt;h2 id=&#34;alfred&#34;&gt;&lt;a href=&#34;https://www.alfredapp.com/&#34;&gt;Alfred&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;高機能なランチャー。£19。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;クリップボードのコピー＆ペースト&lt;/li&gt;&#xA;&lt;li&gt;Chromeのブックマークを検索して開く&lt;/li&gt;&#xA;&lt;li&gt;英和・和英辞書&lt;/li&gt;&#xA;&lt;li&gt;計算機&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;intellij-idea&#34;&gt;&lt;a href=&#34;https://www.jetbrains.com/idea/&#34;&gt;IntelliJ IDEA&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;コードを書く時はこれを使っている。IntelliJを本格的に使うまではEmacsやAtomで頑張っていたけど、デフォルトの設定がかなりイケていて補完も賢いので最近はこれしか使っていない。これ1つあればどんな言語のコードも書けるのも良い。&lt;/p&gt;&#xA;&lt;h2 id=&#34;1password&#34;&gt;&lt;a href=&#34;https://1password.com/&#34;&gt;1Password&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;年間契約の場合で $2.99 / month のサブスクリプション型。これがないとパスワード管理ができない。Chromeの拡張を入れて、Cmd + Ctrl + 1 のショートカットキーを割り当てている。&lt;/p&gt;&#xA;&lt;h2 id=&#34;charles&#34;&gt;&lt;a href=&#34;https://www.charlesproxy.com/&#34;&gt;Charles&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;デバッグ用のProxy。PCのブラウザやiOSアプリの通信内容を見る時に使う。$50。けっこう高い。&lt;/p&gt;&#xA;&lt;h2 id=&#34;eset&#34;&gt;&lt;a href=&#34;https://amzn.to/2JJ4NkF&#34;&gt;ESET&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;ウィルススキャン。Kasperskyより軽い気がするので気に入っている。2018年5月現在では2980円。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Comparing datetime in Golang</title>
				<link>https://journal.lampetty.net/posts/comparing-datetime-in-golang/</link>
				<pubDate>Wed, 02 May 2018 08:30:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/comparing-datetime-in-golang/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;https://play.golang.org/p/5-BtaE6iXaP&#34;&gt;https://play.golang.org/p/5-BtaE6iXaP&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;timebefore-and-timeafter&#34;&gt;time.Before and time.After&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;go&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;package&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;time&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;t1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;time&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Date&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2018&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;time&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;UTC&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;t2&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;time&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Date&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2018&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;11&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;time&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;UTC&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Printf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;t1.Before(t2) = %v\n&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;t1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Before&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;t2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// test &amp;#34;t2 - t1 &amp;gt; 0&amp;#34; --&amp;gt; true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Printf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;t2.Before(t1) = %v\n&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;t2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Before&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;t1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// test &amp;#34;t1 - t2 &amp;gt; 0&amp;#34; --&amp;gt; false&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Printf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;t2.After(t1) = %v\n&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;t2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;After&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;t1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;   &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// test &amp;#34;t1 - t2 &amp;lt; 0&amp;#34; --&amp;gt; true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Printf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;t1.After(t2) = %v\n&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;t1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;After&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;t2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;   &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// test &amp;#34;t2 - t1 &amp;lt; 0&amp;#34; --&amp;gt; false&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Printf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;t1.Equal(t1) = %v\n&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;t1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Equal&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;t1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Printf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;t1.Equal(t2) = %v\n&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;t1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Equal&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;t2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// false&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;timeequal&#34;&gt;time.Equal&lt;/h2&gt;&#xA;&lt;p&gt;You can use &lt;code&gt;time.Equal&lt;/code&gt; to compare the time objects are exactly same.&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>2018年1Qの振り返り</title>
				<link>https://journal.lampetty.net/posts/review-2018-q1/</link>
				<pubDate>Tue, 01 May 2018 18:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/review-2018-q1/</guid>
				<description>&lt;p&gt;2018年も早くも4ヶ月が過ぎてしまったので、1Qの振り返り。3ヶ月スパンの振り返りだと何をやったのか忘れてしまうので次からは1ヶ月単位で振り返ろう。&lt;/p&gt;&#xA;&lt;h2 id=&#34;その1-機械学習&#34;&gt;その1: 機械学習&lt;/h2&gt;&#xA;&lt;p&gt;&lt;code&gt;ゼロから作るDeep Learning&lt;/code&gt; を読むのはいったんペンディングにして、Udemyの &lt;code&gt;【キカガク流】人工知能・機械学習 脱ブラックボックス講座 - 初級編 -&lt;/code&gt; という講座をやっている。単回帰分析を中学生レベルの数学の知識で簡単に説明している講座で、中2レベルの数学知識しかない自分にとっては今のところ神講座。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.udemy.com/kikagaku_blackbox_1/?deal_code=JPA8DEAL2PERCENTAGE&amp;amp;aEightID=s00000016735001&#34;&gt;https://www.udemy.com/kikagaku_blackbox_1/?deal_code=JPA8DEAL2PERCENTAGE&amp;amp;aEightID=s00000016735001&lt;/a&gt;&lt;a href=&#34;https://www.udemy.com/kikagaku_blackbox_1/?deal_code=JPA8DEAL2PERCENTAGE&amp;amp;aEightID=s00000016735001&#34;&gt;www.udemy.com&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;今まで機械学習は3回も挫折したけど、これが一番わかりやすいし、「これならいけそう」という感覚がある。&lt;/p&gt;&#xA;&lt;h2 id=&#34;その2-lekcijeに月額課金の機能を入れる&#34;&gt;その2: lekcijeに月額課金の機能を入れる&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;月額課金の前に大事な機能のリリースをした&lt;/li&gt;&#xA;&lt;li&gt;Stripeを調べ始めていて、何をやればいいのかはわかったぐらい&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;という感じ。&lt;/p&gt;&#xA;&lt;h2 id=&#34;その他&#34;&gt;その他&lt;/h2&gt;&#xA;&lt;h3 id=&#34;その3-frontend&#34;&gt;その3: frontend&lt;/h3&gt;&#xA;&lt;p&gt;lekcijeのfrontend回りでやったこと。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;react + react-micro-container で簡単な設定画面は書けるようになった&lt;/li&gt;&#xA;&lt;li&gt;jest + enzyme で簡単なユニットテストを書いた&lt;/li&gt;&#xA;&lt;li&gt;lekcijeでbootstrap4を使うようにした&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;旅行&#34;&gt;旅行&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;1月にロスとサンフランシスコに行った&lt;/li&gt;&#xA;&lt;li&gt;3月に上海に行った&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;旅行については下書きもあるしまとめエントリーを書きたいのだけど時間が捻出できない。&lt;/p&gt;&#xA;&lt;h3 id=&#34;読書&#34;&gt;読書&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4862760856/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/41DjPqIHtWL._SL160_.jpg&#34; alt=&#34;イシューからはじめよ――知的生産の「シンプルな本質」&#34; loading=&#34;lazy&#34; title=&#34;イシューからはじめよ――知的生産の「シンプルな本質」&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4862760856/kazzhomeunixo-22/&#34;&gt;イシューからはじめよ――知的生産の「シンプルな本質」&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: 安宅和人&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: 英治出版&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2010/11/24&lt;/li&gt;&#xA;&lt;li&gt;メディア: 単行本（ソフトカバー）&lt;/li&gt;&#xA;&lt;li&gt;購入: 48人 クリック: 660回&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4862760856/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (145件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;読んだ。なんでもっと早く読まなかったのだろうという後悔しかない。&lt;/p&gt;&#xA;&lt;h3 id=&#34;todo管理をtrelloにした&#34;&gt;Todo管理をTrelloにした&lt;/h3&gt;&#xA;&lt;p&gt;今まではWunderlistを使っていたけど、MSに買収されてクローズするようなのでTrelloにしてみた。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;UIが慣れているものである(仕事で使っているものと近い)&lt;/li&gt;&#xA;&lt;li&gt;iPhoneアプリが使いやすくて良い&lt;/li&gt;&#xA;&lt;li&gt;自由にラベルがつけられる&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;のが良い。Wunderlilstの時は全然見なかったのに、Trelloにしてからほぼ毎日タスクを確認するようになった。あと、 &lt;code&gt;あとで読む&lt;/code&gt; 的なものもPocketではなくてTrelloに入れるようになった。&lt;/p&gt;&#xA;&lt;h3 id=&#34;kornのライブ行った&#34;&gt;KORNのライブ行った&lt;/h3&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://twitter.com/hashtag/KORN?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#KORN&lt;/a&gt; came to Japan! I was so happy to see them again! &lt;a href=&#34;https://t.co/0CGA9e3XPj&#34;&gt;pic.twitter.com/0CGA9e3XPj&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;— oinume (@oinume) &lt;a href=&#34;https://twitter.com/oinume/status/980083967276720128?ref_src=twsrc%5Etfw&#34;&gt;March 31, 2018&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;</description>
			</item>
			<item>
				<title>2018年4月の振り返り</title>
				<link>https://journal.lampetty.net/posts/review-2018-04/</link>
				<pubDate>Tue, 01 May 2018 18:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/review-2018-04/</guid>
				<description>&lt;h2 id=&#34;その1-機械学習&#34;&gt;その1. 機械学習&lt;/h2&gt;&#xA;&lt;p&gt;まだ &lt;code&gt;【キカガク流】人工知能・機械学習 脱ブラックボックス講座 - 初級編 -&lt;/code&gt; が終わっていない。3分の2ぐらい。5月中には終わらせたい。&lt;/p&gt;&#xA;&lt;h2 id=&#34;その2-lekcijeに月額課金&#34;&gt;その2. lekcijeに月額課金&lt;/h2&gt;&#xA;&lt;p&gt;手付かず。&lt;/p&gt;&#xA;&lt;h2 id=&#34;その他&#34;&gt;その他&lt;/h2&gt;&#xA;&lt;h3 id=&#34;hashtable&#34;&gt;Hashtable&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;だいぶ昔に実装したHashtableをGoで実装したやつがバグっていたので直した&lt;/li&gt;&#xA;&lt;li&gt;Hashtableをオープンアドレス法でも実装しないと&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;macのセットアップをansibleでやるようにした&#34;&gt;MacのセットアップをAnsibleでやるようにした&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/oinume/machine-setup&#34;&gt;GitHub - oinume/machine-setup&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;とりあえず土台だけはできたので、徐々に機能追加していく。&lt;/p&gt;&#xA;&lt;h3 id=&#34;自宅のmacをhigh-sierraにアップグレード&#34;&gt;自宅のMacをHigh Sierraにアップグレード&lt;/h3&gt;&#xA;&lt;p&gt;アップグレード後のトラブルもなく拍子抜けするぐらい簡単だった。プラシーボ効果なのか、すこし動作が快適になった気がする。&lt;/p&gt;&#xA;&lt;h3 id=&#34;読書&#34;&gt;読書&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4062884313/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/51xMlmrOFTL._SL160_.jpg&#34; alt=&#34;未来の年表 人口減少日本でこれから起きること (講談社現代新書)&#34; loading=&#34;lazy&#34; title=&#34;未来の年表 人口減少日本でこれから起きること (講談社現代新書)&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4062884313/kazzhomeunixo-22/&#34;&gt;未来の年表 人口減少日本でこれから起きること (講談社現代新書)&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: 河合雅司&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: 講談社&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2017/06/14&lt;/li&gt;&#xA;&lt;li&gt;メディア: 新書&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4062884313/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (23件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;日本は労働者人口減＋高齢者人口増という未曾有の問題に取り組まなくてはいけないのだなとあらためて認識。&lt;/p&gt;&#xA;&lt;h3 id=&#34;マイナンバーカード&#34;&gt;マイナンバーカード&lt;/h3&gt;&#xA;&lt;p&gt;作った。これで次の確定申告は電子署名でe-Taxで提出できるはず…！&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>grpc-gatewayでRESTful APIを実装する</title>
				<link>https://journal.lampetty.net/posts/implement-restful-api-with-grpc-gateway/</link>
				<pubDate>Mon, 26 Mar 2018 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/implement-restful-api-with-grpc-gateway/</guid>
				<description>&lt;h3 id=&#34;背景&#34;&gt;背景&lt;/h3&gt;&#xA;&lt;p&gt;何かしらの理由でRESTでAPIを実装しなくてはいけない時に、JSONを直接扱うのは面倒くさい。具体的には、JSONをデシリアライズして内部のデータ構造にマッピングする処理を書くのが面倒だ。というわけで、&lt;a href=&#34;https://github.com/grpc-ecosystem/grpc-gateway&#34;&gt;grpc-gateway&lt;/a&gt;を使ってProtocol Buffersを定義するだけでREST APIを実装できないかを検討してみた。&lt;/p&gt;&#xA;&lt;h3 id=&#34;grpcとは&#34;&gt;gRPCとは&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://grpc.io/&#34;&gt;gRPC&lt;/a&gt;はサービスの定義やリモートから呼び出されるメソッドの詳細な定義(引数や戻り値)をProtocol Buffers(以降Protobuf)を用いて定義する。つまりgRPCではProtobufがIDL(Interface Definition Language)として使われていて、&lt;code&gt;protoc&lt;/code&gt;というコマンドからProtobuf上のサービス・メソッド定義から各プログラミング言語のソースコードが生成できる。&lt;/p&gt;&#xA;&lt;h3 id=&#34;grpc-gatewayとは&#34;&gt;grpc-gatewayとは&lt;/h3&gt;&#xA;&lt;p&gt;grpc-gatewayは&lt;code&gt;protoc&lt;/code&gt;のプラグインとして実装されている。Protobufで定義されたサービスやメソッドの定義から、RESTful JSON APIをgRPCに変換するReverseProxyサーバーのソースコードを生成する。&lt;/p&gt;&#xA;&lt;p&gt;例えば、以下のような定義を.protoファイルに書いておくと、 &lt;code&gt;GET /users/{id}&lt;/code&gt; のRESTful APIのendpointを受け付けるサーバーのコードが生成される。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;service Users {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    rpc GetUser(GetUserRequest) returns (User) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        option (google.api.http) = {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            get: &amp;#34;/v1/users/{id}&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        };&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;message GetUserRequest {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    string id = 1;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;message User {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    string id = 1;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    string name = 2;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    string real_name = 3;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;protocol-buffersでapiを定義してみる&#34;&gt;Protocol BuffersでAPIを定義してみる&lt;/h3&gt;&#xA;&lt;p&gt;では実際にprotoファイルに以下のAPIを定義してみる。RESTのendpointやgRPCのメソッドの命名については&lt;a href=&#34;https://cloud.google.com/apis/design/standard_methods&#34;&gt;Googleが公開しているAPIのスタンダード&lt;/a&gt;に沿っている。これはかなり参考になるドキュメントなので一通り読んでおくと良いと思う。Googleが提供しているAPIの70%以上はこのスタンダードに沿っているらしい。&lt;/p&gt;&#xA;&lt;p&gt;API&lt;/p&gt;&#xA;&lt;p&gt;REST endpoint&lt;/p&gt;&#xA;&lt;p&gt;gRPC method&lt;/p&gt;&#xA;&lt;p&gt;ユーザーの一覧取得&lt;/p&gt;&#xA;&lt;p&gt;GET /v1/users&lt;/p&gt;&#xA;&lt;p&gt;ListUsers&lt;/p&gt;&#xA;&lt;p&gt;ユーザーの単体取得&lt;/p&gt;&#xA;&lt;p&gt;GET /v1/users/{id}&lt;/p&gt;&#xA;&lt;p&gt;GetUser&lt;/p&gt;&#xA;&lt;p&gt;ユーザーの作成&lt;/p&gt;&#xA;&lt;p&gt;POST /v1/users&lt;/p&gt;&#xA;&lt;p&gt;CreateUser&lt;/p&gt;&#xA;&lt;p&gt;ユーザーの更新&lt;/p&gt;&#xA;&lt;p&gt;PUT /v1/users/{id}&lt;/p&gt;&#xA;&lt;p&gt;UpdateUser&lt;/p&gt;&#xA;&lt;p&gt;ユーザーの削除&lt;/p&gt;&#xA;&lt;p&gt;DELETE /v1/users/{id}&lt;/p&gt;&#xA;&lt;p&gt;DeleteUser&lt;/p&gt;&#xA;&lt;p&gt;サンプルのProtobufファイル users.proto&lt;/p&gt;&#xA;&lt;h3 id=&#34;protocコマンドでgoのコードを生成&#34;&gt;protocコマンドでgoのコードを生成&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/oinume/grpc-sample&#34;&gt;https://github.com/oinume/grpc-sample&lt;/a&gt; のリポジトリを &lt;code&gt;$GOPATH/src/github.com/oinume&lt;/code&gt; 配下にcloneすることで、makeとgoがインストールされていば以下のコマンドで.protoファイルからgoのソースが生成できる。(ソースは proto-gen ディレクトリに生成される)&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ make setup&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ make proto/go&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;grpc-gatewayのサーバーを起動&#34;&gt;grpc-gatewayのサーバーを起動&lt;/h3&gt;&#xA;&lt;p&gt;最後に、サーバーの実装をビルドしてgrpc-gatewayのサーバーを起動してみよう。&lt;/p&gt;&#xA;&lt;p&gt;ビルド&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ make&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;go build -o bin/grpc-sample github.com/oinume/grpc-sample/cmd&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;サーバーの起動&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ ./bin/grpc-sample&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Listening on 5000&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Starting gRPC server on 5001&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;5000番ポートでHTTPをLISTENする。バックエンドのgRPCサーバーは5001番ポートでLISTEN。&lt;/p&gt;&#xA;&lt;h3 id=&#34;curlでrest-apiを呼び出す&#34;&gt;curlでREST APIを呼び出す&lt;/h3&gt;&#xA;&lt;p&gt;サーバーを立ち上げたら実際に&lt;code&gt;curl&lt;/code&gt;コマンドでREST APIのendpointにAPIリクエストを投げてみよう。例えば、新しいユーザーを作成するAPIは以下のコマンドを実行する。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ curl -v -X POST -d &amp;#39;{&amp;#34;name&amp;#34;: &amp;#34;oinume&amp;#34;, &amp;#34;real_name&amp;#34;: &amp;#34;kazuhiro oinuma&amp;#34;}&amp;#39; http://localhost:5000/v1/users | jq .&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &amp;#34;id&amp;#34;: &amp;#34;12345&amp;#34;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &amp;#34;name&amp;#34;: &amp;#34;oinume&amp;#34;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &amp;#34;real_name&amp;#34;: &amp;#34;kazuhiro oinuma&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&#34;https://github.com/oinume/grpc-sample#call-api-with-curl&#34;&gt;README&lt;/a&gt;に各APIのcurlでの呼び出し方法も書いてあるので参考にして欲しい。ちなみにサーバーの実装はただのモックなので、実際にどこかのDBにデータができるということはない。&lt;/p&gt;&#xA;&lt;h3 id=&#34;サーバーの実装&#34;&gt;サーバーの実装&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/oinume/grpc-sample/blob/master/server/server.go&#34;&gt;https://github.com/oinume/grpc-sample/blob/master/server/server.go&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;これが今回のAPIサーバーのgRPCでの実装部分なのだが、あくまで生成されたgRPCのinterfaceを満たすようにGoのメソッドを定義すれば良い。メソッドの引数であるリクエストと戻り値のレスポンスのデータはProtobufで定義されたものがGoの構造体になっているので、そのまま使えば良い。&lt;/p&gt;&#xA;&lt;p&gt;あとは、以下のようにgrpc-gatewayのためのおまじない的なコードを少し書くだけでRESTful API serverが出来上がる。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/oinume/grpc-sample/blob/master/cmd/main.go#L64-L73&#34;&gt;https://github.com/oinume/grpc-sample/blob/master/cmd/main.go#L64-L73&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;まとめ&#34;&gt;まとめ&lt;/h3&gt;&#xA;&lt;p&gt;このようにgrpc-gatewayを使うことで、RESTful APIを定義する上で手間だったJSONの変換部分を手で書く必要がなくなった。たくさんのAPIを実装するプロジェクトでは、ProtobufでAPI定義を書く必要が発生するとはいえ、手作業でJSON&amp;lt;-&amp;gt;structの変換処理を書かなくて済むことが大きなメリットになるはずなので、興味がある人はぜひ試してみて欲しい。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Google Apps Scriptで外部のREST APIを呼び出す</title>
				<link>https://journal.lampetty.net/posts/call-external-api-in-gas/</link>
				<pubDate>Wed, 28 Feb 2018 19:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/call-external-api-in-gas/</guid>
				<description>&lt;p&gt;Google Apps Script(GAS)から外部のREST APIを呼ぶには、&lt;a href=&#34;https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app&#34;&gt;UrlFetchApp.fetch&lt;/a&gt; というメソッドを呼び出せば良い。例えばJSONをリクエストのペイロードとして送る場合のサンプルコードはこんな感じ。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s1&#34;&gt;&amp;#39;email&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;email&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s1&#34;&gt;&amp;#39;subject&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;subject&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s1&#34;&gt;&amp;#39;message&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;message&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;credential&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PropertiesService&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;getScriptProperties&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;getProperty&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;FRESHDESK_CREDENTIAL&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;options&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s1&#34;&gt;&amp;#39;method&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;post&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s1&#34;&gt;&amp;#39;contentType&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;application/json&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s1&#34;&gt;&amp;#39;headers&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;s1&#34;&gt;&amp;#39;Authorization&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;Bearer &amp;#39;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Utilities&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;base64Encode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;ne&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;credential&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s1&#34;&gt;&amp;#39;payload&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JSON&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stringify&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;response&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;UrlFetchApp&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fetch&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;&amp;lt;api endpoint&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;options&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;fetchの第2引数に渡すoptions に以下のフィールドをセットしている。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;method: HTTP method&lt;/li&gt;&#xA;&lt;li&gt;contentType: &lt;code&gt;application/json&lt;/code&gt; を指定&lt;/li&gt;&#xA;&lt;li&gt;headers.Authorization でAPIのトークンを指定&#xA;&lt;ul&gt;&#xA;&lt;li&gt;ベーシック認証もできる&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;payload: リクエストのペイロードをJSONにしておく&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;また、上のコードのAPIのキーである &lt;code&gt;credential&lt;/code&gt; はスクリプトのプロパティから値を取得している。ログインIDやパスワードなどをスクリプトの中に埋め込みたくない場合は環境変数みたいな感じで使えるスクリプトのプロパティを使うのが良いみたい(&lt;a href=&#34;https://developers.google.com/apps-script/guides/properties&#34;&gt;ソース&lt;/a&gt;)。&lt;/p&gt;&#xA;&lt;p&gt;ハマったポイントとして、外部のAPIを呼び出す場合は、scopeに &lt;code&gt;https://www.googleapis.com/auth/script.external_request&lt;/code&gt; がないと権限がないというエラーになるので注意。ファイル→プロジェクトのプロパティ→スコープ のタブで確認できる。スクリプトに対するスコープを再設定したい場合は、GUIだとプロジェクトを作り直してコードをコピペするしかなさそうな雰囲気。&lt;/p&gt;&#xA;&lt;p&gt;自分は、Googleフォームで受けた問い合わせをFreshDeskというSaaSのシステムにAPIで投げて問い合わせを管理するということがやりたかったので、頑張ってスクリプトを書いた。これでGoogleフォームのインタフェースを使いつつ、バックエンドはちゃんとしたシステムで問い合わせを管理するということができるようになりましたとさ。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B072Q1JFHN/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/51Lx2RdvXHL._SL160_.jpg&#34; alt=&#34;仕事で使える！Google Apps Script (仕事で使える！シリーズ（NextPublishing）)&#34; loading=&#34;lazy&#34; title=&#34;仕事で使える！Google Apps Script (仕事で使える！シリーズ（NextPublishing）)&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B072Q1JFHN/kazzhomeunixo-22/&#34;&gt;仕事で使える！Google Apps Script (仕事で使える！シリーズ（NextPublishing）)&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: 増岡千智&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: インプレスR&amp;amp;D&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2017/06/09&lt;/li&gt;&#xA;&lt;li&gt;メディア: Kindle版&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/B072Q1JFHN/kazzhomeunixo-22&#34;&gt;この商品を含むブログを見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>Google Driveの画像をブログに埋め込む</title>
				<link>https://journal.lampetty.net/posts/embed-images-on-google-drive/</link>
				<pubDate>Fri, 23 Feb 2018 19:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/embed-images-on-google-drive/</guid>
				<description>&lt;p&gt;いっっっつもやり方を忘れるので未来の自分のためにメモ。&lt;/p&gt;&#xA;&lt;p&gt;1.Google Driveで対象の画像ファイルを選択して開く&lt;/p&gt;&#xA;&lt;p&gt;2.画像が表示されるので、右上のメニュー(縦の...のアイコン)から &lt;code&gt;新しいウィンドウで開く&lt;/code&gt; をクリックする。&lt;/p&gt;&#xA;&lt;p&gt;3.開いたウィンドウの右上のメニューから &lt;code&gt;アイテムを埋め込む&lt;/code&gt; をクリックすると &lt;code&gt;iframe&lt;/code&gt; のHTMLコードが表示されるので、それをコピーしてブログに貼り付ける。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B00YTHNEP8/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/51B8S3N%2BnfL._SL160_.jpg&#34; alt=&#34;仕事で使える！Googleドライブ　クラウドストレージ徹底活用術 (仕事で使える！シリーズ（NextPublishing）)&#34; loading=&#34;lazy&#34; title=&#34;仕事で使える！Googleドライブ　クラウドストレージ徹底活用術 (仕事で使える！シリーズ（NextPublishing）)&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B00YTHNEP8/kazzhomeunixo-22/&#34;&gt;仕事で使える！Googleドライブ　クラウドストレージ徹底活用術 (仕事で使える！シリーズ（NextPublishing）)&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: 佐藤芳樹&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: インプレスR&amp;amp;D&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2015/06/12&lt;/li&gt;&#xA;&lt;li&gt;メディア: Kindle版&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/B00YTHNEP8/kazzhomeunixo-22&#34;&gt;この商品を含むブログを見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>Googleフォームでメールアドレスを収集する場合にそのメールアドレスをGASから取得する</title>
				<link>https://journal.lampetty.net/posts/obtain-google-form-email-from-gas/</link>
				<pubDate>Thu, 22 Feb 2018 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/obtain-google-form-email-from-gas/</guid>
				<description>&lt;p&gt;ググってもあまり出てこなかったのでメモ。Googleフォームで &lt;code&gt;メールアドレスを収集する&lt;/code&gt; という設定をONにすると、フォームの回答を記録するSpreadsheetにメールアドレスが保存されるようになる。&lt;/p&gt;&#xA;&lt;p&gt;これをGASのスクリプトからどうやって取るんだろうと思って調べてみたら、&lt;a href=&#34;https://developers.google.com/apps-script/reference/forms/form-response#getRespondentEmail%28%29&#34;&gt;e.response.getRespondentEmail()&lt;/a&gt;というメソッドを呼ぶと取れるということがわかった。&lt;/p&gt;&#xA;&lt;p&gt;試しにやってみたら見事にメールアドレスが取れた...! これでメアドを取るために独自のフィールドを足さなくて済む！&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>HerokuのName lookup timeoutが短すぎて困ってる話</title>
				<link>https://journal.lampetty.net/posts/heroku-name-lookup-timeout-is-too-short/</link>
				<pubDate>Fri, 16 Feb 2018 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/heroku-name-lookup-timeout-is-too-short/</guid>
				<description>&lt;p&gt;最近HerokuのDynoで以下のようなエラーが出るようになった。アプリケーションから接続するMySQLのホスト名の解決が失敗しているっぽい。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Jan 18 08:20:25 ***** app/web.1:  {&amp;#34;level&amp;#34;:&amp;#34;error&amp;#34;,&amp;#34;ts&amp;#34;:&amp;#34;2018-01-17T23:20:24Z&amp;#34;,&amp;#34;msg&amp;#34;:&amp;#34;InternalServerError&amp;#34;,&amp;#34;error&amp;#34;:&amp;#34;errors.Internal: Failed to gorm.Open(): dial tcp: lookup ******** on 172.16.0.23:53: write udp 172.18.167.70:36855-&amp;gt;172.16.0.23:53: i/o timeout&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;なんで？って思って /etc/resolv.conf を見てみたら&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ cat /etc/resolv.conf&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;options timeout:2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nameserver 172.16.0.23&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;search ec2.internal&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;↑のように timeout が2秒に設定されていた... 妥当な値かもしれないけど、ログにエラーが残るのが嫌だったのでIP直指定することで対応した... なんかいい方法ないかな。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>webpackで&lt;script&gt;タグでロードしたライブラリをbundleされたJSから外したい</title>
				<link>https://journal.lampetty.net/posts/webpack-config-externals/</link>
				<pubDate>Fri, 16 Feb 2018 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/webpack-config-externals/</guid>
				<description>&lt;p&gt;webpackのconfigには &lt;code&gt;externals&lt;/code&gt; というものがある(&lt;a href=&#34;https://webpack.js.org/configuration/externals/&#34;&gt;ドキュメント&lt;/a&gt;)。このexternalsで定義したライブラリは、importで参照していてもwebpackでビルドして生成される成果物(bundle.js)には含まれなくなるというもの。&lt;/p&gt;&#xA;&lt;h3 id=&#34;自分のユースケース&#34;&gt;自分のユースケース&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;もともとReactを使っていないプロジェクトで一部のページだけでReactを使っていきたい&lt;/li&gt;&#xA;&lt;li&gt;全ページでReactを使うわけではないので、bundle.js には含めたくない(サイズ削減)&lt;/li&gt;&#xA;&lt;li&gt;Reactが必要なページのみHTML上の &lt;script&gt; タグでロード&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;webpackconfigjs&#34;&gt;webpack.config.js&lt;/h3&gt;&#xA;&lt;p&gt;externalsでreactを除外するよ、ということを定義すれば bundle.js には含まれないようになる。webpackの設定ファイルはこんな感じ。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;config&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;externals&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s1&#34;&gt;&amp;#39;react&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;React&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s1&#34;&gt;&amp;#39;react-dom&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;ReactDOM&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;o&#34;&gt;...&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;module&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;exports&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;config&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
			</item>
			<item>
				<title>Loop over dates with bash in Linux</title>
				<link>https://journal.lampetty.net/posts/loop-over-dates-with-bash-in-linux/</link>
				<pubDate>Fri, 05 Jan 2018 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/loop-over-dates-with-bash-in-linux/</guid>
				<description>&lt;p&gt;Here is an example of looping over dates from 2017-10-22 to 2017-12-31.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#!/bin/bash&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;START&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;2017-10-22&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;END&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;2017-12-31&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;CURRENT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$START&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;while&lt;/span&gt; true&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;do&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$CURRENT&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$CURRENT&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$END&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;then&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;break&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;fi&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;CURRENT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;date -d &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$CURRENT&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt; 1day&amp;#34;&lt;/span&gt; +%Y-%m-%d&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;done&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;note&#34;&gt;NOTE&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;date -d &amp;quot;2017-12-01 1day&amp;quot;&lt;/code&gt; returns a next day of 2017-12-01&lt;/li&gt;&#xA;&lt;li&gt;+%Y-%m-%d is a format&lt;/li&gt;&#xA;&lt;li&gt;See more options in &lt;a href=&#34;http://www.gnu.org/software/coreutils/manual/html_node/date-invocation.html&#34;&gt;GNU Coreutils: date invocation&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B072JD718H/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/51kz0s-isdL._SL160_.jpg&#34; alt=&#34;Linux: Linux For Beginners Guide To Learn Linux Command Line, Linux Operating System And Linux Commands (English Edition)&#34; loading=&#34;lazy&#34; title=&#34;Linux: Linux For Beginners Guide To Learn Linux Command Line, Linux Operating System And Linux Commands (English Edition)&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B072JD718H/kazzhomeunixo-22/&#34;&gt;Linux: Linux For Beginners Guide To Learn Linux Command Line, Linux Operating System And Linux Commands (English Edition)&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: Josh Thompsons&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2017/05/26&lt;/li&gt;&#xA;&lt;li&gt;メディア: Kindle版&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/B072JD718H/kazzhomeunixo-22&#34;&gt;この商品を含むブログを見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>2018年の抱負</title>
				<link>https://journal.lampetty.net/posts/resolution-in-2018/</link>
				<pubDate>Thu, 04 Jan 2018 19:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/resolution-in-2018/</guid>
				<description>&lt;p&gt;あけましておめでとうございます。まだ1枚も年賀状の返信出してないです。今年も例によって新年の抱負。&lt;/p&gt;&#xA;&lt;h2 id=&#34;過去の振り返り&#34;&gt;過去の振り返り&lt;/h2&gt;&#xA;&lt;p&gt;新年の抱負をかかげても達成できないことが多いので&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;目標を２つに絞る&lt;/li&gt;&#xA;&lt;li&gt;3ヶ月ごとに必ず振り返りをする&lt;/li&gt;&#xA;&lt;li&gt;目標達成のためのマイルストーンを細かく設定する&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;ことを今年は心がけようと思う。&lt;/p&gt;&#xA;&lt;h2 id=&#34;その1-機械学習&#34;&gt;その1: 機械学習&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;ゼロから作るDeep Learning&lt;/code&gt; を読む&lt;/li&gt;&#xA;&lt;li&gt;必要な数学(線形代数)を学ぶ&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4873117585/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/512ru2i5gyL._SL160_.jpg&#34; alt=&#34;ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装&#34; loading=&#34;lazy&#34; title=&#34;ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4873117585/kazzhomeunixo-22/&#34;&gt;ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: 斎藤康毅&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: オライリージャパン&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2016/09/24&lt;/li&gt;&#xA;&lt;li&gt;メディア: 単行本（ソフトカバー）&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4873117585/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (18件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;その2-lekcijeで月額課金を導入する&#34;&gt;その2: lekcijeで月額課金を導入する&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.lekcije.com/&#34;&gt;lekcije&lt;/a&gt;も1年以上運営してきて&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;SendGridが無料プランの枠を超えた(つらい)&lt;/li&gt;&#xA;&lt;li&gt;Papertrailも無料プランの枠を超えた(つらい)&lt;/li&gt;&#xA;&lt;li&gt;MySQLはVPSに置かないと無理なデータ量になってきた(つらい)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;という状態に成長してきたので、そろそろ月額課金を考えてもいいかなと思っている。今見ている限り、JCBは使えないけどStripeが一番簡単に導入できそうなのでこれを使う予定。&lt;/p&gt;&#xA;&lt;h2 id=&#34;頑張らないこと&#34;&gt;頑張らないこと&lt;/h2&gt;&#xA;&lt;h3 id=&#34;英語&#34;&gt;英語&lt;/h3&gt;&#xA;&lt;p&gt;去年はTOEIC 800点を目指していたけど、なかなかここに到達するには意識的に勉強時間を増やすか英語を使う頻度を増やすしかないけど、あまりやる気がわかないので今年は現状維持ぐらいにしておく。&lt;/p&gt;&#xA;&lt;h3 id=&#34;kubernetesとかインフラ回り&#34;&gt;Kubernetesとかインフラ回り&lt;/h3&gt;&#xA;&lt;p&gt;個人的にはもうHerokuやGAEでいいじゃんって思っている人間なので、この辺の技術は最低限にしてあまり追求しないことにする。そもそもこういう技術は大きい組織・サービスでしか必要のない技術だと思っている。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>2017年の振り返り</title>
				<link>https://journal.lampetty.net/posts/review-of-2017/</link>
				<pubDate>Mon, 01 Jan 2018 23:36:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/review-of-2017/</guid>
				<description>&lt;p&gt;あけましておめでとうございます。大晦日は2017年の振り返りをせずに息子の寝かしつけで寝落ちするという体たらくだったので2017年の振り返りをさせてください。&lt;/p&gt;&#xA;&lt;h2 id=&#34;仕事&#34;&gt;仕事&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;メルカリに新しい決済手段を追加するというプロジェクトに入り、4月からついにPHPを書き始めた。PHPはいまだに好きになれないけど、このプロジェクト自体はとてもやり甲斐があってワクワクするものだったので楽しかった。PHPあまり好きじゃないけど、メルカリはPHPがまだまだ多いので、このタイミングでPHPをある程度書けるようになったのは苦手意識を払拭するという意味でも良かった気がする。&lt;/li&gt;&#xA;&lt;li&gt;9月からはデスマなプロジェクトで会社へのヘイトがそれなりに溜まった。ただし、このプロジェクトを経験する事で40代以降の人生をどうするかを考えるいい機会になった。&lt;/li&gt;&#xA;&lt;li&gt;12月には会社の制度を利用させてもらってエストニアに出張に行くという機会を得た。この出張のおかげで少しはデスマによるヘイトが減った&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;年初の抱負に対する実績&#34;&gt;&lt;a href=&#34;http://oinume.hatenablog.com/entry/resolution-in-2017&#34;&gt;年初の抱負&lt;/a&gt;に対する実績&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;機械学習はUdemyで少し勉強した以外はほとんど身についてない&lt;/li&gt;&#xA;&lt;li&gt;アルゴリズムの勉強：進捗ほぼゼロ&lt;/li&gt;&#xA;&lt;li&gt;英語：TOEIC 745点あたりで伸び悩んでる。正直これ以上はモチベーションがわかないというか、英語学習に割ける時間があるならプログラミングのレベル上げたい&lt;/li&gt;&#xA;&lt;li&gt;VPSをやめる：Vultrのアフィリエイトで得たクレジットがまだ残っているのでまだ残ってしまっている&lt;/li&gt;&#xA;&lt;li&gt;去年より本を読む：別エントリでまとめたいけど、2016年よりかはたくさん読んだと思う！&lt;/li&gt;&#xA;&lt;li&gt;Twitterの時間を制限する：6月ぐらいまでは制限できてたけど、最近は復活気味... Twitterをやめるには強い意思が必要だということがわかった&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;プライベート&#34;&gt;プライベート&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://oinume.hatenablog.com/entry/good-products-in-2017&#34;&gt;2017年に買って良かったモノ・サービス - oinume journal&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;家族でハワイに行った。息子氏が帰る前日に「おウチに帰りたくないー」と言っていたのでまた行きたい。&lt;/li&gt;&#xA;&lt;li&gt;高校数学をやり直していて、高1の教科書がやっと3分の1ぐらい終わった。先は長い... もともと数学は苦手だったのだけど、高校生のときより論理思考力は上がっているので理解力は高まっている。あと、数学の問題の日本語は解釈が難しくて、数学力＝日本語力なんじゃないかという気がしている。&lt;/li&gt;&#xA;&lt;li&gt;自分が運営している &lt;a href=&#34;https://www.lekcije.com/&#34;&gt;lekcije&lt;/a&gt; でReactをちゃんと使い始めた。慣れるといいものだと思えるようになった。&#xA;&lt;ul&gt;&#xA;&lt;li&gt;あとgRPC + gRPC gatewayも使い始めた&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;サマソニとMuseのライブに行った&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;全体的に&#34;&gt;全体的に&lt;/h2&gt;&#xA;&lt;p&gt;2017年は体調を大きく崩すこともなく、ある程度やりたいこともやれていたので良かった。ちきりん氏の本を食わず嫌いで読んでなかったのだけど、「自分の時間を取り戻そう」という本を読んで、(ブログは全部読んでしまうぐらいの)ファンになってしまった。この人の本を読んでから他人の意見を参考にするのではなく、まずは自分の頭で考える癖がついたのが良い。正直2017年で一番の収穫だった気がする。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4478101558/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/51v9aj58I1L._SL160_.jpg&#34; alt=&#34;自分の時間を取り戻そう―――ゆとりも成功も手に入れられるたった1つの考え方&#34; loading=&#34;lazy&#34; title=&#34;自分の時間を取り戻そう―――ゆとりも成功も手に入れられるたった1つの考え方&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4478101558/kazzhomeunixo-22/&#34;&gt;自分の時間を取り戻そう―――ゆとりも成功も手に入れられるたった1つの考え方&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: ちきりん&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: ダイヤモンド社&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2016/11/26&lt;/li&gt;&#xA;&lt;li&gt;メディア: 単行本（ソフトカバー）&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4478101558/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (3件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>2017年に買って良かったモノ・サービス</title>
				<link>https://journal.lampetty.net/posts/good-products-in-2017/</link>
				<pubDate>Sun, 31 Dec 2017 18:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/good-products-in-2017/</guid>
				<description>&lt;h3 id=&#34;line-pay&#34;&gt;&lt;a href=&#34;https://line.me/ja/pay&#34;&gt;LINE Pay&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;買ったモノじゃないけど、LINE Payをちゃんと使い始めた。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;ポイントが2%つく。これはかなり太っ腹だと思う&lt;/li&gt;&#xA;&lt;li&gt;決済するとすぐにLINEに通知が来る。自分はPebbleに通知を送っているので、いくら使ったのかがすぐわかってこれが地味にありがたい&lt;/li&gt;&#xA;&lt;li&gt;オートチャージ的な機能が便利&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;というのが良い点。これがJCBじゃなくてVISAだったら最高だけど、日本だったらだいたいどの店でもJCB使えるのでそれほど困っていない。LINE Payカードのおかげでほぼ現金を使わなくなった。微妙な点としては&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;PINコードでの認証ができない(手書きのサイン)。コンビニとかではサイン求められないけど、この時代にサインはないわ...&lt;/li&gt;&#xA;&lt;li&gt;明細がLINEでしか見れない。MoneyForwardとかでは見れるけど会社の経費精算する時にこれでいいのか感が否めない&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;あたりかな。&lt;/p&gt;&#xA;&lt;h3 id=&#34;マキタのコードレス掃除機&#34;&gt;マキタのコードレス掃除機&lt;/h3&gt;&#xA;&lt;p&gt;「ちょっと部屋が汚れてるなー」という、わざわざルンバを起動するレベルじゃない時にすごく便利。ウチは子供の食べこぼしがひどいので、食事の後にさらっとこれで掃除している。コードレスなので、クイックルワイパーをかける感覚で掃除機かけられるのが良い。バッテリーは20分しかもたいないけど、1回あたり5分ぐらいしか使わないので意外と困らない。気軽に掃除機かけられるので、一人暮らしの人にもオススメ。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B010OPY1NM/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/315qOqOhDXL._SL160_.jpg&#34; alt=&#34;マキタ 充電式クリーナ 10.8V (バッテリー内蔵・充電器付) アイボリー CL105DWI&#34; loading=&#34;lazy&#34; title=&#34;マキタ 充電式クリーナ 10.8V (バッテリー内蔵・充電器付) アイボリー CL105DWI&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B010OPY1NM/kazzhomeunixo-22/&#34;&gt;マキタ 充電式クリーナ 10.8V (バッテリー内蔵・充電器付) アイボリー CL105DWI&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;出版社/メーカー: マキタ&lt;/li&gt;&#xA;&lt;li&gt;メディア: Tools &amp;amp; Hardware&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/B010OPY1NM/kazzhomeunixo-22&#34;&gt;この商品を含むブログを見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;withingsの体重計&#34;&gt;Withingsの体重計&lt;/h3&gt;&#xA;&lt;p&gt;測った体重をスマホのアプリでグラフで見れる。ちゃんと毎日この体重計に乗ることでダイエットのモチベーションになると思う。計測大事。Nokiaに買収されてしまったのが微妙だけど、プロダクト自体は良い。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B00V35HEIC/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/31Mu7bSxI1L._SL160_.jpg&#34; alt=&#34;Withings スマート体重計 Smart Body Analyzer WS-50 ホワイト Wi-Fi/Bluetooth対応【日本正規代理店品】&#34; loading=&#34;lazy&#34; title=&#34;Withings スマート体重計 Smart Body Analyzer WS-50 ホワイト Wi-Fi/Bluetooth対応【日本正規代理店品】&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B00V35HEIC/kazzhomeunixo-22/&#34;&gt;Withings スマート体重計 Smart Body Analyzer WS-50 ホワイト Wi-Fi/Bluetooth対応【日本正規代理店品】&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;出版社/メーカー: Withings&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2015/04/16&lt;/li&gt;&#xA;&lt;li&gt;メディア: エレクトロニクス&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/B00V35HEIC/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (1件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>Handling uploaded files in Go</title>
				<link>https://journal.lampetty.net/posts/handling-uploaded-files-in-go/</link>
				<pubDate>Tue, 19 Dec 2017 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/handling-uploaded-files-in-go/</guid>
				<description>&lt;p&gt;Handling uploaded files in Go is quite easy. Here is a complete example.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://golang.org/pkg/net/http/#Request.ParseMultipartForm&#34;&gt;net/http.Request.ParseMultipartForm&lt;/a&gt; parses a request body as multipart/form-data. You can get files with &lt;code&gt;net/http.Request.FormFile&lt;/code&gt; after calling the method&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://golang.org/pkg/net/http/#Request.FormFile&#34;&gt;net/http.Request.FormFile&lt;/a&gt; returns &lt;a href=&#34;https://golang.org/pkg/mime/multipart/#File&#34;&gt;mime/multipart.File&lt;/a&gt; and &lt;a href=&#34;https://golang.org/pkg/mime/multipart/#FileHeader&#34;&gt;mime/multipart.FileHeader&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;li&gt;You can read a content from mime/multipart.File&lt;/li&gt;&#xA;&lt;li&gt;You can get a file name from mime/multipart.FileHeader&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B0184N7WWS/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/510Qib-dSCL._SL160_.jpg&#34; alt=&#34;The Go Programming Language (Addison-Wesley Professional Computing Series)&#34; loading=&#34;lazy&#34; title=&#34;The Go Programming Language (Addison-Wesley Professional Computing Series)&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B0184N7WWS/kazzhomeunixo-22/&#34;&gt;The Go Programming Language (Addison-Wesley Professional Computing Series)&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: Alan A. A. Donovan,Brian W. Kernighan&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: Addison-Wesley Professional&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2015/11/16&lt;/li&gt;&#xA;&lt;li&gt;メディア: Kindle版&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/B0184N7WWS/kazzhomeunixo-22&#34;&gt;この商品を含むブログを見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>エストニアに行く前準備</title>
				<link>https://journal.lampetty.net/posts/preparation-for-estonia/</link>
				<pubDate>Sun, 10 Dec 2017 10:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/preparation-for-estonia/</guid>
				<description>&lt;p&gt;今日からエストニアに6日間出張に行くのでその前準備に何をやったかをメモしておく。&lt;/p&gt;&#xA;&lt;h3 id=&#34;エストニア出張の目的&#34;&gt;エストニア出張の目的&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;ちゃんとしたマイナンバーがある&lt;/li&gt;&#xA;&lt;li&gt;選挙の投票や、学校の授業の成績管理などが電子化されている&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.jeeadis.jp/jeeadis-blog/e-residencyid&#34;&gt;e-Residency&lt;/a&gt;なにそれかっこいい&lt;/li&gt;&#xA;&lt;li&gt;スタートアップ界隈が熱い&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;というのを見てみたくて行く感じ。特にスタートアップシーンはTransferWiseやPipedriveという会社は日本にも支社があるぐらい成功しているらしい。エストニアは人口が130万人と少ないので、国内である程度うまくいったらヨーロッパやアメリカに事業を展開するというモデルらしい。&lt;/p&gt;&#xA;&lt;h3 id=&#34;エストニアの概要&#34;&gt;エストニアの概要&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;人口は130万人(参考：福岡の人口が160万)&lt;/li&gt;&#xA;&lt;li&gt;主要産業は製造業、卸売・小売、不動産、運輸、建設等。製造業は、主に機械、木材、製紙、家具、食品、金属、化学等が中心。エネルギー資源関連では、オイルシェールを産出、主として発電に利用している。IT等のイノベーション産業の誘致・育成を積極的に進めている。&lt;/li&gt;&#xA;&lt;li&gt;首都のタリンの旧市街は世界遺産になっている&lt;/li&gt;&#xA;&lt;li&gt;英語が通じる&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://english.cheerup.jp/article/400&#34;&gt;日本人の英語力は世界で何番目？ 英語教育の最前線（前編）&lt;/a&gt; によるとエストニアは第4位&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;観光地はクレジットカード(デビットカード)の決済がメイン。中国みたいにQRコード決済はない&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;航空券&#34;&gt;航空券&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;アエロフロートだと1人10万円以下で行ける。ただし、行き14時間、帰り18時間ぐらいかかる&lt;/li&gt;&#xA;&lt;li&gt;FINAIRだと10万ちょいかかるけど、行きも帰りも12時間&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;あたりが狙い目。&lt;/p&gt;&#xA;&lt;h3 id=&#34;宿&#34;&gt;宿&lt;/h3&gt;&#xA;&lt;p&gt;エストニアは宿泊費用が安い。ホテルも1泊5千円ぐらいあればそこそこのに泊まれそう。自分たちは今回はAirBnBにしたけど、4人それぞれの寝室がついていて1泊2万円ぐらい。タリン周辺にはAirBnBの部屋はたくさんあるけど、1週間前を切ると急に埋まりだすので余裕をもって2週間前までには予約しておくと良さそう。&lt;/p&gt;&#xA;&lt;p&gt;今回泊まるのは↓の部屋。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.airbnb.jp/rooms/12164741&#34;&gt;www.airbnb.jp&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;申し込んだ現地のツアー&#34;&gt;申し込んだ現地のツアー&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.likealocalguide.com/tallinn/tours/explore-the-startup-scene-in-tallinn&#34;&gt;www.likealocalguide.com&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;これが良さそうだったので申し込んでみた。日本語でのガイドも可能なのとPipedriveのオフィスも訪問できる。値段も30ユーロで良心的。ちなみにこのLike a Local Guide というサイトには他の観光ツアーもいろいろあるのでオススメ。&lt;/p&gt;&#xA;&lt;h3 id=&#34;simとwifi&#34;&gt;SIMとWiFi&lt;/h3&gt;&#xA;&lt;p&gt;現地で買えば良さそう。3GBで30日間使えるSIMが3.99ユーロらしい。安い！またWiFiも整備されているっぽい。&lt;/p&gt;&#xA;&lt;h3 id=&#34;最後に&#34;&gt;最後に&lt;/h3&gt;&#xA;&lt;p&gt;というわけで行ってきます！&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B01AXRCDZ4/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/51zQn7roGpL._SL160_.jpg&#34; alt=&#34;未来型国家エストニアの挑戦 　電子政府がひらく世界 (NextPublishing)&#34; loading=&#34;lazy&#34; title=&#34;未来型国家エストニアの挑戦 　電子政府がひらく世界 (NextPublishing)&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B01AXRCDZ4/kazzhomeunixo-22/&#34;&gt;未来型国家エストニアの挑戦 　電子政府がひらく世界 (NextPublishing)&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: ラウルアリキヴィ,前田陽二&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: インプレスR&amp;amp;D&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2016/01/29&lt;/li&gt;&#xA;&lt;li&gt;メディア: Kindle版&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/B01AXRCDZ4/kazzhomeunixo-22&#34;&gt;この商品を含むブログを見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>ハワイでのSIMはKDDI x h2o が良かった</title>
				<link>https://journal.lampetty.net/posts/kddi-h2o-sim-in-hawaii/</link>
				<pubDate>Mon, 25 Sep 2017 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/kddi-h2o-sim-in-hawaii/</guid>
				<description>&lt;p&gt;9/1から1週間ほどハワイに行ったのだけど、現地でのネットワーク環境どうしようかと悩んでいて色々調べた結果KDDI mobile x h2o のSIMが良かったのでレポート。良かった点としては&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;安い&lt;/li&gt;&#xA;&lt;li&gt;4G LTE使える&lt;/li&gt;&#xA;&lt;li&gt;電話もかけられる&lt;/li&gt;&#xA;&lt;li&gt;auのiPhoneだとSIMロック解除してなくてもそのまま使える&lt;/li&gt;&#xA;&lt;li&gt;SIMは日本のAmazonで事前に買える&lt;/li&gt;&#xA;&lt;li&gt;現地でトラブルがあっても日本語でのサポートがある&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;というところ。以下で詳しく説明してみる。&lt;/p&gt;&#xA;&lt;h3 id=&#34;料金&#34;&gt;料金&lt;/h3&gt;&#xA;&lt;p&gt;30日未満の利用で3GBで$30。1週間の滞在で自分は1GBも使わなかった。もっと大容量が必要な場合でも、$40で6GBなのでかなりオトクな感じ。 詳しくは&lt;a href=&#34;https://www.kddimobilesim.com/pageControl.php?page=plans&#34;&gt;プランの詳細&lt;/a&gt;を参照。&lt;/p&gt;&#xA;&lt;p&gt;ちなみにハワイで1週間イモトのWiFi借りると1万円を超える。今回はSIM2枚で7000円ぐらいだったのでSIMの方が安上がりで便利。&lt;/p&gt;&#xA;&lt;h3 id=&#34;auのiphoneだとそのまま使える&#34;&gt;auのiPhoneだとそのまま使える&lt;/h3&gt;&#xA;&lt;p&gt;ウチの奥さんはauのSIMロックされたiPhone5sを使っていたのだけど、WiFiがつながるところでSIMを挿してAPNプロファイルをインストールすればすぐ使えるようになった。&lt;/p&gt;&#xA;&lt;p&gt;このh2oというキャリアはAT&amp;amp;Tのネットワークを使っているので、以下の周波数が使える。(&lt;a href=&#34;https://en.wikipedia.org/wiki/AT%26T_Mobility#Radio_frequency_summary&#34;&gt;参考&lt;/a&gt;)&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Band 2 1900 MHz&lt;/li&gt;&#xA;&lt;li&gt;Band 4 1700 MHz&lt;/li&gt;&#xA;&lt;li&gt;Band 5 800 MHz&lt;/li&gt;&#xA;&lt;li&gt;Band 12/17/14/29 700 MHz&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;au iPhone5s(モデルA1453)はLTE Band1、2、3、4、5、8、13、17、18、19、20、25、26に対応しているので、&lt;code&gt;Band 17&lt;/code&gt;が使えていたっぽい。(&lt;a href=&#34;https://support.apple.com/kb/SP685?locale=en_US&amp;amp;viewlocale=ja_JP&#34;&gt;参考&lt;/a&gt;)&lt;/p&gt;&#xA;&lt;h3 id=&#34;simはamazonで購入可能&#34;&gt;SIMはAmazonで購入可能&lt;/h3&gt;&#xA;&lt;p&gt;旅行に行く前にAmazonでSIMを買っておいて、現地に着く日にアクティベートされるようにWebサイトから設定すれば使える。10/1からAmazonでデータ通信料金込みのSIMも発売されるようだ。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B013XT4JK6/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/41bpKO1UiPL._SL160_.jpg&#34; alt=&#34;アメリカSIM h2o by KDDI MONTHLY＄30 初月料金コミコミパック LTE通信2GB　通話・テキスト・データ・国際通話も全部コミコミ！&#34; loading=&#34;lazy&#34; title=&#34;アメリカSIM h2o by KDDI MONTHLY＄30 初月料金コミコミパック LTE通信2GB　通話・テキスト・データ・国際通話も全部コミコミ！&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B013XT4JK6/kazzhomeunixo-22/&#34;&gt;アメリカSIM h2o by KDDI MONTHLY＄30 初月料金コミコミパック LTE通信2GB　通話・テキスト・データ・国際通話も全部コミコミ！&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;出版社/メーカー: KDDI×h2o wireless&lt;/li&gt;&#xA;&lt;li&gt;メディア: Wireless Phone Accessory&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/B013XT4JK6/kazzhomeunixo-22&#34;&gt;この商品を含むブログを見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;現地での日本語サポート&#34;&gt;現地での日本語サポート&lt;/h3&gt;&#xA;&lt;p&gt;自分が持っていったNexus4では最初データ通信だけができずサポートに問い合わせたんだけど、日本語だったのですぐに解決できた。&lt;/p&gt;&#xA;&lt;h3 id=&#34;現地での使用感&#34;&gt;現地での使用感&lt;/h3&gt;&#xA;&lt;p&gt;写真を撮り忘れてしまったけど、iPhone5sだとハワイでは2Mbpsぐらい出ていたらしい。ネットで調べ物をするとか、GoogleMap使うぐらいの用途であれば特にストレスはなかったけど、写真をアップロードするのは少し遅いかなーと感じた。まぁ日本のモバイルネットワークの帯域幅を期待してはいけないのでこんなものなのかなと。&lt;/p&gt;&#xA;&lt;p&gt;あと、Air B&amp;amp;Bで借りた部屋でちょっとしたトラブルがあり、ホストに緊急連絡するのに電話が必要だったので、このSIMで電話もかけられてありがたかった。&lt;/p&gt;&#xA;&lt;h3 id=&#34;使い終わったら&#34;&gt;使い終わったら&lt;/h3&gt;&#xA;&lt;p&gt;何もしないと次の月にまた利用料がクレカから引き落とされてしまうので、旅行が終わったら忘れずに &lt;code&gt;customercare@kddimobilesim.com&lt;/code&gt; にオートリチャージの解除のメールを送っておこう。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>gcloudコマンドを使わずにGoogle Cloud Storageにファイルをアップロードする</title>
				<link>https://journal.lampetty.net/posts/upload-file-to-gcs-without-gcloud-command/</link>
				<pubDate>Mon, 21 Aug 2017 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/upload-file-to-gcs-without-gcloud-command/</guid>
				<description>&lt;h3 id=&#34;概要&#34;&gt;概要&lt;/h3&gt;&#xA;&lt;p&gt;gcloudコマンドを使わずにPythonと&lt;a href=&#34;https://pypi.python.org/pypi/google-cloud&#34;&gt;google-cloud&lt;/a&gt;を使ってGoogle Cloud Storage(GCS)に頑張ってファイルをアップロードしてみる。google-cloudはPython向けのGoogle Cloud Platformの何かを操作するためのクライアントライブラリ。GCPの以下の機能の操作がサポートされている。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;GA&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Google Cloud Datastore&lt;/li&gt;&#xA;&lt;li&gt;Google Cloud Storage&lt;/li&gt;&#xA;&lt;li&gt;Google Cloud Translation&lt;/li&gt;&#xA;&lt;li&gt;Stackdriver Logging&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Beta&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Google BigQuery&lt;/li&gt;&#xA;&lt;li&gt;Google Cloud Natural Language&lt;/li&gt;&#xA;&lt;li&gt;Google Cloud Speech&lt;/li&gt;&#xA;&lt;li&gt;Google Cloud Video Intelligence&lt;/li&gt;&#xA;&lt;li&gt;Google Cloud Vision&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Alpha&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Google Cloud Bigtable&lt;/li&gt;&#xA;&lt;li&gt;Google Cloud Bigtable&lt;/li&gt;&#xA;&lt;li&gt;Google Cloud DNS&lt;/li&gt;&#xA;&lt;li&gt;Google Cloud Pub/Sub&lt;/li&gt;&#xA;&lt;li&gt;Google Cloud Resource Manager&lt;/li&gt;&#xA;&lt;li&gt;Google Cloud Runtime Configuration&lt;/li&gt;&#xA;&lt;li&gt;Google Cloud Spanner&lt;/li&gt;&#xA;&lt;li&gt;Stackdriver Error Reporting&lt;/li&gt;&#xA;&lt;li&gt;Stackdriver Monitoring&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;gcloudコマンドはPython 2.7を必要とするんだけど、Python 2.7をどうしてもインストールできない環境で役立つ話だと思う。自分はHerokuでPython 3.6.x を使っていて、gcloudコマンドのためにPython 2.7をインストールできなくて困っていたのだけど、このgoogle-cloudライブラリを使うようにしてみた。&lt;/p&gt;&#xA;&lt;h3 id=&#34;セットアップ&#34;&gt;セットアップ&lt;/h3&gt;&#xA;&lt;p&gt;前提として&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Python 3.4 以上&lt;/li&gt;&#xA;&lt;li&gt;pip&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;がインストールされていること。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ pip install google-cloud&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;でgoogle-cloudをインストールする。&lt;/p&gt;&#xA;&lt;h3 id=&#34;認証&#34;&gt;認証&lt;/h3&gt;&#xA;&lt;p&gt;google-cloudのライブラリを使うにあたり、credentialが必要になる。おそらく一番ラクなのは&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;GCPのConsoleでService Accountを作って&lt;/li&gt;&#xA;&lt;li&gt;そのcredential情報をJSONファイルとして取得し&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;GOOGLE_APPLICATION_CREDENTIALS&lt;/code&gt; 環境変数で指定する&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;ことだと思う。詳しい話は &lt;a href=&#34;http://google-auth.readthedocs.io/en/latest/user-guide.html#service-account-private-key-files&#34;&gt;google-authのドキュメント&lt;/a&gt;に書いてある。その他の認証のやり方についても詳しく書いてある。&lt;/p&gt;&#xA;&lt;p&gt;Pythonのスクリプトを実行する前に以下のコマンドで credential 情報のJSONファイルを指定すれば、Pythonのスクリプトでは特に何もしなくてOKだ。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;GOOGLE_APPLICATION_CREDENTIALS&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;to&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;json&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;gcsにファイルをアップロードする&#34;&gt;GCSにファイルをアップロードする&lt;/h3&gt;&#xA;&lt;p&gt;それでは本題。google-cloudのstorageモジュールを使ってGCSにファイルをアップロードしてみる。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;get_bucket&lt;/code&gt;でバケットを取得して&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;blob&lt;/code&gt;オブジェクトを作ってアップロードする&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;感じ。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;google&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cloud&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;storage&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;upload&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bucket_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;client&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;storage&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Client&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;bucket&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;client&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get_bucket&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bucket_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;new_blob&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;bucket&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;blob&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;new_blob&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;upload_from_filename&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;__name__&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;argv&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;gcs.py &amp;lt;bucket&amp;gt; &amp;lt;file&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;exit&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;upload&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;argv&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;argv&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;まとめ&#34;&gt;まとめ&lt;/h3&gt;&#xA;&lt;p&gt;gcloudコマンドは早くPython3対応するかGoで書き直されて欲しい。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4798137146/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/51TXapj99DL._SL160_.jpg&#34; alt=&#34;プログラマのためのGoogle Cloud Platform入門 サービスの全体像からクラウドネイティブアプリケーション構築まで&#34; loading=&#34;lazy&#34; title=&#34;プログラマのためのGoogle Cloud Platform入門 サービスの全体像からクラウドネイティブアプリケーション構築まで&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4798137146/kazzhomeunixo-22/&#34;&gt;プログラマのためのGoogle Cloud Platform入門 サービスの全体像からクラウドネイティブアプリケーション構築まで&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: 阿佐志保,中井悦司&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: 翔泳社&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2017/06/02&lt;/li&gt;&#xA;&lt;li&gt;メディア: 単行本（ソフトカバー）&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4798137146/kazzhomeunixo-22&#34;&gt;この商品を含むブログを見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>2017年の進捗</title>
				<link>https://journal.lampetty.net/posts/20170619-0900/</link>
				<pubDate>Mon, 19 Jun 2017 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/20170619-0900/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;http://oinume.hatenablog.com/entry/resolution-in-2017&#34;&gt;2017年の抱負 - oinume journal&lt;/a&gt; で書いた、今年の抱負の進捗。&lt;/p&gt;&#xA;&lt;h2 id=&#34;機械学習を学ぶ&#34;&gt;機械学習を学ぶ&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.udemy.com/learning-ai/learn/v4/overview&#34;&gt;Log in to continue your learning journey | Udemy&lt;/a&gt; というものをやったけど、本当にまだまだわからないことが多い。あと、自分は機械学習よりもデータ分析の方が現時点ではオモシロイと感じている。numpyやpandasは少しわかってきたので、もう少し深掘りしていきたいところ。&lt;/p&gt;&#xA;&lt;h2 id=&#34;twitterの時間を制限する&#34;&gt;Twitterの時間を制限する&lt;/h2&gt;&#xA;&lt;p&gt;うまくいった。唯一Twitterだけずっとやめられなかったけど、頻度は1日1回以下、時間は15分以下に抑えられてる。ひどい時は1日1時間ぐらい見ていたのでだいぶ改善したと思う。&lt;/p&gt;&#xA;&lt;p&gt;辞められたのは、やっぱりスマホからアプリを削除したのが一番大きい。手癖のように暇さえあればTwitterのアプリを起動してしまっていたので、これが物理的にできなくなった。今はTwitter見たい時はブラウザで頑張って見てる。使いづらいけど、はまりたくないのでちょっと使いにくいぐらいが逆にちょうどいい。&lt;/p&gt;&#xA;&lt;h2 id=&#34;去年より本を読む&#34;&gt;去年より本を読む&lt;/h2&gt;&#xA;&lt;p&gt;Twitterをやめたことで、通勤時間に本を読む時間が増えた。とりあえずこの半年で読んだ本。&lt;/p&gt;&#xA;&lt;h3 id=&#34;ルポ-mooc革命無料オンライン授業の衝撃&#34;&gt;ルポ MOOC革命――無料オンライン授業の衝撃&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/400002230X?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;&lt;img src=&#34;https://m.media-amazon.com/images/I/41Dk3Z9YvRL._SL500_.jpg&#34; alt=&#34;ルポ MOOC革命――無料オンライン授業の衝撃&#34; loading=&#34;lazy&#34; title=&#34;ルポ MOOC革命――無料オンライン授業の衝撃&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/400002230X?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;ルポ MOOC革命――無料オンライン授業の衝撃&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者:金成 隆一&lt;/li&gt;&#xA;&lt;li&gt;岩波書店&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/400002230X?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;Amazon&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;2013年の本だけど、オンラインでの学習というものがここまで多様化していることに驚いた。感想は&lt;a href=&#34;http://oinume.hatenablog.com/entry/reportage-moocs-evolution&#34;&gt;読書感想「ルポ MOOCS革命」 - oinume journal&lt;/a&gt; に書いてある。&lt;/p&gt;&#xA;&lt;h3 id=&#34;新所得倍増論&#34;&gt;新・所得倍増論&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B01MG9G56A?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;&lt;img src=&#34;https://m.media-amazon.com/images/I/51pXdcqPO5L._SL500_.jpg&#34; alt=&#34;デービッド・アトキンソン　新・所得倍増論―潜在能力を活かせない「日本病」の正体と処方箋 デービッド・アトキンソン 「新日本論」シリーズ&#34; loading=&#34;lazy&#34; title=&#34;デービッド・アトキンソン　新・所得倍増論―潜在能力を活かせない「日本病」の正体と処方箋 デービッド・アトキンソン 「新日本論」シリーズ&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B01MG9G56A?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;デービッド・アトキンソン　新・所得倍増論―潜在能力を活かせない「日本病」の正体と処方箋 デービッド・アトキンソン 「新日本論」シリーズ&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者:デービッド・アトキンソン&lt;/li&gt;&#xA;&lt;li&gt;東洋経済新報社&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B01MG9G56A?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;Amazon&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;戦後の日本の高度経済成長の理由は単純に人口増加だったという説を説く本。グラフを見るとたしかにその通りだなぁと思う。この本を見て、安倍内閣のやっていることはまともなんだなとあらためて思った。&lt;/p&gt;&#xA;&lt;h3 id=&#34;初めてのphp&#34;&gt;初めてのPHP&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/4873117933?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;&lt;img src=&#34;https://m.media-amazon.com/images/I/51VvVTeZbvL._SL500_.jpg&#34; alt=&#34;初めてのPHP&#34; loading=&#34;lazy&#34; title=&#34;初めてのPHP&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/4873117933?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;初めてのPHP&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者:David Sklar,桑村潤&lt;/li&gt;&#xA;&lt;li&gt;オライリージャパン&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/4873117933?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;Amazon&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;仕事でPHPを書かなくてはいけなくなったので仕方なく。特に新しい学びはなかった。中級者向けのPHPの本があったら教えて欲しい。&lt;/p&gt;&#xA;&lt;h3 id=&#34;google-adsense-成功の法則-57&#34;&gt;Google AdSense 成功の法則 57&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/4800710561?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;&lt;img src=&#34;https://m.media-amazon.com/images/I/51ekXX7wiUL._SL500_.jpg&#34; alt=&#34;Google AdSense 成功の法則 57&#34; loading=&#34;lazy&#34; title=&#34;Google AdSense 成功の法則 57&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/4800710561?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;Google AdSense 成功の法則 57&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者:染谷 昌利&lt;/li&gt;&#xA;&lt;li&gt;ソーテック社&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/4800710561?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;Amazon&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;自分で運営しているサイトのAdSenseの収益を上げたくて購入したけど、特に目新しいことは書いていなかった。&lt;/p&gt;&#xA;&lt;h3 id=&#34;日本人の9割が知らない遺伝の真実-sb新書&#34;&gt;日本人の9割が知らない遺伝の真実 (SB新書)&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/4797389745?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;&lt;img src=&#34;https://m.media-amazon.com/images/I/512VQLTvivL._SL500_.jpg&#34; alt=&#34;日本人の9割が知らない遺伝の真実 (SB新書)&#34; loading=&#34;lazy&#34; title=&#34;日本人の9割が知らない遺伝の真実 (SB新書)&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/4797389745?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;日本人の9割が知らない遺伝の真実 (SB新書)&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者:安藤 寿康&lt;/li&gt;&#xA;&lt;li&gt;SBクリエイティブ&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/4797389745?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;Amazon&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;橘玲の「言ってはいけない 残酷すぎる真実」よりかは信憑性がありそうだったので購入。IQや体重の遺伝の影響など、興味深いトピックが多かった。たまに「ほとんどすべてが遺伝で決まる」みたいなことを言う人がいるけど、決してそうではないと分かったので少し安心した。&lt;/p&gt;&#xA;&lt;h3 id=&#34;徹底調査-子供の貧困が日本を滅ぼす-社会的損失40兆円の衝撃&#34;&gt;徹底調査 子供の貧困が日本を滅ぼす 社会的損失40兆円の衝撃&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/4166610929?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;&lt;img src=&#34;https://m.media-amazon.com/images/I/51qT&amp;#43;iZXyWL._SL500_.jpg&#34; alt=&#34;徹底調査 子供の貧困が日本を滅ぼす 社会的損失40兆円の衝撃 (文春新書 1092)&#34; loading=&#34;lazy&#34; title=&#34;徹底調査 子供の貧困が日本を滅ぼす 社会的損失40兆円の衝撃 (文春新書 1092)&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/4166610929?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;徹底調査 子供の貧困が日本を滅ぼす 社会的損失40兆円の衝撃 (文春新書 1092)&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者:日本財団 子どもの貧困対策チーム&lt;/li&gt;&#xA;&lt;li&gt;文藝春秋&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/4166610929?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;Amazon&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;日本の家庭の6分の1が相対的貧困にある日本の実体について、インタビューをまじえながら書かれている。貧困が連鎖することがどのぐらい日本の財政に影響をあたえるかなど面白かった。日本は教育については他の国と比べて国からの支援が弱いのでもっと頑張ってほしいな。最近流行りのGRIT(やり抜く力)は第3者が介入することで補完できる、など教育についても興味深いことがたくさん書いてあった。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/479814102X?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;&lt;img src=&#34;https://m.media-amazon.com/images/I/51o5GD9Id0L._SL500_.jpg&#34; alt=&#34;プログラマのためのDocker教科書 インフラの基礎知識&amp;amp;コードによる環境構築の自動化&#34; loading=&#34;lazy&#34; title=&#34;プログラマのためのDocker教科書 インフラの基礎知識&amp;amp;コードによる環境構築の自動化&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/479814102X?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;プログラマのためのDocker教科書 インフラの基礎知識&amp;amp;コードによる環境構築の自動化&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者:阿佐 志保&lt;/li&gt;&#xA;&lt;li&gt;翔泳社&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/479814102X?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;Amazon&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;まだ読み途中。Dockerの本はたくさん出ているけど、Dockerの仕組みがわかりやすく書いてある気がする。&lt;/p&gt;&#xA;&lt;h2 id=&#34;英語&#34;&gt;英語&lt;/h2&gt;&#xA;&lt;p&gt;ショッキングなことに、昨年のTOEICからスコアが下がっていた。800点まではあと少しなので頑張りたいけど、非ネイティブの人とはだいたい意思疎通できるようになったので、自分的には今のレベルで満足している。&lt;/p&gt;&#xA;&lt;h2 id=&#34;アルゴリズム勉強する&#34;&gt;アルゴリズム勉強する&lt;/h2&gt;&#xA;&lt;p&gt;あんまりできてない。&lt;/p&gt;&#xA;&lt;h2 id=&#34;vpsをやめる&#34;&gt;VPSをやめる&lt;/h2&gt;&#xA;&lt;p&gt;これはやめられていない。とりあえず&lt;a href=&#34;http://www.vultr.com/?ref=6805326&#34;&gt;vultr&lt;/a&gt;の一番安い$2.5のプランにしてお金の節約はしてみた。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>MySQLのデータをJupyter Notebook上でグラフにする</title>
				<link>https://journal.lampetty.net/posts/visualize-mysql-data-in-jupyter/</link>
				<pubDate>Fri, 02 Jun 2017 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/visualize-mysql-data-in-jupyter/</guid>
				<description>&lt;p&gt;最近少しずつJupyter Notebookやpandas, matplotlibに慣れてきて、PythonによるData Scienceが面白くなってきたと感じてます。今日はMySQLのデータをSQLで持ってきて、Jupyter Notebook上でグラフにしてみる話。&lt;/p&gt;&#xA;&lt;h3 id=&#34;セットアップ&#34;&gt;セットアップ&lt;/h3&gt;&#xA;&lt;p&gt;Python3はインストールされていることを前提。jupyterなどの必要なソフトウェアを入れる環境を作って、pip でインストールする。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;python3 -m venv jupyter&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;source jupyter/bin/activate&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pip install jupyter pandas matplotlib pymysql&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;インストールが成功したら、こんな感じでJupyter Notebookを立ち上げる。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;./jupyter/bin/jupyter notebook&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;立ち上がったらブラウザから適当にnotebookを作っておく。&lt;/p&gt;&#xA;&lt;h3 id=&#34;mysqlに接続&#34;&gt;MySQLに接続&lt;/h3&gt;&#xA;&lt;p&gt;今回はPure Pythonなpymysqlを使ってMySQLに接続する。接続先の情報は以下の例では環境変数から取っているけど、ここは&lt;code&gt;pymysql.connect&lt;/code&gt;に直接渡すように変更してOK。&lt;code&gt;conn&lt;/code&gt;という変数に入っているのが、MySQLへのコネクションになる。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import os&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import pymysql&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import pandas as pd&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import matplotlib.pyplot as plt&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;host = os.getenv(&amp;#39;MYSQL_HOST&amp;#39;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;port = os.getenv(&amp;#39;MYSQL_PORT&amp;#39;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;user = os.getenv(&amp;#39;MYSQL_USER&amp;#39;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;password = os.getenv(&amp;#39;MYSQL_PASSWORD&amp;#39;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;database = os.getenv(&amp;#39;MYSQL_DATABASE&amp;#39;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;conn = pymysql.connect(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    host=host,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    port=int(port),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    user=user,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    passwd=password,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    db=database,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    charset=&amp;#39;utf8mb4&amp;#39;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;pandasread_sql_queryを使ってsqlを実行&#34;&gt;pandas.read_sql_queryを使ってSQLを実行&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;df = pd.read_sql_query(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &amp;#34;SELECT DATE(created_at) AS date, COUNT(*) AS count FROM user GROUP BY date HAVING date &amp;gt;= &amp;#39;2017-04-01&amp;#39; &amp;#34;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    conn)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;次に&lt;code&gt;pandas.read_sql_query&lt;/code&gt;を使って、MySQLからSQLで取得した結果をpandas.DataFrameにする。この関数には&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;第1引数にSQL&lt;/li&gt;&#xA;&lt;li&gt;第2引数にMySQLのコネクション&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;を渡せばよい。これだけでMySQLから取得した結果がそのままDataFrameになるなんて簡単すぎる…&lt;/p&gt;&#xA;&lt;p&gt;ちなみに今回は以下のuserテーブルから、日付ごとに登録したユーザー数を取得するSQLを発行している。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;mysql&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;CREATE&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;TABLE&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;user&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;unsigned&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;NOT&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;no&#34;&gt;NULL&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kp&#34;&gt;AUTO_INCREMENT&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;varchar&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;50&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;CHARACTER&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;SET&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;utf8&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;COLLATE&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;utf8_unicode_ci&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;NOT&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;no&#34;&gt;NULL&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;email&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;varchar&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;255&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;CHARACTER&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;SET&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;utf8mb4&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;NOT&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;no&#34;&gt;NULL&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;followed_teacher_at&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;datetime&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;DEFAULT&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;no&#34;&gt;NULL&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;created_at&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;datetime&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;NOT&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;no&#34;&gt;NULL&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;updated_at&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;datetime&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;NOT&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;no&#34;&gt;NULL&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;PRIMARY&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;KEY&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;UNIQUE&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;KEY&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;email&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;email&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;read_sql_queryを実行した結果の &lt;code&gt;df&lt;/code&gt; を表示してみるとこんな感じになっている。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://cdn-ak.f.st-hatena.com/images/fotolife/o/oinume/20170601/20170601191237.png&#34; alt=&#34;f:id:oinume:20170601191237p:plain&#34; loading=&#34;lazy&#34; title=&#34;f:id:oinume:20170601191237p:plain&#34;&gt;&#xA;&lt;/p&gt;&#xA;&lt;h3 id=&#34;dataframeをグラフにする&#34;&gt;DataFrameをグラフにする&lt;/h3&gt;&#xA;&lt;p&gt;最後に本題のグラフ化。DataFrameのindexに &lt;code&gt;date&lt;/code&gt; カラムの値をセットして、DataFrameの&lt;code&gt;plot.bar()&lt;/code&gt;を呼び出せば棒グラフが表示される。&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;%matplotlib inline&lt;/code&gt; はJupyter上にグラフを表示するためのおまじないっぽい。&lt;code&gt;df.tail(10)&lt;/code&gt;しているのは直近の10件に絞って見やすくするため。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;%matplotlib inline&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;df.index = df[&amp;#39;date&amp;#39;]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;p = df.tail(10).plot.bar()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;https://cdn-ak.f.st-hatena.com/images/fotolife/o/oinume/20170601/20170601211553.png&#34; alt=&#34;f:id:oinume:20170601211553p:plain&#34; loading=&#34;lazy&#34; title=&#34;f:id:oinume:20170601211553p:plain&#34;&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;ちなみに &lt;code&gt;plot.pie()&lt;/code&gt; とかやると円グラフが表示できる。描画できるグラフの種類については&lt;a href=&#34;http://pandas.pydata.org/pandas-docs/stable/visualization.html&#34;&gt;pandasのvisualization&lt;/a&gt;というページに全部載っている。&lt;/p&gt;&#xA;&lt;h3 id=&#34;まとめ&#34;&gt;まとめ&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;pandas.read_sql_query を使うと、SQLでSELECTした結果をそのままDataFrameにできる&lt;/li&gt;&#xA;&lt;li&gt;DataFrameからグラフを表示するのは簡単&lt;/li&gt;&#xA;&lt;li&gt;いろんな種類のグラフが描画できるよ&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;おまけ&#34;&gt;おまけ&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://gist.github.com/oinume/fd7488107a5c0cd65a2664e66bdc7930&#34;&gt;gist&lt;/a&gt;に今回のnotebookを上げておいたのでよかったらどうぞ。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Udemyがなかなかいい感じ</title>
				<link>https://journal.lampetty.net/posts/learn-with-udemy/</link>
				<pubDate>Tue, 23 May 2017 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/learn-with-udemy/</guid>
				<description>&lt;p&gt;最近は健康のために、六本木→渋谷まで歩いて帰っているのでPodcastをよく聴くようになった。1日30分以上歩いていて、その間は暇なのでPodcastを聞いていたのだけれどPodcastが在庫切れになってしまった。どうしようかと悩んでいたところ、以前&lt;a href=&#34;https://www.udemy.com/&#34;&gt;Udemy&lt;/a&gt;でいくつかコースを購入したことを思い出して、Udemyのコースを垂れ流すようにしたところいい感じに技術的なものが勉強できるようになった。UdemyがPodcastよりいいなと思ったのは&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;(自分が聞いている)Podcastだと話している内容が薄いが、Udemyは学習サイトなのでPodcastよりは内容は濃い&lt;/li&gt;&#xA;&lt;li&gt;聞いていてどうしても画面を見なくてはいけない時は立ち止まって見れば良い。もしくは電車の中で再度見直す&lt;/li&gt;&#xA;&lt;li&gt;英語OKな人だったら本当に様々なコースがある(React, Machine Learning, Docker, etc…)&lt;/li&gt;&#xA;&lt;li&gt;Udemyは定期的にキャンペーンをやっていて、普段だったら2万円かかるようなコースが1200円になっていたりする&#xA;&lt;ul&gt;&#xA;&lt;li&gt;例えば今だと&lt;a href=&#34;https://www.udemy.com/courses/&#34;&gt;Udemy Learn Fest&lt;/a&gt;という割引キャンペーンをやっている(5/27まで)&lt;/li&gt;&#xA;&lt;li&gt;さらにiOS/Androidアプリ限定で常設的な割引キャンペーンもやっている&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;という点。1200円という値段なら書籍を買うより安くつく。特にアプリの使い方を学ぶような場合は動画の方が効率的に学習できると思う。というわけでUdemyオススメです。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN//kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://d.hatena.ne.jp/images/hatena_aws.gif&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN//kazzhomeunixo-22/&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;メディア:&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin//kazzhomeunixo-22&#34;&gt;この商品を含むブログを見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>go test in practice</title>
				<link>https://journal.lampetty.net/posts/go-test-in-practice/</link>
				<pubDate>Thu, 13 Apr 2017 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/go-test-in-practice/</guid>
				<description>&lt;p&gt;This blog post describes basics and practical examples of &lt;code&gt;go test&lt;/code&gt;. Go’s automated test mechanism is well designed and easy to use. I’ll show you some techniques of &lt;code&gt;go test&lt;/code&gt; in this article.&lt;/p&gt;&#xA;&lt;h3 id=&#34;what-is-go-test&#34;&gt;What is &lt;code&gt;go test&lt;/code&gt;&lt;/h3&gt;&#xA;&lt;p&gt;&lt;code&gt;go test&lt;/code&gt; is a command to run automated tests of go packages.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Automated test must be defined in &lt;code&gt;_test.go&lt;/code&gt; file&lt;/li&gt;&#xA;&lt;li&gt;Automated test function must start with &lt;code&gt;Test&lt;/code&gt; prefix&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;example-stack&#34;&gt;Example: stack&lt;/h3&gt;&#xA;&lt;p&gt;I implement a stack as real world example to explain &lt;code&gt;go test&lt;/code&gt;. &lt;code&gt;stack&lt;/code&gt; package provides stack.go. If you want to write tests for stack.go, create a file named &lt;code&gt;stack_test.go&lt;/code&gt;. The source code is in &lt;a href=&#34;https://github.com/oinume/go-test-in-practice/blob/master/stack/stack.go&#34;&gt;GitHub repository&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h3 id=&#34;go-test-packages&#34;&gt;go test [packages]&lt;/h3&gt;&#xA;&lt;p&gt;First of all, let’s test a simple function &lt;code&gt;stack.NewIntStack&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;package&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;stack&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;testing&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;TestNewIntStack&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;t&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;testing&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;T&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;istack&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;NewIntStack&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;istack&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;nil&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Error&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;NewIntStack() returns nil&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The test checks &lt;code&gt;NewIntStack&lt;/code&gt; returns non nil. To run the test, type &lt;code&gt;go test ./stack&lt;/code&gt;. You’ll get following output. It means the test succeeded.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;go test ./stack&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ok      github.com/oinume/go-test-in-practice/stack       0.136s&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;go-test--v&#34;&gt;go test -v&lt;/h3&gt;&#xA;&lt;p&gt;&lt;code&gt;-v&lt;/code&gt; flag enables verbose mode. You can get a message &lt;code&gt;TestNewIntStack finished&lt;/code&gt; by running with &lt;code&gt;-v&lt;/code&gt; flag.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;TestNewIntStack&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;t&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;testing&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;T&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;istack&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;NewIntStack&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;istack&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;nil&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Error&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;NewIntStack() returns nil&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;TestNewIntStack finished&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;This&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;message&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;output&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;only&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;verbose&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mode&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;go test -v ./stack&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;=== RUN   TestNewIntStack&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;--- PASS: TestNewIntStack (0.00s)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        stack_test.go:10: TestNewIntStack finished&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;PASS&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ok      github.com/oinume/go-test-in-practice/stack       0.132s&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;all outputs in STDOUT are printed in verbose mode. You can use &lt;code&gt;t.Log&lt;/code&gt; or &lt;code&gt;t.Logf&lt;/code&gt; if you want to print a message with line number.&lt;/p&gt;&#xA;&lt;p&gt;If you want to do something only when verbose mode, You can use &lt;code&gt;testing.Verbose()&lt;/code&gt; in your test code.&lt;/p&gt;&#xA;&lt;h3 id=&#34;go-test--short&#34;&gt;go test -short&lt;/h3&gt;&#xA;&lt;p&gt;You can use &lt;code&gt;-short&lt;/code&gt; flag to skip long-running tests. You can refer the flag is on or off by &lt;code&gt;testing.Short()&lt;/code&gt; in your test.&lt;/p&gt;&#xA;&lt;p&gt;Example:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;TestIntStack_PushALot&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;t&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;testing&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;T&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;testing&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Short&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Skip&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Skip pushing a lot of numbers to a stack&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;istack&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;NewIntStack&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;10000000&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;istack&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Push&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;go-test--run&#34;&gt;go test -run&lt;/h3&gt;&#xA;&lt;p&gt;&lt;code&gt;-run&lt;/code&gt; flag is used to specify tests to run. If you have test functions &lt;code&gt;TestNewIntStack&lt;/code&gt; and &lt;code&gt;TestIntStack_PushALot&lt;/code&gt;, you want to run only &lt;code&gt;TestIntStack_PushALot&lt;/code&gt;. You’ll save time with &lt;code&gt;-run&lt;/code&gt; flag in order to avoid running whole tests.&lt;/p&gt;&#xA;&lt;p&gt;Example:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;go test -run TestIntStack_PushALot ./stack&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;=== RUN   TestIntStack_PushALot&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;--- PASS: TestIntStack_PushALot (1.01s)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;PASS&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ok      github.com/oinume/go-test-in-practice/stack       1.156s&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;reflectdeepequal&#34;&gt;reflect.DeepEqual&lt;/h3&gt;&#xA;&lt;p&gt;You can use &lt;a href=&#34;https://golang.org/pkg/reflect/#DeepEqual&#34;&gt;reflect.DeepEqual&lt;/a&gt; to compare two values of structs. Following example ensures istack1 and istack2 are the same.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;TestIntStack_Compare&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;t&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;testing&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;T&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;istack1&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;NewIntStack&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;istack2&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;NewIntStack&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;range&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;ne&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;istack1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Push&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;istack2&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Push&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;reflect&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;DeepEqual&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;istack1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;istack2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Errorf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Stacks must be the same: istack1.Size=&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;%d&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;, istack2.Size=&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;%d&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;istack1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(),&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;istack2&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;testmain&#34;&gt;TestMain&lt;/h3&gt;&#xA;&lt;p&gt;&lt;code&gt;TestMain&lt;/code&gt; is a main function in automated tests. Sometimes it is necessary for a test program to do extra setup or teardown before or after testing. If &lt;code&gt;func TestMain(m *testing.M)&lt;/code&gt; function exists in your package, the generated test will call TestMain(m) instead of running the tests directly. This is an example to set up and tear down with &lt;code&gt;TestMain&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;TestMain&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;m&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;testing&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;M&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Set&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;up&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;something&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tests&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;status&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;m&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Run&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Tear&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;down&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;something&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tests&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;os&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Exit&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;status&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;and-more&#34;&gt;And more&lt;/h3&gt;&#xA;&lt;p&gt;&lt;code&gt;go test&lt;/code&gt; has much more features like benchmark, example test, etc. You’ll find them out in &lt;a href=&#34;https://golang.org/pkg/testing/&#34;&gt;document of testing package&lt;/a&gt;. There are also good slides of testing like &lt;a href=&#34;https://speakerdeck.com/mitchellh/advanced-testing-with-go&#34;&gt;Advanced Testing with Go // Speaker Deck&lt;/a&gt;.&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>読書感想「ルポ MOOCS革命」</title>
				<link>https://journal.lampetty.net/posts/reportage-moocs-evolution/</link>
				<pubDate>Thu, 09 Mar 2017 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/reportage-moocs-evolution/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/400002230X/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/51mOVPTDY9L._SL160_.jpg&#34; alt=&#34;ルポ MOOC革命――無料オンライン授業の衝撃&#34; loading=&#34;lazy&#34; title=&#34;ルポ MOOC革命――無料オンライン授業の衝撃&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/400002230X/kazzhomeunixo-22/&#34;&gt;ルポ MOOC革命――無料オンライン授業の衝撃&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: 金成隆一&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: 岩波書店&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2013/12/26&lt;/li&gt;&#xA;&lt;li&gt;メディア: 単行本（ソフトカバー）&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/400002230X/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (8件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;を読んだので、メモと感想。&lt;/p&gt;&#xA;&lt;h3 id=&#34;感想&#34;&gt;感想&lt;/h3&gt;&#xA;&lt;p&gt;まず「MOOCSってなに？」という状態からスタートした自分。MOOCSとはMassive Open Online Coursesのことで、有名なところだと coursera とか udacity がある。大学の講義などをオンラインの動画で見ることができて、どこにいても講義を受けられることがメリット。&lt;/p&gt;&#xA;&lt;p&gt;この本の最初の方は、いかにMOOCSが素晴らしいか、MOOCSを使っていい教育を受けた人がいるかを述べていて、若干退屈だったけど、中盤から後半はMOOCSの仕組みとかビジネスモデルについて詳しく書かれていて良かった。あと、作者本人が取材しているので実際の生徒の生の声が書いてあるのが良かった。&lt;/p&gt;&#xA;&lt;p&gt;2013年に出版された本なので若干情報が古いけど、作者自身シリコンバレーに行ってcouseraやudacityにヒアリングしているなど、かなり骨太なルポですごいなと思った(小並感&lt;/p&gt;&#xA;&lt;h3 id=&#34;最初の方&#34;&gt;最初の方&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;学び続ける母親の姿は家族にも良い影響を与える。子供も勉強するようになる。&lt;/li&gt;&#xA;&lt;li&gt;コンピュータを使ったデータ解析がいいらしい。&lt;/li&gt;&#xA;&lt;li&gt;一度は教科書で学んだ内容でも、大学教授の解説を聞くと不思議なほど理解が深まった。スタンフォード大学の講座を受けた人の話。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;p40&#34;&gt;p.40&lt;/h3&gt;&#xA;&lt;p&gt;求職中の受講生の学習履歴を見ることができる。この講義で成績トップ10の情報を知りたい、との企業からの依頼にもコーセラは応じる。&lt;/p&gt;&#xA;&lt;h3 id=&#34;p47-ユダシティのビジネスモデル&#34;&gt;p.47 ユダシティのビジネスモデル&lt;/h3&gt;&#xA;&lt;p&gt;企業が講座の制作費をサポートし、講師が学生に教える。受講生はきちんとスキルを証明することで就職できる。企業は能力と努力を確かめて新しい人材を探せる。 プラットフォームとしてのユダシティにも運営資金が入る&lt;/p&gt;&#xA;&lt;h3 id=&#34;p68&#34;&gt;p68&lt;/h3&gt;&#xA;&lt;p&gt;ムークで好成績を収める人は大学入学にも道が拓ける&lt;/p&gt;&#xA;&lt;h3 id=&#34;p75-オープン教材について&#34;&gt;p75 オープン教材について&lt;/h3&gt;&#xA;&lt;p&gt;高校の数学の授業ではなぜその公式が機能するのかを説明しないが、MITの教材では動画でそれを説明していた。&lt;/p&gt;&#xA;&lt;h3 id=&#34;p135-サルマンカーン&#34;&gt;p135 サルマン・カーン&lt;/h3&gt;&#xA;&lt;p&gt;わかりやすい説明で有名になった。足し算から高度な数学や経済学、生物学、物理学、宇宙論など一人で講義動画を撮影している。日本語字幕もある 講義の中では、微分積分のコースで、マイナスとマイナスをかければプラスになる、というような細かいことも声に出す。これをありがたいと思う子供がたくさんいるらしい。カーンアカデミーの運営費は700万ドル。VCの資本は入れず、ゲイツ財団や個人の寄付から成り立っている。&lt;/p&gt;&#xA;&lt;h3 id=&#34;p146&#34;&gt;p146&lt;/h3&gt;&#xA;&lt;p&gt;現在の学校教育では、教える時間が固定されていて、生徒の理解度は変数になっている。これは逆で生徒の理解度を固定するべき。特に数学は一度理解が追いつかなくなると、次の授業も理解できなくなってしまう。&lt;/p&gt;&#xA;&lt;h3 id=&#34;p158-反転授業&#34;&gt;p158 反転授業&lt;/h3&gt;&#xA;&lt;p&gt;講義のビデオを自宅で見て、授業では宿題や課題をやること。生徒は実践的な学習や友人との共同作業、友人の成果を評価することに取り組む。先生たちは子供たちに一対一で教えたり、助言したり、鼓舞したりできるようになる。これは先生が中心の教室から、生徒が中心の学習環境へのシフトである。&lt;/p&gt;&#xA;&lt;h3 id=&#34;p202-日本でのオープンエデュケーション&#34;&gt;p202 日本でのオープンエデュケーション&lt;/h3&gt;&#xA;&lt;p&gt;manavee。大学受験応援サイト。 予備校に通えるのはお金がある家庭だけ。マナビーは全て無料。 動画を見ていた受験生が大学生になりボランティアで講義で教えるという好循環。&lt;/p&gt;&#xA;&lt;p&gt;学校では教えてくれない教科でもマナビーでは講義がある。 テクノロジーで教室を再現することはできないか？hangoutとかで。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>お金を節約するワザ</title>
				<link>https://journal.lampetty.net/posts/techniques-to-save-money/</link>
				<pubDate>Wed, 04 Jan 2017 08:40:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/techniques-to-save-money/</guid>
				<description>&lt;p&gt;個人的にやっているお金の節約方法をまとめてみる。&lt;/p&gt;&#xA;&lt;h3 id=&#34;amazonで商品をなるべく安く買う方法&#34;&gt;Amazonで商品をなるべく安く買う方法&lt;/h3&gt;&#xA;&lt;h4 id=&#34;amazonギフトカードを安く買う&#34;&gt;Amazonギフトカードを安く買う&lt;/h4&gt;&#xA;&lt;p&gt;まずはAmazonでの買い物を2〜8%安くする方法。世の中にはAmazonギフトカードを安く手に入れることができるサイトがいくつかあって、だいたい2〜8%OFFぐらいで買うことができる。代表的なサイトとしては下記がある。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://amaten.com/&#34;&gt;amaten&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://amaoku.jp/&#34;&gt;アマオク&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://giftissue.com/&#34;&gt;Giftissue&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;「アマゾンギフト券　安く」でググると色々とこの手のサイトが出てくるので調べてみるといいと思う。&lt;/p&gt;&#xA;&lt;h4 id=&#34;amazonのマーケットプレイスを活用する&#34;&gt;Amazonのマーケットプレイスを活用する&lt;/h4&gt;&#xA;&lt;p&gt;新品にこだわらなければAmazonのマーケットプレイスはかなり安く商品を買うことができる。自分は本に関しては新品かどうかは気にしていない。新作の本でなければ、Amazonのマーケットプレイスは送料込みでだいたい半額ぐらいで買うことができる。そして読み終わった本はメルカリなどで売ってしまえば「一粒で2度おいしい」感じになる。&lt;/p&gt;&#xA;&lt;h4 id=&#34;amazonプライムすごい&#34;&gt;Amazonプライムすごい&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;送料が無料になる&lt;/li&gt;&#xA;&lt;li&gt;映画が見放題&lt;/li&gt;&#xA;&lt;li&gt;音楽も聴き放題&lt;/li&gt;&#xA;&lt;li&gt;Kindle本が毎月1冊無料&lt;/li&gt;&#xA;&lt;li&gt;写真を無制限にクラウドストレージに保存可能&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;という特典がついて年間3900円(税込)なんだからすごい(月で換算したら325円！)。自分はNetFlixやHuluは解約してAmazonプライムだけにしてしまった。&lt;/p&gt;&#xA;&lt;h3 id=&#34;ネット通販ならヨドバシもいいぞ&#34;&gt;ネット通販ならヨドバシもいいぞ&lt;/h3&gt;&#xA;&lt;p&gt;自分の中ではAmazonと並ぶぐらい利用しているのは&lt;a href=&#34;http://www.yodobashi.com/&#34;&gt;ヨドバシ&lt;/a&gt;。ヨドバシがなぜいいかは&lt;a href=&#34;http://blogger.lampetty.net/2014/01/yodobashi-is-awesome.html&#34;&gt;おいぬま日報: ヨドバシドットコムが始まり過ぎてる件&lt;/a&gt;にまとめてあるが、&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;どんな商品でも送料が無料&#xA;&lt;ul&gt;&#xA;&lt;li&gt;AmazonはAmazonプライムに入らないと送料無料にならない場合があるが、ヨドバシではそんなことはない。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;13時までに注文すれば当日配送&lt;/li&gt;&#xA;&lt;li&gt;日用品も含めて商品が充実している&lt;/li&gt;&#xA;&lt;li&gt;10%のポイントが付く。このポイントを考慮するとAmazonより安い場合がある&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;などが良い点。ヨドバシの余ったポイントはWebMoneyかiTunes Cardを買ってしまうとさらにお得だ。&lt;/p&gt;&#xA;&lt;h3 id=&#34;格安simを使う&#34;&gt;格安SIMを使う&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://oinume.hatenablog.com/entry/recommending-mvno-sim&#34;&gt;oinume.hatenablog.com&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;以前上の記事を書いたんだけど、3大キャリアから乗り換えるだけで月数千円は節約できる。自分は月6000円かかっていた携帯代がIIJ mioにすることで月3000円未満になった。SIMフリーのiPhone7はかなり高いけど、iPhone SEは税込みで約5万4000円で買えるので、2年使えば本体を買い替えてもお釣りがくる。&lt;/p&gt;&#xA;&lt;p&gt;格安SIMは今だと&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Facebook/Twitter/Instgram/LINE の通信料がチャージされない&lt;a href=&#34;https://mobile.line.me/&#34;&gt;LINEモバイル&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;速度が安定しているらしい&lt;a href=&#34;http://mineo.jp/&#34;&gt;mineo&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;なんだかんだでユーザー数が多い&lt;a href=&#34;https://www.iijmio.jp/&#34;&gt;IIJ mio&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;あたりが良さそう。&lt;/p&gt;&#xA;&lt;h3 id=&#34;itunes-storeで安く買う方法&#34;&gt;iTunes Storeで安く買う方法&lt;/h3&gt;&#xA;&lt;p&gt;年に何回かコンビニなどでiTunes Storeのギフトカードがおまけ付きで買える(実質10%OFFになる)キャンペーンがやっているので、&lt;a href=&#34;http://itc-check.com/&#34;&gt;iTunes Card割引速報&lt;/a&gt;をチェックすればいつキャンペーンがやっているかがわかる。音楽を買ったり映画をレンタルする人にはオススメ。&lt;/p&gt;&#xA;&lt;h3 id=&#34;住宅ローンの借り換え&#34;&gt;住宅ローンの借り換え&lt;/h3&gt;&#xA;&lt;p&gt;これはすごい対象者を限定する内容だけど、チャットで質問に答えることで今より安い住宅ローンの借り換えプランを提案してくれるアプリがあるので、金利が高めで借りた人は借り換えを検討してみることをオススメする。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://mogecheck.jp/&#34;&gt;mogecheck.jp&lt;/a&gt;&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>2017年の抱負</title>
				<link>https://journal.lampetty.net/posts/resolution-in-2017/</link>
				<pubDate>Tue, 03 Jan 2017 05:31:12 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/resolution-in-2017/</guid>
				<description>&lt;p&gt;明けましておめでとうございます。いまだに年賀状に手をつけられていない怠惰な人間ですが、新年の抱負を書きます。&lt;/p&gt;&#xA;&lt;h3 id=&#34;機械学習を学ぶ&#34;&gt;機械学習を学ぶ&lt;/h3&gt;&#xA;&lt;p&gt;今まで機械学習を勉強しても実践する場がなかなか見つけづらかったけど、自分で作ったサービスもあるので学んだ成果を投入できればいいなと思っている。CouseraのMLコースを受講していたけどつまらなくて2週間で挫折してしまった。ただ、以下の記事を見るとあれに挫折するのは自分だけではないということがわかったので、この記事を参考にして勉強するとっかかりをなんとか掴みたい。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://postd.cc/learning-new-stuffmachine-learning-in-a-year/&#34;&gt;postd.cc&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;アルゴリズム勉強する&#34;&gt;アルゴリズム勉強する&lt;/h3&gt;&#xA;&lt;p&gt;去年から引き続き。&lt;/p&gt;&#xA;&lt;h3 id=&#34;健康&#34;&gt;健康&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;最近体力が落ちてきているので、スクワットもしくはランニング等何かしらの運動をするようにしたい。といいつつこの三が日まだ何もできてないんだけど。とにかく適度な運動と睡眠が健康のためには不可欠ということを学んだので...&lt;/li&gt;&#xA;&lt;li&gt;睡眠時間は1日6時間以上を心がけたい&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;英語&#34;&gt;英語&lt;/h3&gt;&#xA;&lt;p&gt;目安でいうとTOEIC800点ぐらいあれば英語でなんとかコミュニケーション取れるぐらいかなぁと思っているので頑張る。&lt;/p&gt;&#xA;&lt;h3 id=&#34;vpsをやめる&#34;&gt;VPSをやめる&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;昔のブログのリダイレクト専用サーバー&lt;/li&gt;&#xA;&lt;li&gt;Vagrant Imageの置き場所&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;のためにVPSを運用しているのだけど、前者はAWS lambda + API Gatewayでいいし、後者はAWS S3+Cloud Flareでいける気がするので移行する。&lt;/p&gt;&#xA;&lt;h3 id=&#34;去年より本を読む&#34;&gt;去年より本を読む&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://oinume.hatenablog.com/entry/read-books-in-2016&#34;&gt;2016年に読んだ本 - oinume journal&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;技術書以外だと去年はあまり本を読めなかったけど、今年はネットを見る時間を減らして1冊でもいいから去年よりも本を多く読みたい。&lt;/p&gt;&#xA;&lt;h3 id=&#34;twitterの時間を制限する&#34;&gt;Twitterの時間を制限する&lt;/h3&gt;&#xA;&lt;p&gt;最近気がつくとTwitterを見てしまっているんだけど、自分はSocial Mediaで人生が変わるような体験をしているわけではなく、時間がもったいないので1日30分に制限したい。FacebookとInstagramはフォローしている人を減らしてアプリを削除したら時間が激減したのでTwitterにもこれを適用していく所存。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>2016年の振り返り</title>
				<link>https://journal.lampetty.net/posts/review-of-2016/</link>
				<pubDate>Sat, 31 Dec 2016 23:30:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/review-of-2016/</guid>
				<description>&lt;p&gt;まずは今年の1月に書いた&lt;a href=&#34;http://oinume.hatenablog.com/entry/2016-resolution&#34;&gt;新年の抱負&lt;/a&gt;を振り返ってみる。&lt;/p&gt;&#xA;&lt;h3 id=&#34;英語を頑張る&#34;&gt;英語を頑張る&lt;/h3&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;技術的なやり取りは苦がなくできるぐらいになっていたいなぁと。会話も文章も両方で。あとブログの英語比率を50%に持って行きたい。あと何か1冊英語の本を最後まで読む。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;ブログの英語比率は 6 / 18 で33%だった。12月ぐらいから面倒になってほぼすべて日本語で書いてしまっていたのが敗因。ただ、会社でTOEICを10年振りに受けて、745点だったのでそこそこDMM英会話の成果は出ている気がする。リーディングよりリスニングの方が点がよかったのが嬉しい。&lt;/p&gt;&#xA;&lt;h3 id=&#34;アルゴリズム勉強する&#34;&gt;アルゴリズム勉強する&lt;/h3&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;6月までにB+Treeをソラで実装できるようにしたい&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;未達。&lt;a href=&#34;https://github.com/oinume/algo&#34;&gt;algo&lt;/a&gt;というリポジトリでアルゴリズムやり直してるけど、ハッシュをソラで実装するのがギリギリできるかぐらいだった。&lt;/p&gt;&#xA;&lt;h3 id=&#34;機械学習を勉強する&#34;&gt;機械学習を勉強する&lt;/h3&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;ライブラリやフレームワークを使ってちょいちょいできるぐらいになってたい。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;これも未達。CourseraのMachineLearningのコース受けたけど挫折…&lt;/p&gt;&#xA;&lt;h3 id=&#34;何かサービスを一つ作る&#34;&gt;何かサービスを一つ作る&lt;/h3&gt;&#xA;&lt;p&gt;これは&lt;a href=&#34;https://www.lekcije.com&#34;&gt;lekcije&lt;/a&gt;というサービス作ったので達成。マイナーなニーズにもかかわらず、リリースしてから1ヶ月で40人の人に使ってもらえてるのが嬉しい！ただ、サービスを作っていると無限にやりたいことが出てきて、本来やりたかった勉強の時間をついつい開発の時間にあててしまうのが悩みどころ...&lt;/p&gt;&#xA;&lt;h3 id=&#34;今年こそdocker&#34;&gt;今年こそDocker&lt;/h3&gt;&#xA;&lt;p&gt;仕事とプライベートでは軽く使っているので達成かな。基本的なところをもっと理解しないと。&lt;/p&gt;&#xA;&lt;h3 id=&#34;抱負以外でやったこと&#34;&gt;抱負以外でやったこと&lt;/h3&gt;&#xA;&lt;h4 id=&#34;webdb-pressの特集書いた&#34;&gt;Web+DB Pressの特集書いた&lt;/h4&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://gihyo.jp/magazine/wdpress/archive/2016/vol93&#34;&gt;Web+DB Press Vol.93&lt;/a&gt;に前職の同僚とSQLの高速化について記事を書いた。ものを書くのは人生で2回めだったのである程度はわかっているつもりだったけど、想像を絶する大変さで5月の休日をほぼ全部これに費やしてしまった。でもSQLのチューニングについて自分の理解が甘いところも理解を深めることができたのでありがたい機会だった。あと、最近の執筆活動はGitHubで原稿の管理ができるので進捗管理や共同作業は楽だなぁと思った！&lt;/p&gt;&#xA;&lt;h4 id=&#34;advent-calendar&#34;&gt;Advent Calendar&lt;/h4&gt;&#xA;&lt;p&gt;Advent Calendarを3本書いた。&lt;a href=&#34;http://qiita.com/advent-calendar/2016/heroku&#34;&gt;Herokuのヤツ&lt;/a&gt;はまだ欠けているところがあるので、これからでもネタ考えて埋めたい。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://oinume.hatenablog.com/entry/heroku-custom-clock-processes&#34;&gt;Better Heroku Schedulerを探したらCustom clock processesにたどり着いた - oinume journal&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://oinume.hatenablog.com/entry/what-i-like-about-heroku&#34;&gt;Herokuの好きなところ - oinume journal&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://oinume.hatenablog.com/entry/e2e-test-with-agouti-in-go&#34;&gt;WebアプリケーションのE2EテストをGoで書く - oinume journal&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;oss活動&#34;&gt;OSS活動&lt;/h4&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/oinume/tomahawk&#34;&gt;tomahawk&lt;/a&gt;を少しメンテナンスしたのと、他の人のライブラリに軽く&lt;a href=&#34;https://github.com/jpillora/go-ogle-analytics/pull/5&#34;&gt;プルリク&lt;/a&gt;したぐらい。来年はもっとちゃんとした機能追加や改善のプルリクを送りたいなぁ。&lt;/p&gt;&#xA;&lt;h4 id=&#34;プログラミング言語&#34;&gt;プログラミング言語&lt;/h4&gt;&#xA;&lt;p&gt;プログラミング言語についてはずっとGoをやっていて、もうかれこれ2.5年ぐらいGoを書いてる。Pythonをプライベートでもほぼ書かなくなってしまったのでこっちもリハビリしないと。&lt;/p&gt;&#xA;&lt;h3 id=&#34;まとめ&#34;&gt;まとめ&lt;/h3&gt;&#xA;&lt;p&gt;今年は歳のせいか地味に体を壊すことが多くて、体調回りで苦労することが多かった。運動してないせいで体力が落ちているのが一番問題だと思っているので、来年はランニングまたは筋トレを本腰入れてやるつもり。一方で、家族は大きな病気をすることもなく元気に過ごせていたのが一番ありがたかった。2017年は健康を第一に、体力をつけて仕事も私生活もハードワークできるようにしたい。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>2016年に読んだ本</title>
				<link>https://journal.lampetty.net/posts/read-books-in-2016/</link>
				<pubDate>Sat, 31 Dec 2016 23:20:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/read-books-in-2016/</guid>
				<description>&lt;p&gt;本当は「2016年に買ったもの」という記事を書こうと思ったけど、日用品以外で買ったものがあまりなかったので読んだ本(技術書以外)を晒してみる。&lt;/p&gt;&#xA;&lt;h3 id=&#34;ヒューマンエラーを防ぐ知恵-ミスはなくなるか&#34;&gt;ヒューマンエラーを防ぐ知恵 ミスはなくなるか&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4022617691/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/51n4GA7lNrL._SL160_.jpg&#34; alt=&#34;ヒューマンエラーを防ぐ知恵 ミスはなくなるか (朝日文庫)&#34; loading=&#34;lazy&#34; title=&#34;ヒューマンエラーを防ぐ知恵 ミスはなくなるか (朝日文庫)&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4022617691/kazzhomeunixo-22/&#34;&gt;ヒューマンエラーを防ぐ知恵 ミスはなくなるか (朝日文庫)&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: 中田亨&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: 朝日新聞出版&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2013/07/05&lt;/li&gt;&#xA;&lt;li&gt;メディア: 文庫&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4022617691/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (2件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;仕事でケアレスミスを連発していた時期になんとかせねばと思い購入。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;実際の事故を分析するには、原因の分類よりも原因の結合を考えるべき。事故は人間・機械・職場の態勢などが複合して起こる。&lt;/li&gt;&#xA;&lt;li&gt;決別遷移(事故につながる状態への遷移)を全て洗い出し、この決別遷移に至らないように予防する&lt;/li&gt;&#xA;&lt;li&gt;小さな事故が大きな事故に発展しないようにする&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;などなど。メモを見返すと本当に参考になる。&lt;/p&gt;&#xA;&lt;h3 id=&#34;新版-大統領にしらせますか&#34;&gt;新版 大統領にしらせますか？&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4102161104/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/51ETDKDxYHL._SL160_.jpg&#34; alt=&#34;新版 大統領に知らせますか? (新潮文庫)&#34; loading=&#34;lazy&#34; title=&#34;新版 大統領に知らせますか? (新潮文庫)&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4102161104/kazzhomeunixo-22/&#34;&gt;新版 大統領に知らせますか? (新潮文庫)&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: ジェフリーアーチャー,ジェフリー・アーチャー,永井淳&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: 新潮社&lt;/li&gt;&#xA;&lt;li&gt;発売日: 1987/09&lt;/li&gt;&#xA;&lt;li&gt;メディア: 文庫&lt;/li&gt;&#xA;&lt;li&gt;購入: 1人 クリック: 6回&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4102161104/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (11件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;昔よく読んでいたジェフリー・アーチャーの小説。知人と昔好きだった作家の話になり懐かしくてつい購入。息もつかせぬ展開でおもしろい。&lt;/p&gt;&#xA;&lt;h3 id=&#34;学力の経済学&#34;&gt;学力の経済学&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B00ZTXKHQ0/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/51wRTLN8tFL._SL160_.jpg&#34; alt=&#34;「学力」の経済学&#34; loading=&#34;lazy&#34; title=&#34;「学力」の経済学&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B00ZTXKHQ0/kazzhomeunixo-22/&#34;&gt;「学力」の経済学&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: 中室牧子&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: ディスカヴァー・トゥエンティワン&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2015/06/17&lt;/li&gt;&#xA;&lt;li&gt;メディア: Kindle版&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/B00ZTXKHQ0/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (6件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;話題になっていたので読んでみた。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;ご褒美で釣るのはいいのか悪いのか？&lt;/li&gt;&#xA;&lt;li&gt;褒めてのばすのは本当にいいのか？&lt;/li&gt;&#xA;&lt;li&gt;テレビやゲームは学力に悪影響があるのか？&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;などなど、気になるトピックがたくさんあって今後の子育てをする上でめちゃめちゃ参考になった。&lt;/p&gt;&#xA;&lt;h3 id=&#34;池上彰の日本の教育がよくわかる本&#34;&gt;池上彰の「日本の教育」がよくわかる本&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B00KR19QOS/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/51ARZMRt20L._SL160_.jpg&#34; alt=&#34;池上彰の「日本の教育」がよくわかる本 (PHP文庫)&#34; loading=&#34;lazy&#34; title=&#34;池上彰の「日本の教育」がよくわかる本 (PHP文庫)&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B00KR19QOS/kazzhomeunixo-22/&#34;&gt;池上彰の「日本の教育」がよくわかる本 (PHP文庫)&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: 池上彰&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: PHP研究所&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2014/06/13&lt;/li&gt;&#xA;&lt;li&gt;メディア: Kindle版&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/B00KR19QOS/kazzhomeunixo-22&#34;&gt;この商品を含むブログを見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;子供が生まれたせいか、最近教育業界が気になるので購入。日本の教育回りの仕組み(学校、教育委員会、日教組)がわかりやすくまとめられていてよかった。海外との比較もされていて、例えば、教育大国のフィンランドの給食はパンとスープだけなのに、日本の給食は栄養バランスがよく考えられていてすごいらしい。&lt;/p&gt;&#xA;&lt;h3 id=&#34;週刊ダイヤモンド-2016年1112号&#34;&gt;週刊ダイヤモンド 2016年11/12号&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B01MSH5DE6/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/615GPh2teNL._SL160_.jpg&#34; alt=&#34;週刊ダイヤモンド 2016年11/12号 ［雑誌］&#34; loading=&#34;lazy&#34; title=&#34;週刊ダイヤモンド 2016年11/12号 ［雑誌］&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B01MSH5DE6/kazzhomeunixo-22/&#34;&gt;週刊ダイヤモンド 2016年11/12号 ［雑誌］&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: ダイヤモンド社&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: ダイヤモンド社&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2016/11/07&lt;/li&gt;&#xA;&lt;li&gt;メディア: Kindle版&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/B01MSH5DE6/kazzhomeunixo-22&#34;&gt;この商品を含むブログを見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;「疲労の正体」という特集が気になったので購入。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;疲労の正体は乳酸ではなく活性酸素。人間は細胞内で酸素を燃焼させてエネルギーにするが、この時生成される副産物が活性酸素。運動などによる負荷の場合は筋肉の細胞が、ストレスなど精神的な負荷の場合は脳や神経細胞がダメージを受ける。&lt;/li&gt;&#xA;&lt;li&gt;疲れているのに眠れない、は自律神経中枢の機能の乱れ。自律神経は緊張、運動、覚醒機能を司る交感神経と、リラックス、休息、睡眠機能を司る副交感神経の二つで構成され、スイッチすることで体内のバランスを保っている。昼間は交感神経、夜には副交感神経に切り替えるが、ストレスや明るい光にさらされると副交感神経に切り替えられずに疲れているけど眠れないという状況になる。&lt;/li&gt;&#xA;&lt;li&gt;好きな趣味ややりがいのある仕事をしているときは疲れを感じない。これはやりがい、達成感、喜びを感じていると前頭葉が疲労伝達物質をかき消してしまい、疲れを感じなくなってしまう&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;暴露スノーデンが私に託したファイル&#34;&gt;暴露:スノーデンが私に託したファイル&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B00K7Z67KK/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/51qjDQMyfpL._SL160_.jpg&#34; alt=&#34;暴露―スノーデンが私に託したファイル―&#34; loading=&#34;lazy&#34; title=&#34;暴露―スノーデンが私に託したファイル―&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B00K7Z67KK/kazzhomeunixo-22/&#34;&gt;暴露―スノーデンが私に託したファイル―&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: グレン・グリーンウォルド&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: 新潮社&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2014/05/14&lt;/li&gt;&#xA;&lt;li&gt;メディア: Kindle版&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/B00K7Z67KK/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (3件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;NSAやCIAで働いていたエドワード・スノーデンが暴いたNSAによる国民監視について、膨大な資料をまとめたもの。シチズンフォーという映画を見て、とても面白かったのでこの本も読んでみた。映画は2時間という時間の制約上あまり語られていなかった監視の実態が淡々と書かれている。FacebookやGoogleやMicrosoftがNSAに協力してバックドアを仕掛けたり、自社のサーバーにNSAがアクセスできるようにしているらしい。もうインターネットが信じられなくなった。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://itunes.apple.com/jp/movie/shichizunfo-sunodenno-bao/id1173746917?uo=4&amp;amp;at=1l3v8Do&#34;&gt;&lt;img src=&#34;http://cdn.image.st-hatena.com/image/scale/c02d4d82224ad1540da84729a3d4f0120bc73d6c/enlarge=0;height=200;version=1;width=200/http%3A%2F%2Fis3.mzstatic.com%2Fimage%2Fthumb%2FVideo51%2Fv4%2F9c%2F67%2F16%2F9c671607-6ae1-2a64-b892-befd3795e4b9%2Fsource%2F100x100bb.jpg&#34; alt=&#34;シチズンフォー スノーデンの暴露(字幕版)&#34; loading=&#34;lazy&#34; title=&#34;シチズンフォー スノーデンの暴露(字幕版)&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://itunes.apple.com/jp/movie/shichizunfo-sunodenno-bao/id1173746917?uo=4&amp;amp;at=1l3v8Do&#34;&gt;シチズンフォー スノーデンの暴露(字幕版)&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;ローラ・ポイトラス&lt;/li&gt;&#xA;&lt;li&gt;ドキュメンタリー&lt;/li&gt;&#xA;&lt;li&gt;¥2000&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://itunes.apple.com/jp/movie/shichizunfo-sunodenno-bao/id1173746917?uo=4&amp;amp;at=1l3v8Do&#34;&gt;&lt;img src=&#34;https://cdn.blog.st-hatena.com/images/theme/itunes/itunes-badge-itunes@2x.png&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>Herokuの好きなところ</title>
				<link>https://journal.lampetty.net/posts/what-i-like-about-heroku/</link>
				<pubDate>Thu, 22 Dec 2016 08:30:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/what-i-like-about-heroku/</guid>
				<description>&lt;p&gt;これは&lt;a href=&#34;http://qiita.com/advent-calendar/2016/heroku&#34;&gt;Heroku Advent Calendar 2016&lt;/a&gt;の13日目の記事です。個人的にHerokuを使い続けてはや3年。仕事でヘビーに使っているわけではないけど、Herokuの好きなところを挙げてみます。&lt;/p&gt;&#xA;&lt;h3 id=&#34;ディプロイが楽&#34;&gt;ディプロイが楽&lt;/h3&gt;&#xA;&lt;p&gt;ディプロイが&lt;code&gt;git push heroku master&lt;/code&gt;で済むのは本当に楽。一昔前だったらディプロイスクリプトを用意しなくてはいけなかったけど、コマンド一つでディプロイできるようになった。というか今だとGitHubでmasterブランチにマージさえすれば勝手にディプロイされるようにもできる。&lt;/p&gt;&#xA;&lt;h3 id=&#34;アドオン&#34;&gt;アドオン&lt;/h3&gt;&#xA;&lt;p&gt;これも月並みな感想だけど、heroku addons:add でアドオンを追加して、アプリケーションに組み込むことができるのが楽。さらに、&lt;code&gt;heroku addons:open &amp;lt;addon&amp;gt;&lt;/code&gt;を実行するとブラウザが立ち上がってログイン状態でそのアドオンの管理画面に行けるのも地味にすごい。&lt;/p&gt;&#xA;&lt;p&gt;ちなみに自分がどんなアプリケーションでも使っているアドオンは&lt;a href=&#34;https://papertrailapp.com/&#34;&gt;papertrail&lt;/a&gt;。↓のような感じでブラウザからログを検索できて、S3にもアーカイブ保存できたりして便利。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.flickr.com/photos/oinume/30938457974/in/dateposted-public/&#34; title=&#34;papertrail&#34;&gt;&lt;img src=&#34;https://c7.staticflickr.com/1/298/30938457974_4da449c397.jpg&#34; alt=&#34;papertrail&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;無料で使える&#34;&gt;無料で使える&lt;/h3&gt;&#xA;&lt;p&gt;1つのWebアプリを動かすのであれば、24時間稼働させても無料枠内でタダで使えるのも個人的には嬉しい。&lt;/p&gt;&#xA;&lt;h3 id=&#34;イマイチなところ&#34;&gt;イマイチなところ&lt;/h3&gt;&#xA;&lt;p&gt;もちろんHerokuも100%完璧ではなくて、イマイチなところもある。個人的に不満なのは以下。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;日本リージョンが無料では使えない&#xA;&lt;ul&gt;&#xA;&lt;li&gt;US-eastかEUしかリージョンが選べないので、日本からだとレイテンシがやっぱり気になる。Heroku Private SpacesにはTokyo regionもあるけど有料なので業務じゃないと使えなさそう。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;CDN的な機能がない&#xA;&lt;ul&gt;&#xA;&lt;li&gt;addonで組み込むことはできるけど、これぐらいはデフォルトであると嬉しい&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;最後に&#34;&gt;最後に&lt;/h3&gt;&#xA;&lt;p&gt;Herokuを使い続けて思うのは「アプリケーションの開発に集中できる」という点。この目的のためにすごく色んなところを頑張ってるんだろうなぁと思う。PaaSはなかなか収益的に厳しそうだけど、素晴らしいサービスなのでこれからも頑張って欲しい！&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>WebアプリケーションのE2EテストをGoで書く</title>
				<link>https://journal.lampetty.net/posts/e2e-test-with-agouti-in-go/</link>
				<pubDate>Sun, 18 Dec 2016 23:21:56 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/e2e-test-with-agouti-in-go/</guid>
				<description>&lt;p&gt;これは&lt;a href=&#34;http://qiita.com/advent-calendar/2016/go&#34;&gt;Go Advent Calendar 2016&lt;/a&gt;の18日目の記事です。今回はGoでE2Eテストを行うためのライブラリ&lt;a href=&#34;http://agouti.org/&#34;&gt;agouti&lt;/a&gt;について書きます。&lt;/p&gt;&#xA;&lt;h3 id=&#34;goでe2eテストを書く理由&#34;&gt;GoでE2Eテストを書く理由&lt;/h3&gt;&#xA;&lt;p&gt;WebアプリケーションのサーバーサイドをGoで書いている場合、GoでE2Eテストを書くメリットとして&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;JavaScriptが得意ではないエンジニア(自分)でもE2Eテストがガリガリかける&lt;/li&gt;&#xA;&lt;li&gt;E2Eテスト実行時のカバレッジが取れる＝サーバーのコードのどこを通ったかがわかる&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;があると思っている。特に2番めの理由が大事で、「E2Eテストを全部回した結果、サーバーのこの部分のコードは通っている」とわかるのはけっこう大きなメリットなのではないかと。どこがテストされている・いないを把握することで、「ここはE2Eテストだと難しいからユニットテストでカバーしよう」というような戦法が取りやすいと思う。&lt;/p&gt;&#xA;&lt;p&gt;じゃあ具体的にGoでどうやってE2Eテストを書くのか、ということを次に説明する。&lt;/p&gt;&#xA;&lt;h3 id=&#34;go製webdriverクライアントagouti&#34;&gt;Go製WebDriverクライアントagouti&lt;/h3&gt;&#xA;&lt;p&gt;Goには&lt;a href=&#34;http://agouti.org/&#34;&gt;agouti&lt;/a&gt;という&lt;a href=&#34;http://www.seleniumhq.org/projects/webdriver/&#34;&gt;Selenium WebDriver&lt;/a&gt;のクライアントがあるので、今回はこれを使う。agouti自体は単にWebブラウザを操作するライブラリなので、あわせてChromeDriverなどをインストールする必要がある。MacにChromeDriverをインストールするのはHomebrewで&lt;code&gt;brew install chromedriver&lt;/code&gt;してインストールするのが楽で、それ以外のOSでは&lt;a href=&#34;https://sites.google.com/a/chromium.org/chromedriver/&#34;&gt;ChromeDriverのサイト&lt;/a&gt;からダウンロードしてすればOK。&lt;/p&gt;&#xA;&lt;p&gt;一例として、下記のようなagoutiを使うGoのコードを書いて動かすと、Chromeが起動して &lt;a href=&#34;https://ifconfig.co/&#34;&gt;https://ifconfig.co/&lt;/a&gt; のページが表示されて5秒スリープする。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    webDriver := agouti.ChromeDriver() // ChromeDriverを使う&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    if err := webDriver.Start(); err != nil {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        return err&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    defer webDriver.Stop()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    page, err := webDriver.NewPage()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    if err != nil {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        t.Error(err)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    // Navigateで指定したURLにアクセスする&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    if err := page.Navigate(&amp;#34;https://ifconfig.co/&amp;#34;); err != nil {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        t.Error(err)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    time.Sleep(5 * time.Second)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;agoutiでwebアプリケーションをテストする&#34;&gt;agoutiでWebアプリケーションをテストする&lt;/h3&gt;&#xA;&lt;p&gt;もう少し実践的な例として、フォームに入力された値を表示する簡単なWebアプリをテストするケースを考える。ディレクトリ構成は&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;cmd: サーバーの実行ファイル用&lt;/li&gt;&#xA;&lt;li&gt;app: Webアプリケーションの本体&lt;/li&gt;&#xA;&lt;li&gt;e2e: E2Eテスト置き場&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;という感じになっていて、全てのコードは&lt;a href=&#34;https://github.com/oinume/go-e2e-test-sample/&#34;&gt;go-e2e-test-sample&lt;/a&gt;のリポジトリに上げてある。&lt;/p&gt;&#xA;&lt;p&gt;この、単にフォームで送信された名前を表示するだけのWebアプリケーションのコードはこんな感じ。&lt;/p&gt;&#xA;&lt;p&gt;そして、E2Eテストのコードはこんな感じ。&lt;code&gt;TestIndex&lt;/code&gt;で&lt;code&gt;/&lt;/code&gt;にアクセスしている。&lt;/p&gt;&#xA;&lt;p&gt;ポイントとしては&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;testMainでサーバーとChromeDriverを起動&lt;/li&gt;&#xA;&lt;li&gt;TestIndex関数内で&lt;code&gt;webDriver.NewPage&lt;/code&gt;でPageを生成し、Page.Navigateで起動したサーバーのURLにアクセス&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Page.FindByXPath&lt;/code&gt;でHTMLの要素を検索してformをSubmit&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;というような流れになっている。なお、今回はXPathを使ってHTMLの要素を検索しているが、CSS Selectorを使うFindなんかもある。詳しくは&lt;a href=&#34;https://godoc.org/github.com/sclevine/agouti&#34;&gt;godoc&lt;/a&gt;を見れば詳しく書いてある。&lt;/p&gt;&#xA;&lt;p&gt;そして、この&lt;code&gt;e2e_test.go&lt;/code&gt;を&lt;code&gt;go test&lt;/code&gt;コマンドで実行すると、Chromeが立ち上がってテストが実行される。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ go test -v ./e2e&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;カバレッジを取ってみる&#34;&gt;カバレッジを取ってみる&lt;/h3&gt;&#xA;&lt;p&gt;では次にカバレッジを取って、どの部分がE2Eテストによって実行されているのかを調べてみる。go testの引数に&lt;code&gt;-coverpkg&lt;/code&gt;と&lt;code&gt;-coverprofile&lt;/code&gt;をつけて実行する。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ go test -v -cover -coverpkg=./app -coverprofile=cover.out ./e2e&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これで&lt;code&gt;cover.out&lt;/code&gt;にカバレッジのためのファイルができるので、&lt;code&gt;go tool cover&lt;/code&gt;でHTMLとして表示してみる。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;go&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;tool&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cover&lt;/span&gt;  &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;html&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cover&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;out&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ブラウザが立ち上がって下記のような画面が表示されるので、今回のE2Eテストで実行されているコードがひと目でわかる。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.flickr.com/photos/oinume/30879111884/in/dateposted-public/&#34; title=&#34;go_tool_cover_html&#34;&gt;&lt;img src=&#34;https://c5.staticflickr.com/1/707/30879111884_c1b336bb29_c.jpg&#34; alt=&#34;go_tool_cover_html&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;まとめ&#34;&gt;まとめ&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;agouti便利&lt;/li&gt;&#xA;&lt;li&gt;go testでE2Eテストを実行できるようにしておくと&lt;code&gt;go tool cover&lt;/code&gt;などのGoエコシステムがそのまま使える&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>Better Heroku Schedulerを探したらCustom clock processesにたどり着いた</title>
				<link>https://journal.lampetty.net/posts/heroku-custom-clock-processes/</link>
				<pubDate>Sun, 11 Dec 2016 23:12:19 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/heroku-custom-clock-processes/</guid>
				<description>&lt;p&gt;これは&lt;a href=&#34;http://qiita.com/advent-calendar/2016/heroku&#34;&gt;Heroku Advent Calendar 2016&lt;/a&gt;の11日目の記事です。&lt;/p&gt;&#xA;&lt;p&gt;Herokuでは&lt;a href=&#34;https://devcenter.heroku.com/articles/scheduler&#34;&gt;Heroku Scheduler&lt;/a&gt;というcronのようなサービスがあるのですが、使い込むうちに「Daily, Hourly, Every 10 minutesの単位でしかジョブを動かせない」という制限がつらくなってきたので、より良い代替である&lt;a href=&#34;https://devcenter.heroku.com/articles/scheduled-jobs-custom-clock-processes&#34;&gt;Custom clock processes&lt;/a&gt;を試してみたという話。&lt;/p&gt;&#xA;&lt;h3 id=&#34;custom-clock-processesとは&#34;&gt;Custom clock processesとは？&lt;/h3&gt;&#xA;&lt;p&gt;clockというプロセスを立ち上げっぱなしにして、そのプロセス内でスケジューリングされたジョブを実行する仕組み。Heroku Schedulerは実行される時だけプロセスが立ち上がるけど、clockの場合は常にプロセスが常駐する。&lt;/p&gt;&#xA;&lt;h3 id=&#34;各言語のscheduler&#34;&gt;各言語のScheduler&lt;/h3&gt;&#xA;&lt;p&gt;HerokuのCustom clock processesのドキュメントで触れられているのはJavaとPythonの2種類だけど、各言語ごとにだいたいcron likeなSchedulerが用意されている。今回は自分が慣れているPythonのAPSchedulerを試してみた。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Java: &lt;a href=&#34;http://www.quartz-scheduler.org/&#34;&gt;quartz&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Python: &lt;a href=&#34;https://pypi.python.org/pypi/APScheduler&#34;&gt;APScheduler&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Ruby: &lt;a href=&#34;https://rubygems.org/gems/clockwork/&#34;&gt;clockwork&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Node.js: &lt;a href=&#34;https://www.npmjs.com/package/node-cron&#34;&gt;node-cron&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Perl: &lt;a href=&#34;http://search.cpan.org/dist/Schedule-Cron/lib/Schedule/Cron.pm&#34;&gt;Schedule::Cron&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;apschedulerの設定&#34;&gt;APSchedulerの設定&lt;/h3&gt;&#xA;&lt;p&gt;まずPythonのモジュールのインストールのために、&lt;code&gt;requirements.txt&lt;/code&gt;というファイルを用意する。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;echo APScheduler &amp;gt; requirements.txt&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;次にProcfileに以下を追記する。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;clock: python clock.py&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ここで指定されている&lt;code&gt;clock.py&lt;/code&gt;がジョブの設定が書かれたファイルになる。どのように記述するべきか、詳しくは&lt;a href=&#34;https://apscheduler.readthedocs.io/en/latest/&#34;&gt;公式のドキュメント&lt;/a&gt;に書かれている。以下は1分毎に&lt;code&gt;hello world&lt;/code&gt;を出力する設定。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;from apscheduler.schedulers.blocking import BlockingScheduler&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import subprocess&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;scheduler = BlockingScheduler()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;@scheduler.scheduled_job(&amp;#39;interval&amp;#39;, minutes=1)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;def timed_job():&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    print(&amp;#34;Run notifier&amp;#34;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    subprocess.run(&amp;#34;hello world&amp;#34;, shell=True, check=True)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;scheduler.start()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;最後に、APSchedulerを動かすのにはPythonが必要なので、buildpackを追加。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;heroku buildpacks:add https://github.com/heroku/heroku-buildpack-python&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;あとはclock.pyをコミットしてディプロイすればOK。&lt;/p&gt;&#xA;&lt;h3 id=&#34;ローカルで試したい場合&#34;&gt;ローカルで試したい場合&lt;/h3&gt;&#xA;&lt;p&gt;ローカルで試してみたい場合は以下のようにAPSchedulerをインストールして、clock.pyを直接呼び出せばOK。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pip install -r requirements.txt&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;python ./clock.py&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;custom-clock-processesとfree-dyno-hours&#34;&gt;Custom clock processesとFree Dyno Hours&lt;/h3&gt;&#xA;&lt;p&gt;Heroku Schedulerは実行する際にプロセスが起動されて、プロセスが動いていた時間だけ無料分のFree Dyno Hoursを消費するのだけど、custom clock processesはworkerのようにclockプロセスが常駐する形になるので、起動していた時間分だけFree Dyno Hoursを消費するようなので注意が必要。webと併用していると倍速でFree Dyno Hoursを消費するので気をつけましょう。&lt;/p&gt;&#xA;&lt;h3 id=&#34;まとめ&#34;&gt;まとめ&lt;/h3&gt;&#xA;&lt;p&gt;Heroku Schedulerよりきめ細かい時限式のジョブを定義したいときはCustom clock processesを使おう！&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>mysqldumpで特定のレコードだけエクスポートする</title>
				<link>https://journal.lampetty.net/posts/mysqldump-option-where/</link>
				<pubDate>Thu, 08 Dec 2016 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/mysqldump-option-where/</guid>
				<description>&lt;h3 id=&#34;忙しい人向けまとめ&#34;&gt;忙しい人向けまとめ&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;mysqldumpの&lt;code&gt;--where&lt;/code&gt;オプションを使うと特定のレコードだけmysqldumpできる&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;--where&lt;/code&gt;には&lt;code&gt;LIMIT&lt;/code&gt;句も指定できる&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;--where&lt;/code&gt;オプションで大量のデータから一部だけをmysqldumpすることが可能&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;本文&#34;&gt;本文&lt;/h3&gt;&#xA;&lt;p&gt;mysqldump、データだけエクスポートしたりCREATE TABLEだけエクスポートできたり細かいところまで気が利いているなぁと思うツール。今日知ったのは &lt;code&gt;--where&lt;/code&gt;でdumpするレコードを限定できるよ、ということ。さらに、&lt;code&gt;--where&lt;/code&gt;にはLIMITも指定できるので、「特定の条件にマッチするレコード100件だけ」みたいなエクスポートもできる。&lt;/p&gt;&#xA;&lt;p&gt;以下、具体例。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ mysql -u &amp;lt;user&amp;gt; -p&amp;lt;password&amp;gt; &amp;lt;database&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mysql&amp;gt; CREATE TABLE hoge (&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  id INT NOT NULL,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  name VARCHAR(255) NOT NULL,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  PRIMARY KEY (id)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mysql&amp;gt; INSERT INTO hoge VALUES (1, &amp;#39;foo&amp;#39;), (2, &amp;#39;bar&amp;#39;), (3, &amp;#39;baz&amp;#39;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;こんな感じでレコードを作って、&lt;code&gt;--where &#39;id=1&#39;&lt;/code&gt;を指定してmysqldumpしてみる。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;mysql&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mysqldump&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;u&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;user&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;password&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;database&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;hoge&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;--where &amp;#39;id=1&amp;#39;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;snip&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;LOCK&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kp&#34;&gt;TABLES&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;hoge&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;WRITE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;/*!40000 ALTER TABLE `hoge` DISABLE KEYS */&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;INSERT&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;INTO&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;hoge&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;VALUES&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;foo&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;/*!40000 ALTER TABLE `hoge` ENABLE KEYS */&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;UNLOCK&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kp&#34;&gt;TABLES&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;snip&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;id=1&lt;/code&gt;のレコードだけmysqldumpされる。では次にORDER BYとLIMITをつけてみる。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;mysql&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mysqldump&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;u&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;user&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;password&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;database&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;hoge&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;--where &amp;#39;id&amp;gt;=2 ORDER BY id DESC LIMIT 1&amp;#39;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;snip&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;INSERT&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;INTO&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;hoge&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;VALUES&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;baz&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;snip&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;となって、idの降順でソートして1件だけmysqldumpができた。&lt;/p&gt;&#xA;&lt;h3 id=&#34;まとめ&#34;&gt;まとめ&lt;/h3&gt;&#xA;&lt;p&gt;プログラムの動作検証のためにデータをmysqldumpしたいけど、本番データだとレコード数が多くて丸ごとmysqldumpするのがつらい時に&lt;code&gt;--where&lt;/code&gt;をつけると幸せになれるはず。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>新しいMacで設定している項目 - macOS Sierra編</title>
				<link>https://journal.lampetty.net/posts/mac-settings-on-sierra/</link>
				<pubDate>Mon, 05 Dec 2016 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/mac-settings-on-sierra/</guid>
				<description>&lt;p&gt;5年間MacBookPro 13-inch, Early 2011のRetinaじゃないヤツをSSD変えたりして延命しつつ使ってたのだけど、さすがに限界だったので新しいMacBookPro 13inch Retina のTouchBarなしモデルを買った。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B01MRGSA71/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/41CXe6W3D3L._SL160_.jpg&#34; alt=&#34;Apple MacBook Pro 256GB SSD 13インチ Retina Displayモデル Core i5 2.0GHz アップル MLL42J/A スペースグレイ MLL42JA&#34; loading=&#34;lazy&#34; title=&#34;Apple MacBook Pro 256GB SSD 13インチ Retina Displayモデル Core i5 2.0GHz アップル MLL42J/A スペースグレイ MLL42JA&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B01MRGSA71/kazzhomeunixo-22/&#34;&gt;Apple MacBook Pro 256GB SSD 13インチ Retina Displayモデル Core i5 2.0GHz アップル MLL42J/A スペースグレイ MLL42JA&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;出版社/メーカー: アップル&lt;/li&gt;&#xA;&lt;li&gt;メディア:&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/B01MRGSA71/kazzhomeunixo-22&#34;&gt;この商品を含むブログを見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;久しぶりに自宅のMacをセットアップしたので、やったことをメモしておこうかなと。キーバインドを変えるために使っていたKarabinerがSierraでは使えなくなっていたのがつらかった。&lt;/p&gt;&#xA;&lt;h3 id=&#34;トラックパッドでタップだけでクリックできるようにする&#34;&gt;トラックパッドでタップだけでクリックできるようにする&lt;/h3&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;システム環境設定 -&amp;gt; トラックパッド -&amp;gt; タップでクリック&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;これを有効にするとトラックパッドでクリックしなくてもよくなるので楽。&lt;/p&gt;&#xA;&lt;h3 id=&#34;トラックパッドでの右クリック&#34;&gt;トラックパッドでの右クリック&lt;/h3&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;システム環境設定 -&amp;gt; トラックパッド -&amp;gt; 副ボタンのクリック(右下隅)&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;自分は2本指でやるのは苦手なので&lt;code&gt;副ボタンのクリック(右下隅)&lt;/code&gt;にしている。ただ、新しいMacBookProだとトラックパッドが大きいので右下隅のタップだとつらいかもしれない。&lt;/p&gt;&#xA;&lt;h3 id=&#34;キーのリピート速度&#34;&gt;キーのリピート速度&lt;/h3&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;システム環境設定 -&amp;gt; キーボード&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;下記の設定のスライダーを一番右にする。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;キーのリピート速度&lt;/li&gt;&#xA;&lt;li&gt;リピート入力認識までの時間&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;ただ、これでも遅いのでさらに速くしたい場合はKarabinerまたはSierraの場合はKarabiner Elementsを使って設定する。&lt;/p&gt;&#xA;&lt;h3 id=&#34;karabiner-elementsでキーリピートをさらに速くする&#34;&gt;Karabiner Elementsでキーリピートをさらに速くする&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;El Capitan以前: &lt;a href=&#34;https://pqrs.org/osx/karabiner/index.html.ja&#34;&gt;Karabiner&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Sierra: &lt;a href=&#34;https://github.com/tekezo/Karabiner-Elements&#34;&gt;Karabiner-Elements&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;を使う。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;brew cask install karabiner&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;または&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;brew cask install karabiner-elements&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;でインストール可能。自分は下記のようにキーリピートの設定をしている。これでWindows並にカーソル移動や文字の削除が速くなる。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.flickr.com/photos/oinume/31414226825/in/dateposted-public/&#34; title=&#34;Karabiner-Elements&#34;&gt;&lt;img src=&#34;https://c2.staticflickr.com/6/5557/31414226825_a90b9bb642_z.jpg&#34; alt=&#34;Karabiner-Elements&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;たまにこれを設定しないでカーソル移動が激遅の人がいるので見つけたら教えてあげるようにしてる。&lt;/p&gt;&#xA;&lt;h3 id=&#34;同じアプリで別ウィンドウになっている場合の切り替えのショートカットをoption--tabにする&#34;&gt;同じアプリで別ウィンドウになっている場合の切り替えのショートカットをoption + tabにする&lt;/h3&gt;&#xA;&lt;p&gt;Chromeでたくさんウィンドウを開いていたりする場合にWindowsみたいに切り替えられるようにする。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;システム環境設定 -&amp;gt; キーボード&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;ショートカットタブのキーボードを選んで、&lt;code&gt;次のウィンドウを操作対象にする&lt;/code&gt;で&lt;code&gt;option + tab&lt;/code&gt;にする&lt;/p&gt;&#xA;&lt;h3 id=&#34;tabで全ての項目を移動できるようにする&#34;&gt;Tabで全ての項目を移動できるようにする&lt;/h3&gt;&#xA;&lt;p&gt;ショートカットタブでフルキーボードアクセスを&lt;code&gt;すべてのコントロールにチェック&lt;/code&gt;にする。こうしないとSafariとかでTabで移動するときにチェックボックスとかに移動できない。&lt;/p&gt;&#xA;&lt;h2 id=&#34;dockの設定&#34;&gt;Dockの設定&lt;/h2&gt;&#xA;&lt;p&gt;最近のPCは横幅が大きいので、下ではなく左に置く。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;サイズ小さめ&lt;/li&gt;&#xA;&lt;li&gt;拡大する&lt;/li&gt;&#xA;&lt;li&gt;画面上の位置：左&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;コンピュータ名を変える&#34;&gt;コンピュータ名を変える&lt;/h3&gt;&#xA;&lt;p&gt;デフォルトだと変な名前になっていることが多いので変える。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;共有 -&amp;gt; コンピュータ名&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;から変えられる。(なんでこんなわかりづらいところにあるのか...)&lt;/p&gt;&#xA;&lt;h2 id=&#34;finderのウィンドウタイトルでフルパスを表示する&#34;&gt;Finderのウィンドウタイトルでフルパスを表示する&lt;/h2&gt;&#xA;&lt;p&gt;ターミナルから下記のコマンドで設定できる。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;defaults write com.apple.finder _FXShowPosixPathInTitle -boolean true&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;スクリーンショットの保存先の変更&#34;&gt;スクリーンショットの保存先の変更&lt;/h3&gt;&#xA;&lt;p&gt;デフォルトだとデスクトップになっているが、このままだとデスクトップが悲惨なことになるので自分は&lt;code&gt;~/Documents/screenshot&lt;/code&gt;というディレクトリを作って保存するようにしている。ターミナルで以下のコマンドで設定できる。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;defaults write com.apple.screencapture location ~/Documents/screenshot&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# この設定を反映する&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;killall SystemUIServer&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;なお、以下のコマンドで設定値を削除することができる。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;defaults delete com.apple.screencapture location&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;最後に&#34;&gt;最後に&lt;/h3&gt;&#xA;&lt;p&gt;そろそろこの辺の手動設定をどうにかして自動化したい…&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>DMM英会話でお気に入りの先生の空きレッスンがあった時にメール通知するlekcijeというサービスを作った</title>
				<link>https://journal.lampetty.net/posts/introducing-lekcije/</link>
				<pubDate>Tue, 22 Nov 2016 09:30:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/introducing-lekcije/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;https://www.lekcije.com/&#34;&gt;www.lekcije.com&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.lekcije.com/&#34;&gt;lekcije&lt;/a&gt;という、DMM英会話で講師に空きレッスンがあった時にメール通知するサービスを作った。もともとは下記で書いたものがベースになっていて、これに画面を付け足したという感じ。毎日家に帰ってから自分の空き時間でチマチマ作っていたので半年ぐらいかかってしまった。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://oinume.hatenablog.com/entry/introducing-dmm-eikaiwa-tsc&#34;&gt;oinume.hatenablog.com&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;作った動機としては&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;DMM英会話はレッスンが終わらないと次の分の予約ができない&lt;/li&gt;&#xA;&lt;li&gt;人気の講師はすぐ予約が埋まってしまう&lt;/li&gt;&#xA;&lt;li&gt;でも意外とキャンセルが出るので、それを逃したくない&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;という感じ。もちろんお金をかければ1枚500円もするレッスンチケットを買いまくって予約するということはできるのだろうけど、さすがにそれは金銭的につらかったので技術で解決しようという試み。&lt;/p&gt;&#xA;&lt;h3 id=&#34;実装に関して&#34;&gt;実装に関して&lt;/h3&gt;&#xA;&lt;p&gt;本当はReactとかも使いたかったんだけど、どうしても時間が取れなくてSPA的なモノは諦めて、サーバーサイドでHTMLを生成するというオールドタイプな実装になっている。Herokuを使っているのでアメリカの東海岸からHTMLが配信されるのがつらいけど、静的ファイルはHTTP2を使って配信するようにしてパフォーマンス面には気を遣った。&lt;/p&gt;&#xA;&lt;p&gt;久しぶりにWebサービスを作ったのだけど、普段の仕事ではサーバーサイドのコードしか書かないので、ロゴ作ったりキャッチコピー考えたりすることはいい勉強になった。プロの人はすごいなぁと思うばかりです。というわけで、DMM英会話をやっている人がいたらぜひ使ってみて下さい。&lt;/p&gt;&#xA;&lt;h3 id=&#34;使った技術&#34;&gt;使った技術&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;HTTP2&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Let&#39;s encryptでSSL証明書を取得&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Frontend&#xA;&lt;ul&gt;&#xA;&lt;li&gt;bootstrapだと素っ気ないので、&lt;a href=&#34;https://bootswatch.com/&#34;&gt;bootswatch&lt;/a&gt;を使った&lt;/li&gt;&#xA;&lt;li&gt;ビルドには&lt;a href=&#34;https://webpack.github.io/&#34;&gt;Webpack&lt;/a&gt;使った(つらい)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Server (Go)&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Web Applicaton Framework: &lt;a href=&#34;http://goji.io/&#34;&gt;goji&lt;/a&gt;を使ったけど、素のnet/httpでもよかったかもしれない。もはやルーティング回りしかgojiを使っていない&lt;/li&gt;&#xA;&lt;li&gt;ORMapper: &lt;a href=&#34;http://jinzhu.me/gorm/&#34;&gt;gorm&lt;/a&gt; (つらい)&lt;/li&gt;&#xA;&lt;li&gt;Vendoring: &lt;a href=&#34;https://github.com/Masterminds/glide&#34;&gt;glide&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Logging: &lt;a href=&#34;https://github.com/uber-go/zap&#34;&gt;uber-go/zap&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Scraping: &lt;a href=&#34;https://github.com/go-xmlpath/xmlpath&#34;&gt;xmlpath&lt;/a&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;goqueryのコールバックスタイルがどうも好きになれなかったので。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Hot reloading: &lt;a href=&#34;https://github.com/cespare/reflex&#34;&gt;reflex&lt;/a&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;開発時のホットリローディング&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Database: MySQL 5.7&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Database migration: goose使ったけど、sql-migrateにする予定&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;E2E test&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/sclevine/agouti&#34;&gt;agouti&lt;/a&gt;: Selenium WebDriver的なヤツ&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Nginx: 静的ファイルの配信&lt;/li&gt;&#xA;&lt;li&gt;メール送信: Sendgrid&lt;/li&gt;&#xA;&lt;li&gt;Heroku&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://ngrok.com/&#34;&gt;ngrok&lt;/a&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;スマホで動作確認したい時に便利過ぎた&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>コードリーディングのためのIntelliJ IDEAショートカット</title>
				<link>https://journal.lampetty.net/posts/intellij-shortcuts-for-reading-source-code/</link>
				<pubDate>Wed, 21 Sep 2016 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/intellij-shortcuts-for-reading-source-code/</guid>
				<description>&lt;p&gt;自分がソースコードを読む時によく使っているIntelliJのショートカット集。もちろんWebStormやAndroid StudioなどIntelliJシリーズなら全部使えるはず。他にもこんなのがあるよ、というのがあればコメントとかTwitterで教えてもらえると嬉しい。ちなみにショートカットのキーバインドはMac前提で書いてます。IntelliJのバージョンは&lt;code&gt;2016.2&lt;/code&gt;。&lt;/p&gt;&#xA;&lt;h3 id=&#34;f1-quick-documentation&#34;&gt;F1: Quick Documentation&lt;/h3&gt;&#xA;&lt;p&gt;キャレット上のシンボル(変数/関数)のドキュメントをポップアップで表示。自分は「これなんだろう？」って気になったらとりあえずF1押してる。&lt;/p&gt;&#xA;&lt;h3 id=&#34;opt--space-quick-definition&#34;&gt;Opt + Space: Quick Definition&lt;/h3&gt;&#xA;&lt;p&gt;Quick Documentationに加えて、キャレット上のシンボルのソースコードも含めて下記のようにポップアップで表示してくれる。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.flickr.com/photos/oinume/29721423972/in/dateposted-public/&#34; title=&#34;IntelliJ IDEA Quick Definition&#34;&gt;&lt;img src=&#34;https://c5.staticflickr.com/9/8206/29721423972_84221ddaaa_z.jpg&#34; alt=&#34;IntelliJ IDEA Quick Definition&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;cmd--p-parameter-info&#34;&gt;Cmd + P: Parameter Info&lt;/h3&gt;&#xA;&lt;p&gt;キャレット上の関数のパラメータ情報を表示。「この関数にこの値を渡しているけど、これはどういう引数なんだっけ？」を確認する時に使ってる。&lt;/p&gt;&#xA;&lt;h3 id=&#34;cmd--b-declaration&#34;&gt;Cmd + B: Declaration&lt;/h3&gt;&#xA;&lt;p&gt;キャレット上のシンボルの定義元にジャンプする。&lt;/p&gt;&#xA;&lt;h3 id=&#34;opt--cmd---back&#34;&gt;Opt + Cmd + ←: Back&lt;/h3&gt;&#xA;&lt;p&gt;Undo last navigation operation. 最後に使ったナビゲーションの操作を一つ戻る。自分は&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Cmd + Bで定義元にジャンプ&lt;/li&gt;&#xA;&lt;li&gt;確認したらOpt + Cmd+←で戻る&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;という感じでソースを読んでる。Ctrl + TabでSwitcherで戻るというやり方もあるそうなのでお好みで。&lt;/p&gt;&#xA;&lt;h3 id=&#34;opt--f7-find-usages&#34;&gt;Opt + F7: Find Usages&lt;/h3&gt;&#xA;&lt;p&gt;キャレット上のシンボルを使用している箇所を表示する。例えば以下のスクショだと、&lt;code&gt;errors.Internalf&lt;/code&gt;という関数を使っている箇所を表示している。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.flickr.com/photos/oinume/29186986394/in/dateposted-public/&#34; title=&#34;IntelliJ IDEA&#34;&gt;&lt;img src=&#34;https://c3.staticflickr.com/9/8796/29186986394_7bf718275e_z.jpg&#34; alt=&#34;IntelliJ IDEA&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;cmd----collapse&#34;&gt;Cmd + -: Collapse&lt;/h3&gt;&#xA;&lt;p&gt;キャレット上の関数などを折り畳む&lt;/p&gt;&#xA;&lt;h3 id=&#34;cmd---expand&#34;&gt;Cmd + +: Expand&lt;/h3&gt;&#xA;&lt;p&gt;キャレット上の関数などを展開する(折り畳むのの反対)&lt;/p&gt;&#xA;&lt;h3 id=&#34;ctrl--opt--h-call-hierarchy&#34;&gt;Ctrl + Opt + h: Call Hierarchy&lt;/h3&gt;&#xA;&lt;p&gt;キャレット上の関数の呼び出し階層を表示する。その関数がどのように使用されているのかがわかるのでかなり重宝する。&lt;/p&gt;&#xA;&lt;h3 id=&#34;余談&#34;&gt;余談&lt;/h3&gt;&#xA;&lt;p&gt;同僚に「Help -&amp;gt; Productivity Guide で使ったこと無い機能の一覧を眺めてみては」と言われて試したところ、自分が使ったことのない機能がいっぱいあった。何回ぐらいその機能使ったか、最後に使ったのはいつかを出してくれるなんて、なんて親切なんだろう。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.flickr.com/photos/oinume/29751842911/in/dateposted-public/&#34; title=&#34;IntelliJ IDEA Productivity Guide&#34;&gt;&lt;img src=&#34;https://c8.staticflickr.com/9/8265/29751842911_e5d6809a74_z.jpg&#34; alt=&#34;IntelliJ IDEA Productivity Guide&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;あと 今井さんにQuick DefinitionとSwitcherを教えてもらいました。ありがたや〜。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;ひとつ前のファイルに戻るならBackよりSwitcher（Ctrl+TAB）のほうが便利かも。あとQuick Definitionも便利です。&lt;br&gt;&#xA;|дﾟ)ﾁﾗｯ&lt;br&gt;&#xA;＞コードリーディングのためのIntelliJ IDEAショートカット &lt;a href=&#34;https://t.co/yFOuVugnUr&#34;&gt;https://t.co/yFOuVugnUr&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;— いまいまさのぶ (@masanobuimai) &lt;a href=&#34;https://twitter.com/masanobuimai/status/778386497363857410?ref_src=twsrc%5Etfw&#34;&gt;September 21, 2016&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h3 id=&#34;次回予告&#34;&gt;次回予告&lt;/h3&gt;&#xA;&lt;p&gt;コードを書くためのIntelliJ IDEAショートカット、という記事を書く予定。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4774178705/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/51477rjobnL._SL160_.jpg&#34; alt=&#34;Android Studio本格活用バイブル ~効率的にコーディングするための使い方&#34; loading=&#34;lazy&#34; title=&#34;Android Studio本格活用バイブル ~効率的にコーディングするための使い方&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4774178705/kazzhomeunixo-22/&#34;&gt;Android Studio本格活用バイブル ~効率的にコーディングするための使い方&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: 今井勝信&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: 技術評論社&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2016/01/26&lt;/li&gt;&#xA;&lt;li&gt;メディア: 単行本（ソフトカバー）&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4774178705/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (1件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>VPSをConoHaからVultrにお引越し</title>
				<link>https://journal.lampetty.net/posts/moved-to-vultr/</link>
				<pubDate>Fri, 16 Sep 2016 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/moved-to-vultr/</guid>
				<description>&lt;p&gt;昔はブログ用のWordPressをホスティングしていたVPS、今ではもうリダイレクトするためだけにNginxを動かしているだけなので、$5で1CPU, 768MBとそこそこのスペックな&lt;a href=&#34;https://www.vultr.com/&#34;&gt;Vultr&lt;/a&gt;に引っ越してみた。以下はUNIX Benchの結果。たいしたことしなければ速度的な不満はないし、ConoHaみたいにメンテナンスもない気がするので、わりとオススメ。まだ2ヶ月ぐらいしか使ってないけど。もちろんTokyoリージョンもあります。&lt;/p&gt;&#xA;&lt;p&gt;ちなみに&lt;a href=&#34;http://www.vultr.com/?ref=6936820-3B&#34;&gt;このリンクを踏んでから&lt;/a&gt;登録してもらうと、$20分の無料枠がもらえるのよかったらどうぞ。(そして私には$30入る)&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;========================================================================&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;n&#34;&gt;BYTE&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;UNIX&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Benchmarks&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Version&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;5.1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;GNU&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Linux&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;ne&#34;&gt;OS&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;GNU&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Linux&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;4.4&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;24&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;generic&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;#43-Ubuntu SMP Wed Jun 8 19:27:37 UTC 2016&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;n&#34;&gt;Machine&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;x86_64&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x86_64&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;n&#34;&gt;Language&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;en_US&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;utf8&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;charmap&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;UTF-8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;collate&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;UTF-8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;n&#34;&gt;CPU&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Virtual&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;CPU&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;714389&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bda930&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;4800.0&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;bogomips&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          &lt;span class=&#34;n&#34;&gt;x86&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;64&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;MMX&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Physical&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Address&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Ext&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;SYSENTER&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;SYSEXIT&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;SYSCALL&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;SYSRET&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;mi&#34;&gt;21&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;57&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;06&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;up&lt;/span&gt;  &lt;span class=&#34;mi&#34;&gt;7&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;49&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;  &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;user&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;  &lt;span class=&#34;nb&#34;&gt;load&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;average&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;0.02&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;0.03&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;0.05&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;runlevel&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;5&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;------------------------------------------------------------------------&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Benchmark&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Run&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Sat&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Jun&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;18&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2016&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;21&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;57&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;06&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;22&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;24&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;56&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;CPU&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;system&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;running&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;parallel&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;copy&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;of&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tests&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Dhrystone&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;using&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;register&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;variables&lt;/span&gt;       &lt;span class=&#34;mf&#34;&gt;29026791.2&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;lps&lt;/span&gt;   &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;10.0&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;7&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;samples&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Double&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Precision&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Whetstone&lt;/span&gt;                     &lt;span class=&#34;mf&#34;&gt;2128.1&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;MWIPS&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;9.9&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;7&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;samples&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Execl&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Throughput&lt;/span&gt;                               &lt;span class=&#34;mf&#34;&gt;4333.0&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;lps&lt;/span&gt;   &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;30.0&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;samples&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;ne&#34;&gt;File&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Copy&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1024&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;bufsize&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2000&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;maxblocks&lt;/span&gt;       &lt;span class=&#34;mf&#34;&gt;1177018.5&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;KBps&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;30.0&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;samples&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;ne&#34;&gt;File&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Copy&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;256&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;bufsize&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;500&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;maxblocks&lt;/span&gt;          &lt;span class=&#34;mf&#34;&gt;313427.7&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;KBps&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;30.0&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;samples&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;ne&#34;&gt;File&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Copy&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;4096&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;bufsize&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;8000&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;maxblocks&lt;/span&gt;       &lt;span class=&#34;mf&#34;&gt;2236331.1&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;KBps&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;30.0&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;samples&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Pipe&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Throughput&lt;/span&gt;                             &lt;span class=&#34;mf&#34;&gt;2264531.3&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;lps&lt;/span&gt;   &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;10.0&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;7&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;samples&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Pipe&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;based&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Context&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Switching&lt;/span&gt;                 &lt;span class=&#34;mf&#34;&gt;346957.1&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;lps&lt;/span&gt;   &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;10.0&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;7&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;samples&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Process&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Creation&lt;/span&gt;                              &lt;span class=&#34;mf&#34;&gt;11074.8&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;lps&lt;/span&gt;   &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;30.0&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;samples&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Shell&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Scripts&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;concurrent&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;                   &lt;span class=&#34;mf&#34;&gt;7970.2&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;lpm&lt;/span&gt;   &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;60.0&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;samples&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Shell&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Scripts&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;8&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;concurrent&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;                   &lt;span class=&#34;mf&#34;&gt;1059.4&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;lpm&lt;/span&gt;   &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;60.0&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;samples&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Call&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Overhead&lt;/span&gt;                        &lt;span class=&#34;mf&#34;&gt;3657643.4&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;lps&lt;/span&gt;   &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;10.0&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;7&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;samples&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Benchmarks&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Index&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Values&lt;/span&gt;               &lt;span class=&#34;n&#34;&gt;BASELINE&lt;/span&gt;       &lt;span class=&#34;n&#34;&gt;RESULT&lt;/span&gt;    &lt;span class=&#34;n&#34;&gt;INDEX&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Dhrystone&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;using&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;register&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;variables&lt;/span&gt;         &lt;span class=&#34;mf&#34;&gt;116700.0&lt;/span&gt;   &lt;span class=&#34;mf&#34;&gt;29026791.2&lt;/span&gt;   &lt;span class=&#34;mf&#34;&gt;2487.3&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Double&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Precision&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Whetstone&lt;/span&gt;                       &lt;span class=&#34;mf&#34;&gt;55.0&lt;/span&gt;       &lt;span class=&#34;mf&#34;&gt;2128.1&lt;/span&gt;    &lt;span class=&#34;mf&#34;&gt;386.9&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Execl&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Throughput&lt;/span&gt;                                 &lt;span class=&#34;mf&#34;&gt;43.0&lt;/span&gt;       &lt;span class=&#34;mf&#34;&gt;4333.0&lt;/span&gt;   &lt;span class=&#34;mf&#34;&gt;1007.7&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;ne&#34;&gt;File&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Copy&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1024&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;bufsize&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2000&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;maxblocks&lt;/span&gt;          &lt;span class=&#34;mf&#34;&gt;3960.0&lt;/span&gt;    &lt;span class=&#34;mf&#34;&gt;1177018.5&lt;/span&gt;   &lt;span class=&#34;mf&#34;&gt;2972.3&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;ne&#34;&gt;File&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Copy&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;256&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;bufsize&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;500&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;maxblocks&lt;/span&gt;            &lt;span class=&#34;mf&#34;&gt;1655.0&lt;/span&gt;     &lt;span class=&#34;mf&#34;&gt;313427.7&lt;/span&gt;   &lt;span class=&#34;mf&#34;&gt;1893.8&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;ne&#34;&gt;File&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Copy&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;4096&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;bufsize&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;8000&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;maxblocks&lt;/span&gt;          &lt;span class=&#34;mf&#34;&gt;5800.0&lt;/span&gt;    &lt;span class=&#34;mf&#34;&gt;2236331.1&lt;/span&gt;   &lt;span class=&#34;mf&#34;&gt;3855.7&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Pipe&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Throughput&lt;/span&gt;                               &lt;span class=&#34;mf&#34;&gt;12440.0&lt;/span&gt;    &lt;span class=&#34;mf&#34;&gt;2264531.3&lt;/span&gt;   &lt;span class=&#34;mf&#34;&gt;1820.4&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Pipe&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;based&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Context&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Switching&lt;/span&gt;                   &lt;span class=&#34;mf&#34;&gt;4000.0&lt;/span&gt;     &lt;span class=&#34;mf&#34;&gt;346957.1&lt;/span&gt;    &lt;span class=&#34;mf&#34;&gt;867.4&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Process&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Creation&lt;/span&gt;                                &lt;span class=&#34;mf&#34;&gt;126.0&lt;/span&gt;      &lt;span class=&#34;mf&#34;&gt;11074.8&lt;/span&gt;    &lt;span class=&#34;mf&#34;&gt;879.0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Shell&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Scripts&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;concurrent&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;                     &lt;span class=&#34;mf&#34;&gt;42.4&lt;/span&gt;       &lt;span class=&#34;mf&#34;&gt;7970.2&lt;/span&gt;   &lt;span class=&#34;mf&#34;&gt;1879.8&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Shell&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Scripts&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;8&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;concurrent&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;                      &lt;span class=&#34;mf&#34;&gt;6.0&lt;/span&gt;       &lt;span class=&#34;mf&#34;&gt;1059.4&lt;/span&gt;   &lt;span class=&#34;mf&#34;&gt;1765.7&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Call&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Overhead&lt;/span&gt;                          &lt;span class=&#34;mf&#34;&gt;15000.0&lt;/span&gt;    &lt;span class=&#34;mf&#34;&gt;3657643.4&lt;/span&gt;   &lt;span class=&#34;mf&#34;&gt;2438.4&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                                                   &lt;span class=&#34;o&#34;&gt;========&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Benchmarks&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Index&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Score&lt;/span&gt;                                        &lt;span class=&#34;mf&#34;&gt;1576.9&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ちなみに以前使っていた&lt;a href=&#34;http://oinume.hatenablog.com/entry/ubuntu-14.04-on-conoha-vps&#34;&gt;ConoHaのUNIXベンチ&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.vultr.com/?ref=6936820-3B&#34;&gt;&lt;img src=&#34;https://www.vultr.com/media/468x60_08.png&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>HerokuでMySQL 5.7系を使う方法</title>
				<link>https://journal.lampetty.net/posts/mysql-5.7-on-heroku/</link>
				<pubDate>Thu, 15 Sep 2016 19:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/mysql-5.7-on-heroku/</guid>
				<description>&lt;p&gt;JawsDBというaddonを使うともれなく5.7系のMySQLが使える。2016年9月現在だと5.7.11。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://elements.heroku.com/addons/jawsdb&#34;&gt;elements.heroku.com&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;HerokuのデフォルトのデータベースはそもそもPostgreSQLで、MySQLを使いたい場合はこの&lt;a href=&#34;https://elements.heroku.com/addons/jawsdb&#34;&gt;JawsDB&lt;/a&gt;もしくは&lt;a href=&#34;https://elements.heroku.com/addons/cleardb&#34;&gt;ClearDB&lt;/a&gt;の2者択一なんだけど、ClearDBの方は5.5系しか使えない。安定してる5.5を取るか、最新版の5.7のどっちがいいかは悩ましいところだけど...&lt;/p&gt;&#xA;&lt;p&gt;3ヶ月ぶりに書いたブログ記事がこれかよ...！&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Arguments to defered functions are evaluated when the defer executes</title>
				<link>https://journal.lampetty.net/posts/arguments-to-defered-functions-are-evaluated-when-the-defer-executes/</link>
				<pubDate>Mon, 23 May 2016 19:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/arguments-to-defered-functions-are-evaluated-when-the-defer-executes/</guid>
				<description>&lt;blockquote&gt;&#xA;&lt;p&gt;The arguments to the deferred function (which include the receiver if the function is a method) are evaluated when the defer executes, not when the call executes.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://golang.org/doc/effective_go.html#defer&#34;&gt;Effective Go - The Go Programming Language&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;I sometimes make a mistake that &lt;code&gt;defer&lt;/code&gt;ed functions are evaluated when the function is called but it’s wrong. Here is an example.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;go&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;package&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;time&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;wrapped&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;wrapper&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;time&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Sleep&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;time&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Second&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Hello&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;})&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;wrapper&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;wrapped&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;wrapper() start: &amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;time&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Now&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;UTC&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;defer&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;instrument&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;time&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Now&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;UTC&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;wrapper()   end: &amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;time&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Now&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;UTC&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;instrument&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;start&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;time&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Time&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;instrument():    &amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;start&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ go run defer.go&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;wrapper() start:  2016-05-23 07:28:37.474091714 +0000 UTC&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Hello&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;wrapper()   end:  2016-05-23 07:28:40.474272645 +0000 UTC&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;instrument():     2016-05-23 07:28:37.474139821 +0000 UTC&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If &lt;code&gt;defer&lt;/code&gt; functions are evaluated at call time, instrument() time must be 3 seconds later.&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>会社のITシステムで良かったところまとめてみた</title>
				<link>https://journal.lampetty.net/posts/good-it-system/</link>
				<pubDate>Wed, 04 May 2016 22:26:37 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/good-it-system/</guid>
				<description>&lt;p&gt;今まで勤めてきた会社で良かった社内のITシステム(?)を思い出してみた。&lt;/p&gt;&#xA;&lt;h3 id=&#34;byod-bring-your-own-device&#34;&gt;BYOD (Bring Your Own Device)&lt;/h3&gt;&#xA;&lt;p&gt;会社用の携帯を別途支給されるのは携帯の2台持ちになってしまってつらい。2台持ちのつらいところは&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;単純に邪魔&lt;/li&gt;&#xA;&lt;li&gt;2台あると紛失するリスクも2倍&lt;/li&gt;&#xA;&lt;li&gt;2台あると端末の設定が面倒&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;あたりだろうか。BYODなら普段自分が使っている端末をそのまま使えるので便利だった。業務で使う電話については、&lt;a href=&#34;http://comm.rakuten.co.jp/houjin/mobacho050/&#34;&gt;モバチョ&lt;/a&gt;というアプリを使うと、業務用の番号で電話がかけられる。&lt;/p&gt;&#xA;&lt;p&gt;ただ、BYODにも問題があって、「iPhoneを探す」の設定をちゃんとやっているかを事前に確認しておかないと、端末をなくした時に色々問題が発生するので、情シス的にはその辺が課題かもしれない。&lt;/p&gt;&#xA;&lt;h3 id=&#34;シングルサインオン&#34;&gt;シングルサインオン&lt;/h3&gt;&#xA;&lt;p&gt;経費精算や人事関連の社内のシステムへのログインが全部バラバラだと辛いので、やっぱりシングルサインオン大事。月に1回しか使わない経費精算システムのパスワードとかメモしておくの辛いし。情シス的にも認証の口は一つにしておいたほうがアカウントをロックするにも楽なはず。&lt;/p&gt;&#xA;&lt;h3 id=&#34;google-apps&#34;&gt;Google Apps&lt;/h3&gt;&#xA;&lt;p&gt;もう説明する必要はないでしょう。Google DriveとHangoutがいい。Google Calendarは人数が多いと辛い気がする。&lt;/p&gt;&#xA;&lt;h3 id=&#34;セキュリティカードがsuicapasmo&#34;&gt;セキュリティカードがSUICA/PASMO&lt;/h3&gt;&#xA;&lt;p&gt;オフィスに入るためのセキュリティカード、別途配られると財布の中にまた新しいカードが増えて嫌な感じになるけど、SUICAやPASMOに登録して使えるようになってるのがけっこう良かった。もっといいのは&lt;a href=&#34;http://about.smartnews.com/ja/2015/10/13/jingumae-office-story/&#34;&gt;SmartNewsのような顔認証システム&lt;/a&gt;だとは思う。&lt;/p&gt;&#xA;&lt;h3 id=&#34;まともなドキュメント管理システム&#34;&gt;まともなドキュメント管理システム&lt;/h3&gt;&#xA;&lt;p&gt;数百人規模の会社だともはやConfluence一択な気がするけど、ドキュメント管理システムはないとつらい。Google Docsでもいいかもしれないけど、Word感が強くて個人的にはあまり好きじゃなかった。Qiita Teamは人数が多くて部署が多いとつらそう。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>3 things I do after installing Nodejs</title>
				<link>https://journal.lampetty.net/posts/3-things-i-do-after-installing-nodejs/</link>
				<pubDate>Sat, 09 Apr 2016 21:43:56 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/3-things-i-do-after-installing-nodejs/</guid>
				<description>&lt;h3 id=&#34;installing-latest-npm&#34;&gt;Installing latest npm&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ npm install -g npm@latest&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;disabling-npms-progress-bar&#34;&gt;Disabling npm’s progress bar&lt;/h3&gt;&#xA;&lt;p&gt;Disabling progress bar for faster &lt;code&gt;npm install&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ npm set progress=false&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;See &lt;a href=&#34;https://github.com/npm/npm/issues/11283#issuecomment-175246823&#34;&gt;Progress bar noticeably slows down npm install · Issue #11283 · npm/npm&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;installing-npm-check&#34;&gt;Installing &lt;code&gt;npm-check&lt;/code&gt;&lt;/h3&gt;&#xA;&lt;p&gt;&lt;code&gt;npm-check&lt;/code&gt; checks outdated, incorrect, and unused dependencies.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ npm install -g npm-check&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&#34;https://www.npmjs.com/package/npm-check&#34;&gt;www.npmjs.com&lt;/a&gt;&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Go Tip: Don&#39;t take the address of loop variable</title>
				<link>https://journal.lampetty.net/posts/go-tip-dont-take-the-address-of-loop-variable/</link>
				<pubDate>Sat, 09 Apr 2016 12:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/go-tip-dont-take-the-address-of-loop-variable/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;http://stackoverflow.com/questions/29923956/golang-reusing-memory-address-copying-from-slice&#34;&gt;stackoverflow.com&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;If you take the address of loop variable, it may cause a bug which all values are same. You might expect following program prints &lt;code&gt;5 10 15&lt;/code&gt; but it prints &lt;code&gt;15 15 15&lt;/code&gt;. That’s because loop variable &lt;code&gt;v&lt;/code&gt; is initialized just once.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;go&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;package&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;coll&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;15&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;v&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;range&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;toPointers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;coll&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Printf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;%v &amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;v&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;toPointers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ints&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;pointers&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;make&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;([]&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ints&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;v&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;range&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ints&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;pointers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;v&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// XXX: mistake&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;pointers&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You can get expected result if you write like this:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;go&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;package&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;coll&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;15&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;v&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;range&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;toPointers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;coll&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Printf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;%v &amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;v&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;toPointers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ints&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;pointers&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;make&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;([]&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ints&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;range&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ints&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;pointers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ints&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;pointers&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
			</item>
			<item>
				<title>First loaded configuration becomes default_server in nginx</title>
				<link>https://journal.lampetty.net/posts/nginx-default-server-configuration/</link>
				<pubDate>Mon, 04 Apr 2016 12:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/nginx-default-server-configuration/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;http://nginx.org/en/docs/http/request_processing.html&#34;&gt;How nginx processes a request&lt;/a&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;server {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    listen      80;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    server_name example.org www.example.org;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    ...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;server {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    listen      80;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    server_name example.net www.example.net;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    ...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;server {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    listen      80;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    server_name example.com www.example.com;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    ...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;&#xA;&lt;p&gt;In this configuration nginx tests only the request’s header field “Host” to determine which server the request should be routed to. If its value does not match any server name, or the request does not contain this header field at all, then nginx will route the request to the default server for this port. In the configuration above, the default server is the first one — which is nginx’s standard default behaviour.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;I didn&#39;t know this behaviour and I should always add &lt;code&gt;default_server&lt;/code&gt; to prevent someone from misunderstanding like this.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;server {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    listen      80 default_server;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    server_name _;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
			</item>
			<item>
				<title>Sorting processes by memory usage</title>
				<link>https://journal.lampetty.net/posts/sorting-processes-by-memory-usage/</link>
				<pubDate>Mon, 28 Mar 2016 14:26:03 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/sorting-processes-by-memory-usage/</guid>
				<description>&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ ps aux --sort -rss&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sorted by ascending order if you don&#39;t add &lt;code&gt;-&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://alvinalexander.com/linux/unix-linux-process-memory-sort-ps-command-cpu&#34;&gt;alvinalexander.com&lt;/a&gt;&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Making an enviroment to learn ES6 with babel</title>
				<link>https://journal.lampetty.net/posts/es6-intro-with-babel/</link>
				<pubDate>Mon, 21 Mar 2016 22:57:27 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/es6-intro-with-babel/</guid>
				<description>&lt;p&gt;This is a just memo for me who is a beginner of front-end development.&lt;/p&gt;&#xA;&lt;p&gt;First of all, install nodejs v4.4.0.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ brew install homebrew/versions/node4-lts&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ node -v&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;v4.4.0&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Put &lt;code&gt;package.json&lt;/code&gt; into a current directory. DO NOT forget to add &lt;code&gt;babel-preset-es2015&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &amp;#34;name&amp;#34;: &amp;#34;hello&amp;#34;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &amp;#34;version&amp;#34;: &amp;#34;1.0.0&amp;#34;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &amp;#34;engines&amp;#34;: {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &amp;#34;node&amp;#34;: &amp;#34;4.4.0&amp;#34;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &amp;#34;npm&amp;#34;: &amp;#34;3.8.2&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &amp;#34;devDependencies&amp;#34;: {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &amp;#34;babel-cli&amp;#34;: &amp;#34;^6.0.0&amp;#34;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &amp;#34;babel-preset-es2015&amp;#34;: &amp;#34;^6.6.0&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Run &lt;code&gt;npm install&lt;/code&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ npm install &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Put &lt;code&gt;.babelrc&lt;/code&gt; to tell babel using es2015 preset.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;echo &amp;#39;{ &amp;#34;presets&amp;#34;: [&amp;#34;es2015&amp;#34;] }&amp;#39; &amp;gt; .babelrc&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Put &lt;code&gt;hello.js&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;#34;use strict&amp;#34;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;class Hello {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    say(message) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        console.log(message);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;new Hello().say(&amp;#34;hello&amp;#34;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Transpile &lt;code&gt;hello.js&lt;/code&gt; and run it.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ node_modules/.bin/babel hello.js | node&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;hello&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
			</item>
			<item>
				<title>Tokyo Developers Meetup 17に行ってきた</title>
				<link>https://journal.lampetty.net/posts/tokyo-developers-meetup-17/</link>
				<pubDate>Sat, 30 Jan 2016 21:16:05 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/tokyo-developers-meetup-17/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;http://www.meetup.com/ja-JP/devjapan/events/226925948/?eventId=226925948&#34;&gt;www.meetup.com&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;こんなイベントがあることを知って行ってきました。最初はボッチで同じテーブルの人も話しかけてくれないし、開始10分ぐらいでもう帰ろうかと思ったけど、自分から &amp;quot;This is the first time to come here. May I introduce myself?&amp;quot; と言って同じテーブルの人に話しかけたらそこから話がなんとかつながって、他の人ともしゃべるようになりました。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;目の前に座っていた人は日本にもう10年ぐらい住んでいて、自分の会社を持っているんだとか。そして、Haskel/Rust使いでDevOps系を仕事にしているらしい。「今どんなことやっているの？」って聞いたら「NixOSのパッケージ作ってた」って言ってて、&lt;a href=&#34;http://nixos.org/&#34;&gt;NixOS&lt;/a&gt;なんてものを初めて知りました。&#xA;&lt;ul&gt;&#xA;&lt;li&gt;さらにその人は&lt;a href=&#34;http://www.meetup.com/ja-JP/Tokyo-NixOS-Meetup/&#34;&gt;Tokyo NixOS Meetup&lt;/a&gt;のOrganizerやってるそう&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;隣の人はサンフランシスコから来ていて、Scala使いだそうで、「今日東京でScala Matsuriっていう大きいイベントやってるよ」って言ったらすごく悔しそうにしてた&lt;/li&gt;&#xA;&lt;li&gt;pyconjpの理事をやりつつ日本でスタートアップをやっている人もいて、その人の会社について色々教えてもらった&lt;/li&gt;&#xA;&lt;li&gt;途中で挙手制の自己紹介タイムがあって、「会社をやってて絶賛エンジニア募集中〜(意訳)」ということを言っている人が4,5人いたので、仕事を探してる人にもいいのかも&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.disruptingjapan.com/&#34;&gt;disrupting JAPAN&lt;/a&gt; というPodcastをやっているよ、なんていう人もいた。面白そうなので聞いてみようと思う&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;全体としては、PCに向かって作業している人もいたり、ずっと喋っている人もいたりでかなりフリーダムな感じ。たまたまフォトグラファーの人もいたので全員で集合写真撮ったり。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;インド人やフランス人やアメリカ人など色んな国の人が参加していて色んなナマの英語が聞けたのと、NixOSなんていうすごいものをしれたので自分としては参加してすごく良かったです。月一ぐらいでやっているのでまた来月も参加したい。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>MySQL Casual Talks vol.9でしゃべってきた</title>
				<link>https://journal.lampetty.net/posts/mysql-casual-talks-vol9/</link>
				<pubDate>Sat, 23 Jan 2016 23:10:22 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/mysql-casual-talks-vol9/</guid>
				<description>&lt;p&gt;表題の通りでMySQL Casualで「カジュアルに本番データを開発環境に入れる」というタイトルで発表してきました。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;//www.slideshare.net/oinume/mysqlcasual&#34; title=&#34;カジュアルに本番データを開発環境に入れる #mysqlcasual&#34;&gt;カジュアルに本番データを開発環境に入れる #mysqlcasual&lt;/a&gt;&lt;/strong&gt; from &lt;strong&gt;&lt;a href=&#34;//www.slideshare.net/oinume&#34;&gt;Kazuhiro Oinuma&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;当日はカジュアルウォーターを飲んでしまい発表時に顔が真っ赤になっていましたが、おかげで全く緊張しませんでしたｗ&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Yahooさんありがとう &lt;a href=&#34;https://twitter.com/hashtag/mysqlcasual?src=hash&#34;&gt;#mysqlcasual&lt;/a&gt; &lt;a href=&#34;https://t.co/zTkRkX6kVN&#34;&gt;pic.twitter.com/zTkRkX6kVN&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;— oinume (@oinume) &lt;a href=&#34;https://twitter.com/oinume/status/690492660541366272&#34;&gt;January 22, 2016&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;カジュアルウォーターのおかげで緊張しなかった &lt;a href=&#34;https://twitter.com/hashtag/mysqlcasual?src=hash&#34;&gt;#mysqlcasual&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;— oinume (@oinume) &lt;a href=&#34;https://twitter.com/oinume/status/690502812053086208&#34;&gt;January 22, 2016&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;自分の発表があったのであまり他の人の話を聞く余裕がなかったのですが、いい感じにまとめられていたのでこれからじっくり読もうと思います。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://togetter.com/li/928934&#34;&gt;togetter.com&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;会場を提供してくれたYahoo!さんありがとうございました！&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>2016年の抱負</title>
				<link>https://journal.lampetty.net/posts/2016-resolution/</link>
				<pubDate>Sun, 03 Jan 2016 07:06:40 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/2016-resolution/</guid>
				<description>&lt;p&gt;明けましておめでとうございます。今年もよろしくお願いします。&lt;/p&gt;&#xA;&lt;p&gt;ということで、新年の抱負を書きたいと思います。昔は抱負を考えたりするのは好きじゃなかったのだけど、去年やってみて食わず嫌いだということがわかったので今年も抱負を掲げてみたいなと思います。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;英語を頑張る&#xA;&lt;ul&gt;&#xA;&lt;li&gt;技術的なやり取りは苦がなくできるぐらいになっていたいなぁと。会話も文章も両方で。あとブログの英語比率を50%に持って行きたい。あと何か1冊英語の本を最後まで読む。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;アルゴリズム勉強する&#xA;&lt;ul&gt;&#xA;&lt;li&gt;6月までにB+Treeをソラで実装できるようにしたい&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;機械学習を勉強する&#xA;&lt;ul&gt;&#xA;&lt;li&gt;ライブラリやフレームワークを使ってちょいちょいできるぐらいになってたい&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;何かサービスを一つ作る&#xA;&lt;ul&gt;&#xA;&lt;li&gt;去年やってみてよかったのは、自分だけの力で何かを作るって大事だなと思ったので。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;今年こそDocker&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;逆にやらないこと。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;クラウド使いこなす系&#xA;&lt;ul&gt;&#xA;&lt;li&gt;必要最低限に留める&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;ネイティブアプリ回り&lt;/li&gt;&#xA;&lt;li&gt;デザイン&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;というわけで今年も好きなことをやりつつ楽しんで行きたいと思います。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>2015年振り返り</title>
				<link>https://journal.lampetty.net/posts/looking-back-2015/</link>
				<pubDate>Fri, 01 Jan 2016 20:56:08 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/looking-back-2015/</guid>
				<description>&lt;p&gt;2015年はざっくり言うとこんな感じだったと思う。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;2014年の夏から作り続けていたサービスが3月にローンチできた&lt;/li&gt;&#xA;&lt;li&gt;英語の勉強を本格的に始めた&lt;/li&gt;&#xA;&lt;li&gt;2年ぶりに趣味プロダクトを作った(&lt;a href=&#34;https://github.com/oinume/dmm-eikaiwa-tsc&#34;&gt;dmm-eikaiwa-tsc&lt;/a&gt;)&lt;/li&gt;&#xA;&lt;li&gt;初心に帰ってアルゴリズムの勉強を始めた(&lt;a href=&#34;https://github.com/oinume/algo&#34;&gt;algo&lt;/a&gt;)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;一方で、掲げていた抱負を全部ちゃんと達成できたかというと微妙な結果だった。達成できなかった分は2016年に持ち越しかなぁ。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Dockerを実戦投入する&#xA;&lt;ul&gt;&#xA;&lt;li&gt;手付かず...&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;アルゴリズムを深く理解する&#xA;&lt;ul&gt;&#xA;&lt;li&gt;algoという初歩的なアルゴリズムやデータ構造を実装し始めたけど、もともと考えていたB+Treeの実装とかそのレベルには至っていない&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;機械学習とか自然言語処理勉強する&#xA;&lt;ul&gt;&#xA;&lt;li&gt;手付かず...&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;英語でブログエントリーを書く割合を25%にしてみる&#xA;&lt;ul&gt;&#xA;&lt;li&gt;これは唯一達成できた目標。30記事に対して12個を英語で書いたので40%&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;2015年に使った技術&#34;&gt;2015年に使った技術&lt;/h3&gt;&#xA;&lt;p&gt;仕事では正直特に新しいことには取り組んでいない。MySQLの代わりにAuroraを検証し始めたぐらいか。プライベートだと以下ぐらいしか思いつかない。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Heroku&lt;/li&gt;&#xA;&lt;li&gt;Python 3.5のType hints&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://getgb.io/&#34;&gt;gb&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;CircleCI&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;英語&#34;&gt;英語&lt;/h3&gt;&#xA;&lt;p&gt;きっかけは「英語でもっとアウトプットしないと」という悲壮感からだったけど、夏ぐらいから本格的に英語の勉強を始めた。DMM英会話を数日やってみて、色んな国の先生と話すうちにその国のことを学んだりしてすごい面白かったので4ヶ月経った今でも継続してる。自分の英語の勉強方法はこんな感じ。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;DMM英会話を週3,4回&lt;/li&gt;&#xA;&lt;li&gt;英語のPodcastを聴く&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://changelog.com/podcast/&#34;&gt;Changelog&lt;/a&gt;や&lt;a href=&#34;http://talkpython.fm/&#34;&gt;Talk Python To Me&lt;/a&gt;を聴いてる。Talk Python To MeはTranscriptが無料で公開されているのと、requestsなどの超有名ライブラリを開発している人がゲスト出演していたりするのでマジでオススメ&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;以下のような本で文法と単語をインプットする&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B00C1BG8SE/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/51U55eWV6DL._SL160_.jpg&#34; alt=&#34;毎日の英文法　頭の中に「英語のパターン」をつくる&#34; loading=&#34;lazy&#34; title=&#34;毎日の英文法　頭の中に「英語のパターン」をつくる&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B00C1BG8SE/kazzhomeunixo-22/&#34;&gt;毎日の英文法　頭の中に「英語のパターン」をつくる&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: ジェームス・M・バーダマン?&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: 朝日新聞出版&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2013/04/01&lt;/li&gt;&#xA;&lt;li&gt;メディア: Kindle版&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/B00C1BG8SE/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (3件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B00I5FWDHA/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/51HevsmgEBL._SL160_.jpg&#34; alt=&#34;毎日の英単語　日常頻出語の90％をマスターする&#34; loading=&#34;lazy&#34; title=&#34;毎日の英単語　日常頻出語の90％をマスターする&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B00I5FWDHA/kazzhomeunixo-22/&#34;&gt;毎日の英単語　日常頻出語の90％をマスターする&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: ジェームス・M・バーダマン&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: 朝日新聞出版&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2014/02/03&lt;/li&gt;&#xA;&lt;li&gt;メディア: Kindle版&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/B00I5FWDHA/kazzhomeunixo-22&#34;&gt;この商品を含むブログを見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;結果として&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;カンファレンスの海外のスピーカーになんとか英語で質問できるぐらいの度胸と英語力はついた&lt;/li&gt;&#xA;&lt;li&gt;英語オンリーのランチで、なんとか言っている意味は理解して簡単な受け答えはできるようになった&lt;/li&gt;&#xA;&lt;li&gt;外人にもTwitterで絡めるようになった&lt;/li&gt;&#xA;&lt;li&gt;英語のPodcastも7割ぐらい話している英語は聞き取れるようになってきた(意味はもちろん全てはわからない)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;その他&#34;&gt;その他&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;子供が1歳8ヶ月になったけど、特に大きな病気をすることもなくスクスクと育っていて大変嬉しい。もうすぐ喋れそうでこれからもっと楽しくなりそう&lt;/li&gt;&#xA;&lt;li&gt;妻が仕事に復帰したけど特に大きな問題もなく生活できてる(たぶん...)&lt;/li&gt;&#xA;&lt;li&gt;通っている認証保育園の先生が本当にいい人たち過ぎて転園したくない&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://oinume.lampetty.net/pages/40112/shishimaru&#34;&gt;猫のししまる&lt;/a&gt;が相変わらずかわいい&lt;/li&gt;&#xA;&lt;li&gt;住宅ローンを頑張ってけっこう返済した&lt;/li&gt;&#xA;&lt;li&gt;家で酒をほとんど飲まなくなった&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>Heroku Schedulerやcronが正常に稼働しているかをチェックするDead Man&#39;s Snitchが便利</title>
				<link>https://journal.lampetty.net/posts/introducing-dead-mans-snitch/</link>
				<pubDate>Mon, 21 Dec 2015 22:10:13 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/introducing-dead-mans-snitch/</guid>
				<description>&lt;p&gt;これは&lt;a href=&#34;http://qiita.com/advent-calendar/2015/heroku&#34;&gt;Heroku Advent Calendar 2015&lt;/a&gt; 21日の記事です。今回はHeroku Schedulerを監視する&lt;a href=&#34;https://deadmanssnitch.com/&#34;&gt;Dead Man&#39;s Snitch&lt;/a&gt;というものを紹介します。&lt;/p&gt;&#xA;&lt;h3 id=&#34;heroku-schedulerってなに&#34;&gt;Heroku Schedulerってなに？&lt;/h3&gt;&#xA;&lt;p&gt;Heroku上で特定のスクリプトやコマンドを動かすcronみたいなもの。「みたいなもの」というのは、cronと違って「何時何分に実行する」というような厳密な時間指定ができず、10分、1時間、1日単位でしか指定ができません。イメージとしては以下のような感じ。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://github.com/oinume/dmm-eikaiwa-tsc/raw/master/doc/heroku_scheduler.png?raw=true&#34; alt=&#34;Heroku Scheduler setting&#34; loading=&#34;lazy&#34; title=&#34;Heroku Scheduler setting&#34;&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;ただ、このような要件でも十分であれば、無料のDynoでも利用できるのがメリットだと思います。&lt;/p&gt;&#xA;&lt;h3 id=&#34;dead-mans-snitchでコマンドが正常に稼働しているかチェックする&#34;&gt;Dead Man&#39;s Snitchでコマンドが正常に稼働しているかチェックする&lt;/h3&gt;&#xA;&lt;p&gt;Heroku Schedulerで動かしているコマンドが正常に稼働しているかをチェックすることができないか？と思って調べていたらこのDead Man&#39;s Snitchに行き着きました。原理としては&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Heroku Schedulerに&lt;code&gt;your_command.sh &amp;amp;&amp;amp; curl https://nosnch.in/&amp;lt;hash&amp;gt;&lt;/code&gt;のようにコマンドを登録しておき、your_command.shが成功した時にcurlで成功したということをDead Man&#39;s Snitchに送信する(チェックイン)&lt;/li&gt;&#xA;&lt;li&gt;Dead Man&#39;s Snitch側では、1時間の間隔(*1)でちゃんとコマンドが成功しチェックインされたかどうかをチェック&lt;/li&gt;&#xA;&lt;li&gt;もし1時間以上チェックインしていなければ、指定したメールアドレスにアラートメールが送信される&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;という流れです。チェックインをチェックする間隔は1日, 1週間などの間隔が設定可能で、有料プランだと15分、30分の間隔もできるようです。&lt;/p&gt;&#xA;&lt;p&gt;ちなみにチェックインされていない場合に送られてくるアラートメールはこんな感じ。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Hi &amp;lt;app&amp;gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;FYI &amp;#34;&amp;lt;app&amp;gt;&amp;#34; doesn&amp;#39;t seem to be working.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Last healthy check-in: about 8 hours ago (16 Dec 16:13 UTC)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;You might want to check it out:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;https://deadmanssnitch.com/snitches/&amp;lt;hash&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Would you like to pause your snitch?&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;https://deadmanssnitch.com/snitches/&amp;lt;hash&amp;gt;/pause&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Kind regards,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Dead Man&amp;#39;s Snitch&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;なおこのDead Man&#39;s Snitchは特定のURLにGETでアクセスするだけのシンプルな仕組みなので、Heroku Schedulerだけではなくcronでも使えます。もちろんcurlからではなくプログラムのコードからでも呼び出せます。&lt;/p&gt;&#xA;&lt;h3 id=&#34;まとめ&#34;&gt;まとめ&lt;/h3&gt;&#xA;&lt;p&gt;Heroku Schedulerやcronの死活監視に使えるDead Man&#39;s Snitchというサービスを紹介しました。データーベースのデータをバックアップするような重要なスクリプトにDead Man&#39;s Snitchによる死活監視を入れておくとスクリプトが動作していないことにすぐ気付けるのでオススメです。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>dmm-eikaiwa-tscにバグ</title>
				<link>https://journal.lampetty.net/posts/20151217-2246/</link>
				<pubDate>Thu, 17 Dec 2015 22:46:32 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/20151217-2246/</guid>
				<description>&lt;p&gt;以前紹介した&lt;a href=&#34;http://oinume.hatenablog.com/entry/introducing-dmm-eikaiwa-tsc&#34;&gt;DMM英会話でお気に入りの先生の空きレッスンが登録されたらメールで通知するヤツ&lt;/a&gt;にバグがあったので、使っている人がいたらアップデートお願いします。&lt;/p&gt;&#xA;&lt;p&gt;バグの内容はレッスン講師のスケジュール表に「休講」というステータスが出現したため、スケジュール表のスクレイピングに失敗して、Heroku Schedulerで動いているアプリケーションがエラーで止まるというものです。詳細は以下を参照してもらえればと。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/oinume/dmm-eikaiwa-tsc/issues/25&#34;&gt;bin/fetcher aborts with &amp;quot;Unknown schedule text:休講&amp;quot; · Issue #25 · oinume/dmm-eikaiwa-tsc · GitHub&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;今Herokuで動いているアプリについてはアップデート方法を&lt;a href=&#34;https://github.com/oinume/dmm-eikaiwa-tsc#updating-this-application&#34;&gt;README&lt;/a&gt;にまとめておきました。簡単に言うとdmm-eikaiwa-tscのリポジトリを&lt;code&gt;git clone&lt;/code&gt;して&lt;code&gt;git push heroku master&lt;/code&gt;する感じです。&lt;/p&gt;&#xA;&lt;p&gt;ボタンワンクリックでHerokuにディプロイできるようにはしてあるのですが、このようなアップデートをいかに簡単にディプロイするかは課題ですね...&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Parsing MySQL&#39;s URL in Python3</title>
				<link>https://journal.lampetty.net/posts/parsing-mysqls-url-in-python3/</link>
				<pubDate>Mon, 14 Dec 2015 00:32:58 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/parsing-mysqls-url-in-python3/</guid>
				<description>&lt;p&gt;Just add &lt;code&gt;urllib.parse.uses_netloc.append(&amp;quot;mysql&amp;quot;)&lt;/code&gt; if you want to parse URL such as &lt;code&gt;mysql://root:pass@localhost/demo&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;#!/usr/bin/env python&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import urllib.parse&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;urllib.parse.uses_netloc.append(&amp;#34;mysql&amp;#34;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;if __name__ == &amp;#34;__main__&amp;#34;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    url_str = &amp;#34;mysql://root:pass@localhost/demo&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    url = urllib.parse.urlparse(url_str)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    print(&amp;#34;URL={0}&amp;#34;.format(url_str))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    print(&amp;#34;host={0}, user={1}, password={2}, database={3}&amp;#34;.format(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        url.hostname, url.username, url.password, url.path[1:]))&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ python3 url_parse.python&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;URL=mysql://root:pass@localhost/demo&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;host=localhost, user=root, password=pass, database=demo&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
			</item>
			<item>
				<title>DMM英会話でお気に入りの先生の空きレッスンが登録されたらメールで通知するヤツ作った</title>
				<link>https://journal.lampetty.net/posts/introducing-dmm-eikaiwa-tsc/</link>
				<pubDate>Mon, 07 Dec 2015 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/introducing-dmm-eikaiwa-tsc/</guid>
				<description>&lt;h3 id=&#34;20161125追記&#34;&gt;2016/11/25追記&lt;/h3&gt;&#xA;&lt;p&gt;後継のlekcijeというサービスを作ったのでぜひこちらをご利用下さい。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.lekcije.com/&#34;&gt;www.lekcije.com&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;動機&#34;&gt;動機&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;どのSkype英会話でもそうだと思うんだけど、人気のある先生はすぐ予約が埋まっちゃう&lt;/li&gt;&#xA;&lt;li&gt;でもスケジュールをいちいち検索してチェックするのはダルい&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;というわけで作りました。&lt;/p&gt;&#xA;&lt;h3 id=&#34;使った技術&#34;&gt;使った技術&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devcenter.heroku.com/articles/scheduler&#34;&gt;Heroku Scheduler&lt;/a&gt; - cron的なヤツ&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devcenter.heroku.com/articles/cleardb&#34;&gt;ClearDB MySQL Addon&lt;/a&gt; - HerokuでMySQLを使えるようにする&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devcenter.heroku.com/articles/sendgrid&#34;&gt;SendGrid Addon&lt;/a&gt; - APIでメール送信&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devcenter.heroku.com/articles/papertrail&#34;&gt;Papertrail&lt;/a&gt; - Herokuのログの検索&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devcenter.heroku.com/articles/deadmanssnitch&#34;&gt;Dead Man&#39;s Snitch&lt;/a&gt; - Heroku Schedulerで動かしているコマンドが正常に動いているか監視&lt;/li&gt;&#xA;&lt;li&gt;Python 3.5 - &lt;a href=&#34;https://www.python.org/dev/peps/pep-0484/&#34;&gt;Type Hints&lt;/a&gt;を使ってみたかったので&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://alembic.readthedocs.org/en/latest/&#34;&gt;Alembic&lt;/a&gt; - データーベースのマイグレーション&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/oinume/dmm-eikaiwa-tsc/&#34;&gt;github.com&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;ソースコードは↑。&amp;quot;Deploy to Heroku&amp;quot; buttonをつけておいたので、Herokuアカウントがあれば誰でもこのアプリケーションを使うことができる。やり方は&lt;a href=&#34;https://github.com/oinume/dmm-eikaiwa-tsc#deploying-to-heroku&#34;&gt;README&lt;/a&gt;を見てもらえればと。&lt;/p&gt;&#xA;&lt;h3 id=&#34;概要&#34;&gt;概要&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Heroku Schedulerで10分おきにお気に入りの先生のスケジュールのページをスクレイピング&lt;/li&gt;&#xA;&lt;li&gt;前回のスケジュール(DB)と今回スクレイピングしたスケジュールを比較&#xA;&lt;ul&gt;&#xA;&lt;li&gt;新しく空きレッスンがある場合はメールで通知&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;スクレイピングしたスケジュールをDBに登録&lt;/li&gt;&#xA;&lt;li&gt;スケジュールをチェックしたい先生のIDを入力する画面を作るのが辛かったので、その辺は環境変数経由でIDを渡すという手抜きな構造&#xA;&lt;ul&gt;&#xA;&lt;li&gt;超ヒマになったら画面作りたい&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;結果&#34;&gt;結果&lt;/h3&gt;&#xA;&lt;p&gt;人気の先生の予約がめっちゃ取りやすくなったし、副次的な効果としてキャンセルで空いたレッスンにもすぐ気付けるようになったので、DMM英会話やってる人は使ってみたらいいと思います。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4860641345/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/51pu%2B0tZVxL._SL160_.jpg&#34; alt=&#34;どんどん話すための瞬間英作文トレーニング (CD BOOK)&#34; loading=&#34;lazy&#34; title=&#34;どんどん話すための瞬間英作文トレーニング (CD BOOK)&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4860641345/kazzhomeunixo-22/&#34;&gt;どんどん話すための瞬間英作文トレーニング (CD BOOK)&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: 森沢洋介&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: ベレ出版&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2006/10/25&lt;/li&gt;&#xA;&lt;li&gt;メディア: 単行本&lt;/li&gt;&#xA;&lt;li&gt;購入: 80人 クリック: 383回&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4860641345/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (173件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;余談&#34;&gt;余談&lt;/h3&gt;&#xA;&lt;p&gt;これを作り始めてからGitHubに草が生えるようになった。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.flickr.com/photos/oinume/23193551069/in/dateposted-public/&#34; title=&#34;commits of github.com&#34;&gt;&lt;img src=&#34;https://farm1.staticflickr.com/659/23193551069_1cb31fafc5_z.jpg&#34; alt=&#34;commits of github.com&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;今回は小規模だったためORMapperなどのライブラリ・フレームワークを使わないで実装したけど、会社だけでコードを書いているといかに自分がフレームワークやライブラリに依存したコードしか書けないかを思い知らされて良かったです。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>まだ3大キャリアSIMで消耗してるの？MVNOのススメ</title>
				<link>https://journal.lampetty.net/posts/recommending-mvno-sim/</link>
				<pubDate>Mon, 30 Nov 2015 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/recommending-mvno-sim/</guid>
				<description>&lt;p&gt;Docomo iPhone6 + IIJ mioに乗り換えてから3ヶ月ぐらいたったのでその使用感をば。結論から言うと今すぐキャリアSIMやめてMVNOに切り替えた方がいいと思う。&lt;/p&gt;&#xA;&lt;h3 id=&#34;料金が安い&#34;&gt;料金が安い&lt;/h3&gt;&#xA;&lt;p&gt;SoftbankからIIJ mioに切り替えてから、月々の利用料金が約半額になった。具体的には、Softbankの時は平均で6000円ぐらいだったのが、今では3000円以下になってる。年で考えると36000円のコストカットになるのでこれはデカい。ちなみに契約しているのはデータ通信量が3GBのミニマムスタートプランに音声通話機能をつけてる。&lt;/p&gt;&#xA;&lt;p&gt;ちなみにこれは10月の料金明細。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.flickr.com/photos/oinume/23290443841/in/dateposted-public/&#34; title=&#34;スクリーンショット 2015-11-29 0.34.52&#34;&gt;&lt;img src=&#34;https://farm1.staticflickr.com/731/23290443841_2afd4141e2_z.jpg&#34; alt=&#34;スクリーンショット 2015-11-29 0.34.52&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;200kbpsでも意外とイケる&#34;&gt;200Kbpsでも意外とイケる&lt;/h3&gt;&#xA;&lt;p&gt;自分はTwitterを見ることが多いんだけど、Twitter、メール、ネットを見るぐらいであれば200kbpsでもそこまでストレスなく見れる。なので必要なとき以外はクーポンをOFFにして200Kbpsの低速回線を使うようにして、3GB／月の通信量でおさまるようにしてる。IIJ mioだと&lt;a href=&#34;https://www.iijmio.jp/startguide/d4-5_miopon.html&#34;&gt;みおぽん&lt;/a&gt;というアプリを使うことで簡単にクーポンをON/OFFにして回線速度を切り替えられる。自分はWebエンジニアなので、あえてクーポンをOFFにして200Kbpsの回線で自分が運用しているサイトがストレスなく閲覧できるかもチェックしてる。&lt;/p&gt;&#xA;&lt;p&gt;あと、iOS向けのGoogle Chromeを使えば、Googleのサーバーから最適化された状態でサイトを閲覧することができるので、低速回線だとSafariよりもブラウジングが快適になる。&lt;/p&gt;&#xA;&lt;p&gt;さらに余ったデータ通信量は翌月に繰り越せるのもいい。&lt;/p&gt;&#xA;&lt;h3 id=&#34;回線の品質がいい&#34;&gt;回線の品質がいい&lt;/h3&gt;&#xA;&lt;p&gt;MVNOなので混雑時つながりにくいことがあるかと思いきやそういうことはなく、Softbankやauなどのキャリアの回線と比べても遜色ない気がする。この3ヶ月間で「あ、なんか回線が詰まってるな」と思ったのは3,4回ぐらいだ。&lt;/p&gt;&#xA;&lt;h3 id=&#34;端末&#34;&gt;端末&lt;/h3&gt;&#xA;&lt;p&gt;Apple Storeで売っているSIMフリーiPhone6(128GB)は約12万と高いので、じゃんぱらで中古のDoCoMoのiPhone6を7万円で買った。だいたいのMVNOはDoCoMoの回線を使っているので、バカ高いSIMフリー端末じゃなくてもOKっていうのは意外と知られていないっぽい。&lt;/p&gt;&#xA;&lt;h3 id=&#34;まとめ&#34;&gt;まとめ&lt;/h3&gt;&#xA;&lt;p&gt;というわけでまだ3大キャリアSIMで消耗している人は今すぐMVNO SIMに切り替えましょう。&lt;a href=&#34;https://www.iijmio.jp/campaign/mgm/invite/?id=230706379689439&amp;amp;sns=0&#34;&gt;このリンク&lt;/a&gt;からIIJ mioに申し込むとデータ通信量が2ヶ月間10%増量されます。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B00J8B7WWG/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/51UQ9OoxSnL._SL160_.jpg&#34; alt=&#34;IIJ IIJmio SIM 音声通話 パック みおふぉん IM-B043&#34; loading=&#34;lazy&#34; title=&#34;IIJ IIJmio SIM 音声通話 パック みおふぉん IM-B043&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B00J8B7WWG/kazzhomeunixo-22/&#34;&gt;IIJ IIJmio SIM 音声通話 パック みおふぉん IM-B043&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;出版社/メーカー: IIJ&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2014/03/29&lt;/li&gt;&#xA;&lt;li&gt;メディア: エレクトロニクス&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/B00J8B7WWG/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (5件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>Amazon RDS for Aurora 東京ローンチ記念セミナー</title>
				<link>https://journal.lampetty.net/posts/amazon-aurora-tokyo-launch-seminar/</link>
				<pubDate>Thu, 12 Nov 2015 12:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/amazon-aurora-tokyo-launch-seminar/</guid>
				<description>&lt;p&gt;Auroraの検討を導入していることもあり、11/10の&lt;a href=&#34;http://aws.amazon.com/jp/about-aws/events/2015/aurora_20151110/&#34;&gt;Amazon RDS for Aurora 東京ローンチ記念セミナー&lt;/a&gt;に行ってきたのでそのメモ書きと感想。&lt;/p&gt;&#xA;&lt;h2 id=&#34;debanjan-saha-gm-amazon-aurora&#34;&gt;Debanjan Saha, GM, Amazon Aurora&lt;/h2&gt;&#xA;&lt;p&gt;Auroraチームの人。AuroraはAWS史上最速で成長しているサービスと言っていた。&lt;/p&gt;&#xA;&lt;h3 id=&#34;エンタープライズ顧客の要望リスト&#34;&gt;エンタープライズ顧客の要望リスト&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;専門家部隊がいなくても運用・管理できる&lt;/li&gt;&#xA;&lt;li&gt;ライセンス管理しなくてもいい&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;mysql互換のリレーショナルデータベース&#34;&gt;MySQL互換のリレーショナル・データベース&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;商用DB並のパフォーマンスと可用性&lt;/li&gt;&#xA;&lt;li&gt;OSS DBの使いやすさとコスト効果&lt;/li&gt;&#xA;&lt;li&gt;3箇所のデータセンターに6つの複製を保持&lt;/li&gt;&#xA;&lt;li&gt;30秒以内でフェールオーバー&lt;/li&gt;&#xA;&lt;li&gt;50万 Read IOPS&lt;/li&gt;&#xA;&lt;li&gt;10万 Write IOPS&lt;/li&gt;&#xA;&lt;li&gt;64TB Storage - DBに最適化したストレージ&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;aurora使っている会社&#34;&gt;Aurora使っている会社&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Expedia&lt;/li&gt;&#xA;&lt;li&gt;GE Oil &amp;amp; Gas&lt;/li&gt;&#xA;&lt;li&gt;Alfresco&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;などなど。&lt;/p&gt;&#xA;&lt;h3 id=&#34;expedia&#34;&gt;Expedia&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;現行のSQL Serverベースのアーキテクチャはデータボリュームの増加と共にパフォーマンスの低下が見られた&lt;/li&gt;&#xA;&lt;li&gt;Cassandra + Solrを組み合わせたインデックスは大きなメモリー空間を必要としてコストを押し上げた&lt;/li&gt;&#xA;&lt;li&gt;Auroraはスケーラビリティとパフォーマンス要件を満たし、コストもずっと低かった&lt;/li&gt;&#xA;&lt;li&gt;平常時25K INSERT/sec (Peak 70K)&lt;/li&gt;&#xA;&lt;li&gt;平均レスポンスタイムはWrite 30ms, Read 17ms&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;pge&#34;&gt;PG&amp;amp;E&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;天然ガス＋電力の公益企業&lt;/li&gt;&#xA;&lt;li&gt;電力関係のイベントが起きた際に突発的なトラフィックを処理しなくてはいけないという課題&lt;/li&gt;&#xA;&lt;li&gt;データベースが落ちた時の影響が大きい&lt;/li&gt;&#xA;&lt;li&gt;遅延のほとんどないRead Replicaを複数持つことができるため、電力化kん京のイベントが起きた際の突発的なトラフィックを処理し、顧客に最新の情報をタイムリーに提供できるようになった&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;iscs&#34;&gt;ISCS&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;保険請求処理&lt;/li&gt;&#xA;&lt;li&gt;Oracle + SQL Serverを通常業務ならびにウェアハウスデータ用に使用&lt;/li&gt;&#xA;&lt;li&gt;コストが大きな支出となっていた&lt;/li&gt;&#xA;&lt;li&gt;余裕をもたせた状態のAuroraのコストがSQLServerの構成よりも70%やすかった&lt;/li&gt;&#xA;&lt;li&gt;Auroraの連続的なバックアップ機能により、バックアップ処理ウインドウを廃止できた&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;threatstack&#34;&gt;ThreatStack&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;AWS顧客に対し連続的なセキュリティ監視を提供&lt;/li&gt;&#xA;&lt;li&gt;脅威分析のために大きく連続したデータストリームを扱う&lt;/li&gt;&#xA;&lt;li&gt;50万INSERT/sec, 1日の生データは10TB&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Cassandraからの移行&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Auroraを時系列データを扱うDBとして使用&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;architecture&#34;&gt;Architecture&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Three AZ and 6 data replica&lt;/li&gt;&#xA;&lt;li&gt;Quoram&lt;/li&gt;&#xA;&lt;li&gt;Peer-to-peer gossip Replication&lt;/li&gt;&#xA;&lt;li&gt;Continuous S3 backup&lt;/li&gt;&#xA;&lt;li&gt;Storage node check and failure and repair&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;高速なクラッシュリカバリ&#34;&gt;高速なクラッシュリカバリ&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;最後のチェックポイントからのログを適用する必要がある&lt;/li&gt;&#xA;&lt;li&gt;AuroraはDisk readの一環としてオンデマンドでredo logの適用を行う&#xA;&lt;ul&gt;&#xA;&lt;li&gt;並列・分散・非同期で行われる&lt;/li&gt;&#xA;&lt;li&gt;起動時に実行する必要がない&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;フェイルオーバー時間&#34;&gt;フェイルオーバー時間&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Failure Detection(15-30sec), DNS Propagation(5-20sec)&lt;/li&gt;&#xA;&lt;li&gt;Aurora + MariaDB Driverを組み合わせることにより30秒未満でフェイルオーバーできる&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;バックアップ&#34;&gt;バックアップ&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;通常のデータベースはバックアップウィンドウの時間があるが、Auroraは継続的にバックアップしている&lt;/li&gt;&#xA;&lt;li&gt;DBサイズが大きければ大きいほど時間がかかる&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;なぜauroraは速いのか&#34;&gt;なぜAuroraは速いのか&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;IOを減らす&lt;/li&gt;&#xA;&lt;li&gt;ネットワークパケットを最小限にする&lt;/li&gt;&#xA;&lt;li&gt;結果をキャッシュしておく&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;advanced-monitoring&#34;&gt;Advanced Monitoring&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;より詳しいOSの統計情報がとれるようになる予定&lt;/li&gt;&#xA;&lt;li&gt;1秒単位でメトリクス取得可能&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;お金の話&#34;&gt;お金の話&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;No idle standby instance&lt;/li&gt;&#xA;&lt;li&gt;Single shared storage volume&lt;/li&gt;&#xA;&lt;li&gt;NO POIPs - pay for use I/O (Provisioned IOPSが不要)&lt;/li&gt;&#xA;&lt;li&gt;21.4% Savings&lt;/li&gt;&#xA;&lt;li&gt;さらにパフォーマンスがいいので、MySQLおり小さいインスタンスでもいいかも&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;質疑応答&#34;&gt;質疑応答&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;MySQLだとデータ量が多いとAlter tableが遅い問題&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Online DDLについては改善予定(3-6ヶ月以内)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;r3以外のインスタンスについて&#xA;&lt;ul&gt;&#xA;&lt;li&gt;t2 instanceについては検討中&lt;/li&gt;&#xA;&lt;li&gt;mやcのタイプはあまり検討していない&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;メモリに乗らないAlter tableはOOMが出る？&#xA;&lt;ul&gt;&#xA;&lt;li&gt;大体の問題は対応済み&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;MHAのような数秒単位でのインスタンス入れ替えは可能？&#xA;&lt;ul&gt;&#xA;&lt;li&gt;できないので、Read replica作ってそこにフェイルオーバーさせる&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;rds-for-mysqlからauroraへの移行&#34;&gt;RDS for MySQLからAuroraへの移行&lt;/h2&gt;&#xA;&lt;p&gt;グラニ吉崎さん&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://speakerdeck.com/guitarrapc/nice-to-meet-you-aurora&#34;&gt;スライド&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;どのような変化があったか&#34;&gt;どのような変化があったか&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;UPDATEの高速化(16.2ms -&amp;gt; 2.84ms)&lt;/li&gt;&#xA;&lt;li&gt;INSERT(2.9ms -&amp;gt; 1.3ms)&lt;/li&gt;&#xA;&lt;li&gt;DELETE(0.8ms -&amp;gt; 1ms)&lt;/li&gt;&#xA;&lt;li&gt;SELECTはあまり変わってない&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;migration&#34;&gt;Migration&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Amazonの移行ガイドを読む&lt;/li&gt;&#xA;&lt;li&gt;移行方法&#xA;&lt;ul&gt;&#xA;&lt;li&gt;スナップショット移行(考慮点が少ないのでおすすめ)&lt;/li&gt;&#xA;&lt;li&gt;レプリケーション移行(大変)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;SQL_Modeは0にする&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;snapshot-migration&#34;&gt;SNAPSHOT Migration&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;120GB: db.r3.4xlarge&#xA;&lt;ul&gt;&#xA;&lt;li&gt;マイグレーション素養時間：01:37h&lt;/li&gt;&#xA;&lt;li&gt;レプリカ作成所要時間　　：00:06h(これは常に6分！！)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;1100GB: db.r3.8xlarge&#xA;&lt;ul&gt;&#xA;&lt;li&gt;マイグレーション素養時間：10:42h&lt;/li&gt;&#xA;&lt;li&gt;レプリカ作成所要時間　　：00:06h(これは常に6分！！)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;replication-migration-summary&#34;&gt;Replication Migration Summary&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;マイグレーション所要時間：10:42h&lt;/li&gt;&#xA;&lt;li&gt;レプリケーションの完了　：00:30h&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;cluster--db-parameters&#34;&gt;Cluster &amp;amp; DB Parameters&lt;/h2&gt;&#xA;&lt;h2 id=&#34;high-cpu--memory--queuedepth&#34;&gt;High CPU / Memory / QueueDepth&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;RDS for MySQL: 60%声から著しい性能劣化&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Connnection拒否や応答しないなど&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;今後に期待したいこと&#34;&gt;今後に期待したいこと&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Failover order&lt;/li&gt;&#xA;&lt;li&gt;Mandatory Cache purge&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;ドワンゴがaurora使ってみた仮&#34;&gt;ドワンゴがAurora使ってみた(仮)&lt;/h2&gt;&#xA;&lt;h3 id=&#34;ドワンゴでの開発&#34;&gt;ドワンゴでの開発&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;多数のサーバーやネットワーク機器&lt;/li&gt;&#xA;&lt;li&gt;サーバーはHWから自作しようとしてる&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;aws導入サービスの増加&#34;&gt;AWS導入サービスの増加&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Dwango Reader&#xA;&lt;ul&gt;&#xA;&lt;li&gt;アプリケーションレイヤーで水平分割&lt;/li&gt;&#xA;&lt;li&gt;大量の記事データ&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;aurora&#34;&gt;Aurora&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;空き領域の再利用は効率よく行われている&#xA;&lt;ul&gt;&#xA;&lt;li&gt;3.05% -&amp;gt; 2.67%&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;パフォーマンス&#xA;&lt;ul&gt;&#xA;&lt;li&gt;最大64TBまでシームレスにサポートされる点の安心感&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;MySQLとの互換性はLDRとしては十分&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;ウルシステムズの漆原さん&#34;&gt;ウルシステムズの漆原さん&lt;/h2&gt;&#xA;&lt;h3 id=&#34;oracle使ってるようなエンプラからの移行&#34;&gt;Oracle使ってるようなエンプラからの移行&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;モノリシックなアーキテクチャ&#xA;&lt;ul&gt;&#xA;&lt;li&gt;顧客テーブルをみんな参照しているとかｗ&lt;/li&gt;&#xA;&lt;li&gt;DB変更に弱い。何箇所も影響あり&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;マイクロサービス化でさらなる効果を&#xA;&lt;ul&gt;&#xA;&lt;li&gt;特定の技術にロックインされない(でもカオスになる可能性もある)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;マイクロサービスについて&#34;&gt;マイクロサービスについて&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;JSON/REST, HTTP&lt;/li&gt;&#xA;&lt;li&gt;エラー処理&lt;/li&gt;&#xA;&lt;li&gt;キャッシュ&lt;/li&gt;&#xA;&lt;li&gt;サービスモニタリング&lt;/li&gt;&#xA;&lt;li&gt;統一のログ取得&lt;/li&gt;&#xA;&lt;li&gt;独立したディプロイ&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;aurora活用のステップ&#34;&gt;Aurora活用のステップ&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;リファクタリング・マイクロサービス化&lt;/li&gt;&#xA;&lt;li&gt;Aurora移行&lt;/li&gt;&#xA;&lt;li&gt;IT組織改革&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;感想&#34;&gt;感想&lt;/h2&gt;&#xA;&lt;p&gt;現在開発環境でAuroraを試していて、アプリケーションは一切いじらずに普通に稼働していてMySQLとの互換性の高さを感じている。あとはALTER TABLEした時の挙動とか負荷試験をして問題なければ導入する予定。&lt;/p&gt;&#xA;&lt;p&gt;Auroraを導入するメリットとしては&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;事前にディスク容量やIOPSを考える必要がない(勝手に拡張されていく)&lt;/li&gt;&#xA;&lt;li&gt;Master/Slaveは同じデータを見ているので運用が楽になる&#xA;&lt;ul&gt;&#xA;&lt;li&gt;レプリケーションを考えなくていいので、精神的にもストレスがなさそう&lt;/li&gt;&#xA;&lt;li&gt;Slave(Read Replica)を作るのが一定の時間で終わる&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;コストメリット&#xA;&lt;ul&gt;&#xA;&lt;li&gt;事前にEBS容量を確保しなくていいので無駄がない&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;書き込みが速くなる&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;などかなぁと思ってる。でで、特にAuroraへの移行の話は参考になって、データ容量が少なければスナップショットからの移行が一番楽そうだなと思っているところ。&lt;/p&gt;&#xA;&lt;p&gt;とにかくMySQLを利用するような値段でWrite10万IOPS出るようなDBが使えるのはすごい。これはもうFusionIOとかいらなくなる予感がしている。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>MySQLでbulk insert &#43; on duplicate key updateしたい</title>
				<link>https://journal.lampetty.net/posts/mysql-bulk-insert-and-on-duplicate-key-update/</link>
				<pubDate>Mon, 09 Nov 2015 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/mysql-bulk-insert-and-on-duplicate-key-update/</guid>
				<description>&lt;p&gt;MySQLで&lt;code&gt;INSERT INTO hoge VALUES (...), (...), (...)&lt;/code&gt;のbulk insertでon duplicate key update(すでにレコードがあったらUPDATEで上書きする)って併用できるのかな？っていうのが気になったので調べてみたらできるみたい。&lt;a href=&#34;https://dev.mysql.com/doc/refman/5.6/ja/miscellaneous-functions.html#function_values&#34;&gt;VALUES関数&lt;/a&gt;というその目的のためだけに存在するような関数を使う。&lt;/p&gt;&#xA;&lt;p&gt;こんな感じでテーブル作って&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;CREATE TABLE users (&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    name VARCHAR(255) NOT NULL,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    age TINYINT UNSIGNED NOT NULL,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    PRIMARY KEY (name)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;) ENGINE=InnoDB;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;データをINSERTして&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;INSERT INTO users VALUES&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  (&amp;#39;akuwano&amp;#39;, 25), (&amp;#39;oinume&amp;#39;, 24), (&amp;#39;oranie&amp;#39;, 23);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;SELECT * FROM users;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;+---------+-----+&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;| name    | age |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;+---------+-----+&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;| akuwano |  25 |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;| oinume  |  24 |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;| oranie  |  23 |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;+---------+-----+&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;INSERT ... ON DUPLICATE KEY UPDATE&lt;/code&gt;で重複したレコードがあった場合に全てアップデートされるかな？&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;INSERT INTO users VALUES&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  (&amp;#39;akuwano&amp;#39;, 15), (&amp;#39;oinume&amp;#39;, 14), (&amp;#39;oranie&amp;#39;, 13)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  ON DUPLICATE KEY UPDATE age = VALUES(age);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mysql&amp;gt; SELECT * FROM users;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;+---------+-----+&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;| name    | age |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;+---------+-----+&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;| akuwano |  15 |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;| oinume  |  14 |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;| oranie  |  13 |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;+---------+-----+&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;された！！&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4873116384/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/51li6EcTU%2BL._SL160_.jpg&#34; alt=&#34;実践ハイパフォーマンスMySQL 第3版&#34; loading=&#34;lazy&#34; title=&#34;実践ハイパフォーマンスMySQL 第3版&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4873116384/kazzhomeunixo-22/&#34;&gt;実践ハイパフォーマンスMySQL 第3版&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: Baron Schwartz,Peter Zaitsev,Vadim Tkachenko,菊池研自,株式会社クイープ&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: オライリージャパン&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2013/11/25&lt;/li&gt;&#xA;&lt;li&gt;メディア: 大型本&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4873116384/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (7件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>Sending pull-request only with terminal and keyboard</title>
				<link>https://journal.lampetty.net/posts/sending-pull-request-only-with-terminal-and-keyboard/</link>
				<pubDate>Wed, 28 Oct 2015 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/sending-pull-request-only-with-terminal-and-keyboard/</guid>
				<description>&lt;h3 id=&#34;requirements&#34;&gt;Requirements&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Mac&lt;/li&gt;&#xA;&lt;li&gt;Terminal&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;hub&lt;/code&gt; command (&lt;code&gt;brew install hub&lt;/code&gt;)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;how-to-send-pull-request&#34;&gt;How to send pull-request&lt;/h3&gt;&#xA;&lt;p&gt;Make a new branch.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ git checkout -b new-cool-feature&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Editing source code and commit.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ git commit -a&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Push to remote and copy correct &lt;code&gt;git push&lt;/code&gt; command into clipboard.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ git push 2&amp;gt;&amp;amp;1 | grep git | pbcopy&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Paste clipboard into terminal.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ git push --set-upstream origin new-cool-feature&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Counting objects: 3, done.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Delta compression using up to 8 threads.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Compressing objects: 100% (3/3), done.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Writing objects: 100% (3/3), 324 bytes | 0 bytes/s, done.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Total 3 (delta 2), reused 0 (delta 0)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;To git@github.com:example/example-project.git&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; * [new branch]      new-cool-feature -&amp;gt; new-cool-feature&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Branch new-cool-feature set up to track remote branch new-cool-feature from origin.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Send pull-request by &lt;code&gt;hub&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ hub pull-request&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;https://github.com/example/example-project/pull/1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;or open github.com with a browser and make a pull-request on page.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ hub browse&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
			</item>
			<item>
				<title>ターミナルとキーボードだけでプルリクエストを送る</title>
				<link>https://journal.lampetty.net/posts/sending-pull-request-only-with-terminal-and-keyboard-ja/</link>
				<pubDate>Wed, 28 Oct 2015 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/sending-pull-request-only-with-terminal-and-keyboard-ja/</guid>
				<description>&lt;p&gt;これは&lt;a href=&#34;https://journal.lampetty.net/entry/sending-pull-request-only-with-terminal-and-keyboard&#34;&gt;Sending pull-request only with terminal and keyboard&lt;/a&gt;の日本語の記事です。&lt;/p&gt;&#xA;&lt;h3 id=&#34;必要なもの&#34;&gt;必要なもの&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Mac&lt;/li&gt;&#xA;&lt;li&gt;Terminal&lt;/li&gt;&#xA;&lt;li&gt;hub command (&lt;code&gt;brew install hub&lt;/code&gt;でインストールしておく)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;how-to-send-pull-request&#34;&gt;How to send pull-request&lt;/h3&gt;&#xA;&lt;p&gt;ブランチを作る&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ git checkout -b new-cool-feature&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ソースを編集する&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ git commit -a&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;わざとgit pushしてエラーにして、正しいコマンドをpbcopyでクリップボードにコピー&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ git push 2&amp;gt;&amp;amp;1 | grep git | pbcopy&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Cmd+Vでペーストしてpush&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ git push --set-upstream origin new-cool-feature&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Counting objects: 3, done.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Delta compression using up to 8 threads.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Compressing objects: 100% (3/3), done.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Writing objects: 100% (3/3), 324 bytes | 0 bytes/s, done.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Total 3 (delta 2), reused 0 (delta 0)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;To git@github.com:example/example-project.git&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; * [new branch]      new-cool-feature -&amp;gt; new-cool-feature&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Branch new-cool-feature set up to track remote branch new-cool-feature from origin.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;hub&lt;/code&gt;コマンドでプルリクエストを作成&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ hub pull-request&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;https://github.com/example/example-project/pull/1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;もしくは&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ hub browse&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;OR &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ gh browse&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;でブラウザでgithub.comを開いて画面からプルリクエストを作成&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Logging into dmm.com by Selenium</title>
				<link>https://journal.lampetty.net/posts/logging-into-dmmcom-by-selenium/</link>
				<pubDate>Mon, 26 Oct 2015 08:50:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/logging-into-dmmcom-by-selenium/</guid>
				<description>&lt;p&gt;I use Selenium to log into dmm.com because dmm.com requires JavaScript enabled browser. Here is a sample code. You can see Firefox is launched and automatically logging into dmm.com if you use Firefox instead of PhantomJS.&lt;/p&gt;&#xA;&lt;h3 id=&#34;login_dmmpy&#34;&gt;login_dmm.py&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;#!/usr/bin/env python&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# encoding: utf-8&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;import os&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;from selenium import webdriver&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;driver = webdriver.PhantomJS()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;#driver = webdriver.Firefox()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;driver.get(&amp;#34;https://www.dmm.com/my/-/login/=/path=DRVESVwZTldRDlBRRFdIUwwIGFVfVEs_&amp;#34;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;login_id = driver.find_element_by_id(&amp;#34;login_id&amp;#34;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;login_id.send_keys(os.environ[&amp;#34;DMM_LOGIN_ID&amp;#34;])&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;password = driver.find_element_by_id(&amp;#34;password&amp;#34;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;password.send_keys(os.environ[&amp;#34;DMM_LOGIN_PASSWORD&amp;#34;])&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;driver.find_element_by_tag_name(&amp;#34;form&amp;#34;).submit()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;print(driver.page_source)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;driver.quit()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;run&#34;&gt;Run&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ brew install phantomjs&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ pip install selenium&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ DMM_LOGIN_ID=your_id DMM_LOGIN_PASSWORD=your_password python ./login_dmm.py&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
			</item>
			<item>
				<title>Get auto increment values from MySQL information schema</title>
				<link>https://journal.lampetty.net/posts/get-auto-increment-values-from-mysql-information-schema/</link>
				<pubDate>Wed, 21 Oct 2015 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/get-auto-increment-values-from-mysql-information-schema/</guid>
				<description>&lt;p&gt;Information schema is metadata about MySQL. We can obtain useful information from it. For example, I get current auto increment values by following SQL.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;SELECT&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  t.table_name, t.auto_increment&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;FROM&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  information_schema.tables AS t&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;WHERE&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  t.table_schema = &amp;#39;your_db&amp;#39;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ORDER BY t.table_name;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;+-------------------------------------+----------------+&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;| table_name                          | auto_increment |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;+-------------------------------------+----------------+&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;| blog_categories                     |              4 |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;| blog_posts                          |              4 |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;| blog_post_categories                |              4 |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;| blog_post_comments                  |              1 |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;| images                              |              7 |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;+-------------------------------------+----------------+&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;INFORMATION_SCHEMA database has much more useful tables like COLUMNS, GLOBAL_VARIABLES and so on. It&#39;s good to use it when you want to know much about MySQL.&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>最近のインプット</title>
				<link>https://journal.lampetty.net/posts/20151020-2025/</link>
				<pubDate>Tue, 20 Oct 2015 20:25:03 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/20151020-2025/</guid>
				<description>&lt;p&gt;最近読んで面白かったブログとかYouTubeとかPodcastの紹介。&lt;/p&gt;&#xA;&lt;h3 id=&#34;talk-python-to-me&#34;&gt;Talk Python To Me&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://talkpython.fm/&#34;&gt;talkpython.fm&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Pythonのpodcast。SQLAlchemyやrequestsなどめっちゃ使われているライブラリの作者が登場していて面白い。「SQLAlchemyはHibernateの影響を受けている」とか作者が言っていてなるほど確かにと思ったり。最初は英語の勉強目的で聴き始めたんだけど、普通にPythonの勉強になって一石二鳥な感じ。&lt;/p&gt;&#xA;&lt;h3 id=&#34;地獄のサンフランシスコ-by-chibicode&#34;&gt;地獄のサンフランシスコ by @chibicode&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=zWB6IwAt1UQ&#34;&gt;www.youtube.com&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;サンフランシスコの家賃がなぜあんなに高いのか、過去に成立してしまった謎の法律などとともに説明している。アメリカってもっと合理的な国だと思ったけど意外とそうでもないのかも...&lt;/p&gt;&#xA;&lt;h3 id=&#34;わたしが1年間に送ったメールのうち40件を公開しました&#34;&gt;わたしが1年間に送ったメールのうち40件を公開しました&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://chibicode.com/40-emails/&#34;&gt;http://chibicode.com/40-emails/&lt;/a&gt;&lt;a href=&#34;http://chibicode.com/40-emails/&#34;&gt;chibicode.com&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;上でも紹介した地獄のサンフランシスコ在住のShu Uesugiさんがメンティーに送った「ちゃんとした技術者になるための心得」のメールを公開していた。どれもはっとさせられる内容が多くて「これもっと早く呼んでおきたかったわー」という内容だった。&lt;/p&gt;&#xA;&lt;p&gt;特に&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;上達したいくせに、量をこなすことの大切さをナメてる人に読んでもらいたいです。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;という言葉にははっとさせられた。最近は技術系の雑誌や本を読んでわかった気になってしまっていて、写経したり自分で手を動かす努力を怠ってしまっていたので。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>What I read, watched, listened recently</title>
				<link>https://journal.lampetty.net/posts/20151003-2304/</link>
				<pubDate>Sat, 03 Oct 2015 23:04:09 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/20151003-2304/</guid>
				<description>&lt;h3 id=&#34;dotgo-2014---andrew-gerrand---5-things-i-love&#34;&gt;dotGo 2014 - Andrew Gerrand - 5 things I love&lt;/h3&gt;&#xA;&lt;p&gt;Andrew Gerrand is a Googler and worked for Go. I watched this video just to learn English but it was good that he was describing Go&#39;s feature very well.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=fsTOOPB1TBY&#34;&gt;www.youtube.com&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;golang-uk-conference-2015---andrew-gerrand---stupid-gopher-tricks&#34;&gt;Golang UK Conference 2015 - Andrew Gerrand - Stupid Gopher Tricks&lt;/h3&gt;&#xA;&lt;p&gt;Another Andrew&#39;s talk. &lt;a href=&#34;https://talks.golang.org/2015/tricks.slide#1&#34;&gt;Slide&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=UECh7X07m6E&#34;&gt;www.youtube.com&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;twelve-go-best-practices---francesc-campoy&#34;&gt;Twelve Go Best Practices - Francesc Campoy&lt;/h3&gt;&#xA;&lt;p&gt;Francesc Campoy is also a Googler and worked for Go. Best practices from Googler is worth to read. &lt;a href=&#34;http://talks.golang.org/2013/bestpractices.slide#1&#34;&gt;Slide&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=8D3Vmm1BGoY&#34;&gt;www.youtube.com&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;163-go-in-the-modern-enterprise-using-gokit-with-peter-bourgon---the-changelog&#34;&gt;#163: Go in the Modern Enterprise Using gokit with Peter Bourgon - The Changelog&lt;/h3&gt;&#xA;&lt;p&gt;Go kit is a framework for microservices, Gokit has features to help microservices such as circuit breakers, rate limiter, request tracing, etc... The guest Peter Bourgon used to work for Soundcloud which uses Go so much.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://changelog.com/163/&#34;&gt;https://changelog.com/163/&lt;/a&gt;&lt;a href=&#34;https://changelog.com/163/&#34;&gt;changelog.com&lt;/a&gt;&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Ansible Meetup in TokyoでLTしてきた</title>
				<link>https://journal.lampetty.net/posts/ansible-meetup-201509/</link>
				<pubDate>Wed, 16 Sep 2015 12:30:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/ansible-meetup-201509/</guid>
				<description>&lt;p&gt;「Vagrant環境のAnsibleを速くしたいというタイトル」で&lt;a href=&#34;http://ansible-users.connpass.com/event/18015/&#34;&gt;Ansible Meetup&lt;/a&gt;でLTしてきました。資料はこちら。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;//www.slideshare.net/oinume/vagrantansible&#34; title=&#34;Vagrant環境のAnsibleを速くしたい&#34;&gt;Vagrant環境のAnsibleを速くしたい&lt;/a&gt;&lt;/strong&gt; from &lt;strong&gt;&lt;a href=&#34;//www.slideshare.net/oinume&#34;&gt;Kazuhiro Oinuma&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;もともとは、「Ansible Meetup 行きたいなー。でももう埋まってるなー」から「LT枠に空きがあるからLTすればいいな」というノリでした。結果的にキャンセルがいっぱい出ていて、会場の4分の1ぐらいは席が空いていたという事態ｗ (もったいない&lt;/p&gt;&#xA;&lt;p&gt;LTは初めてかつ雰囲気がわからないイベントだったので、ネタ路線で攻めるべきなのかマジメに行くべきなのかわからなかったけど、ネタはそこそこウケていたみたいなので良かったです。あと、Ansible 2.0の話が聞けたのが嬉しかった。block機能が良さそうなのと、Playbook自体は1.x系と2系で互換性があるらしいのでリリースされたら使ってみたい。あと日経さんがAnsibleを使いこなしていて、かつSIerにも使ってもらうというすごいサイクルを生み出していたのが印象的だった。伊藤直也さんが技術顧問やっている影響なのか、最近情報発信がさかんでかなりイメージが上がっている気がします。&lt;/p&gt;&#xA;&lt;p&gt;Ansibleは今後もどんどん使っていきたいので、また何かイベントがあったら出たいなぁと思います。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Duplicating a MySQL table schema and data</title>
				<link>https://journal.lampetty.net/posts/duplicateing-a-mysql-table-schema-and-data/</link>
				<pubDate>Fri, 04 Sep 2015 20:31:19 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/duplicateing-a-mysql-table-schema-and-data/</guid>
				<description>&lt;p&gt;Duplicate foo table into foo_20150904&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/* Create a new table from foo&amp;#39;s schema */&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;gt; CREATE TABLE foo_20150904 LIKE foo;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/* Insert whole data into a new table */&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;gt; INSERT INTO foo_20150904 SELECT * FROM foo;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
			</item>
			<item>
				<title>Detecting duplicated code in Golang with CPD and Jenkins</title>
				<link>https://journal.lampetty.net/posts/detecting-duplicated-code-in-golang/</link>
				<pubDate>Sun, 30 Aug 2015 00:40:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/detecting-duplicated-code-in-golang/</guid>
				<description>&lt;h2 id=&#34;cpd-copy-paste-detecor&#34;&gt;CPD (Copy Paste Detecor)&lt;/h2&gt;&#xA;&lt;p&gt;Detecting duplicated code is a good way to make source code clean. Since I couldn&#39;t find how to detect duplicated code in Golang, I sent &lt;a href=&#34;https://github.com/pmd/pmd/pull/44&#34;&gt;a pull request&lt;/a&gt; that CPD(Copy Paste Detector) is able to accept Golang. CPD is a software included in &lt;a href=&#34;https://pmd.github.io/pmd-5.3.3/&#34;&gt;PMD&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;And there is a useful Jenkins plugin, &lt;a href=&#34;https://wiki.jenkins-ci.org/display/JENKINS/DRY+Plugin&#34;&gt;DRY&lt;/a&gt;. It visualizes how much duplicated code exist. I&#39;ll show you how to make it visible with Jenkins.&lt;/p&gt;&#xA;&lt;h2 id=&#34;setting-up-jenkins&#34;&gt;Setting up Jenkins&lt;/h2&gt;&#xA;&lt;p&gt;Use &lt;a href=&#34;https://www.docker.com/toolbox&#34;&gt;docker-toolbox&lt;/a&gt; to shortcut installing jenkins. After installing docker-toolbox, you just type following command.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ docker run -p 8080:8080 jenkins&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And then web can access to &lt;a href=&#34;http://192.168.99.100:8080/&#34;&gt;http://192.168.99.100:8080/&lt;/a&gt; and you&#39;ll see first Jenkins page.&lt;/p&gt;&#xA;&lt;h2 id=&#34;installing-pmd-plugin&#34;&gt;Installing PMD Plugin&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Click &amp;quot;Manage Jenkins&amp;quot; on a top page&lt;/li&gt;&#xA;&lt;li&gt;Click &amp;quot;Manage Plugins&amp;quot;&lt;/li&gt;&#xA;&lt;li&gt;Click &amp;quot;Available&amp;quot; Tab&lt;/li&gt;&#xA;&lt;li&gt;Select &amp;quot;Duplicate Code Scanner Plug-in&amp;quot;&lt;/li&gt;&#xA;&lt;li&gt;Click &amp;quot;Download now and install after restart&amp;quot;&lt;/li&gt;&#xA;&lt;li&gt;Jenkins will be restarted after plugin installed&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;create-a-job-to-detect-duplicated-code&#34;&gt;Create a job to detect duplicated code&lt;/h2&gt;&#xA;&lt;p&gt;We&#39;ll use terraform repository as an example.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Click &amp;quot;create new jobs&amp;quot; on a top page&lt;/li&gt;&#xA;&lt;li&gt;Select &amp;quot;Freestyle project&amp;quot; and type name for your job.&lt;/li&gt;&#xA;&lt;li&gt;Click Add build step and select &amp;quot;Execute shell&amp;quot; and paste following shell commands&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PMD&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pmd&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bin&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;5.3&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;d&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;PMD&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;];&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;then&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;curl&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;o&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;PMD&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;zip&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;L&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;O&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;downloads&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sourceforge&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;net&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;project&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pmd&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pmd&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;5.3&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pmd&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bin&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;5.3&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;3.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;zip&lt;/span&gt;\&lt;span class=&#34;err&#34;&gt;?&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;r&lt;/span&gt;\&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;A&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;F&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Fsourceforge&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;net&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Fprojects&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Fpmd&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Ffiles&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Fpmd&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;F5&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;3.3&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;F&lt;/span&gt;\&lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ts&lt;/span&gt;\&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1440850447&lt;/span&gt;\&lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;use_mirror&lt;/span&gt;\&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;jaist&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;e&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;PMD&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;zip&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;unzip&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;PMD&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;zip&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;fi&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;d&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;terraform&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;git&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;clone&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;https&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;github&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;com&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;hashicorp&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;terraform&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;git&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;PMD&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bin&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;run&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sh&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cpd&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;minimum&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tokens&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;100&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;files&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;terraform&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;language&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;go&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;format&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;xml&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cpd&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;xml&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;||&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;echo&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#xA;&lt;li&gt;Click &amp;quot;Add post-build action&amp;quot; on &amp;quot;Post-build Actions&amp;quot; and select &amp;quot;Publish duplicate code analysis results&amp;quot;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Duplicate code results: cpd.xml&lt;/li&gt;&#xA;&lt;li&gt;High priority threshold: 50 (default)&lt;/li&gt;&#xA;&lt;li&gt;Normal priority threshold: 25 (default)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Save the job and run it.&lt;/li&gt;&#xA;&lt;li&gt;We can see a link &amp;quot;Duplicate Code&amp;quot; on &lt;a href=&#34;http://192.168.99.100:8080/job/cpd/&#34;&gt;the job page&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Duplicate Code View &lt;a href=&#34;https://www.flickr.com/photos/oinume/20791432788/in/dateposted-public/&#34; title=&#34;Jenkins DRY Plugin&#34;&gt;&lt;img src=&#34;https://farm6.staticflickr.com/5679/20791432788_2898da530e_z.jpg&#34; alt=&#34;Jenkins DRY Plugin&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Duplicated code of terraform &lt;a href=&#34;https://www.flickr.com/photos/oinume/20381594293/in/dateposted-public/&#34; title=&#34;Duplicated code of terraform&#34;&gt;&lt;img src=&#34;https://farm1.staticflickr.com/629/20381594293_c32393da76_z.jpg&#34; alt=&#34;Duplicated code of terraform&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;options-of-cpd&#34;&gt;Options of CPD&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;--minimum-tokens: The minimum token length which should be reported as a duplicate. I recommend 70 - 100.&lt;/li&gt;&#xA;&lt;li&gt;--files: a directory to check duplication.&lt;/li&gt;&#xA;&lt;li&gt;--language: a programming language.&lt;/li&gt;&#xA;&lt;li&gt;--format: xml or plain&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;For further information, type following.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pmd-bin-5.3.3/bin/run.sh cpd -h&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;finally&#34;&gt;Finally&lt;/h2&gt;&#xA;&lt;p&gt;We can detect duplicated code with CPD and Jenkins.&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>YAPC::Asia 2015に行ってきた(2日目)</title>
				<link>https://journal.lampetty.net/posts/yapc-asia-2015-day2/</link>
				<pubDate>Mon, 24 Aug 2015 07:06:23 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/yapc-asia-2015-day2/</guid>
				<description>&lt;h2 id=&#34;前夜祭1日目のエントリ&#34;&gt;前夜祭、1日目のエントリ&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://oinume.hatenablog.com/entry/yapc-asia-2015-day0&#34;&gt;YAPC::Asia 2015行ってきた(前夜祭) - oinume journal&lt;/a&gt;&lt;a href=&#34;http://oinume.hatenablog.com/entry/yapc-asia-2015-day0&#34;&gt;oinume.hatenablog.com&lt;/a&gt; &lt;a href=&#34;http://oinume.hatenablog.com/entry/yapc-asia-2015-day1&#34;&gt;YAPC::Asia 2015に行ってきた(1日目) - oinume journal&lt;/a&gt;&lt;a href=&#34;http://oinume.hatenablog.com/entry/yapc-asia-2015-day1&#34;&gt;oinume.hatenablog.com&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;ちなみにトークは&lt;a href=&#34;https://www.youtube.com/user/yapcasia/featured&#34;&gt;YouTube&lt;/a&gt;にアップロードされる予定だそうなので、正座して待ちましょう。&lt;/p&gt;&#xA;&lt;h2 id=&#34;実はホットでオープンな-microsoft-azure&#34;&gt;&lt;a href=&#34;http://yapcasia.org/2015/talk/show/39a15ad4-0ff5-11e5-a984-d7f07d574c3a&#34;&gt;実はホットでオープンな Microsoft Azure&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;@myfinderさん。前夜祭で会った時に少しだけ話を聞いていて、面白そうなので聞いてみることにした。自分はもっぱらAWSしか使ってないけど、データのストリーム処理のところは使えそうだなぁと思った。その辺は自分たちのチームで開発しているのではなく、社内の別のチームに丸投げしているのだけど、かなり便利そうなのでもう自分たちでやるのもありなのでは？と感じた。&lt;/p&gt;&#xA;&lt;h3 id=&#34;azure&#34;&gt;Azure&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;IaaS/PaasS/SaaS&lt;/li&gt;&#xA;&lt;li&gt;2014/02に日本データセンター開設&lt;/li&gt;&#xA;&lt;li&gt;たくさんサービスある(500+)&lt;/li&gt;&#xA;&lt;li&gt;リージョンたくさん&#xA;&lt;ul&gt;&#xA;&lt;li&gt;日本だけで2箇所！&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;いけてるサービス&#34;&gt;いけてるサービス&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;データ解析サービスの組み合わせ&lt;/li&gt;&#xA;&lt;li&gt;Azure Stream Analytics with Event Hubs (リアルタイムデータ処理＆分析)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;azure-stream-analytics-with-event-hubs&#34;&gt;Azure Stream Analytics with Event Hubs&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Azure Event Hubs&#xA;&lt;ul&gt;&#xA;&lt;li&gt;1500万req/sぐらいさばける！！(あと4倍ぐらいいけるのでは？)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Stream Analytics リアルタイムデータ処理&#xA;&lt;ul&gt;&#xA;&lt;li&gt;SQLライクに処理できる&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;power-bi-dashboard&#34;&gt;Power BI Dashboard&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://qiita.com/myfinder/items/88cdad77c7472a02db61&#34;&gt;http://qiita.com/myfinder/items/88cdad77c7472a02db61&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;azure-machine-learning&#34;&gt;Azure Machine Learning&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;SPAM判定&lt;/li&gt;&#xA;&lt;li&gt;キーワード判定&lt;/li&gt;&#xA;&lt;li&gt;クラウド上のオーサリングツール: ML Studio&lt;/li&gt;&#xA;&lt;li&gt;豊富なサンプル&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;azureの下回りの話&#34;&gt;Azureの下回りの話&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;コンテナ搬入Video&lt;/li&gt;&#xA;&lt;li&gt;Catapult = 汎用サーバー＋専用ボード&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;iaasのモデル&#34;&gt;IaaSのモデル&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Compute&lt;/li&gt;&#xA;&lt;li&gt;Network&lt;/li&gt;&#xA;&lt;li&gt;Storage&lt;/li&gt;&#xA;&lt;li&gt;リソースグループ - 複数の要素をまとめるもの&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;software-designed-network&#34;&gt;Software Designed Network&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;ユーザーが仮想ネットワークを作ると何が起こるのか&lt;/li&gt;&#xA;&lt;li&gt;NVGRE&lt;/li&gt;&#xA;&lt;li&gt;Internet -&amp;gt; Azure SLB MUX(LoadBalancer) -&amp;gt; Azure SDN Stack(VFP)&lt;/li&gt;&#xA;&lt;li&gt;「NVGREのすべて」というMSの人が書いた本がある&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;azure-service-fabric&#34;&gt;Azure Service Fabric&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://qiita.com/TsuyoshiUshio@github/items/77cd5d561126d581210a&#34;&gt;Microserice向け&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;他のクラウドでも動かせるようになる&lt;/li&gt;&#xA;&lt;li&gt;オンプレミスにもAzure Stackが動かせるようになる！&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;質問&#34;&gt;質問&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;OSSは使っているのか？&#xA;&lt;ul&gt;&#xA;&lt;li&gt;使っている&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.google.com/search?q=windows+azure+portal&amp;amp;hl=en&amp;amp;lr=lang_en%7Clang_ja&#34;&gt;https://www.google.com/search?q=windows+azure+portal&amp;amp;hl=en&amp;amp;lr=lang_en%7Clang_ja&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;情報収集の方法は？&#xA;&lt;ul&gt;&#xA;&lt;li&gt;azure portal&lt;/li&gt;&#xA;&lt;li&gt;webinar&lt;/li&gt;&#xA;&lt;li&gt;GitHubにもドキュメントがある！(azure-content)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Azureではデータの処理と保存が別になっている&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;adventures-in-refactoring&#34;&gt;&lt;a href=&#34;http://yapcasia.org/2015/talk/show/bd04b86c-f9de-11e4-b996-8ab37d574c3a&#34;&gt;Adventures in refactoring&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Ben Lavenderさん。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;work at GitHub on internal tools&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;refactoringとは&#34;&gt;Refactoringとは&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;(なるべく)振る舞いをかえないでコードを変えること&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;consistency&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;DRY&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;measuring-success-refactoring&#34;&gt;Measuring Success refactoring&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;振る舞いをかえない&lt;/li&gt;&#xA;&lt;li&gt;ソースの行数が減っていること&lt;/li&gt;&#xA;&lt;li&gt;テストカバレッジが改善されていること&lt;/li&gt;&#xA;&lt;li&gt;パフォーマンスの改善&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;reason-to-refactoring&#34;&gt;Reason to refactoring&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;開発者が嬉しい - Developer Happiness&lt;/li&gt;&#xA;&lt;li&gt;パフォーマンスがよくなる&lt;/li&gt;&#xA;&lt;li&gt;将来に対しての自信になる Gain confidence for Future Work (AKA paying off technical debt)&lt;/li&gt;&#xA;&lt;li&gt;Developer education&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;technique&#34;&gt;technique&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;go fmt&lt;/li&gt;&#xA;&lt;li&gt;types for verbs&lt;/li&gt;&#xA;&lt;li&gt;Add useful abstractions&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pull.branch_valid?&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pull.branch_exists?&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; ↓&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pull.branch.valid?&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pull.branch.exists?&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#xA;&lt;li&gt;Remove unused abstractions&lt;/li&gt;&#xA;&lt;li&gt;deprecate :fetch, &amp;quot;Migrate&amp;quot; to fetch_with_limit plz&amp;quot;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;CIはコケる&lt;/li&gt;&#xA;&lt;li&gt;本番では動く&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Backwards compatible design&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;write-tools&#34;&gt;Write tools&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Backscatter&#xA;&lt;ul&gt;&#xA;&lt;li&gt;back_scatter 72をコードの中に入れると、どこからcallされているかが別の画面で見れるようになる&lt;/li&gt;&#xA;&lt;li&gt;def owners_team ; backscatter_deprecate_method ; end&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;science&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;science&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;widgets.loading&amp;#34;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;do&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;use&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;try&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;complaining&#34;&gt;Complaining&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Really good search/replace&lt;/li&gt;&#xA;&lt;li&gt;Extract resource&lt;/li&gt;&#xA;&lt;li&gt;Language facilities&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Java @deperecated&lt;/li&gt;&#xA;&lt;li&gt;Ruby&lt;/li&gt;&#xA;&lt;li&gt;compile-time deprecation sucks&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;わからなかった単語&#34;&gt;わからなかった単語&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;generally speaking&lt;/li&gt;&#xA;&lt;li&gt;criteria&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;questions&#34;&gt;questions&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Sometimes refactoring is boring but it is necessary, so my question is, Is there a commendation system for refactoring at Github&#xA;&lt;ul&gt;&#xA;&lt;li&gt;emojiとかで称えてるよ。praise: 褒め称える&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;ソーシャルゲームにおける-aws-移行事例&#34;&gt;&lt;a href=&#34;http://yapcasia.org/2015/talk/show/32a684e8-fd21-11e4-94eb-bdc07d574c3a&#34;&gt;ソーシャルゲームにおける AWS 移行事例&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;rdsへの移行&#34;&gt;RDSへの移行&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;connect時にタイムゾーン設定&lt;/li&gt;&#xA;&lt;li&gt;rebootした時にfailoverさせる機能があるので、検証で使った&lt;/li&gt;&#xA;&lt;li&gt;レプリ時にNOW() 使ってるとタイムゾーンずれちゃう問題&lt;/li&gt;&#xA;&lt;li&gt;インポートだけで209分&#xA;&lt;ul&gt;&#xA;&lt;li&gt;手順を工夫して90分&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;elasticache&#34;&gt;ElastiCache&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;60秒ぐらいの処理でフェイルオーバーしてしまう&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;go-debugging--profiling-and-optimization&#34;&gt;&lt;a href=&#34;http://yapcasia.org/2015/talk/show/6bde6c69-187a-11e5-aca1-525412004261&#34;&gt;Go Debugging , Profiling, and Optimization&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;@bradfitzさん。memcachedの開発者でありMogileFSとかDanga::Socketとか有名なソフトウェアを作っている。今はGoogleでGoの開発チームで働いている。せっかくのトークだったのに途中でアラートメールが来て半分以上聞けなかったのが残念だった。Goのオブジェクトのメモリ割り当ての話とか、かなり深いところまでつっこんで話していたので、&lt;a href=&#34;https://docs.google.com/presentation/d/1lL7Wlh9GBtTSieqHGJ5AUd1XVYR48UPhEloVem-79mA/view#slide=id.p&#34;&gt;スライド&lt;/a&gt;をあとで熟読したい。&lt;/p&gt;&#xA;&lt;h3 id=&#34;パフォーマンス&#34;&gt;パフォーマンス&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;benchmark: b.ReportAllocs()&lt;/li&gt;&#xA;&lt;li&gt;benchstat っていうコマンドもある&lt;/li&gt;&#xA;&lt;li&gt;import (_ &amp;quot;net/http&amp;quot;) でインポートして &lt;a href=&#34;http://localhost/debug/pprof&#34;&gt;http://localhost/debug/pprof&lt;/a&gt;でアクセスするとプロファイリングできる？&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;質問-1&#34;&gt;質問&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;プロファイリングの結果をGUIで見れる？&#xA;&lt;ul&gt;&#xA;&lt;li&gt;IntelliJ&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;最後に&#34;&gt;最後に&lt;/h2&gt;&#xA;&lt;p&gt;今日は@kyannyさんと話す機会があって(というか一方的に話しかけただけなんだけど)、Quipperの国際展開(フィリピン、インドネシア、メキシコ)や現地のエンジニアとどういう風に開発しているかという話が聞けて嬉しかった。&lt;/p&gt;&#xA;&lt;p&gt;YAPCには2006年からほぼ毎年行っているのだけど、YAPCで会って仲良くなって飲みに行くぐらいの仲になったり、ここに来ると純粋にもっと開発したくなる気持ちになるので、今年で(JPA主催の)YAPCは最後になってしまうのはとても残念。でもYAPCがあるから普段話さない人とも話すことがあったし、得られたことがとてもたくさんあったので本当に運営の牧さんやJPAのみなさんには感謝しています。今まで本当にありがとうございました！！&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>YAPC::Asia 2015に行ってきた(1日目)</title>
				<link>https://journal.lampetty.net/posts/yapc-asia-2015-day1/</link>
				<pubDate>Fri, 21 Aug 2015 23:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/yapc-asia-2015-day1/</guid>
				<description>&lt;h2 id=&#34;1日目感想&#34;&gt;1日目感想&lt;/h2&gt;&#xA;&lt;p&gt;遅刻してしまいLarry Wallの話が聞けなかったのが一番悔やまれるところだったけど、他の聞きたいトークは全部聞けたし、前夜祭で初めて話したnekogataさんのトークがすごく良くて、さらにその後懇親会でも話せたのですごく嬉しかった。YAPCは毎年何かしら新しい人との出会いがあって、今年で最後になってしまうというのが本当に悲しい。&lt;/p&gt;&#xA;&lt;p&gt;あとDMM英会話を最近始めた成果なのか、Electronの発表をしていた人の英語は80%ぐらい聞き取ることができた。たぶんすごく丁寧に喋っていた気がするんだけど、今までは英語のトークはほとんど内容が理解できてなかったので少しは成長したのかなぁと思う。&lt;/p&gt;&#xA;&lt;h2 id=&#34;effective-es6&#34;&gt;&lt;a href=&#34;http://yapcasia.org/2015/talk/show/44721562-10e4-11e5-88a0-d7f07d574c3a&#34;&gt;Effective ES6&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;@teppeis さん発表。Web+DB Pressの特集でもあったES6の話。JavaScriptがやっとやっと、、、まともな言語になってきた！という印象。これで様々なバッドノウハウベストプラクティスが不要になるのは本当に喜ぶべきことだと思う。&lt;/p&gt;&#xA;&lt;p&gt;あと、JavaScriptってハッシュにメソッド足していくのとかはPerlに似ているなぁとずっと思ってた。&lt;/p&gt;&#xA;&lt;h3 id=&#34;javascriptの落とし穴&#34;&gt;JavaScriptの落とし穴&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Prototype inheritance&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;クラスベースの継承じゃない&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;new, this&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;new忘れるとつらい&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;variable scope (function scope)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Effective&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Best practice&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;開眼JavaScript&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;ecmascript-6&#34;&gt;ECMAScript 6&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;2015/6/17にリリースされた&lt;/li&gt;&#xA;&lt;li&gt;こんな風にクラスが書ける&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;classs&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Person&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;constructor&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;greet&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;es6のサポート状況&#34;&gt;ES6のサポート状況&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Safari9&lt;/li&gt;&#xA;&lt;li&gt;IE11はサポートしてない&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;transpiler-and-polyfill&#34;&gt;Transpiler and polyfill&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;ES6のソースをES5 or ES3に変換する&lt;/li&gt;&#xA;&lt;li&gt;ES6 Polyfill&#xA;&lt;ul&gt;&#xA;&lt;li&gt;ES6の機能をJavaScript(ES5)で実装したもの&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;babel&#34;&gt;Babel&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;最も互換性が高いTranspiler(71%)&lt;/li&gt;&#xA;&lt;li&gt;polyfill library搭載 (core-js)&lt;/li&gt;&#xA;&lt;li&gt;REPL&lt;/li&gt;&#xA;&lt;li&gt;JS Fiddle もBabel対応したらしい&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;es6-features&#34;&gt;ES6 Features&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;新しい文法&lt;/li&gt;&#xA;&lt;li&gt;新しく追加されたビルトインクラス&lt;/li&gt;&#xA;&lt;li&gt;既存のクラスの拡張&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;arrow-function&#34;&gt;Arrow function&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;add&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;filter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;n&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;n&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;%&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;===&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;map&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;n&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;n&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;class&#34;&gt;Class&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;public, privateみたいなものはない&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;module&#34;&gt;Module&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;CommonJS Module&#xA;&lt;ul&gt;&#xA;&lt;li&gt;browserify/webpackを使う必要がある&lt;/li&gt;&#xA;&lt;li&gt;静的に解析するのが難しい&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;foo&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;foo&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;bar&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Baz&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;foo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;bar&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Baz&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;./module&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;foo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;use-strict&#34;&gt;use strict&lt;/h3&gt;&#xA;&lt;h3 id=&#34;block-scope&#34;&gt;block scope&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;function scope&lt;/li&gt;&#xA;&lt;li&gt;weird hoisting&lt;/li&gt;&#xA;&lt;li&gt;let or const&#xA;&lt;ul&gt;&#xA;&lt;li&gt;もうvarは使わなくていい&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;function foo() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  let num = 1;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  if (true) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    let num = 2;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  console.log(num);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;default-parameters&#34;&gt;Default parameters&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;function add (a = 1, b = 2) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;rest-parameters&#34;&gt;Rest parameters&lt;/h3&gt;&#xA;&lt;h3 id=&#34;destructuring-assignment&#34;&gt;Destructuring assignment&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;function draw(x, y, {width = 320, height = 160} = {}) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;size(0, 0);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;size(0, 0, { width: 1 });&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;template-literal&#34;&gt;Template literal&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;name&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;Bob&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Hello&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;I&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;m ${mame}.`;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;other-features&#34;&gt;Other features&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Iterator&lt;/li&gt;&#xA;&lt;li&gt;Spread Operator&lt;/li&gt;&#xA;&lt;li&gt;Generator&lt;/li&gt;&#xA;&lt;li&gt;Tail call optimization&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;new-build-in-claeses&#34;&gt;New build-in claeses&lt;/h3&gt;&#xA;&lt;h4 id=&#34;promise&#34;&gt;Promise&lt;/h4&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;new Promise((resolve, reject) =&amp;gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;hashset&#34;&gt;Hash/Set&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;WeakMap/SeakSet&lt;/li&gt;&#xA;&lt;li&gt;TypedArray&lt;/li&gt;&#xA;&lt;li&gt;Symbol&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;既存のクラスの拡張&#34;&gt;既存のクラスの拡張&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Object&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Object.assign (no more $.extend() ) -Shallow copy&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;String&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Unicode surrogate pair support&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;eslint&#34;&gt;ESLint&lt;/h3&gt;&#xA;&lt;h3 id=&#34;結論&#34;&gt;結論&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;ES6 is awesome&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;http2時代のウェブサイト設計&#34;&gt;&lt;a href=&#34;http://yapcasia.org/2015/talk/show/dead6890-09b7-11e5-998a-67dc7d574c3a&#34;&gt;HTTP/2時代のウェブサイト設計&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;@kazuho さん。立ち見だったのでメモが取れなかったんだけど、すごく良い発表だった。h2oの最適化が素晴らしい。Nginxじゃなくてh2o使おうかなと思うぐらい。なお、Nginxの開発者の人とも情報交換をしていて、h2oの実装を参考にNginxにもHTTP2の処理が入っていくのではないかとのこと。年内ぐらいには正式にHTTP2に対応したNginxが出てくるといいなぁ。&lt;/p&gt;&#xA;&lt;h3 id=&#34;はじめに&#34;&gt;はじめに&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;2秒遅くなるとクリック率が4%下がる&lt;/li&gt;&#xA;&lt;li&gt;4年間でデータの量は倍ぐらい増えてる&lt;/li&gt;&#xA;&lt;li&gt;bandwidthも大きくなってるからいいのでは？&#xA;&lt;ul&gt;&#xA;&lt;li&gt;webpageのロード時間はbandwidth速くなっても変わらない&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;ページロードはレイテンシが小さいほうがいい&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;perlで学ぼう文系プログラマのための知識ゼロからのデータ構造と計算量&#34;&gt;&lt;a href=&#34;http://yapcasia.org/2015/talk/show/9f7059dc-003c-11e5-a00c-89c77d574c3a&#34;&gt;Perlで学ぼう！文系プログラマのための、知識ゼロからのデータ構造と計算量&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Shinpei Maruyama (nekogata.com)さん。自分も文系なのでこの手の話はすごくよく分かる。プログラミング初心者にもわかりやすい内容で自分もいい復習になりました。&lt;/p&gt;&#xA;&lt;h3 id=&#34;メモリ&#34;&gt;メモリ&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;int main(int argc, char* argv[]) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  int a = 1;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  int b = 2;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  int c;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  c = a + b;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  printf(&amp;#34;%d&amp;#34;, c);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;### オーダー法&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* データの数がn個のとき、n回計算をしないといけないとき、O(n)という&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* O(n)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    * データが増えた時、計算量も同じ量で増える&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* O(log n)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    * データが多い時にデータが増えても計算量はそんなに増えない&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;## [Electron: Building desktop apps with web technologies](http://yapcasia.org/2015/talk/show/7d66b640-0a6b-11e5-b1a0-67dc7d574c3a)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Ben Ogleさん。すごく英語が聞き取りやすかった。かなりゆっくり喋ってくれたのかな？Electron自体はよくしらないけどAtomは普段から使っているので大体知っている内容だった。awesome-electornのリポジトリ見ると、かなりたくさんのアプリがElectronでできてるんだなぁと思ってその勢いの凄さにびっくりした。だってちゃんとAtomがリリースされてからまだ半年も経ってないし。&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* Work on Atom&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* Engineer at GitHub&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* AtomのクールなところはWebテクノロジーを使ってできているところ&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;### Electron&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* JavaScript, HTML, and CSS&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* io.js&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* Chromium&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* OS&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;### どんなものができるか&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* GitHub Atom&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* MS Visual Studio Code&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* Facebook Nuclide&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* Jibo (Electron based robots)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* Fireball&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* Slack client&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;https://github.com/sindresorhus/awesome-electron&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;### KittyDetect&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* 猫の顔があるかを認識するアプリ&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* 2時間で作った&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;### 質疑応答&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* AtomもCoffeeScriptやめてES6に書き直している途中らしい&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* OAuthで戻ってくるのってどうすればいいの？&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    * protocol handler使う&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
			</item>
			<item>
				<title>YAPC::Asia 2015行ってきた(前夜祭)</title>
				<link>https://journal.lampetty.net/posts/yapc-asia-2015-day0/</link>
				<pubDate>Thu, 20 Aug 2015 23:30:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/yapc-asia-2015-day0/</guid>
				<description>&lt;p&gt;今年でJPA主催のYAPCは最後ということで、いつもは前夜祭は参加しないのだけれど行ってきた。&lt;/p&gt;&#xA;&lt;p&gt;最初に聞いたのは @hsbt さんの&lt;a href=&#34;http://yapcasia.org/2015/talk/show/b355fa20-122e-11e5-8ba5-d9f87d574c3a&#34;&gt;言語開発の現場&lt;/a&gt;という話。Rubyはリリース作業が特に大変だと言っていた。自動化したくてもなかなか面倒くさいものなのかなぁ。Rubyは日本人の開発者が多いので、外国人から「日本語でやりとりして仕様が決まっているのではないか」みたいに思われることがあったとか。しかしそのぐらい公共のものになってきている感じがすごいと思った。&lt;/p&gt;&#xA;&lt;p&gt;その後、@myfinderさんに捕まって出会ってMicrosoft Azureの面白そうな話をいろいろ聞いた。そういえば転職されてから話すのは初めてだったかもしれない。Azureはデータ処理のサービスが面白そうで、NorikraみたいにSQLでストリームのデータにアクセスでき、さらに処理とデータ保存が分離されているのでロックインされずらいそうだ。AzureってMachine Learningもすごそうだし純粋に使ってみたいなぁと思った。&lt;/p&gt;&#xA;&lt;p&gt;とりあえず明日から本番なので1日目は特に飲みに行ったりせずに大人しく帰宅。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Make VirtualBox&#39;s network faster with paravirtualized network adapter</title>
				<link>https://journal.lampetty.net/posts/make-virtualboxs-network-faster-with-paravirtualized-network-adapter/</link>
				<pubDate>Tue, 28 Jul 2015 08:30:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/make-virtualboxs-network-faster-with-paravirtualized-network-adapter/</guid>
				<description>&lt;p&gt;I develop applications with Vagrant and VirtualBox and feel frustrated about slowness of VirtualBox. Since I found &lt;a href=&#34;https://www.virtualbox.org/manual/ch06.html#nichardware&#34;&gt;virtio&lt;/a&gt; (paravirtualized network adapter), I tried it out on my application.&lt;/p&gt;&#xA;&lt;h3 id=&#34;how-to-enable-virtio-with-vagrant&#34;&gt;How to enable virtio with Vagrant&lt;/h3&gt;&#xA;&lt;p&gt;Add following lines into your Vagrantfile.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;v.customize [&amp;#34;modifyvm&amp;#34;, :id, &amp;#34;--nictype1&amp;#34;, &amp;#34;virtio&amp;#34;]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;v.customize [&amp;#34;modifyvm&amp;#34;, :id, &amp;#34;--nictype2&amp;#34;, &amp;#34;virtio&amp;#34;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;results&#34;&gt;Results&lt;/h3&gt;&#xA;&lt;p&gt;I ran &lt;code&gt;time vagrant provision&lt;/code&gt; with old and new settings and virtio-net is 1.2x faster than 82540EM (default network adapter).&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;vagrant provision 14.85s user 12.49s system 5% cpu 8:20.59 total&lt;/code&gt; with Intel PRO/1000 MT Desktop (82540EM)&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;vagrant provision 14.63s user 12.62s system 6% cpu 7:00.70 total&lt;/code&gt; with virtio-net&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B00WVH5SY8/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/51piyNH5ppL._SL160_.jpg&#34; alt=&#34;Ansible: Up and Running&#34; loading=&#34;lazy&#34; title=&#34;Ansible: Up and Running&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B00WVH5SY8/kazzhomeunixo-22/&#34;&gt;Ansible: Up and Running&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: Lorin Hochstein&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: O&#39;Reilly Media&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2015/04/29&lt;/li&gt;&#xA;&lt;li&gt;メディア: Kindle版&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/B00WVH5SY8/kazzhomeunixo-22&#34;&gt;この商品を含むブログを見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>Building Vagrant box from VirtualBox OVF</title>
				<link>https://journal.lampetty.net/posts/building-vagrant-box-from-virtualbox-ovf/</link>
				<pubDate>Mon, 29 Jun 2015 06:30:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/building-vagrant-box-from-virtualbox-ovf/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;https://www.packer.io/docs/builders/virtualbox-ovf.html&#34;&gt;VirtualBox Builder (from an OVF/OVA) - Packer by HashiCorp&lt;/a&gt;&lt;a href=&#34;https://www.packer.io/docs/builders/virtualbox-ovf.html&#34;&gt;www.packer.io&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;I realized that Packer can build Vagrant box from VirtualBox OVF file not only from ISO image. Building Vagrant box takes much time to run an installer so I&#39;m very happy to skip the step.&lt;/p&gt;&#xA;&lt;p&gt;I created Ansible installed Vagrant box from another box to try.&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Run &#39;vagrant box add oinume/ubuntu-14.04-jp&#39;&lt;/li&gt;&#xA;&lt;li&gt;Downloaded box is stored in ~/.vagrant.d/boxes/oinume-VAGRANTSLASH-ubuntu-14.04-jp/1.0.1/virtualbox and box.ovf is in the directory.&lt;/li&gt;&#xA;&lt;li&gt;Specify the path of .ovf like below in template.json and run &#39;packer build template.json&#39;&lt;/li&gt;&#xA;&lt;li&gt;&#39;ubuntu-14-04-x64-jp-ansible-virtualbox.box&#39; created.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B00WVH5SY8/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/51piyNH5ppL._SL160_.jpg&#34; alt=&#34;Ansible: Up and Running&#34; loading=&#34;lazy&#34; title=&#34;Ansible: Up and Running&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B00WVH5SY8/kazzhomeunixo-22/&#34;&gt;Ansible: Up and Running&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: Lorin Hochstein&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: O&#39;Reilly Media&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2015/04/29&lt;/li&gt;&#xA;&lt;li&gt;メディア: Kindle版&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/B00WVH5SY8/kazzhomeunixo-22&#34;&gt;この商品を含むブログを見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>RDS(MySQL)のバイナリログはすぐ消えるから注意</title>
				<link>https://journal.lampetty.net/posts/rds-mysql-binlog-retention/</link>
				<pubDate>Fri, 29 May 2015 20:49:26 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/rds-mysql-binlog-retention/</guid>
				<description>&lt;p&gt;これ知らないとハマるかもしれないのでメモ。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER\_LogAccess.Concepts.MySQL.html&#34;&gt;MySQL Database Log Files - Amazon Relational Database Service&lt;/a&gt;&lt;a href=&#34;http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_LogAccess.Concepts.MySQL.html&#34;&gt;docs.aws.amazon.com&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;に&amp;quot;Amazon RDS normally purges a binary log as soon as possible&amp;quot;とある通り、RDSではバイナリログはすぐ消えてしまう。もし自前でスレーブを立てたりするためにバイナリログをある程度とっておきたい場合は、&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;call mysql.rds_set_configuration(&amp;#39;binlog retention hours&amp;#39;, 24);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;のプロシージャを実行してバイナリログの保持期間を伸ばすことができる。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4797382570/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/61bW5UM-sYL._SL160_.jpg&#34; alt=&#34;Amazon Web Services パターン別構築・運用ガイド&#34; loading=&#34;lazy&#34; title=&#34;Amazon Web Services パターン別構築・運用ガイド&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4797382570/kazzhomeunixo-22/&#34;&gt;Amazon Web Services パターン別構築・運用ガイド&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: NRIネットコム株式会社,佐々木拓郎,林晋一郎,小西秀和,佐藤瞬&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: SBクリエイティブ&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2015/03/25&lt;/li&gt;&#xA;&lt;li&gt;メディア: 大型本&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4797382570/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (2件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>AnsibleでPlaybook流した時のgit commit hashをファイルに出力したら捗った</title>
				<link>https://journal.lampetty.net/posts/ansible-git-commit-hash/</link>
				<pubDate>Fri, 29 May 2015 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/ansible-git-commit-hash/</guid>
				<description>&lt;p&gt;「このサーバにどこまでPlaybook流したんだっけ？」みたいなことでよく悩んでいたので、AnsibleのPlaybookが入ったリポジトリのgit commit hashをファイルに出力してそれをサーバーに置くようにしてみた。&lt;/p&gt;&#xA;&lt;p&gt;こんな感じのアクションをPlaybookに書いて簡単にできた。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;local_action&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;shell&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;usr&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bin&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;git&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;show&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;format&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=%&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;H&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tmp&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;version&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;txt&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;sudo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;False&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;copy&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;src&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tmp&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;version&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;txt&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dest&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=/&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;var&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tmp&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;version&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;txt&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B00MALTGDY/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/51Ef9h7qfpL._SL160_.jpg&#34; alt=&#34;入門Ansible&#34; loading=&#34;lazy&#34; title=&#34;入門Ansible&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B00MALTGDY/kazzhomeunixo-22/&#34;&gt;入門Ansible&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: 若山史郎&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2014/07/30&lt;/li&gt;&#xA;&lt;li&gt;メディア: Kindle版&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/B00MALTGDY/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (2件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>新年の抱負の進捗どうですか？</title>
				<link>https://journal.lampetty.net/posts/20150522-1930/</link>
				<pubDate>Fri, 22 May 2015 19:30:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/20150522-1930/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;http://oinume.hatenablog.com/entry/2015-new-years-resolution&#34;&gt;oinume.hatenablog.com&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;こんな感じの新年の抱負を書いたのだけど、そろそろ2015年も40%経過したので進捗報告。&lt;/p&gt;&#xA;&lt;h3 id=&#34;dockerを実戦投入する&#34;&gt;Dockerを実戦投入する&lt;/h3&gt;&#xA;&lt;p&gt;進捗ダメです。やっと個人でDockerを使い始めたレベル。&lt;/p&gt;&#xA;&lt;h3 id=&#34;英語でブログエントリーを書く割合を25にしてみる&#34;&gt;英語でブログエントリーを書く割合を25%にしてみる&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://journal.lampetty.net/entry/changing-bower-package-cache-directory&#34;&gt;Mocking a HTTP access with http.Transport in GoLang&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://journal.lampetty.net/entry/changing-bower-package-cache-directory&#34;&gt;Changing bower package cache directory&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;この2つは英語でかいて、あとひとつは日本語なので今のところ達成！しかしそもそも激烈にブログ頻度が低下しているのでそっちの方がやばい。&lt;/p&gt;&#xA;&lt;h3 id=&#34;フロントエンドwebを頑張る&#34;&gt;フロントエンド(Web)を頑張る&lt;/h3&gt;&#xA;&lt;p&gt;これは個人的なキャリアの方向転換により諦めました()&lt;/p&gt;&#xA;&lt;h3 id=&#34;reactive-programmingをちゃんと理解する&#34;&gt;Reactive Programmingをちゃんと理解する&lt;/h3&gt;&#xA;&lt;p&gt;これも個人的なキャリアの(ry&lt;/p&gt;&#xA;&lt;h3 id=&#34;アルゴリズムを深く理解する&#34;&gt;アルゴリズムを深く理解する&lt;/h3&gt;&#xA;&lt;p&gt;進捗ダメです... インプットはしてるけどアウトプットをしていないので完全に身になってない。&lt;/p&gt;&#xA;&lt;h3 id=&#34;方向転換&#34;&gt;方向転換&lt;/h3&gt;&#xA;&lt;p&gt;やっぱり自分はサーバサイドエンジニアとして頑張っていこうと思ったので、今後は機械学習とか自然言語処理を頑張っていく所存です。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>開発スピードと技術的負債</title>
				<link>https://journal.lampetty.net/posts/development-speed-or-technical-debt/</link>
				<pubDate>Fri, 22 May 2015 18:30:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/development-speed-or-technical-debt/</guid>
				<description>&lt;p&gt;よくある「開発スピードを優先させるか技術的負債をなるべく発生させないようにするか」という議論、ケースバイケースだとは思うけど、ことプロダクトの立ち上げ段階では、悩んだら「開発スピード」を優先させるようにするべきだと自分は思ってる。&lt;/p&gt;&#xA;&lt;p&gt;理由は 市場は待ってくれないから。どんなにいいプロダクトでもユーザーに使われなくては意味がないのと、プロダクトを取り巻く外部の環境(競合プロダクトや市場でのニーズ)は自分ではコントロールできないものなのに対して、技術的負債については適切に管理されていればコントロールしながら返済できるから。もちろんバランスも重要だとは思うので、どんな技術的負債も生み出していいかと言われるとそうではないけど。&lt;/p&gt;&#xA;&lt;p&gt;というわけで自分は「ああこれクソコードだけど機能は満たしてるからそのままリリースしたいなぁ」というのはだいたいクソコードのままリリースしています。(こうやって免罪符を作っているのです)&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Mocking a HTTP access with http.Transport in Golang</title>
				<link>https://journal.lampetty.net/posts/mocking-http-access-in-golang/</link>
				<pubDate>Mon, 13 Apr 2015 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/mocking-http-access-in-golang/</guid>
				<description>&lt;p&gt;I&#39;ve investegated a way to mock HTTP request and response when writing a code to access to a HTTP API with &lt;code&gt;http.Client&lt;/code&gt;. Finally, I found that I can do it by just implementing &lt;code&gt;RoundTrip&lt;/code&gt; method of &lt;code&gt;http.RoundTripper&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Here is an example of mocking and proxying HTTP request and response. Running with &lt;code&gt;go run main.go -mock mock&lt;/code&gt;, you can get mocked result and with &lt;code&gt;go run main.go -mock proxy&lt;/code&gt;, you can get proxied result with httptest.Server.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;package&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;flag&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;io/ioutil&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;net/http&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;net/http/httptest&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;net/url&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;strings&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mock&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;flag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;mock&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Doesn&amp;#39;t perform real access when &amp;#39;proxy&amp;#39; or &amp;#39;mock&amp;#39; is specified&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;flag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Parse&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;client&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;DefaultClient&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mock&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;proxy&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;server&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;newServer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;defer&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;server&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Close&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;client&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Transport&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Transport&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Proxy&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;to&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;httptest&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Server&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;which&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;created&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;above&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;Proxy&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;req&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Request&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;url&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;URL&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;error&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;url&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Parse&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;server&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;URL&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mock&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;mock&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;client&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Transport&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;newMockTransport&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;resp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;client&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;http://ifconfig.co/all.json&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;nil&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;panic&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;defer&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;resp&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Body&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Close&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;body&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ioutil&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ReadAll&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;resp&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Body&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;GET http://ifconfig.co/all.json&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;body&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Create&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;HTTP&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;server&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;to&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mocked&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;newServer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;httptest&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Server&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;httptest&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;NewServer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;HandlerFunc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;w&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ResponseWriter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;r&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Request&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;w&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;WriteHeader&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;200&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;w&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Header&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Set&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Content-Type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;application/json&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Fprintln&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;w&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;err&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;Accept-Encoding&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;proxy&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;],&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;User-Agent&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;proxy&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;],&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;X-Ip-Country&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;Japan(Proxy)&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;],&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;X-Real-Ip&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;192.168.1.1&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;type&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mockTransport&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;struct&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;newMockTransport&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;RoundTripper&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mockTransport&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Implement&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;RoundTripper&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;t&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mockTransport&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;RoundTrip&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;req&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Request&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Response&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;error&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Create&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mocked&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Response&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;response&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Response&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;Header&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;     &lt;span class=&#34;n&#34;&gt;make&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Header&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;Request&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;    &lt;span class=&#34;n&#34;&gt;req&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;StatusCode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;StatusOK&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Header&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Set&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Content-Type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;application/json&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;responseBody&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;err&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;Accept-Encoding&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;mock&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;],&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;User-Agent&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;mock&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;],&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;X-Ip-Country&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;Japan(Mock)&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;],&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;X-Real-Ip&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;192.168.1.1&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;`&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Body&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ioutil&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;NopCloser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;strings&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;NewReader&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;responseBody&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;nil&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I think it&#39;s very simple to mock a HTTP request in GoLang. net/http package is awesome.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/1783988029/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/51ORKn4G8HL._SL160_.jpg&#34; alt=&#34;Go Programming Blueprints&#34; loading=&#34;lazy&#34; title=&#34;Go Programming Blueprints&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/1783988029/kazzhomeunixo-22/&#34;&gt;Go Programming Blueprints&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: Mat Ryer&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: Packt Publishing&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2015/01/23&lt;/li&gt;&#xA;&lt;li&gt;メディア: ペーパーバック&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/1783988029/kazzhomeunixo-22&#34;&gt;この商品を含むブログを見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>Changing bower package cache directory</title>
				<link>https://journal.lampetty.net/posts/changing-bower-package-cache-directory/</link>
				<pubDate>Thu, 26 Feb 2015 23:30:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/changing-bower-package-cache-directory/</guid>
				<description>&lt;p&gt;bower caches packages in ~/.cache/bower. How can I change the directory? &lt;a href=&#34;http://bower.io/docs/config/#storage&#34;&gt;bower&#39;s document&lt;/a&gt; says &amp;quot;Add the following in .bowerrc&amp;quot; but it&#39;s totally wrong.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;#34;storage&amp;#34;: {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &amp;#34;cache&amp;#34; : &amp;#34;~/.bower/cache&amp;#34;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &amp;#34;registry&amp;#34; : &amp;#34;~/.bower/registry&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I try the configuration and run &lt;code&gt;bower install&lt;/code&gt; but nothing changed. I finally found out correct configuration in &lt;a href=&#34;https://github.com/bower/config/blob/master/lib/util/defaults.js&#34;&gt;bower/config&lt;/a&gt; repo.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;#34;storage&amp;#34;: {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  packages: &amp;#34;.bower/packages&amp;#34;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  registry: &amp;#34;.bower/registry&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Why the document of famous software such as &lt;code&gt;bower&lt;/code&gt; is wrong?&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B00OUJL6P0/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/51dJljEB%2BkL._SL160_.jpg&#34; alt=&#34;TypeScript Essentials&#34; loading=&#34;lazy&#34; title=&#34;TypeScript Essentials&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B00OUJL6P0/kazzhomeunixo-22/&#34;&gt;TypeScript Essentials&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: Christopher Nance&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: Packt Publishing&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2014/10/21&lt;/li&gt;&#xA;&lt;li&gt;メディア: Kindle版&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/B00OUJL6P0/kazzhomeunixo-22&#34;&gt;この商品を含むブログを見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>2015年の抱負</title>
				<link>https://journal.lampetty.net/posts/2015-new-years-resolution/</link>
				<pubDate>Sun, 04 Jan 2015 21:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/2015-new-years-resolution/</guid>
				<description>&lt;p&gt;一年の計は元旦にあり、という言葉がありますがこのエントリーは1月4日に書いています。どうもこんにちは。あまり一年の目標は立てずにフラフラと生きてきたんだけど、アラフォーに近づいてきてそろそろ自堕落な生き方に危機感を覚えてきたので今年の目標を書いておく。&lt;/p&gt;&#xA;&lt;h3 id=&#34;dockerを実戦投入する&#34;&gt;Dockerを実戦投入する&lt;/h3&gt;&#xA;&lt;p&gt;仕事では余裕なくてDocker使ってないんだけどちゃんと使って運用できるようにしたい。早くEC2 Container Service使えるようにならないかなぁ。&lt;/p&gt;&#xA;&lt;h3 id=&#34;英語でブログエントリーを書く割合を25にしてみる&#34;&gt;英語でブログエントリーを書く割合を25%にしてみる&lt;/h3&gt;&#xA;&lt;p&gt;英語なりプログラミング言語は使う機会がないとドンドン衰えちゃうんだけど、残念ながら職場ではドキュメントを読む以外ではまったく必要ないので、このブログのエントリーで英語の割合を増やしてみようと思う。というわけで日本人以外にも読めるようにブログタイトルを変えてみた。&lt;/p&gt;&#xA;&lt;h3 id=&#34;フロントエンドwebを頑張る&#34;&gt;フロントエンド(Web)を頑張る&lt;/h3&gt;&#xA;&lt;p&gt;ReactとTypeScriptを習得したい。ネイティブアプリ系はそのうち消え行くと思うのであえてやらない。&lt;/p&gt;&#xA;&lt;h3 id=&#34;reactive-programmingをちゃんと理解する&#34;&gt;Reactive Programmingをちゃんと理解する&lt;/h3&gt;&#xA;&lt;p&gt;Reactive Programmingが今年は来そうな気がするのでちゃんと理解して使えるようにしたい。&lt;/p&gt;&#xA;&lt;h3 id=&#34;アルゴリズムを深く理解する&#34;&gt;アルゴリズムを深く理解する&lt;/h3&gt;&#xA;&lt;p&gt;よく使われるdeflateとかB+Treeとか、実際に自分で実装してみて中身まで理解しないとなぁと思う今日このごろ。普通にWebサービスを作っているだけだと「データベースからデータを取得したものをちょい加工して返す」みたいなプログラムしか書かなくてアルゴリズム回りの知識をアップデートできないので。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>2014年振り返り</title>
				<link>https://journal.lampetty.net/posts/looking-back-2014/</link>
				<pubDate>Sat, 03 Jan 2015 02:05:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/looking-back-2014/</guid>
				<description>&lt;p&gt;1/3に2014年の振り返りをしている時点ですでに周回遅れになっているわけですが... 技術的な振り返りは&lt;a href=&#34;https://journal.lampetty.net/entry/used-technologies-in-2014&#34;&gt;2014年に使ってみた技術&lt;/a&gt;に書いたので、仕事やプライベートのことを振り返ってみる。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;仕事では7月ぐらいにゲーム系じゃなくてメディア系を立ち上げる部署に異動した。Unityを触ったりしたんだけど、やっぱりゲームを作るのは相当な労力がいるし自分には向いてないんじゃないかなぁと思ってメディア系の部署へ。あと今回は第一線でバリバリ開発する立ち位置なので今は産みの苦しみを絶賛味わってます。あとちょっと...&lt;/li&gt;&#xA;&lt;li&gt;プライベートでは、1月ぐらいに車をお義母さんからゆずってもらって15年ぶりぐらいに車を運転してみた。15年間ペーパードライバーだったんだけど、奥さんが妊娠してたので強制的に病院の送り迎えをすることになり、近距離ならなんとか運転できるようになってきた。人だけは轢かないように心がけてる。車種はトヨタのAllionっていうセダン。すでに12万キロ走っているのでそろそろ壊れる気がする。&lt;/li&gt;&#xA;&lt;li&gt;あと人生の一大イベントで4月に息子が生まれててんやわんや。でもとてつもなくかわいくて毎週成長を見るのが楽しい。仕事できる時間が減り、自分の時間もほぼゼロになってしまったけど、息子を育てる方が社会に貢献できている気がするｗ 出生率があがれば高齢化社会や人口減少問題が緩和されるらしいので、もう一人ぐらい頑張りたいところ。&lt;/li&gt;&#xA;&lt;li&gt;飼い猫のししまるが2歳に。2014年は年初から誤飲事件が発生して救急病院に通った。おかげでペット保険の必要性を認識して加入。その後ちょいちょい医者にかかっているのでこれは入っておいてよかったなと思う。今はししまる毎日元気に走り回って息子の攻撃からもひらりと身をかわしている。&lt;/li&gt;&#xA;&lt;li&gt;Amazonでモノを買うのを辞めて、&lt;a href=&#34;http://blogger.lampetty.net/2014/01/yodobashi-is-awesome.html&#34;&gt;yodobashi.comのヘビーユーザーになった&lt;/a&gt;。&lt;/li&gt;&#xA;&lt;li&gt;ライブは2月にAvril、11月にKnotfestでKORNを見たぐらい。毎年行っていたサマソニも自粛したので今年こそ行きたい。KORNまた今年も来日しないかな。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://instagram.com/p/xHKuDwtHtp/&#34;&gt;&lt;img src=&#34;http://instagram.com/p/xHKuDwtHtp/media/?size=l&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>2014年に使ってみた技術</title>
				<link>https://journal.lampetty.net/posts/used-technologies-in-2014/</link>
				<pubDate>Fri, 02 Jan 2015 21:13:42 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/used-technologies-in-2014/</guid>
				<description>&lt;p&gt;新年明けましておめでとうございます。2014年内に書き上げるはずの記事がずっと下書きのまま眠ってしまっていた... 2014年は細かいものを含めるといろいろ新しいものを使い始めたのでそのまとめ。&lt;/p&gt;&#xA;&lt;h3 id=&#34;ansible&#34;&gt;Ansible&lt;/h3&gt;&#xA;&lt;p&gt;Chefがあまり好きではないのでAnsibleを今やっているプロジェクトで入れてみた。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;DSLを覚えなくてはいけないのはどちらも一緒&lt;/li&gt;&#xA;&lt;li&gt;Ansibleの方が仕組みがシンプルでPlaybookに書いた順に実行されるのでわかりやすい&lt;/li&gt;&#xA;&lt;li&gt;Dynamic Inventory便利&lt;/li&gt;&#xA;&lt;li&gt;AnsibleはYAMLなのでロジックをゴリゴリ書くのには向いていない&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Chefはその点Rubyのコードなのでなんでもできる&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;という感じでどっちもどっちだなという印象。個人的にはChefのようにコードが実行される方がフレキシブルでいいと思っているので、&lt;a href=&#34;http://www.fabfile.org/&#34;&gt;Fabric&lt;/a&gt; + &lt;a href=&#34;https://pypi.python.org/pypi/cuisine&#34;&gt;Cuisine&lt;/a&gt;も試してみたい。&lt;/p&gt;&#xA;&lt;h3 id=&#34;packer&#34;&gt;Packer&lt;/h3&gt;&#xA;&lt;p&gt;Vagrantで使うイメージファイルを作るのに使った。便利。&lt;a href=&#34;https://github.com/shiguredo/packer-templates&#34;&gt;時雨堂のリポジトリ&lt;/a&gt;がとても参考になった。&lt;/p&gt;&#xA;&lt;h3 id=&#34;awscli&#34;&gt;awscli&lt;/h3&gt;&#xA;&lt;p&gt;便利すぎ。AWSのドキュメントは情報量が多すぎて読むのがつらいんだけど、代わりにこのツールのドキュメントを読むとAWSで何ができるのかが大体把握できるので( ・∀・)ｲｲ!!&lt;/p&gt;&#xA;&lt;h3 id=&#34;go&#34;&gt;Go&lt;/h3&gt;&#xA;&lt;p&gt;Cをちょっと今風にした言語。言語仕様としてはJava 1.2ぐらいのレベルのもので正直扱いづらい。ただ、あえて言語仕様をシンプルにしていて、読みやすさを重視しているというのは大規模開発には向いているのでは？と思って導入してみた。今めちゃくちゃ勢いあるし。&lt;/p&gt;&#xA;&lt;p&gt;導入してよかったなと思う点は、&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;静的型付け言語なので安心してリファクタリングできる&lt;/li&gt;&#xA;&lt;li&gt;半年ごとにバージョンアップするしで着実に進化はしている&lt;/li&gt;&#xA;&lt;li&gt;go getなどのツールが充実してる&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;つらいところは&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;ベストプラクティスがわからないことが多い&lt;/li&gt;&#xA;&lt;li&gt;Webアプリケーションフレームワークやパッケージ管理が乱立し過ぎていて選択が難しい&lt;/li&gt;&#xA;&lt;li&gt;他の言語で当たり前のようにできることができなかったりする&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;というところかなぁ。ブログにも&lt;a href=&#34;https://journal.lampetty.net/category/golang&#34;&gt;ちょいちょい小技を書いている&lt;/a&gt;のでよかったらどうぞ。&lt;/p&gt;&#xA;&lt;h3 id=&#34;percol-peco&#34;&gt;percol, peco&lt;/h3&gt;&#xA;&lt;p&gt;開発環境回りではこれが一番効果があった気がする。サーバーサイドのエンジニアだとターミナルという黒い謎の画面を見て怪しげなコマンドをたくさん打たなくてはいけないんだけど、そのコマンドの履歴の検索とか絞り込みが画期的にやりやすくなる。最初はpercol使ってたんだけど、pecoの方がバイナリもあって楽にインストールできるので乗り換えた。あとはzsh関連のよさ気なヤツを入れてみた。その辺の話はここで。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://journal.lampetty.net/entry/improve-my-terminal-with-zsh-prezto&#34;&gt;ターミナル環境を見直す(1) - zsh + prezto編&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://journal.lampetty.net/entry/improve-my-terminal-with-percol&#34;&gt;ターミナル環境を見直す(2) - percol編&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;tmux-tmuxinator&#34;&gt;tmux, tmuxinator&lt;/h3&gt;&#xA;&lt;p&gt;3年前まではscreenを使っていて、その後はMacのiTermで複数タブでしのいでいたんだけどターミナル環境見直しの一環でtmuxを導入してみた。詳しくは&lt;a href=&#34;https://journal.lampetty.net/entry/improve-my-terminal-with-tmux&#34;&gt;ターミナル環境を見直す(3) - tmux編&lt;/a&gt;を見てもらえればと。&lt;/p&gt;&#xA;&lt;p&gt;tmuxinatorは&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ mux start sample&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ってやると&lt;a href=&#34;https://github.com/oinume/dotfiles/blob/master/.tmuxinator/sample.yml&#34;&gt;こんな感じのYAMLの設定ファイル&lt;/a&gt;に書いた内容でtmuxのwindowがバババーンと立ち上がるのがすごい便利。&lt;/p&gt;&#xA;&lt;h3 id=&#34;angularjs&#34;&gt;Angular.js&lt;/h3&gt;&#xA;&lt;p&gt;ちょっとした自分向けのツールで使ってみた。あまりJavaScriptが得意ではない自分としてはすごく簡単にdata bindingできるので純粋に便利だなぁと思ったけど、大きめのアプリをAngularで実装しようと思うと覚えることが多くてツラい印象。「こういう時どうするんだっけ？」っていうのをイチイチググらないとAngular way がわからなくてつらい感じ。&lt;/p&gt;&#xA;&lt;h3 id=&#34;atom&#34;&gt;Atom&lt;/h3&gt;&#xA;&lt;p&gt;最近はIntelliJで開発することが多いんだけど、ちょっとしたテキストの修正にはGitHub製のAtomを使ってる。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Markdownのプレビューがデフォルトでできる&lt;/li&gt;&#xA;&lt;li&gt;CoffeeScriptで拡張できる&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;のがメリットかなぁ。試しに&lt;a href=&#34;https://github.com/oinume/atom-sudden-death-generator&#34;&gt;突然の死ジェネレータのパッケージ&lt;/a&gt;を作ってみたりしたのと、Qiitaにこんなのを書いたりした。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://qiita.com/oinume/items/2127d024a02c972237ed&#34;&gt;Atomで入れておきたいpackage - Qiita&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://qiita.com/oinume/items/e6aa66fc20183ebeddb4&#34;&gt;マイAtomチートシート - Qiita&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B00MALTGDY/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/51Ef9h7qfpL._SL160_.jpg&#34; alt=&#34;入門Ansible&#34; loading=&#34;lazy&#34; title=&#34;入門Ansible&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B00MALTGDY/kazzhomeunixo-22/&#34;&gt;入門Ansible&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: 若山史郎&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2014/07/30&lt;/li&gt;&#xA;&lt;li&gt;メディア: Kindle版&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/B00MALTGDY/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (2件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>Macで特定のポートを使用しているプロセスを特定する</title>
				<link>https://journal.lampetty.net/posts/how-to-find-process-of-using-specific-port-on-mac/</link>
				<pubDate>Mon, 29 Dec 2014 12:17:32 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/how-to-find-process-of-using-specific-port-on-mac/</guid>
				<description>&lt;p&gt;ターミナルで&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ lsof -i :3000&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;COMMAND  PID   USER   FD   TYPE            DEVICE SIZE/OFF NODE NAME&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;go   2087 a11920  269u  IPv6 0x7574d6a56e437f1      0t0  TCP *:hbci (LISTEN)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;って打つと3000番ポートを使ってるプロセスが調べられる。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4801801153/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/61XtdimnLPL._SL160_.jpg&#34; alt=&#34;Mac OS X Yosemiteパーフェクトガイド (100%ムックシリーズ)&#34; loading=&#34;lazy&#34; title=&#34;Mac OS X Yosemiteパーフェクトガイド (100%ムックシリーズ)&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4801801153/kazzhomeunixo-22/&#34;&gt;Mac OS X Yosemiteパーフェクトガイド (100%ムックシリーズ)&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;出版社/メーカー: 晋遊舎&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2014/12/12&lt;/li&gt;&#xA;&lt;li&gt;メディア: ムック&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4801801153/kazzhomeunixo-22&#34;&gt;この商品を含むブログを見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>Goで標準出力をキャプチャする</title>
				<link>https://journal.lampetty.net/posts/capturing-stdout-in-golang/</link>
				<pubDate>Sat, 27 Dec 2014 21:48:46 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/capturing-stdout-in-golang/</guid>
				<description>&lt;p&gt;こんな感じかなぁ。&lt;a href=&#34;http://play.golang.org/p/2DFtYAsFO9&#34;&gt;http://play.golang.org/p/2DFtYAsFO9&lt;/a&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;package&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;bytes&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;io&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;os&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;type&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Capturer&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;saved&lt;/span&gt;         &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;os&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;File&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;bufferChannel&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;chan&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;out&lt;/span&gt;           &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;os&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;File&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt;            &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;os&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;File&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;標準出力をキャプチャする&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;c&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Capturer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;StartCapturingStdout&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;saved&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;os&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Stdout&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;error&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;out&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;os&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Pipe&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;nil&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;panic&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;os&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Stdout&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;out&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bufferChannel&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;make&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;chan&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;go&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;b&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;bytes&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Buffer&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;io&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Copy&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bufferChannel&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;キャプチャを停止する&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;c&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Capturer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;StopCapturingStdout&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;string&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;out&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Close&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;os&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Stdout&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;saved&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bufferChannel&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;c&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Capturer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;StartCapturingStdout&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;hello&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;captured&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;StopCapturingStdout&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;captured:&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;captured&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/487311697X/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/51kSuWt53uL._SL160_.jpg&#34; alt=&#34;アンダースタンディング コンピュテーション―単純な機械から不可能なプログラムまで&#34; loading=&#34;lazy&#34; title=&#34;アンダースタンディング コンピュテーション―単純な機械から不可能なプログラムまで&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/487311697X/kazzhomeunixo-22/&#34;&gt;アンダースタンディング コンピュテーション―単純な機械から不可能なプログラムまで&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: Tom Stuart,笹田耕一(監訳),笹井崇司&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: オライリージャパン&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2014/09/18&lt;/li&gt;&#xA;&lt;li&gt;メディア: 大型本&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/487311697X/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (5件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>GoLangでJavaのenumっぽいライブラリ作った話</title>
				<link>https://journal.lampetty.net/posts/introducing-goenum/</link>
				<pubDate>Sun, 07 Dec 2014 11:04:17 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/introducing-goenum/</guid>
				<description>&lt;ul&gt;&#xA;&lt;li&gt;この記事は、&lt;a href=&#34;http://www.adventar.org/calendars/358&#34;&gt;CyberAgent エンジニア Advent Calendar 2014&lt;/a&gt;の7日目の記事です。&lt;/li&gt;&#xA;&lt;li&gt;6日目はkamatama41さんの&lt;a href=&#34;http://ameblo.jp/principia-ca/entry-11959788304.html&#34;&gt;アメーバピグへのGoogle BigQuery導入までのもろもろ設定記&lt;/a&gt; です&lt;/li&gt;&#xA;&lt;li&gt;8日目はstormcat24さんです&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;はじめに&#34;&gt;はじめに&lt;/h3&gt;&#xA;&lt;p&gt;Goでは言語標準でenumという機構がなくてつらかったのでそれっぽいものを作ったよという話。&lt;/p&gt;&#xA;&lt;p&gt;Goではiotaを使って以下のようにして定数を列挙することはできる。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;Go&lt;/span&gt; &lt;span class=&#34;ne&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;iota&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;Python&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;Ruby&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ただし、このやり方だと&lt;a href=&#34;http://www.ne.jp/asahi/hishidama/home/tech/java/enum.html&#34;&gt;Javaのenum&lt;/a&gt;のように&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;値から名前(↑でいう&amp;quot;Java&amp;quot;という定数名)を取得したり、名前からその値を引く&lt;/li&gt;&#xA;&lt;li&gt;全ての値を列挙する&lt;/li&gt;&#xA;&lt;li&gt;全ての名前を列挙する&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;というようなことができない。下記のように値→名前を取得する関数を定義することはできるので1.はなんとかなるわけなんだけど、これを毎回書くのは面倒なので &lt;a href=&#34;https://github.com/oinume/goenum&#34;&gt;goenum&lt;/a&gt; というライブラリを作ってみたよという話(ここからが本題)。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://play.golang.org/p/5nrPOMEQKZ&#34;&gt;http://play.golang.org/p/5nrPOMEQKZ&lt;/a&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;package&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;type&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Lang&lt;/span&gt; &lt;span class=&#34;ne&#34;&gt;int&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;l&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Lang&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;ne&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;string&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;switch&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;l&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Go&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Go&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Python&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Python&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Ruby&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Ruby&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;panic&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Unknown value&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;Go&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Lang&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;iota&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;Python&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;Ruby&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Printf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;%s&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;: &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;%d&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\n&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Go&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(),&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Go&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Printf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;%s&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;: &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;%d&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\n&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Python&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(),&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Python&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Printf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;%s&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;: &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;%d&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\n&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Ruby&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(),&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Ruby&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;goenum&#34;&gt;goenum&lt;/h3&gt;&#xA;&lt;p&gt;goenumでは列挙する値はconstではなくstructを使って定義する。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;type LangsEnum struct {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    Go     int&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    Python int&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    Ruby   int&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    Haskel int&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;でで、その構造体(↑でいうLangsEnum)に下記のようなEnum()というメソッドを定義しておき、goenum.EnumerateStruct という関数にLangsEnumの実体を渡す。goenum.EnumerateStruct() という関数は goenum.Enum を返すんだけど、これが&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;値→名前&lt;/li&gt;&#xA;&lt;li&gt;名前→値&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;の変換を行ってくれる。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Langs&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;LangsEnum&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;LangsEnum&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;e&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;LangsEnum&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Enum&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;goenum&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Enum&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Make&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Enum&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Langs&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;goenum&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;EnumerateStruct&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Langs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以下は実際に使ってみた例。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;langs&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;goenum&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Enum&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Langs&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Enum&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;名前の列挙&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;langs&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Names&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Go&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Python&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Ruby&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Haskel&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;値の列挙&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;langs&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Values&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;値&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;名前の取得&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;langs&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MustName&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Go&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;名前&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;値の取得&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;langs&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MustValue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Python&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&amp;gt;&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;本当は構造体で元の列挙値を定義するやり方にはしたくなかったんだけど、自分のGo力が低すぎるのでこういう仕上がりになっているので、もっと良いやり方があったらぜひ教えて欲しいところです。&lt;/p&gt;&#xA;&lt;h3 id=&#34;追記&#34;&gt;追記&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://mattn.kaoriya.net/software/lang/go/20141208093852.htm&#34;&gt;Big Sky :: Re: GoLangでJavaのenumっぽいライブラリ作った話&lt;/a&gt;でstringerというコマンドを使う方法を教えてもらいました。1.4では go generate コマンドもあるし、これ使ってgenerateするのがIdiomatic wayのような気がしますね。mattnさんありがとうございます！&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Recent open source activities</title>
				<link>https://journal.lampetty.net/posts/recent-open-source-activities-on-nov-2014/</link>
				<pubDate>Sat, 08 Nov 2014 20:19:51 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/recent-open-source-activities-on-nov-2014/</guid>
				<description>&lt;h3 id=&#34;pmd&#34;&gt;pmd&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/pmd/pmd/pull/44&#34;&gt;https://github.com/pmd/pmd/pull/44&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;CPD (Copy Paste Detector) supported GoLang.&lt;/p&gt;&#xA;&lt;h3 id=&#34;go-xorm&#34;&gt;go-xorm&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/go-xorm/xorm/issues/166&#34;&gt;https://github.com/go-xorm/xorm/issues/166&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Suggested and implemented &amp;quot;soft delete&amp;quot; for xorm. My pull-request was immediately merged! (very impressive)&lt;/p&gt;&#xA;&lt;h3 id=&#34;goose&#34;&gt;goose&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://bitbucket.org/liamstask/goose/pull-request/43/support-mysql-driver&#34;&gt;https://bitbucket.org/liamstask/goose/pull-request/43/support-mysql-driver&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Added mysql driver support. My pull-request hasn&#39;t been merged yet. I contacted to the author but he didn&#39;t respond.&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Macでファイルが変更されたら自動的にgofmtをかける</title>
				<link>https://journal.lampetty.net/posts/gofmt-with-fswatch-on-mac/</link>
				<pubDate>Tue, 21 Oct 2014 22:23:48 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/gofmt-with-fswatch-on-mac/</guid>
				<description>&lt;p&gt;fswatchを使うと楽っぽい。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ brew install fswatch&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ fswatch . | xargs -n1 -I{} gofmt -w {}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;gofmt -w だと、stdoutに出力せずに直接対象ファイルに書き込まれる。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>gunicornをローカル開発環境のWebサーバとして使う</title>
				<link>https://journal.lampetty.net/posts/use-gunicorn-on-local-machine/</link>
				<pubDate>Sun, 12 Oct 2014 22:20:07 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/use-gunicorn-on-local-machine/</guid>
				<description>&lt;p&gt;--reloadオプションがバージョン19.0からサポートされたので、下記のような感じで起動するとローカルの開発サーバとして使える。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;gunicorn&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;access&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;logfile&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;file&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;reload&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;b&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;127.0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;0.1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3000&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;w&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;app&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;app&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#xA;&lt;li&gt;--access-logfile: &amp;quot;-&amp;quot;を指定するとstderrにアクセスログが出る&lt;/li&gt;&#xA;&lt;li&gt;--log-file: ↑と同様に&amp;quot;-&amp;quot;を指定するとstderrにエラーログが出る&lt;/li&gt;&#xA;&lt;li&gt;--reload: ソースコードが変更されたらリロードする&lt;/li&gt;&#xA;&lt;li&gt;-b: bindするアドレスとポートの指定&lt;/li&gt;&#xA;&lt;li&gt;-w: ワーカー数&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4873116880/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/51slC51WgOL._SL160_.jpg&#34; alt=&#34;Python文法詳解&#34; loading=&#34;lazy&#34; title=&#34;Python文法詳解&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4873116880/kazzhomeunixo-22/&#34;&gt;Python文法詳解&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: 石本敦夫&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: オライリージャパン&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2014/09/18&lt;/li&gt;&#xA;&lt;li&gt;メディア: 大型本&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4873116880/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (1件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>Goでnilなsliceやmapを返すと空のsliceやmapになる</title>
				<link>https://journal.lampetty.net/posts/nil-to-empty-slice-and-map/</link>
				<pubDate>Mon, 15 Sep 2014 02:58:25 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/nil-to-empty-slice-and-map/</guid>
				<description>&lt;p&gt;タイトルの通りだけど知らなかったので。明示的に空のsliceやmapを作らなくてもいいのは楽だ。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://play.golang.org/p/veOWHGDdcn&#34;&gt;http://play.golang.org/p/veOWHGDdcn&lt;/a&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;go&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;package&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;emptyMap&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;map&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nil&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;emptySlice&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nil&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;emptySlice&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;emptySlice&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Printf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;slice len = %d\n&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;emptySlice&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;emptyMap&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;emptyMap&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Printf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;map len = %d\n&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;emptyMap&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4863541171/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/51ZzoXpsmqL._SL160_.jpg&#34; alt=&#34;基礎からわかる Go言語&#34; loading=&#34;lazy&#34; title=&#34;基礎からわかる Go言語&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4863541171/kazzhomeunixo-22/&#34;&gt;基礎からわかる Go言語&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: 古川昇&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: シーアンドアール研究所&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2012/11/21&lt;/li&gt;&#xA;&lt;li&gt;メディア: 単行本（ソフトカバー）&lt;/li&gt;&#xA;&lt;li&gt;クリック: 7回&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4863541171/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (5件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>golintの-min_confidenceでチェックするレベルを変更する</title>
				<link>https://journal.lampetty.net/posts/golint-min-confidence/</link>
				<pubDate>Sat, 13 Sep 2014 22:23:42 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/golint-min-confidence/</guid>
				<description>&lt;p&gt;これはGo的にはあまりやらない方がいいと思うやつなんだけど、こういうこともできるよ、という紹介。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;type Hoge struct {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    Url    string&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;みたいに書いてgolintを実行すると &amp;quot;struct field Url should be URL&amp;quot; と怒られる。しかし、golintには -min_confidence という引数を指定できる。デフォルトは0.8なので、試しにこれを1.0に引き上げてみると&amp;quot;struct field Url should be URL&amp;quot;というエラーは出なくなる。&lt;a href=&#34;https://github.com/golang/lint/blob/master/lint.go&#34;&gt;https://github.com/golang/lint/blob/master/lint.go&lt;/a&gt; のソースを見てみると、いろいろなチェック処理で&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;errorf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;vs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;link&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;docCommentsLink&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;category&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;comments&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;exported &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;%s&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt; &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;%s&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt; should have comment&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;%s&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt; or be unexported&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;kind&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;block&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;のようにf.errorfの第2引数にConfidenceを指定しているので、該当のエラーを消したい場合は -min_confidence でそのチェック処理のConfidenceより大きい物を指定すれば良さそう。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;package&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;type&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Session&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;Url&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Session&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Open&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;ne&#34;&gt;bool&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;bp&#34;&gt;true&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Session&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;https://github.com/&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Open&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ためしにこんな感じのソースをgolintにかけるとデフォルトでは&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;golint&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;golint&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;go&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;golint&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;golint&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;go&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;6&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;exported&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;type&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Session&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;should&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;have&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;comment&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;or&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;be&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;unexported&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;golint&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;golint&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;go&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;7&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;exported&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;method&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Session&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Open&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;should&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;have&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;comment&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;or&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;be&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;unexported&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;golint&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;golint&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;go&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;field&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Url&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;should&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;be&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;URL&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;というエラーが出るけど、-min_confidence=1.1にすると全部出なくなる。あんまりやらない方がいいことだとは思うけど、エラー出まくるからという理由でgolintをかけなくなるよりかは -min_confidence を指定してgolintする方がいいのではないかなぁと思った次第です。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/1469769166/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/41e1tTPrYlL._SL160_.jpg&#34; alt=&#34;The Way to Go: A Thorough Introduction to the Go Programming Language&#34; loading=&#34;lazy&#34; title=&#34;The Way to Go: A Thorough Introduction to the Go Programming Language&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/1469769166/kazzhomeunixo-22/&#34;&gt;The Way to Go: A Thorough Introduction to the Go Programming Language&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: Ivo Balbaert&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: iUniverse&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2012/03/08&lt;/li&gt;&#xA;&lt;li&gt;メディア: ペーパーバック&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/1469769166/kazzhomeunixo-22&#34;&gt;この商品を含むブログを見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>Revel Frameworkでのテスト</title>
				<link>https://journal.lampetty.net/posts/test-on-revel/</link>
				<pubDate>Wed, 10 Sep 2014 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/test-on-revel/</guid>
				<description>&lt;p&gt;今使っている&lt;a href=&#34;http://revel.github.io/&#34;&gt;Revel Framework&lt;/a&gt;のテストについてまとめてみた。&lt;/p&gt;&#xA;&lt;h2 id=&#34;デモ&#34;&gt;デモ&lt;/h2&gt;&#xA;&lt;p&gt;サンプル &lt;a href=&#34;https://github.com/oinume/revel-sample&#34;&gt;https://github.com/oinume/revel-sample&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;テストの実行(ブラウザー経由)&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;revel run revel-sample&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&#34;http://localhost:9000/@tests&#34;&gt;http://localhost:9000/@tests&lt;/a&gt; にアクセス&lt;/p&gt;&#xA;&lt;p&gt;テストの実行(CUI)&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;revel test revel-sample&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;testsuite&#34;&gt;TestSuite&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;type AppTest struct {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    revel.TestSuite&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;revel.TestSuiteを埋め込んで使うと、コイツが持っている各種関数が使えるようになる。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;t.Get(PATH)&lt;/li&gt;&#xA;&lt;li&gt;t.AssertOk()&lt;/li&gt;&#xA;&lt;li&gt;t.AssertContentType&lt;/li&gt;&#xA;&lt;li&gt;etc...&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;type&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;AppTest&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;revel&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;TestSuite&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;t&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;AppTest&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Before&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Set up&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Test&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;must&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;start&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;with&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;Test&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;t&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;AppTest&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;TestThatIndexPageWorks&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;AssertOk&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Check&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;HTTP&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;status&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;200&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;AssertContentType&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;text/plain; charset=utf-8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;AssertContains&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Hello world&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;t&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;AppTest&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;After&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Tear down&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;beforeafter&#34;&gt;Before/After&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;テスト関数を実行する前/後に呼び出される。&lt;/li&gt;&#xA;&lt;li&gt;テスト関数が呼び出されるたびに呼ばれるので、テストで使うデータのリセットなどを行う用途に使う。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;どういうモデルで動作しているか&#34;&gt;どういうモデルで動作しているか？&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;TestSuite(HTTP Client)  --&amp;gt; Revel app (Server)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;revel test を実行すると裏でサーバーが立ち上がって、TestSuiteがクライアントとしてHTTPリクエストを投げてる。&lt;/p&gt;&#xA;&lt;p&gt;厳密には...&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;revel test&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://localhost:9000/@tests.list&#34;&gt;http://localhost:9000/@tests.list&lt;/a&gt; からTestSuiteのリストを取得&lt;/li&gt;&#xA;&lt;li&gt;TestSuite実行&#xA;&lt;ul&gt;&#xA;&lt;li&gt;TestSuite(HTTP Client) --&amp;gt; Revel app (Server)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;結果をコマンドラインに表示&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;となっている。&lt;/p&gt;&#xA;&lt;h2 id=&#34;よくある質問&#34;&gt;よくある質問&lt;/h2&gt;&#xA;&lt;h3 id=&#34;特定のテストだけ実行したい&#34;&gt;特定のテストだけ実行したい&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ revel test revel-sample AppTest.TestThatIndexPageWorks&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;引数に &amp;lt;TestSuite名&amp;gt;.&amp;lt;Test関数名&amp;gt; という形式で渡せばそのテスト関数だけ実行される&lt;/p&gt;&#xA;&lt;h3 id=&#34;テスト時のサーバー側のログをあとで確認したい&#34;&gt;テスト時のサーバー側のログをあとで確認したい&lt;/h3&gt;&#xA;&lt;p&gt;test-results/app.log にログファイルあるよ！&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B00M2L81NI/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/51dzPP2SjkL._SL160_.jpg&#34; alt=&#34;Mastering Concurrency in Go&#34; loading=&#34;lazy&#34; title=&#34;Mastering Concurrency in Go&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B00M2L81NI/kazzhomeunixo-22/&#34;&gt;Mastering Concurrency in Go&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: Nathan Kozyra&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: Packt Publishing&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2014/07/23&lt;/li&gt;&#xA;&lt;li&gt;メディア: Kindle版&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/B00M2L81NI/kazzhomeunixo-22&#34;&gt;この商品を含むブログを見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>Atomで突然の死ジェネレータを作ってみた</title>
				<link>https://journal.lampetty.net/posts/atom-sudden-death-generator/</link>
				<pubDate>Thu, 28 Aug 2014 09:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/atom-sudden-death-generator/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;https://atom.io/packages/sudden-death-generator&#34;&gt;https://atom.io/packages/sudden-death-generator&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Atomのpackageを作る練習として。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://atom.io/docs/latest/creating-a-package&#34;&gt;本家のドキュメント&lt;/a&gt;が詳しい&lt;/li&gt;&#xA;&lt;li&gt;ソースを直したらCmd + Shift + P でWindow: Reloadを実行すると反映される&lt;/li&gt;&#xA;&lt;li&gt;spec(ユニットテスト)の書き方がよくわからない&lt;/li&gt;&#xA;&lt;li&gt;スクリーンショットのアニGifは&lt;a href=&#34;http://www.cockos.com/licecap/&#34;&gt;LICEcap&lt;/a&gt;使って撮った。便利。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B00KRB9U2G/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/51JmurssNOL._SL160_.jpg&#34; alt=&#34;実践Node.jsプログラミング (Programmer&amp;#39;s SELECTION)&#34; loading=&#34;lazy&#34; title=&#34;実践Node.jsプログラミング (Programmer&amp;#39;s SELECTION)&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B00KRB9U2G/kazzhomeunixo-22/&#34;&gt;実践Node.jsプログラミング (Programmer&#39;s SELECTION)&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: Mike Cantelon,Marc Harter,T.J. Holowaychuk,Naithan Rajlich&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: 翔泳社&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2014/06/10&lt;/li&gt;&#xA;&lt;li&gt;メディア: Kindle版&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/B00KRB9U2G/kazzhomeunixo-22&#34;&gt;この商品を含むブログを見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>Nginxのserver_nameに正規表現で量指定子を使うとエラー</title>
				<link>https://journal.lampetty.net/posts/nginx-server-name-regex/</link>
				<pubDate>Fri, 22 Aug 2014 19:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/nginx-server-name-regex/</guid>
				<description>&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;server_name ~^(?&amp;lt;subdomain&amp;gt;[\w]{3,})\.example\.com$;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Nginxの設定ファイルで↑のような感じのserver_nameを書いて起動しようとすると&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2014/08/21 23:07:02 [emerg] 17233#0: directive &amp;#34;server_name&amp;#34; is not terminated by &amp;#34;;&amp;#34; in /etc/nginx/conf.d/vhost.conf:10&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;というエラーが出てしまった。「えっ、server_nameの正規表現で量指定子使えないの？マジで？」とか思って調べたら単にダブルクォートで括ればいいだけだった。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;server_name &amp;#34;~^(?&amp;lt;subdomain&amp;gt;[\w]{3,})\.example\.com$&amp;#34;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&#34;http://nginx.org/en/docs/http/server_names.html#regex_names&#34;&gt;ドキュメント&lt;/a&gt; に&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;A regular expression containing the characters “{” and “}” should be quoted&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;って書いてあったのでドキュメント嫁ということです。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4873116457/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/51br3R9ROmL._SL160_.jpg&#34; alt=&#34;マスタリングNginx&#34; loading=&#34;lazy&#34; title=&#34;マスタリングNginx&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4873116457/kazzhomeunixo-22/&#34;&gt;マスタリングNginx&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: Dimitri Aivaliotis,高橋基信&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: オライリージャパン&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2013/10/26&lt;/li&gt;&#xA;&lt;li&gt;メディア: 大型本&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4873116457/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (5件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>Goのstructとinterface</title>
				<link>https://journal.lampetty.net/posts/golang-struct-and-interface/</link>
				<pubDate>Tue, 12 Aug 2014 20:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/golang-struct-and-interface/</guid>
				<description>&lt;p&gt;社内でGo勉強会をやったのでその時に自分が発表した時の内容。オブジェクト指向的なことをGoでどう実現するのか、どの辺を諦めなくてはいけないのかをまとめてみた。&lt;/p&gt;&#xA;&lt;h1 id=&#34;goでのオブジェクト指向&#34;&gt;Goでのオブジェクト指向&lt;/h1&gt;&#xA;&lt;p&gt;Goでは基本的にオブジェクト指向プログラミングはできないと思ったほうが良い。できるのはstructを定義して関数を追加していくことだけである。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://play.golang.org/p/7w9nbHDec1&#34;&gt;http://play.golang.org/p/7w9nbHDec1&lt;/a&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;package&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;type&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;User&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;Id&lt;/span&gt;   &lt;span class=&#34;ne&#34;&gt;int&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;Name&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;文字列化する関数&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;u&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;User&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;ne&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;string&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Sprintf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;%d&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;%s&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;u&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;u&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;user&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;User&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;User&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;oinume&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;user&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;継承っぽいことを実現するには&#34;&gt;継承っぽいことを実現するには&lt;/h1&gt;&#xA;&lt;p&gt;埋め込み構造体を使えばクラスの継承っぽいことはできる。ただし、継承という仕様はないため型の互換性はない。Mixinに近い感じ。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://play.golang.org/p/5wHW90Zvs6&#34;&gt;http://play.golang.org/p/5wHW90Zvs6&lt;/a&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;package&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;type&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;User&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;Id&lt;/span&gt; &lt;span class=&#34;ne&#34;&gt;int&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;Name&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;u&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;User&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;ne&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;string&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Sprintf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;%d&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;%s&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;u&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;u&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;通常の埋め込み構造体&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;type&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;BannedUser&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;User&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;BannedReason&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;u&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;BannedUser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;GetBannedReason&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;string&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;u&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;BannedReason&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;ポインタ型の埋め込み構造体&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;type&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PBannedUser&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;User&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;BannedReason&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;u&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;PBannedUser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;GetBannedReason&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;string&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;u&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;BannedReason&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;user&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;BannedUser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;User&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;oinume&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Too many spam&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;user&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;puser&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PBannedUser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;User&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;oinume&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Too many spam&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;User&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Nameが参照できる&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;puser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;puser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;User&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Name&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;でも参照可能&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;puser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;User&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Mixin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;User&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;を呼び出す&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;puser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;u&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;User&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;PBannedUser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;User&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;oinume&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Too many spam&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;  &lt;span class=&#34;err&#34;&gt;型の互換性はない&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;//--&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;compile&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;error&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cannot&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;use&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PBannedUser&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;literal&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;type&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;PBannedUser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;as&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;type&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;User&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;assignment&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;型の定義とキャスト&#34;&gt;型の定義とキャスト&lt;/h2&gt;&#xA;&lt;p&gt;以下のようにキャストしても、呼び出されるのはReadOnlyDatabaseの関数ではなく、Databaseのものであることに注意。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://play.golang.org/p/2U5NVaYKb_&#34;&gt;http://play.golang.org/p/2U5NVaYKb_&lt;/a&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;package&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Database&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;type&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Database&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;d&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Database&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;NewSession&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Session&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Session&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Session&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;type&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Session&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Session&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Connect&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;string&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Session.Connect()&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ReadOnlyDatabase&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;type&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ReadOnlyDatabase&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Database&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;d&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ReadOnlyDatabase&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;NewSession&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ReadOnlySession&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ReadOnlySession&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ReadOnlySession&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;type&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ReadOnlySession&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Session&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ReadOnlySession&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Connect&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;string&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;ReadOnlySession.Connect()&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;database&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Database&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Database&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;session&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Session&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;database&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;NewSession&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;session&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Connect&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;roDataBase&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ReadOnlyDatabase&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ReadOnlyDatabase&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ReadOnlySession&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Session型にキャスト&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;roSession&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Session&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Session&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;roDataBase&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;NewSession&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;★&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ReadOnlySession&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Connect&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;ではなく&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Session&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Connect&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;が呼ばれる&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;roSession&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Connect&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ReadOnlySession型&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ros&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ReadOnlySession&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;roDataBase&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;NewSession&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;★この場合は&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ReadOnlySession&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Connect&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;が呼ばれる&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ros&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Connect&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Javaだと下記はReadOnlySession.Connect()のメソッドが呼ばれる。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;roSession&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Session&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Session&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;roDataBase&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;NewSession&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;roSession&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Connect&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&#34;http://golang.org/doc/faq#How_do_I_get_dynamic_dispatch_of_methods&#34;&gt;http://golang.org/doc/faq#How_do_I_get_dynamic_dispatch_of_methods&lt;/a&gt;&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;The only way to have dynamically dispatched methods is through an interface. Methods on a struct or any other concrete type are always resolved statically.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h1 id=&#34;interfaceとduck-typing&#34;&gt;interfaceとduck typing&lt;/h1&gt;&#xA;&lt;p&gt;Goでは型の継承という仕様はないが、interfaceというものがある。interfaceは単にメソッドを記述したものである。そのメソッドを実装しているstructはそのinterfaceを満たしていると言える。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;package&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;「&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JSON化できる&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;」インターフェース&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;type&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JSONable&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;interface&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;JSON&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;type&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;User&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;Id&lt;/span&gt;   &lt;span class=&#34;ne&#34;&gt;int&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;Name&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JSON&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;メソッドを実装&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;User&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JSON&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;string&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Sprintf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;d&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;%s&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;type&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;AdminUser&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;User&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;Admin&lt;/span&gt; &lt;span class=&#34;ne&#34;&gt;bool&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;User&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JSON&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;をオーバーライド&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;AdminUser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JSON&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;string&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Sprintf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;d&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;%s&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Admin&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;v&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Admin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JSONable&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;を実装しているので&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JSONable型に代入できる&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;user&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JSONable&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;User&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;oinume&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;user&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JSON&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;AdminUserもJSONableを実装している&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;adminUser&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JSONable&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;AdminUser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;User&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;admin&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt; &lt;span class=&#34;bp&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;adminUser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JSON&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;★型アサーションで&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;adminUserがJSONableを実装しているかチェックする&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;jsonable&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ok&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;adminUser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JSONable&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ok&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;実装してる場合&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Printf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;JSON(): &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;%s&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\n&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;jsonable&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JSON&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;実装してない場合&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Printf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Not JSONable&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\n&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;duck-typingとは&#34;&gt;Duck Typingとは&lt;/h2&gt;&#xA;&lt;p&gt;「アヒルのように鳴くならアヒル」&lt;/p&gt;&#xA;&lt;p&gt;Rubyとかの動的言語でよく使われる。「そのメソッドが呼び出せるのならインタフェースを満たしている」 上の例だと、UserやAdminUserはJSON()メソッドを実装しているのでJSONableを実装していると言える。&lt;/p&gt;&#xA;&lt;h1 id=&#34;所感&#34;&gt;所感&lt;/h1&gt;&#xA;&lt;p&gt;Goでは継承という概念がないので、structの型の互換性を考えるよりもinterfaceベースで型を考えないとダメ。&lt;/p&gt;&#xA;&lt;h1 id=&#34;参考資料&#34;&gt;参考資料&lt;/h1&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://jxck.hatenablog.com/entry/20130325/1364251563&#34;&gt;http://jxck.hatenablog.com/entry/20130325/1364251563&lt;/a&gt; が非常に参考になりました。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B0095MCNAO/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/41xqARyQwCL._SL160_.jpg&#34; alt=&#34;An Introduction to Programming in Go&#34; loading=&#34;lazy&#34; title=&#34;An Introduction to Programming in Go&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B0095MCNAO/kazzhomeunixo-22/&#34;&gt;An Introduction to Programming in Go&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: Caleb Doxsey&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2012/09/02&lt;/li&gt;&#xA;&lt;li&gt;メディア: Kindle版&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/B0095MCNAO/kazzhomeunixo-22&#34;&gt;この商品を含むブログを見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>IntelliJ IDEAのgo-lang-idea-pluginをビルドする</title>
				<link>https://journal.lampetty.net/posts/build-go-lang-idea-plugin/</link>
				<pubDate>Sat, 26 Jul 2014 21:54:20 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/build-go-lang-idea-plugin/</guid>
				<description>&lt;p&gt;最近Goを少し書くようになった。PythonやRubyを書く時はIntelliJを使っているので、GoもIntelliJで書きたい。ただ、IntelliJからインストールできる公開されているプラグインは今年の1月の古めのものなので、&lt;a href=&#34;https://github.com/go-lang-plugin-org/go-lang-idea-plugin&#34;&gt;go-lang-idea-plugin&lt;/a&gt;を自分でビルドしてインストールしてみた。&lt;/p&gt;&#xA;&lt;h1 id=&#34;必要なもの&#34;&gt;必要なもの&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Java 1.7&lt;/li&gt;&#xA;&lt;li&gt;ant&#xA;&lt;ul&gt;&#xA;&lt;li&gt;brew install ant&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;IntelliJ IDEA&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/go-lang-plugin-org/go-lang-idea-plugin&#34;&gt;https://github.com/go-lang-plugin-org/go-lang-idea-plugin&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;ビルドする&#34;&gt;ビルドする&lt;/h1&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cd&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;to&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;go&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;lang&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;idea&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;plugin&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;wget&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;download&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cf&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;jetbrains&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;com&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;idea&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ideaIC&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;13.1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;4.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tar&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;gz&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tar&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;xvzf&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ideaIC&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;13.1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;4.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tar&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;gz&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mv&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;idea&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;IC&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;135.1229&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bin&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;inspect&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sh&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;idea&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;IC&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;build-package.xmlを下記のように書き換える。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;--- a/build-package.xml&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;+++ b/build-package.xml&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;@@ -7,7 +7,7 @@&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     &amp;lt;property name=&amp;#34;dist&amp;#34; location=&amp;#34;dist&amp;#34;/&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     &amp;lt;property name=&amp;#34;go.plugin.name&amp;#34; value=&amp;#34;ro.redeul.google.go&amp;#34; /&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-    &amp;lt;property name=&amp;#34;idea.community.build&amp;#34; location=&amp;#34;${user.home}/Tools/idea-IU-133.193/&amp;#34; /&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;+    &amp;lt;property name=&amp;#34;idea.community.build&amp;#34; location=&amp;#34;./idea-IC&amp;#34; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ ant -f build-package.xml&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;でビルドが成功すると、dist/ro.redeul.google.go.jar というファイルができているので、これをIntelliJからpluginとしてインストールすればおｋ&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4863541171/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/51ZzoXpsmqL._SL160_.jpg&#34; alt=&#34;基礎からわかる Go言語&#34; loading=&#34;lazy&#34; title=&#34;基礎からわかる Go言語&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4863541171/kazzhomeunixo-22/&#34;&gt;基礎からわかる Go言語&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: 古川昇&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: シーアンドアール研究所&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2012/11/21&lt;/li&gt;&#xA;&lt;li&gt;メディア: 単行本（ソフトカバー）&lt;/li&gt;&#xA;&lt;li&gt;クリック: 7回&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4863541171/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (5件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>Jenkinsで過去のビルドをワンクリックで再ビルドしたい</title>
				<link>https://journal.lampetty.net/posts/jenkins-rebuild-plugin/</link>
				<pubDate>Mon, 30 Jun 2014 21:18:31 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/jenkins-rebuild-plugin/</guid>
				<description>&lt;p&gt;結論から言うと「&lt;a href=&#34;https://wiki.jenkins-ci.org/display/JENKINS/Rebuild+Plugin&#34;&gt;Rebuild Plugin&lt;/a&gt;使え」&lt;/p&gt;&#xA;&lt;p&gt;ユースケースとしては、ビルドパラメータを使ってディプロイ先の環境などを指定している場合、これを毎度指定するのはつらいので、過去のビルド履歴からワンクリックで再ビルドできないかというもの。Rebuild Pluginを入れると下記のようにビルド履歴をクリックすると&amp;quot;Rebuild&amp;quot;というリンクが出るのでこれをクリックすると同じビルドパラメータを使ってビルドし直すことができる。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.flickr.com/photos/oinume/14355561498&#34; title=&#34;jenkins-rebuild-plugin by oinume, on Flickr&#34;&gt;&lt;img src=&#34;https://farm3.staticflickr.com/2928/14355561498_6d60c3d695.jpg&#34; alt=&#34;jenkins-rebuild-plugin&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;これを知る前まではビルド履歴からパラメーターを調べてしてそれを新規のビルドで指定して、ってやっていたんだけどパラメータが多い時つらかった。そろそろJenkinsを窓から投げ捨ててCircleCIとかが使いたいです。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4048707876/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/51PSTD-2eIL._SL160_.jpg&#34; alt=&#34;継続的デリバリー 信頼できるソフトウェアリリースのためのビルド・テスト・デプロイメントの自動化&#34; loading=&#34;lazy&#34; title=&#34;継続的デリバリー 信頼できるソフトウェアリリースのためのビルド・テスト・デプロイメントの自動化&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4048707876/kazzhomeunixo-22/&#34;&gt;継続的デリバリー 信頼できるソフトウェアリリースのためのビルド・テスト・デプロイメントの自動化&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: David Farley,Jez Humble,和智右桂,高木正弘&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: アスキー・メディアワークス&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2012/03/14&lt;/li&gt;&#xA;&lt;li&gt;メディア: 大型本&lt;/li&gt;&#xA;&lt;li&gt;購入: 24人 クリック: 567回&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4048707876/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (51件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>MySQL 5.6で本当にオンラインでDDLが実行できるか検証してみた</title>
				<link>https://journal.lampetty.net/posts/online-ddl-on-mysql-5.6/</link>
				<pubDate>Mon, 16 Jun 2014 19:15:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/online-ddl-on-mysql-5.6/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;http://thinkit.co.jp/story/2013/11/19/4670/page/0/1&#34;&gt;MySQL 5.6での機能強化点（その1） - パフォーマンスと使い勝手を大きく向上 | Think IT&lt;/a&gt;に書いてあるようにMySQL 5.6からオンラインでDDLを実行してもレコードのINSERT, UPDATEはできるようになったとあるので、これが本当なのか検証してみた。MySQLにおいてレコード数の多いテーブルに対するALTER TABLE文の発行は以前から問題視されていて、&lt;a href=&#34;http://www.percona.com/doc/percona-toolkit/2.1/pt-online-schema-change.html&#34;&gt;pt-online-schema-change&lt;/a&gt;みたいなものを駆使するのが常套手段だった。&lt;/p&gt;&#xA;&lt;h1 id=&#34;検証環境&#34;&gt;検証環境&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;ConoHa VPS 2GB&lt;/li&gt;&#xA;&lt;li&gt;Ubuntu 14.04&lt;/li&gt;&#xA;&lt;li&gt;MySQL 5.6.17-0ubuntu0.14.04.1-log&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://gist.github.com/oinume/fc9b72bd8b14ab07e94c&#34;&gt;my.cnf&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;データは&lt;a href=&#34;http://dumps.wikimedia.org/enwiki/20140502/&#34;&gt;Wikipediaのダンプデータ&lt;/a&gt;のenwiki-20140502-redirect.sql.gz というテーブルを使用。テーブル定義はこんな感じ。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;mysql&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;CREATE&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;TABLE&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;redirect&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rd_from&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;8&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;unsigned&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;NOT&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;no&#34;&gt;NULL&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;DEFAULT&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;0&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rd_namespace&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;11&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;NOT&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;no&#34;&gt;NULL&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;DEFAULT&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;0&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rd_title&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;varbinary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;255&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;NOT&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;no&#34;&gt;NULL&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;DEFAULT&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rd_interwiki&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;varbinary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;32&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;DEFAULT&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;no&#34;&gt;NULL&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rd_fragment&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;varbinary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;255&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;DEFAULT&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;no&#34;&gt;NULL&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;PRIMARY&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;KEY&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rd_from&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;KEY&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rd_ns_title&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rd_namespace&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rd_title&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rd_from&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kp&#34;&gt;ENGINE&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;InnoDB&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;DEFAULT&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kp&#34;&gt;CHARSET&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;binary&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#xA;&lt;li&gt;このredirectというテーブルにカラムを追加するDDLを流すと大体1分ぐらいかかる(のでそのすきにINSERTとかを実行してみた)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mysql&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;uroot&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;e&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;create database wikipedia&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mysql&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;uroot&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;wikipedia&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tmp&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;enwiki&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;20140502&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;redirect&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sql&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;time&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mysql&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;uroot&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;wikipedia&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;e&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;alter table redirect add column comment varbinary(255) not null default &amp;#39;&amp;#39; &amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;real&lt;/span&gt;    &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;m5&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;789&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;user&lt;/span&gt;    &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;m0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;003&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;m0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;002&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;カラム追加中にinsertupdatedelete&#34;&gt;カラム追加中にINSERT/UPDATE/DELETE&lt;/h1&gt;&#xA;&lt;p&gt;DDL&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mysql&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;uroot&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;wikipedia&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;e&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;alter table redirect add column comment varbinary(255) not null default &amp;#39;&amp;#39; &amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;INSERT&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mysql&amp;gt; insert into redirect values (43000000, 1, &amp;#39;alter test&amp;#39;, &amp;#39;&amp;#39;, &amp;#39;&amp;#39;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Query OK, 1 row affected (0.04 sec)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;UPDATE&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mysql&amp;gt; update redirect set rd_namespace=2 where rd_from=43000000;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Query OK, 1 row affected (0.05 sec)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Rows matched: 1  Changed: 1  Warnings: 0&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;DELETE&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mysql&amp;gt; delete from redirect where rd_from=43000000;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Query OK, 1 row affected (0.16 sec)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;問題なし。ってか最初に紹介したページにはINSERTとUPDATEについてしか記述がなかったけどDELETEもいけた。&lt;/p&gt;&#xA;&lt;h1 id=&#34;カラム削除中にinsertupdatedelete&#34;&gt;カラム削除中にINSERT/UPDATE/DELETE&lt;/h1&gt;&#xA;&lt;p&gt;DDL&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ mysql -uroot wikipedia -e &amp;#34;alter table redirect drop column comment&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;INSERT&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mysql&amp;gt; insert into redirect values (43000001, 1, &amp;#39;alter test&amp;#39;, &amp;#39;&amp;#39;, &amp;#39;&amp;#39;, &amp;#39;test&amp;#39;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Query OK, 1 row affected (0.04 sec)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;UPDATE&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mysql&amp;gt; update redirect set rd_namespace=2 where rd_from=43000001;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Query OK, 1 row affected (0.04 sec)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Rows matched: 1  Changed: 1  Warnings: 0&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;DELETE&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mysql&amp;gt; delete from redirect where rd_from=43000001;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Query OK, 1 row affected (0.10 sec)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;問題なし。&lt;/p&gt;&#xA;&lt;h1 id=&#34;インデックス追加中にinsert&#34;&gt;インデックス追加中にINSERT&lt;/h1&gt;&#xA;&lt;p&gt;もう面倒なのでINSERTだけ検証。&lt;/p&gt;&#xA;&lt;p&gt;DDL&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ mysql -uroot wikipedia -e &amp;#34;alter table redirect add index rd_title (rd_title);&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;INSERT&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mysql&amp;gt; insert into redirect values (43000002, 1, &amp;#39;alter test&amp;#39;, &amp;#39;&amp;#39;, &amp;#39;&amp;#39;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Query OK, 1 row affected (0.07 sec)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;問題なし&lt;/p&gt;&#xA;&lt;h1 id=&#34;インデックス削除中にinsert&#34;&gt;インデックス削除中にINSERT&lt;/h1&gt;&#xA;&lt;p&gt;インデックスの削除が一瞬で終わってしまうため検証できず。&lt;/p&gt;&#xA;&lt;h1 id=&#34;カラムの型変更中にinsert&#34;&gt;カラムの型変更中にINSERT&lt;/h1&gt;&#xA;&lt;p&gt;これは5.6でもブロックされるはずなのだが気になったのでやってみたところ、やっぱりちゃんとブロックされた。&lt;/p&gt;&#xA;&lt;p&gt;DDL&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ mysql -uroot wikipedia -e &amp;#34;alter table redirect modify column rd_namespace bigint NOT NULL DEFAULT &amp;#39;0&amp;#39;&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;INSERT&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;insert into redirect values (43000000, 1, &amp;#39;alter test&amp;#39;, &amp;#39;&amp;#39;, &amp;#39;&amp;#39;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;結論&#34;&gt;結論&lt;/h1&gt;&#xA;&lt;p&gt;カラム型の変更以外ではもうpt-online-schema-changeいらないんじゃないかなーと思った。MySQL 5.6はGTIDやパフォーマンスが改善されていないなどでいいイメージがなくあまり使われていない印象なんだけど、こういうところは積極的にアップデートする理由になるのではないかと思った次第。仕事でも4万qpsぐらいクエリが来てるサーバにMySQL 5.6使っていて特に大きな問題は起きてないっす。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4873116384/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/51li6EcTU%2BL._SL160_.jpg&#34; alt=&#34;実践ハイパフォーマンスMySQL 第3版&#34; loading=&#34;lazy&#34; title=&#34;実践ハイパフォーマンスMySQL 第3版&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4873116384/kazzhomeunixo-22/&#34;&gt;実践ハイパフォーマンスMySQL 第3版&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: Baron Schwartz,Peter Zaitsev,Vadim Tkachenko,菊池研自(監訳),株式会社クイープ&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: オライリージャパン&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2013/11/25&lt;/li&gt;&#xA;&lt;li&gt;メディア: 大型本&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4873116384/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (6件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>ノンアルコールビールはサッポロ プレミアム アルコールフリー ブラックがオススメ</title>
				<link>https://journal.lampetty.net/posts/sapporo-premium-alcohol-free/</link>
				<pubDate>Mon, 16 Jun 2014 09:42:52 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/sapporo-premium-alcohol-free/</guid>
				<description>&lt;p&gt;最近諸事情によりノンアルコールビールを飲むようになったのでステマ記事。&lt;/p&gt;&#xA;&lt;h1 id=&#34;コンテキスト&#34;&gt;コンテキスト&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;ビール一杯で普通に酔えるぐらい酒が弱い&lt;/li&gt;&#xA;&lt;li&gt;ビールは飲みたいけど、飲んでしまうと寝むくなって何もできなくなる&#xA;&lt;ul&gt;&#xA;&lt;li&gt;ビール飲んでサッパリした後にもう一仕事したい&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;なぜサッポロ-プレミアム-アルコールフリー-ブラックか&#34;&gt;なぜサッポロ プレミアム アルコールフリー ブラックか&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;ノンアルコールビールはいろいろ飲んだけどこれが一番ビールっぽくっておいしいと感じた&#xA;&lt;ul&gt;&#xA;&lt;li&gt;キリンフリー、アサヒDRY ZERO、サントリー ALL FREE、サッポロ プレミアム アルコールフリー&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;黒ビールが嫌いでなければオススメ&lt;/li&gt;&#xA;&lt;li&gt;泡もけっこう出る&lt;/li&gt;&#xA;&lt;li&gt;普通のビールに比べて安い(スーパーで130円ぐらい)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;もちろん普通のビールに比べればマズいけど、雰囲気を楽しみたいっていうレベルならこれで十分だと思ってる。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B0087M1S4A?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;&lt;img src=&#34;https://m.media-amazon.com/images/I/51t7Gx5hcwL._SL500_.jpg&#34; alt=&#34;サッポロ プレミアム アルコールフリー ブラック 350ml×24本&#34; loading=&#34;lazy&#34; title=&#34;サッポロ プレミアム アルコールフリー ブラック 350ml×24本&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B0087M1S4A?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;サッポロ プレミアム アルコールフリー ブラック 350ml×24本&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;サッポロビール&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/dp/B0087M1S4A?tag=kazzhomeunixo-22&amp;amp;linkCode=ogi&amp;amp;th=1&amp;amp;psc=1&#34;&gt;Amazon&lt;/a&gt;&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>vagrant ssh でログインせずそのままコマンドを実行したい</title>
				<link>https://journal.lampetty.net/posts/vagrant-ssh-with-command/</link>
				<pubDate>Mon, 09 Jun 2014 20:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/vagrant-ssh-with-command/</guid>
				<description>&lt;p&gt;vagrant ssh でVMに入ると思うんだけど、ちょっとしたコマンドをそのまま実行したい時にVMのShellにログインするのはダルい。そういう場合は -- を使ってvagrantコマンドの引数を終わらせて、その後に任意のコマンドを書くといい。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;vagrant&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ssh&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;uptime&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; &lt;span class=&#34;mi&#34;&gt;09&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;08&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;55&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;up&lt;/span&gt;  &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;54&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;  &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;users&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;  &lt;span class=&#34;nb&#34;&gt;load&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;average&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;0.04&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;0.11&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;0.13&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ずっとこのハイフン2つってどういう意味なんだろうって思ってて調べてみたら引数の終わりを表すヤツなんすねー。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>PackerでJapanizedなUbuntu 14.04のVagrant Boxを作ってみた</title>
				<link>https://journal.lampetty.net/posts/japanized-ubuntu-14.04-vagrant-box-by-packer/</link>
				<pubDate>Sun, 08 Jun 2014 23:23:04 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/japanized-ubuntu-14.04-vagrant-box-by-packer/</guid>
				<description>&lt;p&gt;TimeZoneがAsia/Tokyoで、aptのミラーがjp.archive.ubuntu.comなVagrant Boxを作ってみた。&lt;a href=&#34;https://github.com/shiguredo/packer-templates&#34;&gt;時雨堂のpacker-templates&lt;/a&gt;をforkして &lt;a href=&#34;https://github.com/oinume/packer-templates/tree/develop/ubuntu-14.04-jp&#34;&gt;ubuntu-14.04-jp&lt;/a&gt; っていうディレクトリを新しく追加してる。インストール方法は&lt;a href=&#34;https://github.com/oinume/packer-templates#running-packer&#34;&gt;README.rst&lt;/a&gt;に書いてある通り。イメージ作るのって面倒なイメージがあったんだけど(ダジャレ感)、Packerと先人の秘伝のタレを使えば良いということがわかったので恐怖心がなくなった。&lt;/p&gt;&#xA;&lt;p&gt;作ったイメージは &lt;a href=&#34;https://vagrantcloud.com/oinume/ubuntu-14.04-jp/&#34;&gt;https://vagrantcloud.com/oinume/ubuntu-14.04-jp/&lt;/a&gt; にアップしてある。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4873116651/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/41rW4Ay1U9L._SL160_.jpg&#34; alt=&#34;実践 Vagrant&#34; loading=&#34;lazy&#34; title=&#34;実践 Vagrant&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4873116651/kazzhomeunixo-22/&#34;&gt;実践 Vagrant&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: Mitchell Hashimoto,Sky株式会社玉川竜司&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: オライリージャパン&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2014/02/21&lt;/li&gt;&#xA;&lt;li&gt;メディア: 単行本（ソフトカバー）&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4873116651/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (8件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>brew install nodebrewできるようになった</title>
				<link>https://journal.lampetty.net/posts/created-homebrew-formula-of-nodebrew/</link>
				<pubDate>Tue, 03 Jun 2014 09:30:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/created-homebrew-formula-of-nodebrew/</guid>
				<description>&lt;p&gt;ついカッとなって&lt;a href=&#34;https://github.com/Homebrew/homebrew/commit/a14ff1e63258590ad23665e7f9bfcfe1394f9fad&#34;&gt;nodebrewのFormula&lt;/a&gt;を週末に作ってしまった。後悔はしていない。勢いで作ったので2回ほどプルリクのレビューにひっかかってしまった。ドキュメント嫁的な指摘もあったりしてションボリしつつ、でもこれで nvm 使わなくなれるのでちょっと嬉しい。&lt;/p&gt;&#xA;&lt;h1 id=&#34;formula作る人向けのドキュメント&#34;&gt;Formula作る人向けのドキュメント&lt;/h1&gt;&#xA;&lt;p&gt;公式ドキュメントが充実しているので、下記の3ページを読んでからプルリク送ると良さげ。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/Homebrew/homebrew/wiki/Formula-Cookbook&#34;&gt;Formula Cookbook&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/Homebrew/homebrew/wiki/Acceptable-Formulae&#34;&gt;Acceptable Formulae&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/styleguide/ruby&#34;&gt;Ruby · Styleguide&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;nodebrewのformulaを作るまでの過程&#34;&gt;nodebrewのFormulaを作るまでの過程&lt;/h1&gt;&#xA;&lt;h2 id=&#34;usrlocallibraryformulanodebrewrb-を作る&#34;&gt;/usr/local/Library/Formula/nodebrew.rb を作る&lt;/h2&gt;&#xA;&lt;p&gt;他のを適当にコピーしても良いけど、たぶん&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;brew create &amp;lt;name&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;のように作るのが正しい。&lt;/p&gt;&#xA;&lt;h2 id=&#34;他のformulaを参考にhomepage-url-sha1を設定する&#34;&gt;他のFormulaを参考にhomepage, url, sha1を設定する&lt;/h2&gt;&#xA;&lt;p&gt;sha1は適当でいい。そしておもむろにbrew install nodebrewしてみる。 そうすると、sha1の値が違うよと怒られるのでそこで表示されてるsha1をFormulaに書く。(ダウンロードurlが正しいことはちゃんと確認しましょうね。間違って変なアーカイブをだうんろーどしないように)&lt;/p&gt;&#xA;&lt;h2 id=&#34;install-メソッドを実装する&#34;&gt;install メソッドを実装する&lt;/h2&gt;&#xA;&lt;p&gt;今回はbashやzsh向けのcompletionファイルがあったのでそれもインストールするようにした。やり方はpyenvとかその辺のFormulaを参考にした。&lt;/p&gt;&#xA;&lt;h2 id=&#34;caveats&#34;&gt;caveats&lt;/h2&gt;&#xA;&lt;p&gt;インストールした後に表示される警告みたいなメッセージ。これもpyenvのを参考にした。&lt;/p&gt;&#xA;&lt;h2 id=&#34;テスト&#34;&gt;テスト&lt;/h2&gt;&#xA;&lt;p&gt;ちゃんとインストールされたかどうか簡単なテストを書く。&lt;/p&gt;&#xA;&lt;h2 id=&#34;forkしてブランチ作ってプルリクを送る&#34;&gt;forkしてブランチ作ってプルリクを送る&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git clone &amp;lt;forkしたhomebrewリポジトリ&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git checkout -b nodebrew&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cd Library/Formula/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git add nodebrew.rb&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git commit nodebrew.rb &amp;amp;&amp;amp; git push&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;あとはプルリクエストを送る&lt;/p&gt;&#xA;&lt;h1 id=&#34;プルリクで指摘されたこと&#34;&gt;プルリクで指摘されたこと&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Homebrewが$HOMEにディレクトリ作っちゃダメだよ&#xA;&lt;ul&gt;&#xA;&lt;li&gt;nodebrewはインストール時に $HOME/.nodebrew/{default,node,src} ディレクトリを作る&lt;/li&gt;&#xA;&lt;li&gt;ってかそのディレクトリ作る処理ってupstream(nodebrew)側でできないのかな？(Homebrewメンテナ)&lt;/li&gt;&#xA;&lt;li&gt;nodebrew setup すれば作られるんだけど、この処理ではスクリプトをダウンロードする処理も込みで、ファイルをダウンロードするのはHomebrew的にNGそうだったので今回はnodebrew側でディレクトリ作る処理を外出しするようにした&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;brew audit nodebrewするとエラーになるよ(Jenkinsさんがプルリクを自動でテストしてた)&#xA;&lt;ul&gt;&#xA;&lt;li&gt;ｻｰｾﾝ、これは事前にやれとドキュメントにも書いてありましたね。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;/usr/local っていうパスを直接使っちゃダメだよ&#xA;&lt;ul&gt;&#xA;&lt;li&gt;varやHOMEBREW_PERFIXなどHomebrewが定義しているものを使いましょう。どういうものが定義されているかは&lt;a href=&#34;https://github.com/Homebrew/homebrew/wiki/Formula-Cookbook#variables-for-directory-locations&#34;&gt;ここ&lt;/a&gt;に書いてある。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;testはもう少しちゃんと書こう&#xA;&lt;ul&gt;&#xA;&lt;li&gt;最初は nodebrew help を実行してexit statusが正常かチェックするだけだったのだが案の定怒られたｗ&lt;/li&gt;&#xA;&lt;li&gt;ので、nodebrew ls-remote して v0.10.0 が出力されていることをチェックするようにした。まぁやり過ぎるとキリがないのでこのぐらいでいいかなと思ったらレビューは通った&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;最後に&#34;&gt;最後に&lt;/h1&gt;&#xA;&lt;p&gt;これでnvmがいらない子になりました。とにかく普段よく使っているソフトウェアに貢献できるとモチベーションが上がりますね。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B00IOGV3XU/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/517dA3j6YbL._SL160_.jpg&#34; alt=&#34;サーバサイドJavaScript　Node.js入門 (アスキー書籍)&#34; loading=&#34;lazy&#34; title=&#34;サーバサイドJavaScript　Node.js入門 (アスキー書籍)&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B00IOGV3XU/kazzhomeunixo-22/&#34;&gt;サーバサイドJavaScript　Node.js入門 (アスキー書籍)&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: 清水俊博,大津繁樹,小林秀和,佐々木庸平,篠崎祐輔,高木敦也,西山雄也,Ｊｘｃｋ&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: KADOKAWA / アスキー・メディアワークス&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2014/02/27&lt;/li&gt;&#xA;&lt;li&gt;メディア: Kindle版&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/B00IOGV3XU/kazzhomeunixo-22&#34;&gt;この商品を含むブログを見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>Atom Editorで複数行選択して行頭に文字列を入れる</title>
				<link>https://journal.lampetty.net/posts/atom-editor-insert-text-into-beginning-of-lines/</link>
				<pubDate>Fri, 30 May 2014 19:10:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/atom-editor-insert-text-into-beginning-of-lines/</guid>
				<description>&lt;p&gt;&lt;img src=&#34;http://cdn-ak.f.st-hatena.com/images/fotolife/o/oinume/20140530/20140530142232.gif&#34; alt=&#34;f:id:oinume:20140530142232g:plain&#34; loading=&#34;lazy&#34; title=&#34;f:id:oinume:20140530142232g:plain&#34;&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://atom.io/packages/sublime-style-column-selection&#34;&gt;sublime-style-column-selection&lt;/a&gt;を入れて、Cmd + Shift + l(エル) で複数行を選択状態にして&amp;quot;&amp;gt; &amp;quot;を入力する。ESCを押すとカーソルの複数行選択が解除される。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Atom Editorで複数行選択(矩形選択)</title>
				<link>https://journal.lampetty.net/posts/atom-editor-multi-line-column-selection/</link>
				<pubDate>Mon, 19 May 2014 08:30:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/atom-editor-multi-line-column-selection/</guid>
				<description>&lt;p&gt;Atom Editorではデフォルトでは複数行選択はサポートされてないのだけど、&lt;a href=&#34;https://atom.io/packages/sublime-style-column-selection&#34;&gt;sublime-style-column-selection&lt;/a&gt;というパッケージを入れると、SublimeみたいにOptionキーを押しながらマウスをクリック＋ドラッグで複数行選択できるようになる。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.flickr.com/photos/oinume/14025807990&#34; title=&#34;atom-multi-column-selection by oinume, on Flickr&#34;&gt;&lt;img src=&#34;https://farm3.staticflickr.com/2895/14025807990_874ef83f86.jpg&#34; alt=&#34;atom-multi-column-selection&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;これのおかげでSublimeがやっといらない子になってきた。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4873116678/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/515Z%2BlXDi4L._SL160_.jpg&#34; alt=&#34;AngularJSアプリケーション開発ガイド&#34; loading=&#34;lazy&#34; title=&#34;AngularJSアプリケーション開発ガイド&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4873116678/kazzhomeunixo-22/&#34;&gt;AngularJSアプリケーション開発ガイド&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: Brad Green,Shyam Seshadri,牧野聡&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: オライリージャパン&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2014/04/18&lt;/li&gt;&#xA;&lt;li&gt;メディア: 大型本&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4873116678/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (1件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>はてなブログのMarkdown記法でネストした箇条書き</title>
				<link>https://journal.lampetty.net/posts/nested-bullet-list-on-hatenablog/</link>
				<pubDate>Fri, 16 May 2014 01:22:56 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/nested-bullet-list-on-hatenablog/</guid>
				<description>&lt;p&gt;GitHub Flavored Markdownだと&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* A&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* B&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; * C&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;みたいに書くとCがインデントされるんだけど、はてなブログではそうなってくれない！と思って問い合わせしてみたら、半角スペース4つでインデントされるとのこと。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;A&lt;/li&gt;&#xA;&lt;li&gt;B&#xA;&lt;ul&gt;&#xA;&lt;li&gt;C&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;おおー、ちゃんとインデントされてる！聞いてみるもんですな。ちなみにスペース1でもインデントすることも検討しますとのこと。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/477416366X/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/51PjpAUHZBL._SL160_.jpg&#34; alt=&#34;GitHub実践入門 ~Pull Requestによる開発の変革 (WEB&amp;#43;DB PRESS plus)&#34; loading=&#34;lazy&#34; title=&#34;GitHub実践入門 ~Pull Requestによる開発の変革 (WEB&amp;#43;DB PRESS plus)&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/477416366X/kazzhomeunixo-22/&#34;&gt;GitHub実践入門 ~Pull Requestによる開発の変革 (WEB+DB PRESS plus)&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: 大塚弘記&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: 技術評論社&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2014/03/20&lt;/li&gt;&#xA;&lt;li&gt;メディア: 単行本（ソフトカバー）&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/477416366X/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (6件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>Atom Editorがオープンソースになったので使ってみた</title>
				<link>https://journal.lampetty.net/posts/try-to-use-atom-editor/</link>
				<pubDate>Sun, 11 May 2014 23:03:32 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/try-to-use-atom-editor/</guid>
				<description>&lt;p&gt;どうもこんにちは、エディタ難民です。最近は軽いテキストの修正はSublimeText2、コードバリバリ書く系はIntelliJ IDEAを使っていたんだけど、Atomがオープンソースになったことだしいっちょ試してみるかということで使ってみた。Sublime3はなかなか出なくて進化が止まっている感じがしていてちょうどモヤモヤしていたというのもある。(ちなみにSublime2使う前はEmacsを使っていたがelisp書けなさすぎて挫折した)&lt;/p&gt;&#xA;&lt;h1 id=&#34;基本的な操作&#34;&gt;基本的な操作&lt;/h1&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://atom.io/docs/latest/getting-started&#34;&gt;getting-started&lt;/a&gt;見ればおｋ。自分用メモとして&lt;a href=&#34;http://qiita.com/oinume/items/e6aa66fc20183ebeddb4&#34;&gt;Qiitaにまとめてみた&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;設定&#34;&gt;設定&lt;/h1&gt;&#xA;&lt;p&gt;$HOME/.atom 配下に保存されるっぽい。compile-cacheとstorageというディレクトリ以外はDropboxとかで共有しておいて下記の要領でsymlink張っておけばどのマシンでも設定やインストールしたパッケージが共有できるっぽい。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ for f in ~/Dropbox/atom/*; do ln -s $f ~/.atom/`basename $f`; done&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;コマンドラインから起動できるようにしたい&#34;&gt;コマンドラインから起動できるようにしたい&lt;/h1&gt;&#xA;&lt;p&gt;/Applications/Atom.app/Contents/MacOS/Atom をコマンドラインから実行できるようにPATH通ったところにsymlinkしておく。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ln -s /Applications/Atom.app/Contents/MacOS/Atom /usr/local/bin/atom&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;所感&#34;&gt;所感&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Sublime2より設定しやすい気がする&lt;/li&gt;&#xA;&lt;li&gt;ドキュメントも必要なポイントがまとまっていてわりと取っ付き易い印象&lt;/li&gt;&#xA;&lt;li&gt;若干もっさりしている感じは否めない。我慢できるギリギリのライン&lt;/li&gt;&#xA;&lt;li&gt;Markdownがリアルタイムでプレビューできるのはいい。Markdownエディタとして使うだけでも価値はあると思う。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;全体的にはいい感じなのでSublime2の代わりにしばらく使ってみようと思う。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://itunes.apple.com/jp/app/dash-docs-snippets/id458034879?mt=12&amp;amp;uo=4&amp;amp;at=1l3v8Do&#34;&gt;&lt;img src=&#34;http://cdn.image.st-hatena.com/image/scale/9eedd89f090d6aa79078d2a29198e3b36e3dfb70/enlarge=0;height=200;version=1;width=200/http%3A%2F%2Fa5.mzstatic.com%2Fus%2Fr30%2FPurple4%2Fv4%2F3d%2Fb0%2F5e%2F3db05e12-991b-a6df-b16c-016305768e45%2Ficon.512x512-75.png&#34; alt=&#34;Dash (Docs &amp;amp; Snippets)&#34; loading=&#34;lazy&#34; title=&#34;Dash (Docs &amp;amp; Snippets)&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://itunes.apple.com/jp/app/dash-docs-snippets/id458034879?mt=12&amp;amp;uo=4&amp;amp;at=1l3v8Do&#34;&gt;Dash (Docs &amp;amp; Snippets)&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Bogdan Popescu&lt;/li&gt;&#xA;&lt;li&gt;開発ツール&lt;/li&gt;&#xA;&lt;li&gt;無料&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://itunes.apple.com/jp/app/dash-docs-snippets/id458034879?mt=12&amp;amp;uo=4&amp;amp;at=1l3v8Do&#34;&gt;&lt;img src=&#34;https://journal.lampetty.net/images/theme/itunes/itunes-badge-macappstore@2x.png&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>ターミナル環境を見直す(3) - tmux編</title>
				<link>https://journal.lampetty.net/posts/improve-my-terminal-with-tmux/</link>
				<pubDate>Sat, 10 May 2014 14:51:18 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/improve-my-terminal-with-tmux/</guid>
				<description>&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://journal.lampetty.net/entry/improve-my-terminal-with-zsh-prezto&#34;&gt;ターミナル環境を見直す(1) - zsh + prezto編 - おいぬま日報&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://journal.lampetty.net/entry/improve-my-terminal-with-percol&#34;&gt;ターミナル環境を見直す(2) - percol編 - おいぬま日報&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;この辺の話の続き。今回は久々にtmuxを使ってみよう編。たしか2011年ぐらいまではtmuxユーザだったんだけど、開発用マシンを全部MacOSにした時に「iTerm2しか使ってないし別にtmuxいらないかな」と思ったり、その時はtmux使うとマウスホイールでバッファがスクロールできないのが解決できてなくて使うのをやめてしまった。&lt;/p&gt;&#xA;&lt;p&gt;んで、今回いろいろと情報収集したところ&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;tmuxの設定は&lt;a href=&#34;http://qiita.com/succi0303/items/cb396704493476373edf&#34;&gt;達人に学ぶ.tmux.confの基本設定 - Qiita&lt;/a&gt;をほぼパクらせてもらった&lt;/li&gt;&#xA;&lt;li&gt;マウスホイールによるスクロールバッファの話は&lt;a href=&#34;http://yuroyoro.hatenablog.com/entry/2013/09/30/172331&#34;&gt;tmuxでマウス(trackpad)でバッファをスクロールする - ( ꒪⌓꒪) ゆるよろ日記&lt;/a&gt;の方法で解決できた&#xA;&lt;ul&gt;&#xA;&lt;li&gt;.tmux.confにset-window-option -g mode-mouse onを書く&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;2.の問題を解決したら今度はマウスで選択した文字列がコピーできなくなった&#xA;&lt;ul&gt;&#xA;&lt;li&gt;→optionキーを押しながら選択するとコピーされる&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;という感じでなんとかtmux常用までいけそう。&lt;/p&gt;&#xA;&lt;p&gt;ちなみに自分の.tmux.confは&lt;a href=&#34;https://github.com/oinume/dotfiles/blob/master/.tmux.conf&#34;&gt;ここ&lt;/a&gt;に置いてある。以下はスクリーンショット。 &lt;a href=&#34;https://www.flickr.com/photos/oinume/14169680893&#34; title=&#34;tmux by oinume, on Flickr&#34;&gt;&lt;img src=&#34;https://farm6.staticflickr.com/5573/14169680893_7145956216.jpg&#34; alt=&#34;tmux&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/tmuxinator/tmuxinator&#34;&gt;tmuxinator&lt;/a&gt;も便利そうなんで使ってみようと思う。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B00AVA3A38/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/414rh9l0BQL._SL160_.jpg&#34; alt=&#34;ターミナルマルチプレクサ tmux 入門&#34; loading=&#34;lazy&#34; title=&#34;ターミナルマルチプレクサ tmux 入門&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B00AVA3A38/kazzhomeunixo-22/&#34;&gt;ターミナルマルチプレクサ tmux 入門&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: 戸田　薫&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2012/12/30&lt;/li&gt;&#xA;&lt;li&gt;メディア: Kindle版&lt;/li&gt;&#xA;&lt;li&gt;クリック: 2回&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/B00AVA3A38/kazzhomeunixo-22&#34;&gt;この商品を含むブログを見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>最近のWeb系フルスタックエンジニアのお仕事</title>
				<link>https://journal.lampetty.net/posts/recent-full-stack-engineer-work-2014/</link>
				<pubDate>Thu, 08 May 2014 12:17:56 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/recent-full-stack-engineer-work-2014/</guid>
				<description>&lt;ol&gt;&#xA;&lt;li&gt;JavaScript or CoffeeScript + AngularJSとかBackboneJSでいい感じのページを作る&lt;/li&gt;&#xA;&lt;li&gt;CSS/Sass + HTMLコーディング&lt;/li&gt;&#xA;&lt;li&gt;Gruntとかでminifyとかビルド&lt;/li&gt;&#xA;&lt;li&gt;Ruby/Rails, Python/Django, PHP/CakePHP, Node.js/ExpressとかでAPIサーバ実装&lt;/li&gt;&#xA;&lt;li&gt;データベースの設計とか(MySQL, MongoDB, etc...)&lt;/li&gt;&#xA;&lt;li&gt;AWSなどのクラウドに本番サーバの構築(Chef, Puppet, Ansible, etc...)&lt;/li&gt;&#xA;&lt;li&gt;開発環境をVagrantとかDockerで構築(ここでもChefとか使う)&lt;/li&gt;&#xA;&lt;li&gt;ディプロイスクリプト作成&lt;/li&gt;&#xA;&lt;li&gt;TravisCIやCircleCIでCIする + ユニットテストやE2Eテストを書く&lt;/li&gt;&#xA;&lt;li&gt;NewRelic, Airbrakeなどでモニタリング&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;いくつかはPaaSやBaaS使えば省けるものはありそうだけど大変、、、&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>ターミナル環境を見直す(2) - percol編</title>
				<link>https://journal.lampetty.net/posts/improve-my-terminal-with-percol/</link>
				<pubDate>Wed, 07 May 2014 01:13:14 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/improve-my-terminal-with-percol/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;https://journal.lampetty.net/entry/improve-my-terminal-with-zsh-prezto&#34;&gt;ターミナル環境を見直す(1) - zsh + prezto編 - おいぬま日報&lt;/a&gt;に引き続き第2弾。&lt;/p&gt;&#xA;&lt;p&gt;今回は&lt;a href=&#34;https://github.com/mooz/percol&#34;&gt;percol&lt;/a&gt;というものをインストールしてみた。percolを一言で言うと、シェル版の&lt;a href=&#34;http://www.emacswiki.org/emacs/anything.el&#34;&gt;Anything.el&lt;/a&gt;またはVimの&lt;a href=&#34;https://github.com/Shougo/unite.vim&#34;&gt;Unite&lt;/a&gt;という感じなのかなぁ。percolについては&lt;a href=&#34;http://shibayu36.hatenablog.com/entry/2013/10/06/184146&#34;&gt;ターミナル版anything的なpercolをzawの代わりに試してみた - $shibayu36-&amp;gt;blog;&lt;/a&gt;が詳しい。(自分はこのブログを見て&lt;a href=&#34;https://github.com/zsh-users/zaw&#34;&gt;zaw&lt;/a&gt;じゃなくてpercolにしようかなと思いました)&lt;/p&gt;&#xA;&lt;h1 id=&#34;インストール&#34;&gt;インストール&lt;/h1&gt;&#xA;&lt;p&gt;で、まずインストールしてみたんだけどいきなり躓いた。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pip&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;install&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;percol&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Downloading&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;unpacking&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;percol&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;Could&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;find&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;any&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;downloads&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;that&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;satisfy&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;the&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;requirement&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;percol&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;Some&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;externally&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;hosted&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;files&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;were&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ignored&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;use&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;allow&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;external&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;percol&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;to&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;allow&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Cleaning&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;up&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;...&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;No&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;distributions&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;at&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;all&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;found&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;percol&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Storing&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;debug&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;log&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;failure&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Users&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;kazuhiro&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Library&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Logs&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pip&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;log&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;とりあえずpip経由がダメっぽいので&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ git clone git://github.com/mooz/percol.git&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ cd percol&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ sudo python setup.py install&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;でインストールでけた。&lt;/p&gt;&#xA;&lt;h1 id=&#34;zshのコマンド履歴の検索にpercol使ってみる&#34;&gt;zshのコマンド履歴の検索にpercol使ってみる&lt;/h1&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/mooz/percol#zsh-history-search&#34;&gt;percolのREADME&lt;/a&gt;通りに設定をしてCtrl + rで検索してみると無事下記のような画面で検索できるように！&lt;/p&gt;&#xA;&lt;h1 id=&#34;まとめ&#34;&gt;まとめ&lt;/h1&gt;&#xA;&lt;p&gt;percolはパイプで標準出力を渡すだけで検索しやすくしてくれるので色々使いどころがありそう。どういう使い道があるかはまだよくわからないけど、、、&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B00IP4D7T4/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/51azKv8jPHL._SL160_.jpg&#34; alt=&#34;電子書籍で学ぶシェルスクリプト基礎編［bash/zsh/tcsh］ ?今すぐ使える設定ファイル大公開&#34; loading=&#34;lazy&#34; title=&#34;電子書籍で学ぶシェルスクリプト基礎編［bash/zsh/tcsh］ ?今すぐ使える設定ファイル大公開&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B00IP4D7T4/kazzhomeunixo-22/&#34;&gt;電子書籍で学ぶシェルスクリプト基礎編［bash/zsh/tcsh］ ?今すぐ使える設定ファイル大公開&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: 後藤大地&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: 技術評論社&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2014/02/28&lt;/li&gt;&#xA;&lt;li&gt;メディア: Kindle版&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/B00IP4D7T4/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (1件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>ターミナル環境を見直す(1) - zsh &#43; prezto編</title>
				<link>https://journal.lampetty.net/posts/improve-my-terminal-with-zsh-prezto/</link>
				<pubDate>Sun, 04 May 2014 15:18:36 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/improve-my-terminal-with-zsh-prezto/</guid>
				<description>&lt;p&gt;GWになったので、ずーーーっとやりたいと思っていた、ターミナル環境の見直しをしてる。oh-my-zshとか使ってなかったし、tmuxも最近は使ってなくて時代からかなり乗り遅れ気味なのがずっと気になってた。ちなみに見直す前の環境はざっくり言うと以下。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作業環境はMac + iTerm&lt;/li&gt;&#xA;&lt;li&gt;zsh使ってるがoh-my-zshは使ってない&lt;/li&gt;&#xA;&lt;li&gt;tmuxは最近は使ってなかった。iTermのタブでそんなに不自由してなかったので。&lt;/li&gt;&#xA;&lt;li&gt;vim教信者ではない&lt;/li&gt;&#xA;&lt;li&gt;dotfileはbitbucketのプライベートリポジトリで管理していて、symlink張って有効にしている(ln -s /path/to/dotfiles/.zshrc ~/.zshrc みたいな感じ)&lt;/li&gt;&#xA;&lt;li&gt;スクリーンショットはこんな感じで、右側にgitのブランチとカレントディレクトリを表示してる&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;prezto&#34;&gt;&lt;a href=&#34;https://github.com/sorin-ionescu/prezto&#34;&gt;prezto&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;これはoh-my-zshの軽量版らしい。&lt;a href=&#34;http://qiita.com/kei_q/items/814ec412b3c28f580927&#34;&gt;oh-my-zshを使っていて重いと感じている方、preztoはいかが？ - Qiita&lt;/a&gt; を読んで良さそうだなって思ってこっちにしてみた。&lt;/p&gt;&#xA;&lt;p&gt;まず手始めに、bitbucketでホストしていた dotfiles のリポジトリをやめてみた。プライベートリポジトリにしていたのは、あんまり見られたくない仕事の設定ファイルがあったためだったのだが、見られたくないファイルはDropboxに置いてsymlinkする運用にすればいいと気付いた。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;dotfiles&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── .zlogin  - ~/.zlogin にsymlinkする&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── .zlogout&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── .zpreztorc&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── .zshrc&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  (他.zsh系ファイル)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;└── prezto - git submodule。~/.zprezto にsymlink&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;な感じのファイル構成にして、zsh関連のファイルはホームディレクトリにsymlinkする。zsh関連のファイルはpreztoの&lt;a href=&#34;https://github.com/sorin-ionescu/prezto/tree/master/runcoms&#34;&gt;runcoms&lt;/a&gt;ディレクトリにあるので、これをコピーして多少カスタマイズしつつ自分の&lt;a href=&#34;https://github.com/oinume/dotfiles&#34;&gt;dotfiles&lt;/a&gt;リポジトリにコピーしている。&lt;/p&gt;&#xA;&lt;p&gt;カスタマイズの詳細はdiff見てもらうとして、簡単に説明すると下記のような感じ。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;gitモジュールを有効にした。これ使うとsorinのテーマでプロンプトにgitのブランチ情報が出る。(一部のテーマはこれがなくてもなぜかgitのブランチが出てた)&lt;/li&gt;&#xA;&lt;li&gt;gitモジュール、今いるディレクトリでgit-hub-browseと打つとブラウザでgithub.comのそのリポジトリを開いてくれて地味に便利。会社のGitHubEnterpriseにも対応させたい。&lt;/li&gt;&#xA;&lt;li&gt;gitモジュールにはその他にも一見便利そうなエイリアスが定義されているが、正直gitのコマンドをそのまま使ったほうがいい気がした。&lt;/li&gt;&#xA;&lt;li&gt;osxモジュールも有効にした。mand  でそのコマンドのmanがDash.appで見れる。まーそんな嬉しくないかも。&lt;/li&gt;&#xA;&lt;li&gt;テーマはデフォルトのsorinを使ってるけど変えるかもしれない。テーマについては&lt;a href=&#34;http://mikebuss.com/2014/04/07/customizing-prezto/&#34;&gt;ここ&lt;/a&gt;にスクリーンショット付きで一覧があるので参考にするといい。&lt;/li&gt;&#xA;&lt;li&gt;あとutilityモジュールのせいで&lt;a href=&#34;https://github.com/sorin-ionescu/prezto/blob/master/modules/utility/functions/diff&#34;&gt;diffコマンドがgit diff のエイリアスになってしまっているので&lt;/a&gt;、alias diff=&#39;command diff&#39; っていう設定を入れて通常のdiffコマンドに強引に戻してる。(余計なおせっかい過ぎるんだけどこれ無効にできないかな)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;diff -u ~/dotfiles/prezto/runcoms/zpreztorc ~/dotfiles/.zpreztorc&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;--- /Users/kazuhiro/dotfiles/prezto/runcoms/zpreztorc   2014-05-04 11:38:10.000000000 +0900&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;+++ /Users/kazuhiro/dotfiles/.zpreztorc 2014-05-04 14:12:42.000000000 +0900&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;@@ -32,7 +32,9 @@&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &amp;#39;spectrum&amp;#39; \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &amp;#39;utility&amp;#39; \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &amp;#39;completion&amp;#39; \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-  &amp;#39;prompt&amp;#39;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;+  &amp;#39;prompt&amp;#39; \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;+  &amp;#39;git&amp;#39; \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;+  &amp;#39;osx&amp;#39;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; #&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; # Editor&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;@@ -135,7 +137,7 @@&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; #&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; # Auto set the tab and window titles.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-# zstyle &amp;#39;:prezto:module:terminal&amp;#39; auto-title &amp;#39;yes&amp;#39;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;+zstyle &amp;#39;:prezto:module:terminal&amp;#39; auto-title &amp;#39;yes&amp;#39;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; # Set the window title format.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; # zstyle &amp;#39;:prezto:module:terminal:window-title&amp;#39; format &amp;#39;%n@%m: %s&amp;#39;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;@@ -152,3 +154,11 @@&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; # Auto start a session when Zsh is launched in a SSH connection.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; # zstyle &amp;#39;:prezto:module:tmux:auto-start&amp;#39; remote &amp;#39;yes&amp;#39;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;+#&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;+&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;+#&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;+# custom&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;+#&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;+&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;+# prevent to diff -&amp;gt; &amp;#39;git diff&amp;#39; by utility module&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;+alias diff=&amp;#39;command diff&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ちなみにzshはsetoptと打つと有効になっているzshoptionsが一覧されるので、preztoがどういうオプションを有効にしてるかがわかる。特定のオプションを無効にしたい場合は&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;unsetopt &amp;lt;option&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;とすればいい。&lt;/p&gt;&#xA;&lt;h1 id=&#34;preztoで不満なところ&#34;&gt;preztoで不満なところ&lt;/h1&gt;&#xA;&lt;p&gt;sorinテーマの問題なんだけど、カレントディレクトリやgit branchがプロンプトの左側にあるのを右側に出したい。&lt;/p&gt;&#xA;&lt;h1 id=&#34;最後に&#34;&gt;最後に&lt;/h1&gt;&#xA;&lt;p&gt;prezto良さげだけどやっぱりカスタマイズは必要かな。あと、ターミナル環境見直し第2弾としてpercolかzawを使ってみようと思う。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://journal.lampetty.net/entry/improve-my-terminal-with-percol&#34;&gt;ターミナル環境を見直す(2) - percol編 - おいぬま日報&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://journal.lampetty.net/entry/improve-my-terminal-with-tmux&#34;&gt;ターミナル環境を見直す(3) - tmux編 - おいぬま日報&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B00IP4D7T4/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/51azKv8jPHL._SL160_.jpg&#34; alt=&#34;電子書籍で学ぶシェルスクリプト基礎編［bash/zsh/tcsh］ ?今すぐ使える設定ファイル大公開&#34; loading=&#34;lazy&#34; title=&#34;電子書籍で学ぶシェルスクリプト基礎編［bash/zsh/tcsh］ ?今すぐ使える設定ファイル大公開&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B00IP4D7T4/kazzhomeunixo-22/&#34;&gt;電子書籍で学ぶシェルスクリプト基礎編［bash/zsh/tcsh］ ?今すぐ使える設定ファイル大公開&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: 後藤大地&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: 技術評論社&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2014/02/28&lt;/li&gt;&#xA;&lt;li&gt;メディア: Kindle版&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/B00IP4D7T4/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (1件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>conoha VPSにUbuntu 14.04(Trusty Tahr)をインストールしてみた</title>
				<link>https://journal.lampetty.net/posts/ubuntu-14.04-on-conoha-vps/</link>
				<pubDate>Sun, 04 May 2014 00:22:48 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/ubuntu-14.04-on-conoha-vps/</guid>
				<description>&lt;p&gt;どうもこんにちは。VPS難民です。&lt;/p&gt;&#xA;&lt;p&gt;Ubuntu 14.04 LTSがリリースされたので、今使っているお名前.comのVPS(Ubuntu 12.04)から移行しようと思って&lt;a href=&#34;http://www.conoha.jp/&#34;&gt;conoha VPS&lt;/a&gt;にインストールしてみた。&lt;/p&gt;&#xA;&lt;p&gt;2014年5月の時点では、conoha VPSはまだ正式にはUbuntu 14.04には対応してないので自分でISOイメージをアップロードする必要がある。&lt;/p&gt;&#xA;&lt;h1 id=&#34;ubuntu-1404のインストール&#34;&gt;Ubuntu 14.04のインストール&lt;/h1&gt;&#xA;&lt;p&gt;ISOイメージのアップロードについては、&lt;a href=&#34;https://www.conoha.jp/guide/guide.php?g=13&#34;&gt;ドキュメント&lt;/a&gt;通りにやればOKである。ISOイメージをアップロードして電源をONにするとインストーラーが立ち上がっているので、コントロールパネルのコンソールから接続してインストールすればおｋ。&lt;/p&gt;&#xA;&lt;h1 id=&#34;cpu&#34;&gt;CPU&lt;/h1&gt;&#xA;&lt;p&gt;cat /proc/cpuinfo すると下記のようなCPUスペック。これが本当なら&lt;a href=&#34;http://ark.intel.com/products/75269/Intel-Xeon-Processor-E5-2650-v2-20M-Cache-2_60-GHz&#34;&gt;2013Q3に発売されたIvy Bridgeのヤツ&lt;/a&gt;なのでけっこういいCPU積んでることになる。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cat&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;proc&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cpuinfo&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;processor&lt;/span&gt;   &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;vendor_id&lt;/span&gt;   &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;GenuineIntel&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;cpu&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;family&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;6&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;model&lt;/span&gt;       &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;62&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;model&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Intel&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;R&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Xeon&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;R&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;CPU&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;E5&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2650&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;v2&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;@&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;2.60&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;GHz&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;stepping&lt;/span&gt;    &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;4&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;microcode&lt;/span&gt;   &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;cpu&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;MHz&lt;/span&gt;     &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;2593.748&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;cache&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;4096&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;KB&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;physical&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;id&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;siblings&lt;/span&gt;    &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;core&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;id&lt;/span&gt;     &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;cpu&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cores&lt;/span&gt;   &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;apicid&lt;/span&gt;      &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;initial&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;apicid&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;fpu&lt;/span&gt;     &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;yes&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;fpu_exception&lt;/span&gt;   &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;yes&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;cpuid&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;level&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;13&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;wp&lt;/span&gt;      &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;yes&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;flags&lt;/span&gt;       &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fpu&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;vme&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;de&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pse&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tsc&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;msr&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pae&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mce&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cx8&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;apic&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sep&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mtrr&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pge&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mca&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cmov&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pat&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pse36&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;clflush&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mmx&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fxsr&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sse&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sse2&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ss&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;syscall&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;nx&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pdpe1gb&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;rdtscp&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;lm&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;constant_tsc&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;rep_good&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;nopl&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;eagerfpu&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pni&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pclmulqdq&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;vmx&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ssse3&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cx16&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pcid&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sse4_1&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sse4_2&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;x2apic&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;popcnt&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;aes&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;xsave&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;avx&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f16c&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;rdrand&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;hypervisor&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;lahf_lm&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;xsaveopt&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fsgsbase&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;smep&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;erms&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;bogomips&lt;/span&gt;    &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;5187.49&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;clflush&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;    &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;64&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;cache_alignment&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;64&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;address&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sizes&lt;/span&gt;   &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;40&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;bits&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;physical&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;48&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;bits&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;virtual&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;power&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;management&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;ベンチマーク&#34;&gt;ベンチマーク&lt;/h1&gt;&#xA;&lt;p&gt;ためしに今使っているお名前.com VPSとconoha VPSでUnixBench取ってみた。結果としてはびっくりお名前.com VPSの方がいい数字をたたき出してた。conoha VPSは複数台構成にできるからちょっとパフォーマンス悪くしてるのかなぁ。&lt;/p&gt;&#xA;&lt;h2 id=&#34;お名前com-vps-ubuntu-1204&#34;&gt;お名前.com VPS (Ubuntu 12.04)&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;========================================================================&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;n&#34;&gt;BYTE&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;UNIX&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Benchmarks&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Version&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;5.1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;barcelona&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;GNU&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Linux&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;ne&#34;&gt;OS&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;GNU&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Linux&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;3.8&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;39&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;generic&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;#57~precise1-Ubuntu SMP Tue Apr 1 20:04:50 UTC 2014&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;n&#34;&gt;Machine&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;x86_64&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x86_64&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;n&#34;&gt;Language&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;en_US&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;utf8&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;charmap&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;UTF-8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;collate&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;UTF-8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;n&#34;&gt;CPU&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Intel&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;R&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Core&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;TM&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Duo&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;CPU&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;T7700&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;@&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;2.40&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;GHz&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;6133.5&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;bogomips&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          &lt;span class=&#34;n&#34;&gt;x86&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;64&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;MMX&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Physical&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Address&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Ext&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;SYSCALL&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;SYSRET&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;n&#34;&gt;CPU&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Intel&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;R&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Core&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;TM&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Duo&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;CPU&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;T7700&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;@&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;2.40&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;GHz&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;6133.5&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;bogomips&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          &lt;span class=&#34;n&#34;&gt;x86&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;64&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;MMX&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Physical&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Address&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Ext&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;SYSCALL&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;SYSRET&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;n&#34;&gt;CPU&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Intel&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;R&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Core&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;TM&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Duo&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;CPU&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;T7700&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;@&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;2.40&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;GHz&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;6133.5&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;bogomips&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          &lt;span class=&#34;n&#34;&gt;x86&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;64&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;MMX&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Physical&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Address&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Ext&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;SYSCALL&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;SYSRET&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;mi&#34;&gt;23&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;09&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;38&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;up&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;32&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;min&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;  &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;user&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;  &lt;span class=&#34;nb&#34;&gt;load&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;average&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;0.39&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;0.24&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;0.23&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;runlevel&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;------------------------------------------------------------------------&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Benchmark&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Run&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;土&lt;/span&gt;  &lt;span class=&#34;mi&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;月&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;03&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2014&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;23&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;09&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;38&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;23&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;37&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;48&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;CPUs&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;system&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;running&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;parallel&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;copies&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;of&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tests&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Dhrystone&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;using&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;register&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;variables&lt;/span&gt;       &lt;span class=&#34;mf&#34;&gt;98882250.1&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;lps&lt;/span&gt;   &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;10.0&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;7&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;samples&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Double&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Precision&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Whetstone&lt;/span&gt;                    &lt;span class=&#34;mf&#34;&gt;12340.3&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;MWIPS&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;9.9&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;7&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;samples&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Execl&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Throughput&lt;/span&gt;                              &lt;span class=&#34;mf&#34;&gt;10104.1&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;lps&lt;/span&gt;   &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;29.8&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;samples&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;ne&#34;&gt;File&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Copy&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1024&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;bufsize&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2000&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;maxblocks&lt;/span&gt;       &lt;span class=&#34;mf&#34;&gt;1244545.8&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;KBps&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;30.0&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;samples&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;ne&#34;&gt;File&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Copy&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;256&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;bufsize&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;500&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;maxblocks&lt;/span&gt;          &lt;span class=&#34;mf&#34;&gt;341933.7&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;KBps&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;30.0&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;samples&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;ne&#34;&gt;File&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Copy&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;4096&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;bufsize&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;8000&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;maxblocks&lt;/span&gt;       &lt;span class=&#34;mf&#34;&gt;2614639.4&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;KBps&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;30.0&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;samples&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Pipe&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Throughput&lt;/span&gt;                             &lt;span class=&#34;mf&#34;&gt;6337756.5&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;lps&lt;/span&gt;   &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;10.0&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;7&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;samples&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Pipe&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;based&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Context&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Switching&lt;/span&gt;                 &lt;span class=&#34;mf&#34;&gt;770446.6&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;lps&lt;/span&gt;   &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;10.0&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;7&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;samples&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Process&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Creation&lt;/span&gt;                              &lt;span class=&#34;mf&#34;&gt;26299.8&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;lps&lt;/span&gt;   &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;30.0&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;samples&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Shell&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Scripts&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;concurrent&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;                  &lt;span class=&#34;mf&#34;&gt;17509.8&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;lpm&lt;/span&gt;   &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;60.0&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;samples&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Shell&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Scripts&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;8&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;concurrent&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;                   &lt;span class=&#34;mf&#34;&gt;2694.2&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;lpm&lt;/span&gt;   &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;60.0&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;samples&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Call&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Overhead&lt;/span&gt;                        &lt;span class=&#34;mf&#34;&gt;9335253.2&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;lps&lt;/span&gt;   &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;10.0&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;7&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;samples&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Benchmarks&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Index&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Values&lt;/span&gt;               &lt;span class=&#34;n&#34;&gt;BASELINE&lt;/span&gt;       &lt;span class=&#34;n&#34;&gt;RESULT&lt;/span&gt;    &lt;span class=&#34;n&#34;&gt;INDEX&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Dhrystone&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;using&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;register&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;variables&lt;/span&gt;         &lt;span class=&#34;mf&#34;&gt;116700.0&lt;/span&gt;   &lt;span class=&#34;mf&#34;&gt;98882250.1&lt;/span&gt;   &lt;span class=&#34;mf&#34;&gt;8473.2&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Double&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Precision&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Whetstone&lt;/span&gt;                       &lt;span class=&#34;mf&#34;&gt;55.0&lt;/span&gt;      &lt;span class=&#34;mf&#34;&gt;12340.3&lt;/span&gt;   &lt;span class=&#34;mf&#34;&gt;2243.7&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Execl&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Throughput&lt;/span&gt;                                 &lt;span class=&#34;mf&#34;&gt;43.0&lt;/span&gt;      &lt;span class=&#34;mf&#34;&gt;10104.1&lt;/span&gt;   &lt;span class=&#34;mf&#34;&gt;2349.8&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;ne&#34;&gt;File&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Copy&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1024&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;bufsize&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2000&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;maxblocks&lt;/span&gt;          &lt;span class=&#34;mf&#34;&gt;3960.0&lt;/span&gt;    &lt;span class=&#34;mf&#34;&gt;1244545.8&lt;/span&gt;   &lt;span class=&#34;mf&#34;&gt;3142.8&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;ne&#34;&gt;File&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Copy&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;256&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;bufsize&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;500&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;maxblocks&lt;/span&gt;            &lt;span class=&#34;mf&#34;&gt;1655.0&lt;/span&gt;     &lt;span class=&#34;mf&#34;&gt;341933.7&lt;/span&gt;   &lt;span class=&#34;mf&#34;&gt;2066.1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;ne&#34;&gt;File&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Copy&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;4096&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;bufsize&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;8000&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;maxblocks&lt;/span&gt;          &lt;span class=&#34;mf&#34;&gt;5800.0&lt;/span&gt;    &lt;span class=&#34;mf&#34;&gt;2614639.4&lt;/span&gt;   &lt;span class=&#34;mf&#34;&gt;4508.0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Pipe&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Throughput&lt;/span&gt;                               &lt;span class=&#34;mf&#34;&gt;12440.0&lt;/span&gt;    &lt;span class=&#34;mf&#34;&gt;6337756.5&lt;/span&gt;   &lt;span class=&#34;mf&#34;&gt;5094.7&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Pipe&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;based&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Context&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Switching&lt;/span&gt;                   &lt;span class=&#34;mf&#34;&gt;4000.0&lt;/span&gt;     &lt;span class=&#34;mf&#34;&gt;770446.6&lt;/span&gt;   &lt;span class=&#34;mf&#34;&gt;1926.1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Process&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Creation&lt;/span&gt;                                &lt;span class=&#34;mf&#34;&gt;126.0&lt;/span&gt;      &lt;span class=&#34;mf&#34;&gt;26299.8&lt;/span&gt;   &lt;span class=&#34;mf&#34;&gt;2087.3&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Shell&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Scripts&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;concurrent&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;                     &lt;span class=&#34;mf&#34;&gt;42.4&lt;/span&gt;      &lt;span class=&#34;mf&#34;&gt;17509.8&lt;/span&gt;   &lt;span class=&#34;mf&#34;&gt;4129.7&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Shell&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Scripts&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;8&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;concurrent&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;                      &lt;span class=&#34;mf&#34;&gt;6.0&lt;/span&gt;       &lt;span class=&#34;mf&#34;&gt;2694.2&lt;/span&gt;   &lt;span class=&#34;mf&#34;&gt;4490.4&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Call&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Overhead&lt;/span&gt;                          &lt;span class=&#34;mf&#34;&gt;15000.0&lt;/span&gt;    &lt;span class=&#34;mf&#34;&gt;9335253.2&lt;/span&gt;   &lt;span class=&#34;mf&#34;&gt;6223.5&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                                                   &lt;span class=&#34;o&#34;&gt;========&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Benchmarks&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Index&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Score&lt;/span&gt;                                        &lt;span class=&#34;mf&#34;&gt;3474.1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;conoha-vps-ubuntu-1404&#34;&gt;conoha VPS (Ubuntu 14.04)&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;========================================================================&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;n&#34;&gt;BYTE&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;UNIX&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Benchmarks&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Version&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;5.1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;taipei&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;GNU&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Linux&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;ne&#34;&gt;OS&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;GNU&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Linux&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;3.13&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;24&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;generic&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;#46-Ubuntu SMP Thu Apr 10 19:11:08 UTC 2014&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;n&#34;&gt;Machine&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;x86_64&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x86_64&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;n&#34;&gt;Language&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;en_US&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;utf8&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;charmap&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;UTF-8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;collate&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;UTF-8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;n&#34;&gt;CPU&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Intel&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;R&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Xeon&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;R&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;CPU&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;E5&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2650&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;v2&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;@&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;2.60&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;GHz&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;5187.5&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;bogomips&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          &lt;span class=&#34;n&#34;&gt;x86&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;64&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;MMX&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Physical&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Address&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Ext&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;SYSENTER&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;SYSEXIT&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;SYSCALL&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;SYSRET&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Intel&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;virtualization&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;n&#34;&gt;CPU&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Intel&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;R&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Xeon&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;R&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;CPU&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;E5&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2650&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;v2&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;@&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;2.60&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;GHz&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;5187.5&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;bogomips&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          &lt;span class=&#34;n&#34;&gt;x86&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;64&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;MMX&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Physical&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Address&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Ext&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;SYSENTER&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;SYSEXIT&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;SYSCALL&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;SYSRET&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Intel&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;virtualization&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;n&#34;&gt;CPU&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Intel&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;R&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Xeon&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;R&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;CPU&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;E5&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2650&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;v2&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;@&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;2.60&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;GHz&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;5187.5&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;bogomips&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          &lt;span class=&#34;n&#34;&gt;x86&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;64&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;MMX&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Physical&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Address&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Ext&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;SYSENTER&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;SYSEXIT&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;SYSCALL&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;SYSRET&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Intel&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;virtualization&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;mi&#34;&gt;23&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;09&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;01&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;up&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;16&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;min&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;  &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;user&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;  &lt;span class=&#34;nb&#34;&gt;load&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;average&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;0.48&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;0.36&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;0.15&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;runlevel&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;------------------------------------------------------------------------&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Benchmark&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Run&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;土&lt;/span&gt;  &lt;span class=&#34;mi&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;月&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;03&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2014&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;23&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;09&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;01&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;23&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;37&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;04&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;CPUs&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;system&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;running&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;parallel&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;copies&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;of&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tests&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Dhrystone&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;using&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;register&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;variables&lt;/span&gt;      &lt;span class=&#34;mf&#34;&gt;101603873.7&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;lps&lt;/span&gt;   &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;10.0&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;7&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;samples&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Double&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Precision&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Whetstone&lt;/span&gt;                    &lt;span class=&#34;mf&#34;&gt;13534.6&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;MWIPS&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;9.5&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;7&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;samples&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Execl&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Throughput&lt;/span&gt;                               &lt;span class=&#34;mf&#34;&gt;9342.6&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;lps&lt;/span&gt;   &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;30.0&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;samples&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;ne&#34;&gt;File&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Copy&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1024&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;bufsize&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2000&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;maxblocks&lt;/span&gt;       &lt;span class=&#34;mf&#34;&gt;1234346.4&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;KBps&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;30.0&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;samples&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;ne&#34;&gt;File&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Copy&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;256&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;bufsize&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;500&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;maxblocks&lt;/span&gt;          &lt;span class=&#34;mf&#34;&gt;357616.0&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;KBps&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;30.0&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;samples&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;ne&#34;&gt;File&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Copy&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;4096&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;bufsize&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;8000&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;maxblocks&lt;/span&gt;       &lt;span class=&#34;mf&#34;&gt;3552485.0&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;KBps&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;30.0&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;samples&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Pipe&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Throughput&lt;/span&gt;                             &lt;span class=&#34;mf&#34;&gt;2069868.8&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;lps&lt;/span&gt;   &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;10.0&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;7&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;samples&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Pipe&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;based&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Context&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Switching&lt;/span&gt;                 &lt;span class=&#34;mf&#34;&gt;474862.6&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;lps&lt;/span&gt;   &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;10.0&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;7&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;samples&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Process&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Creation&lt;/span&gt;                              &lt;span class=&#34;mf&#34;&gt;11240.1&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;lps&lt;/span&gt;   &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;30.0&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;samples&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Shell&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Scripts&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;concurrent&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;                  &lt;span class=&#34;mf&#34;&gt;11490.6&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;lpm&lt;/span&gt;   &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;60.0&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;samples&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Shell&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Scripts&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;8&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;concurrent&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;                   &lt;span class=&#34;mf&#34;&gt;2664.5&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;lpm&lt;/span&gt;   &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;60.0&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;samples&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Call&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Overhead&lt;/span&gt;                        &lt;span class=&#34;mf&#34;&gt;1245743.8&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;lps&lt;/span&gt;   &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;10.0&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;7&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;samples&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Benchmarks&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Index&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Values&lt;/span&gt;               &lt;span class=&#34;n&#34;&gt;BASELINE&lt;/span&gt;       &lt;span class=&#34;n&#34;&gt;RESULT&lt;/span&gt;    &lt;span class=&#34;n&#34;&gt;INDEX&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Dhrystone&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;using&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;register&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;variables&lt;/span&gt;         &lt;span class=&#34;mf&#34;&gt;116700.0&lt;/span&gt;  &lt;span class=&#34;mf&#34;&gt;101603873.7&lt;/span&gt;   &lt;span class=&#34;mf&#34;&gt;8706.4&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Double&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Precision&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Whetstone&lt;/span&gt;                       &lt;span class=&#34;mf&#34;&gt;55.0&lt;/span&gt;      &lt;span class=&#34;mf&#34;&gt;13534.6&lt;/span&gt;   &lt;span class=&#34;mf&#34;&gt;2460.8&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Execl&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Throughput&lt;/span&gt;                                 &lt;span class=&#34;mf&#34;&gt;43.0&lt;/span&gt;       &lt;span class=&#34;mf&#34;&gt;9342.6&lt;/span&gt;   &lt;span class=&#34;mf&#34;&gt;2172.7&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;ne&#34;&gt;File&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Copy&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1024&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;bufsize&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2000&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;maxblocks&lt;/span&gt;          &lt;span class=&#34;mf&#34;&gt;3960.0&lt;/span&gt;    &lt;span class=&#34;mf&#34;&gt;1234346.4&lt;/span&gt;   &lt;span class=&#34;mf&#34;&gt;3117.0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;ne&#34;&gt;File&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Copy&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;256&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;bufsize&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;500&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;maxblocks&lt;/span&gt;            &lt;span class=&#34;mf&#34;&gt;1655.0&lt;/span&gt;     &lt;span class=&#34;mf&#34;&gt;357616.0&lt;/span&gt;   &lt;span class=&#34;mf&#34;&gt;2160.8&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;ne&#34;&gt;File&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Copy&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;4096&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;bufsize&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;8000&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;maxblocks&lt;/span&gt;          &lt;span class=&#34;mf&#34;&gt;5800.0&lt;/span&gt;    &lt;span class=&#34;mf&#34;&gt;3552485.0&lt;/span&gt;   &lt;span class=&#34;mf&#34;&gt;6125.0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Pipe&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Throughput&lt;/span&gt;                               &lt;span class=&#34;mf&#34;&gt;12440.0&lt;/span&gt;    &lt;span class=&#34;mf&#34;&gt;2069868.8&lt;/span&gt;   &lt;span class=&#34;mf&#34;&gt;1663.9&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Pipe&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;based&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Context&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Switching&lt;/span&gt;                   &lt;span class=&#34;mf&#34;&gt;4000.0&lt;/span&gt;     &lt;span class=&#34;mf&#34;&gt;474862.6&lt;/span&gt;   &lt;span class=&#34;mf&#34;&gt;1187.2&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Process&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Creation&lt;/span&gt;                                &lt;span class=&#34;mf&#34;&gt;126.0&lt;/span&gt;      &lt;span class=&#34;mf&#34;&gt;11240.1&lt;/span&gt;    &lt;span class=&#34;mf&#34;&gt;892.1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Shell&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Scripts&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;concurrent&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;                     &lt;span class=&#34;mf&#34;&gt;42.4&lt;/span&gt;      &lt;span class=&#34;mf&#34;&gt;11490.6&lt;/span&gt;   &lt;span class=&#34;mf&#34;&gt;2710.0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Shell&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Scripts&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;8&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;concurrent&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;                      &lt;span class=&#34;mf&#34;&gt;6.0&lt;/span&gt;       &lt;span class=&#34;mf&#34;&gt;2664.5&lt;/span&gt;   &lt;span class=&#34;mf&#34;&gt;4440.9&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Call&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Overhead&lt;/span&gt;                          &lt;span class=&#34;mf&#34;&gt;15000.0&lt;/span&gt;    &lt;span class=&#34;mf&#34;&gt;1245743.8&lt;/span&gt;    &lt;span class=&#34;mf&#34;&gt;830.5&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                                                   &lt;span class=&#34;o&#34;&gt;========&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Benchmarks&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Index&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Score&lt;/span&gt;                                        &lt;span class=&#34;mf&#34;&gt;2384.7&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4774163775/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/51sUs8wZ1vL._SL160_.jpg&#34; alt=&#34;【改訂新版】Linuxエンジニア養成読本 [クラウド時代も、システムの基礎と基盤はLinux! ] (Software Design plus)&#34; loading=&#34;lazy&#34; title=&#34;【改訂新版】Linuxエンジニア養成読本 [クラウド時代も、システムの基礎と基盤はLinux! ] (Software Design plus)&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4774163775/kazzhomeunixo-22/&#34;&gt;【改訂新版】Linuxエンジニア養成読本 [クラウド時代も、システムの基礎と基盤はLinux! ] (Software Design plus)&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: 養成読本編集部&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: 技術評論社&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2014/03/18&lt;/li&gt;&#xA;&lt;li&gt;メディア: 大型本&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4774163775/kazzhomeunixo-22&#34;&gt;この商品を含むブログを見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>会社の本番環境をJava8で動かそうとしたらNewRelicでエラーが出た</title>
				<link>https://journal.lampetty.net/posts/java8-new-relic-error/</link>
				<pubDate>Wed, 30 Apr 2014 20:19:44 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/java8-new-relic-error/</guid>
				<description>&lt;p&gt;そろそろJava8でコード書きたい&lt;br&gt;&#xA;　↓&lt;br&gt;&#xA;まずはJVMをJava8で動かさないと...！(JVMに問題があった時に詰む)&lt;br&gt;&#xA;　↓&lt;br&gt;&#xA;本番のJVMをJava8にした&lt;br&gt;&#xA;　↓&lt;br&gt;&#xA;起動時にNewRelic入れてるサーバでエラーが出た&lt;br&gt;&#xA;　↓&lt;br&gt;&#xA;対応に数ヶ月かかるかもしれないとのこと＼(^o^)／ (←イマココ)&lt;/p&gt;&#xA;&lt;p&gt;出たエラーはこんな感じ。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Apr&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;15&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2014&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;13&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;56&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;01&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0900&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;13004&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;com&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;newrelic&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;INFO&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Agent&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;using&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Logback&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Apr&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;15&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2014&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;13&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;56&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;02&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0900&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;13004&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;com&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;newrelic&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;INFO&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Loading&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;configuration&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;/path/to/newrelic/newrelic.yml&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;.&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;.&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;java&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;lang&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;IllegalArgumentException&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;at&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;com&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;newrelic&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;deps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;org&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;objectweb&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;asm&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ClassReader&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;init&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Unknown&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Source&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;at&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;com&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;newrelic&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;deps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;org&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;objectweb&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;asm&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ClassReader&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;init&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Unknown&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Source&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;at&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;com&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;newrelic&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;deps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;org&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;objectweb&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;asm&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ClassReader&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;init&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Unknown&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Source&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;at&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;com&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;newrelic&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;agent&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;util&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;asm&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;PatchedClassWriter&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;getClassReader&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;PatchedClassWriter&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;java&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;102&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;at&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;com&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;newrelic&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;agent&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;util&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;asm&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;PatchedClassWriter&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;getCommonSuperClass&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;PatchedClassWriter&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;java&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;77&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;at&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;com&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;newrelic&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;deps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;org&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;objectweb&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;asm&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ClassWriter&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Unknown&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Source&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;at&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;com&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;newrelic&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;deps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;org&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;objectweb&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;asm&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Frame&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Unknown&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Source&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;at&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;com&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;newrelic&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;deps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;org&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;objectweb&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;asm&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Frame&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Unknown&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Source&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;at&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;com&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;newrelic&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;deps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;org&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;objectweb&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;asm&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MethodWriter&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;visitMaxs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Unknown&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Source&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;at&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;com&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;newrelic&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;deps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;org&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;objectweb&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;asm&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tree&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MethodNode&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;accept&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Unknown&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Source&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;at&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;com&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;newrelic&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;deps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;org&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;objectweb&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;asm&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;commons&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JSRInlinerAdapter&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;visitEnd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Unknown&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Source&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;at&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;com&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;newrelic&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;deps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;org&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;objectweb&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;asm&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MethodVisitor&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;visitEnd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Unknown&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Source&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;at&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;com&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;newrelic&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;deps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;org&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;objectweb&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;asm&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ClassReader&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Unknown&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Source&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;at&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;com&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;newrelic&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;deps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;org&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;objectweb&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;asm&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ClassReader&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;accept&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Unknown&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Source&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;at&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;com&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;newrelic&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;deps&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;org&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;objectweb&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;asm&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ClassReader&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;accept&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Unknown&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Source&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;at&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;com&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;newrelic&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;agent&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;instrumentation&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;context&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;InstrumentationContextManager&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;3.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;getFinalTransformation&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;InstrumentationContextManager&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;java&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;315&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;at&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;com&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;newrelic&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;agent&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;instrumentation&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;context&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;InstrumentationContextManager&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;3.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;transform&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;InstrumentationContextManager&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;java&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;256&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;at&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;com&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;newrelic&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;agent&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;instrumentation&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;context&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;InstrumentationContextManager&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;2.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;transform&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;InstrumentationContextManager&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;java&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;192&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;at&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sun&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;instrument&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;TransformerManager&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;transform&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;TransformerManager&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;java&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;188&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;at&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sun&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;instrument&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;InstrumentationImpl&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;transform&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;InstrumentationImpl&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;java&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;428&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;at&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;java&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;lang&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ClassLoader&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;defineClass1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Native&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Method&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;at&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;java&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;lang&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ClassLoader&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;defineClass&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ClassLoader&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;java&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;760&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;at&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;java&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;security&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;SecureClassLoader&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;defineClass&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;SecureClassLoader&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;java&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;142&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;at&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;java&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;net&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;URLClassLoader&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;defineClass&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;URLClassLoader&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;java&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;455&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;at&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;java&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;net&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;URLClassLoader&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;access&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;100&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;URLClassLoader&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;java&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;73&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;at&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;java&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;net&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;URLClassLoader&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;1.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;run&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;URLClassLoader&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;java&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;367&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;at&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;java&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;net&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;URLClassLoader&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;1.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;run&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;URLClassLoader&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;java&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;361&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;at&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;java&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;security&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;AccessController&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;doPrivileged&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Native&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Method&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;at&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;java&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;net&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;URLClassLoader&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;findClass&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;URLClassLoader&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;java&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;360&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;at&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;java&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;lang&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ClassLoader&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;loadClass&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ClassLoader&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;java&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;424&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;at&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sun&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;misc&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Launcher&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;AppClassLoader&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;loadClass&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Launcher&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;java&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;308&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;at&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;java&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;lang&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ClassLoader&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;loadClass&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ClassLoader&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;java&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;357&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;at&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sun&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;launcher&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;LauncherHelper&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;checkAndLoadMain&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;LauncherHelper&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;java&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;495&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4798122386/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/51tyawA6PIL._SL160_.jpg&#34; alt=&#34;Java逆引きレシピ&#34; loading=&#34;lazy&#34; title=&#34;Java逆引きレシピ&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4798122386/kazzhomeunixo-22/&#34;&gt;Java逆引きレシピ&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: 竹添直樹,高橋和也,織田翔,島本多可子&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: 翔泳社&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2014/04/22&lt;/li&gt;&#xA;&lt;li&gt;メディア: 単行本（ソフトカバー）&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4798122386/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (1件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>開発効率をUPする Git逆引き入門を読んだ</title>
				<link>https://journal.lampetty.net/posts/git-gyakubiki-book/</link>
				<pubDate>Wed, 23 Apr 2014 00:20:09 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/git-gyakubiki-book/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4863541465/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/51RtoUsheVL._SL160_.jpg&#34; alt=&#34;開発効率をUPする Git逆引き入門&#34; loading=&#34;lazy&#34; title=&#34;開発効率をUPする Git逆引き入門&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4863541465/kazzhomeunixo-22/&#34;&gt;開発効率をUPする Git逆引き入門&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: 松下雅和,船ヶ山慶,平木聡,土橋林太郎,三上丈晴&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: シーアンドアール研究所&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2014/04/09&lt;/li&gt;&#xA;&lt;li&gt;メディア: 単行本（ソフトカバー）&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4863541465/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (4件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;著者の&lt;a href=&#34;https://twitter.com/matsukaz&#34;&gt;@matsukazu&lt;/a&gt;さんより献本してもらいました。増刷が決まったようでおめでとうございます！すごい遅くなったけど、やっと読み終わったので感想をば。&lt;/p&gt;&#xA;&lt;p&gt;全体を通して読んで思ったのは、Git関連の本で一番やさしい本だということ。Gitの説明をするのにブランチやらそのマージやら色々解説しないといけないと思うんだけど、それが図入りでなるべくわかりやすい言葉で説明されていてよかった。あと、本をもらったときに「えっ、こんなに薄いの？」ってビックリした。というのは、Gitは機能が豊富なので細かい説明をしだすとけっこうボリュームが多くなってしまうと思うんだけど、なるべく基本的なところ以外は解説しないようにしてあの分量で済むようにしていたのじゃないかなぁ。&lt;/p&gt;&#xA;&lt;p&gt;SourceTreeをちゃんとスクリーンショット付きで解説しているのはこの本が初めてだと思うので、コマンドに抵抗があるデザイナーなど非エンジニアの人にも安心してオススメできる本だと思う。Gitの本はまずこの本を読んで、それから次のステップとして以下のような本をよめばいいんじゃないかなぁと思う。もっとこの本が早く出版されてたら、、、と思わずにはいられない。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4274068641/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/51WQ7GsnOZL._SL160_.jpg&#34; alt=&#34;Gitによるバージョン管理&#34; loading=&#34;lazy&#34; title=&#34;Gitによるバージョン管理&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4274068641/kazzhomeunixo-22/&#34;&gt;Gitによるバージョン管理&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: 岩松信洋,上川純一,まえだこうへい,小川伸一郎&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: オーム社&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2011/10/25&lt;/li&gt;&#xA;&lt;li&gt;メディア: 単行本（ソフトカバー）&lt;/li&gt;&#xA;&lt;li&gt;購入: 6人 クリック: 239回&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4274068641/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (27件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4873114403/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/51B2dc%2BsJGL._SL160_.jpg&#34; alt=&#34;実用Git&#34; loading=&#34;lazy&#34; title=&#34;実用Git&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4873114403/kazzhomeunixo-22/&#34;&gt;実用Git&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: Jon Loeliger,吉藤英明(監訳),本間雅洋,渡邉健太郎,浜本階生&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: オライリージャパン&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2010/02/19&lt;/li&gt;&#xA;&lt;li&gt;メディア: 大型本&lt;/li&gt;&#xA;&lt;li&gt;購入: 7人 クリック: 287回&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4873114403/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (44件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>JVM Operation Casual Talks #1でLTとパネルディスカッションしてきた</title>
				<link>https://journal.lampetty.net/posts/jvm-operation-casual-talks-1/</link>
				<pubDate>Tue, 08 Apr 2014 23:07:58 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/jvm-operation-casual-talks-1/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;http://atnd.org/events/48999&#34;&gt;JVM Operation Casual Talks #1&lt;/a&gt;でLTとパネルディスカッションしてきました(&lt;a href=&#34;http://togetter.com/li/652483&#34;&gt;togetterまとめ&lt;/a&gt;)。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;https://www.slideshare.net/oinume/jvm-operationcasualtalks20140407&#34; title=&#34;運用に効く！JVMオプション三選&#34;&gt;運用に効く！JVMオプション三選&lt;/a&gt;&lt;/strong&gt; from &lt;strong&gt;&lt;a href=&#34;http://www.slideshare.net/oinume&#34;&gt;Kazuhiro Oinuma&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;この日登壇した人でJVM好きな人っていたんだろうか？っていうぐらいLL寄りな人が多かった印象だった。パネルディスカッションというものは初めてだったんだけど(&lt;a href=&#34;#1&#34;&gt;*1&lt;/a&gt;)、人の目の前でJVMをDISれてよかったなぁと思う。はてなさんの新しいサービスはScalaでできているらしくてそれがすごいビックリした。(LLで頑張る会社だと思ってたので)&lt;/p&gt;&#xA;&lt;p&gt;パネルディスカッション中に「JVMのプロセスはカジュアルに再起動するものじゃない」という意見が出て、理想はそうなんだろうけど現実はFullGCしたりするしじゃじゃ馬なんだよなぁと思ったりした。結局JVMの上に乗るものは人間が作るものでバグがあったり不完全だったりするので、危なくなったらLBから切り離して再起動する運用は全然アリだと思う。もちろん進んでやるものではないですが。&lt;/p&gt;&#xA;&lt;p&gt;飲み会の場で第2回があるとしたらウチの会社でやることになってたので、誰か気が向いたら開催されるとおもいます。&lt;/p&gt;&#xA;&lt;p&gt;1.@oranieと@waysakuとじゃんけんして負けたので出ることになった&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4798025623/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/51ihQN2UlbL._SL160_.jpg&#34; alt=&#34;ガベージコレクションのアルゴリズムと実装&#34; loading=&#34;lazy&#34; title=&#34;ガベージコレクションのアルゴリズムと実装&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4798025623/kazzhomeunixo-22/&#34;&gt;ガベージコレクションのアルゴリズムと実装&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: 中村成洋,相川光,竹内郁雄&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: 秀和システム&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2010/03/18&lt;/li&gt;&#xA;&lt;li&gt;メディア: 単行本&lt;/li&gt;&#xA;&lt;li&gt;購入: 25人 クリック: 810回&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4798025623/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (95件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>Flask &#43; BeakerでセッションデータをRedisに保存する</title>
				<link>https://journal.lampetty.net/posts/flask-beaker-session-redis/</link>
				<pubDate>Fri, 28 Mar 2014 01:47:13 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/flask-beaker-session-redis/</guid>
				<description>&lt;h1 id=&#34;やりたいこと&#34;&gt;やりたいこと&lt;/h1&gt;&#xA;&lt;p&gt;Redisをセッションデータの保存先にしたい&lt;/p&gt;&#xA;&lt;h1 id=&#34;beakerって&#34;&gt;Beakerって？&lt;/h1&gt;&#xA;&lt;p&gt;様々なデータストアにセッションデータを保存するWSGI Middleware。WSGIレイヤーなのでFlask以外のWAF(bottleとか)でも使えるはず。&lt;/p&gt;&#xA;&lt;h1 id=&#34;必要なもの&#34;&gt;必要なもの&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Python 2.6+ (自分はPython 3.3.4で動かしてる)&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://flask.pocoo.org/&#34;&gt;Flask&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://beaker.readthedocs.org/en/latest/&#34;&gt;Beaker&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/bbangert/beaker_extensions&#34;&gt;beaker_extensions&lt;/a&gt; - beakerだけだとRedisには対応してないためこれが必要&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://redis-py.readthedocs.org/en/latest/&#34;&gt;redis-py&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://redis.io/&#34;&gt;Redis&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;サンプルコード&#34;&gt;サンプルコード&lt;/h1&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://gist.github.com/9811874&#34;&gt;gist9811874&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;動かす&#34;&gt;動かす&lt;/h1&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ pip install beaker flask redis git+git://github.com/bbangert/beaker_extensions.git&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ python beaker_sample.py&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&#34;http://localhost:5000/&#34;&gt;http://localhost:5000/&lt;/a&gt; にアクセスしてみる&lt;/p&gt;&#xA;&lt;h2 id=&#34;確認してみる&#34;&gt;確認してみる&lt;/h2&gt;&#xA;&lt;p&gt;セッションデータが保存されているか確認してみる。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ redis-cli&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;127.0.0.1:6379&amp;gt; keys *&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;1) &amp;#34;beaker:2c9ac3823d844bc0848d2b0fbb154fc1:session&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2) &amp;#34;beaker:3a049f5fcede47e396341b663563153b:session&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;tips&#34;&gt;TIPS&lt;/h1&gt;&#xA;&lt;p&gt;デフォルトだとdb=0のデータベースに保存されるので、これを変えたい場合は&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &amp;#39;session.url&amp;#39;: &amp;#39;127.0.0.1:6379&amp;#39;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    ↓&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &amp;#39;session.url&amp;#39;: &amp;#39;127.0.0.1:6379?db=1&amp;#39;,&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;みたいにすれば良いってことを&lt;a href=&#34;https://github.com/bbangert/beaker_extensions/blob/master/beaker_extensions/nosql.py#L33&#34;&gt;ソース見て&lt;/a&gt;学んだ。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4048917358/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/51j4SpuVy%2BL._SL160_.jpg&#34; alt=&#34;Redis入門 インメモリKVSによる高速データ管理&#34; loading=&#34;lazy&#34; title=&#34;Redis入門 インメモリKVSによる高速データ管理&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4048917358/kazzhomeunixo-22/&#34;&gt;Redis入門 インメモリKVSによる高速データ管理&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: Josiah L. Carlson,長尾高弘&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: KADOKAWA/アスキー・メディアワークス&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2013/12/27&lt;/li&gt;&#xA;&lt;li&gt;メディア: 大型本&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4048917358/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (3件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>Redisで全てのキーを取得する</title>
				<link>https://journal.lampetty.net/posts/get-all-keys-from-redis/</link>
				<pubDate>Thu, 27 Mar 2014 23:42:57 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/get-all-keys-from-redis/</guid>
				<description>&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;keys *&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B00HSC64P8/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/51XPXODZh3L._SL160_.jpg&#34; alt=&#34;Redis入門　インメモリKVSによる高速データ管理 (アスキー書籍)&#34; loading=&#34;lazy&#34; title=&#34;Redis入門　インメモリKVSによる高速データ管理 (アスキー書籍)&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B00HSC64P8/kazzhomeunixo-22/&#34;&gt;Redis入門　インメモリKVSによる高速データ管理 (アスキー書籍)&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: Ｊｏｓｉａｈ　Ｌ．　Ｃａｒｌｓｏｎ,長尾高弘&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: KADOKAWA / アスキー・メディアワークス&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2014/01/16&lt;/li&gt;&#xA;&lt;li&gt;メディア: Kindle版&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/B00HSC64P8/kazzhomeunixo-22&#34;&gt;この商品を含むブログを見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>vagrant up した時にprovisionしたくない</title>
				<link>https://journal.lampetty.net/posts/vagrant-no-provision/</link>
				<pubDate>Wed, 26 Mar 2014 22:48:12 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/vagrant-no-provision/</guid>
				<description>&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ vagrant up --no-provision&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;いっつも忘れる。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4873116651/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/41rW4Ay1U9L._SL160_.jpg&#34; alt=&#34;実践 Vagrant&#34; loading=&#34;lazy&#34; title=&#34;実践 Vagrant&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4873116651/kazzhomeunixo-22/&#34;&gt;実践 Vagrant&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: Mitchell Hashimoto,Sky株式会社玉川竜司&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: オライリージャパン&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2014/02/21&lt;/li&gt;&#xA;&lt;li&gt;メディア: 単行本（ソフトカバー）&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4873116651/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (5件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>nodemonを使ってFlaskなWebアプリを自動でリロード</title>
				<link>https://journal.lampetty.net/posts/auto-reload-flask-app-with-nodemon/</link>
				<pubDate>Sat, 15 Mar 2014 18:12:28 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/auto-reload-flask-app-with-nodemon/</guid>
				<description>&lt;p&gt;最近のWebアプリケーションフレームワークだと、「開発している時はファイルの変更を検知して自動でアプリを再起動する」みたいな機能がある。PythonのFlaskで開発している場合は&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;#!/usr/bin/env python&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;from flask import Flask&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;app = Flask(__name__)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;app.config.update({&amp;#39;DEBUG&amp;#39;: True })&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;@app.route(&amp;#39;/&amp;#39;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;def root():&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    return &amp;#34;Hello world!&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;if __name__ == &amp;#39;__main__&amp;#39;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    app.run()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;というコードを&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ python main.py&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;のように実行していると&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Running&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;on&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;127.0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;0.1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;5000&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Restarting&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;with&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;reloader&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;となって自動リロードが有効になる。ただ、これってSyntax Errorが出る状態でファイルを保存してしまうとpythonのプロセス自体がそのままお亡くなりになるので、自分でコマンド叩いて起動し直さないといけない。&lt;/p&gt;&#xA;&lt;p&gt;そこで&lt;a href=&#34;http://nodemon.io/&#34;&gt;nodemon&lt;/a&gt;。nodemonを使えばファイルの更新チェック自体はnodemonが行うため、Syntax Errorなコードを保存しても修正すればもう一度勝手にリロードしてくれる。&lt;/p&gt;&#xA;&lt;p&gt;nodemonの使い方は簡単で&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ npm install -g nodemon&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;して&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ nodemon --exec python main.py&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;な感じで起動してやる。ただ、nodemonを使う場合は&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;app&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;run&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;　&lt;span class=&#34;err&#34;&gt;↓&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;app&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;run&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;use_reloader&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;False&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;のようにFlaskでの自動リロードを無効にしてやる必要がある。&lt;/p&gt;&#xA;&lt;p&gt;その他にも&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;コンソールから &lt;em&gt;rs&lt;/em&gt; って入力しても再起動できたり&lt;/li&gt;&#xA;&lt;li&gt;変更検知の除外対象のファイルを指定できたりする&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;のが便利でnodemonはけっこう気に入っている。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/477415539X/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/51qCCa-gPLL._SL160_.jpg&#34; alt=&#34;パーフェクトPython (PERFECT SERIES 5)&#34; loading=&#34;lazy&#34; title=&#34;パーフェクトPython (PERFECT SERIES 5)&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/477415539X/kazzhomeunixo-22/&#34;&gt;パーフェクトPython (PERFECT SERIES 5)&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: Pythonサポーターズ&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: 技術評論社&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2013/03/05&lt;/li&gt;&#xA;&lt;li&gt;メディア: 大型本&lt;/li&gt;&#xA;&lt;li&gt;購入: 1人 クリック: 65回&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/477415539X/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (17件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>Python3に対応したtomahawk 0.7.0をリリース</title>
				<link>https://journal.lampetty.net/posts/tomahawk-0.7.0-released/</link>
				<pubDate>Mon, 03 Mar 2014 01:37:59 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/tomahawk-0.7.0-released/</guid>
				<description>&lt;p&gt;久々に&lt;a href=&#34;https://github.com/oinume/tomahawk&#34;&gt;tomahawk&lt;/a&gt;の新しいバージョンをリリース。今回はずっと放置していたPython3対応(Python3.2+)をやっとこさ完了した。&lt;/p&gt;&#xA;&lt;p&gt;Python3はいろいろ変わり過ぎていてもう諦めようかなーと思っていたんだけど、去年のPyCon APACで&lt;a href=&#34;https://pypi.python.org/pypi/six&#34;&gt;six&lt;/a&gt;っていうモジュールを知って、「これ使えばけっこう簡単にPython3対応できるのかー」と思ってやってみた。でも実際はそんな簡単にはいかず、特にunicodeとbytesの違いでけっこうハマってしまったけど。&lt;/p&gt;&#xA;&lt;p&gt;あとは今回のバージョンから、&lt;a href=&#34;https://tomahawk.readthedocs.org/en/latest/&#34;&gt;ReadTheDocs&lt;/a&gt;でホスティングしてるドキュメントのテーマをReadTheDocs謹製のものにしてみた。おかげでドキュメントのかっこよさはだいぶ増したはず。&lt;/p&gt;&#xA;&lt;p&gt;自分的には大量のリモートサーバ操作には最近は&lt;a href=&#34;https://pypi.python.org/pypi/Fabric&#34;&gt;Fabric&lt;/a&gt;を使うことが多くて、もはやtomahawkはほとんど使ってないんだけど、コマンドの出力はやっぱりtomahawkの方が見やすかったりしてまだ手放せない状態。なのでしばらくは細々とメンテナンスをつづけようかなーと。&lt;/p&gt;&#xA;&lt;p&gt;今後はtomahawk -&amp;gt; Fabricの流れを作っていくために、今回のリリースでも&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;ホスト指定を-hじゃなくて-Hにしたり&lt;/li&gt;&#xA;&lt;li&gt;~/.ssh/configをちゃんと優先するようにしたり&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;と、割とFabricに楽に移行できるようにしていってるところ。tomahawkのいいところはFabricにも移植していきたいので、Fabricのソースも読まないとなぁ。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/477415539X/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/51qCCa-gPLL._SL160_.jpg&#34; alt=&#34;パーフェクトPython (PERFECT SERIES 5)&#34; loading=&#34;lazy&#34; title=&#34;パーフェクトPython (PERFECT SERIES 5)&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/477415539X/kazzhomeunixo-22/&#34;&gt;パーフェクトPython (PERFECT SERIES 5)&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: Pythonサポーターズ&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: 技術評論社&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2013/03/05&lt;/li&gt;&#xA;&lt;li&gt;メディア: 大型本&lt;/li&gt;&#xA;&lt;li&gt;購入: 1人 クリック: 65回&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/477415539X/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (16件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>TypeScriptでNode.jsのexpressを使ってHello worldしてみる</title>
				<link>https://journal.lampetty.net/posts/using-express-with-typescript/</link>
				<pubDate>Tue, 18 Feb 2014 02:03:03 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/using-express-with-typescript/</guid>
				<description>&lt;p&gt;TypeScriptでexpressを使ってHello worldしてみた。けっこうはまったのでメモメモ。使ってるTypeScriptのバージョンは1.0.1。&lt;/p&gt;&#xA;&lt;h1 id=&#34;準備&#34;&gt;準備&lt;/h1&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npm install -g typescript&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npm install --save express&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;試しにコンパイル&#34;&gt;試しにコンパイル&lt;/h1&gt;&#xA;&lt;p&gt;こんな感じのコードを書いてコンパイルしてみる。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ tsc --module commonjs hello.ts&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;コンパイルエラーが...(；´Д｀)&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;./typescript-sample/server/hello.ts(1,1): error TS2071: Unable to resolve external module &amp;#39;&amp;#39;express&amp;#39;&amp;#39;.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;./typescript-sample/server/hello.ts(1,1): error TS2072: Module cannot be aliased to a non-module type.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;./typescript-sample/server/hello.ts(2,1): error TS2071: Unable to resolve external module &amp;#39;&amp;#39;http&amp;#39;&amp;#39;.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;./typescript-sample/server/hello.ts(2,1): error TS2072: Module cannot be aliased to a non-module type.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;./typescript-sample/server/hello.ts(5,11): error TS2088: Cannot invoke an expression whose type lacks a call signature.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;./typescript-sample/server/hello.ts(6,17): error TS2095: Could not find symbol &amp;#39;process&amp;#39;.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;定義ファイルをコピー&#34;&gt;定義ファイルをコピー&lt;/h1&gt;&#xA;&lt;p&gt;いろいろググったところ、expressやNode.jsの標準ライブラリの定義ファイルみたいなものが必要らしいので、&lt;a href=&#34;https://github.com/soywiz/DefinitelyTyped&#34;&gt;ここ&lt;/a&gt;から以下の2つをhello.tsと同じディレクトリに配置する。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;node/node.d.ts&lt;/li&gt;&#xA;&lt;li&gt;express/express.d.ts&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;なお、&lt;a href=&#34;https://github.com/soywiz/DefinitelyTyped/blob/master/express/express.d.ts#L13&#34;&gt;express.d.tsのL13&lt;/a&gt;は&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/// &amp;lt;reference path=&amp;#34;node.d.ts&amp;#34; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;のように修正する必要がある。(ディレクトリ構造が違うため。これ、DefinitelyTypedのディレクトリ構造のままじゃ駄目なのかなー？)&lt;/p&gt;&#xA;&lt;h3 id=&#34;追記&#34;&gt;追記&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ npm install -g tsd&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ tsd query express --save --resolve --action install&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;して、hello.ts に&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/// &amp;lt;reference path=&amp;#34;typings/tsd.d.ts&amp;#34; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;を追記することで型定義ファイルを参照することができるようになった。vvakame さんありがとうございます！&lt;/p&gt;&#xA;&lt;h1 id=&#34;もう一度コンパイル&#34;&gt;もう一度コンパイル&lt;/h1&gt;&#xA;&lt;p&gt;これでもう一回コンパイルしてみる。今度は成功するはず。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ tsc --module commonjs hello.ts&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;あとは生成された hello.js を実行して、&lt;a href=&#34;http://localhost:3000/&#34;&gt;http://localhost:3000/&lt;/a&gt; にアクセスして &lt;code&gt;Hello world!&lt;/code&gt; と表示されればおｋ&lt;/p&gt;&#xA;&lt;p&gt;ちなみに &lt;code&gt;--module&lt;/code&gt; というオプションは生成するJSのモジュール形式。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;commonjs&lt;/code&gt;を指定するとCommonJS形式(Node.jsのrequire)&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;amd&lt;/code&gt;を指定するとRequire.js形式(ブラウザで使う場合)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;となるみたい。&lt;/p&gt;&#xA;&lt;h1 id=&#34;あわせて読みたい&#34;&gt;あわせて読みたい&lt;/h1&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://journal.lampetty.net/entry/setup-typescript-development-environment&#34;&gt;IntelliJ IDEAでTypeScriptの開発環境を作ってみる - おいぬま日報&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/484433588X/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/51pGATfH-gL._SL160_.jpg&#34; alt=&#34;TypeScriptリファレンス Ver.1.0対応&#34; loading=&#34;lazy&#34; title=&#34;TypeScriptリファレンス Ver.1.0対応&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/484433588X/kazzhomeunixo-22/&#34;&gt;TypeScriptリファレンス Ver.1.0対応&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: わかめまさひろ,井上章,丸山弘詩&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: インプレスジャパン&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2014/05/16&lt;/li&gt;&#xA;&lt;li&gt;メディア: 単行本（ソフトカバー）&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/484433588X/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (2件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>テック系ポッドキャスト</title>
				<link>https://journal.lampetty.net/posts/tech-podcast-the-news/</link>
				<pubDate>Sun, 16 Feb 2014 22:05:52 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/tech-podcast-the-news/</guid>
				<description>&lt;p&gt;最近&lt;a href=&#34;http://rebuild.fm/&#34;&gt;Rebuild.fm&lt;/a&gt;というテック系ポッドキャストを聴く延長で、&lt;a href=&#34;http://5by5.tv/news/&#34;&gt;The News&lt;/a&gt;も聴くようになった。これはApple、ゲーム、ギーク文化などのテック系の最新ニュースを5分ぐらいでまとめてほぼ毎日配信しているもの。&lt;/p&gt;&#xA;&lt;p&gt;これを聴くのが習慣化した理由はたぶん以下。&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;5分という長さがちょうどいい。通勤時にさくっと聴ける。&lt;/li&gt;&#xA;&lt;li&gt;イギリス英語が聴き取りやすい(アメリカ英語って聴き取りづらくないっすか？)&lt;/li&gt;&#xA;&lt;li&gt;Show Notes に喋っていることが書かれていて復習＆予習しやすい→英語の勉強になる&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;テック系のポッドキャストは&lt;a href=&#34;https://itunes.apple.com/us/genre/podcasts-technology-software/id1480&#34;&gt;ここ&lt;/a&gt;に色々あるので、興味ある人は探してみるといいかも。&lt;a href=&#34;http://nodeup.com/&#34;&gt;NodeUp&lt;/a&gt;なんていうNode.jsのことをひたすら語るマニアックなものもあって面白い。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>IntelliJ IDEAでTypeScriptの開発環境を作ってみる</title>
				<link>https://journal.lampetty.net/posts/setup-typescript-development-environment/</link>
				<pubDate>Sat, 15 Feb 2014 22:57:42 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/setup-typescript-development-environment/</guid>
				<description>&lt;p&gt;最近趣味プログラムのサーバサイドをNode.jsで書いてるんだけど、JavaScriptはどうも好きになれないので逃避先としてTypeScriptを選んでみた。CoffeeScriptでもいいんだけど、文法が似てるほうがソースコピペできたりして楽かなと思ってTypeScriptを選択。&lt;/p&gt;&#xA;&lt;p&gt;今回使うツールはMac版のIntelliJ IDEAのv13。&lt;/p&gt;&#xA;&lt;h1 id=&#34;必要なプラグインをインストール&#34;&gt;必要なプラグインをインストール&lt;/h1&gt;&#xA;&lt;p&gt;以下のプラグインをインストールしておく。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;NodeJS&lt;/li&gt;&#xA;&lt;li&gt;File Watchers&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;intellijの設定&#34;&gt;IntelliJの設定&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;npm install -g typescriptしておく&lt;/li&gt;&#xA;&lt;li&gt;適当にプロジェクトを作る&lt;/li&gt;&#xA;&lt;li&gt;File -&amp;gt; Settingsで Node.js and NPMの設定を開き、Node interpreterの設定をしておく。自分はnodebrewを使っていて、/usr/local/nodebrew/current/bin/node にnode.jsがインストールされている。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;hellotsファイルを作成&#34;&gt;hello.tsファイルを作成&lt;/h1&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Hello&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;message&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;constructor&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;message&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;message&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;message&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;printMessage&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;message&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;hello&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Hello&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;hello&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;hello&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;printMessage&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;こんな感じのファイルを作ると↓のように出てくるので&amp;quot;Add Watcher&amp;quot;をクリックする。&lt;/p&gt;&#xA;&lt;p&gt;Cmd + , でPreferencesを開き、File Watchers -&amp;gt; TypeScriptをダブルクリックして下記のようになっていればOK。&amp;quot;Program&amp;quot;のところがtscコマンドのインストール場所に正しくなっていれば大丈夫なはず。(自分はnodebrew使っているので /usr/local/nodebrew/current/bin/tsc)&lt;/p&gt;&#xA;&lt;h1 id=&#34;hellotsを適当に編集してみる&#34;&gt;hello.tsを適当に編集してみる&lt;/h1&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;hello&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Hello&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;hello&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;の部分を&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;hello&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ello&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;hello&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;にしてファイルを保存すると&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/usr/local/nodebrew/current/bin/tsc --sourcemap hello.ts&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;.../server/hello.ts(12,17): error TS2095: Could not find symbol &amp;#39;ello&amp;#39;.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;のようにエラーが出るはず。なお、コンパイルが正常に終われば同じディレクトリにhello.jsとhello.js.mapが出力されている。&lt;/p&gt;&#xA;&lt;h1 id=&#34;hellojsの実行&#34;&gt;hello.jsの実行&lt;/h1&gt;&#xA;&lt;p&gt;hello.jsを右クリックして&amp;quot;Run &#39;hello.js&#39;&amp;quot;をクリックすれば実行される。&lt;/p&gt;&#xA;&lt;h1 id=&#34;まとめ&#34;&gt;まとめ&lt;/h1&gt;&#xA;&lt;p&gt;意外と面倒くさくなかった。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/484433588X/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/51pGATfH-gL._SL160_.jpg&#34; alt=&#34;TypeScriptリファレンス Ver.1.0対応&#34; loading=&#34;lazy&#34; title=&#34;TypeScriptリファレンス Ver.1.0対応&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/484433588X/kazzhomeunixo-22/&#34;&gt;TypeScriptリファレンス Ver.1.0対応&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: わかめまさひろ,井上章,丸山弘詩&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: インプレスジャパン&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2014/05/16&lt;/li&gt;&#xA;&lt;li&gt;メディア: 単行本（ソフトカバー）&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/484433588X/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (2件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>2014年の個人の技術メモ事情</title>
				<link>https://journal.lampetty.net/posts/personal-memo-2014/</link>
				<pubDate>Sat, 08 Feb 2014 18:53:24 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/personal-memo-2014/</guid>
				<description>&lt;p&gt;最近個人の技術メモ的なやつを整理している。Nginxのconfigureのオプションとか、ブログに書くまでもない、本当に個人のメモ的なヤツ。&lt;/p&gt;&#xA;&lt;h1 id=&#34;今まで&#34;&gt;今まで&lt;/h1&gt;&#xA;&lt;p&gt;VPSにConfluenceというWikiを入れて書いてた。Confluenceは会社でも使っているのでずっと使い続けていたんだけど、2,3年前からWikiマークアップ記法が使えなくなってWordみたいなWYSWIGのエディタだけになってしまった。最初は頑張ってこのWYSWIGエディタに慣れようとしてたんだけど、やっぱりこれが使いづらい... 細かい装飾やレイアウトを直すのにいちいちマウスで選択するのとかやってられないと感じた。あと、ConfluenceってJava製でVPSのメモリを512MBぐらい余裕で使っちゃってたのでこれもやめたい要因の一つだった。&lt;/p&gt;&#xA;&lt;h1 id=&#34;これから&#34;&gt;これから&lt;/h1&gt;&#xA;&lt;p&gt;パブリックになってもいいようなメモはすべて&lt;a href=&#34;http://qiita.com/&#34;&gt;Qiita&lt;/a&gt;に上げるようにした。公開できないものは今のところ&lt;a href=&#34;http://wri.pe/&#34;&gt;wri.pe&lt;/a&gt;に上げているけど、Qiitaで下書きとして保存でもいいかもしれない。プログラマなのでなんだかんだでMarkdownで書くことが多く、メモの書式は全てMarkdownにやっぱり統一したいなぁというのが今回見直すきっかけだった。&lt;/p&gt;&#xA;&lt;p&gt;Qiitaのいいところ&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;KobitoっていうMacアプリがあるのがいい&lt;/li&gt;&#xA;&lt;li&gt;あとタグつけられたり&lt;/li&gt;&#xA;&lt;li&gt;どうでもいい個人のメモなのになぜかストックしてくれる人がいて少しテンションが上がる&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;wri.peのいいところ&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;ブラウザだけで書けて右側にリアルタイムでプレビューが表示されるのがいい&lt;/li&gt;&#xA;&lt;li&gt;レスポンシブデザインなので、頑張ればスマホでもメモは書ける&lt;/li&gt;&#xA;&lt;li&gt;Dropboxにメモが自動でバックアップされる&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;というのがそれぞれの利点かなぁ。他の人たちはどうしてるんだろう？やっぱりEvernoteなのかな？&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4863540892/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/41TgbHo0VmL._SL160_.jpg&#34; alt=&#34;EVERNOTE HACK&#34; loading=&#34;lazy&#34; title=&#34;EVERNOTE HACK&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4863540892/kazzhomeunixo-22/&#34;&gt;EVERNOTE HACK&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: 篠塚充&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: シーアンドアール研究所&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2011/08/10&lt;/li&gt;&#xA;&lt;li&gt;メディア: 単行本（ソフトカバー）&lt;/li&gt;&#xA;&lt;li&gt;購入: 4人 クリック: 95回&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4863540892/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (13件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>なぜ好きなアーティストのライブは楽しいのか</title>
				<link>https://journal.lampetty.net/posts/why-favrorite-artist-live-is-fun/</link>
				<pubDate>Thu, 06 Feb 2014 08:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/why-favrorite-artist-live-is-fun/</guid>
				<description>&lt;p&gt;自分の中で15年以上続いてる趣味の一つに「ライブに行く」っていうのがある。大体は好きなバンドだったり、サマソニみたいな大きなフェスだったりするんだけど、好きなアーティストのライブに行くのは本当に楽しい。それはなんでだろう？っていうのをちょっと考えてみた。&lt;/p&gt;&#xA;&lt;h1 id=&#34;めったにチャンスがない&#34;&gt;めったにチャンスがない&lt;/h1&gt;&#xA;&lt;p&gt;自分はほとんど海外のバンドしか聞かないので、彼らが日本に来るのは数年に1回ぐらいのペースだ。なのでそもそも彼らの音楽を生で聴くということ自体がすごく希少なので、それを考えただけでもテンションが上がる。&lt;/p&gt;&#xA;&lt;h1 id=&#34;一体感&#34;&gt;一体感&lt;/h1&gt;&#xA;&lt;p&gt;自分はだいたいスタンディングのライブしか行かなくて、さらに前方で見てることが多い。そこにいる客層はマニアなぐらいコアなファンだ。前列の盛り上がりはすごいし、メタルとかヘビィロック系のバンドだと前方は戦場だと言っても過言じゃない。モッシュ・ダイブは日常茶飯事だし、気付いたら上から人が降ってくるなんていうのもよくある話。&lt;/p&gt;&#xA;&lt;p&gt;そんなファンたちばかりの前方エリアの一体感はすごい。「みんな本当にこのバンドのことが好きなんだなぁ」っていうのがわかるほど楽しそうな顔をしているし、性別とか年齢とか国籍なんて関係ない。ダイブした人が落ちてきたらすぐ助けてあげるし、体力的につらそうな人がちゃんと後ろにいけるようにみんなちゃんと気遣ってる。&lt;/p&gt;&#xA;&lt;p&gt;普段は電車でちょっとカバンが当たっただけで舌打ちされるような世の中なのに、ライブ会場はすごく優しさとか思いやりに溢れていると思う。&lt;/p&gt;&#xA;&lt;h1 id=&#34;終わったあとの楽しみ&#34;&gt;終わったあとの楽しみ&lt;/h1&gt;&#xA;&lt;p&gt;ライブが終わったあとの楽しみと言えば、そのライブのセットリストからiTunesのプレイリストを作ることだ。海外のアーティストだと&lt;a href=&#34;http://www.setlist.fm/&#34;&gt;setlist.fm&lt;/a&gt;、国内だと&lt;a href=&#34;http://www.setlist.mx/&#34;&gt;セトリ&lt;/a&gt;というライブのセットリストがアップされてるサイトがあるので、その日のセットリストを調べられる(だいたい1日後にはアップされてる)。そしてライブで演った曲をiTunesで聞き直して「ああ、この曲あんまり好きじゃなかったけどライブで聴いたらよかったなぁ」などと、今までたいして聴いていなかった曲が殿堂入りしたりする。&lt;/p&gt;&#xA;&lt;p&gt;あと、有名なアーティストだとTwitterで他の人の感想とかもすごく投稿されてるし、Twitter上でも妙な一体感を感じられるのもいい。&lt;/p&gt;&#xA;&lt;h1 id=&#34;まとめ&#34;&gt;まとめ&lt;/h1&gt;&#xA;&lt;p&gt;好きなアーティストのライブはぜひ行きましょう。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B002OOPFXM/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/41p-ki5wxLL._SL160_.jpg&#34; alt=&#34;ライヴ・アット・モントルー 2004 [DVD]&#34; loading=&#34;lazy&#34; title=&#34;ライヴ・アット・モントルー 2004 [DVD]&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B002OOPFXM/kazzhomeunixo-22/&#34;&gt;ライヴ・アット・モントルー 2004 [DVD]&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;出版社/メーカー: ヤマハミュージックアンドビジュアルズ&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2009/11/25&lt;/li&gt;&#xA;&lt;li&gt;メディア: DVD&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/B002OOPFXM/kazzhomeunixo-22&#34;&gt;この商品を含むブログを見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>curlでHostヘッダーつけてHTTPリクエストを送る</title>
				<link>https://journal.lampetty.net/posts/curl-with-host-header/</link>
				<pubDate>Wed, 22 Jan 2014 01:28:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/curl-with-host-header/</guid>
				<description>&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ curl -H &amp;#39;Host:example.com&amp;#39; http://192.168.1.2/alive&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;みたくすると、VirtualHostが設定されているWebサーバでも &lt;a href=&#34;http://example.com/alive&#34;&gt;http://example.com/alive&lt;/a&gt; というURLにアクセスしているのと同じことができて便利っていう話。サーバをロードバランサーから外す→再起動→curlで確認→ロードバランサーに入れる、みたいなことをよくやる時に使う。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4774138169/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/51kWaJRnGVL._SL160_.jpg&#34; alt=&#34;【改訂新版】 Linuxコマンド ポケットリファレンス (Pocket Reference)&#34; loading=&#34;lazy&#34; title=&#34;【改訂新版】 Linuxコマンド ポケットリファレンス (Pocket Reference)&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4774138169/kazzhomeunixo-22/&#34;&gt;【改訂新版】 Linuxコマンド ポケットリファレンス (Pocket Reference)&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: 沓名亮典,平山智恵&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: 技術評論社&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2009/04/08&lt;/li&gt;&#xA;&lt;li&gt;メディア: 単行本（ソフトカバー）&lt;/li&gt;&#xA;&lt;li&gt;購入: 9人 クリック: 99回&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4774138169/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (16件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>Pythonで開発されている有名なサービス</title>
				<link>https://journal.lampetty.net/posts/services-developped-with-python/</link>
				<pubDate>Sat, 18 Jan 2014 12:41:57 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/services-developped-with-python/</guid>
				<description>&lt;p&gt;他にもあったらコメントで教えて欲しいっす。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://dropbox.com/&#34;&gt;Dropbox&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://instagram.com/&#34;&gt;Instagram&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://disqus.com/&#34;&gt;Disqus&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.quora.com/&#34;&gt;Quora&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.pinterest.com/&#34;&gt;Pinterest&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.reddit.com/&#34;&gt;reddit&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://bitbucket.org/&#34;&gt;bitbucket&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.yelp.com/&#34;&gt;Yelp&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.uber.com/&#34;&gt;Uber&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>はてなブログに戻ってきた</title>
				<link>https://journal.lampetty.net/posts/back-to-hatena-blog-20140115/</link>
				<pubDate>Wed, 15 Jan 2014 00:40:32 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/back-to-hatena-blog-20140115/</guid>
				<description>&lt;p&gt;こんにちは、ブログ難民です。&lt;/p&gt;&#xA;&lt;p&gt;「はてなブログはサイドバーのカスタマイズできないのかー」と勘違いして約4ヶ月、Bloggerでブログ書いてたんですが、はてなブログでもサイドバーカスタマイズできることを今日知った情弱です。&lt;/p&gt;&#xA;&lt;p&gt;またしばらくはてなブログ使うのでよろしくお願いします。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>さらにBloggerに移転</title>
				<link>https://journal.lampetty.net/posts/moved-to-blogger-20130914/</link>
				<pubDate>Sat, 14 Sep 2013 13:09:42 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/moved-to-blogger-20130914/</guid>
				<description>&lt;p&gt;はてなブログをやめて&lt;a href=&#34;http://blogger.lampetty.net/&#34;&gt;Blogger&lt;/a&gt;に移転しました。これでいったい何回目だろうorz&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Bloggerに移転</title>
				<link>https://journal.lampetty.net/posts/moved-to-blogger-20130908/</link>
				<pubDate>Sun, 08 Sep 2013 22:25:09 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/moved-to-blogger-20130908/</guid>
				<description>&lt;p&gt;ブログを&lt;a href=&#34;http://blogger.lampetty.net/&#34;&gt;ブロガー&lt;/a&gt; に移転した。はてなブログはMarkdownで書けるのが良かったんだけど、サイドバーとかが一切カスタマイズできないのがネックで無理だった。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Redmine 2.3系でチケット一覧に親チケットの題名が出てうざいので直した</title>
				<link>https://journal.lampetty.net/posts/redmine-issues-parent-ticket/</link>
				<pubDate>Tue, 30 Jul 2013 11:17:24 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/redmine-issues-parent-ticket/</guid>
				<description>&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;--- app/helpers/queries_helper.rb  (リビジョン 12068)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;+++ app/helpers/queries_helper.rb   (作業コピー)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;@@ -124,7 +124,7 @@&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     when &amp;#39;FalseClass&amp;#39;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       l(:general_text_No)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     when &amp;#39;Issue&amp;#39;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-      value.visible? ? link_to_issue(value) : &amp;#34;##{value.id}&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;+      value.visible? ? link_to_issue(value, :subject =&amp;gt; false) : &amp;#34;##{value.id}&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     when &amp;#39;IssueRelation&amp;#39;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       other = value.other_issue(issue)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       content_tag(&amp;#39;span&amp;#39;,&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4798121622/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/51XuuxjNAaL._SL160_.jpg&#34; alt=&#34;Redmineによるタスクマネジメント実践技法&#34; loading=&#34;lazy&#34; title=&#34;Redmineによるタスクマネジメント実践技法&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4798121622/kazzhomeunixo-22/&#34;&gt;Redmineによるタスクマネジメント実践技法&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: 小川明彦,阪井誠&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: 翔泳社&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2010/10/13&lt;/li&gt;&#xA;&lt;li&gt;メディア: 大型本&lt;/li&gt;&#xA;&lt;li&gt;購入: 16人 クリック: 337回&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4798121622/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (51件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>Make Javas VM&#39;s GC log human readable with -XX:&#43;PrintGCDateStamps</title>
				<link>https://journal.lampetty.net/posts/human-readable-jvm-gc-log/</link>
				<pubDate>Sat, 27 Jul 2013 23:00:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/human-readable-jvm-gc-log/</guid>
				<description>&lt;p&gt;I use Java VM&#39;s option &lt;strong&gt;-XX:+PrintGCTimeStamps&lt;/strong&gt; in order to output time in GC log of Java VM , Just like this.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;TODAY&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;date&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;+%Y%m&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;%d&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;-%H%M%S&amp;#34;&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;`&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;JAVA_OPTS&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;-server -Xms512m -Xmx512m -Xmn256m -XX:PermSize=256m -XX:MaxPermSize=256m &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt; -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseParNewGC &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt; -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=32 -XX:TargetSurvivorRatio=85 &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt; -verbose:gc -Xloggc:/usr/local/tomcat/logs/gc.log.$TODAY &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt; -XX:+PrintGCDetails &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt; -XX:+PrintGCTimeStamps &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt; -DJENKINS_HOME=/var/lib/jenkins &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;But, the output is relative time from starting time of Java VM. So it&#39;s difficult to read. However, we have an another option &lt;strong&gt;-XX:+PrintGCDateStamps&lt;/strong&gt; !! It is an option to output &lt;strong&gt;absolute time&lt;/strong&gt;!! (Available from Java6 u6)&lt;/p&gt;&#xA;&lt;h2 id=&#34;-xxprintgctimestamps&#34;&gt;-XX:+PrintGCTimeStamps&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;63.156: [CMS-concurrent-mark-start]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;64.175: [CMS-concurrent-mark: 0.844/1.019 secs] [Times: user=2.59 sys=0.21, real=1.02 secs] &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;64.176: [CMS-concurrent-preclean-start]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;64.197: [CMS-concurrent-preclean: 0.019/0.021 secs] [Times: user=0.05 sys=0.01, real=0.03 secs] &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;64.197: [CMS-concurrent-abortable-preclean-start]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; CMS: abort preclean due to time 69.246: [CMS-concurrent-abortable-preclean: 4.756/5.049 secs] [Times: user=12.37 sys=0.75, real=5.04 secs] &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;69.248: [GC[YG occupancy: 235103 K (235968 K)]69.248: [Rescan (parallel) , 0.2130820 secs]69.461: [weak refs processing, 0.0017410 secs] [1 CMS-remark: 138712K(262144K)] 373816K(498112K), 0.2149850 secs] [Times: user=0.61 sys=0.00, real=0.21 secs] &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;69.466: [CMS-concurrent-sweep-start]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;69.468: [GC 69.468: [ParNew: 235968K-&amp;amp;gt;26176K(235968K), 0.0955880 secs] 374601K-&amp;amp;gt;174167K(498112K), 0.0957410 secs]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;-xxprintgcdatestamps&#34;&gt;-XX:+PrintGCDateStamps&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2013-01-20T13:20:43.395+0900: 0.847: [Full GC (System) 0.847: [CMS: 0K-&amp;amp;gt;1757K(262144K), 0.0502300 secs] 16808K-&amp;amp;gt;1757K(498112K), [CMS Perm : 10054K-&amp;amp;gt;10045K(262144K)], 0.0503520 secs] [Times: user=0.09 sys=0.00, real=0.05 secs] &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2013-01-20T13:20:47.952+0900: 5.404: [GC 5.404: [ParNew: 209792K-&amp;amp;gt;1976K(235968K), 0.0304360 secs] 211549K-&amp;amp;gt;3733K(498112K), 0.0305290 secs] [Times: user=0.05 sys=0.00, real=0.03 secs] &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2013-01-20T13:20:53.692+0900: 11.144: [GC 11.144: [ParNew: 211768K-&amp;amp;gt;3713K(235968K), 0.0192760 secs] 213525K-&amp;amp;gt;5470K(498112K), 0.0193720 secs] [Times: user=0.04 sys=0.00, real=0.02 secs] &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2013-01-20T13:21:02.932+0900: 20.383: [GC 20.383: [ParNew: 213505K-&amp;amp;gt;21672K(235968K), 0.0812540 secs] 215262K-&amp;amp;gt;23429K(498112K), 0.0813650 secs] [Times: user=0.13 sys=0.03, real=0.08 secs] &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2013-01-20T13:21:07.448+0900: 24.899: [GC 24.900: [ParNew: 231464K-&amp;amp;gt;26176K(235968K), 0.1677760 secs] 233221K-&amp;amp;gt;38711K(498112K), 0.1678730 secs] [Times: user=0.32 sys=0.05, real=0.17 secs] &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2013-01-20T13:21:12.021+0900: 29.473: [GC 29.473: [ParNew: 235968K-&amp;amp;gt;26176K(235968K), 0.2173720 secs] 248503K-&amp;amp;gt;57677K(498112K), 0.2175440 secs] [Times: user=0.62 sys=0.00, real=0.22 secs] &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2013-01-20T13:21:16.168+0900: 33.620: [GC 33.620: [ParNew: 235968K-&amp;amp;gt;26176K(235968K), 0.0859270 secs] 267469K-&amp;amp;gt;59042K(498112K), 0.0860640 secs]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;-XX:+PrintGCDateStamps is a great option for humans.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/0321356683/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/51poMjBx7PL._SL160_.jpg&#34; alt=&#34;Effective Java (Java Series)&#34; loading=&#34;lazy&#34; title=&#34;Effective Java (Java Series)&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/0321356683/kazzhomeunixo-22/&#34;&gt;Effective Java (Java Series)&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: Joshua Bloch&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: Prentice Hall&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2008/05/08&lt;/li&gt;&#xA;&lt;li&gt;メディア: ペーパーバック&lt;/li&gt;&#xA;&lt;li&gt;購入: 6人 クリック: 65回&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/0321356683/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (42件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>ruby-lint - Static syntax checker for Ruby</title>
				<link>https://journal.lampetty.net/posts/introduce-ruby-lint/</link>
				<pubDate>Sat, 27 Jul 2013 22:47:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/introduce-ruby-lint/</guid>
				<description>&lt;p&gt;Recently I found static syntax checker for Ruby called &lt;a href=&#34;https://github.com/YorickPeterse/ruby-lint&#34;&gt;ruby-lint&lt;/a&gt;. We haven&#39;t had such a syntax checker for Ruby, so I&#39;m very happy to find it. (Although it&#39;s alpha quality)&lt;/p&gt;&#xA;&lt;h2 id=&#34;installation&#34;&gt;Installation&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ gem install ruby-lint&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;try&#34;&gt;Try&lt;/h2&gt;&#xA;&lt;p&gt;Prepare following ruby code.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;#!/usr/bin/env ruby&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# -*- coding: utf-8 -*-&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;a = &amp;#39;hoge&amp;#39;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;puts &amp;#34;hello&amp;#34; + b&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ruby-lint it!!&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ruby&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;lint&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;hoge&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rb&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;hoge&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rb&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;error&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;line&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;column&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;15&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;undefined&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;variable&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;or&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;method&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;hoge&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rb&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;warning&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;line&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;column&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;assigned&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;but&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;unused&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;variable&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I cheer an author of ruby-lint. This is a great software!&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B00DPQ5P24/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/51emyV0F1FL._SL160_.jpg&#34; alt=&#34;The Rapid Rubyist (English Edition)&#34; loading=&#34;lazy&#34; title=&#34;The Rapid Rubyist (English Edition)&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/B00DPQ5P24/kazzhomeunixo-22/&#34;&gt;The Rapid Rubyist (English Edition)&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: Matthew Stopa&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2013/06/29&lt;/li&gt;&#xA;&lt;li&gt;メディア: Kindle版&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/B00DPQ5P24/kazzhomeunixo-22&#34;&gt;この商品を含むブログを見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>traceモジュールを使ってPythonプログラムの挙動を把握する</title>
				<link>https://journal.lampetty.net/posts/python-trace-module/</link>
				<pubDate>Sun, 21 Jul 2013 09:57:18 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/python-trace-module/</guid>
				<description>&lt;p&gt;Pythonには&lt;a href=&#34;http://docs.python.jp/2/library/trace.html&#34;&gt;trace&lt;/a&gt;モジュールというものが標準ライブラリであって、これを使うとpythonプログラムを実行した時に、どのモジュールのどの関数を呼んでいるかの情報を出力することができる。使いどころとしては、使っているライブラリやツールが「これ実際どう動いてるんだろう？」っていうのを把握したい時に重宝すると思う。&lt;a href=&#34;http://docs.python.jp/2/library/pdb.html&#34;&gt;pdb&lt;/a&gt;なんかのデバッガでもいいんだけど、「ブワッとトレース実行した結果を出しておいてあとで一気に見る」みたいな時に特に有用だと思う。&lt;/p&gt;&#xA;&lt;h2 id=&#34;使ってみよう&#34;&gt;使ってみよう&lt;/h2&gt;&#xA;&lt;p&gt;ためしに&lt;a href=&#34;https://github.com/oinume/tomahawk&#34;&gt;tomahawk&lt;/a&gt;をtrace使って実行してみた。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ python -m trace -t /usr/local/bin/tomahawk -h localhost uptime&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;実行には -m trace と -t (--trace) オプションをつける。実行結果はこんな感じ。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; &lt;span class=&#34;o&#34;&gt;---&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;modulename&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tomahawk&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;funcname&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;module&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;tomahawk&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;tomahawk&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;6&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;try&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;tomahawk&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;7&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;     &lt;span class=&#34;n&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;bootstrap&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;tomahawk&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;except&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;tomahawk&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;11&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;     &lt;span class=&#34;k&#34;&gt;pass&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;tomahawk&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;13&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tomahawk&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;command&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;CommandMain&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; &lt;span class=&#34;o&#34;&gt;---&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;modulename&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;__init__&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;funcname&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;module&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;__init__&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;py&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tomahawk&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;constants&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; &lt;span class=&#34;o&#34;&gt;---&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;modulename&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;constants&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;funcname&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;module&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;やってみるとわかるけど、標準ライブラリのコードまで延々とトレース実行される... 「標準ライブラリの中はどうでもいいんだよ」ということであれば、&lt;code&gt;--ignore-module=os,sys&lt;/code&gt; みたいな感じで除外するモジュールをカンマ区切りで指定できる。&lt;/p&gt;&#xA;&lt;p&gt;tomahawkの場合は以下のように使っているライブラリを除外したらけっこうまともなトレースが得られた。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;python&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;m&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;trace&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;t&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ignore&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;module&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;threading&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;queues&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pool&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Queue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sre_parse&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;process&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;forking&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pexpect&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;weakref&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;util&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pty&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sre_compile&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;__init__&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;re&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;posixpath&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;expect&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;UserDict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;connection&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;synchronize&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tempfile&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;random&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;hashlib&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;__future__&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;abc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;_weakrefset&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;io&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;socket&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;subprocess&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;copy&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;textwrap&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;locale&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pickle&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;gettext&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;argparse&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;os&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ConfigParser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;platform&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;functools&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stat&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;genericpath&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;getpass&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;base&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;usr&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;local&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bin&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tomahawk&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;h&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;localhost&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;uptime&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;traceモジュールは、この他にも -T(--trackcalls) で関数呼び出しの関連(どの関数がさらにどの関数を呼んでいるか)も明らかにしてくれたりするのでけっこう便利だな−と思った。Pythonってこういうモジュールが標準添付されてるのがいいっすな。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/477415539X/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;https://images-fe.ssl-images-amazon.com/images/I/51qCCa-gPLL._SL160_.jpg&#34; alt=&#34;パーフェクトPython (PERFECT SERIES 5)&#34; loading=&#34;lazy&#34; title=&#34;パーフェクトPython (PERFECT SERIES 5)&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/477415539X/kazzhomeunixo-22/&#34;&gt;パーフェクトPython (PERFECT SERIES 5)&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: Pythonサポーターズ,露木誠,ルイス・イアン,石本敦夫,小田切篤,保坂翔馬,大谷弘喜&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: 技術評論社&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2013/03/05&lt;/li&gt;&#xA;&lt;li&gt;メディア: 大型本&lt;/li&gt;&#xA;&lt;li&gt;購入: 1人 クリック: 65回&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/477415539X/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (30件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>MacのrbenvでRuby 1.9.3-p392インストール時にopenssl関連のエラー</title>
				<link>https://journal.lampetty.net/posts/mac-rbenv-install-error/</link>
				<pubDate>Sat, 20 Jul 2013 09:54:49 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/mac-rbenv-install-error/</guid>
				<description>&lt;p&gt;MacのLionで&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ rbenv install 1.9.3-p392&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;するとこんな感じのエラーが出てきてビルドできなかった。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;BUILD&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;FAILED&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Inspect&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;or&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;clean&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;up&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;the&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;working&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tree&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;at&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;var&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;folders&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;7&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;k&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;6&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;qhgc57n3nj7qbd_h2xpd1cm0000gn&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;T&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ruby&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;build&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;20130720093657.99813&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Results&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;logged&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;to&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;var&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;folders&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;7&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;k&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;6&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;qhgc57n3nj7qbd_h2xpd1cm0000gn&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;T&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ruby&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;build&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;20130720093657.99813&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;log&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Last&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;log&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;lines&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;ossl_x509store&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;In&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;‘&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ossl_x509stctx_set_flags&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;’&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;ossl_x509store&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;520&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;warning&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;‘&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;X509_STORE_CTX_set_flags&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;’&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;deprecated&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;declared&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;at&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;usr&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;include&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;openssl&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x509_vfy&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;h&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;464&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;ossl_x509store&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;In&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;‘&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ossl_x509stctx_set_purpose&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;’&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;ossl_x509store&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;532&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;warning&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;‘&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;X509_STORE_CTX_set_purpose&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;’&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;deprecated&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;declared&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;at&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;usr&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;include&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;openssl&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x509_vfy&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;h&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;460&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;ossl_x509store&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;In&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;‘&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ossl_x509stctx_set_trust&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;’&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;ossl_x509store&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;544&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;warning&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;‘&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;X509_STORE_CTX_set_trust&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;’&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;deprecated&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;declared&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;at&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;usr&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;include&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;openssl&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x509_vfy&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;h&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;461&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;ossl_x509store&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;In&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;‘&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ossl_x509stctx_set_time&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;’&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;ossl_x509store&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;561&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;warning&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;‘&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;X509_STORE_CTX_set_time&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;’&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;deprecated&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;declared&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;at&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;usr&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;include&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;openssl&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x509_vfy&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;h&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;466&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;linking&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;shared&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;object&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;openssl&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bundle&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;make&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;***&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;build&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ext&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Error&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;いろいろ調べた結果、brew で readline と openssl をインストールして、そのインストール先のディレクトリをrbenvに渡してやればいいらしい。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;brew&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;install&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;readline&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;openssl&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;CONFIGURE_OPTS&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;--with-openssl-dir=`brew --prefix openssl` --with-readline-dir=`brew --prefix readline`&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;rbenv&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;install&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;1.9&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p392&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4048687158/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/51TODrMIEnL._SL160_.jpg&#34; alt=&#34;メタプログラミングRuby&#34; loading=&#34;lazy&#34; title=&#34;メタプログラミングRuby&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4048687158/kazzhomeunixo-22/&#34;&gt;メタプログラミングRuby&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: Paolo Perrotta,角征典&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: アスキー・メディアワークス&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2010/08/28&lt;/li&gt;&#xA;&lt;li&gt;メディア: 大型本&lt;/li&gt;&#xA;&lt;li&gt;購入: 18人 クリック: 533回&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4048687158/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (113件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>Jenkinsで依存するプロジェクトのビルドパラメータを引き継ぎたい</title>
				<link>https://journal.lampetty.net/posts/jenkins-parameterized-build-trigger-plugin/</link>
				<pubDate>Sat, 13 Jul 2013 14:03:08 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/jenkins-parameterized-build-trigger-plugin/</guid>
				<description>&lt;p&gt;結論から言うと「&lt;a href=&#34;https://wiki.jenkins-ci.org/display/JENKINS/Parameterized+Trigger+Plugin&#34;&gt;Parameterized Trigger Plugin&lt;/a&gt;使え」&lt;/p&gt;&#xA;&lt;p&gt;Jenkinsには「ビルドのパラメータ化」という便利な機能がある。例えば任意の文字列を渡すことができるので、ビルドするGitリポジトリのブランチ名を指定したりする。この機能はとても便利なんだけど、プロジェクトBがプロジェクトAに依存していて、Aと同じブランチ名をビルドしたい時にどうすればいいのかわからなかった。(JavaでWebアプリ開発する時はたいてい hoge-core というDB回りのクラスを集めたものと hoge-web っていうWebアプリケーション回りのプロジェクトにわけたりするので)&lt;/p&gt;&#xA;&lt;p&gt;でで、調べたら&lt;a href=&#34;https://wiki.jenkins-ci.org/display/JENKINS/Parameterized+Trigger+Plugin&#34;&gt;Parameterized Trigger Plugin&lt;/a&gt;というそのものズバリなプラグインがあった。&lt;/p&gt;&#xA;&lt;p&gt;使い方は、依存しているプロジェクトA側の設定で&lt;/p&gt;&#xA;&lt;p&gt;後処理→Trigger call builds on the projects→Current build parameters&lt;/p&gt;&#xA;&lt;p&gt;を設定すればOK。(下記)&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/oinume/9272037115/&#34; title=&#34;jenkins-parameterized-build-trigger-plugin by oinume, on Flickr&#34;&gt;&lt;img src=&#34;http://farm3.staticflickr.com/2893/9272037115_2bcf07ed14.jpg&#34; alt=&#34;jenkins-parameterized-build-trigger-plugin&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4774148911/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/51bR%2Bvw-EvL._SL160_.jpg&#34; alt=&#34;Jenkins実践入門　?ビルド・テスト・デプロイを自動化する技術 (WEB&amp;#43;DB PRESS plus)&#34; loading=&#34;lazy&#34; title=&#34;Jenkins実践入門　?ビルド・テスト・デプロイを自動化する技術 (WEB&amp;#43;DB PRESS plus)&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4774148911/kazzhomeunixo-22/&#34;&gt;Jenkins実践入門　?ビルド・テスト・デプロイを自動化する技術 (WEB+DB PRESS plus)&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: 佐藤聖規,和田貴久,河村雅人,米沢弘樹,山岸啓,川口耕介&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: 技術評論社&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2011/11/11&lt;/li&gt;&#xA;&lt;li&gt;メディア: 単行本（ソフトカバー）&lt;/li&gt;&#xA;&lt;li&gt;購入: 26人 クリック: 496回&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4774148911/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (62件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>Markdownをアメブロ向けのHTMLに変換するヤツ作った</title>
				<link>https://journal.lampetty.net/posts/md2ameblo/</link>
				<pubDate>Sat, 06 Jul 2013 01:41:55 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/md2ameblo/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;http://ameblo.jp/principia-ca/&#34;&gt;会社のエンジニアブログ&lt;/a&gt;を書いていて、あまりにもアメブロのエディタがしんどかったので&lt;a href=&#34;https://github.com/oinume/md2ameblo&#34;&gt;カッとなって作ってしまった&lt;/a&gt;。これでエンジニアブログ書くのが捗ると思う。heroku上のサンプルは&lt;a href=&#34;http://md2ameblo.herokuapp.com/&#34;&gt;ここ&lt;/a&gt;。&lt;/p&gt;&#xA;&lt;h2 id=&#34;使った技術&#34;&gt;使った技術&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Python 2.7&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://misaka.61924.nl/&#34;&gt;misaka&lt;/a&gt; - MarkdownをHTMLに変換するライブラリ&lt;/li&gt;&#xA;&lt;li&gt;heroku&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;herokuはGitリポジトリにpushするだけでディプロイ出来て便利だなーと思った。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/477415539X/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/51qCCa-gPLL._SL160_.jpg&#34; alt=&#34;パーフェクトPython (PERFECT SERIES 5)&#34; loading=&#34;lazy&#34; title=&#34;パーフェクトPython (PERFECT SERIES 5)&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/477415539X/kazzhomeunixo-22/&#34;&gt;パーフェクトPython (PERFECT SERIES 5)&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: Pythonサポーターズ&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: 技術評論社&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2013/03/05&lt;/li&gt;&#xA;&lt;li&gt;メディア: 大型本&lt;/li&gt;&#xA;&lt;li&gt;購入: 1人 クリック: 65回&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/477415539X/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (8件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>MacでOracle JDKをインストールする</title>
				<link>https://journal.lampetty.net/posts/install-oracle-jdk-on-mac/</link>
				<pubDate>Sun, 23 Jun 2013 16:57:27 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/install-oracle-jdk-on-mac/</guid>
				<description>&lt;p&gt;最近MacにJDKをインストールすることが多いんだけど(脆弱性がよく見つかる)、インストールされるディレクトリがどこだか覚えられらなくなってきたのメモ。&lt;/p&gt;&#xA;&lt;h2 id=&#34;インストール&#34;&gt;インストール&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.oracle.com/technetwork/java/javase/downloads/index.html&#34;&gt;Oracle&lt;/a&gt; からMac版の jdk-7uXX-macosx-x64.dmg のファイルを選んでダウンロードする。んで、ダウンロードしてきたdmgファイルからインストーラーの指示に従いインストールする。&lt;/p&gt;&#xA;&lt;h2 id=&#34;インストールされる場所&#34;&gt;インストールされる場所&lt;/h2&gt;&#xA;&lt;p&gt;/Library/Java/JavaVirtualMachines/jdk1.7.0_XX.jdk/ にインストールされる。EclipseやIntelliJ IDEAのJVMを指定する場合は、 /Library/Java/JavaVirtualMachines/jdk1.7.0_XX.jdk/Contents/Home というディレクトリを指定すればよい。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;http://cdn-ak.f.st-hatena.com/images/fotolife/o/oinume/20130623/20130623165835.png&#34; alt=&#34;f:id:oinume:20130623165835p:plain&#34; loading=&#34;lazy&#34; title=&#34;f:id:oinume:20130623165835p:plain&#34;&gt;&#xA;&lt;/p&gt;&#xA;&lt;h2 id=&#34;個人的にやってること&#34;&gt;個人的にやってること&lt;/h2&gt;&#xA;&lt;p&gt;自分は最新版のJDKが出るたびに入れ替えているんだけど、コマンドラインからも最新のJVMを使えるように&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ln -s /Library/Java/JavaVirtualMachines/jdk1.7.0_XX.jdk/Contents/Home /usr/local/java&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;しておいて、~/.bashrc などで&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;d&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;usr&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;local&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;java&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;];&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;then&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JAVA_HOME&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;usr&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;local&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;java&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=$&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JAVA_HOME&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;PATH&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;fi&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;というようにPATHをセットしている。これでsymlinkさえ張り替えれば最新のJVMを使えるようにしている。&lt;/p&gt;&#xA;&lt;h2 id=&#34;余談&#34;&gt;余談&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-521261.html&#34;&gt;古いJDKのダウンロード&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4798122386/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/51tyawA6PIL._SL160_.jpg&#34; alt=&#34;Java逆引きレシピ&#34; loading=&#34;lazy&#34; title=&#34;Java逆引きレシピ&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4798122386/kazzhomeunixo-22/&#34;&gt;Java逆引きレシピ&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: 竹添直樹,高橋和也,織田翔,島本多可子&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: 翔泳社&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2014/04/22&lt;/li&gt;&#xA;&lt;li&gt;メディア: 単行本（ソフトカバー）&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4798122386/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (1件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>JRebelを使ってJava開発時のサーバの再起動をなくす</title>
				<link>https://journal.lampetty.net/posts/stop-restarting-with-jrebel/</link>
				<pubDate>Sat, 08 Jun 2013 14:43:46 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/stop-restarting-with-jrebel/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;http://zeroturnaround.com/software/jrebel/&#34;&gt;JRebel&lt;/a&gt;というソフトウェアを使うと、JavaでWebアプリケーションを開発する時に、ソースの修正→サーバ再起動 or 再ディプロイ がいらなくなるよーという話。&lt;/p&gt;&#xA;&lt;h2 id=&#34;ライセンス&#34;&gt;ライセンス&lt;/h2&gt;&#xA;&lt;p&gt;商用で使う場合はちゃんとライセンスを購入する必要があるけど、Socialという謎ライセンスだとフリーで使えるみたい。(ちゃんと理解してない)&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;myJRebel Social is a FREE version of myJRebel that is meant for anyone working on non-commercial projects, who is tired of building and redeploying Java code.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h2 id=&#34;インストール&#34;&gt;インストール&lt;/h2&gt;&#xA;&lt;p&gt;Eclipseを使っていれば Help -&amp;gt; Eclipse Market Place をクリックして jrebel と検索するとプラグインがインストールできるのでインストールして終わり。再起動すると設定画面が出るので、&lt;a href=&#34;https://my.jrebel.com/&#34;&gt;myJRebel&lt;/a&gt;のサイトに登録して、指示通りにSocialのPlanを選択してAtivateするとライセンスコードが表示されるので、それをEclipseの画面でコピペすればOK。&lt;/p&gt;&#xA;&lt;h2 id=&#34;今回試した時の環境&#34;&gt;今回試した時の環境&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Mac OS X Lion&lt;/li&gt;&#xA;&lt;li&gt;Java 1.7.0_21&lt;/li&gt;&#xA;&lt;li&gt;Eclipse 4.2.2 (Juno)&lt;/li&gt;&#xA;&lt;li&gt;Maven 3.0.4 (Eclipse内蔵のもの)&lt;/li&gt;&#xA;&lt;li&gt;Jetty 8.1.9&lt;/li&gt;&#xA;&lt;li&gt;JRebel 5.3&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;使ってみる&#34;&gt;使ってみる&lt;/h2&gt;&#xA;&lt;p&gt;自分はサーバの起動にはMavenのjetty:runを使っているので、その起動の設定画面で下記のようにJRebelタブをクリックして&amp;quot;Enable JRebel Agent&amp;quot;をクリックすればOK。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;http://cdn-ak.f.st-hatena.com/images/fotolife/o/oinume/20130608/20130608131554.png&#34; alt=&#34;f:id:oinume:20130608131554p:plain&#34; loading=&#34;lazy&#34; title=&#34;f:id:oinume:20130608131554p:plain&#34;&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;あとはEclipseで Project -&amp;gt; Build Automatically にチェックが入っているかを確認。これが入っていないとソースを更新してもコンパイルされないのであまり恩恵が受けられない。&lt;/p&gt;&#xA;&lt;p&gt;この状態でサーバを起動するとConsoleに下記のように表示される。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2013-06-08 12:54:14 JRebel: #############################################################&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2013-06-08 12:54:14 JRebel: &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2013-06-08 12:54:14 JRebel:  JRebel 5.3.0 (201305281348)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2013-06-08 12:54:14 JRebel:  (c) Copyright ZeroTurnaround OU, Estonia, Tartu.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2013-06-08 12:54:14 JRebel: &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2013-06-08 12:54:14 JRebel:  Over the last 1 days JRebel prevented &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2013-06-08 12:54:14 JRebel:  at least 1 redeploys/restarts saving you about 0 hours.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2013-06-08 12:54:14 JRebel: &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2013-06-08 12:54:14 JRebel:  This product is licensed to Kazuhiro Oinuma&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2013-06-08 12:54:14 JRebel: &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2013-06-08 12:54:14 JRebel:  License acquired through myJRebel server.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2013-06-08 12:54:14 JRebel: &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2013-06-08 12:54:14 JRebel:  You are subscribed for the plan &amp;#34;JRebel Social Plan&amp;#34;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2013-06-08 12:54:14 JRebel:  subscription is for lifetime.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2013-06-08 12:54:14 JRebel:  next license check with the server is required by 2013-06-09.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;あとは実際にControllerなどのソースコードをいじってみて修正が反映されているかを確認してみよう。自分はこんな感じのコードで model.addAttribute(&amp;quot;message&amp;quot;, &amp;quot;hello world&amp;quot;); の部分を修正して試してみた。&lt;/p&gt;&#xA;&lt;p&gt;IndexController&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;go&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;package&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;net&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;lampetty&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;samples&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;spring&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;mvc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;controller&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;org&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;springframework&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;stereotype&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Controller&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;org&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;springframework&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ui&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Model&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;org&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;springframework&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;web&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;bind&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;annotation&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;RequestMapping&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;@&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Controller&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;IndexController&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;@&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;RequestMapping&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;index&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Model&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;model&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;model&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;addAttribute&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;message&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;hello world&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;/index&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;index.ftl&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt;html&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt;head&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt;title&amp;gt;index&amp;lt;/title&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt;/head&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt;body&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;${message!&amp;#34;Default message&amp;#34;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt;/body&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;ecipse-37-indigoを使っている場合&#34;&gt;Ecipse 3.7 Indigoを使っている場合&lt;/h2&gt;&#xA;&lt;p&gt;どうもEclipse 3.7だとJRebelのプラグインの最新のバージョンがインストール出来ないせいかうまく動かなかったので、Standalone版をインストールしたところうまく動いた。&lt;/p&gt;&#xA;&lt;p&gt;JRebelのサイトからダウンロードして ~/jrebel に解凍。んで ~/jrebel/bin/jrebel-config.jar をダブルクリックするとライセンスを入力する画面が出てくるのでアクティベートしておく。あとはEclipseから jetty:run でサーバを起動するときのJVMのオプションに ~/jrebel/jrebel.jar のフルパスを書いておくことでちゃんと使えるようになる。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-javaagent:/Users/kazuhiro/jrebel.jar -Xms256m -Xmx512m -XX:MaxPermSize=256m&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;詳しいことは&lt;a href=&#34;http://manuals.zeroturnaround.com/jrebel/standalone/launch-from-command-line.html&#34;&gt;公式ドキュメント&lt;/a&gt;を見てもらえればと。&lt;/p&gt;&#xA;&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;&#xA;&lt;p&gt;JRebel でディプロイする時間を節約してビーチにでも行こうぜ！&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4798123366/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/51-4VzXz2RL._SL160_.jpg&#34; alt=&#34;現場で使えるJavaライブラリ&#34; loading=&#34;lazy&#34; title=&#34;現場で使えるJavaライブラリ&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4798123366/kazzhomeunixo-22/&#34;&gt;現場で使えるJavaライブラリ&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: 竹添直樹,島本多可子,小津美夕紀,亀井隆司&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: 翔泳社&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2011/07/16&lt;/li&gt;&#xA;&lt;li&gt;メディア: 大型本&lt;/li&gt;&#xA;&lt;li&gt;購入: 6人 クリック: 217回&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4798123366/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (21件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>はてなブログに移転</title>
				<link>https://journal.lampetty.net/posts/moved-to-hatenablog/</link>
				<pubDate>Sat, 08 Jun 2013 02:44:21 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/moved-to-hatenablog/</guid>
				<description>&lt;p&gt;Markdownでブログを書きたくなったのでWordPressから移転してみた。過去のエントリは面倒なので移行しない。今のところ以下の点がはてなブログのいいところだなーと思っている。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Markdownで書ける&lt;/li&gt;&#xA;&lt;li&gt;記事ごとにURLが設定できる&lt;/li&gt;&#xA;&lt;li&gt;Google Analyticsでアクセス解析できる&lt;/li&gt;&#xA;&lt;li&gt;日本語だけではなく英語にも対応してる&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;しばらくこっちで頑張ってみよう。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>はてなブログに移転</title>
				<link>https://journal.lampetty.net/posts/moved-to-hatena-blog-20130607/</link>
				<pubDate>Fri, 07 Jun 2013 17:06:31 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/moved-to-hatena-blog-20130607/</guid>
				<description>&lt;p&gt;移転しました。&lt;a href=&#34;http://oinume.hatenablog.com/&#34;&gt;http://oinume.hatenablog.com/&lt;/a&gt;&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Jettyでシンボリックリンクを有効にする</title>
				<link>https://journal.lampetty.net/posts/enable-jetty-symlink/</link>
				<pubDate>Fri, 07 Jun 2013 16:27:24 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/enable-jetty-symlink/</guid>
				<description>&lt;p&gt;最近Jettyと戯れている。Tomcatに比べてちょっと扱いづらいところが可愛らしい。&lt;/p&gt;&#xA;&lt;p&gt;Jettyはセキュリティ的な理由でAlias(Symbolic Link)をデフォルトでは無効にしている。でもsymlink使いたいんですよあたしゃ。というわけで、調べた結果web.xmlに下記を追加するのが一番楽そうなのでこれを設定したらいけた。&lt;/p&gt;&#xA;&lt;p&gt;web.xml&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;servlet&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;servlet&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;jetty&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;servlet&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;servlet&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;org&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;eclipse&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;jetty&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;servlet&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;DefaultServlet&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;servlet&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;init&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;param&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;param&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;aliases&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;param&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;param&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;bp&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;param&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;o&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;init&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;param&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;load&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;on&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;startup&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;load&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;on&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;startup&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;servlet&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
			</item>
			<item>
				<title>SpringMVC &#43; Bean Validation &#43; FreeMarkerでFormのバリデーション</title>
				<link>https://journal.lampetty.net/posts/wp/548/</link>
				<pubDate>Fri, 07 Jun 2013 03:06:46 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/548/</guid>
				<description>&lt;p&gt;最近Javaの面倒臭さに耐性ができてきて何も感じなくなってきた oinume です。こんにちは。今日はSpringMVC + JSR-303 Bean Validation + FreeMarkerでいわゆるフォームのバリデーション＋エラーメッセージ表示を試してみたので、そのまとめをば。サンプルコードは&lt;a href=&#34;https://github.com/oinume/lampetty-samples&#34;&gt;GitHub&lt;/a&gt;にあげてある。&lt;/p&gt;&#xA;&lt;h3 id=&#34;使ったソフトウェアのバージョン&#34;&gt;使ったソフトウェアのバージョン&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Spring MVC 3.2.3&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;FreeMarker 2.3.19&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Hibernate Validator 4.3.1.Final&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Hibernate Validatorは5.0.1.Finalというのが最新なんだけど、これを使うとWebアプリ起動時にNoClassDefFoundErrorで怒られてしまったので1世代古いやつを使ってる。&lt;/p&gt;&#xA;&lt;p&gt;Caused by: java.lang.NoClassDefFoundError: org/hibernate/validator/method/MethodConstraintViolationException&lt;/p&gt;&#xA;&lt;p&gt;at org.springframework.validation.beanvalidation.MethodValidationPostProcessor.afterPropertiesSet(MethodValidationPostProcessor.java:102)&lt;/p&gt;&#xA;&lt;p&gt;at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1541)&lt;/p&gt;&#xA;&lt;p&gt;at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1479)&lt;/p&gt;&#xA;&lt;p&gt;... 58 more&lt;/p&gt;&#xA;&lt;p&gt;Caused by: java.lang.ClassNotFoundException: org.hibernate.validator.method.MethodConstraintViolationException&lt;/p&gt;&#xA;&lt;p&gt;at org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy.loadClass(SelfFirstStrategy.java:50)&lt;/p&gt;&#xA;&lt;p&gt;at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:244)&lt;/p&gt;&#xA;&lt;p&gt;at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:230)&lt;/p&gt;&#xA;&lt;p&gt;at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:430)&lt;/p&gt;&#xA;&lt;p&gt;at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:383)&lt;/p&gt;&#xA;&lt;p&gt;... 61 more&lt;/p&gt;&#xA;&lt;h3 id=&#34;ディレクトリ構成&#34;&gt;ディレクトリ構成&lt;/h3&gt;&#xA;&lt;p&gt;src&lt;/p&gt;&#xA;&lt;p&gt;├── main&lt;/p&gt;&#xA;&lt;p&gt;│   ├── java&lt;/p&gt;&#xA;&lt;p&gt;│   │   └── net&lt;/p&gt;&#xA;&lt;p&gt;│   │   └── lampetty&lt;/p&gt;&#xA;&lt;p&gt;│   │   └── samples&lt;/p&gt;&#xA;&lt;p&gt;│   │   ├── spring&lt;/p&gt;&#xA;&lt;p&gt;│   │   │   └── mvc&lt;/p&gt;&#xA;&lt;p&gt;│   │   │   ├── controller&lt;/p&gt;&#xA;&lt;p&gt;│   │   │   │   ├── FormController.java&lt;/p&gt;&#xA;&lt;p&gt;│   │   │   └── form&lt;/p&gt;&#xA;&lt;p&gt;│   │   │   └── UserForm.java&lt;/p&gt;&#xA;&lt;p&gt;│   ├── resources&lt;/p&gt;&#xA;&lt;p&gt;│   │   ├── database.xml&lt;/p&gt;&#xA;&lt;p&gt;│   │   ├── freemarker.xml&lt;/p&gt;&#xA;&lt;p&gt;│   │   ├── logback.xml&lt;/p&gt;&#xA;&lt;p&gt;│   └── webapp&lt;/p&gt;&#xA;&lt;p&gt;│   ├── WEB-INF&lt;/p&gt;&#xA;&lt;p&gt;│   │   ├── spring-context.xml&lt;/p&gt;&#xA;&lt;p&gt;│   │   ├── view&lt;/p&gt;&#xA;&lt;p&gt;│   │   │   ├── common&lt;/p&gt;&#xA;&lt;p&gt;│   │   │   │   └── head-css.ftl&lt;/p&gt;&#xA;&lt;p&gt;│   │   │   ├── form&lt;/p&gt;&#xA;&lt;p&gt;│   │   │   │   ├── complete.ftl&lt;/p&gt;&#xA;&lt;p&gt;│   │   │   │   └── input.ftl&lt;/p&gt;&#xA;&lt;p&gt;│   │   │   ├── index.ftl&lt;/p&gt;&#xA;&lt;p&gt;│   │   │   └── spring.ftl&lt;/p&gt;&#xA;&lt;p&gt;│   │   ├── web.xml&lt;/p&gt;&#xA;&lt;p&gt;│   │   └── webapp-context.xml&lt;/p&gt;&#xA;&lt;p&gt;│   └── static&lt;/p&gt;&#xA;&lt;p&gt;│   └── bootstrap&lt;/p&gt;&#xA;&lt;h3 id=&#34;画面遷移&#34;&gt;画面遷移&lt;/h3&gt;&#xA;&lt;p&gt;画面遷移はこんな感じ。普通のWebアプリだとバリデーションがOKだったらデータベース更新したりするだしょう。処理が完了したら完了画面へHTTPリダイレクトする。なるべく説明をシンプルにするために、今回はCSRF対策は省いてる。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/8250493@N05/8968851213/&#34; title=&#34;jsr-303_validation&#34;&gt;&lt;img src=&#34;http://farm4.staticflickr.com/3817/8968851213_440758fd95.jpg&#34; alt=&#34;jsr-303_validation&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;application-contextxml的なヤツ&#34;&gt;application-context.xml的なヤツ&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/oinume/lampetty-samples/blob/master/src/main/webapp/WEB-INF/webapp-context.xml&#34;&gt;ここ&lt;/a&gt;を参照。Validation関連で必要なのは下記の2つ。&lt;/p&gt;&#xA;&lt;h3 id=&#34;formcontroller&#34;&gt;FormController&lt;/h3&gt;&#xA;&lt;p&gt;今回用意したControllerは下記のようなシンプルなもの。/form/process でバリデーションを行なっている。&lt;/p&gt;&#xA;&lt;p&gt;package net.lampetty.samples.spring.mvc.controller;&lt;/p&gt;&#xA;&lt;p&gt;import static org.springframework.web.bind.annotation.RequestMethod.*;&lt;/p&gt;&#xA;&lt;p&gt;import javax.validation.Valid;&lt;/p&gt;&#xA;&lt;p&gt;import net.lampetty.samples.spring.mvc.form.UserForm;&lt;/p&gt;&#xA;&lt;p&gt;import org.springframework.stereotype.Controller;&lt;/p&gt;&#xA;&lt;p&gt;import org.springframework.ui.Model;&lt;/p&gt;&#xA;&lt;p&gt;import org.springframework.validation.BindingResult;&lt;/p&gt;&#xA;&lt;p&gt;import org.springframework.web.bind.annotation.RequestMapping;&lt;/p&gt;&#xA;&lt;p&gt;/**&lt;/p&gt;&#xA;&lt;p&gt;* FormとValidationのサンプル&lt;/p&gt;&#xA;&lt;p&gt;*/&lt;/p&gt;&#xA;&lt;p&gt;@Controller&lt;/p&gt;&#xA;&lt;p&gt;public class FormController {&lt;/p&gt;&#xA;&lt;p&gt;// 入力画面&lt;/p&gt;&#xA;&lt;p&gt;@RequestMapping(value = &amp;quot;/form/input&amp;quot;, method = GET)&lt;/p&gt;&#xA;&lt;p&gt;public String index(Model model) {&lt;/p&gt;&#xA;&lt;p&gt;model.addAttribute(&amp;quot;userForm&amp;quot;, new UserForm());&lt;/p&gt;&#xA;&lt;p&gt;return &amp;quot;/form/input&amp;quot;;&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;p&gt;// バリデーションを行う&lt;/p&gt;&#xA;&lt;p&gt;@RequestMapping(value = &amp;quot;/form/process&amp;quot;, method = POST)&lt;/p&gt;&#xA;&lt;p&gt;public String process(&lt;/p&gt;&#xA;&lt;p&gt;Model model,&lt;/p&gt;&#xA;&lt;p&gt;@Valid UserForm userForm, // フォームで入力された値がセットされている&lt;/p&gt;&#xA;&lt;p&gt;BindingResult result) {&lt;/p&gt;&#xA;&lt;p&gt;if (result.hasErrors()) {&lt;/p&gt;&#xA;&lt;p&gt;// エラーがある場合は入力画面を表示する&lt;/p&gt;&#xA;&lt;p&gt;model.addAttribute(&amp;quot;userForm&amp;quot;, userForm);&lt;/p&gt;&#xA;&lt;p&gt;return &amp;quot;/form/input&amp;quot;;&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;p&gt;// データベースの更新とか&lt;/p&gt;&#xA;&lt;p&gt;// 終わったら完了画面へリダイレクト&lt;/p&gt;&#xA;&lt;p&gt;return &amp;quot;redirect:/form/complete&amp;quot;;&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;p&gt;// 完了画面&lt;/p&gt;&#xA;&lt;p&gt;@RequestMapping(value = &amp;quot;/form/complete&amp;quot;, method = GET)&lt;/p&gt;&#xA;&lt;p&gt;public String complete(Model model) {&lt;/p&gt;&#xA;&lt;p&gt;return &amp;quot;/form/complete&amp;quot;;&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;h3 id=&#34;userform&#34;&gt;UserForm&lt;/h3&gt;&#xA;&lt;p&gt;こんな感じのBeanを作る。プロパティに対してアノテーションをつけて、どんなバリデーションをかけるかを定義する。使えるアノテーションに関しては&lt;a href=&#34;http://news.mynavi.jp/articles/2010/04/09/spring5/index.html&#34;&gt;ここ&lt;/a&gt;などを参照。JSR-303で用意されているものだけだと使いづらい(@NotNullが空文字列チェックしてくれなかったり)ので、Hibernate Validatorのアノテーションも使わざるを得ないかなぁと思った。&lt;/p&gt;&#xA;&lt;p&gt;package net.lampetty.samples.spring.mvc.form;&lt;/p&gt;&#xA;&lt;p&gt;import javax.validation.constraints.Size;&lt;/p&gt;&#xA;&lt;p&gt;import org.hibernate.validator.constraints.Email;&lt;/p&gt;&#xA;&lt;p&gt;import org.hibernate.validator.constraints.NotEmpty;&lt;/p&gt;&#xA;&lt;p&gt;public class UserForm {&lt;/p&gt;&#xA;&lt;p&gt;@NotEmpty&lt;/p&gt;&#xA;&lt;p&gt;@Size(max = 10)&lt;/p&gt;&#xA;&lt;p&gt;private String name;&lt;/p&gt;&#xA;&lt;p&gt;@NotEmpty&lt;/p&gt;&#xA;&lt;p&gt;@Size(max = 255)&lt;/p&gt;&#xA;&lt;p&gt;@Email&lt;/p&gt;&#xA;&lt;p&gt;private String email;&lt;/p&gt;&#xA;&lt;p&gt;public String getName() {&lt;/p&gt;&#xA;&lt;p&gt;return name;&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;p&gt;public void setName(String name) {&lt;/p&gt;&#xA;&lt;p&gt;this.name = name;&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;p&gt;public String getEmail() {&lt;/p&gt;&#xA;&lt;p&gt;return email;&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;p&gt;public void setEmail(String email) {&lt;/p&gt;&#xA;&lt;p&gt;this.email = email;&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;h3 id=&#34;入力画面&#34;&gt;入力画面&lt;/h3&gt;&#xA;&lt;p&gt;入力画面。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/oinume/lampetty-samples/blob/master/src/main/webapp/WEB-INF/view/form/input.ftl&#34;&gt;input.ftl&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&amp;lt;#import &amp;quot;/spring.ftl&amp;quot; as spring /&amp;gt;&lt;/p&gt;&#xA;&lt;p&gt;&amp;lt;#escape __x as __x?html&amp;gt;&lt;/p&gt;&#xA;&lt;p&gt;フォーム&lt;/p&gt;&#xA;&lt;p&gt;&amp;lt;#include &amp;quot;/common/head-css.ftl&amp;quot; /&amp;gt;&lt;/p&gt;&#xA;&lt;p&gt;JSR-303 Bean Validation&lt;/p&gt;&#xA;&lt;p&gt;Name&lt;/p&gt;&#xA;&lt;p&gt;&amp;lt;@spring.formInput &#39;userForm.name&#39; &#39;id=&amp;quot;name&amp;quot; placeholder=&amp;quot;Name&amp;quot;&#39; /&amp;gt;&lt;/p&gt;&#xA;&lt;p&gt;&amp;lt;#if spring.status.error&amp;gt;&lt;/p&gt;&#xA;&lt;p&gt;&amp;lt;@spring.showErrors &amp;quot;&lt;br&gt;&#xA;&amp;quot;, &amp;quot;color:red&amp;quot; /&amp;gt;&lt;/p&gt;&#xA;&lt;p&gt;Email&lt;/p&gt;&#xA;&lt;p&gt;&amp;lt;@spring.formInput &#39;userForm.email&#39; &#39;id=&amp;quot;email&amp;quot; placeholder=&amp;quot;Email&amp;quot;&#39; /&amp;gt;&lt;/p&gt;&#xA;&lt;p&gt;&amp;lt;#if spring.status.error&amp;gt;&lt;/p&gt;&#xA;&lt;p&gt;&amp;lt;@spring.showErrors &amp;quot;&lt;br&gt;&#xA;&amp;quot;, &amp;quot;color:red&amp;quot; /&amp;gt;&lt;/p&gt;&#xA;&lt;p&gt;送信&lt;/p&gt;&#xA;&lt;p&gt;@spring.formInput のマクロを使うことでフォームのタグを生成できる。詳細は&lt;a href=&#34;http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/view.html#views-form-macros&#34;&gt;SpringMVCのドキュメント&lt;/a&gt;を参照。&lt;/p&gt;&#xA;&lt;p&gt;spring.status.error はバリデーションエラーの時にtrueになる変数で、&amp;lt;@spring.showErrors &amp;quot;&lt;br&gt;&amp;quot;, &amp;quot;color:red&amp;quot; /&amp;gt; というマクロで、エラーがあった場合にエラーメッセージを表示させる。バリデーションエラーが複数ある場合もあるので、複数のエラーメッセージがここに表示される。1つ目の引数はエラーメッセージを区切る文字列。&lt;br&gt;タグなので改行で区切っている。2つ目の引数はエラーメッセージにつける span タグのCSSスタイル。&amp;quot;:&amp;quot;があると&lt;span style=&#34;...&#34;&gt;となり、&amp;quot;:&amp;quot;がない場合は&lt;span class=&#34;...&#34;&gt; というクラス指定になるみたい。&lt;/p&gt;&#xA;&lt;p&gt;↓は実際にバリデーションエラーが起きた時の入力画面のキャプチャ。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/8250493@N05/8974825106/&#34; title=&#34;jsr-303-validation-error&#34;&gt;&lt;img src=&#34;http://farm8.staticflickr.com/7340/8974825106_2fbc2a61e2.jpg&#34; alt=&#34;jsr-303-validation-error&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;フォーム完了画面&#34;&gt;フォーム完了画面&lt;/h3&gt;&#xA;&lt;p&gt;これはただの完了画面なので説明不要。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/oinume/lampetty-samples/blob/master/src/main/webapp/WEB-INF/view/form/complete.ftl&#34;&gt;complete.ftl&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;エラーメッセージを変えたい&#34;&gt;エラーメッセージを変えたい&lt;/h3&gt;&#xA;&lt;p&gt;デフォルトだとHibernate Validator付属の英語のメッセージが表示されるので、ValidationMessages_ja.propertiesという名前のプロパティファイルを用意してクラスパスの通ったところに置いておけばいいらしい。&lt;a href=&#34;http://news.mynavi.jp/articles/2010/04/09/spring5/index.html&#34;&gt;参考&lt;/a&gt;。&lt;/p&gt;&#xA;&lt;h3 id=&#34;軽く使ってみた感想や疑問など&#34;&gt;軽く使ってみた感想や疑問など&lt;/h3&gt;&#xA;&lt;p&gt;いくつか使いづらいところや疑問があった。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;@Sizeのエラーメッセージが &amp;quot;size must be between 0 and 10&amp;quot; となっていて不自然なので、@MaxSizeや@MinSizeとかあった方がいいんじゃないか&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;FTLの中で「バリデーションエラーが起こっているか」を判定する方法がよくわからなかった。(@springのマクロにはそれっぽいものはなかった)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;FTLの中で「フォームの全ての入力項目のエラーをまとめて表示させたい」んだけど、どうやるのがいいのかわからない。ControllerでModelに全エラーメッセージをつっこんだListをセットすればいいのかなぁ&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;でも、全体的に見るといい仕組みとしてはだと思う。ちょっと使いづらいところは自分で拡張もできるっぽいので。というわけで仕事でもこれを使っていこうと思う。&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]4798123366[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Pythonでローカル変数の値をprintfデバッグしたい</title>
				<link>https://journal.lampetty.net/posts/wp/547/</link>
				<pubDate>Wed, 05 Jun 2013 14:06:54 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/547/</guid>
				<description>&lt;p&gt;a = 1&lt;/p&gt;&#xA;&lt;p&gt;b = 2&lt;/p&gt;&#xA;&lt;p&gt;print(&amp;quot;locals = &amp;quot; + str(locals()))&lt;/p&gt;&#xA;&lt;p&gt;こんな風に書くとローカル変数の値が簡単にデバッグできるかなーと思った。&lt;/p&gt;&#xA;&lt;p&gt;locals = {&#39;a&#39;: 1, &#39;b&#39;: 2, &#39;__builtins__&#39;: &amp;lt;module &#39;__builtin__&#39; (built-in)&amp;gt;, &#39;__file__&#39;: &#39;/Users/oinuma_kazuhiro/Dropbox/code/python/locals.py&#39;, &#39;__package__&#39;: None, &#39;__name__&#39;: &#39;__main__&#39;, &#39;__doc__&#39;: None}&lt;/p&gt;&#xA;&lt;p&gt;ただ、余計なものまで表示されてしまうので、特定の変数だけprintしたい場合は下記のようにする。&lt;/p&gt;&#xA;&lt;p&gt;a = 1&lt;/p&gt;&#xA;&lt;p&gt;b = 2&lt;/p&gt;&#xA;&lt;p&gt;print(&amp;quot;a = {a}, b = {b}&amp;quot;.format(**locals()))&lt;/p&gt;&#xA;&lt;p&gt;a = 1, b = 2&lt;/p&gt;&#xA;&lt;p&gt;なんかもっといいやり方ありそう。&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]477415539X[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Jettyでシンボリックリンクを有効にする</title>
				<link>https://journal.lampetty.net/posts/wp/545/</link>
				<pubDate>Fri, 31 May 2013 14:05:11 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/545/</guid>
				<description>&lt;p&gt;最近Jettyと戯れている。Tomcatに比べてちょっと扱いづらいところが可愛らしい。&lt;/p&gt;&#xA;&lt;p&gt;Jettyはセキュリティ的な理由でAlias(Symbolic Link)をデフォルトでは無効にしている。でもsymlink使いたいんですよあたしゃ。&lt;/p&gt;&#xA;&lt;p&gt;というわけで、調べた結果web.xmlに下記を追加するのが一番楽そうなのでこれを設定したらいけた。&lt;/p&gt;&#xA;&lt;p&gt;jetty&lt;/p&gt;&#xA;&lt;p&gt;org.eclipse.jetty.servlet.DefaultServlet&lt;/p&gt;&#xA;&lt;p&gt;aliases&lt;/p&gt;&#xA;&lt;p&gt;true&lt;/p&gt;&#xA;&lt;p&gt;0&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]4798125415[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Sphinxでソフトウェアのドキュメントを書いた時によく使う記法</title>
				<link>https://journal.lampetty.net/posts/wp/521/</link>
				<pubDate>Sun, 21 Apr 2013 13:04:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/521/</guid>
				<description>&lt;p&gt;最近Sphinxでよくドキュメントを書くのでメモ。やっぱりある程度巨大なソフトウェアのドキュメントを書く時はWikiじゃなくてSphinxの方が良い気がする。&lt;/p&gt;&#xA;&lt;h3 id=&#34;リンク&#34;&gt;リンク&lt;/h3&gt;&#xA;&lt;p&gt;他のファイルのセクションにリンクを貼るときには&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;そのセクションの前で .. _label: のようにラベル定義&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;:ref:`label`でリンクを張る&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;という感じ。ラベルの名前はドキュメント全体でユニークにする必要がある。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://sphinx-users.jp/reverse-dict/writing/refer.html&#34;&gt;参考&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;ソースコードのinclude&#34;&gt;ソースコードのinclude&lt;/h3&gt;&#xA;&lt;p&gt;literalincludeを使う。外部のソースファイルをincludeする時に使った。&lt;/p&gt;&#xA;&lt;p&gt;.. literalinclude:: ../../src/main/java/net/lampetty/commons/MarkingStopwatch.java&lt;/p&gt;&#xA;&lt;p&gt;:language: java&lt;/p&gt;&#xA;&lt;p&gt;:linenos:&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://sphinx-users.jp/reverse-dict/writing/include.html&#34;&gt;参考&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;テーブル&#34;&gt;テーブル&lt;/h3&gt;&#xA;&lt;p&gt;通常のテーブルの書き方は非常に面倒なので csv-table 使った。&lt;/p&gt;&#xA;&lt;p&gt;.. csv-table::&lt;/p&gt;&#xA;&lt;p&gt;:header: オプション, エイリアス, 必須, 意味&lt;/p&gt;&#xA;&lt;p&gt;:widths: 30, 15, 8, 80&lt;/p&gt;&#xA;&lt;p&gt;--url, -r, ◯, DBの接続先URL&lt;/p&gt;&#xA;&lt;p&gt;--user, -u, ◯, DBの接続ユーザ&lt;/p&gt;&#xA;&lt;p&gt;--password, -p, ☓, DBの接続パスワード&lt;/p&gt;&#xA;&lt;p&gt;みたいな感じ。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://sphinx-users.jp/gettingstarted/directives.html&#34;&gt;参考&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;ハイフンx2を正しく出力する&#34;&gt;ハイフンx2を正しく出力する&lt;/h3&gt;&#xA;&lt;p&gt;Sphinxでは文中に --option みたいに書くと&amp;quot;ー&amp;quot;(全角のハイフン)に置換されてしまう。コマンドラインオプションを表す時に--をよく使うのでどうしようかと思ったら、``--option`` のようにインラインリテラル化すれば大丈夫であった。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://sphinx-users.jp/articles/expertpython/restructuredtext.html&#34;&gt;参考&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]4774156167[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>tomahawk 0.6.0 リリース</title>
				<link>https://journal.lampetty.net/posts/wp/535/</link>
				<pubDate>Sat, 20 Apr 2013 17:04:48 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/535/</guid>
				<description>&lt;p&gt;[permalink id=531]前回のエントリ[/permalink]からちょいと時間が経ったけど、&lt;a href=&#34;https://pypi.python.org/pypi/tomahawk&#34;&gt;tomahawk 0.6.0をリリース&lt;/a&gt;！&lt;/p&gt;&#xA;&lt;p&gt;新機能は前回のエントリの通りなんだけど、設定ファイルについては $HOME/.tomahawk.conf の場所に固定ではなく、 -C/--conf オプションで指定できるようにした。これで柔軟に設定ファイルを変えて tomahawk の挙動を変えることができるっす。&lt;/p&gt;&#xA;&lt;p&gt;次のバージョンでは、やっと重い腰を上げてPython3に対応しようかと思ってる。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>tomahawk 0.6.0-rc1リリース</title>
				<link>https://journal.lampetty.net/posts/wp/531/</link>
				<pubDate>Sat, 06 Apr 2013 14:04:34 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/531/</guid>
				<description>&lt;p&gt;すごい久々に&lt;a href=&#34;https://github.com/oinume/tomahawk&#34;&gt;tomahawk&lt;/a&gt;を更新した。(&lt;a href=&#34;https://github.com/oinume/tomahawk/tree/0.6.0-rc1&#34;&gt;0.6.0-rc1&lt;/a&gt;)&lt;/p&gt;&#xA;&lt;h3 id=&#34;インストール&#34;&gt;インストール&lt;/h3&gt;&#xA;&lt;p&gt;まだ正式リリース版ではなくpypiには上げていないため、GitHubから直接インストールする感じで。&lt;/p&gt;&#xA;&lt;p&gt;$ pip install &lt;a href=&#34;https://github.com/oinume/tomahawk/zipball/0.6.0-rc1&#34;&gt;https://github.com/oinume/tomahawk/zipball/0.6.0-rc1&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;新機能&#34;&gt;新機能&lt;/h3&gt;&#xA;&lt;h4 id=&#34;-v--verify-output&#34;&gt;-V/--verify-output&lt;/h4&gt;&#xA;&lt;p&gt;リモートホストで実行したコマンドの出力が全てのホストで同じかどうかを検証するオプション。「なんか1台だけ設定が違くね？」みたいなのが簡単に検証できる。&lt;/p&gt;&#xA;&lt;p&gt;例えば以下は host1 と host2 の ulimit -a の結果が同一であるかを検証する。&lt;/p&gt;&#xA;&lt;p&gt;$ tomahawk -V -h host1,host2 &#39;ulimit -a&#39;&lt;/p&gt;&#xA;&lt;p&gt;host1とhost2のnginx.confが同一であることを検証したいのであれば、cat するか md5sum すればいい。&lt;/p&gt;&#xA;&lt;p&gt;$ tomahawk -V -h host1,host2 &#39;cat /etc/nginx/nginx.conf&#39;&lt;/p&gt;&#xA;&lt;p&gt;$ tomahawk -V -h host1,host2 &#39;md5sum /etc/nginx/nginx.conf&#39;&lt;/p&gt;&#xA;&lt;h4 id=&#34;設定ファイル&#34;&gt;設定ファイル&lt;/h4&gt;&#xA;&lt;p&gt;下記のような $HOME/.tomahawk.conf を用意しておくと、いちいちコマンドラインオプションで指定する手間が省けますよっていう機能。&lt;/p&gt;&#xA;&lt;p&gt;[tomahawk]&lt;/p&gt;&#xA;&lt;p&gt;options = --parallel 4&lt;/p&gt;&#xA;&lt;p&gt;[tomahawk-rsync]&lt;/p&gt;&#xA;&lt;p&gt;options = --parallel 4&lt;/p&gt;&#xA;&lt;p&gt;上の例だと、tomahawkやtomahawk-rsyncを実行する時に常に --parallel 4 のオプションをつけて実行する。&lt;/p&gt;&#xA;&lt;h4 id=&#34;--output-formatオプションの短縮形-f&#34;&gt;--output-formatオプションの短縮形-F&lt;/h4&gt;&#xA;&lt;p&gt;-Fで--output-formatが指定できるようになりましたよっと。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>JRuby &#43; DBI &#43; JDBC &#43; MySQL JDBC DriverでMySQLに接続する</title>
				<link>https://journal.lampetty.net/posts/wp/529/</link>
				<pubDate>Thu, 04 Apr 2013 10:04:46 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/529/</guid>
				<description>&lt;p&gt;まず、DBIなどのライブラリをインストールする。&lt;/p&gt;&#xA;&lt;p&gt;$ jruby -S gem install dbi dbd-jdbc jdbc-mysql&lt;/p&gt;&#xA;&lt;p&gt;こんなスクリプト書いてみる。&lt;/p&gt;&#xA;&lt;p&gt;require &#39;dbi&#39;&lt;/p&gt;&#xA;&lt;p&gt;require &#39;dbd/Jdbc&#39;&lt;/p&gt;&#xA;&lt;p&gt;require &#39;jdbc/mysql&#39;&lt;/p&gt;&#xA;&lt;p&gt;Jdbc::MySQL.load_driver&lt;/p&gt;&#xA;&lt;p&gt;DBI.connect(&lt;/p&gt;&#xA;&lt;p&gt;&#39;DBI:Jdbc:mysql://localhost/test&#39;,&lt;/p&gt;&#xA;&lt;p&gt;&#39;root&#39;, &#39;test&#39;,&lt;/p&gt;&#xA;&lt;p&gt;&#39;driver&#39; =&amp;gt; &#39;com.mysql.jdbc.Driver&#39;&lt;/p&gt;&#xA;&lt;p&gt;) do |dbh|&lt;/p&gt;&#xA;&lt;p&gt;puts &amp;quot;Connected&amp;quot;&lt;/p&gt;&#xA;&lt;p&gt;end&lt;/p&gt;&#xA;&lt;p&gt;5行目の &amp;quot;Jdbc::MySQL.load_driver&amp;quot; がないと怒られるので注意。&lt;/p&gt;&#xA;&lt;p&gt;$ jruby connect.rb&lt;/p&gt;&#xA;&lt;p&gt;DBI::DatabaseError: java.lang.ClassNotFoundException: com.mysql.jdbc.Driver&lt;/p&gt;&#xA;&lt;p&gt;connect at /usr/local/jruby-1.7.3/lib/ruby/gems/shared/gems/dbd-jdbc-0.1.6-java/lib/dbd/jdbc/driver.rb:66&lt;/p&gt;&#xA;&lt;p&gt;connect at /usr/local/jruby-1.7.3/lib/ruby/gems/shared/gems/dbi-0.4.5/lib/dbi/handles/driver.rb:33&lt;/p&gt;&#xA;&lt;p&gt;connect at /usr/local/jruby-1.7.3/lib/ruby/gems/shared/gems/dbi-0.4.5/lib/dbi.rb:148&lt;/p&gt;&#xA;&lt;p&gt;(root) at /Users/oinume/Dropbox/code/ruby/connect.rb:6&lt;/p&gt;&#xA;&lt;p&gt;うまくいった場合。&lt;/p&gt;&#xA;&lt;p&gt;$ jruby connect.rb&lt;/p&gt;&#xA;&lt;p&gt;Connected&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]4798121444[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>GitHubをMavenリポジトリにしよう</title>
				<link>https://journal.lampetty.net/posts/wp/527/</link>
				<pubDate>Wed, 03 Apr 2013 04:04:16 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/527/</guid>
				<description>&lt;p&gt;Javaには&lt;a href=&#34;http://maven.apache.org/&#34;&gt;Maven&lt;/a&gt;っていう依存ライブラリの管理を行えるすごい便利なツールがあるんだ。RubyでいうところのRubyGems みたいなもんだよ。でもさぁ、RubyGems みたいに自分で作ったライブラリを簡単にアップロードするサーバがないんだよ。えっ、&lt;a href=&#34;http://www.sonatype.org/nexus/&#34;&gt;Nexus&lt;/a&gt;入れろって？そんなのイチイチ用意してらんないよね。えっ、WebDAV？ムリムリー。本当Javaってなんでもかんでも面倒くさいよね。&lt;/p&gt;&#xA;&lt;p&gt;そんなあなたに朗報。GitHubリポジトリに特別なブランチを作ってMavenの設定をするだけで、GitHubリポジトリをMavenリポジトリにすることができるんだ。GitHubって本当に開発者に優しいサービスだよねー(-д☆)ｷﾗｯ&lt;/p&gt;&#xA;&lt;p&gt;※4/3追記：&lt;a href=&#34;http://samuraism.jp/diary/2012/05/03/1336047480000.html&#34;&gt;【最新版】Maven Central Repository へのライブラリ登録方法 #maven&lt;/a&gt;に詳しくまとまっているんだけど、Maven Centralリポジトリにartifactを反映するのもそんなに大変ではないので、たぶんこっちの方がいい方法。&lt;/p&gt;&#xA;&lt;h3 id=&#34;流れ&#34;&gt;流れ&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;pom.xmlにいくつか設定を加える&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;~/.m2/settings.xmlにGitHubのアカウント情報を記述&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;maven deployする&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;※このエントリで説明することは&lt;a href=&#34;http://stackoverflow.com/questions/14013644/hosting-a-maven-repository-on-github&#34;&gt;Hosting a Maven repository on github&lt;/a&gt;と同じ内容なので、英語が得意な人はStackOverflowを見るべし。&lt;/p&gt;&#xA;&lt;h3 id=&#34;pomxml修正その1&#34;&gt;pom.xml修正その1&lt;/h3&gt;&#xA;&lt;p&gt;対象のプロジェクト（モジュール）のpom.xmlに以下を追加する。&lt;/p&gt;&#xA;&lt;p&gt;internal.repo&lt;/p&gt;&#xA;&lt;p&gt;Temporary Staging Repository&lt;/p&gt;&#xA;&lt;p&gt;file://${project.build.directory}/mvn-repo&lt;/p&gt;&#xA;&lt;p&gt;試しに下記を実行して、deploy先の mvn-repo ディレクトリにjarが置かれるか確認する。&lt;/p&gt;&#xA;&lt;p&gt;$ mvn clean deploy&lt;/p&gt;&#xA;&lt;p&gt;$ ls -R target/mvn-repo/&lt;/p&gt;&#xA;&lt;p&gt;net/&lt;/p&gt;&#xA;&lt;p&gt;target/mvn-repo//net:&lt;/p&gt;&#xA;&lt;p&gt;lampetty/&lt;/p&gt;&#xA;&lt;p&gt;target/mvn-repo//net/lampetty:&lt;/p&gt;&#xA;&lt;p&gt;lampetty-commons/&lt;/p&gt;&#xA;&lt;p&gt;target/mvn-repo//net/lampetty/lampetty-commons:&lt;/p&gt;&#xA;&lt;p&gt;1.0.0/ maven-metadata.xml maven-metadata.xml.md5 maven-metadata.xml.sha1&lt;/p&gt;&#xA;&lt;p&gt;target/mvn-repo//net/lampetty/lampetty-commons/1.0.0:&lt;/p&gt;&#xA;&lt;p&gt;lampetty-commons-1.0.0-sources.jar&lt;/p&gt;&#xA;&lt;p&gt;lampetty-commons-1.0.0-sources.jar.md5&lt;/p&gt;&#xA;&lt;p&gt;lampetty-commons-1.0.0-sources.jar.sha1&lt;/p&gt;&#xA;&lt;p&gt;lampetty-commons-1.0.0.jar&lt;/p&gt;&#xA;&lt;p&gt;lampetty-commons-1.0.0.jar.md5&lt;/p&gt;&#xA;&lt;p&gt;lampetty-commons-1.0.0.jar.sha1&lt;/p&gt;&#xA;&lt;p&gt;...&lt;/p&gt;&#xA;&lt;h3 id=&#34;m2settingsxmlにgithubのアカウント情報を記述&#34;&gt;~/.m2/settings.xmlにGitHubのアカウント情報を記述&lt;/h3&gt;&#xA;&lt;p&gt;次に、下記の内容で ~/.m2/settings.xmlファイルを作成する。なお、このファイルのパーミッションは他のユーザから見えないように 700 にしておくこと。&lt;/p&gt;&#xA;&lt;p&gt;github&lt;/p&gt;&#xA;&lt;p&gt;YOUR-USERNAME&lt;/p&gt;&#xA;&lt;p&gt;YOUR-PASSWORD&lt;/p&gt;&#xA;&lt;h3 id=&#34;pomxml修正その2&#34;&gt;pom.xml修正その2&lt;/h3&gt;&#xA;&lt;p&gt;pom.xmlの properties に下記を追記する。ここで指定する&amp;quot;github&amp;quot;というのは ~/.m2/settings.xml のserverのidと同じものにする。&lt;/p&gt;&#xA;&lt;p&gt;github&lt;/p&gt;&#xA;&lt;p&gt;さらにpom.xmlの build の部分に下記を追記する。&lt;/p&gt;&#xA;&lt;p&gt;com.github.github&lt;/p&gt;&#xA;&lt;p&gt;site-maven-plugin&lt;/p&gt;&#xA;&lt;p&gt;0.7&lt;/p&gt;&#xA;&lt;p&gt;Maven artifacts for ${project.version}&lt;/p&gt;&#xA;&lt;p&gt;true&lt;/p&gt;&#xA;&lt;p&gt;${project.build.directory}/mvn-repo&lt;/p&gt;&#xA;&lt;p&gt;refs/heads/mvn-repo&lt;/p&gt;&#xA;&lt;p&gt;**/*&lt;/p&gt;&#xA;&lt;p&gt;YOUR-REPOSITORY-NAME&lt;/p&gt;&#xA;&lt;p&gt;YOUR-GITHUB-USERNAME&lt;/p&gt;&#xA;&lt;p&gt;site&lt;/p&gt;&#xA;&lt;p&gt;deploy&lt;/p&gt;&#xA;&lt;p&gt;もう1回mvn deployする。&lt;/p&gt;&#xA;&lt;p&gt;$ mvn clean deploy&lt;/p&gt;&#xA;&lt;p&gt;成功すると下記のようなメッセージが表示されて、pom.xmlで指定されたGitHubリポジトリのブランチにartifactであるjarファイルがアップロードされているはず。&lt;/p&gt;&#xA;&lt;p&gt;...&lt;/p&gt;&#xA;&lt;p&gt;[INFO] Creating tree with 16 blob entries&lt;/p&gt;&#xA;&lt;p&gt;[INFO] Creating commit with SHA-1: 2ef011871b0ceb8e29321a2ac9f87648a22c1ff0&lt;/p&gt;&#xA;&lt;p&gt;[INFO] Creating reference refs/heads/mvn-repo starting at commit 2ef011871b0ceb8e29321a2ac9f87648a22c1ff0&lt;/p&gt;&#xA;&lt;p&gt;[INFO] ------------------------------------------------------------------------&lt;/p&gt;&#xA;&lt;p&gt;[INFO] BUILD SUCCESS&lt;/p&gt;&#xA;&lt;p&gt;[INFO] ------------------------------------------------------------------------&lt;/p&gt;&#xA;&lt;p&gt;[INFO] Total time: 18.064s&lt;/p&gt;&#xA;&lt;p&gt;[INFO] Finished at: Tue Apr 02 21:58:07 JST 2013&lt;/p&gt;&#xA;&lt;p&gt;[INFO] Final Memory: 22M/480M&lt;/p&gt;&#xA;&lt;p&gt;[INFO] ------------------------------------------------------------------------&lt;/p&gt;&#xA;&lt;p&gt;例えば自分のサンプルプロジェクトである lampetty-commons のmvn-repoブランチには&lt;a href=&#34;https://github.com/oinume/lampetty-commons/tree/mvn-repo/net/lampetty/lampetty-commons/1.0.0&#34;&gt;こんな風に&lt;/a&gt;jarがアップロードされている。&lt;/p&gt;&#xA;&lt;p&gt;ここにアップロードされているjarを使うには、通常のMavenリポジトリと同様に、使いたいプロジェクトのpom.xmlに下記のように記述すればいい。&lt;/p&gt;&#xA;&lt;p&gt;lampetty-commons-github&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://raw.github.com/oinume/lampetty-commons/mvn-repo/&#34;&gt;https://raw.github.com/oinume/lampetty-commons/mvn-repo/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;true&lt;/p&gt;&#xA;&lt;p&gt;always&lt;/p&gt;&#xA;&lt;h3 id=&#34;その他tips&#34;&gt;その他TIPS&lt;/h3&gt;&#xA;&lt;p&gt;なお、deploy先のGitHubのリポジトリやブランチは自由に選べるので、対象のプロジェクトのmvn-repoブランチ以外にもdeployが可能だ。複数のJavaプロジェクトを持っているのであれば、artifact(jar)をdeployする専用のGitHubリポジトリを作成し、そこに集約しても良いだろう。例えば自分は maven-repo-lampetty.net というdeploy専用のGitHubリポジトリを作っている。&lt;/p&gt;&#xA;&lt;p&gt;とにかくこれでいちいちNexusやらWebDAVサーバを用意する必要がなくなった。GitHub&amp;lt;ﾉ丶｀Д´&amp;gt;ﾉ ﾏﾝｾｰ&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]477415184X[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>JVMのオススメ起動オプション</title>
				<link>https://journal.lampetty.net/posts/wp/524/</link>
				<pubDate>Sat, 23 Mar 2013 04:03:28 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/524/</guid>
				<description>&lt;p&gt;なんか秘伝のタレみたいになってきたので後世のために共有。&lt;/p&gt;&#xA;&lt;h3 id=&#34;前提&#34;&gt;前提&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Webアプリケーションを想定&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;TomcatなりJettyなりがListenするポートは外部からはアクセスできない&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;※-Xms -Xmx -Xmn あたりは搭載しているメモリ容量によって変える、-XX:MaxPermSize -XX:PermSizeは384mあれば十分だと思うけどロードするクラスの数次第なので要調整。&lt;/p&gt;&#xA;&lt;p&gt;NOW=`date &amp;quot;+%Y%m%d-%H%M%S&amp;quot;`&lt;/p&gt;&#xA;&lt;p&gt;JAVA_OPTS=&amp;quot;-server -Xms2g -Xmx2g -Xmn1g -XX:MaxPermSize=384m -XX:PermSize=384m \&lt;/p&gt;&#xA;&lt;p&gt;-XX:SurvivorRatio=8 -XX:TargetSurvivorRatio=85 -XX:MaxTenuringThreshold=32 \&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4844336673/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/61JmGdCyKtL._SL160_.jpg&#34; alt=&#34;Javaプログラマーなら習得しておきたい Java SE 8 実践プログラミング&#34; loading=&#34;lazy&#34; title=&#34;Javaプログラマーなら習得しておきたい Java SE 8 実践プログラミング&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4844336673/kazzhomeunixo-22/&#34;&gt;Javaプログラマーなら習得しておきたい Java SE 8 実践プログラミング&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: Cay S. Horstmann,柴田芳樹&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: インプレス&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2014/09/22&lt;/li&gt;&#xA;&lt;li&gt;メディア: 単行本（ソフトカバー）&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4844336673/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (6件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;-XX:+PrintClassHistogram -XX:+HeapDumpOnOutOfMemoryError -XX:+UseConcMarkSweepGC \&lt;/p&gt;&#xA;&lt;p&gt;-XX:+CMSParallelRemarkEnabled -XX:+UseParNewGC \&lt;/p&gt;&#xA;&lt;p&gt;-verbose:gc -Xloggc:/usr/local/tomcat/logs/gc.log.$NOW \&lt;/p&gt;&#xA;&lt;p&gt;-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps \&lt;/p&gt;&#xA;&lt;p&gt;-Dcom.sun.management.jmxremote \&lt;/p&gt;&#xA;&lt;p&gt;-Dcom.sun.management.jmxremote.port=5400 \&lt;/p&gt;&#xA;&lt;p&gt;-Dcom.sun.management.jmxremote.authenticate=false \&lt;/p&gt;&#xA;&lt;p&gt;-Dcom.sun.management.jmxremote.ssl=false&amp;quot;&lt;/p&gt;&#xA;&lt;h3 id=&#34;読んでおくべきページ&#34;&gt;読んでおくべきページ&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/learn/20090218/p1&#34;&gt;Javaメモリ、GCチューニングとそれにまつわるトラブル対応手順まとめ - 日記のような何か&lt;/a&gt; - 各種オプションの意味が網羅的に書いてある。すごい。&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.hitachi.co.jp/Prod/comp/soft1/manual/cosmi/v0870/APSE/EU030141.HTM&#34;&gt;JavaVMで使用するメモリ空間の構成とJavaVMオプション&lt;/a&gt; - JVMのGCやメモリ空間についてわかりやすく説明されてる。Eden領域とかSurvivor領域ってなに？っていうのがわかる。&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://wall-climb.com/2009/10/12/%E3%82%B3%E3%83%B3%E3%82%AB%E3%83%AC%E3%83%B3%E3%83%88gc%E3%81%AE%E6%B3%A8%E6%84%8F%E7%82%B9/&#34;&gt;コンカレントGCの注意点&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;追記gcログのローテーション&#34;&gt;追記：GCログのローテーション&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://twitter.com/n0ts&#34;&gt;@n0ts&lt;/a&gt;さんから&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;@&lt;a href=&#34;https://twitter.com/oinume&#34;&gt;oinume&lt;/a&gt; 素適な情報ありがとうございます！この設定だと、毎日ログが自動的にローテションされますかね？試した感じだと、tomcatが起動した日付のファイルにしか出力されないよう気がするんですが。&lt;/p&gt;&#xA;&lt;p&gt;— Naoya Nakazawaさん (@n0ts) &lt;a href=&#34;https://twitter.com/n0ts/status/315337826898153473&#34;&gt;2013年3月23日&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;と言われて最初はローテーションできないと思っていたんだけど、最近のJVMだと下記オプションでGCのログがローテートできるらしい。&lt;/p&gt;&#xA;&lt;p&gt;-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=10M&lt;/p&gt;&#xA;&lt;p&gt;↑はローテーション数を10、1ファイルあたり10MBにする設定。Java 1.6.0_34、1.7.0_02以上から利用できるオプションらしい。ちなみにUbuntu 12.04のOpenJDK 1.7.0_15でもこのオプションは使えた。&lt;/p&gt;&#xA;&lt;p&gt;上記を加えた秘伝のタレJVMオプションは下記になる。&lt;/p&gt;&#xA;&lt;p&gt;JAVA_OPTS=&amp;quot;-server -Xms2g -Xmx2g -Xmn1g -XX:MaxPermSize=384m -XX:PermSize=384m \&#xA;-XX:SurvivorRatio=8 -XX:TargetSurvivorRatio=85 -XX:MaxTenuringThreshold=32 \&#xA;-XX:+PrintClassHistogram -XX:+HeapDumpOnOutOfMemoryError -XX:+UseConcMarkSweepGC \&#xA;-XX:+CMSParallelRemarkEnabled -XX:+UseParNewGC \&#xA;-verbose:gc -Xloggc:/usr/local/tomcat/logs/gc.log \&#xA;-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=10M \&#xA;-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps \&#xA;-Dcom.sun.management.jmxremote \&#xA;-Dcom.sun.management.jmxremote.port=5400 \&#xA;-Dcom.sun.management.jmxremote.authenticate=false \&#xA;-Dcom.sun.management.jmxremote.ssl=false&amp;quot;&lt;/p&gt;&#xA;&lt;h3 id=&#34;結論&#34;&gt;結論&lt;/h3&gt;&#xA;&lt;p&gt;JVMはマイナーバージョンアップでもオプションが増えたりするので油断できない。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4844336673/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/61JmGdCyKtL._SL160_.jpg&#34; alt=&#34;Javaプログラマーなら習得しておきたい Java SE 8 実践プログラミング&#34; loading=&#34;lazy&#34; title=&#34;Javaプログラマーなら習得しておきたい Java SE 8 実践プログラミング&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4844336673/kazzhomeunixo-22/&#34;&gt;Javaプログラマーなら習得しておきたい Java SE 8 実践プログラミング&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: Cay S. Horstmann,柴田芳樹&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: インプレス&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2014/09/22&lt;/li&gt;&#xA;&lt;li&gt;メディア: 単行本（ソフトカバー）&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4844336673/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (6件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>Springのabstractを使ってbean定義をDRYにしよう</title>
				<link>https://journal.lampetty.net/posts/wp/523/</link>
				<pubDate>Sun, 17 Mar 2013 01:03:47 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/523/</guid>
				<description>&lt;p&gt;JavaのDIコンテナって言ったらSpringだよね。ということでSpringのTIPS。bean定義する時にabstractとparent属性を使うとbean定義の共通化が出来てDRYになりますよってことです。&lt;/p&gt;&#xA;&lt;p&gt;例えば以下のように&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;(1)の部分でabstract=&amp;quot;true&amp;quot;にして共通のBasicDataSourceを定義&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;(2)でparent=&amp;quot;&amp;quot;を指定して、urlプロパティだけオーバーライドする&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;ことができる。&lt;/p&gt;&#xA;&lt;p&gt;xmlns=&amp;quot;&lt;a href=&#34;http://www.springframework.org/schema/beans&#34;&gt;http://www.springframework.org/schema/beans&lt;/a&gt;&amp;quot;&lt;/p&gt;&#xA;&lt;p&gt;xmlns:xsi=&amp;quot;&lt;a href=&#34;http://www.w3.org/2001/XMLSchema-instance&#34;&gt;http://www.w3.org/2001/XMLSchema-instance&lt;/a&gt;&amp;quot;&lt;/p&gt;&#xA;&lt;p&gt;xsi:schemaLocation=&amp;quot;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.springframework.org/schema/beans&#34;&gt;http://www.springframework.org/schema/beans&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.springframework.org/schema/beans/spring-beans-3.1.xsd&#34;&gt;http://www.springframework.org/schema/beans/spring-beans-3.1.xsd&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&amp;quot;&amp;gt;&lt;/p&gt;&#xA;&lt;p&gt;abstract=&amp;quot;true&amp;quot;&lt;/p&gt;&#xA;&lt;p&gt;class=&amp;quot;org.apache.commons.dbcp.BasicDataSource&amp;quot;&lt;/p&gt;&#xA;&lt;p&gt;destroy-method=&amp;quot;close&amp;quot;&amp;gt;&lt;/p&gt;&#xA;&lt;p&gt;何がうれしいかというと、上記のようなデータベースの接続情報で&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;全環境で共通の部分だけabstract=&amp;quot;true&amp;quot;にして切り出す&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;import&gt; と併用して1.の部分をimportし、development/staging/productionみたいな環境ごとに差異があるところだけ個別に設定する&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;みたいなことができるので、これでSpringの設定ファイルのDRY化が進むかと。&lt;/p&gt;&#xA;&lt;p&gt;以上、バッドノウハウでした。&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]477415380X[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>MySQLでデータベースをコピーする</title>
				<link>https://journal.lampetty.net/posts/wp/520/</link>
				<pubDate>Thu, 21 Feb 2013 12:02:19 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/520/</guid>
				<description>&lt;p&gt;mysql -u -p -e &#39;create database destination&#39;&lt;/p&gt;&#xA;&lt;p&gt;mysqldump -u -p source | mysql -uabc -pxyz destination&lt;/p&gt;&#xA;&lt;p&gt;mysql -u -p -e &#39;drop database source&#39;&lt;/p&gt;&#xA;&lt;p&gt;良い子は source と destination 逆にしたりしないようにね。&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]4774142948[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>JVMのGCのログを-XX:&#43;PrintGCDateStampsでhuman readableにする</title>
				<link>https://journal.lampetty.net/posts/wp/515/</link>
				<pubDate>Sun, 20 Jan 2013 23:01:09 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/515/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;https://journal.lampetty.net/blog_en/index.php/archives/9&#34;&gt;English version&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;JVMでGCのログ出すじゃないですか。んで、その時↓みたいに -XX:+PrintGCTimeStamps っていうオプションを指定するじゃないですか。&lt;/p&gt;&#xA;&lt;p&gt;TODAY=`date &amp;quot;+%Y%m%d-%H%M%S&amp;quot;`&lt;/p&gt;&#xA;&lt;p&gt;JAVA_OPTS=&amp;quot;-server -Xms512m -Xmx512m -Xmn256m -XX:PermSize=256m -XX:MaxPermSize=256m \&lt;/p&gt;&#xA;&lt;p&gt;-XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseParNewGC \&lt;/p&gt;&#xA;&lt;p&gt;-XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=32 -XX:TargetSurvivorRatio=85 \&lt;/p&gt;&#xA;&lt;p&gt;-verbose:gc -Xloggc:/usr/local/tomcat/logs/gc.log.$TODAY \&lt;/p&gt;&#xA;&lt;p&gt;-XX:+PrintGCDetails \&lt;/p&gt;&#xA;&lt;p&gt;-XX:+PrintGCTimeStamps \&lt;/p&gt;&#xA;&lt;p&gt;-DJENKINS_HOME=/var/lib/jenkins \&lt;/p&gt;&#xA;&lt;p&gt;&amp;quot;&lt;/p&gt;&#xA;&lt;p&gt;でもこれ、悲しいかな、JVM起動時の時間からの相対時間なんすよね... いやJVM起動した時間なんか調べるの面倒だし、いちいち相対時間から計算するの面倒だし、っていうあなたに &lt;strong&gt;-XX:+PrintGCDateStamps&lt;/strong&gt; をオススメします。これを指定するとGCのログが&lt;strong&gt;絶対時間で&lt;/strong&gt;出力される。(PrintGCDateStampsはJava6 u4から利用可能)&lt;/p&gt;&#xA;&lt;h3 id=&#34;びふぉー-xxprintgctimestamps&#34;&gt;びふぉー(-XX:+PrintGCTimeStamps)&lt;/h3&gt;&#xA;&lt;p&gt;63.156: [CMS-concurrent-mark-start]&lt;/p&gt;&#xA;&lt;p&gt;64.175: [CMS-concurrent-mark: 0.844/1.019 secs] [Times: user=2.59 sys=0.21, real=1.02 secs]&lt;/p&gt;&#xA;&lt;p&gt;64.176: [CMS-concurrent-preclean-start]&lt;/p&gt;&#xA;&lt;p&gt;64.197: [CMS-concurrent-preclean: 0.019/0.021 secs] [Times: user=0.05 sys=0.01, real=0.03 secs]&lt;/p&gt;&#xA;&lt;p&gt;64.197: [CMS-concurrent-abortable-preclean-start]&lt;/p&gt;&#xA;&lt;p&gt;CMS: abort preclean due to time 69.246: [CMS-concurrent-abortable-preclean: 4.756/5.049 secs] [Times: user=12.37 sys=0.75, real=5.04 secs]&lt;/p&gt;&#xA;&lt;p&gt;69.248: [GC[YG occupancy: 235103 K (235968 K)]69.248: [Rescan (parallel) , 0.2130820 secs]69.461: [weak refs processing, 0.0017410 secs] [1 CMS-remark: 138712K(262144K)] 373816K(498112K), 0.2149850 secs] [Times: user=0.61 sys=0.00, real=0.21 secs]&lt;/p&gt;&#xA;&lt;p&gt;69.466: [CMS-concurrent-sweep-start]&lt;/p&gt;&#xA;&lt;p&gt;69.468: [GC 69.468: [ParNew: 235968K-&amp;gt;26176K(235968K), 0.0955880 secs] 374601K-&amp;gt;174167K(498112K), 0.0957410 secs]&lt;/p&gt;&#xA;&lt;h3 id=&#34;あふたー-xxprintgcdatestamps&#34;&gt;あふたー(-XX:+PrintGCDateStamps)&lt;/h3&gt;&#xA;&lt;p&gt;2013-01-20T13:20:43.395+0900: 0.847: [Full GC (System) 0.847: [CMS: 0K-&amp;gt;1757K(262144K), 0.0502300 secs] 16808K-&amp;gt;1757K(498112K), [CMS Perm : 10054K-&amp;gt;10045K(262144K)], 0.0503520 secs] [Times: user=0.09 sys=0.00, real=0.05 secs]&lt;/p&gt;&#xA;&lt;p&gt;2013-01-20T13:20:47.952+0900: 5.404: [GC 5.404: [ParNew: 209792K-&amp;gt;1976K(235968K), 0.0304360 secs] 211549K-&amp;gt;3733K(498112K), 0.0305290 secs] [Times: user=0.05 sys=0.00, real=0.03 secs]&lt;/p&gt;&#xA;&lt;p&gt;2013-01-20T13:20:53.692+0900: 11.144: [GC 11.144: [ParNew: 211768K-&amp;gt;3713K(235968K), 0.0192760 secs] 213525K-&amp;gt;5470K(498112K), 0.0193720 secs] [Times: user=0.04 sys=0.00, real=0.02 secs]&lt;/p&gt;&#xA;&lt;p&gt;2013-01-20T13:21:02.932+0900: 20.383: [GC 20.383: [ParNew: 213505K-&amp;gt;21672K(235968K), 0.0812540 secs] 215262K-&amp;gt;23429K(498112K), 0.0813650 secs] [Times: user=0.13 sys=0.03, real=0.08 secs]&lt;/p&gt;&#xA;&lt;p&gt;2013-01-20T13:21:07.448+0900: 24.899: [GC 24.900: [ParNew: 231464K-&amp;gt;26176K(235968K), 0.1677760 secs] 233221K-&amp;gt;38711K(498112K), 0.1678730 secs] [Times: user=0.32 sys=0.05, real=0.17 secs]&lt;/p&gt;&#xA;&lt;p&gt;2013-01-20T13:21:12.021+0900: 29.473: [GC 29.473: [ParNew: 235968K-&amp;gt;26176K(235968K), 0.2173720 secs] 248503K-&amp;gt;57677K(498112K), 0.2175440 secs] [Times: user=0.62 sys=0.00, real=0.22 secs]&lt;/p&gt;&#xA;&lt;p&gt;2013-01-20T13:21:16.168+0900: 33.620: [GC 33.620: [ParNew: 235968K-&amp;gt;26176K(235968K), 0.0859270 secs] 267469K-&amp;gt;59042K(498112K), 0.0860640 secs]&lt;/p&gt;&#xA;&lt;p&gt;これで人間が読めるGCのログになりましたね。&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]4873113881[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Munin 2.0のmysqlプラグインで&#34;Couldn&#39;t instantiate IPC::ShareLite: Permission denied&#34;とエラーになったらSELinuxをdisabledにしよう</title>
				<link>https://journal.lampetty.net/posts/wp/513/</link>
				<pubDate>Mon, 14 Jan 2013 15:01:10 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/513/</guid>
				<description>&lt;p&gt;タイトル通りなのだけど、ググっても全く出て来なかったので。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;CentOS 6.3&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Munin 2.0.9&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;が環境。/usr/share/munin/plugins/mysql_ を使ってグラフを表示させたかったのだけど、munin-nodeに対して&lt;/p&gt;&#xA;&lt;p&gt;telnet localhost 4949&lt;/p&gt;&#xA;&lt;p&gt;&amp;gt; fetch mysql_innodb_io&lt;/p&gt;&#xA;&lt;p&gt;ってやってもエラーになっていて、/var/log/munin-node/munin-node.logには&lt;/p&gt;&#xA;&lt;p&gt;Couldn&#39;t instantiate IPC::ShareLite: Permission denied at /usr/share/perl5/Cache/SharedMemoryBackend.pm line 85.&lt;/p&gt;&#xA;&lt;p&gt;っていうエラーが出てた。他のグラフはちゃんとデータが取れて描画されるのになんでなんで？って1時間近くはまった。Cache::SharedMemoryBackendでは特にファイルをopenしているわけではなかったので、もしかしたらと思ってSELinuxの設定(/etc/selinux/config)を見てみたら見事にenforcingだった...&lt;/p&gt;&#xA;&lt;p&gt;というわけでenforcing→disabledに変えてうまくいきましたとさ。それにしてもMunin 2.0系のmysqlのプラグインはグラフの種類が充実してるなぁ。InnoDB Buffer PoolやInnoDB IO(↓)の情報まで取れるんですね。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/8250493@N05/8380911616/&#34; title=&#34;mysql_innodb_io&#34;&gt;&lt;img src=&#34;http://farm9.staticflickr.com/8374/8380911616_56766ba2f3.jpg&#34; alt=&#34;mysql_innodb_io&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;※あまりにもプラグインがいっぱいあって /usr/share/munin/plugins/mysql_ から /etc/munin/plugins/ にシンボリックリンク張るのが大変だったので、スクリプト書いた。&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]4774150371[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>WordPressでjQueryの読み込みを速くする</title>
				<link>https://journal.lampetty.net/posts/wp/508/</link>
				<pubDate>Mon, 14 Jan 2013 05:01:28 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/508/</guid>
				<description>&lt;p&gt;タイトルは若干釣り。読み込みを速くするというか、キャッシュを使うというか。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://wordpress.org/extend/plugins/use-google-libraries/&#34; title=&#34;Use Google Libraries&#34;&gt;Use Google Libraries&lt;/a&gt;というプラグインをインストールして、&lt;a href=&#34;https://developers.google.com/speed/libraries/&#34;&gt;Google AJAX Libraries CDN&lt;/a&gt;を使いましょうという話。あなたのブログを閲覧している人がよく見る他のサイトでもGoogleからjQueryをロードするようになっていれば、効果はあるはず。&lt;/p&gt;&#xA;&lt;p&gt;インストールしてHTMLのソースの&lt;head&gt;タグ内に&lt;/p&gt;&#xA;&lt;p&gt;というのがあればOK。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Emacs &#43; ruby-lint &#43; flymakeでRubyのソースを静的チェック</title>
				<link>https://journal.lampetty.net/posts/wp/504/</link>
				<pubDate>Sat, 12 Jan 2013 13:01:53 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/504/</guid>
				<description>&lt;p&gt;以前[permalink id=499]ruby-lintでRubyのソースを静的チェック[/permalink]で紹介したように、ruby-lintを使えばRubyのソースを静的にチェックすることができるので、これを使ってRubyのソースを保存するときにflymakeするEmacsの設定を書いてみた。（前提として、ruby-lintをインストールしておく必要がある。&amp;quot;gem install ruby-lint&amp;quot;でOK）&lt;/p&gt;&#xA;&lt;p&gt;(defun flymake-ruby-init ()&lt;/p&gt;&#xA;&lt;p&gt;(let* &lt;a href=&#34;#f-0bf170b6&#34; title=&#34;temp-file (flymake-init-create-temp-buffer-copy&#xA;&#39;flymake-create-temp-inplace&#34;&gt;*1&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;(local-file (file-relative-name&lt;/p&gt;&#xA;&lt;p&gt;temp-file&lt;/p&gt;&#xA;&lt;p&gt;(file-name-directory buffer-file-name))))&lt;/p&gt;&#xA;&lt;p&gt;(list &amp;quot;ruby-lint&amp;quot; (list local-file))))&lt;/p&gt;&#xA;&lt;p&gt;(defconst flymake-allowed-ruby-file-name-masks&lt;/p&gt;&#xA;&lt;p&gt;&#39;&lt;a href=&#34;#f-43f25362&#34;&gt;*2&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;(ad-activate &#39;flymake-post-syntax-check)&lt;/p&gt;&#xA;&lt;p&gt;(setq flymake-allowed-file-name-masks&lt;/p&gt;&#xA;&lt;p&gt;(append flymake-allowed-file-name-masks flymake-allowed-ruby-file-name-masks))&lt;/p&gt;&#xA;&lt;p&gt;(setq flymake-err-line-patterns flymake-ruby-err-line-patterns)&lt;/p&gt;&#xA;&lt;p&gt;(flymake-mode t))&lt;/p&gt;&#xA;&lt;p&gt;;(add-hook &#39;ruby-mode-hook &#39;(lambda () (flymake-ruby-load)))&lt;/p&gt;&#xA;&lt;p&gt;(add-hook&lt;/p&gt;&#xA;&lt;p&gt;&#39;ruby-mode-hook&lt;/p&gt;&#xA;&lt;p&gt;&#39;(lambda ()&lt;/p&gt;&#xA;&lt;p&gt;;; rhtmlファイルではflymakeしない&lt;/p&gt;&#xA;&lt;p&gt;(if (not (null buffer-file-name)) (flymake-ruby-load))&lt;/p&gt;&#xA;&lt;p&gt;))&lt;/p&gt;&#xA;&lt;h3 id=&#34;動作イメージ&#34;&gt;動作イメージ&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/8250493@N05/8372715054/&#34; title=&#34;Emacsでruby-lint + flymakeでRubyのソースを静的チェック&#34;&gt;&lt;img src=&#34;http://farm9.staticflickr.com/8191/8372715054_4c29afa547.jpg&#34; alt=&#34;Emacsでruby-lint &amp;#43; flymakeでRubyのソースを静的チェック&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]4774150029[/tmkm-amazon]&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;#fn-0bf170b6&#34;&gt;*1&lt;/a&gt;:temp-file (flymake-init-create-temp-buffer-copy&lt;/p&gt;&#xA;&lt;p&gt;&#39;flymake-create-temp-inplace&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;#fn-43f25362&#34;&gt;*2&lt;/a&gt;:&amp;quot;\.rb$&amp;quot; flymake-ruby-init)&lt;/p&gt;&#xA;&lt;p&gt;(&amp;quot;^Rakefile$&amp;quot; flymake-ruby-init)))&lt;/p&gt;&#xA;&lt;p&gt;(defvar flymake-ruby-err-line-patterns&lt;/p&gt;&#xA;&lt;p&gt;&#39;((&amp;quot;^\(.*\): .+: line \([0-9]+\), .+: \(.*\)$&amp;quot; 1 2 nil 3)))&lt;/p&gt;&#xA;&lt;p&gt;; /tmp/a.rb: error: line 5, column 15: undefined local variable or method a&lt;/p&gt;&#xA;&lt;p&gt;(defun flymake-ruby-load ()&lt;/p&gt;&#xA;&lt;p&gt;(interactive)&lt;/p&gt;&#xA;&lt;p&gt;(defadvice flymake-post-syntax-check (before flymake-force-check-was-interrupted)&lt;/p&gt;&#xA;&lt;p&gt;(setq flymake-check-was-interrupted t&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>2012年を振り返って</title>
				<link>https://journal.lampetty.net/posts/wp/501/</link>
				<pubDate>Mon, 31 Dec 2012 14:12:32 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/501/</guid>
				<description>&lt;p&gt;もうすぐ2012年も終わりだなーと感慨深くなってきたので振り返りエントリをば。&lt;/p&gt;&#xA;&lt;p&gt;全体的にはやっぱり仕事が忙しくって、あまり何かを深く追求したりできなかったかなぁと思う。実は裏で勉強計画(MySQLのソース読むとかelisp書けるようになったる！とか)を立てていたんだけど、ほとんど何もできていないｗ&lt;/p&gt;&#xA;&lt;h3 id=&#34;1月4月python期&#34;&gt;1月〜4月(Python期)&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/oinume/tomahawk&#34;&gt;tomahawk&lt;/a&gt;直したり&lt;a href=&#34;https://github.com/oinume/btfly&#34;&gt;btfly&lt;/a&gt;っていうのを作ったり。おかげでPythonはリファレンスとか読まなくても書けるようになったし、一番バランスが取れている言語だと再認識して結構好きになった。ただし、Pythonを書けば書くほど会社のメイン言語がJavaなので悲しくなるという罠があったｗ&lt;/p&gt;&#xA;&lt;p&gt;Python関連だと下記のようなツールをけっこう使いこなせるようになったと思う。ただし半年使わないとこの辺のツールは確実に使い方を忘れてしまうｗ&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;tox - [permalink id=457]複数バージョンのPythonでテストしてくれるtoxが便利すぎる[/permalink]&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;py.test&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Sphinx&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;仕事では、ちょうどこの時ひとつ大きなトラブルがあってシステムのリプレースがあったんだけど、無事にうまくいって良かった。関係者のみなさんは本当お疲れさまでした、としかいいようがないプロジェクトだった。&lt;/p&gt;&#xA;&lt;h3 id=&#34;5月7月マネジメント期&#34;&gt;5月〜7月(マネジメント期)&lt;/h3&gt;&#xA;&lt;p&gt;ほとんどコードは書いてなかったんじゃないかと思う。どんどん大きくなる組織をどうしていくか、みたいなことばっかり考えていたように思う。自分一人ではもはや回らなくなってきていたので、色んな人にいろいろ手伝ってもらった。結果としてよりよい方向に行ったからよかったなぁと思う。あと、部署にエンジニアの新卒が7名も入ってきたので(!)、その育成どうしようか、などとメタ育成的なことを考えたりもしていた。&lt;/p&gt;&#xA;&lt;p&gt;この頃は「もはや自分エンジニアじゃないよね」って一番苦悩していた時期だったと思う。&lt;/p&gt;&#xA;&lt;h3 id=&#34;8月9月ruby期&#34;&gt;8月〜9月(Ruby期)&lt;/h3&gt;&#xA;&lt;p&gt;某サービスの混沌としたディプロイスクリプトをRubyで書き直す。RubyはPythonのデコレータみたいな仕組みがあったらもっと好きになっていたと思う。ウチの会社はJavaのサービスが多いので、JRuby使うっていうのはアリなんじゃないかと思ったりした。RubyのスクリプトをwarファイルにまとめてTomcatで動かせたりするし、実行性能はけっこうよさそうだし。&lt;/p&gt;&#xA;&lt;p&gt;プライベートではスペイン(バルセロナ)に行った。ヨーロッパは大学のロンドン以来だったので10年ぶりぐらい。バルセロナは食べ物もうまいし治安も悪くないしガウディはすごいしで、こんなにいろんなものがひとつの街に凝縮されているなんてずるいなって思うようなところだった。&lt;/p&gt;&#xA;&lt;p&gt;あとビールやワインがすごく安くてびっくりした。バドワイザーの350mlの缶が100円(90セント)ぐらいでスーパーで売ってるのと、飲み屋のグラスワインも250円ぐらいだった。これだけ安ければそりゃあみんな陽気になるよね！って。&lt;/p&gt;&#xA;&lt;h3 id=&#34;10月12月java期&#34;&gt;10月〜12月(Java期)&lt;/h3&gt;&#xA;&lt;p&gt;仕事ではワガママを聞いてもらってマネジメントをやめてかつ部署異動をし、ソーシャルゲームばっかり作る部署に異動した。2年半ずっと同じ部署でほぼ同じような仕事をしていたのと、大きいプロジェクトを途中で抜けることになってしまったのですごく後ろ髪引かれる感じで辛かったのだけど、新しいところでいい仕事をしてお返しをしようと思ってる。&lt;/p&gt;&#xA;&lt;p&gt;新しいプロジェクト(新規ゲーム立ち上げ)ではその部署で使っているフレームワークがいけてないので、JPAベースのORMapperを自作したりしている。今の会社に入ってこれ以上ないぐらいコードが書けているのでとても楽しいけど、今携わっているプロジェクトがビジネス的にうまくいくかどうかは全く別の問題なのでそこだけが気がかり。&lt;/p&gt;&#xA;&lt;p&gt;一方で、あまりシステム運用をやらなくなったので、tomahawkやbtflyのメンテが滞っているのをなんとかしないといけないなぁと。来年の2月ぐらいになればまた運用もちょいちょいやっていく予定なので、その時にガッツリいじりたい。&lt;/p&gt;&#xA;&lt;h3 id=&#34;まとめ&#34;&gt;まとめ&lt;/h3&gt;&#xA;&lt;p&gt;去年に比べて今年はほとんど勉強会の類に行かなかったので(たぶん技術的なことをやってなかったから)、今年はもっと勉強会に行ったり発表したりしたい。ただ、やっぱりJavaが好きになれないのでPythonとかNode.jsとかRubyで頑張れたらいいな。&lt;/p&gt;&#xA;&lt;p&gt;仕事は今のプロジェクトのリリースがあるので、それが終わったら自分の技術をもう少し深掘りしてもっとスマートに問題解決をできるようにしていきたいと思う。とにかくワーカホリック的な感じになってしまっているので、もう少し勉強に時間を費やそうと思う。数学とかアルゴリズムとかelispとか...&lt;/p&gt;&#xA;&lt;p&gt;というわけで、自分に関わりのあった皆さま今年もお世話になりました。来年も引き続きよろしくお願いします。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>ruby-lintでRubyのソースを静的チェック</title>
				<link>https://journal.lampetty.net/posts/wp/499/</link>
				<pubDate>Sat, 22 Dec 2012 17:12:44 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/499/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;https://journal.lampetty.net/blog_en/index.php/archives/4&#34;&gt;An English version of the post&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;自分の知る限り、RubyってPythonでいうpylintやpyflakesみたいなSyntaxh Checkerってなかったと思うんだけど、最近とある外人の人が作っている&lt;a href=&#34;https://github.com/YorickPeterse/ruby-lint&#34; title=&#34;ruby-lint&#34;&gt;ruby-lint&lt;/a&gt;というものを見つけたの軽く使ってみた。&lt;/p&gt;&#xA;&lt;h3 id=&#34;インストール&#34;&gt;インストール&lt;/h3&gt;&#xA;&lt;p&gt;ruby-1.9が必要。&lt;/p&gt;&#xA;&lt;p&gt;$ gem install ruby-lint&lt;/p&gt;&#xA;&lt;h3 id=&#34;ruby-lintを使ってみる&#34;&gt;ruby-lintを使ってみる&lt;/h3&gt;&#xA;&lt;p&gt;試しにこんな感じのソースをruby-lintにチェックさせてみる。&lt;/p&gt;&#xA;&lt;p&gt;#!/usr/bin/env ruby&lt;/p&gt;&#xA;&lt;p&gt;# -*- coding: utf-8 -*-&lt;/p&gt;&#xA;&lt;p&gt;a = &#39;hoge&#39;&lt;/p&gt;&#xA;&lt;p&gt;puts &amp;quot;hello&amp;quot; + b&lt;/p&gt;&#xA;&lt;p&gt;すると&lt;/p&gt;&#xA;&lt;p&gt;$ ruby-lint hoge.rb&lt;/p&gt;&#xA;&lt;p&gt;hoge.rb: error: line 4, column 15: undefined local variable or method b&lt;/p&gt;&#xA;&lt;p&gt;hoge.rb: warning: line 3, column 0: assigned but unused local variable a&lt;/p&gt;&#xA;&lt;p&gt;って言われる。変数 b が定義されてないエラーと、変数 a が使われてないよっていう警告を出してくれる。素晴らしい！！&lt;/p&gt;&#xA;&lt;p&gt;これでRubyでのコーディングが捗りそう！まだアルファクォリティらしいけど期待大！&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]4774151661[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>jboss-loggingとlogbackを組み合わせて使いたい</title>
				<link>https://journal.lampetty.net/posts/wp/496/</link>
				<pubDate>Wed, 19 Dec 2012 10:12:09 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/496/</guid>
				<description>&lt;p&gt;「jboss-loggingとlogbackを使いたい」時には&lt;/p&gt;&#xA;&lt;p&gt;-Dorg.jboss.logging.provider=slf4&lt;/p&gt;&#xA;&lt;p&gt;を指定するとslf4j + logbackを使ってくれる。詳細は&lt;a href=&#34;https://github.com/jboss-logging/jboss-logging/blob/master/src/main/java/org/jboss/logging/LoggerProviders.java&#34;&gt;LoggerProviders.java&lt;/a&gt;を参照。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>MySQLでbulk insertの途中でエラーになった場合の挙動</title>
				<link>https://journal.lampetty.net/posts/wp/495/</link>
				<pubDate>Mon, 17 Dec 2012 10:12:25 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/495/</guid>
				<description>&lt;p&gt;MySQLで&lt;/p&gt;&#xA;&lt;p&gt;insert into ... values (1, &#39;x&#39;), (2, &#39;y&#39;);&lt;/p&gt;&#xA;&lt;p&gt;のようにbulk insertした時に、途中でエラーになった場合にどういう挙動をするかを調べてみた。普通に考えれば「全てのレコードがinsertされてない」になるはずだと思ったんだけど一応。試したMySQLのバージョンは5.5.28。&lt;/p&gt;&#xA;&lt;p&gt;結果からいうと想定通りで、「途中でエラーが起こると全てのレコードがinsertされてない」になった。&lt;/p&gt;&#xA;&lt;p&gt;CREATE TABLE `t1` (&lt;/p&gt;&#xA;&lt;p&gt;`id` int(11) NOT NULL DEFAULT &#39;0&#39;,&lt;/p&gt;&#xA;&lt;p&gt;`value` varchar(255) NOT NULL DEFAULT &#39;&#39;,&lt;/p&gt;&#xA;&lt;p&gt;PRIMARY KEY (`id`)&lt;/p&gt;&#xA;&lt;p&gt;) ENGINE=InnoDB DEFAULT CHARSET=utf8&lt;/p&gt;&#xA;&lt;p&gt;mysql&amp;gt; insert into t1 (id, value) values (0, &#39;0&#39;), (0, &#39;1&#39;);&lt;/p&gt;&#xA;&lt;p&gt;ERROR 1062 (23000): Duplicate entry &#39;0&#39; for key &#39;PRIMARY&#39;&lt;/p&gt;&#xA;&lt;p&gt;mysql&amp;gt; select * from t1;&lt;/p&gt;&#xA;&lt;p&gt;Empty set (0.00 sec)&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]4873115868[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>commons-langのEqualsBuilderの速度</title>
				<link>https://journal.lampetty.net/posts/wp/493/</link>
				<pubDate>Wed, 12 Dec 2012 15:12:34 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/493/</guid>
				<description>&lt;p&gt;Javaの有名なライブラリで&lt;a href=&#34;http://commons.apache.org/lang/&#34;&gt;commons-lang&lt;/a&gt;というのがある。この中に&lt;a href=&#34;http://commons.apache.org/lang/api-3.1/org/apache/commons/lang3/builder/EqualsBuilder.html&#34;&gt;EqualsBuilder&lt;/a&gt;というequals()メソッドを簡単に実装するための便利クラスがある(HashCodeBuilder, ToStringBuilderというクラスもある)。使い方はこんな感じ。&lt;/p&gt;&#xA;&lt;p&gt;@Override&lt;/p&gt;&#xA;&lt;p&gt;public boolean equals(Object o) {&lt;/p&gt;&#xA;&lt;p&gt;if (this == o) {&lt;/p&gt;&#xA;&lt;p&gt;return true;&lt;/p&gt;&#xA;&lt;p&gt;} else if (!(o instanceof MyClass)) {&lt;/p&gt;&#xA;&lt;p&gt;return false;&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;p&gt;MyClass other = (MyClass)o;&lt;/p&gt;&#xA;&lt;p&gt;return new EqualsBuilder()&lt;/p&gt;&#xA;&lt;p&gt;.append(this.field1, o.field1)&lt;/p&gt;&#xA;&lt;p&gt;.append(this.field2, o.field2)&lt;/p&gt;&#xA;&lt;p&gt;.build();&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;p&gt;便利なので愛用してるんだけど、普通にequals()を実装した場合と比べてパフォーマンス的にどうなの？っていうのが気になったのでベンチマークを取ってみた。ちなみに、EqualsBuilder.reflectionEquals()というリフレクションを使うバージョンもあるので、あわせて調べてみた。&lt;/p&gt;&#xA;&lt;h3 id=&#34;結果&#34;&gt;結果&lt;/h3&gt;&#xA;&lt;p&gt;下記の3パターンで10万回equals()を呼び出してベンチした結果（&lt;a href=&#34;https://github.com/oinume/lampetty-samples/blob/d0fdf7a6637da261fadc75391e5106b5db26e2e9/src/main/java/net/lampetty/samples/EqualsBenchmark.java&#34;&gt;ベンチマークのコード&lt;/a&gt;）&lt;/p&gt;&#xA;&lt;p&gt;実装かかった時間(ミリ秒)&lt;/p&gt;&#xA;&lt;p&gt;EqualsBuilderを使わない普通の実装44&lt;/p&gt;&#xA;&lt;p&gt;EqualsBuilderを使った実装50&lt;/p&gt;&#xA;&lt;p&gt;EqualsBuilder.reflectionEqualsを使った実装807&lt;/p&gt;&#xA;&lt;p&gt;結論としては&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;EqualsBuilderを使わない場合と使った場合でほとんど差がないのでEqualsBuilderは積極的に使うべし&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;当たり前だけどリフレクションを使うと遅い。ただ、10万回呼び出して807ミリ秒なので、ケース・バイ・ケースで使えばいいと思う。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;になるのかなぁと。reflectionEqualsは1行でequals()の処理がかけてしまい麻薬的に便利なので、使えるところでは使ってもいいんじゃないかと思った次第。&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]489471499X[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>FreeMarkerで余計な改行が入らないようにする</title>
				<link>https://journal.lampetty.net/posts/wp/489/</link>
				<pubDate>Sun, 18 Nov 2012 00:11:56 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/489/</guid>
				<description>&lt;p&gt;Javaのテンプレートエンジンとして&lt;a href=&#34;http://freemarker.sourceforge.net/&#34; title=&#34;FreeMarker&#34;&gt;FreeMarker&lt;/a&gt;がある。テンプレートエンジンって割とみたいに書くことで余計な改行が入らないようになるじゃないですか。このFreeMarkerではどうするの？っていうのを同僚の人に教えてもらったので、ググれるようにまとめておく。&lt;/p&gt;&#xA;&lt;h3 id=&#34;はじめに&#34;&gt;はじめに&lt;/h3&gt;&#xA;&lt;p&gt;やりたかったことは、DBのテーブル情報から下記のようなクラスを生成するためのテンプレートで(1)と(2)のところに改行を入れたくなかった、ということ。&lt;/p&gt;&#xA;&lt;p&gt;最初のFreeMarkerのテンプレートファイルはこんな感じ。&lt;/p&gt;&#xA;&lt;h3 id=&#34;改行を入れたくないところにコメントを入れることで回避&#34;&gt;改行を入れたくないところにコメントを入れることで回避&lt;/h3&gt;&#xA;&lt;p&gt;結論からいうと、FreeMarkerのコメントのタグ&lt;/p&gt;&#xA;&lt;p&gt;&amp;lt;#-- --&amp;gt;&lt;/p&gt;&#xA;&lt;p&gt;を改行を入れたくない部分に入れたら改行を削除することができた。&lt;/p&gt;&#xA;&lt;h3 id=&#34;freemarkerの空白を削除するタグ&#34;&gt;FreeMarkerの空白を削除するタグ&lt;/h3&gt;&#xA;&lt;p&gt;ちなみに、いろいろ調べてみてFreeMarkerには空白を削除するタグが幾つかあることがわかったが、改行だけでなく半角スペースやタブなども削除してしまうので今回のケースでは使えなかった。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://freemarker.sourceforge.net/docs/dgui_misc_whitespace.html&#34;&gt;&amp;lt;#compress&amp;gt;で囲むと空白を削除できる&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://freemarker.sourceforge.net/docs/ref_directive_t.html#ref.directive.t&#34;&gt;&lt;t&gt;などの空白を削除するタグ&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;最後に&#34;&gt;最後に&lt;/h3&gt;&#xA;&lt;p&gt;HTMLを出力する場合はあまり改行は気にならないかもしれなけど、今回のようにJavaのソースとかを生成する場合は改行の制御がちゃんとできるテンプレートエンジンじゃないと辛いなぁと思った。結果としてやりたいことは実現できたから良かったけど。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4798123366/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/51-4VzXz2RL._SL160_.jpg&#34; alt=&#34;現場で使えるJavaライブラリ&#34; loading=&#34;lazy&#34; title=&#34;現場で使えるJavaライブラリ&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4798123366/kazzhomeunixo-22/&#34;&gt;現場で使えるJavaライブラリ&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: 竹添直樹,島本多可子,小津美夕紀,亀井隆司&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: 翔泳社&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2011/07/16&lt;/li&gt;&#xA;&lt;li&gt;メディア: 大型本&lt;/li&gt;&#xA;&lt;li&gt;購入: 6人 クリック: 217回&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4798123366/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (25件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>PyramidでJjinja2をテンプレートエンジンとして使う</title>
				<link>https://journal.lampetty.net/posts/wp/485/</link>
				<pubDate>Sat, 20 Oct 2012 16:10:28 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/485/</guid>
				<description>&lt;p&gt;Pythonネタ。最近&lt;a href=&#34;http://pyramid.readthedocs.org/en/latest/&#34; title=&#34;Pyramid&#34;&gt;Pyramid&lt;/a&gt;というWebアプリケーションフレームワークを使い始めてる。&lt;/p&gt;&#xA;&lt;p&gt;Pyramidはデフォルトで &lt;a href=&#34;http://chameleon.repoze.org/docs/latest/index.html&#34; title=&#34;Chameleon&#34;&gt;Chameleon&lt;/a&gt; と &lt;a href=&#34;http://www.makotemplates.org/&#34; title=&#34;Mako&#34;&gt;Mako&lt;/a&gt; というテンプレートエンジンが使えるが、自分は &lt;a href=&#34;http://jinja.pocoo.org/docs/&#34; title=&#34;Jinja2&#34;&gt;Jinja2&lt;/a&gt; 派なので、&lt;a href=&#34;http://docs.pylonsproject.org/projects/pyramid_jinja2/en/latest/&#34; title=&#34;pyramid_jinja2&#34;&gt;pyramid_jinja2&lt;/a&gt;というモジュールをインストールする。&lt;/p&gt;&#xA;&lt;h3 id=&#34;インストール&#34;&gt;インストール&lt;/h3&gt;&#xA;&lt;p&gt;pip install pyramid_jinja2&lt;/p&gt;&#xA;&lt;p&gt;するだけでインストール完了。&lt;/p&gt;&#xA;&lt;h3 id=&#34;使い方&#34;&gt;使い方&lt;/h3&gt;&#xA;&lt;p&gt;Pyramidのアプリケーションディレクトリの下の __init__.py に以下を追記する。(myappの部分は自分のアプリケーション名に置き換える)&lt;/p&gt;&#xA;&lt;p&gt;youapp/__init__.py&lt;/p&gt;&#xA;&lt;p&gt;def main(global_config, **settings):&lt;/p&gt;&#xA;&lt;p&gt;...&lt;/p&gt;&#xA;&lt;p&gt;config = Configurator(settings=settings)&lt;/p&gt;&#xA;&lt;p&gt;# Jinja2の設定&lt;/p&gt;&#xA;&lt;p&gt;config.include(&#39;pyramid_jinja2&#39;)&lt;/p&gt;&#xA;&lt;p&gt;config.add_jinja2_search_path(&#39;myapp:templates&#39;)&lt;/p&gt;&#xA;&lt;p&gt;これで templates ディレクトリの下に拡張子が .jinja2 のファイルを置いておくとViewから使えるようになる。&lt;/p&gt;&#xA;&lt;p&gt;myapp/__init__.py&lt;/p&gt;&#xA;&lt;p&gt;def main(global_config, **settings):&lt;/p&gt;&#xA;&lt;p&gt;config = Configurator(settings=settings)&lt;/p&gt;&#xA;&lt;p&gt;...&lt;/p&gt;&#xA;&lt;p&gt;config.add_route(&#39;jinja2_sample&#39;, &#39;/jinja2_sample&#39;) # 追加&lt;/p&gt;&#xA;&lt;p&gt;myapp/views.py&lt;/p&gt;&#xA;&lt;p&gt;@view_config(route_name=&#39;jinja2_sample&#39;, renderer=&#39;templates/jinja2_sample.jinja2&#39;)&lt;/p&gt;&#xA;&lt;p&gt;def jinja2_sample(request):&lt;/p&gt;&#xA;&lt;p&gt;...&lt;/p&gt;&#xA;&lt;p&gt;return { &#39;message&#39;: &#39;hello world!&#39;}&lt;/p&gt;&#xA;&lt;p&gt;yourapp/templates/jinja2_sample.jinja2&lt;/p&gt;&#xA;&lt;p&gt;pyramid_jinja2 sample&lt;/p&gt;&#xA;&lt;p&gt;{{ message }}&lt;/p&gt;&#xA;&lt;h3 id=&#34;テンプレートファイルの拡張子をhtmlにしたい&#34;&gt;テンプレートファイルの拡張子を.htmlにしたい&lt;/h3&gt;&#xA;&lt;p&gt;余談だが、個人的にはテンプレートファイルの拡張子は .html にしたいので、ちょっとカスタマイズしてみた。具体的には yourapp/__init__.py の main のところに config.add_renderer(&#39;.html&#39;, &#39;pyramid_jinja2.renderer_factory&#39;) を追記しておくと拡張子が .html のファイルでもJinja2のテンプレートとして認識させることができる。&lt;/p&gt;&#xA;&lt;p&gt;yourapp/__init__.py&lt;/p&gt;&#xA;&lt;p&gt;def main(global_config, **settings):&lt;/p&gt;&#xA;&lt;p&gt;...&lt;/p&gt;&#xA;&lt;p&gt;config = Configurator(settings=settings)&lt;/p&gt;&#xA;&lt;p&gt;# Jinja2の設定&lt;/p&gt;&#xA;&lt;p&gt;config.include(&#39;pyramid_jinja2&#39;)&lt;/p&gt;&#xA;&lt;p&gt;config.add_jinja2_search_path(&#39;yourapp:templates&#39;)&lt;/p&gt;&#xA;&lt;p&gt;config.add_renderer(&#39;.html&#39;, &#39;pyramid_jinja2.renderer_factory&#39;) # これ&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]4797371595[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>IntelliJ IDEAでヒープサイズを変える</title>
				<link>https://journal.lampetty.net/posts/wp/481/</link>
				<pubDate>Thu, 11 Oct 2012 17:10:17 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/481/</guid>
				<description>&lt;p&gt;Eclipseにいい加減うんざりしてきたので、評判のいいIntelliJ IDEAを試し中。とりあえず最初にやることと言ったら、当然起動時のヒープオプションの変更(IDEA自体もJavaでできているので)。&lt;/p&gt;&#xA;&lt;h3 id=&#34;version-11までの方法&#34;&gt;Version 11までの方法&lt;/h3&gt;&#xA;&lt;p&gt;Macであれば /Applications/IntelliJ IDEA 11 CE.app/Contents/Info.plist ファイルを編集する。&lt;/p&gt;&#xA;&lt;p&gt;diff -u Info.plist.default Info.plist&lt;/p&gt;&#xA;&lt;p&gt;--- Info.plist.default 2012-07-25 15:42:20.000000000 +0900&lt;/p&gt;&#xA;&lt;p&gt;+++ Info.plist 2012-10-12 01:45:00.000000000 +0900&lt;/p&gt;&#xA;&lt;p&gt;@@ -153,10 +153,10 @@&lt;/p&gt;&#xA;&lt;p&gt;-ea -Xverify:none -Xbootclasspath/a:../lib/boot.jar&lt;/p&gt;&#xA;&lt;p&gt;VMOptions.i386&lt;/p&gt;&#xA;&lt;p&gt;- -Xms128m -Xmx512m -XX:MaxPermSize=250m -XX:ReservedCodeCacheSize=64m&lt;/p&gt;&#xA;&lt;p&gt;+ -Xms512m -Xmx512m -Xmn256m -XX:MaxPermSize=250m -XX:ReservedCodeCacheSize=64m&lt;/p&gt;&#xA;&lt;p&gt;VMOptions.x86_64&lt;/p&gt;&#xA;&lt;p&gt;- -Xms128m -Xmx800m -XX:MaxPermSize=350m -XX:ReservedCodeCacheSize=64m -XX:+UseCompressedOops&lt;/p&gt;&#xA;&lt;p&gt;+ -Xms800m -Xmx800m -Xmn400m -XX:MaxPermSize=350m -XX:ReservedCodeCacheSize=64m -XX:+UseCompressedOops&lt;/p&gt;&#xA;&lt;p&gt;WorkingDirectory&lt;/p&gt;&#xA;&lt;p&gt;$APP_PACKAGE/bin&lt;/p&gt;&#xA;&lt;p&gt;な感じ。&lt;/p&gt;&#xA;&lt;h3 id=&#34;version-12以降の方法&#34;&gt;Version 12以降の方法&lt;/h3&gt;&#xA;&lt;p&gt;/Applications/IntelliJ IDEA 12.app/bin/idea.vmoptions を修正する。&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]4798123366[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>homebrewでMacに複数バージョンのrubyをインストールする</title>
				<link>https://journal.lampetty.net/posts/wp/475/</link>
				<pubDate>Thu, 26 Jul 2012 16:07:51 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/475/</guid>
				<description>&lt;p&gt;よく rvm や rbenv を使ってMacに複数バージョンのrubyをインストールする例を見るんですが、「それhomebrewでもできるよ」って思ったのでメモ。&lt;/p&gt;&#xA;&lt;h3 id=&#34;とりあえず最新版を入れる場合&#34;&gt;とりあえず最新版を入れる場合&lt;/h3&gt;&#xA;&lt;p&gt;2012/7/27時点ではruby-1.9.3-p194がインストールされるみたいです。&lt;/p&gt;&#xA;&lt;p&gt;$ brew install ruby&#xA;$ export PATH=/usr/local/bin:$PATH&#xA;$ ruby -v&#xA;ruby 1.9.3p194 (2012-04-20 revision 35410)&lt;/p&gt;&#xA;&lt;h3 id=&#34;別のバージョンのrubyをインストールする&#34;&gt;別のバージョンのrubyをインストールする&lt;/h3&gt;&#xA;&lt;p&gt;続いて一つ前のバージョンを入れるために、利用可能なrubyのバージョン一覧を表示。&lt;/p&gt;&#xA;&lt;p&gt;$ brew versions ruby&#xA;1.9.2-p290 git checkout 1f32fa4 /opt/local/Library/Formula/ruby.rb&#xA;1.9.3-p194 git checkout 3222ca1 /opt/local/Library/Formula/ruby.rb&#xA;1.9.3-p125 git checkout bf3dfa9 /opt/local/Library/Formula/ruby.rb&#xA;1.9.3-p0 git checkout 7338ed6 /opt/local/Library/Formula/ruby.rb&#xA;1.9.2-p180 git checkout 83ed494 /opt/local/Library/Formula/ruby.rb&#xA;1.9.2-p136 git checkout f282737 /opt/local/Library/Formula/ruby.rb&#xA;1.9.2-p0 git checkout 773915d /opt/local/Library/Formula/ruby.rb&#xA;1.9.1-p378 git checkout d0efd9e /opt/local/Library/Formula/ruby.rb&#xA;1.9.1-p376 git checkout e1b2fea /opt/local/Library/Formula/ruby.rb&#xA;1.9.1-p243 git checkout 90ca008 /opt/local/Library/Formula/ruby.rb&#xA;1.8.7-p174 git checkout 25ae159 /opt/local/Library/Formula/ruby.rb&lt;/p&gt;&#xA;&lt;p&gt;$ cd /opt/local/&lt;/p&gt;&#xA;&lt;h1 id=&#34;193-p125のformulaを使う&#34;&gt;1.9.3-p125のFormulaを使う&lt;/h1&gt;&#xA;&lt;p&gt;$ git checkout b6aa338 Library/Formula/ruby.rb&lt;/p&gt;&#xA;&lt;h1 id=&#34;今インストールされているものをいったん無効にする&#34;&gt;今インストールされているものをいったん無効にする&lt;/h1&gt;&#xA;&lt;p&gt;$ brew unlink ruby&lt;/p&gt;&#xA;&lt;h1 id=&#34;193-p125をインストール&#34;&gt;1.9.3-p125をインストール&lt;/h1&gt;&#xA;&lt;p&gt;$ brew install ruby&lt;/p&gt;&#xA;&lt;p&gt;これでruby 1.9.3-p125が有効になった。&lt;/p&gt;&#xA;&lt;p&gt;$ ruby -v&#xA;ruby 1.9.3p125 (2012-02-16 revision 34643)&lt;/p&gt;&#xA;&lt;h3 id=&#34;193-p194に戻したい場合は&#34;&gt;1.9.3-p194に戻したい場合は&lt;/h3&gt;&#xA;&lt;p&gt;$ brew switch ruby 1.9.3-p194&lt;/p&gt;&#xA;&lt;p&gt;すればいい。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4774158798/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/51K0jUf%2BiEL._SL160_.jpg&#34; alt=&#34;パーフェクトRuby (PERFECT SERIES 6)&#34; loading=&#34;lazy&#34; title=&#34;パーフェクトRuby (PERFECT SERIES 6)&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4774158798/kazzhomeunixo-22/&#34;&gt;パーフェクトRuby (PERFECT SERIES 6)&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: Rubyサポーターズ,すがわらまさのり,寺田玄太郎,三村益隆,近藤宇智朗,橋立友宏,関口亮一&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: 技術評論社&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2013/08/10&lt;/li&gt;&#xA;&lt;li&gt;メディア: 大型本&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4774158798/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (17件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>MySQL 5.5をMac OSXにインストールする</title>
				<link>https://journal.lampetty.net/posts/wp/470/</link>
				<pubDate>Sat, 21 Jul 2012 13:07:49 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/470/</guid>
				<description>&lt;p&gt;公式のバイナリを落としてインストールするのが一番楽かなーと思っている。自動起動もできるし。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://dev.mysql.com/downloads/mysql/&#34;&gt;MySQL :: Download MySQL Community Server&lt;/a&gt;からMac OS X ver. 10.6 (x86, 64-bit), DMG Archiveをダウンロード。DMGを開いて mysql-5.5.25a-osx10.6-x86_64.pkg をクリックしてインストール。/usr/local/mysql にインストールされる。&lt;/p&gt;&#xA;&lt;p&gt;/etc/my.iniファイルを適当に作って([permalink id=471]参考[/permalink])、mysql_install_dbで起動に必要なmysqlデータベースを作る。&lt;/p&gt;&#xA;&lt;p&gt;sudo -u mysql /usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql&lt;/p&gt;&#xA;&lt;p&gt;MySQLStartupItem.pkgをクリックしてインストールし、下記のコマンドでdaemonを起動。&lt;/p&gt;&#xA;&lt;p&gt;sudo /Library/StartupItems/MySQLCOM/MySQLCOM start&lt;/p&gt;&#xA;&lt;p&gt;MySQL.prefPaneをクリック。システム環境設定のパネルからMySQLが制御できるようになるし、OS起動時にMySQLを起動させることもできる。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/8250493@N05/7615246936/&#34; title=&#34;mysql_panel&#34;&gt;&lt;img src=&#34;http://farm9.staticflickr.com/8155/7615246936_e37469b485.jpg&#34; alt=&#34;mysql_panel&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;mysqlやmysqladminコマンドなどをPATHに追加したい場合は、下記の内容で /etc/paths.d/mysql というファイルを作っておくと自動的にPATHに追加される。&lt;/p&gt;&#xA;&lt;p&gt;/usr/local/mysql/bin&lt;/p&gt;&#xA;&lt;p&gt;各言語のMySQLドライバをインストールして、実行時に&amp;quot;Library not loaded: libmysqlclient.18.dylib&amp;quot;というエラーが出る場合は、/etc/profile あたりに下記を追記しておくとよい。&lt;/p&gt;&#xA;&lt;p&gt;export DYLD_LIBRARY_PATH=/usr/local/mysql/lib&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]4774150207[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>MySQLをインストールした後に設定する項目(5.5編)</title>
				<link>https://journal.lampetty.net/posts/wp/471/</link>
				<pubDate>Sat, 21 Jul 2012 12:07:55 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/471/</guid>
				<description>&lt;p&gt;[permalink id=174]このエントリ[/permalink]のMySQL 5.5版。大体本家のドキュメントの&lt;a href=&#34;http://dev.mysql.com/doc/refman/5.5/en/innodb-parameters.html&#34;&gt;ここ&lt;/a&gt;とかにちゃんと説明項目が書いてあるので、詳しくはそっちを読むのがいいかと。&lt;/p&gt;&#xA;&lt;p&gt;user = mysql&lt;/p&gt;&#xA;&lt;p&gt;pid-file = /var/run/mysql/mysqld.pid&lt;/p&gt;&#xA;&lt;p&gt;socket = /var/run/mysql/mysqld.sock&lt;/p&gt;&#xA;&lt;p&gt;port = 3306&lt;/p&gt;&#xA;&lt;p&gt;basedir = /usr&lt;/p&gt;&#xA;&lt;p&gt;datadir = /var/lib/mysql&lt;/p&gt;&#xA;&lt;p&gt;tmpdir = /tmp&lt;/p&gt;&#xA;&lt;p&gt;language = /usr/share/mysql/english&lt;/p&gt;&#xA;&lt;p&gt;skip-external-locking&lt;/p&gt;&#xA;&lt;p&gt;# ここまではわりとお決まりの設定。環境によってファイルのパスは適宜変えます。&lt;/p&gt;&#xA;&lt;p&gt;# サーバ側で使用する文字コードの設定&lt;/p&gt;&#xA;&lt;p&gt;character-set-server = utf8&lt;/p&gt;&#xA;&lt;p&gt;# クライアント/サーバ側での文字コード変換を行わない&lt;/p&gt;&#xA;&lt;p&gt;skip-character-set-client-handshake&lt;/p&gt;&#xA;&lt;p&gt;# CREATE TABLE する際に ENGINE=InnoDB の指定をしなくてもInnoDBにする&lt;/p&gt;&#xA;&lt;p&gt;default-storage-engine = InnoDB&lt;/p&gt;&#xA;&lt;p&gt;# クライアント/サーバがやり取りすることのできるパケットサイズを指定&lt;/p&gt;&#xA;&lt;p&gt;# 巨大なデータをやり取りする場合は指定した方がよい&lt;/p&gt;&#xA;&lt;p&gt;max_allowed_packet = 16M&lt;/p&gt;&#xA;&lt;p&gt;# MyISAMで使用するINDEXのキャッシュサイズ&lt;/p&gt;&#xA;&lt;p&gt;key_buffer = 64M&lt;/p&gt;&#xA;&lt;p&gt;# スレッドのスタック領域のサイズ&lt;/p&gt;&#xA;&lt;p&gt;thread_stack = 128K&lt;/p&gt;&#xA;&lt;p&gt;# 生成されたコネクション用のスレッドをキャッシュしておく数&lt;/p&gt;&#xA;&lt;p&gt;thread_cache_size = 16&lt;/p&gt;&#xA;&lt;p&gt;# 最大同時接続数。メモリ搭載量にもよるが100〜300ぐらいが良いらしい&lt;/p&gt;&#xA;&lt;p&gt;max_connections = 150&lt;/p&gt;&#xA;&lt;p&gt;# MyISAMで一度開いたテーブルをキャッシュしておく数&lt;/p&gt;&#xA;&lt;p&gt;table_cache = 128&lt;/p&gt;&#xA;&lt;p&gt;# 同時に実行できるスレッド数。CPUのコア数の2倍を設定&lt;/p&gt;&#xA;&lt;p&gt;thread_concurrency = 2&lt;/p&gt;&#xA;&lt;p&gt;# query cacheの設定&lt;/p&gt;&#xA;&lt;p&gt;# 0:OFF, 1:ON, 2:DEMAND&lt;/p&gt;&#xA;&lt;p&gt;query_cache_type = 1&lt;/p&gt;&#xA;&lt;p&gt;# キャッシュするクエリ結果の最大サイズ&lt;/p&gt;&#xA;&lt;p&gt;query_cache_limit = 1M&lt;/p&gt;&#xA;&lt;p&gt;# クエリキャッシュに割り当てるメモリ量&lt;/p&gt;&#xA;&lt;p&gt;query_cache_size = 16M&lt;/p&gt;&#xA;&lt;p&gt;# slow query log の設定&lt;/p&gt;&#xA;&lt;p&gt;slow_query_log = 1&lt;/p&gt;&#xA;&lt;p&gt;slow_query_log_file=file_name = /var/log/mysql/mysql-slow.log&lt;/p&gt;&#xA;&lt;p&gt;# 3秒以上かかったクエリは上記ログファイルに出力&lt;/p&gt;&#xA;&lt;p&gt;long_query_time = 3&lt;/p&gt;&#xA;&lt;p&gt;# ここからレプリケーションの設定&lt;/p&gt;&#xA;&lt;p&gt;# MySQLサーバごとに固有のID&lt;/p&gt;&#xA;&lt;p&gt;server-id = 1&lt;/p&gt;&#xA;&lt;p&gt;# バイナリログ出力先&lt;/p&gt;&#xA;&lt;p&gt;log_bin = /var/log/mysql/mysql-bin.log&lt;/p&gt;&#xA;&lt;p&gt;# データ書き込み(トランザクションのコミット)を何回行ったらバイナリログを&lt;/p&gt;&#xA;&lt;p&gt;# フラッシュするかの回数。0の場合はデータ書き込みがあってもバイナリログをフラッシュしない&lt;/p&gt;&#xA;&lt;p&gt;sync_binlog = 0&lt;/p&gt;&#xA;&lt;p&gt;# バイナリログを保持しておく日数&lt;/p&gt;&#xA;&lt;p&gt;expire_logs_days = 60&lt;/p&gt;&#xA;&lt;p&gt;# バイナリログの1ファイルあたりの最大サイズ&lt;/p&gt;&#xA;&lt;p&gt;max_binlog_size = 1024M&lt;/p&gt;&#xA;&lt;p&gt;# バイナリログを出力する対象のDB&lt;/p&gt;&#xA;&lt;p&gt;binlog_do_db = hoge&lt;/p&gt;&#xA;&lt;p&gt;# バイナリログの出力対象外とするDB&lt;/p&gt;&#xA;&lt;p&gt;binlog_ignore_db = mysql information_schema&lt;/p&gt;&#xA;&lt;p&gt;# バイナリログフォーマット&lt;/p&gt;&#xA;&lt;p&gt;# ROW:ROWベース, STATEMENT:5.0以下のフォーマット, MIXED:ROWとSTATEMENTが混在&lt;/p&gt;&#xA;&lt;p&gt;binlog_format           = ROW&lt;/p&gt;&#xA;&lt;p&gt;# Berkley DBは使わない&lt;/p&gt;&#xA;&lt;p&gt;skip-bdb&lt;/p&gt;&#xA;&lt;p&gt;# InnoDBのデータファイルの名前とどのぐらいで自動拡張するか&lt;/p&gt;&#xA;&lt;p&gt;innodb_data_file_path = ibdata1:128M:autoextend&lt;/p&gt;&#xA;&lt;p&gt;# テーブルごとに.ibdのデータファイルを作成するかどうか&lt;/p&gt;&#xA;&lt;p&gt;innodb_file_per_table = 1&lt;/p&gt;&#xA;&lt;p&gt;# InnoDBの内部データなどを保持するための領域&lt;/p&gt;&#xA;&lt;p&gt;innodb_additional_mem_pool_size = 20M&lt;/p&gt;&#xA;&lt;p&gt;# InnoDBのデータやインデックスをキャッシュするためのメモリ上の領域&lt;/p&gt;&#xA;&lt;p&gt;# DBサーバ専用のマシンの場合はメモリの50%-80%を指定&lt;/p&gt;&#xA;&lt;p&gt;innodb_buffer_pool_size = 256M&lt;/p&gt;&#xA;&lt;p&gt;# InnoDBの更新ログを記録するメモリ上の領域&lt;/p&gt;&#xA;&lt;p&gt;innodb_log_buffer_size = 8M&lt;/p&gt;&#xA;&lt;p&gt;# InnoDBの更新ログを記録するディスク上のファイルのサイズ&lt;/p&gt;&#xA;&lt;p&gt;# 大きくするとパフォーマンスはあがるがクラッシュ時のリカバリに時間がかかるようになる&lt;/p&gt;&#xA;&lt;p&gt;innodb_log_file_size = 64M&lt;/p&gt;&#xA;&lt;p&gt;# データをファイルに書き込む際のメソッド。&lt;/p&gt;&#xA;&lt;p&gt;# Linuxの場合は O_DIRECTがパフォーマンス的にはよい&lt;/p&gt;&#xA;&lt;p&gt;innodb_flush_method = O_DIRECT&lt;/p&gt;&#xA;&lt;p&gt;# InnoDBのログバッファをInnoDBログファイルに書き込むタイミングを決める&lt;/p&gt;&#xA;&lt;p&gt;# 基本的には1&lt;/p&gt;&#xA;&lt;p&gt;innodb_flush_log_at_trx_commit = 1&lt;/p&gt;&#xA;&lt;p&gt;# 2相コミットを行うかどうか&lt;/p&gt;&#xA;&lt;p&gt;innodb_support_xa = OFF&lt;/p&gt;&#xA;&lt;p&gt;# クラッシュ対策としてデータの二重書き込みを無効にする&lt;/p&gt;&#xA;&lt;p&gt;skip-innodb_doublewrite&lt;/p&gt;&#xA;&lt;p&gt;# InnoDBのデータ読み込みスレッドの数。デフォルト4&lt;/p&gt;&#xA;&lt;p&gt;innodb_read_io_threads = 4&lt;/p&gt;&#xA;&lt;p&gt;# InnoDBのデータ書き込みスレッドの数。デフォルト4&lt;/p&gt;&#xA;&lt;p&gt;innodb_write_io_threads = 4&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]4774150207[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>プログラマーの開発速度</title>
				<link>https://journal.lampetty.net/posts/wp/469/</link>
				<pubDate>Sun, 10 Jun 2012 14:06:06 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/469/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;http://blog.livedoor.jp/lalha/archives/50261226.html&#34;&gt;小野和俊のブログ:プログラマーの開発速度は「はまる」時間の長さで決まる&lt;/a&gt;を読んで「本当にそうだよなぁ」と感銘を受けた。はまると平気で丸一日潰れたりするし。&lt;/p&gt;&#xA;&lt;p&gt;でで、この記事には書いてないけど、特にネットワークを介すアプリケーションを作っている場合、優秀な人は「あれ、おかしいな」と思った時にちゃんと通信内容をダンプして問題を特定することのが早いと思う。ようはプロトコルをちゃんと理解して、適切にデバッグできる人ははまりにくい。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Pythonで標準出力をキャプチャする</title>
				<link>https://journal.lampetty.net/posts/wp/465/</link>
				<pubDate>Sun, 20 May 2012 08:05:57 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/465/</guid>
				<description>&lt;p&gt;Perlだと&lt;a href=&#34;http://search.cpan.org/~dagolden/Capture-Tiny/lib/Capture/Tiny.pm&#34;&gt;Capture::Tiny&lt;/a&gt;というCPANモジュールがあるのだけど、Pythonだとやり方がわからなかったので調べてみたところ、&lt;a href=&#34;http://stackoverflow.com/questions/5136611/capture-stdout-from-a-script-in-python&#34;&gt;Capture stdout from a script in Python - Stack Overflow&lt;/a&gt;で色々とやり方が紹介されている。&lt;/p&gt;&#xA;&lt;p&gt;普通に標準出力の内容を文字列として取りたいだけなら下記でいいんじゃないかと思われる。Python詳しくないのでもっとスマートな方法があれば教えてほしいです。&lt;/p&gt;&#xA;&lt;p&gt;// &amp;lt;![CDATA[ // ]]&amp;gt;&lt;/p&gt;&#xA;&lt;p&gt;withが使えるといいカンジで書けますな。&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]4798032948[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>WikiならConfluenceがオススメ</title>
				<link>https://journal.lampetty.net/posts/wp/463/</link>
				<pubDate>Fri, 04 May 2012 16:05:46 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/463/</guid>
				<description>&lt;p&gt;※自分はAtlassianの回し者ではありません&lt;/p&gt;&#xA;&lt;p&gt;会社で使っている&lt;a href=&#34;http://www.atlassian.com/ja/software/confluence/overview&#34;&gt;Confluence&lt;/a&gt;というエンタープライズWikiが気に入っている。Wikiと言えば今まで&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;MediaWiki&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;PukiWiki&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;FreeStyleWiki&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;RedmineのWiki&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;を使ってきたんだけど、機能的なバランスの良さを考えるとこのConfluenceに軍配が上がると思っている。&lt;/p&gt;&#xA;&lt;p&gt;Confluenceのオススメポイントとしては&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;スペースという概念がある(独立した子Wikiみたいなもの)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;マークアップの表現力が充実している&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;デフォルトでWYSWIGのエディタがついてる&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;ページに階層構造があり、ページの移動が簡単にできる&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;ページにラベル(タグ)が付けられる&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;編集履歴が100%残る&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;ウォッチ機能(ウォッチしているページが更新されたらメール通知)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;プラグインによる機能追加が可能。プラグインも豊富&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;LDAP認証、ActiveDirectory認証に対応&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;ユーザ・グループ単位でページの閲覧・編集制限が可能&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;などが挙げられる。&lt;/p&gt;&#xA;&lt;p&gt;ただし、Wiki記法が独特なのがちょっと痛い。もはや新しいWiki記法を覚えてられないので、自分用のメモWikiもこのConfluenceにしてしまったぐらいである。ちなみにサーバインストール型のライセンスなら10ユーザまでなら年間$10で買えるのでオススメ。&lt;/p&gt;&#xA;&lt;p&gt;最近やっと運用ノウハウが溜まりつつあるので、今後ちょいちょい公開していきたいと思う。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Shellで絶対パスを取得する</title>
				<link>https://journal.lampetty.net/posts/wp/461/</link>
				<pubDate>Thu, 03 May 2012 02:05:51 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/461/</guid>
				<description>&lt;p&gt;よく忘れてしまうのでメモ。例えば実行するスクリプトの絶対パスを取得する場合。&lt;/p&gt;&#xA;&lt;p&gt;#!/bin/sh&lt;/p&gt;&#xA;&lt;p&gt;DIR=$(cd $(dirname &amp;quot;$0&amp;quot;) &amp;amp;&amp;amp; pwd)&lt;/p&gt;&#xA;&lt;p&gt;echo $DIR&lt;/p&gt;&#xA;&lt;p&gt;$ sh ~/Dropbox/code/sh/abspath.sh&lt;/p&gt;&#xA;&lt;p&gt;Users/kazuhiro/Dropbox/code/sh&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>自宅サーバのGitリポジトリをbitbucketに移行</title>
				<link>https://journal.lampetty.net/posts/wp/462/</link>
				<pubDate>Thu, 03 May 2012 02:05:24 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/462/</guid>
				<description>&lt;p&gt;サーバの設定ファイルや個人のdotfileを格納していた自宅サーバのGitリポジトリ、よくよく考えたらbitbucketって無料でプライベートリポジトリ作れたよなぁって思って移行してみた。&lt;/p&gt;&#xA;&lt;p&gt;bitbucketのアカウントさえ取ってしまえば、Gitのリポジトリの移行自体はすごく簡単だった。&lt;/p&gt;&#xA;&lt;p&gt;$ git remote&lt;/p&gt;&#xA;&lt;p&gt;$ git remote rm origin&lt;/p&gt;&#xA;&lt;p&gt;$ git remote add origin &lt;a href=&#34;mailto:git@bitbucket.org&#34;&gt;git@bitbucket.org&lt;/a&gt;:oinume/repo.git&lt;/p&gt;&#xA;&lt;p&gt;ってやるだけ。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>複数バージョンのPythonでテストしてくれるtoxが便利すぎる</title>
				<link>https://journal.lampetty.net/posts/wp/457/</link>
				<pubDate>Sun, 15 Apr 2012 05:04:18 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/457/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;http://readthedocs.org/docs/tomahawk/en/latest/&#34;&gt;tomahawk&lt;/a&gt;はPython 2.4/2.5/2.6/2.7 対応を謳っている。ただ、テストするたびに virtualenv で切り替え→テスト実行が非常に手間だった。そんなところに&lt;a href=&#34;http://www.slideshare.net/aodag/bpstudy54-python3&#34;&gt;このスライド&lt;/a&gt;で&lt;a href=&#34;http://tox.readthedocs.org/en/latest/&#34;&gt;tox&lt;/a&gt;という複数のバージョンのPythonでテストできるツールがあることを知った。実際使ってみたところ、今までやっていた作業が完全に自動化されてウハウハになったので紹介したい。&lt;/p&gt;&#xA;&lt;h3 id=&#34;toxの実行時の流れ&#34;&gt;toxの実行時の流れ&lt;/h3&gt;&#xA;&lt;p&gt;toxはvirtualenvを使って環境を作っては切り替えてくれる。実行時のログを見た限り、流れとしては下記のようになっているようだ。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;テストしたいソフトウェアのディレクトリ上にtox.iniを作成&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;該当ディレクトリで tox コマンドを実行&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;python setup.py sdist が実行される&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;tox.iniで定義された環境をvirtualenvで作成し、必要なライブラリをインストール&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;tox.ini内のcommandsでテストコマンドを実行&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;toxini&#34;&gt;tox.ini&lt;/h3&gt;&#xA;&lt;p&gt;depsにはテストで必要なライブラリなどを書いておく。テスト対象のソフトウェアが依存しているライブラリはtoxがpipを使うので、setup.pyで依存をしっかり書いておけば自動でインストールされる。&lt;/p&gt;&#xA;&lt;p&gt;[tox]&lt;/p&gt;&#xA;&lt;p&gt;envlist = py25,py26,py27&lt;/p&gt;&#xA;&lt;p&gt;[testenv]&lt;/p&gt;&#xA;&lt;p&gt;deps=nose&lt;/p&gt;&#xA;&lt;p&gt;commands = nosetests -sdv tests/internal&lt;/p&gt;&#xA;&lt;p&gt;[testenv:py25]&lt;/p&gt;&#xA;&lt;p&gt;basepython = /usr/local/pythonbrew/pythons/Python-2.5.6/bin/python2.5&lt;/p&gt;&#xA;&lt;p&gt;[testenv:py26]&lt;/p&gt;&#xA;&lt;p&gt;basepython = /usr/local/pythonbrew/pythons/Python-2.6.8/bin/python2.6&lt;/p&gt;&#xA;&lt;p&gt;[testenv:py27]&lt;/p&gt;&#xA;&lt;p&gt;basepython = /usr/local/pythonbrew/pythons/Python-2.7.3/bin/python2.7&lt;/p&gt;&#xA;&lt;h3 id=&#34;toxを実行してみる&#34;&gt;toxを実行してみる&lt;/h3&gt;&#xA;&lt;p&gt;$ pwd&lt;/p&gt;&#xA;&lt;p&gt;/Users/kazuhiro/work/tomahawk&lt;/p&gt;&#xA;&lt;p&gt;$ tox&lt;/p&gt;&#xA;&lt;p&gt;________________________________________ [tox sdist] ________________________________________&lt;/p&gt;&#xA;&lt;p&gt;[TOX] ***creating sdist package&lt;/p&gt;&#xA;&lt;p&gt;[TOX] /Users/kazuhiro/work/tomahawk$ /System/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python setup.py sdist --formats=zip --dist-dir .tox/dist &amp;gt;.tox/log/0.log&lt;/p&gt;&#xA;&lt;p&gt;[TOX] ***copying new sdistfile to &#39;/Users/kazuhiro/.tox/distshare/tomahawk-0.5.0.zip&#39;&lt;/p&gt;&#xA;&lt;p&gt;____________________________________ [tox testenv:py25] _____________________________________&lt;/p&gt;&#xA;&lt;p&gt;[TOX] ***creating virtualenv py25&lt;/p&gt;&#xA;&lt;p&gt;[TOX] /Users/kazuhiro/work/tomahawk/.tox$ /opt/local/pythonbrew/pythons/Python-2.5.6/bin/python2.5 /Library/Python/2.7/site-packages/virtualenv.py --distribute --no-site-packages py25 &amp;gt;py25/log/0.log&lt;/p&gt;&#xA;&lt;p&gt;[TOX] ***installing dependencies: nose&lt;/p&gt;&#xA;&lt;p&gt;[TOX] /Users/kazuhiro/work/tomahawk/.tox/py25/log$ ../bin/pip install --download-cache=/Users/kazuhiro/work/tomahawk/.tox/_download nose &amp;gt;1.log&lt;/p&gt;&#xA;&lt;p&gt;[TOX] ***installing sdist&lt;/p&gt;&#xA;&lt;p&gt;[TOX] /Users/kazuhiro/work/tomahawk/.tox/py25/log$ ../bin/pip install --download-cache=/Users/kazuhiro/work/tomahawk/.tox/_download /Users/kazuhiro/work/tomahawk/.tox/dist/tomahawk-0.5.0.zip &amp;gt;2.log&lt;/p&gt;&#xA;&lt;p&gt;[TOX] /Users/kazuhiro/work/tomahawk$ .tox/py25/bin/nosetests -sdv tests/internal&lt;/p&gt;&#xA;&lt;p&gt;test_command.test_01_execute ... ok&lt;/p&gt;&#xA;&lt;p&gt;test_command.test_02_execute_error ... ok&lt;/p&gt;&#xA;&lt;p&gt;test_command.test_03_execute_timeout ... ok&lt;/p&gt;&#xA;&lt;p&gt;test_command.test_04_execute_option_host_files ... ok&lt;/p&gt;&#xA;&lt;p&gt;test_command.test_05_execute_option_continue_on_error ... ok&lt;/p&gt;&#xA;&lt;p&gt;test_command.test_06_execute_option_ssh_options ... ok&lt;/p&gt;&#xA;&lt;p&gt;test_command.test_07_output_format ... ok&lt;/p&gt;&#xA;&lt;p&gt;test_rsync.test_01_execute ... ok&lt;/p&gt;&#xA;&lt;p&gt;test_rsync.test_02_execute_error ... ok&lt;/p&gt;&#xA;&lt;p&gt;test_rsync.test_03_execute_timeout ... ok&lt;/p&gt;&#xA;&lt;p&gt;test_rsync.test_04_execute_option_rsync_options ... ok&lt;/p&gt;&#xA;&lt;p&gt;test_rsync.test_05_execute_option_mirror_mode_pull ... ok&lt;/p&gt;&#xA;&lt;p&gt;test_rsync.test_06_execute_option_continue_on_error ... ok&lt;/p&gt;&#xA;&lt;p&gt;----------------------------------------------------------------------&lt;/p&gt;&#xA;&lt;p&gt;Ran 13 tests in 12.750s&lt;/p&gt;&#xA;&lt;p&gt;OK&lt;/p&gt;&#xA;&lt;p&gt;____________________________________ [tox testenv:py26] _____________________________________&lt;/p&gt;&#xA;&lt;p&gt;[TOX] ***creating virtualenv py26&lt;/p&gt;&#xA;&lt;p&gt;[TOX] /Users/kazuhiro/work/tomahawk/.tox$ /opt/local/pythonbrew/pythons/Python-2.6.8/bin/python2.6 /Library/Python/2.7/site-packages/virtualenv.py --distribute --no-site-packages py26 &amp;gt;py26/log/0.log&lt;/p&gt;&#xA;&lt;p&gt;[TOX] ***installing dependencies: nose&lt;/p&gt;&#xA;&lt;p&gt;[TOX] /Users/kazuhiro/work/tomahawk/.tox/py26/log$ ../bin/pip install --download-cache=/Users/kazuhiro/work/tomahawk/.tox/_download nose &amp;gt;1.log&lt;/p&gt;&#xA;&lt;p&gt;[TOX] ***installing sdist&lt;/p&gt;&#xA;&lt;p&gt;[TOX] /Users/kazuhiro/work/tomahawk/.tox/py26/log$ ../bin/pip install --download-cache=/Users/kazuhiro/work/tomahawk/.tox/_download /Users/kazuhiro/work/tomahawk/.tox/dist/tomahawk-0.5.0.zip &amp;gt;2.log&lt;/p&gt;&#xA;&lt;p&gt;[TOX] /Users/kazuhiro/work/tomahawk$ .tox/py26/bin/nosetests -sdv tests/internal&lt;/p&gt;&#xA;&lt;p&gt;(snip)&lt;/p&gt;&#xA;&lt;p&gt;----------------------------------------------------------------------&lt;/p&gt;&#xA;&lt;p&gt;Ran 13 tests in 13.355s&lt;/p&gt;&#xA;&lt;p&gt;OK&lt;/p&gt;&#xA;&lt;p&gt;____________________________________ [tox testenv:py27] _____________________________________&lt;/p&gt;&#xA;&lt;p&gt;[TOX] ***creating virtualenv py27&lt;/p&gt;&#xA;&lt;p&gt;[TOX] /Users/kazuhiro/work/tomahawk/.tox$ /opt/local/pythonbrew/pythons/Python-2.7.3/bin/python2.7 /Library/Python/2.7/site-packages/virtualenv.py --distribute --no-site-packages py27 &amp;gt;py27/log/0.log&lt;/p&gt;&#xA;&lt;p&gt;[TOX] ***installing dependencies: nose&lt;/p&gt;&#xA;&lt;p&gt;[TOX] /Users/kazuhiro/work/tomahawk/.tox/py27/log$ ../bin/pip install --download-cache=/Users/kazuhiro/work/tomahawk/.tox/_download nose &amp;gt;1.log&lt;/p&gt;&#xA;&lt;p&gt;[TOX] ***installing sdist&lt;/p&gt;&#xA;&lt;p&gt;[TOX] /Users/kazuhiro/work/tomahawk/.tox/py27/log$ ../bin/pip install --download-cache=/Users/kazuhiro/work/tomahawk/.tox/_download /Users/kazuhiro/work/tomahawk/.tox/dist/tomahawk-0.5.0.zip &amp;gt;2.log&lt;/p&gt;&#xA;&lt;p&gt;[TOX] /Users/kazuhiro/work/tomahawk$ .tox/py27/bin/nosetests -sdv tests/internal&lt;/p&gt;&#xA;&lt;p&gt;(snip)&lt;/p&gt;&#xA;&lt;p&gt;----------------------------------------------------------------------&lt;/p&gt;&#xA;&lt;p&gt;Ran 13 tests in 14.168s&lt;/p&gt;&#xA;&lt;p&gt;OK&lt;/p&gt;&#xA;&lt;p&gt;_______________________________________ [tox summary] _______________________________________&lt;/p&gt;&#xA;&lt;p&gt;[TOX] py25: commands succeeded&lt;/p&gt;&#xA;&lt;p&gt;[TOX] py26: commands succeeded&lt;/p&gt;&#xA;&lt;p&gt;[TOX] py27: commands succeeded&lt;/p&gt;&#xA;&lt;p&gt;[TOX] congratulations :)&lt;/p&gt;&#xA;&lt;p&gt;というわけで、toxオススメです。&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]4798032948[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>pythonbrewで新しいPythonをインストールできるようにする</title>
				<link>https://journal.lampetty.net/posts/wp/456/</link>
				<pubDate>Sat, 14 Apr 2012 16:04:25 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/456/</guid>
				<description>&lt;p&gt;Python-2.7.3がリリースされたので早速入れようと思ったら&lt;/p&gt;&#xA;&lt;p&gt;$ pythonbrew install 2.7.3&lt;/p&gt;&#xA;&lt;p&gt;ERROR: Unknown python version: `Python-2.7.3`&lt;/p&gt;&#xA;&lt;p&gt;と言われて残念な気持ちになったので、どうすればpythonbrewで新しいPythonがインストールできるか調べてみた。&lt;/p&gt;&#xA;&lt;p&gt;やり方は簡単で $PYTHONBREW_ROOT/etc/config.cfg に下記のように追加すればいいだけだった。&lt;/p&gt;&#xA;&lt;p&gt;$ diff -u config.cfg.orig config.cfg&lt;/p&gt;&#xA;&lt;p&gt;--- config.cfg.orig 2012-04-15 01:34:23.000000000 +0900&lt;/p&gt;&#xA;&lt;p&gt;+++ config.cfg 2012-04-15 01:35:09.000000000 +0900&lt;/p&gt;&#xA;&lt;p&gt;@@ -154,6 +154,9 @@&lt;/p&gt;&#xA;&lt;p&gt;[Python-2.7.2]&lt;/p&gt;&#xA;&lt;p&gt;url = &lt;a href=&#34;http://www.python.org/ftp/python/2.7.2/Python-2.7.2.tgz&#34;&gt;http://www.python.org/ftp/python/2.7.2/Python-2.7.2.tgz&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;+[Python-2.7.3]&lt;/p&gt;&#xA;&lt;p&gt;+url = &lt;a href=&#34;http://www.python.org/ftp/python/2.7.3/Python-2.7.3.tgz&#34;&gt;http://www.python.org/ftp/python/2.7.3/Python-2.7.3.tgz&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;latest = True&lt;/p&gt;&#xA;&lt;p&gt;[Python-3.0]&lt;/p&gt;&#xA;&lt;p&gt;追記したらいつものようにインストールするだけ。&lt;/p&gt;&#xA;&lt;p&gt;$ pythonbrew install 2.7.3&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]4798032948[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Shellでset -uした時の引数の取り扱い</title>
				<link>https://journal.lampetty.net/posts/wp/455/</link>
				<pubDate>Sat, 07 Apr 2012 22:04:10 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/455/</guid>
				<description>&lt;p&gt;#!/bin/sh&lt;/p&gt;&#xA;&lt;p&gt;DIR=$1&lt;/p&gt;&#xA;&lt;p&gt;rm -rf $DIR/&lt;/p&gt;&#xA;&lt;p&gt;なんてやると$1がなかった時に / が消されてしまうので非常に危険。こういう場合は set -u して、未定義の変数があればエラーにすることが推奨される。&lt;/p&gt;&#xA;&lt;p&gt;/Users/kazuhiro/Dropbox/code/sh/set_u.sh: line 3: $1: unbound variable&lt;/p&gt;&#xA;&lt;p&gt;ただし、 set -u すると引数の個数を$#を使って、いちいちチェックしないといけない。&lt;/p&gt;&#xA;&lt;p&gt;#!/bin/sh&lt;/p&gt;&#xA;&lt;p&gt;set -u&lt;/p&gt;&#xA;&lt;p&gt;# 引数のサイズをチェック&lt;/p&gt;&#xA;&lt;p&gt;if [ $# -le 1 ]; then&lt;/p&gt;&#xA;&lt;p&gt;exit 1&lt;/p&gt;&#xA;&lt;p&gt;fi&lt;/p&gt;&#xA;&lt;p&gt;DIR=$1&lt;/p&gt;&#xA;&lt;p&gt;rm -rf $DIR/&lt;/p&gt;&#xA;&lt;p&gt;ちょっと面倒だけど set -u している時は $# 使いましょうということで。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>amazon.comでKindle版オライリー本を買うと$4.99でDRMフリーなバージョンが買える</title>
				<link>https://journal.lampetty.net/posts/wp/452/</link>
				<pubDate>Sat, 24 Mar 2012 11:03:36 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/452/</guid>
				<description>&lt;p&gt;先日amazon.comでKindle版の[tmkm-amazon]1449306403[/tmkm-amazon]を買ったら、その本の中に&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Upgrade this ebook today for $4.99 at oreilly.com and get access to additional DRM-free formats including PDF and EPUB, along with free lifetime updates.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;という文章があった。どうやらオライリーで追加$4.99払うとDRMフリーなバージョンのものが手に入るらしい。&lt;/p&gt;&#xA;&lt;p&gt;Good ReaderでiOS内蔵の辞書が使えるようになって、洋書をちょいちょい買っているので嬉しい。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>CentOS 6.x上でtomahawk-0.4.x使ってsudoつきのコマンドが失敗する場合</title>
				<link>https://journal.lampetty.net/posts/wp/451/</link>
				<pubDate>Sun, 18 Mar 2012 13:03:11 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/451/</guid>
				<description>&lt;p&gt;CentOS 6.2で sudo 付きのコマンドを送る場合は&lt;/p&gt;&#xA;&lt;p&gt;tomahawk -o=-t -l -h localhost &#39;sudo uptime&#39;&lt;/p&gt;&#xA;&lt;p&gt;のように、-o=-t をつけます。これでssh時に pseudo-tty が割り当てられる。ちなみに今開発中の0.5系はデフォルトで -o=-t がつく状態になっています。&lt;/p&gt;&#xA;&lt;p&gt;あと、-D でデバッグ出力が有効になります。同僚からバグ報告をもらったのですが、&amp;quot;sudo: sorry, you must have a tty to run sudo&lt;/p&gt;&#xA;&lt;p&gt;&amp;quot; と言われているので、「ああ、そういうことか」とわかりました。&lt;/p&gt;&#xA;&lt;p&gt;$ bin/tomahawk -D -l -h localhost &#39;sudo uptime&#39;&lt;/p&gt;&#xA;&lt;p&gt;[DEBUG] options = Namespace(command=[&#39;sudo uptime&#39;],&lt;/p&gt;&#xA;&lt;p&gt;continue_on_error=None, debug=True, delay=0,&lt;/p&gt;&#xA;&lt;p&gt;expect_delay=0.050000000000000003, expect_encoding=&#39;utf-8&#39;,&lt;/p&gt;&#xA;&lt;p&gt;expect_timeout=None, hosts=&#39;localhost&#39;, hosts_files=None,&lt;/p&gt;&#xA;&lt;p&gt;no_sudo_password=False, output_format=&#39;${user}@${host} %&lt;/p&gt;&#xA;&lt;p&gt;${command}n${output}n&#39;, parallel=1, profile=False,&lt;/p&gt;&#xA;&lt;p&gt;prompt_login_password=True, prompt_sudo_password=False, ssh=&#39;ssh&#39;,&lt;/p&gt;&#xA;&lt;p&gt;ssh_options=None, ssh_user=None, timeout=10)&lt;/p&gt;&#xA;&lt;p&gt;[DEBUG] arguments = [&#39;sudo uptime&#39;]&lt;/p&gt;&#xA;&lt;p&gt;Enter a password for ssh authentication:&lt;/p&gt;&#xA;&lt;p&gt;Enter a password for sudo:&lt;/p&gt;&#xA;&lt;p&gt;[DEBUG] command = ssh, args = [&#39;-l&#39;, &#39;kazuhiro&#39;, &#39;localhost&#39;, &#39;/bin/sh&#39;,&lt;/p&gt;&#xA;&lt;p&gt;&#39;-c&#39;, &#39;&amp;quot;sudo uptime&amp;quot;&#39;]&lt;/p&gt;&#xA;&lt;p&gt;[DEBUG] expect index = 1&lt;/p&gt;&#xA;&lt;p&gt;[DEBUG] expect.EOF&lt;/p&gt;&#xA;&lt;p&gt;[DEBUG] child closed.&lt;/p&gt;&#xA;&lt;p&gt;[DEBUG] exit_status = 1&lt;/p&gt;&#xA;&lt;p&gt;[DEBUG] line = kazuhiro@localhost&#39;s password: *********&lt;/p&gt;&#xA;&lt;p&gt;[DEBUG] line = sudo: sorry, you must have a tty to run sudo&lt;/p&gt;&#xA;&lt;p&gt;[DEBUG] output_text = sudo: sorry, you must have a tty to run sudo&lt;/p&gt;&#xA;&lt;p&gt;[error] kazuhiro@localhost % sudo uptime&lt;/p&gt;&#xA;&lt;p&gt;sudo: sorry, you must have a tty to run sudo&lt;/p&gt;&#xA;&lt;p&gt;Command failed ! (status = 1)&lt;/p&gt;&#xA;&lt;p&gt;[error] Command &amp;quot;sudo uptime&amp;quot; failed on host &amp;quot;localhost&amp;quot;&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Firefoxで開いているタブのタイトル/リンクの一覧を生成するアドオン</title>
				<link>https://journal.lampetty.net/posts/wp/449/</link>
				<pubDate>Sat, 17 Mar 2012 16:03:56 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/449/</guid>
				<description>&lt;p&gt;Firefoxに&lt;a href=&#34;https://addons.mozilla.org/en-US/firefox/addon/copy-urls-expert/&#34; title=&#34;Copy Urls Eexpert&#34;&gt;Copy Urls Eexpert&lt;/a&gt;というアドオンがあって、最近これを便利に使っているので紹介。&lt;/p&gt;&#xA;&lt;p&gt;どういうアドオンかというと、「ウィンドウ内で開いているタブの一覧から、タイトルとURLをリスト化してくれる」というもの。リストは下記のようになる。&lt;/p&gt;&#xA;&lt;p&gt;1. Matt Sergeant / Time-Piece - search.cpan.org - &lt;a href=&#34;http://search.cpan.org/dist/Time-Piece/&#34;&gt;http://search.cpan.org/dist/Time-Piece/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;2. Dave Rolsky / DateTime - search.cpan.org - &lt;a href=&#34;http://search.cpan.org/dist/DateTime/&#34;&gt;http://search.cpan.org/dist/DateTime/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;3. Johan Vromans / Getopt-Long - search.cpan.org - &lt;a href=&#34;http://search.cpan.org/dist/Getopt-Long/&#34;&gt;http://search.cpan.org/dist/Getopt-Long/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;URLの一覧をWikiやブログに貼りつけたい時などに超絶便利です。&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]4798012246[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Linuxでディスクが壊れた場合のデータ復旧方法</title>
				<link>https://journal.lampetty.net/posts/wp/447/</link>
				<pubDate>Wed, 29 Feb 2012 07:02:30 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/447/</guid>
				<description>&lt;p&gt;先日自宅サーバのディスク(SSD)がお亡くなりになって、「あーやっべー、データ全部バックアップしてないわー」ということが発覚し途方に暮れていたんだけど、グーグル先生に問い合わせたところ dd_rescue なるコマンドがあり、これを使ったらほぼ完全にデータが復旧できましたとさ！&lt;/p&gt;&#xA;&lt;p&gt;Debian/Ubuntu なら&lt;/p&gt;&#xA;&lt;p&gt;$ sudo aptitude install ddrescue&lt;/p&gt;&#xA;&lt;p&gt;自分は新しいマシンを用意していたので、そのマシンに壊れたディスク(/dev/sdd)と余っていたディスク(/dev/sde)を刺して&lt;/p&gt;&#xA;&lt;p&gt;sudo dd_rescue /dev/sdd /dev/sde&lt;/p&gt;&#xA;&lt;p&gt;と実行し、壊れたディスクである /dev/sddのデータを /dev/sde にコピー。&lt;/p&gt;&#xA;&lt;p&gt;あとは /dev/sde を適当にマウントして、データをコピーすればOK。&lt;/p&gt;&#xA;&lt;p&gt;いやー dd_rescue 様様でした。ありがたい。&lt;/p&gt;&#xA;&lt;h3 id=&#34;参考&#34;&gt;参考&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.otsune.com/diary/2006/11/19/1.html&#34; title=&#34;void GraphicWizardsLair( void ); // クラッシュしたHDDをサルベージするときはKNOPPIXかFreeSBIEでdd_rhelpとかdd_rescueするのがオススメ&#34;&gt;void GraphicWizardsLair( void ); // クラッシュしたHDDをサルベージするときはKNOPPIXかFreeSBIEでdd_rhelpとかdd_rescueするのがオススメ&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://pcandmacandwin.blogspot.com/2008/09/ddrescuehd.html&#34; title=&#34;PCとmacな日々: ddrescueでHDを復旧する&#34;&gt;PCとmacな日々: ddrescueでHDを復旧する&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;[tmkm-amazon]B001K97W56[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>iPhoneのホームボタンを延命するためのAssistiveTouch</title>
				<link>https://journal.lampetty.net/posts/wp/446/</link>
				<pubDate>Sat, 11 Feb 2012 02:02:34 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/446/</guid>
				<description>&lt;p&gt;iPhoneのホームボタンって酷使されるもので、よく「ホームボタンがきかなくなった」などの症状を訴える人が多い。そんな人達に朗報なのが、このAssistiveTouchという設定。設定→一般→アクセシビリティ→(身体機能サポート)AssistiveTouchをオンにすると、&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/8250493@N05/6854403083/&#34; title=&#34;AssistiveTouch&#34;&gt;&lt;img src=&#34;http://farm8.staticflickr.com/7017/6854403083_41f32360c5.jpg&#34; alt=&#34;AssistiveTouch&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;写真の右下にあるようなフワッとしたボタンが出てきて、これをタップするとホームボタンが出てくる。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/8250493@N05/6854406239/&#34; title=&#34;AssistiveTouch2&#34;&gt;&lt;img src=&#34;http://farm8.staticflickr.com/7067/6854406239_1f75d6754a.jpg&#34; alt=&#34;AssistiveTouch2&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;詳細は&lt;a href=&#34;http://weekly.ascii.jp/elem/000/000/074/74479/&#34; title=&#34;iPhoneのホームボタンを使わない方法&#34;&gt;iPhoneのホームボタンを使わない方法&lt;/a&gt;にいろいろ書いてあるけど、これを覚えてからホームボタンを押す機会が半減したので、ホームボタン故障恐怖症の人はためしてみるといいと思う。&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]4776206919[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Shellでset -e の状態を解除するにはset &#43;e</title>
				<link>https://journal.lampetty.net/posts/wp/444/</link>
				<pubDate>Sun, 05 Feb 2012 12:02:09 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/444/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;http://d.hatena.ne.jp/rx7/20101226/p1&#34;&gt;&amp;quot;set -e&amp;quot;: 実行コマンドが0以外の終了コードの場合、シェルスクリプトを終了する - RX-7乗りの適当な日々&lt;/a&gt;にある通り、Shellスクリプトで set -e すると実行結果が0以外の場合、勝手にスクリプトが終了する。で、この挙動をスクリプトの途中で元に戻したい(＝エラーにしたくない)場合は以下のように set +e すればいい。&lt;/p&gt;&#xA;&lt;p&gt;set -e&lt;/p&gt;&#xA;&lt;p&gt;echo &amp;quot;in set -e&amp;quot;&lt;/p&gt;&#xA;&lt;p&gt;...&lt;/p&gt;&#xA;&lt;p&gt;set +e&lt;/p&gt;&#xA;&lt;p&gt;hoge&lt;/p&gt;&#xA;&lt;p&gt;echo &amp;quot;in set +e&amp;quot;&lt;/p&gt;&#xA;&lt;p&gt;これで hoge でコマンドが失敗してもエラーでShell自体は終了しなくなる。&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]4797321946[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>python-mode &#43; auto-complete-mode &#43; ac-pythonでPythonのコード補完</title>
				<link>https://journal.lampetty.net/posts/wp/443/</link>
				<pubDate>Wed, 18 Jan 2012 15:01:48 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/443/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;http://d.hatena.ne.jp/CortYuming/20111224/p1&#34; title=&#34;Pythonの補完をEmacsでシンプルに最小労力で手早く使えるようにする - 牌語備忘録 - pygo&#34;&gt;Pythonの補完をEmacsでシンプルに最小労力で手早く使えるようにする - 牌語備忘録 - pygo&lt;/a&gt;の通りなんですが、手っ取り早くEmacsでPythonのコード補完を実現できた。ちなみにpython-modeでもac-pythonは問題なく動いてる。これ設定したらコード書くスピードが今までの1.5倍ぐらい速くなったっす！&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>特定のホスト用のssh秘密鍵は ~/.ssh/config に記述しておくとラク</title>
				<link>https://journal.lampetty.net/posts/wp/441/</link>
				<pubDate>Sun, 15 Jan 2012 16:01:56 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/441/</guid>
				<description>&lt;p&gt;例えばお仕事で使っているサーバで&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;仕事用のサーバへのssh秘密鍵&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;github.comなどの個人用のssh秘密鍵&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;などと複数の秘密鍵を持ちたい場合がよくある。メインは1.の仕事用のサーバだとすると&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;~/.ssh/id_rsa (id_dsa) は仕事用サーバ向けの秘密鍵&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;~/.ssh/id_rsa-private を個人用の秘密鍵&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;となることが多いのではないかと思う。&lt;/p&gt;&#xA;&lt;p&gt;この場合&lt;/p&gt;&#xA;&lt;p&gt;ssh -i ~/.ssh/id_rsa-private yourhost&lt;/p&gt;&#xA;&lt;p&gt;などと毎回秘密鍵のファイルを指定するのはつらいので、~/.ssh/config に&lt;/p&gt;&#xA;&lt;p&gt;Host yourhost&lt;/p&gt;&#xA;&lt;p&gt;IdentityFile ~/.ssh/id_rsa-private&lt;/p&gt;&#xA;&lt;p&gt;と書いておくと、&lt;/p&gt;&#xA;&lt;p&gt;ssh yourhost&lt;/p&gt;&#xA;&lt;p&gt;だけでいけるので便利だと思った次第です。&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]4756145531[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Sphinxで複数のman pageを生成する</title>
				<link>https://journal.lampetty.net/posts/wp/437/</link>
				<pubDate>Fri, 06 Jan 2012 21:01:40 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/437/</guid>
				<description>&lt;h3 id=&#34;前置き&#34;&gt;前置き&lt;/h3&gt;&#xA;&lt;p&gt;つい最近&lt;a href=&#34;https://github.com/oinume/tomahawk&#34;&gt;tomahawk&lt;/a&gt;のドキュメントをGithub Wikiから&lt;a href=&#34;http://sphinx.pocoo.org/&#34;&gt;Sphinx&lt;/a&gt;に移行したのでそのメモ。SphinxにはHTMLを生成する以外にもman pageを生成する機能があって&lt;/p&gt;&#xA;&lt;p&gt;$ make man&lt;/p&gt;&#xA;&lt;p&gt;を実行すると _build/man/ 配下に mycommand.1 みたいな感じでman pageが生成される。&lt;/p&gt;&#xA;&lt;p&gt;でで、tomahawkの場合は tomahawk, tomahawk-rsync という２つの実行ファイルがあるので、この2つのman pageを生成したくて、tomahawk.rst, tomahawk-rsync.rst ファイルを作ってみたけど、デフォルトでは tomahawk.1 に全部入りのman pageができるだけで「独立したrstファイルから個別のman page生成するのってどうやるんだろう？」となっていた。&lt;/p&gt;&#xA;&lt;h3 id=&#34;複数のman-pageを生成する方法&#34;&gt;複数のman pageを生成する方法&lt;/h3&gt;&#xA;&lt;p&gt;結論としては、Sphinxのconf.pyに man_pages という設定があるので、これを下記のように man pageの数だけ用意してあげれば良かった。&lt;/p&gt;&#xA;&lt;p&gt;authors = (&#39;Kazuhiro Oinuma&#39;)&lt;/p&gt;&#xA;&lt;p&gt;man_pages = [&lt;/p&gt;&#xA;&lt;p&gt;(&#39;index&#39;, &#39;tomahawk-all&#39;, &#39;tomahawk manual&#39;, authors, 1),&lt;/p&gt;&#xA;&lt;p&gt;(&#39;tomahawk&#39;, &#39;tomahawk&#39;, &#39;enables to execute a command to many hosts&#39;, authors, 1),&lt;/p&gt;&#xA;&lt;p&gt;(&#39;tomahawk-rsync&#39;, &#39;tomahawk-rsync&#39;, &#39;enables to copy files to many hosts&#39;, authors, 1),&lt;/p&gt;&#xA;&lt;p&gt;]&lt;/p&gt;&#xA;&lt;p&gt;それぞれのタプルは順に&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;source start file - manページの”ルート”となるドキュメントの名前です。このファイルから参照されたすべてのドキュメントはLaTeXファイルの中のTOCツリーにも含まれるようになります。もしも1つのファイルをマスターにしたmanページにしたい場合には、 master_doc で設定した値をここに指定して下さい。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;name - manページの名前です。これには、スペースや特別な文字を含まない、短い文字列を指定します。この項目は出力ファイル名と、manページの名前(NAMEセクション内)として使用されます。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;description - manページの説明です。これはNAMEセクション内で使用されます。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;authors - 著者名の文字列のリスト、もしくは単一の文字列です。manページのAUTHORSセクションを自動的に生成したくない場合には、空の文字列や空の配列を指定することもできます。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;section - manページのセクションです。出力ファイル名や、manページのヘッダー内で使われます。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;ということらしい。このように複数のman pageを生成するやり方はSphinxのドキュメントにも書いてなかったので、Sphinx自体のドキュメントのソースを見てみたらビンゴだった。&lt;/p&gt;&#xA;&lt;h3 id=&#34;なんでsphinxを使うのか&#34;&gt;なんでSphinxを使うのか&lt;/h3&gt;&#xA;&lt;p&gt;mkouheiさんにtomahawkのDebianパッケージを作ってもらっている時に「コマンドにはman pageが必要」といわれたので、どうせならHTMLもmanも生成できるSphinxに移行してみたというのが理由。最初はreStructuredTextのフォーマットを覚えるに苦労したけど、これさえ覚えれば色んなフォーマットに出力できるのでいい投資かなぁと思う。&lt;/p&gt;&#xA;&lt;p&gt;あと、&lt;a href=&#34;http://readthedocs.org/&#34;&gt;Read The Docs&lt;/a&gt;というサービスを使えば、Git/Mercurial/Bzr/SVNで管理しているファイルから自動的にSphinxでHTML生成して readthedocs.org から見れるようになるので非常に便利れす(ReadTheDocsについて詳しくは&lt;a href=&#34;http://d.hatena.ne.jp/ymotongpoo/20110627/1309181077&#34;&gt;ここ&lt;/a&gt;)。&lt;/p&gt;&#xA;&lt;p&gt;というわけでソフトウェアのドキュメントにはSphinxがおすすめです！&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]4274068641[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>2011年の振り返りと2012年</title>
				<link>https://journal.lampetty.net/posts/wp/440/</link>
				<pubDate>Wed, 04 Jan 2012 08:01:53 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/440/</guid>
				<description>&lt;p&gt;明けましておめでとうございます。2012年は元旦早々風邪を引いて意図せず寝正月でした。やっと風邪も落ち着いてきたので、やや周回遅れですが2011年の振り返りを行おうかと思います。&lt;/p&gt;&#xA;&lt;h3 id=&#34;1-3月&#34;&gt;1-3月&lt;/h3&gt;&#xA;&lt;p&gt;1月早々に引っ越し&lt;/p&gt;&#xA;&lt;p&gt;ウィルス性胃腸炎で初めて死を意識した(ぐらい辛かった)&lt;/p&gt;&#xA;&lt;p&gt;仕事は本格的にリーダー的なポジションになる。&lt;/p&gt;&#xA;&lt;p&gt;サービスの安定化頑張る&lt;/p&gt;&#xA;&lt;p&gt;Pythonのお勉強がひと通り終わる&lt;/p&gt;&#xA;&lt;h3 id=&#34;4-6月&#34;&gt;4-6月&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/oinume/tomahawk&#34;&gt;tomahawk&lt;/a&gt;の機能追加を頑張る&lt;/p&gt;&#xA;&lt;p&gt;AppEngineでサービス作ろうとしたけど、方向転換してさくらVPS借りる&lt;/p&gt;&#xA;&lt;h3 id=&#34;7-9月&#34;&gt;7-9月&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://mysql-casual.org/2011/08/mysql-casual-talks-vol2-1.html&#34;&gt;MySQL Casual Talks #2&lt;/a&gt;でしゃべる&lt;/p&gt;&#xA;&lt;h3 id=&#34;10-12月&#34;&gt;10-12月&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://atnd.org/events/22528&#34;&gt;MySQL Casual Advent Calendar&lt;/a&gt;に参加&lt;/p&gt;&#xA;&lt;p&gt;btflyというサーバ管理フレームワーク作りだす(たぶん今年の2月には本格的に公開する予定)&lt;/p&gt;&#xA;&lt;h3 id=&#34;2012年&#34;&gt;2012年&lt;/h3&gt;&#xA;&lt;p&gt;2011年は仕事でプレイイングマネージャーをやりつつ、プライベートでは主にPythonをよくいじっていたという感じ。仕事で関わっているサービスは、何度かトラブルは起こしながらも非常に順調に成長しているのがまず何より嬉しい。回りの人達は本当にスキルもありサービス目線もしっかりしているので、あまり自分が口を突っ込む点がない。&lt;/p&gt;&#xA;&lt;p&gt;一方、自分の業務としては、最近は調整業務が多くなりコードを書く時間が減る一方なので、近々自分の方向性をちゃんと決めてどっちに向かうかを明示しないとなぁと思っているところです。やりたくないことをやっててもモチベーションは上がらないし、回りの人にいらん迷惑をかけるだけだし。ただ、どうしてもマネジメントをやっていた方が給料は多くなる傾向があるので（一般的にですよ）、正直そこだけが悩ましいのですが。&lt;/p&gt;&#xA;&lt;p&gt;個人的には毎年何かしら新しいことをやれたらいいと思っているので、今年はPython以外の何かに深く取り組んでいこうと思っている所存です。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>rlwrapを使ってmysqlコマンドのプロンプトに色をつける</title>
				<link>https://journal.lampetty.net/posts/wp/434/</link>
				<pubDate>Sat, 10 Dec 2011 23:12:43 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/434/</guid>
				<description>&lt;p&gt;どうもこんにちは。北海道に旅行中でこの記事は札幌のホテルから書いている &lt;a href=&#34;http://twitter.com/#!/oinume&#34;&gt;oinume&lt;/a&gt; です。&lt;a href=&#34;http://atnd.org/events/22528&#34;&gt;MySQL Casual Advent Calendar&lt;/a&gt;も11日目になりました。「MySQL Casualが全然カジュアルじゃない！」という意見をよく耳にするので、今日はウルトラカジュアルなエントリーを書こうと思います。&lt;/p&gt;&#xA;&lt;h3 id=&#34;はじめに&#34;&gt;はじめに&lt;/h3&gt;&#xA;&lt;p&gt;MySQLを使って開発をしていると、本番と開発用サーバの見分けがつかずに、間違って本番で重いクエリを発行しちゃったりします。そういうオペミスを少しでも防ぐために「本番環境ではmysqlコマンドのプロンプトの色を変える」という技を紹介したいと思います。&lt;/p&gt;&#xA;&lt;h3 id=&#34;rlwrap&#34;&gt;rlwrap&lt;/h3&gt;&#xA;&lt;p&gt;紹介といってもやり方は非常に簡単で、下記のように &lt;a href=&#34;http://utopia.knoware.nl/~hlub/rlwrap/rlwrap.html&#34;&gt;rlwrap&lt;/a&gt; というコマンドを使って mysql コマンドを実行します。&lt;/p&gt;&#xA;&lt;p&gt;rlwrap -a -pRED mysql -uroot&lt;/p&gt;&#xA;&lt;p&gt;するとあら不思議！MySQLのプロンプトが下記のように赤くなりました！&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/8250493@N05/6486939925/&#34; title=&#34;pydoc -g&#34;&gt;&lt;img src=&#34;http://farm8.staticflickr.com/7030/6486939925_7ffb187781.jpg&#34; alt=&#34;rlwrapでmysqlプロンプトに色をつけてみる&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;というわけで、rlwrapがインストールされているマシンであれば、下記のように .bashrc 的なファイルに書いておくことでmysqlのプロンプトを常に赤くすることができてオペミスも減らせますね！&lt;/p&gt;&#xA;&lt;p&gt;if [ -x /usr/bin/rlwrap ]; then&lt;/p&gt;&#xA;&lt;p&gt;alias mysql=&#39;/usr/bin/rlwrap -a -pRED mysql&#39;&lt;/p&gt;&#xA;&lt;p&gt;fi&lt;/p&gt;&#xA;&lt;p&gt;ちなみに rlwrap は Debian(Ubuntu) であれば apt でインストールできます。&lt;/p&gt;&#xA;&lt;p&gt;sudo aptitude install rlwrap&lt;/p&gt;&#xA;&lt;p&gt;CentOSの場合はepelリポジトリが追加されていれば yum でインストールできます。&lt;/p&gt;&#xA;&lt;p&gt;sudo yum install rlwrap&lt;/p&gt;&#xA;&lt;h3 id=&#34;さいごに&#34;&gt;さいごに&lt;/h3&gt;&#xA;&lt;p&gt;このウルトラカジュアルっぷりいかがでしたでしょうか。Advent Calendar 12日目は &lt;a href=&#34;http://twitter.com/#!/ikasam_a&#34;&gt;ikasam_a&lt;/a&gt; さんです。よろしくお願いします！&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Pythonでモジュール内のクラスを抽出する</title>
				<link>https://journal.lampetty.net/posts/wp/433/</link>
				<pubDate>Sat, 26 Nov 2011 00:11:45 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/433/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;http://docs.python.org/library/inspect.html&#34;&gt;inspect&lt;/a&gt;を使えば簡単にできる。&lt;/p&gt;&#xA;&lt;p&gt;class MyClass(object):&lt;/p&gt;&#xA;&lt;p&gt;pass&lt;/p&gt;&#xA;&lt;p&gt;def func():&lt;/p&gt;&#xA;&lt;p&gt;pass&lt;/p&gt;&#xA;&lt;p&gt;な感じのmymodule.py があるとして&lt;/p&gt;&#xA;&lt;p&gt;#!/usr/bin/env python&lt;/p&gt;&#xA;&lt;p&gt;import inspect&lt;/p&gt;&#xA;&lt;p&gt;import mymodule&lt;/p&gt;&#xA;&lt;p&gt;for name, member in inspect.getmembers(mymodule):&lt;/p&gt;&#xA;&lt;p&gt;if inspect.isclass(member):&lt;/p&gt;&#xA;&lt;p&gt;print &amp;quot;%s is class.&amp;quot; % name&lt;/p&gt;&#xA;&lt;p&gt;みたいにやれば mymodule からクラスだけ抜き出せる。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://docs.python.org/library/inspect.html&#34;&gt;inspect&lt;/a&gt;というモジュールはリンク先のマニュアルをざっと見てもらえばわかるように、モジュールやクラスや関数のメタ情報を色々取れるので超絶便利である。これは本当にすごい。&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]4048686291[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>uWSGI&#43;virtualenv&#43;Flask</title>
				<link>https://journal.lampetty.net/posts/wp/430/</link>
				<pubDate>Sat, 19 Nov 2011 11:11:17 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/430/</guid>
				<description>&lt;p&gt;Pythonで今一番熱そうなWSGIコンテナの&lt;a href=&#34;http://projects.unbit.it/uwsgi/&#34;&gt;uWSGI&lt;/a&gt;というものをインストールしてみたんだけど、&lt;a href=&#34;http://www.virtualenv.org/en/latest/index.html&#34;&gt;virtualenv&lt;/a&gt;と組み合わせた時にちょっとはまったのでメモ。&lt;/p&gt;&#xA;&lt;h3 id=&#34;前提&#34;&gt;前提&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Pythonは2.6&lt;/li&gt;&#xA;&lt;li&gt;virtualenv(wrapper)を使って /usr/local/virtualenvs 配下に flask という環境を作っている&lt;/li&gt;&#xA;&lt;li&gt;flask には Flask や Jinja2 などアプリの実行に必要なものがインストールされている&lt;/li&gt;&#xA;&lt;li&gt;実行するアプリは /var/www/wiki-converter にディプロイされている(&lt;a href=&#34;https://github.com/oinume/wiki-converter&#34;&gt;wiki-converterのソース&lt;/a&gt;)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;uwsgiのインストール&#34;&gt;uWSGIのインストール&lt;/h3&gt;&#xA;&lt;p&gt;$ workon flask&#xA;$ pip install uwsgi&lt;/p&gt;&#xA;&lt;p&gt;でいける。&lt;/p&gt;&#xA;&lt;h3 id=&#34;uwsgiの起動&#34;&gt;uWSGIの起動&lt;/h3&gt;&#xA;&lt;p&gt;まずは本格的なアプリを起動する前に&lt;a href=&#34;http://projects.unbit.it/uwsgi/wiki/Quickstart&#34;&gt;Quickstart&lt;/a&gt;に書いてあるhello world的なものを試しみる。&lt;/p&gt;&#xA;&lt;p&gt;# /var/www/hello.py&#xA;def application(env, start_response):&#xA;start_response(&#39;200 OK&#39;, [(&#39;Content-Type&#39;,&#39;text/html&#39;)])&#xA;return &amp;quot;Hello World&amp;quot;&lt;/p&gt;&#xA;&lt;p&gt;起動&lt;/p&gt;&#xA;&lt;p&gt;$ uwsgi --http :9090 --wsgi-file /var/www/hello.py&lt;/p&gt;&#xA;&lt;p&gt;これでブラウザから localhost:9090 にアクセスして&amp;quot;Hello World&amp;quot;が表示されればうまくいっている。&lt;/p&gt;&#xA;&lt;p&gt;次はFlaskアプリで試してみる。&lt;/p&gt;&#xA;&lt;p&gt;$ uwsgi --http :9090 -H /usr/local/virtualenvs/flask --python-path /var/www/wiki-converter -w wiki_converter:app&lt;/p&gt;&#xA;&lt;p&gt;で起動できる。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;-H でvirtualenv な環境のディレクトリを指定&lt;/li&gt;&#xA;&lt;li&gt;--python-pathにアプリがあるディレクトリを指定&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;しているのがミソ。-Hがない場合 flask が見つからなくて&lt;/p&gt;&#xA;&lt;p&gt;ImportError: No module named flask&#xA;unable to load app mountpoint&lt;/p&gt;&#xA;&lt;p&gt;というエラーが出てuwsgiがうまく起動できないので注意！&lt;/p&gt;&#xA;&lt;p&gt;なお、uWSGIはnginxと組み合わせてよく使われるらしい。nginxとの組み合わせについては&lt;a href=&#34;http://taichino.com/engineer-life/linux/2170&#34;&gt;CentOSでnginx + uwsgi + Djangoを試してみた « taichino.com:&lt;/a&gt;が詳しい。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>へろぅわーるど</title>
				<link>https://journal.lampetty.net/posts/20111108-1821/</link>
				<pubDate>Tue, 08 Nov 2011 18:21:14 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/20111108-1821/</guid>
				<description>&lt;p&gt;ぼくはまちちゃんじゃないよ！&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>pydoc -g でモジュールのドキュメントが読める</title>
				<link>https://journal.lampetty.net/posts/wp/428/</link>
				<pubDate>Fri, 14 Oct 2011 17:10:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/428/</guid>
				<description>&lt;p&gt;Shellで&lt;/p&gt;&#xA;&lt;p&gt;$ pydoc -g&lt;/p&gt;&#xA;&lt;p&gt;ってやったら↓のようなダイアログが出てきて&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/8250493@N05/6243690687/&#34; title=&#34;pydoc -g&#34;&gt;&lt;img src=&#34;http://farm7.static.flickr.com/6180/6243690687_ff345a423f.jpg&#34; alt=&#34;pydoc -g&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&amp;quot;open browser&amp;quot; クリックしたら、ブラウザで標準モジュールやインストールされているモジュールのドキュメントが読めましたとさ。Pythonすげー。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/8250493@N05/6243690791/&#34; title=&#34;pydoc -g でモジュールのドキュメントが読める&#34;&gt;&lt;img src=&#34;http://farm7.static.flickr.com/6177/6243690791_11ebc31d8a_b.jpg&#34; alt=&#34;pydoc -g でモジュールのドキュメントが読める&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]4873112761[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>SQLAlchemyでMySQL独自のDDL方言を使う</title>
				<link>https://journal.lampetty.net/posts/wp/427/</link>
				<pubDate>Wed, 14 Sep 2011 14:09:43 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/427/</guid>
				<description>&lt;p&gt;例えばDDLでBIGINT使いたい場合は下記のように sqlalchemy.dialects.mysql から import する。&lt;/p&gt;&#xA;&lt;p&gt;あと engine = InnoDB したい場合は __table_args__ を使うらしい。詳細は&lt;a href=&#34;http://www.sqlalchemy.org/docs/dialects/mysql.html&#34;&gt;SQLAlchemyのドキュメント&lt;/a&gt;を参照。&lt;/p&gt;&#xA;&lt;p&gt;from sqlalchemy import Column, Unicode&lt;/p&gt;&#xA;&lt;p&gt;from sqlalchemy.dialects.mysql import BIGINT&lt;/p&gt;&#xA;&lt;p&gt;from sqlalchemy.ext.declarative import declarative_base&lt;/p&gt;&#xA;&lt;p&gt;Base = declarative_base()&lt;/p&gt;&#xA;&lt;p&gt;class User(Base):&lt;/p&gt;&#xA;&lt;p&gt;__tablename__ = &#39;user&#39;&lt;/p&gt;&#xA;&lt;p&gt;__table_args__ = { &#39;mysql_engine&#39;:&#39;InnoDB&#39; }&lt;/p&gt;&#xA;&lt;p&gt;id = Column(BIGINT, primary_key = True, server_default = &#39;0&#39;)&lt;/p&gt;&#xA;&lt;p&gt;name = Column(Unicode(255), nullable = False)&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]4873112761[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Flask &#43; python-oauth2 &#43; python-twitterでTwitter APIを叩く</title>
				<link>https://journal.lampetty.net/posts/wp/426/</link>
				<pubDate>Sat, 10 Sep 2011 16:09:16 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/426/</guid>
				<description>&lt;p&gt;いろいろ面倒だった。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>JavaのString.format()とStringBuilder#append()の文字列結合速度比較</title>
				<link>https://journal.lampetty.net/posts/wp/425/</link>
				<pubDate>Sun, 04 Sep 2011 13:09:43 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/425/</guid>
				<description>&lt;p&gt;Javaで文字列を結合するときは一般的にはStringBuilderを使うけど、個人的には結合後の文字列がより直感的になるString.format() が好き。ただ、ソースを見ると明らかにString.format()は遅そうなのでベンチを取ってみた。&lt;/p&gt;&#xA;&lt;p&gt;1万回ループを実行した場合の結果は&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;StringBuilder: 76 ms&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;String.format: 615 ms&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;となってStringBuilderの方が圧倒的に速い。個人的にはLL慣れしているのもあってString.format()の方が圧倒的に見やすくて好きなんだけど、スピードが要求されるときはやっぱりStringBuilder使わないと駄目だと思った次第。&lt;/p&gt;&#xA;&lt;p&gt;ちなみに測定環境は下記。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;CPU: Intel Core i5 2.3Ghz Macbook Pro&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;OS: Mac OSX SnowLeopard&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Java: java version &amp;quot;1.6.0_26&amp;quot;, Java(TM) SE Runtime Environment (build 1.6.0_26-b03-384-10M3425), Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02-384, mixed mode)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;[tmkm-amazon]4797337206[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>MySQL Casual Talks Vol.2 で話してきた</title>
				<link>https://journal.lampetty.net/posts/wp/423/</link>
				<pubDate>Thu, 11 Aug 2011 11:08:36 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/423/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;http://togetter.com/li/172489&#34;&gt;MySQL Casual Talks Vol.2&lt;/a&gt;で20分枠をもらって話してきた！こんなに長い時間人前で話すのは初めてだったので緊張しまくりでした。話した内容は仕事(ピグ)で利用しているMySQL上で運用しているNoSQLのやり方について。MySQLの設定とかの話は一切せずJavaのコードがメインでした。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;http://www.slideshare.net/oinume/mysql-casual-talks220110809&#34; title=&#34;MySQLでNoSQL - アメーバピグでのNoSQLの実例&#34;&gt;MySQLでNoSQL - アメーバピグでのNoSQLの実例&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;View more &lt;a href=&#34;http://www.slideshare.net/&#34;&gt;presentations&lt;/a&gt; from &lt;a href=&#34;http://www.slideshare.net/oinume&#34;&gt;Kazuhiro Oinuma&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;正直、&lt;a href=&#34;http://twitter.com/#!/myfinder&#34;&gt;myfinder&lt;/a&gt;さんに声をかけられたときはどうしようかと悩んだけど、こういう経験はなかなかできないので良かったです。場数を踏むっていうのも重要ですしね。懇親会では riywo さんとシステム運用のガチトークをできたし、DeNAの人とたくさん絡めてよかったですｗ riywo さんが「MySQL Formal Talksやっても来るメンバーって変わらないよね」って言ってたのがなんともこの勉強会を象徴していて妙に印象に残っていますｗ&lt;/p&gt;&#xA;&lt;p&gt;Vol.3 があったら今度は弊社メンバーの誰かにFusion-IOの話をしてもらいたいなぁ。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>rednoseを使ってnoseの出力をわかりやすくする</title>
				<link>https://journal.lampetty.net/posts/wp/422/</link>
				<pubDate>Wed, 27 Jul 2011 17:07:50 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/422/</guid>
				<description>&lt;p&gt;下記のようにテスト結果をカラフリャにしてくれる。ただし0.2.4はテストに失敗すると&amp;quot;TypeError: enumerate() takes exactly 1 argument (2 given)&amp;quot;というエラーになるので、&lt;a href=&#34;https://github.com/oinume/rednose/commit/7244323adcf9d2366bb846fb057e260b662db0b5&#34;&gt;こんな感じで&lt;/a&gt;修正が必要。&lt;/p&gt;&#xA;&lt;h3 id=&#34;びふぉー&#34;&gt;びふぉー&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/8250493@N05/5982074936/&#34; title=&#34;rednose_before&#34;&gt;&lt;img src=&#34;http://farm7.static.flickr.com/6130/5982074936_a5bed69158.jpg&#34; alt=&#34;rednose_before&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;あふたー&#34;&gt;あふたー&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/8250493@N05/5982075050/&#34; title=&#34;rednose_after&#34;&gt;&lt;img src=&#34;http://farm7.static.flickr.com/6148/5982075050_8e583bd8b6.jpg&#34; alt=&#34;rednose_after&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]4048686291[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Pythonでファイルを読み込むスマートなやり方</title>
				<link>https://journal.lampetty.net/posts/wp/418/</link>
				<pubDate>Mon, 13 Jun 2011 13:06:59 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/418/</guid>
				<description>&lt;p&gt;結論から言うと下記が最もスマートでモダンな書き方っぽい。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;with open(&amp;#39;/tmp/test.txt&amp;#39;) as f:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    for line in f:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       print line&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;下記はファイルの中味が全部メモリに乗っちゃうから危険。&lt;/p&gt;&#xA;&lt;p&gt;f = open(&#39;/tmp/test.txt&#39;)&#xA;for line in f.readlines():&#xA;print line&#xA;f.close()&lt;/p&gt;&#xA;&lt;h3 id=&#34;まとめイテレータ&#34;&gt;まとめ(イテレータ)&lt;/h3&gt;&#xA;&lt;p&gt;for line in f:&#xA;print line&lt;/p&gt;&#xA;&lt;p&gt;という書き方ができるのはfileが__iter__()とnext()を実装しているおかげ。詳しくは&lt;a href=&#34;http://www.python.org/dev/peps/pep-0234/&#34;&gt;PEP-234&lt;/a&gt;に詳しく書いてある。 &lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4797371595/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/51uQpDtF%2BdL._SL160_.jpg&#34; alt=&#34;みんなのPython 第3版&#34; loading=&#34;lazy&#34; title=&#34;みんなのPython 第3版&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4797371595/kazzhomeunixo-22/&#34;&gt;みんなのPython 第3版&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: 柴田淳&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: ソフトバンククリエイティブ&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2012/08/29&lt;/li&gt;&#xA;&lt;li&gt;メディア: 単行本&lt;/li&gt;&#xA;&lt;li&gt;購入: 1人 クリック: 13回&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4797371595/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (39件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>自宅サーバからso-netのSMTPにリレーする</title>
				<link>https://journal.lampetty.net/posts/wp/417/</link>
				<pubDate>Sun, 12 Jun 2011 14:06:35 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/417/</guid>
				<description>&lt;p&gt;そういえばISPをso-netに変えてからSMTPの設定変更してなかったのでメモ。&lt;/p&gt;&#xA;&lt;p&gt;まずは /etc/postfix/main.cf に以下を追記。&lt;/p&gt;&#xA;&lt;p&gt;relayhost = [mail.so-net.ne.jp]:587&lt;/p&gt;&#xA;&lt;p&gt;smtp_sasl_type = cyrus&lt;/p&gt;&#xA;&lt;p&gt;smtp_sasl_auth_enable = yes&lt;/p&gt;&#xA;&lt;p&gt;smtp_sasl_password_maps = hash:/etc/postfix/so-net_password&lt;/p&gt;&#xA;&lt;p&gt;smtp_sasl_security_options = noanonymous&lt;/p&gt;&#xA;&lt;p&gt;smtp_sasl_mechanism_filter = PLAIN&lt;/p&gt;&#xA;&lt;p&gt;/etc/postfix/so-net_passwordはこんな感じ。&lt;/p&gt;&#xA;&lt;p&gt;[mail.so-net.ne.jp]:587 @.so-net.ne.jp:&lt;/p&gt;&#xA;&lt;p&gt;$ sudo chmod 640 /etc/postfix/so-net_password&lt;/p&gt;&#xA;&lt;p&gt;$ sudo postmap /etc/postfix/so-net_password&lt;/p&gt;&#xA;&lt;p&gt;$ sudo /etc/init.d/postfix restart&lt;/p&gt;&#xA;&lt;p&gt;でおｋ。あとはメール送信のテストする。&lt;/p&gt;&#xA;&lt;p&gt;echo test | mail *****@gmail.com&lt;/p&gt;&#xA;&lt;p&gt;これでメールが送られていれば成功。&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]4873111951[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>iPhone4で読書のススメ</title>
				<link>https://journal.lampetty.net/posts/wp/415/</link>
				<pubDate>Tue, 07 Jun 2011 12:06:38 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/415/</guid>
				<description>&lt;p&gt;最近PDF化した技術書をiPhone4で読むようになった。最初は全部iPadに入れてiPadを持ち運ぼうと思っていたんだけど&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;iPadは意外と重い&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;電車の中でかばんから出すのがめんどい&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;iPhoneだったら常に持ち歩いているのでどこでも本が読める&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;ということでiPhone4で技術書を読むようになった。で、これが意外と読める。なんといっても解像度が高いので文字が小さくてもそこまで目が疲れないし、すぐポケットから出して読めるので、5分ぐらいのちょっとした待ち時間でも読書できるのが大きい。&lt;/p&gt;&#xA;&lt;p&gt;というわけで、最近技術書を読むペースが上がってきた。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>logbackでJavaVM起動時にログレベルを指定する</title>
				<link>https://journal.lampetty.net/posts/wp/416/</link>
				<pubDate>Tue, 07 Jun 2011 12:06:20 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/416/</guid>
				<description>&lt;p&gt;[permalink id=413]logback-test.xmlを使ってログレベルを変更する[/permalink]のエントリでlogback-test.xmlを用意すればこっちが先にロードされるので、logback.xmlより優先されていいよね的なことを書いた。で、こういうログレベルってJavaVM起動時に自由に指定できるとテストを実行する時によりいいよなぁと思ったので調べてみた。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://logback.qos.ch/faq.html#overrideFromCL&#34;&gt;Logback FAQ - How can I disable logging from the command line?&lt;/a&gt;に詳しく書いてある。前回の例を使うとこんな感じ。&lt;/p&gt;&#xA;&lt;p&gt;%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n&lt;/p&gt;&#xA;&lt;p&gt;で、下記のシンプルなサンプルコードをEclipseで実行する。実行する時の VM arguments に&lt;/p&gt;&#xA;&lt;p&gt;-Droot-level=info&lt;/p&gt;&#xA;&lt;p&gt;を指定するとログレベルは info になるし、何も指定しないと debug になる。&lt;/p&gt;&#xA;&lt;p&gt;package net.lampetty.samples;&lt;/p&gt;&#xA;&lt;p&gt;import org.slf4j.Logger;&lt;/p&gt;&#xA;&lt;p&gt;import org.slf4j.LoggerFactory;&lt;/p&gt;&#xA;&lt;p&gt;public class LogbackSample1 {&lt;/p&gt;&#xA;&lt;p&gt;private static final Logger log =&lt;/p&gt;&#xA;&lt;p&gt;LoggerFactory.getLogger(LogbackSample1.class);&lt;/p&gt;&#xA;&lt;p&gt;public static void main(String[] args) {&lt;/p&gt;&#xA;&lt;p&gt;log.debug(&amp;quot;debug message&amp;quot;);&lt;/p&gt;&#xA;&lt;p&gt;log.info(&amp;quot;info message&amp;quot;);&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;p&gt;logback.xmlには変数置換(Variable Substitution)の機能があってShellみたく変数を埋め込める。${root-level:-debug} に書くと root-level が定義されていない場合は debug をデフォルト値として適用する、という意味(まさにShell)。&lt;/p&gt;&#xA;&lt;p&gt;これでログレベルを自由自在に設定できる。&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]4797327030[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>logback-test.xmlを使ってログレベルを変更する</title>
				<link>https://journal.lampetty.net/posts/wp/413/</link>
				<pubDate>Sun, 05 Jun 2011 10:06:17 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/413/</guid>
				<description>&lt;p&gt;Javaにlogbackというlog4jに代わるロギングライブラリがあって、これのちょっとしたTIPS。&lt;/p&gt;&#xA;&lt;p&gt;本番環境ではなく、ローカルマシンでの開発時のアプリケーションのlogback.xmlでは、下記のようにログレベルをdebugにしているとする。&lt;/p&gt;&#xA;&lt;p&gt;%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n&lt;/p&gt;&#xA;&lt;p&gt;で、例えばDBへのクエリをdebugレベルでログ出力している場合、人によっては「DBのクエリの出力はうざいから止めたい」というケースがたまにある。logback.xmlでレベルをdebug -&amp;gt; infoにしてもいいんだけど、間違ってコミットしちゃった場合に回りの人に迷惑がかかる。そういう場合はCLASSPATHが通っているところに logback-test.xml というファイルを作っておいて、上のXMLのlevelの部分を debug -&amp;gt; info にする。&lt;/p&gt;&#xA;&lt;p&gt;これでlogback.xmlを直接編集しなくてもアプリケーションのログレベルをinfoにできる。具体的には&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;logbackはまずはCLASSPATH内にlogback-test.xmlがあればロードを試みる&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;ない場合はlogback.xmlをロードを試みる&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;という仕様になっているので(&lt;a href=&#34;http://logback.qos.ch/manual/joran.html#auto_configuration&#34;&gt;参考: Chapter3: Logback configuration &amp;amp; Joran&lt;/a&gt;)、logback-test.xml作るとこっちを先に読んでくれるというわけ。&lt;/p&gt;&#xA;&lt;p&gt;これで自分の見たい情報にフォーカスできる。でも絶対もっとうまいやり方がありそう...&lt;/p&gt;&#xA;&lt;h3 id=&#34;おまけ&#34;&gt;おまけ&lt;/h3&gt;&#xA;&lt;p&gt;なお、上の参考リンクに「Maven使ってて src/test/resources/ 配下の logback-test.xml は artfifactからは除外される」と書いてあったんだけど、Maven 2.2.1で試した限り除外されなかった。なんでだろう...&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]4894717166[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>ブログのMySQLを5.1から5.5にバージョンアップ</title>
				<link>https://journal.lampetty.net/posts/wp/412/</link>
				<pubDate>Fri, 03 Jun 2011 16:06:39 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/412/</guid>
				<description>&lt;p&gt;5.5ってどうなんだろう？と思ったので試しにこのブログのMySQLを5.1 -&amp;gt; 5.5にしてみた。&lt;/p&gt;&#xA;&lt;p&gt;tar.gz のバイナリを取ってきて /usr/local/mysql-5.5.13-linux-2.6-i686 に展開して /usr/local/mysql にsymlink (バージョンアップに失敗したときにすぐに戻せるように)。あとはstop start して起動するだけ。&lt;/p&gt;&#xA;&lt;p&gt;/usr/local/mysql/bin/mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory&lt;/p&gt;&#xA;&lt;p&gt;って言われるので、libaioをインストール(ubuntu)&lt;/p&gt;&#xA;&lt;p&gt;$ sudo aptitude install libaio&lt;/p&gt;&#xA;&lt;p&gt;$ sudo /sbin/ldconfig&lt;/p&gt;&#xA;&lt;p&gt;もう1回起動。今度は&lt;/p&gt;&#xA;&lt;p&gt;110604 1:16:45 [ERROR] /usr/local/mysql/bin/mysqld: unknown variable &#39;default-table-type=InnoDB&#39;&lt;/p&gt;&#xA;&lt;p&gt;って怒られる。どうやら default-table-type は使えなくなったらしい。&lt;/p&gt;&#xA;&lt;p&gt;default-storage-engine = InnoDB&lt;/p&gt;&#xA;&lt;p&gt;としたら無事起動。&lt;/p&gt;&#xA;&lt;p&gt;最後に&lt;/p&gt;&#xA;&lt;p&gt;# /usr/local/mysql/bin/mysql_upgrade&lt;/p&gt;&#xA;&lt;p&gt;して完了。今のところ無問題。&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]4774142948[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Emacsでetags関連のキーバインドを変えた</title>
				<link>https://journal.lampetty.net/posts/wp/411/</link>
				<pubDate>Sun, 29 May 2011 14:05:04 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/411/</guid>
				<description>&lt;p&gt;Emacsのタグジャンプ系のキーバインドが M - . とかであまりにも打ちにくいので変えた。&lt;/p&gt;&#xA;&lt;p&gt;;; etags&lt;/p&gt;&#xA;&lt;p&gt;(require &#39;etags)&lt;/p&gt;&#xA;&lt;p&gt;(global-set-key &amp;quot;C-cj&amp;quot; &#39;find-tag)&lt;/p&gt;&#xA;&lt;p&gt;(global-set-key &amp;quot;C-cb&amp;quot; &#39;pop-tag-mark)&lt;/p&gt;&#xA;&lt;p&gt;(global-set-key &amp;quot;C-cn&amp;quot; &#39;(lambda () (interactive) (find-tag last-tag 1)))&lt;/p&gt;&#xA;&lt;p&gt;動作デフォルト変更後&lt;/p&gt;&#xA;&lt;p&gt;タグを探してジャンプM-.C-c j&lt;/p&gt;&#xA;&lt;p&gt;ジャンプ前に戻るM-*C-c b&lt;/p&gt;&#xA;&lt;p&gt;次の候補へ行くC-u M-.C-c n&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]4774143278[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>SIM Lock Free iPhone4＋DoCoMo SIM</title>
				<link>https://journal.lampetty.net/posts/wp/410/</link>
				<pubDate>Tue, 24 May 2011 07:05:53 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/410/</guid>
				<description>&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;auガラケー&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;SoftBankのiPhone4&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;という2台持ち状態だったのを、一念発起してSIM Lock Free iPhone4を購入してDoCoMo SIMにしてみた。そもそもガラケーは仕事で動作確認ぐらいにしか使用してないし、2台も携帯を持つことに疲れてしまったので。&lt;/p&gt;&#xA;&lt;h3 id=&#34;docomoのいいところ&#34;&gt;DoCoMoのいいところ&lt;/h3&gt;&#xA;&lt;p&gt;やっぱり電波が入る範囲が広い。都心にいる分にはあまりメリットが感じられないけど、地方に行った時のつながりやすさはすごい。&lt;/p&gt;&#xA;&lt;h3 id=&#34;docomoとsoftbankの回線速度の比較&#34;&gt;DoCoMoとSoftBankの回線速度の比較&lt;/h3&gt;&#xA;&lt;p&gt;体感的にはDoCoMo &amp;lt;-&amp;gt; SoftBank でそんなに違いは感じられない。実際に測ってみたところ、そんなに違いはなかった。&lt;/p&gt;&#xA;&lt;h4 id=&#34;docomo&#34;&gt;DoCoMo&lt;/h4&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/8250493@N05/5753598563/&#34; title=&#34;DoCoMo&#34;&gt;&lt;img src=&#34;http://farm6.static.flickr.com/5229/5753598563_b49a219788.jpg&#34; alt=&#34;DoCoMo&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h4 id=&#34;softbank&#34;&gt;SoftBank&lt;/h4&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/8250493@N05/5753598483/&#34; title=&#34;SoftBank&#34;&gt;&lt;img src=&#34;http://farm3.static.flickr.com/2066/5753598483_caeccf8cf8.jpg&#34; alt=&#34;SoftBank&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;テザリング&#34;&gt;テザリング&lt;/h3&gt;&#xA;&lt;p&gt;DoCoMoだとデータ通信代として1,0395円払えばテザリングしてPCなども繋げられる(PC繋がない場合は5900円 or 5400円ぐらい)。自分はiPadやノートPCを外出先でネットに繋ぎたいのと、かつイーモバみたいな機器を別で持つのが嫌だったのでちょっと高くてもこれを使ってる。速度的には大体1Mbpsは出ているっぽいので、VPNでRemoteDesktopもなんとか使える感じ。ちなみに[permalink id=&amp;quot;409&amp;quot;]b-mobile SIMは使い物にならなかった[/permalink]。&lt;/p&gt;&#xA;&lt;h3 id=&#34;はまりそうなポイント&#34;&gt;はまりそうなポイント&lt;/h3&gt;&#xA;&lt;p&gt;DoCoMoの回線を契約するにあたって、海外版のSIM Lock Free端末を利用する場合、技適マークを表示できないと駄目らしい。iPhone4の場合はなんかしらのSIMを差してアクティベートしないとこの技適マークが表示できない。自分はたまたまb-mobileのSIMを差してアクティベートしてたので大丈夫だったけど、これははまるポイントだなと思った。SoftBankのiPhoneを持っているならそのSIM挿せばいいのかな。&lt;/p&gt;&#xA;&lt;p&gt;ちなみに技適マークは 設定→一般→情報→認証 で表示することができる。&lt;/p&gt;&#xA;&lt;h3 id=&#34;まとめ&#34;&gt;まとめ&lt;/h3&gt;&#xA;&lt;p&gt;2台持ちのストレスから解放されたのが地味に嬉しい。あとテザリングができるようになったので、他の電子機器をもっと活用できるようになった。メールや電話の着信はやはりガラケーの方が気付きやすいけど、そこはアプリで乗り切れる、、、はず、、、&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>SIM Lock Free iPhone4 &#43; b-mobile プラチナの回線速度</title>
				<link>https://journal.lampetty.net/posts/wp/409/</link>
				<pubDate>Wed, 04 May 2011 08:05:22 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/409/</guid>
				<description>&lt;p&gt;もう個人で携帯2台持ちしたくないので、iPhone4 SIM Lock Free版をヤフオクで買った。で、せっかくなのでb-mobileがどのぐらい使い物になるのか、1ヶ月分のSIMを買って試してみた。買ったのは&lt;a href=&#34;http://www.bmobile.ne.jp/sim_mp/index.html&#34;&gt;b-microSIM Platinum&lt;/a&gt;。&lt;/p&gt;&#xA;&lt;h3 id=&#34;bnr-speedtestの結果&#34;&gt;BNR SpeedTestの結果&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.musen-lan.com/speed/speed-img.html&#34;&gt;BNR スピードテスト画像読み込み版&lt;/a&gt;で回線速度を測ってみた＠東京都世田谷区某所&lt;/p&gt;&#xA;&lt;p&gt;Softbank: 838.55 kbps&lt;/p&gt;&#xA;&lt;p&gt;b-mobile: 555.51 kbps&lt;/p&gt;&#xA;&lt;p&gt;という結果に。&lt;/p&gt;&#xA;&lt;h3 id=&#34;体感的な速度&#34;&gt;体感的な速度&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;普通にテキストベースのサイトをブラウザで見てる分には気にならない&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;YouTubeで動画を見るときは、動画のサイズに応じて始まるまでの待ち時間がけっこうあるなぁという感じ&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Google Mapは2,3秒ぐらい遅れて表示される。なんとか使い物になるレベル&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;テザリングでRemote Desktopは、「Remoteでアプリケーションウィンドウを切り替えると3秒待たされる」レベル。これは無理。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;まとめ&#34;&gt;まとめ&lt;/h3&gt;&#xA;&lt;p&gt;総じて「使い物にはなりそうだけど、イライラしそうなレベル(テザリング以外)」だと感じた。Softbankの回線スピードに不満を持っている人はb-mobileじゃ駄目だと思う。というわけで自分はdocomoのパケホーダイのプラン(最大で10395円)にする予定。&lt;a href=&#34;http://www.bmobile.ne.jp/fair/index.html&#34;&gt;b-mobile Fair&lt;/a&gt;で音声通話がついてればこれが一番良かったんだけどなぁ。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Emacsでキーの割り当てを調べる</title>
				<link>https://journal.lampetty.net/posts/wp/408/</link>
				<pubDate>Sun, 01 May 2011 16:05:47 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/408/</guid>
				<description>&lt;p&gt;M-x describe-bindings でいける。よく思い出せずに苦労するのでメモ。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Linuxで容量の大きいディレクトリを調べる</title>
				<link>https://journal.lampetty.net/posts/wp/407/</link>
				<pubDate>Sun, 10 Apr 2011 00:04:52 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/407/</guid>
				<description>&lt;p&gt;# du -m /home | sort -nr | head -10&lt;/p&gt;&#xA;&lt;p&gt;で容量の大きいディレクトリTOP10を調べられる。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>MacのEclipseで「フォントが小さい」とお嘆きの方へ</title>
				<link>https://journal.lampetty.net/posts/wp/403/</link>
				<pubDate>Sun, 20 Mar 2011 15:03:35 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/403/</guid>
				<description>&lt;p&gt;解像度の高いMacのEclipseは下のようになぜかPackage Explorerのフォントが小さい。Source EditorなどはEclipse上でフォントサイズを設定することができるけど、なぜかPackage Explorerはできない。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/8250493@N05/5542818693/&#34; title=&#34;mac_eclipse_font_after&#34;&gt;&lt;img src=&#34;http://farm6.static.flickr.com/5256/5542818693_04dd116e14.jpg&#34; alt=&#34;mac_eclipse_font_after&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;んで、色々調べてたどりついたのが&lt;a href=&#34;http://hints.macworld.com/article.php?story=20070605235127186&#34;&gt;Make Eclipse use larger fonts - Mac OS X Hints&lt;/a&gt;という質問。&lt;a href=&#34;http://www.bresink.com/osx/TinkerTool.html&#34;&gt;TinkerTool&lt;/a&gt;というソフトを入れて フォント→ヘルプタグのフォントサイズを大きくすればいいらしい。&lt;/p&gt;&#xA;&lt;p&gt;こんな感じで大きくなった！これは11pt -&amp;gt; 15ptに変更した場合のもの。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/8250493@N05/5543424320/&#34; title=&#34;mac_eclipse_font_after&#34;&gt;&lt;img src=&#34;http://farm6.static.flickr.com/5132/5543424320_3d91ffcaa7.jpg&#34; alt=&#34;mac_eclipse_font_after&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;このTinkerToolというソフト、他にも色んな設定ができて便利そうな雰囲気。とりあえずMacのEclipseで「フォントサイズが小さい」とお嘆きの人はぜひ試してみてほしい。&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]489471499X[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>MySQLでデータベースの全テーブルを強制的にInnoDBに変換するPythonスクリプト</title>
				<link>https://journal.lampetty.net/posts/wp/401/</link>
				<pubDate>Mon, 21 Feb 2011 11:02:44 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/401/</guid>
				<description>&lt;p&gt;仕事でMyISAMなテーブルをInnoDBにしたかったのでこんなん書いた。&lt;/p&gt;&#xA;&lt;p&gt;$ ~/to_innodb.py -h localhost -u root mydatabase&lt;/p&gt;&#xA;&lt;p&gt;#!/usr/bin/env python&lt;/p&gt;&#xA;&lt;p&gt;# -*- coding: utf-8 -*-&lt;/p&gt;&#xA;&lt;p&gt;# INSTALL ====================&lt;/p&gt;&#xA;&lt;p&gt;# $ sudo easy_install argparse&lt;/p&gt;&#xA;&lt;p&gt;# $ sudo easy_install mysql-python&lt;/p&gt;&#xA;&lt;p&gt;import argparse&lt;/p&gt;&#xA;&lt;p&gt;import MySQLdb&lt;/p&gt;&#xA;&lt;p&gt;import os&lt;/p&gt;&#xA;&lt;p&gt;def main():&lt;/p&gt;&#xA;&lt;p&gt;# setup command line options&lt;/p&gt;&#xA;&lt;p&gt;parser = argparse.ArgumentParser(&lt;/p&gt;&#xA;&lt;p&gt;prog = os.path.basename(__file__),&lt;/p&gt;&#xA;&lt;p&gt;description = &#39;Convert all tables to InnoDB&#39;,&lt;/p&gt;&#xA;&lt;p&gt;conflict_handler = &#39;resolve&#39;&lt;/p&gt;&#xA;&lt;p&gt;)&lt;/p&gt;&#xA;&lt;p&gt;parser.add_argument(&lt;/p&gt;&#xA;&lt;p&gt;&#39;database&#39;, metavar=&#39;DATABASE&#39;, nargs=1,&lt;/p&gt;&#xA;&lt;p&gt;help=&#39;database name.&#39;,&lt;/p&gt;&#xA;&lt;p&gt;)&lt;/p&gt;&#xA;&lt;p&gt;parser.add_argument(&lt;/p&gt;&#xA;&lt;p&gt;&#39;-h&#39;, &#39;--host&#39;, metavar=&#39;HOST&#39;, default=&#39;localhost&#39;,&lt;/p&gt;&#xA;&lt;p&gt;help=&#39;host name&#39;,&lt;/p&gt;&#xA;&lt;p&gt;)&lt;/p&gt;&#xA;&lt;p&gt;parser.add_argument(&lt;/p&gt;&#xA;&lt;p&gt;&#39;-u&#39;, &#39;--user&#39;, metavar=&#39;USER&#39;, default=&#39;root&#39;,&lt;/p&gt;&#xA;&lt;p&gt;help=&#39;user&#39;&lt;/p&gt;&#xA;&lt;p&gt;)&lt;/p&gt;&#xA;&lt;p&gt;parser.add_argument(&lt;/p&gt;&#xA;&lt;p&gt;&#39;-p&#39;, &#39;--password&#39;, metavar=&#39;PASSWORD&#39;, default=&#39;&#39;,&lt;/p&gt;&#xA;&lt;p&gt;help=&#39;password&#39;&lt;/p&gt;&#xA;&lt;p&gt;)&lt;/p&gt;&#xA;&lt;p&gt;parser.add_argument(&lt;/p&gt;&#xA;&lt;p&gt;&#39;-P&#39;, &#39;--port&#39;, metavar=&#39;PORT&#39;, type=int, default=3306,&lt;/p&gt;&#xA;&lt;p&gt;help=&#39;port&#39;&lt;/p&gt;&#xA;&lt;p&gt;)&lt;/p&gt;&#xA;&lt;p&gt;options = parser.parse_args()&lt;/p&gt;&#xA;&lt;p&gt;db = MySQLdb.connect(&lt;/p&gt;&#xA;&lt;p&gt;host = options.host,&lt;/p&gt;&#xA;&lt;p&gt;port = options.port,&lt;/p&gt;&#xA;&lt;p&gt;user = options.user,&lt;/p&gt;&#xA;&lt;p&gt;passwd = options.password,&lt;/p&gt;&#xA;&lt;p&gt;db = options.database[0])&lt;/p&gt;&#xA;&lt;p&gt;cursor = db.cursor()&lt;/p&gt;&#xA;&lt;p&gt;# get all table names&lt;/p&gt;&#xA;&lt;p&gt;cursor.execute(&amp;quot;SHOW TABLES&amp;quot;)&lt;/p&gt;&#xA;&lt;p&gt;for row in cursor.fetchall():&lt;/p&gt;&#xA;&lt;p&gt;table = row[0]&lt;/p&gt;&#xA;&lt;p&gt;print(&amp;quot;--- %s ---&amp;quot; % (table))&lt;/p&gt;&#xA;&lt;p&gt;cursor.execute(&amp;quot;ALTER TABLE %s ENGINE=InnoDB&amp;quot; % (table))&lt;/p&gt;&#xA;&lt;p&gt;cursor.close()&lt;/p&gt;&#xA;&lt;p&gt;db.close()&lt;/p&gt;&#xA;&lt;p&gt;if __name__ == &#39;__main__&#39;:&lt;/p&gt;&#xA;&lt;p&gt;main()&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]4873113938[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>wgetでURLにアクセスできるか簡易的にチェックする</title>
				<link>https://journal.lampetty.net/posts/wp/400/</link>
				<pubDate>Wed, 16 Feb 2011 15:02:51 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/400/</guid>
				<description>&lt;p&gt;Webサーバがちゃんと立ち上がったかどうか、URLにアクセスしてチェックしたいので。&lt;/p&gt;&#xA;&lt;p&gt;wget -o /dev/null -O - &lt;a href=&#34;http://twitter.com/&#34;&gt;http://twitter.com/&lt;/a&gt; &amp;gt; /dev/null&lt;/p&gt;&#xA;&lt;p&gt;if [ $? -eq 0 ] ; then&lt;/p&gt;&#xA;&lt;p&gt;echo &amp;quot;OK&amp;quot;&lt;/p&gt;&#xA;&lt;p&gt;else&lt;/p&gt;&#xA;&lt;p&gt;echo &amp;quot;Failure!!&amp;quot;&lt;/p&gt;&#xA;&lt;p&gt;fi&lt;/p&gt;&#xA;&lt;p&gt;な感じかなぁ。&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]4822282090[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>2010年のまとめ</title>
				<link>https://journal.lampetty.net/posts/wp/398/</link>
				<pubDate>Fri, 31 Dec 2010 12:12:46 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/398/</guid>
				<description>&lt;h3 id=&#34;仕事&#34;&gt;仕事&lt;/h3&gt;&#xA;&lt;p&gt;思い返してみると、昨年の12月に諸事情があって転職活動をせざるを得なくなって、今年の2月までは転職活動してたんですね。最終的には緑色の会社に行くことに決めたのですが、自分が思っていたより遥かに自由にやらせてくれる会社だったので、すごくあたりくじを引いた気分です。上場してるはずなのにこんな自由でいいんだろうか、と思ってしまうレベル。あと、一緒に仕事をしている人は何に対しても前向きな人が多いので、相変わらず回りの人にも恵まれています。&lt;/p&gt;&#xA;&lt;p&gt;関わっているサービスは、事業的には非常に成功しているので自分の出る幕がないのですが、サーバの管理や裏側の仕組みはまだまだ改善の余地ありなので、来年1年間かけてしっかりと直していきたいところ。ただ、その部分に注力できるような、アプリのコードを書けてサーバ運用もある程度わかるエンジニアが圧倒的に少ない！ので、もしそういう人が転職活動を考えていればぜひぜひ話をしたいです:-)&lt;/p&gt;&#xA;&lt;h3 id=&#34;プログラミング言語&#34;&gt;プログラミング言語&lt;/h3&gt;&#xA;&lt;p&gt;プログラミング言語的には Perl から Java になりました。Javaは言語としてはしっかりしているのですが、やっぱりLLのお手軽さを経験してしまうとかなり堅苦しい印象が強いです。あとはJVMの運用が大変(GC回りだったり、シグナル使えなかったり)。そして運用系のツールはPythonで行くことを決めて、社内で草の根Python勉強会を始められたのが良かった。毎週誰かがプログラムを書いてきてそれを発表するというスタンスでやっているのですが、自分一人だったら絶対に途中でくじけていたことでしょう。PythonはPerlと比べると若干制約が多い言語だという印象ですが、標準ライブラリが充実しているのが好きです。Pythonのいいところはまた別エントリでまとめたいところ。&lt;/p&gt;&#xA;&lt;h3 id=&#34;データベース&#34;&gt;データベース&lt;/h3&gt;&#xA;&lt;p&gt;データベースは相変わらずMySQLで、前職の経験もだいぶ生きています。やっぱり運用回りの知識がある程度ないとインフラの人と話ができないので。社内ではMongoDBの事例も出て来ているので、来年はMongoDBを真面目に勉強したいところです。&lt;/p&gt;&#xA;&lt;h3 id=&#34;勉強会とか&#34;&gt;勉強会とか&lt;/h3&gt;&#xA;&lt;p&gt;社外の勉強会では、&lt;a href=&#34;http://sites.google.com/site/qpstudy/&#34;&gt;qpstudy&lt;/a&gt;の最初の回で&lt;a href=&#34;http://www.slideshare.net/oinume/qpstudy01-rsync-4168853&#34;&gt;rsyncのちょっとイイ話&lt;/a&gt;というタイトルで発表したり、&lt;a href=&#34;http://d.hatena.ne.jp/oranie/20101104/1288843694&#34;&gt;study2study のWebサーバ勉強会 #1&lt;/a&gt;でちらっと発表したり。自分にはまだまだ創意工夫が足りないので、すごく他の人の役に立つような話はできないのですが、来年は&lt;a href=&#34;https://github.com/oinume/tomahawk&#34;&gt;tomahawk&lt;/a&gt;の布教活動を進めていきたいなぁ。&lt;/p&gt;&#xA;&lt;h3 id=&#34;来年に向けて&#34;&gt;来年に向けて&lt;/h3&gt;&#xA;&lt;p&gt;全然まとまってないのですが、来年はPythonやPerlなどのLLを引き続き頑張っていくのと、AppEngineが良さそうなので自分で何かサービス作りたいです。エンジニアとしてのキャリアパスは相変わらずよくわかりません。というわけで皆さん1年間ありがとうございました。また来年！&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>AppEngine for PythonでImportError: No module named cgiとなる場合の対処方法</title>
				<link>https://journal.lampetty.net/posts/wp/397/</link>
				<pubDate>Wed, 29 Dec 2010 11:12:36 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/397/</guid>
				<description>&lt;p&gt;おそらくvirtualenv使ってると発生するのだと思うのですが、AppEngine for Pythonで下記のようなエラーがでました。&lt;/p&gt;&#xA;&lt;p&gt;File &amp;quot;/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/webapp/__init__.py&amp;quot;, line 61, in&lt;/p&gt;&#xA;&lt;p&gt;import cgi&lt;/p&gt;&#xA;&lt;p&gt;ImportError: No module named cgi&lt;/p&gt;&#xA;&lt;p&gt;/usr/local/bin/dev_appserver.py の1行目のshebangを&lt;/p&gt;&#xA;&lt;p&gt;#!/usr/bin/env/python&lt;/p&gt;&#xA;&lt;p&gt;↓&lt;/p&gt;&#xA;&lt;p&gt;#!/usr/bin/python&lt;/p&gt;&#xA;&lt;p&gt;にしたら直りました。&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]4873114756[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Tomcatのスレッド数をグラフ化するMunin plugin</title>
				<link>https://journal.lampetty.net/posts/wp/395/</link>
				<pubDate>Sun, 19 Dec 2010 04:12:05 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/395/</guid>
				<description>&lt;p&gt;会社で使おうと思っていたTomcatのスレッド数をグラフ化するMunin pluginがあるのですが、XML::Simpleに依存していて「Munin pluginのためにわざわざPerlモジュールインストールするのもなぁ」と思ったので、ついかっとなってXMLをパースするところを正規表現で書き直してみました。ついでにmaxThreadsも表示するようにしたり、微調整もしています。プラグインは&lt;a href=&#34;https://github.com/oinume/munin-plugins/blob/master/tomcat_threads&#34;&gt;github&lt;/a&gt;に上げてあります。&lt;/p&gt;&#xA;&lt;p&gt;なんでXML::Simpleを使っていたかというとTomcatのstatus画面がXMLで出力されているからなのですが、頑張ればこのぐらいのXMLは正規表現でパースできるということが実践できて良かったです。&lt;/p&gt;&#xA;&lt;p&gt;↓は実際のスレッド数のグラフ。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/8250493@N05/5273139214/&#34; title=&#34;munin_tomcat_threads&#34;&gt;&lt;img src=&#34;http://farm6.static.flickr.com/5042/5273139214_0903e10d9a.jpg&#34; alt=&#34;munin_tomcat_threads&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]4873113881[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>PythonからGrowlを利用する</title>
				<link>https://journal.lampetty.net/posts/wp/394/</link>
				<pubDate>Fri, 10 Dec 2010 12:12:32 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/394/</guid>
				<description>&lt;p&gt;GrowlというMacの通知インターフェースをPythonから使ってみたというお話。&lt;/p&gt;&#xA;&lt;h3 id=&#34;growl-python-bindingをインストール&#34;&gt;Growl Python bindingをインストール&lt;/h3&gt;&#xA;&lt;p&gt;まずは&lt;a href=&#34;http://growl.info/&#34;&gt;Growl本家&lt;/a&gt;からGrowl SDKをダウンロードしてダブルクリックし、&lt;/p&gt;&#xA;&lt;p&gt;$ cd /Volumes/Growl 1.2.1 SDK/Bindings/python&lt;/p&gt;&#xA;&lt;p&gt;$ sudo python setup.py install&lt;/p&gt;&#xA;&lt;p&gt;でインストールします。そしてシステム環境設定 -&amp;gt; Growl のネットワークタブをクリックして&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;受信される通知を聞く&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;リモートアプリケーション登録を許可&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;の2つを有効にします。そしてGrowlを再起動しておきます。&lt;/p&gt;&#xA;&lt;h3 id=&#34;スクリプトを書いて実行&#34;&gt;スクリプトを書いて実行&lt;/h3&gt;&#xA;&lt;p&gt;あとは下記のようなコードを書いて&lt;/p&gt;&#xA;&lt;p&gt;$ python growl_sample.py&lt;/p&gt;&#xA;&lt;p&gt;として実行するとGrowlから通知が来ます。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/8250493@N05/5248957870/&#34; title=&#34;growl_sample&#34;&gt;&lt;img src=&#34;http://farm6.static.flickr.com/5286/5248957870_7d3edc4eca_m.jpg&#34; alt=&#34;growl_sample&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;#!/usr/bin/env python&lt;/p&gt;&#xA;&lt;p&gt;# coding: utf8&lt;/p&gt;&#xA;&lt;p&gt;import Growl&lt;/p&gt;&#xA;&lt;p&gt;g = Growl.GrowlNotifier(&lt;/p&gt;&#xA;&lt;p&gt;applicationName = &#39;GrowlPython&#39;,&lt;/p&gt;&#xA;&lt;p&gt;notifications = [ &#39;Demo&#39; ],&lt;/p&gt;&#xA;&lt;p&gt;defaultNotifications = [ 0 ],&lt;/p&gt;&#xA;&lt;p&gt;hostname = &#39;localhost&#39;,&lt;/p&gt;&#xA;&lt;p&gt;password = &#39;&#39;,&lt;/p&gt;&#xA;&lt;p&gt;)&lt;/p&gt;&#xA;&lt;p&gt;g.register()&lt;/p&gt;&#xA;&lt;p&gt;g.notify(&lt;/p&gt;&#xA;&lt;p&gt;noteType = &#39;Demo&#39;,&lt;/p&gt;&#xA;&lt;p&gt;title = &#39;hello&#39;,&lt;/p&gt;&#xA;&lt;p&gt;description = u&#39;Growlへ通知！&#39;,&lt;/p&gt;&#xA;&lt;p&gt;sticky = False&lt;/p&gt;&#xA;&lt;p&gt;)&lt;/p&gt;&#xA;&lt;h3 id=&#34;余談&#34;&gt;余談&lt;/h3&gt;&#xA;&lt;p&gt;最初はpypiにあるgrowl-pyというPure Pythonなモジュールを使いたかったのですが、どうもメッセージに日本語を入れるとうまく通知されなかったので純正のものを使いました。&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]4873113938[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>gitでtagを作成する</title>
				<link>https://journal.lampetty.net/posts/wp/393/</link>
				<pubDate>Thu, 02 Dec 2010 17:12:34 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/393/</guid>
				<description>&lt;p&gt;gitでのタグの作り方のメモです。&lt;/p&gt;&#xA;&lt;h3 id=&#34;tagを新しく作る&#34;&gt;tagを新しく作る&lt;/h3&gt;&#xA;&lt;p&gt;$ git tag -a 1.0.0 -m &#39;v1.0.0&#39;&lt;/p&gt;&#xA;&lt;h3 id=&#34;remoteにpushする&#34;&gt;remoteにpushする&lt;/h3&gt;&#xA;&lt;p&gt;$ git push origin 1.0.0&lt;/p&gt;&#xA;&lt;h3 id=&#34;tagを表示する&#34;&gt;tagを表示する&lt;/h3&gt;&#xA;&lt;p&gt;$ git tag&lt;/p&gt;&#xA;&lt;h3 id=&#34;tagをremoteから取得する&#34;&gt;tagをremoteから取得する&lt;/h3&gt;&#xA;&lt;p&gt;$ git fetch --tags&lt;/p&gt;&#xA;&lt;p&gt;or&lt;/p&gt;&#xA;&lt;p&gt;$ git pull --tags&lt;/p&gt;&#xA;&lt;h3 id=&#34;tagを削除する&#34;&gt;tagを削除する&lt;/h3&gt;&#xA;&lt;p&gt;$ git tag -d 1.0.0&lt;/p&gt;&#xA;&lt;p&gt;remoteにも反映させる。(タグ名に&#39;:&#39;をつける)&lt;/p&gt;&#xA;&lt;p&gt;$ git push origin :1.0.0&lt;/p&gt;&#xA;&lt;h3 id=&#34;参考&#34;&gt;参考&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://progit.org/book/ja/ch2-6.html&#34;&gt;Pro Git - Pro Git 2.6 Git の基本 タグ&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>sshで初回ログイン時に&#34;The authenticity of host &#39;host&#39; can&#39;t be established...&#34;を聞かれないようにする設定</title>
				<link>https://journal.lampetty.net/posts/wp/391/</link>
				<pubDate>Mon, 29 Nov 2010 16:11:01 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/391/</guid>
				<description>&lt;p&gt;sshで ~/.ssh/known_hosts にないマシンにアクセスする場合&lt;/p&gt;&#xA;&lt;p&gt;The authenticity of host &#39;your-host (127.0.0.1)&#39; can&#39;t be established.&#xA;RSA key fingerprint is 7f:cd:9a:d8:1d:9a:47:3b:97:e7:8e:c3:81:c8:2e:97.&#xA;Are you sure you want to continue connecting (yes/no)?&lt;/p&gt;&#xA;&lt;p&gt;と聞かれます。社内用のサーバなどの場合、そんなに厳しく接続先のマシンをチェックしなくてもよいのであれば、sshクライアント側の ~/.ssh/configに下記の設定を書くことでこれを聞かれないようにできます。&lt;/p&gt;&#xA;&lt;p&gt;host 192.168.1.*&#xA;StrictHostKeyChecking no&lt;/p&gt;&#xA;&lt;p&gt;~/.ssh/config ファイルのパーミッションは 600 じゃないと怒られるので&lt;/p&gt;&#xA;&lt;p&gt;$ chmod 600 ~/.ssh/config&lt;/p&gt;&#xA;&lt;p&gt;としておきます。これで大量のサーバに最初に初めてssh接続した時の &amp;quot;yes&amp;quot; を入力するだけの簡単な仕事から解放されます！&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>気になるiPhoneアプリをストックしておく方法</title>
				<link>https://journal.lampetty.net/posts/wp/389/</link>
				<pubDate>Wed, 03 Nov 2010 14:11:45 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/389/</guid>
				<description>&lt;p&gt;iPhoneでAppStoreでアプリを探していて「これ良さそうだけど、インストールはあとでやりたい」と思うことはありませんか？例えば容量が大きくてWiFiじゃないとダウンロードできないとか、電波が弱くてダウンロードするのに滅茶苦茶時間がかかる場合とか。&lt;/p&gt;&#xA;&lt;p&gt;自分はもともと「AppStoreでAmazonのカート的な機能があったらいいのになぁ」とよく思っていたのですが、ちょっとした工夫で気に入ったアプリをストックしておいてあとでまとめてインストールする方法を考えたので、今日はその紹介をしたいと思います。&lt;/p&gt;&#xA;&lt;p&gt;すごくざっくり言うと「AppStoreの友人に知らせる機能を使って自分のGmailアカウントにメールを送る」というただそれだけです。具体的には以下のような流れになります。Gmailを使うことが前提ですが、アドレスのエイリアスを作れて振り分けできればGmail以外でもいけます。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;まず連絡先に &lt;a href=&#34;mailto:youraccount+iphoneapp@gmail.com&#34;&gt;youraccount+iphoneapp@gmail.com&lt;/a&gt; というアドレスを登録しておきます(youraccountの部分は自身のものに置き換えてください)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Gmailのフィルタの設定でyouraccount+iphoneapp@gmail.comにメールが来たら適当なラベル(例えばiphoneapp)をつける設定をします&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;AppStoreでストックしておきたいiPhoneアプリがあったら「友人に知らせる」をクリックして1.で登録したアドレスにメールを送ります&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Gmail上のiphoneappラベルにメールが来ているので、リンクをクリックしてアプリをインストール&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;どうでしょう？これで気に入ったiPhoneアプリを忘れずに「あとでインストール」することができます。若干回りくどいですが自分はこれでアプリのインストールを忘れずにするようになりました。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>watchでコマンドの出力を監視する</title>
				<link>https://journal.lampetty.net/posts/wp/388/</link>
				<pubDate>Sun, 31 Oct 2010 14:10:48 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/388/</guid>
				<description>&lt;p&gt;Unixには watch という、n秒ごとに定期的にコマンドを実行してその出力を表示するコマンドがあります。&lt;/p&gt;&#xA;&lt;p&gt;例えば netstat -na した結果を wc で数えて現在のコネクション数を1秒ごとに表示するには&lt;/p&gt;&#xA;&lt;p&gt;$ watch -n 1 &#39;netstat -na | wc -l&#39;&lt;/p&gt;&#xA;&lt;p&gt;とやります。このコマンドを知る前までは&lt;/p&gt;&#xA;&lt;p&gt;$ while true; do netstat -na | wc -l; sleep 1; done&lt;/p&gt;&#xA;&lt;p&gt;とやっていてタイプするのが面倒だったので、かなり楽になりました。&lt;/p&gt;&#xA;&lt;p&gt;補足ですが、時系列でコマンドの出力を表示させたい場合もあるので、while true; do netstat -na | wc -l; sleep 1; done のやり方も場合によっては全然有効だと思います。&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]4797321946[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Muninの好きなところ</title>
				<link>https://journal.lampetty.net/posts/wp/387/</link>
				<pubDate>Sat, 18 Sep 2010 17:09:07 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/387/</guid>
				<description>&lt;p&gt;リソース監視ソフトウェアに&lt;a href=&#34;http://munin-monitoring.org/&#34;&gt;Munin&lt;/a&gt;というものがありますが、個人でも仕事でも使っていて割りと好きなものの一つです。どういうところがいいかというと&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;インストールが簡単ですぐ動かせる&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Munin自体は静的なHTMLファイルを生成するだけなので、Webサーバは何でもよい。自分の好きなWebサーバを使えばよい&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;リソース情報の収集は単に /etc/munin/plugins 配下のコマンドを呼び出しているだけなので、好きな言語でプラグイン(コマンド)を作れる&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;かなぁと。&lt;/p&gt;&#xA;&lt;p&gt;ただ一方で、管理するサーバの台数が100台規模になってくるとグラフの生成に時間がかかる(ものによっては10分以上)という問題があるので、最近は代替できるソフトウェアを模索中です。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Perl開発環境としてのEmacsの設定</title>
				<link>https://journal.lampetty.net/posts/wp/384/</link>
				<pubDate>Sat, 21 Aug 2010 16:08:13 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/384/</guid>
				<description>&lt;p&gt;最近社内でvim勉強会があったりして「vimもいいなぁ」と思っていたのですが、やっぱりキーバインドに慣れなくってEmacsに戻ってきました。最近EmacsでPerl関連の設定を見なおしたので、メモがてら書いておきます。自分がPerlのコードを書くときに使っているelispは以下の5つです。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;cperl-mode&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;flymake + set-perl5lib&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;anything + auto-complete + perl-completion&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;yasnippet&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;これらを一つ一つ紹介していきます。&lt;/p&gt;&#xA;&lt;h3 id=&#34;cperl-mode&#34;&gt;cperl-mode&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.emacswiki.org/emacs/CPerlMode&#34;&gt;cperl-mode&lt;/a&gt; はこんな感じで設定しています。とりあえず色付けと適切なインデントがなされればいいかなという感じ。&lt;/p&gt;&#xA;&lt;p&gt;(autoload &#39;cperl-mode &amp;quot;cperl-mode&amp;quot; &amp;quot;alternate mode for editing Perl programs&amp;quot; t)&lt;/p&gt;&#xA;&lt;p&gt;(add-to-list &#39;auto-mode-alist &#39;(&amp;quot;\.\([pP][Llm]\|al\|t\|cgi\)\&#39;&amp;quot; . cperl-mode))&lt;/p&gt;&#xA;&lt;p&gt;(add-to-list &#39;interpreter-mode-alist &#39;(&amp;quot;perl&amp;quot; . cperl-mode))&lt;/p&gt;&#xA;&lt;p&gt;(add-to-list &#39;interpreter-mode-alist &#39;(&amp;quot;perl5&amp;quot; . cperl-mode))&lt;/p&gt;&#xA;&lt;p&gt;(add-to-list &#39;interpreter-mode-alist &#39;(&amp;quot;miniperl&amp;quot; . cperl-mode))&lt;/p&gt;&#xA;&lt;p&gt;;;; cperl-mode is preferred to perl-mode&lt;/p&gt;&#xA;&lt;p&gt;;;; &amp;quot;Brevity is the soul of wit&amp;quot;&lt;/p&gt;&#xA;&lt;p&gt;(defalias &#39;perl-mode &#39;cperl-mode)&lt;/p&gt;&#xA;&lt;p&gt;(setq cperl-indent-level 4&lt;/p&gt;&#xA;&lt;p&gt;cperl-continued-statement-offset 4&lt;/p&gt;&#xA;&lt;p&gt;cperl-close-paren-offset -4&lt;/p&gt;&#xA;&lt;p&gt;cperl-label-offset -4&lt;/p&gt;&#xA;&lt;p&gt;cperl-comment-column 40&lt;/p&gt;&#xA;&lt;p&gt;cperl-highlight-variables-indiscriminately t&lt;/p&gt;&#xA;&lt;p&gt;cperl-indent-parens-as-block t&lt;/p&gt;&#xA;&lt;p&gt;cperl-tab-always-indent nil&lt;/p&gt;&#xA;&lt;p&gt;cperl-font-lock t)&lt;/p&gt;&#xA;&lt;p&gt;(add-hook &#39;cperl-mode-hook&lt;/p&gt;&#xA;&lt;p&gt;&#39;(lambda ()&lt;/p&gt;&#xA;&lt;p&gt;(progn&lt;/p&gt;&#xA;&lt;p&gt;(setq indent-tabs-mode nil)&lt;/p&gt;&#xA;&lt;p&gt;(setq tab-width nil)&lt;/p&gt;&#xA;&lt;p&gt;; perl-completion&lt;/p&gt;&#xA;&lt;p&gt;(require &#39;auto-complete)&lt;/p&gt;&#xA;&lt;p&gt;(require &#39;perl-completion)&lt;/p&gt;&#xA;&lt;p&gt;(add-to-list &#39;ac-sources &#39;ac-source-perl-completion)&lt;/p&gt;&#xA;&lt;p&gt;(perl-completion-mode t)&lt;/p&gt;&#xA;&lt;p&gt;)))&lt;/p&gt;&#xA;&lt;p&gt;; perl tidy&lt;/p&gt;&#xA;&lt;p&gt;; sudo aptitude install perltidy&lt;/p&gt;&#xA;&lt;p&gt;(defun perltidy-region ()&lt;/p&gt;&#xA;&lt;p&gt;&amp;quot;Run perltidy on the current region.&amp;quot;&lt;/p&gt;&#xA;&lt;p&gt;(interactive)&lt;/p&gt;&#xA;&lt;p&gt;(save-excursion&lt;/p&gt;&#xA;&lt;p&gt;(shell-command-on-region (point) (mark) &amp;quot;perltidy -q&amp;quot; nil t)))&lt;/p&gt;&#xA;&lt;p&gt;(defun perltidy-defun ()&lt;/p&gt;&#xA;&lt;p&gt;&amp;quot;Run perltidy on the current defun.&amp;quot;&lt;/p&gt;&#xA;&lt;p&gt;(interactive)&lt;/p&gt;&#xA;&lt;p&gt;(save-excursion (mark-defun)&lt;/p&gt;&#xA;&lt;p&gt;(perltidy-region)))&lt;/p&gt;&#xA;&lt;p&gt;(global-set-key &amp;quot;C-ct&amp;quot; &#39;perltidy-region)&lt;/p&gt;&#xA;&lt;p&gt;(global-set-key &amp;quot;C-cC-t&amp;quot; &#39;perltidy-defun)&lt;/p&gt;&#xA;&lt;h3 id=&#34;flymake--set-perl5lib&#34;&gt;flymake + set-perl5lib&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.emacswiki.org/emacs/FlyMake&#34;&gt;flymake&lt;/a&gt; はEmacs自体に含まれているソースコードチェッカーです。set-perl5lib は&lt;a href=&#34;http://coderepos.org/share/browser/lang/elisp/set-perl5lib/set-perl5lib.el&#34;&gt;ここ&lt;/a&gt;からダウンロードできます。この設定を入れるとコードを書いているときに裏でsyntax checkが走って、エラーになっている箇所を赤くしてくれます。これのおかげでしょうもないtypoに簡単にきづけるので、だいぶコードを書くのが速くなりました。かなりおすすめの設定です。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/8250493@N05/4911450687/&#34; title=&#34;flymake_perl&#34;&gt;&lt;img src=&#34;http://farm5.static.flickr.com/4115/4911450687_2b8af1bd20.jpg&#34; alt=&#34;flymake_perl&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;なお、自分は C-c e でエラーが発生している箇所にジャンプしてエラーメッセージをミニバッファに表示するように設定しています。&lt;/p&gt;&#xA;&lt;p&gt;;; flymake for perl&lt;/p&gt;&#xA;&lt;p&gt;(defvar flymake-perl-err-line-patterns &#39;&lt;a href=&#34;#f-fdce0a2a&#34;&gt;*1&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;(defun flymake-perl-init ()&lt;/p&gt;&#xA;&lt;p&gt;(let* &lt;a href=&#34;#f-ca9ce907&#34; title=&#34;temp-file (flymake-init-create-temp-buffer-copy&#xA;&#39;flymake-create-temp-inplace&#34;&gt;*2&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;(local-file (file-relative-name&lt;/p&gt;&#xA;&lt;p&gt;temp-file&lt;/p&gt;&#xA;&lt;p&gt;(file-name-directory buffer-file-name))))&lt;/p&gt;&#xA;&lt;p&gt;(list &amp;quot;perl&amp;quot; (list &amp;quot;-wc&amp;quot; local-file))))&lt;/p&gt;&#xA;&lt;p&gt;(defun flymake-perl-load ()&lt;/p&gt;&#xA;&lt;p&gt;(interactive)&lt;/p&gt;&#xA;&lt;p&gt;(set-perl5lib)&lt;/p&gt;&#xA;&lt;p&gt;(defadvice flymake-post-syntax-check (before flymake-force-check-was-interrupted)&lt;/p&gt;&#xA;&lt;p&gt;(setq flymake-check-was-interrupted t))&lt;/p&gt;&#xA;&lt;p&gt;(ad-activate &#39;flymake-post-syntax-check)&lt;/p&gt;&#xA;&lt;p&gt;(setq flymake-allowed-file-name-masks (append flymake-allowed-file-name-masks flymake-allowed-perl-file-name-masks))&lt;/p&gt;&#xA;&lt;p&gt;(setq flymake-err-line-patterns flymake-perl-err-line-patterns)&lt;/p&gt;&#xA;&lt;p&gt;(flymake-mode t))&lt;/p&gt;&#xA;&lt;p&gt;(add-hook &#39;cperl-mode-hook &#39;(lambda () (flymake-perl-load)))&lt;/p&gt;&#xA;&lt;p&gt;(defun next-flymake-error ()&lt;/p&gt;&#xA;&lt;p&gt;(interactive)&lt;/p&gt;&#xA;&lt;p&gt;(flymake-goto-next-error)&lt;/p&gt;&#xA;&lt;p&gt;(let &lt;a href=&#34;#f-dbf99436&#34; title=&#34;err (get-char-property (point) &#39;help-echo)))&#xA;(when err&#xA;(message err))))&#xA;(global-set-key &#34;&gt;*3&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;(string= &amp;quot;font-lock-string-face&amp;quot;&lt;/p&gt;&#xA;&lt;p&gt;(get-char-property (point) &#39;face))))&lt;/p&gt;&#xA;&lt;p&gt;&#39;(require-snippet-condition . force-in-comment)))&lt;/p&gt;&#xA;&lt;p&gt;;; yasnippet 公式提供のものと、&lt;/p&gt;&#xA;&lt;p&gt;;; 自分用カスタマイズスニペットをロード同名のスニペットが複数ある場合、&lt;/p&gt;&#xA;&lt;p&gt;;; あとから読みこんだ自分用のものが優先される。&lt;/p&gt;&#xA;&lt;p&gt;;; また、スニペットを変更、追加した場合、&lt;/p&gt;&#xA;&lt;p&gt;;; このコマンドを実行することで、変更・追加が反映される。&lt;/p&gt;&#xA;&lt;p&gt;(defun yas/load-all-directories ()&lt;/p&gt;&#xA;&lt;p&gt;(interactive)&lt;/p&gt;&#xA;&lt;p&gt;(yas/reload-all)&lt;/p&gt;&#xA;&lt;p&gt;(mapc &#39;yas/load-directory-1 my-snippet-directories))&lt;/p&gt;&#xA;&lt;p&gt;;;; yasnippet展開中はflymakeを無効にする&lt;/p&gt;&#xA;&lt;p&gt;(defvar flymake-is-active-flag nil)&lt;/p&gt;&#xA;&lt;p&gt;(defadvice yas/expand-snippet&lt;/p&gt;&#xA;&lt;p&gt;(before inhibit-flymake-syntax-checking-while-expanding-snippet activate)&lt;/p&gt;&#xA;&lt;p&gt;(setq flymake-is-active-flag&lt;/p&gt;&#xA;&lt;p&gt;(or flymake-is-active-flag&lt;/p&gt;&#xA;&lt;p&gt;(assoc-default &#39;flymake-mode (buffer-local-variables))))&lt;/p&gt;&#xA;&lt;p&gt;(when flymake-is-active-flag&lt;/p&gt;&#xA;&lt;p&gt;(flymake-mode-off)))&lt;/p&gt;&#xA;&lt;p&gt;(add-hook &#39;yas/after-exit-snippet-hook&lt;/p&gt;&#xA;&lt;p&gt;&#39;(lambda ()&lt;/p&gt;&#xA;&lt;p&gt;(when flymake-is-active-flag&lt;/p&gt;&#xA;&lt;p&gt;(flymake-mode-on)&lt;/p&gt;&#xA;&lt;p&gt;(setq flymake-is-active-flag nil))))&lt;/p&gt;&#xA;&lt;p&gt;(setq yas/root-directory (expand-file-name &amp;quot;~/.emacs.d/snippets&amp;quot;))&lt;/p&gt;&#xA;&lt;p&gt;;; 自分用スニペットディレクトリ(リストで複数指定可)&lt;/p&gt;&#xA;&lt;p&gt;(defvar my-snippet-directories&lt;/p&gt;&#xA;&lt;p&gt;(list (expand-file-name &amp;quot;~/.emacs.d/mysnippets&amp;quot;)))&lt;/p&gt;&#xA;&lt;p&gt;(yas/initialize)&lt;/p&gt;&#xA;&lt;p&gt;(yas/load-directory &amp;quot;~/.emacs.d/snippets&amp;quot;)&lt;/p&gt;&#xA;&lt;p&gt;(yas/load-all-directories)&lt;/p&gt;&#xA;&lt;h3 id=&#34;まとめ&#34;&gt;まとめ&lt;/h3&gt;&#xA;&lt;p&gt;以上の設定をすると&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;ソースの色付け&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;シンタックスチェック&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;シンボルの補完&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;モジュールのドキュメントを引く&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;snippetによるタイプ量の削減&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;ができるようになります。EclipseのようなIDEにはまだ及びませんが、これでだいぶコードを書くのが速くなるかと思います。&lt;/p&gt;&#xA;&lt;h3 id=&#34;情報源&#34;&gt;情報源&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://typester.stfuawsc.com/slides/perlcasual2/start.html&#34;&gt;Perl Hacks on Emacs&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://d.hatena.ne.jp/antipop/20080701/1214838633&#34;&gt;EmacsでPerl開発する上で必須な設定 #2 - flymake&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;を参考にさせてもらいました。ありがとうございます。&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]4774143278[/tmkm-amazon]&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;#fn-fdce0a2a&#34;&gt;*1&lt;/a&gt;:&amp;quot;\(.*\) at \([^ n]+\) line \([0-9]+\)[,.n]&amp;quot; 2 3 nil 1)))&lt;/p&gt;&#xA;&lt;p&gt;(defconst flymake-allowed-perl-file-name-masks &#39;((&amp;quot;\.pl$&amp;quot; flymake-perl-init)&lt;/p&gt;&#xA;&lt;p&gt;(&amp;quot;\.pm$&amp;quot; flymake-perl-init)&lt;/p&gt;&#xA;&lt;p&gt;(&amp;quot;\.t$&amp;quot; flymake-perl-init)&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;#fn-ca9ce907&#34;&gt;*2&lt;/a&gt;:temp-file (flymake-init-create-temp-buffer-copy&lt;/p&gt;&#xA;&lt;p&gt;&#39;flymake-create-temp-inplace&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;#fn-dbf99436&#34;&gt;*3&lt;/a&gt;:err (get-char-property (point) &#39;help-echo)))&lt;/p&gt;&#xA;&lt;p&gt;(when err&lt;/p&gt;&#xA;&lt;p&gt;(message err))))&lt;/p&gt;&#xA;&lt;p&gt;(global-set-key &amp;quot;C-ce&amp;quot; &#39;next-flymake-error)&lt;/p&gt;&#xA;&lt;h3 id=&#34;auto-complete--perl-completion&#34;&gt;auto-complete + perl-completion&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://cx4a.org/software/auto-complete/&#34;&gt;auto-complete&lt;/a&gt; と &lt;a href=&#34;http://www.emacswiki.org/emacs/PerlCompletion&#34;&gt;perl-completion&lt;/a&gt; を組み合わせてPerlのモジュールや関数、変数を補完する設定をしています。設定する elisp は先ほどの cperl-mode のところに含まれているので割愛します。下記のような感じで補完候補が出てきます。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/8250493@N05/4912733953/&#34; title=&#34;perl_completion&#34;&gt;&lt;img src=&#34;http://farm5.static.flickr.com/4121/4912733953_52f9cc97bf.jpg&#34; alt=&#34;perl_completion&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;また、perl-completion にはデフォルトで C-c s するとカーソルのあるモジュールのドキュメントをanything インタフェースで開くことができます。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/8250493@N05/4913485564/&#34; title=&#34;perl_completion_pod&#34;&gt;&lt;img src=&#34;http://farm5.static.flickr.com/4120/4913485564_c432b63746.jpg&#34; alt=&#34;perl_completion_pod&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;yasnippet&#34;&gt;yasnippet&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://code.google.com/p/yasnippet/&#34;&gt;yasnippet&lt;/a&gt; は任意のキーワードを打ってTABを押すと、そのキーワードを登録しておいたテンプレート(snippet)で置換してくれるものです。うまく使えばかなりのタイプ量が減らせるのでコードを書くのが早くなります。自分は例えば&lt;/p&gt;&#xA;&lt;p&gt;use strict;&lt;/p&gt;&#xA;&lt;p&gt;use warnings;&lt;/p&gt;&#xA;&lt;p&gt;というsnippetを &amp;quot;usestwa&amp;quot; というキーワードで登録しています。&lt;/p&gt;&#xA;&lt;p&gt;yasnippetには予め用意されているものがあるのですが、自分はそれとは別にディレクトリを作成して(~/.emacs.d/mysnippets)、そこに自分で作ったsnippetを置いています。以下がyasnippetの設定です。&lt;/p&gt;&#xA;&lt;p&gt;(require &#39;yasnippet)&lt;/p&gt;&#xA;&lt;p&gt;(require &#39;dropdown-list)&lt;/p&gt;&#xA;&lt;p&gt;(setq yas/text-popup-function #&#39;yas/dropdown-list-popup-for-template)&lt;/p&gt;&#xA;&lt;p&gt;;; コメントやリテラルではスニペットを展開しない&lt;/p&gt;&#xA;&lt;p&gt;(setq yas/buffer-local-condition&lt;/p&gt;&#xA;&lt;p&gt;&#39;(or (not (or (string= &amp;quot;font-lock-comment-face&amp;quot;&lt;/p&gt;&#xA;&lt;p&gt;(get-char-property (point) &#39;face&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Linodeの最下位プランのメモリが増量されてる</title>
				<link>https://journal.lampetty.net/posts/wp/383/</link>
				<pubDate>Sun, 18 Jul 2010 19:07:11 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/383/</guid>
				<description>&lt;p&gt;昨日まで知らなかったのですが、&lt;/p&gt;&#xA;&lt;p&gt;Linode Turns 7, BIG RAM Increaseというアナウンスがあって、Linodeの最下位プランのメモリが360MBから512MBになっていました(値段は$19.95)。さらにその一つ上は540MB→768MBとこれまた大幅増量です。その他のプランについては覚えていませんが、最大で42%増量されているっぽいです。そろそろ&lt;a href=&#34;http://prgmr.com/xen/&#34;&gt;prgmr&lt;/a&gt;に乗り換えようかと思っていたのですが、LinodeはCPUコアを最大で4つまで使えるので、当面居座ろうかなと思っています。&lt;/p&gt;&#xA;&lt;p&gt;というわけで、Linode絶賛おすすめ中です！&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Eclipseの覚えておきたいショートカットキーとTips</title>
				<link>https://journal.lampetty.net/posts/wp/382/</link>
				<pubDate>Thu, 08 Jul 2010 13:07:14 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/382/</guid>
				<description>&lt;p&gt;こんにちは。最近仕事ではめっきりJavaばっかり書いていて、そろそろ大嫌いなEclipseを使い始めて3ヶ月以上経ったので、今まで得たノウハウの一部をまとめておこうかと。&lt;/p&gt;&#xA;&lt;h3 id=&#34;eclipseで覚えておきたいショートカットキー&#34;&gt;Eclipseで覚えておきたいショートカットキー&lt;/h3&gt;&#xA;&lt;p&gt;とりあえず自分が日常的に使っているもの。Macな人はCtrlをCmdに置き換えて読んで下さい。&lt;/p&gt;&#xA;&lt;p&gt;ショートカットキー&lt;/p&gt;&#xA;&lt;p&gt;動作&lt;/p&gt;&#xA;&lt;p&gt;Ctrl + Space&lt;/p&gt;&#xA;&lt;p&gt;コード補完&lt;/p&gt;&#xA;&lt;p&gt;(クラスや変数にカーソルがある状態で)F3&lt;/p&gt;&#xA;&lt;p&gt;宣言を開く&lt;/p&gt;&#xA;&lt;p&gt;Ctrl + /&lt;/p&gt;&#xA;&lt;p&gt;リージョンをコメントアウト または コメントアウト解除&lt;/p&gt;&#xA;&lt;p&gt;Ctrl + Shift + O&lt;/p&gt;&#xA;&lt;p&gt;importの整理&lt;/p&gt;&#xA;&lt;p&gt;Crtl + Shift + P&lt;/p&gt;&#xA;&lt;p&gt;ソース上の対応する括弧にジャンプ({}, [], ()など)&lt;/p&gt;&#xA;&lt;p&gt;Crtl + .&lt;/p&gt;&#xA;&lt;p&gt;次の注釈へ(次のエラー/警告にジャンプ)&lt;/p&gt;&#xA;&lt;p&gt;Crtl + Shift + .&lt;/p&gt;&#xA;&lt;p&gt;前の注釈へ(前のエラー/警告にジャンプ)&lt;/p&gt;&#xA;&lt;p&gt;Ctrl + Shift + G&lt;/p&gt;&#xA;&lt;p&gt;変数やクラスなどのリファレンス検索(workspace内)&lt;/p&gt;&#xA;&lt;p&gt;Ctrl + E&lt;/p&gt;&#xA;&lt;p&gt;(エディタで)違うファイルを選択する&lt;/p&gt;&#xA;&lt;p&gt;Ctrl + O&lt;/p&gt;&#xA;&lt;p&gt;(エディタで)クイックアウトラインを表示&lt;/p&gt;&#xA;&lt;p&gt;Alt + ↓ or Alt + ↑&lt;/p&gt;&#xA;&lt;p&gt;行を選択した状態で打つとその行を上下に移動できる&lt;/p&gt;&#xA;&lt;p&gt;Alt + Shift + R&lt;/p&gt;&#xA;&lt;p&gt;リファクタ(リネーム)&lt;/p&gt;&#xA;&lt;p&gt;Alt + Shift + W&lt;/p&gt;&#xA;&lt;p&gt;現在エディタで開いているファイルをパッケージエクスプローラでも表示&lt;/p&gt;&#xA;&lt;p&gt;Ctrl + Shift + T&lt;/p&gt;&#xA;&lt;p&gt;絞り込み可能なクラス一覧を開く&lt;/p&gt;&#xA;&lt;p&gt;Ctrl + Shift + R&lt;/p&gt;&#xA;&lt;p&gt;絞り込み可能なリソース(ファイル)一覧を開く&lt;/p&gt;&#xA;&lt;p&gt;Ctrl + F11&lt;/p&gt;&#xA;&lt;p&gt;プログラムの実行&lt;/p&gt;&#xA;&lt;p&gt;F11&lt;/p&gt;&#xA;&lt;p&gt;デバッグモードで実行&lt;/p&gt;&#xA;&lt;p&gt;Ctrl + Alt + U&lt;/p&gt;&#xA;&lt;p&gt;svn update&lt;/p&gt;&#xA;&lt;p&gt;Ctrl + Shift + L&lt;/p&gt;&#xA;&lt;p&gt;選択しているファイルの差分を表示(Compare With -&amp;gt;Latest from Repository)&lt;/p&gt;&#xA;&lt;p&gt;きっと便利なものがまだまだあるはずですが、ショートカットキーが多すぎて最近脳が飽和状態です...&lt;/p&gt;&#xA;&lt;p&gt;また、上記の他に独自のキーバインドで&lt;/p&gt;&#xA;&lt;p&gt;Ctrl + Shift + C&lt;/p&gt;&#xA;&lt;p&gt;プロジェクトのクリーンビルド&lt;/p&gt;&#xA;&lt;p&gt;Ctrl + B&lt;/p&gt;&#xA;&lt;p&gt;プロジェクトをビルド&lt;/p&gt;&#xA;&lt;p&gt;Ctrl + Shift + C&lt;/p&gt;&#xA;&lt;p&gt;Run configurations...&lt;/p&gt;&#xA;&lt;p&gt;を定義しています。キーバインドの定義はWindow -&amp;gt; Preferences で Preferences ダイアログを開いて、General -&amp;gt; Keys から設定できます。&lt;/p&gt;&#xA;&lt;h3 id=&#34;定型文の挿入&#34;&gt;定型文の挿入&lt;/h3&gt;&#xA;&lt;p&gt;private static final Logger log = LoggerFactory.getLogger(MyClass.class);&lt;/p&gt;&#xA;&lt;p&gt;のような定型的なものは Templates を使って任意のキーワードに紐付けて Ctrl + Shift で挿入できるようにします。やり方は Preferences を開いて、Java -&amp;gt; Editor -&amp;gt; Templates から登録できます。&lt;/p&gt;&#xA;&lt;p&gt;private static final Logger log = LoggerFactory.getLogger(${primary_type_name}.class);&lt;/p&gt;&#xA;&lt;p&gt;というコードを &amp;quot;logger&amp;quot; という名前で登録すると、エディタで logger と入力してCtrl + Shiftで登録したコードが挿入されてハッピーになれます。ただし、クラス名が長すぎると&lt;/p&gt;&#xA;&lt;p&gt;private static final Logger log = LoggerFactory&lt;/p&gt;&#xA;&lt;p&gt;.getLogger(MonitoringServerRunner.class);&lt;/p&gt;&#xA;&lt;p&gt;のように残念な感じで改行されてしまいます。これは、Eclipseのデフォルトは80カラムで改行するような仕様になっているからなのですが、Preferences の Java -&amp;gt; Code Style -&amp;gt; Formatter -&amp;gt; Edit -&amp;gt; Line Wrapping タブ -&amp;gt; Maximum line width で変更できるので、ちょっと余裕を持たせてやると上のような改行は起こりにくくなります。ちなみに自分は 100 に設定しています。&lt;/p&gt;&#xA;&lt;h3 id=&#34;プロジェクトにあるフォルダーをエクスプローラーで開きたい&#34;&gt;プロジェクトにあるフォルダーをエクスプローラーで開きたい&lt;/h3&gt;&#xA;&lt;p&gt;まーこれはピンポイントですがｗ、Eclipseのプロジェクトのフォルダーをエクスプローラーで開きたい場合がよくあります。対象のフォルダを選択 -&amp;gt; 右クリック -&amp;gt; Properties でフルパスが表示されるのでそのパスを丸ごとエクスプローラーにコピペ、が楽だと思います。他にもっといいやり方ありそうですが...&lt;/p&gt;&#xA;&lt;h3 id=&#34;まとめ&#34;&gt;まとめ&lt;/h3&gt;&#xA;&lt;p&gt;Eclipseは調べると意外とナイスなショートカットキーがあるので、いろいろ調べてみるとよいと思います。こういうことを覚えることで少しづつコードを書くのが速くなりました。&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]4797371846[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>EmacsでPythonの設定</title>
				<link>https://journal.lampetty.net/posts/wp/380/</link>
				<pubDate>Sat, 03 Jul 2010 16:07:01 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/380/</guid>
				<description>&lt;p&gt;最近Pythonいいなぁと思ってPython始めているのですが、コードを書くにあたってエディタの設定も多少しとかないと、ということでEmacsでPython回りの設定をしました。あんまりヘビーなことはしないので、とりあえず今回はpython-mode.elとflymakeの設定だけしています。&lt;/p&gt;&#xA;&lt;h3 id=&#34;python-modeel&#34;&gt;python-mode.el&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://launchpad.net/python-mode&#34;&gt;ここ&lt;/a&gt;からpython-mode.elをダウンロードして load-path が通っているところに置きます。自分はこんな感じのコードを .emacs に書いています。&lt;/p&gt;&#xA;&lt;p&gt;(add-hook &#39;python-mode-hook&lt;/p&gt;&#xA;&lt;p&gt;&#39;(lambda ()&lt;/p&gt;&#xA;&lt;p&gt;(setq indent-tabs-mode nil)&lt;/p&gt;&#xA;&lt;p&gt;(setq py-indent-offset 4)))&lt;/p&gt;&#xA;&lt;h3 id=&#34;flymakepyflakes&#34;&gt;flymake(PyFlakes)&lt;/h3&gt;&#xA;&lt;p&gt;Pythonのコードのシンタックスチェックを行う&lt;a href=&#34;http://divmod.org/trac/wiki/DivmodPyflakes&#34;&gt;PyFlakes&lt;/a&gt;というソフトウェアをダウンロードして下記の要領でインストールします。&lt;/p&gt;&#xA;&lt;p&gt;$ tar xvzf pyflakes-0.4.0.tar.gz&lt;/p&gt;&#xA;&lt;p&gt;$ cd pyflakes-0.4.0&lt;/p&gt;&#xA;&lt;p&gt;$ sudo python setup.py install&lt;/p&gt;&#xA;&lt;p&gt;DebianやUbuntuにはdebがあるので&lt;/p&gt;&#xA;&lt;p&gt;sudo aptitude install pyflakes&lt;/p&gt;&#xA;&lt;p&gt;すればよいでしょう。あとは下記の設定を .emacs に追加すれば、.pyなファイルを保存したときに pyflakes によるシンタックスチェックが走ります。&lt;/p&gt;&#xA;&lt;p&gt;(defun flymake-python-init ()&lt;/p&gt;&#xA;&lt;p&gt;(let* &lt;a href=&#34;#f-0bf170b6&#34; title=&#34;temp-file (flymake-init-create-temp-buffer-copy&#xA;&#39;flymake-create-temp-inplace&#34;&gt;*1&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;(local-file (file-relative-name&lt;/p&gt;&#xA;&lt;p&gt;temp-file&lt;/p&gt;&#xA;&lt;p&gt;(file-name-directory buffer-file-name))))&lt;/p&gt;&#xA;&lt;p&gt;(list &amp;quot;pyflakes&amp;quot; (list local-file))))&lt;/p&gt;&#xA;&lt;p&gt;(defconst flymake-allowed-python-file-name-masks &#39;&lt;a href=&#34;#f-d1cdab94&#34;&gt;*2&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;(ad-activate &#39;flymake-post-syntax-check)&lt;/p&gt;&#xA;&lt;p&gt;(setq flymake-allowed-file-name-masks (append flymake-allowed-file-name-masks flymake-allowed-python-file-name-masks))&lt;/p&gt;&#xA;&lt;p&gt;(setq flymake-err-line-patterns flymake-python-err-line-patterns)&lt;/p&gt;&#xA;&lt;p&gt;(flymake-mode t))&lt;/p&gt;&#xA;&lt;p&gt;(add-hook &#39;python-mode-hook &#39;(lambda () (flymake-python-load)))&lt;/p&gt;&#xA;&lt;p&gt;実行イメージとしてはこんな感じ。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/8250493@N05/4758028172/&#34; title=&#34;pyflakes_on_emacs&#34;&gt;&lt;img src=&#34;http://farm5.static.flickr.com/4141/4758028172_2475bab06c.jpg&#34; alt=&#34;pyflakes_on_emacs&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;ちなみに自分は C-c e でエラー内容が表示できるように下記の設定も足しています。&lt;/p&gt;&#xA;&lt;p&gt;(defun next-flymake-error ()&lt;/p&gt;&#xA;&lt;p&gt;(interactive)&lt;/p&gt;&#xA;&lt;p&gt;(flymake-goto-next-error)&lt;/p&gt;&#xA;&lt;p&gt;(let ((err (get-char-property (point) &#39;help-echo)))&lt;/p&gt;&#xA;&lt;p&gt;(when err&lt;/p&gt;&#xA;&lt;p&gt;(message err))))&lt;/p&gt;&#xA;&lt;p&gt;(global-set-key &amp;quot;C-c e&amp;quot; &#39;next-flymake-error)&lt;/p&gt;&#xA;&lt;p&gt;さて、これからPythonのコードをガンガン書いていきます！&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]4797353953[/tmkm-amazon]&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;#fn-0bf170b6&#34;&gt;*1&lt;/a&gt;:temp-file (flymake-init-create-temp-buffer-copy&lt;/p&gt;&#xA;&lt;p&gt;&#39;flymake-create-temp-inplace&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;#fn-d1cdab94&#34;&gt;*2&lt;/a&gt;:&amp;quot;\.py$&amp;quot; flymake-python-init)))&lt;/p&gt;&#xA;&lt;p&gt;(defvar flymake-python-err-line-patterns &#39;((&amp;quot;\(.*\):\([0-9]+\):\(.*\)&amp;quot; 1 2 nil 3)))&lt;/p&gt;&#xA;&lt;p&gt;(defun flymake-python-load ()&lt;/p&gt;&#xA;&lt;p&gt;(interactive)&lt;/p&gt;&#xA;&lt;p&gt;(defadvice flymake-post-syntax-check (before flymake-force-check-was-interrupted)&lt;/p&gt;&#xA;&lt;p&gt;(setq flymake-check-was-interrupted t&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>サーバの設定ファイルの管理方法</title>
				<link>https://journal.lampetty.net/posts/wp/379/</link>
				<pubDate>Sun, 20 Jun 2010 12:06:22 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/379/</guid>
				<description>&lt;p&gt;最近このブログの置き場所を自宅サーバからlinodeに移しました。それにあたってサーバの設定ファイルを git リポジトリで管理して linode に同期するようにしてみました。今日はそんなことをつらつらと書いてみたいと思います。&lt;/p&gt;&#xA;&lt;p&gt;まず、なぜにサーバの設定ファイルをバージョン管理する必要があるのか、ということですが&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;ファイルを任意の時点の状態に簡単に戻すことができる&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;いつどんな修正をしたのか簡単に見れる&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;というのがメリットだと思ってます。あと、自分の場合はGitリポジトリがあるディレクトリを丸ごとバックアップ取っているので、リポジトリで管理しておくと自動的にバックアップされるというのがメリットとしてあります。色々熟考されて作られた設定ファイルは大事な財産だったりします。&lt;/p&gt;&#xA;&lt;h3 id=&#34;gitリポジトリの構成&#34;&gt;Gitリポジトリの構成&lt;/h3&gt;&#xA;&lt;p&gt;僕は以下のような構成でGitリポジトリに設定ファイルを置いています。&lt;/p&gt;&#xA;&lt;p&gt;savacan&lt;/p&gt;&#xA;&lt;p&gt;|&lt;/p&gt;&#xA;&lt;p&gt;`-- napoli.lampetty.net&lt;/p&gt;&#xA;&lt;p&gt;|&lt;/p&gt;&#xA;&lt;p&gt;`-- files&lt;/p&gt;&#xA;&lt;p&gt;`-- etc&lt;/p&gt;&#xA;&lt;p&gt;|-- apache2&lt;/p&gt;&#xA;&lt;p&gt;| |-- error-document.conf&lt;/p&gt;&#xA;&lt;p&gt;| |-- icon.conf&lt;/p&gt;&#xA;&lt;p&gt;| |-- language.conf&lt;/p&gt;&#xA;&lt;p&gt;| |-- log-env.conf&lt;/p&gt;&#xA;&lt;p&gt;| `-- mod_php.conf&lt;/p&gt;&#xA;&lt;p&gt;|-- init.d&lt;/p&gt;&#xA;&lt;p&gt;| |-- mysql&lt;/p&gt;&#xA;&lt;p&gt;| |-- reverse_proxy_nginx&lt;/p&gt;&#xA;&lt;p&gt;| `-- svscan&lt;/p&gt;&#xA;&lt;p&gt;|-- logrotate.d&lt;/p&gt;&#xA;&lt;p&gt;| `-- reverse_proxy_nginx&lt;/p&gt;&#xA;&lt;p&gt;|-- my.cnf&lt;/p&gt;&#xA;&lt;p&gt;`-- nginx&lt;/p&gt;&#xA;&lt;p&gt;|-- htpasswd&lt;/p&gt;&#xA;&lt;p&gt;|-- mime.types&lt;/p&gt;&#xA;&lt;p&gt;`-- reverse_proxy_nginx.conf&lt;/p&gt;&#xA;&lt;p&gt;TOPレベルの&amp;quot;savacan&amp;quot; というのは適当につけた名前ですが(*1)、簡単に解説するとこんな感じでしょうか。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;savacan配下にサーバ毎に napoli.lampetty.net のようなディレクトリを用意&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;その下の files ディレクトリに設定ファイルを置く&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;設定ファイルは実際にサーバに置くパスと同じものに&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;そして、この files 配下のファイルをサーバに rsync して、各ファイルの symlink を張るスクリプトを書いています。symlink を張るという形を取ることで、サーバにアップすれば最新のファイルに置き換わるのが良いところかなぁと。あと実際にサーバ上に配置するパス通りに管理しておくのもわかりやすくて気に入っています。また、おそらく様々な用途のサーバがあるような環境だと、savacan配下に作るディレクトリは&amp;quot;db_master&amp;quot;,&amp;quot;reverse_proxy&amp;quot; のような役割にしておいて、db_master/files 配下のファイルはマスタDBサーバにrsyncする、みたいな運用にすればいいのかなと思っています。&lt;/p&gt;&#xA;&lt;p&gt;最近は puppet も盛り上がってますし、puppet 使えば幸せになれることも多々あると思いますが(*2)、シンプルに運用したいのであればこのぐらいでもいいのかなぁと思っています。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;*1)サーバ管理 -&amp;gt; 鯖管 -&amp;gt; savacan&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;*2)ファイルの権限設定したい場合とか&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;[tmkm-amazon]4774145017[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>VirtualBoxでディスクを拡張する</title>
				<link>https://journal.lampetty.net/posts/wp/378/</link>
				<pubDate>Wed, 09 Jun 2010 13:06:17 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/378/</guid>
				<description>&lt;p&gt;VirtualBox + ゲストOS:Ubuntuでディスクを拡張する方法です。はしょっていうと、単に新しい仮想マシンを作ってそのディスクを古い仮想マシンのディスクにしてしまえばOKです。&lt;/p&gt;&#xA;&lt;h3 id=&#34;1新しく仮想マシンを作る&#34;&gt;1.新しく仮想マシンを作る&lt;/h3&gt;&#xA;&lt;p&gt;新しいディスクを用意するために仮想マシンを新しく作ります。この時に作成したディスクが新しいディスクになるので、容量を多めに取っておきましょう。&lt;/p&gt;&#xA;&lt;h3 id=&#34;2インストールディスクからubuntuを起動&#34;&gt;2.インストールディスクからUbuntuを起動&lt;/h3&gt;&#xA;&lt;p&gt;Ubuntu 10.04のインストール用のisoを入手します。そのisoイメージをストレージのCD/DVDデバイスとして追加して、さらに1.でつくったディスクもストレージとして追加します。そして仮想マシンのUbuntu(古い方)を起動します。&lt;/p&gt;&#xA;&lt;h3 id=&#34;3ディスクをコピー&#34;&gt;3.ディスクをコピー&lt;/h3&gt;&#xA;&lt;p&gt;Ubuntuが起動したら、ターミナルを開いて&lt;/p&gt;&#xA;&lt;p&gt;sudo dd if=/dev/sda of=/dev/sdb&lt;/p&gt;&#xA;&lt;p&gt;を実行します。これで古いディスク(/dev/sda)の内容が新しい方(/dev/sdb)にコピーされます。/dev/sda は環境によっては /dev/hda だったりするかもしれません。&lt;/p&gt;&#xA;&lt;p&gt;$ cat /proc/partitions&lt;/p&gt;&#xA;&lt;p&gt;してアタッチされているディスクを確認すると良いでしょう。&lt;/p&gt;&#xA;&lt;h3 id=&#34;4パーティションをリサイズ&#34;&gt;4.パーティションをリサイズ&lt;/h3&gt;&#xA;&lt;p&gt;GParted を使って、新しいディスクのパーティションを拡張しましょう。&lt;/p&gt;&#xA;&lt;h3 id=&#34;5仮想マシンを再起動&#34;&gt;5.仮想マシンを再起動&lt;/h3&gt;&#xA;&lt;p&gt;仮想マシンを一旦シャットダウンして、isoと古いディスクを使用しないようにしてから仮想マシンを起動して下さい。これで拡張済みのディスクがマウントされていれば、ディスクの拡張は完了です。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>qpstudy #01 &#34;rsyncのちょっとイイ話&#34;のスライド</title>
				<link>https://journal.lampetty.net/posts/wp/377/</link>
				<pubDate>Sat, 22 May 2010 01:05:43 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/377/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;http://sites.google.com/site/qpstudy/qpstudy01&#34;&gt;qpstudy #01&lt;/a&gt;で「rsyncのちょっとイイ話 」というタイトルで話させてもらいました。勉強会で発表というのは初めてで緊張したのですが、なんとか終えられてよかったです。終わった後も参加者の方々からtwitterでrsyncについて色々フォローしてもらい、自分としても勉強になりました。&lt;/p&gt;&#xA;&lt;p&gt;というわけで資料はこちら。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;http://www.slideshare.net/oinume/qpstudy01-rsync-4168853&#34; title=&#34;rsyncのちょっとイイ話&#34;&gt;rsyncのちょっとイイ話&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;View more &lt;a href=&#34;http://www.slideshare.net/&#34;&gt;presentations&lt;/a&gt; from &lt;a href=&#34;http://www.slideshare.net/oinume&#34;&gt;Kazuhiro Oinuma&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;qpstudy 第2回目も予定されているとのことなので楽しみですね。また何かネタがあったらやりたいな。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>VirtualBoxでのネットワーク設定(NAT&#43;ホストオンリーアダプタによるホストOSとゲストOS間の通信)</title>
				<link>https://journal.lampetty.net/posts/wp/375/</link>
				<pubDate>Sun, 11 Apr 2010 06:04:21 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/375/</guid>
				<description>&lt;p&gt;CassandraやMogileFS、KumoFSなど、複数のサーバで構成されるサーバソフトウェアをテストしたいことが多々あるので、VirtualBoxを使って分散環境を作ってみました。ネットワーク関連の設定でややコツが必要だったので、ちょっとまとめてみました。&lt;/p&gt;&#xA;&lt;h3 id=&#34;要件&#34;&gt;要件&lt;/h3&gt;&#xA;&lt;p&gt;ホストOS上で複数のゲストOS(Linux)を立ち上げる。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;ホストOSからゲストOSにSSHでアクセスしたいので、ホストOSからゲストOS間にアクセスできること&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;分散コンピューティングのテストがしたいので、ゲストOS間でもアクセスできること&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;ゲストOSからインターネットに出れること&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;ネットワーク上にある他のマシンからはゲストOSにはアクセスできなくてもOK&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;やり方&#34;&gt;やり方&lt;/h3&gt;&#xA;&lt;p&gt;今回はネットワーク上の他のマシンからはアクセスできなくてもよいので、ネットワークの設定ではブリッジアダプタを使わずに、ネットワークアダプタを2つ使い、NAT+ホストオンリーアダプタという構成にします。NATというのはゲストOSから外部ネットワークに接続できる構成で、ホストオンリーアダプタというのはホストOSとゲストOS間のみでやり取りできるアダプタです。&lt;/p&gt;&#xA;&lt;p&gt;具体的なやり方を書いておくと&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;VirtualBoxを&lt;a href=&#34;http://jp.sun.com/products/software/virtualbox/&#34;&gt;Sunのサイト&lt;/a&gt;からダウンロードします。(自分は3.1.6 を使用しています)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;仮想マシンを作成し、ネットワークの設定でアダプタ1で&amp;quot;NAT&amp;quot;を、アダプタ2に&amp;quot;ホストオンリーアダプタ&amp;quot;を選択します&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;終わったらOSをインストールして下さい。自分は今回CentOS 5.4を使用しました。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;となります。これをゲストOSの数だけ繰り返して下さい。(もしくは仮想マシンを一つ作ってそれをコピーするのもよいでしょう)&lt;/p&gt;&#xA;&lt;p&gt;インストールが終わったらゲストOSにログインして /sbin/ifconfig を実行してみて下さい。自分は今回centos-01とcentos-02 の2つのゲストOSを作ったところ、DHCPで下記のようにIPが割り当てられていました。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;centos-01: eth0 10.0.2.15, eth1: 192.168.56.101&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;centos-02: eth0 10.0.2.15, eth1: 192.168.56.102&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;この時点で期待していたことができるか確かめてみます。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;ホストOSから192.168.56.101,102にping&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;ゲストOSからgoogle.com(外部)にping&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;ゲストOSから192.168.56.1(ホストOSのIP)にping&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;ゲストOS 192.168.56.101から192.168.56.102(centos-02)にping&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;以上で複数サーバによる分散環境ができましたが、サーバ用途ではDHCPだと後々面倒な事になりそうなので、最後にこのDHCPで割り当てられた設定を参考に static なIPを設定しておきます。具体的にはゲストOSのeth1を192.168.56.10xにすればOKです。以下はcentos-01 の /etc/sysconfig/network-scripts/ifcfg-eth1 の変更箇所です。&lt;/p&gt;&#xA;&lt;p&gt;--- ifcfg-eth1.orig 2010-04-12 00:11:39.000000000 +0900&lt;/p&gt;&#xA;&lt;p&gt;+++ ifcfg-eth1 2010-04-12 00:18:52.000000000 +0900&lt;/p&gt;&#xA;&lt;p&gt;@@ -1,6 +1,9 @@&lt;/p&gt;&#xA;&lt;p&gt;# Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE]&lt;/p&gt;&#xA;&lt;p&gt;DEVICE=eth1&lt;/p&gt;&#xA;&lt;p&gt;-BOOTPROTO=dhcp&lt;/p&gt;&#xA;&lt;p&gt;+BOOTPROTO=static&lt;/p&gt;&#xA;&lt;p&gt;HWADDR=08:00:27:BD:DD:6C&lt;/p&gt;&#xA;&lt;p&gt;ONBOOT=yes&lt;/p&gt;&#xA;&lt;p&gt;-DHCP_HOSTNAME=centos-01&lt;/p&gt;&#xA;&lt;p&gt;+IPADDR=192.168.56.101&lt;/p&gt;&#xA;&lt;p&gt;+NETMASK=255.255.255.0&lt;/p&gt;&#xA;&lt;p&gt;+NETWORK=192.168.56.0&lt;/p&gt;&#xA;&lt;p&gt;変更したらnetworkを再起動します。&lt;/p&gt;&#xA;&lt;p&gt;# /etc/init.d/network restart&lt;/p&gt;&#xA;&lt;p&gt;centos-02は 192.168.56.102 のIPに設定しています。centos-01からcentos-02にpingしてみて通るか確認してみて下さい。&lt;/p&gt;&#xA;&lt;p&gt;$ ping 192.168.1.102&lt;/p&gt;&#xA;&lt;p&gt;これで通れば設定完了です。無事複数サーバによる分散環境ができました。&lt;/p&gt;&#xA;&lt;h3 id=&#34;余談なんでvirtualbox&#34;&gt;余談：なんでVirtualBox？&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;無償で使える&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Windows,Mac,Linuxに対応している&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;GUIによる設定画面がわりとわかりやすい&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;というのが気に入って使っています。VMwareもWindows,Mac,Linuxで使えますが、Mac版のVMware Fusionは有償なのがちょっと嫌でした。VirtualBoxは使っていてちょっと重いと思うこともありますが、突然落ちたりはせず非常に安定しているので、デスクトップPCで軽く仮想環境を作りたい場合には重宝しています。&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]4798114626[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>コマンドラインオプションを解析するPerlモジュールGetopt::Compact</title>
				<link>https://journal.lampetty.net/posts/wp/374/</link>
				<pubDate>Sat, 10 Apr 2010 12:04:12 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/374/</guid>
				<description>&lt;p&gt;Perlでコマンドラインオプションを解析する場合、大体は標準添付されているGetopt::Longを使うと思いますが、自分は3年前ぐらいから &lt;a href=&#34;http://search.cpan.org/dist/Getopt-Compact/lib/Getopt/Compact.pm&#34;&gt;Getopt::Compact&lt;/a&gt; というモジュールに出会い、それ以降大抵の場合はこれを使っています。このモジュールの良いところは&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;オプションの定義(-c, --config などの定義)とそのヘルプメッセージが一箇所で定義できる&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;-h, --helpオプションを最初から定義してくれてる(--manオプションも)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;定義してないオプションが指定されると自動的にエラーにしてくれる&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Getopt::Compact#usage でヘルプメッセージが簡単に取得できる&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;があると思っています。などと抽象的な話をしてもしょうがないので、具体的なコードを書いてみます。&lt;/p&gt;&#xA;&lt;p&gt;#!/usr/bin/env perl&lt;/p&gt;&#xA;&lt;p&gt;use strict;&lt;/p&gt;&#xA;&lt;p&gt;use warnings;&lt;/p&gt;&#xA;&lt;p&gt;use Getopt::Compact;&lt;/p&gt;&#xA;&lt;p&gt;use Data::Dumper;&lt;/p&gt;&#xA;&lt;p&gt;my $getopt = Getopt::Compact-&amp;gt;new(&lt;/p&gt;&#xA;&lt;p&gt;name =&amp;gt; &#39;getopt_compact.pl&#39;,&lt;/p&gt;&#xA;&lt;p&gt;modes =&amp;gt; [ qw(verbose) ],&lt;/p&gt;&#xA;&lt;p&gt;args =&amp;gt; &#39;FILE&#39;,&lt;/p&gt;&#xA;&lt;p&gt;version =&amp;gt; &#39;0.1&#39;,&lt;/p&gt;&#xA;&lt;p&gt;struct =&amp;gt; [&lt;/p&gt;&#xA;&lt;p&gt;[ [ qw(f force) ], &#39;force overwrite of output file and compress links&#39; ],&lt;/p&gt;&#xA;&lt;p&gt;[ [ qw(l level) ], &#39;compress level&#39;, &#39;=i&#39; ],&lt;/p&gt;&#xA;&lt;p&gt;[ [ qw(S suffix) ], &#39;use suffix on compressed files&#39;, &#39;=s&#39; ],&lt;/p&gt;&#xA;&lt;p&gt;]&lt;/p&gt;&#xA;&lt;p&gt;);&lt;/p&gt;&#xA;&lt;p&gt;my $options = $getopt-&amp;gt;opts;&lt;/p&gt;&#xA;&lt;p&gt;my $file = shift @ARGV;&lt;/p&gt;&#xA;&lt;p&gt;unless ($file) {&lt;/p&gt;&#xA;&lt;p&gt;print STDERR $getopt-&amp;gt;usage;&lt;/p&gt;&#xA;&lt;p&gt;exit 1;&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;p&gt;print &amp;quot;options -----\n&amp;quot;;&lt;/p&gt;&#xA;&lt;p&gt;print Dumper $options;&lt;/p&gt;&#xA;&lt;p&gt;上の例では gzip のオプションのモノマネで&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;-f, --forceというフラグオプション&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;-l, --levelという数値のオプション&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;-S, --suffixという文字列のオプション&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;オプション以外に引数FILEを受け取る&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;という仕様としています。&lt;/p&gt;&#xA;&lt;p&gt;でで、例えば&lt;/p&gt;&#xA;&lt;p&gt;$ perl getopt_compact.pl --help&lt;/p&gt;&#xA;&lt;p&gt;と実行すると&lt;/p&gt;&#xA;&lt;p&gt;getopt_compact.pl v0.1&lt;/p&gt;&#xA;&lt;p&gt;usage: getopt_compact.pl [options] FILE&lt;/p&gt;&#xA;&lt;p&gt;options&lt;/p&gt;&#xA;&lt;p&gt;-h, --help This help message&lt;/p&gt;&#xA;&lt;p&gt;-v, --verbose Verbose mode&lt;/p&gt;&#xA;&lt;p&gt;-f, --force Force overwrite of output file and compress links&lt;/p&gt;&#xA;&lt;p&gt;-l, --level Compress level&lt;/p&gt;&#xA;&lt;p&gt;-S, --suffix Use suffix on compressed files&lt;/p&gt;&#xA;&lt;p&gt;--man Display documentation&lt;/p&gt;&#xA;&lt;p&gt;のようにヘルプが表示されます。また、--hoge のような存在しないオプションを指定すると&lt;/p&gt;&#xA;&lt;p&gt;$ perl getopt_compact.pl --hoge&lt;/p&gt;&#xA;&lt;p&gt;Unknown option: hoge&lt;/p&gt;&#xA;&lt;p&gt;getopt_compact.pl v0.1&lt;/p&gt;&#xA;&lt;p&gt;usage: getopt_compact.pl [options] FILE&lt;/p&gt;&#xA;&lt;p&gt;options&lt;/p&gt;&#xA;&lt;p&gt;-h, --help This help message&lt;/p&gt;&#xA;&lt;p&gt;-v, --verbose Verbose mode&lt;/p&gt;&#xA;&lt;p&gt;-f, --force Force overwrite of output file and compress links&lt;/p&gt;&#xA;&lt;p&gt;-l, --level Compress level&lt;/p&gt;&#xA;&lt;p&gt;-S, --suffix Use suffix on compressed files&lt;/p&gt;&#xA;&lt;p&gt;--man Display documentation&lt;/p&gt;&#xA;&lt;p&gt;のようにエラーになりヘルプが表示されます。&lt;/p&gt;&#xA;&lt;p&gt;という感じで、Getopt::Longより依存モジュールがあるものの便利に使わせてもらってます。ただ、PerlのGetopt系のモジュールは他にも色々あるのでもっと便利なのがありそうですが、こういうのもあるよという紹介でした。&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]4798119172[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Shellでgetoptsを使ってコマンドライン引数の解析</title>
				<link>https://journal.lampetty.net/posts/wp/373/</link>
				<pubDate>Tue, 06 Apr 2010 11:04:56 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/373/</guid>
				<description>&lt;p&gt;だいぶ前の話、Perlを使わないでShellスクリプトで頑張っていた頃、Shellでコマンドラインオプションの解析をやる時は&lt;/p&gt;&#xA;&lt;p&gt;#!/bin/sh&lt;/p&gt;&#xA;&lt;p&gt;for OPT in $*&lt;/p&gt;&#xA;&lt;p&gt;do&lt;/p&gt;&#xA;&lt;p&gt;case $OPT in&lt;/p&gt;&#xA;&lt;p&gt;&#39;-x&#39; )&lt;/p&gt;&#xA;&lt;p&gt;FLAG_X=&amp;quot;TRUE&amp;quot;&lt;/p&gt;&#xA;&lt;p&gt;;;&lt;/p&gt;&#xA;&lt;p&gt;&#39;-y&#39; )&lt;/p&gt;&#xA;&lt;p&gt;shift&lt;/p&gt;&#xA;&lt;p&gt;FLAG_Y=&amp;quot;TRUE&amp;quot;&lt;/p&gt;&#xA;&lt;p&gt;VALUE_Y=$1&lt;/p&gt;&#xA;&lt;p&gt;;;&lt;/p&gt;&#xA;&lt;p&gt;esac&lt;/p&gt;&#xA;&lt;p&gt;shift&lt;/p&gt;&#xA;&lt;p&gt;done&lt;/p&gt;&#xA;&lt;p&gt;if [ &amp;quot;$FLAG_X&amp;quot; = &amp;quot;TRUE&amp;quot; ]; then&lt;/p&gt;&#xA;&lt;p&gt;echo &amp;quot;Option -x specified.&amp;quot;&lt;/p&gt;&#xA;&lt;p&gt;fi&lt;/p&gt;&#xA;&lt;p&gt;if [ &amp;quot;$FLAG_Y&amp;quot; = &amp;quot;TRUE&amp;quot; ]; then&lt;/p&gt;&#xA;&lt;p&gt;echo &amp;quot;Option -y $VALUE_Y specified.&amp;quot;&lt;/p&gt;&#xA;&lt;p&gt;fi&lt;/p&gt;&#xA;&lt;p&gt;という感じで $* と shift を使ってやっていたのですが、最近 getopts なる素敵なビルトインコマンドを知りました。これを使うと上のスクリプトは下のように書き直すことができます。&lt;/p&gt;&#xA;&lt;p&gt;#!/bin/sh&lt;/p&gt;&#xA;&lt;p&gt;while getopts xy: OPT&lt;/p&gt;&#xA;&lt;p&gt;do&lt;/p&gt;&#xA;&lt;p&gt;case $OPT in&lt;/p&gt;&#xA;&lt;p&gt;&amp;quot;x&amp;quot; )&lt;/p&gt;&#xA;&lt;p&gt;FLAG_X=&amp;quot;TRUE&amp;quot;&lt;/p&gt;&#xA;&lt;p&gt;;;&lt;/p&gt;&#xA;&lt;p&gt;&amp;quot;y&amp;quot; )&lt;/p&gt;&#xA;&lt;p&gt;FLAG_Y=&amp;quot;TRUE&amp;quot;&lt;/p&gt;&#xA;&lt;p&gt;VALUE_Y=$OPTARG&lt;/p&gt;&#xA;&lt;p&gt;;;&lt;/p&gt;&#xA;&lt;p&gt;esac&lt;/p&gt;&#xA;&lt;p&gt;done&lt;/p&gt;&#xA;&lt;p&gt;if [ &amp;quot;$FLAG_X&amp;quot; = &amp;quot;TRUE&amp;quot; ]; then&lt;/p&gt;&#xA;&lt;p&gt;echo &amp;quot;Option -x specified.&amp;quot;&lt;/p&gt;&#xA;&lt;p&gt;fi&lt;/p&gt;&#xA;&lt;p&gt;if [ &amp;quot;$FLAG_Y&amp;quot; = &amp;quot;TRUE&amp;quot; ]; then&lt;/p&gt;&#xA;&lt;p&gt;echo &amp;quot;Option -y $VALUE_Y specified.&amp;quot;&lt;/p&gt;&#xA;&lt;p&gt;fi&lt;/p&gt;&#xA;&lt;p&gt;スクリプトの行数自体はあんまり変わらないように見えますが、shift 忘れをよくやらかしていたので、それが無くなった分つまらないバグを入れ込まなくなった気がします。&lt;/p&gt;&#xA;&lt;h3 id=&#34;getoptsの解説&#34;&gt;getoptsの解説&lt;/h3&gt;&#xA;&lt;p&gt;getopts の引数にオプションの文字を指定しますが、文字のあとに : (コロン)をつけると、引数ありのオプションという扱いになります。さらに&lt;/p&gt;&#xA;&lt;p&gt;$ ./getopts.sh -z&lt;/p&gt;&#xA;&lt;p&gt;のように未定義のオプションを指定すると&lt;/p&gt;&#xA;&lt;p&gt;/home/oinume/tmp/script/getopts.sh: illegal option -- z&lt;/p&gt;&#xA;&lt;p&gt;というように怒られます。このエラーハンドリングを自前でやるには :xy: のように、getopts の引数の文字列の最初を : にすればいいみたい。&lt;/p&gt;&#xA;&lt;p&gt;さらに $OPTIND という変数を下記のように -1 してやることで、オプション以降に与えられた引数を取得することができます。例えば、上のスクリプトに下記を足して&lt;/p&gt;&#xA;&lt;p&gt;shift `expr $OPTIND - 1`&lt;/p&gt;&#xA;&lt;p&gt;if [ -n &amp;quot;$1&amp;quot; ]; then&lt;/p&gt;&#xA;&lt;p&gt;echo &amp;quot;Argument $1 specified.&amp;quot;&lt;/p&gt;&#xA;&lt;p&gt;fi&lt;/p&gt;&#xA;&lt;p&gt;$ ~/tmp/script/getopts.sh -x -y yyy hoge&lt;/p&gt;&#xA;&lt;p&gt;のように実行すると&lt;/p&gt;&#xA;&lt;p&gt;Option -x specified.&lt;/p&gt;&#xA;&lt;p&gt;Option -y yyy specified.&lt;/p&gt;&#xA;&lt;p&gt;Argument hoge specified.&lt;/p&gt;&#xA;&lt;p&gt;となります。getopts を実行すると、$OPTIND にはオプションのインデックス番号が保存されているので、これを -1 して shift してやることで、オプション以降の引数が取得できるようになるという仕組みです。&lt;/p&gt;&#xA;&lt;p&gt;最近はこういうレベルのプログラムだったらPerlで書くことも多かったのですが、Shell でも十分いけそうだと実感しました。&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]4873112672[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Shellで配列のマージ</title>
				<link>https://journal.lampetty.net/posts/wp/372/</link>
				<pubDate>Thu, 25 Mar 2010 11:03:03 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/372/</guid>
				<description>&lt;p&gt;Shellスクリプトで配列のマージってどうやるんだろうって思ったので調べてみたら、${ARRAY[*]} か ${ARRAY[@]} で配列の要素を全部取得できるらしいので、それを () 使ってマージすればいいらしい。&lt;/p&gt;&#xA;&lt;p&gt;#!/bin/sh&lt;/p&gt;&#xA;&lt;p&gt;ARRAY1=(1.1.1.1 2.2.2.2)&lt;/p&gt;&#xA;&lt;p&gt;ARRAY2=(3.3.3.3 4.4.4.4)&lt;/p&gt;&#xA;&lt;p&gt;ARRAY3=(4.4.4.4 5.5.5.5)&lt;/p&gt;&#xA;&lt;p&gt;MERGED=(${ARRAY1[*]} ${ARRAY2[*]} ${ARRAY3[*]})&lt;/p&gt;&#xA;&lt;p&gt;for n in ${MERGED[*]}; do&lt;/p&gt;&#xA;&lt;p&gt;echo $n&lt;/p&gt;&#xA;&lt;p&gt;done&lt;/p&gt;&#xA;&lt;p&gt;を実行すると&lt;/p&gt;&#xA;&lt;p&gt;1.1.1.1&lt;/p&gt;&#xA;&lt;p&gt;2.2.2.2&lt;/p&gt;&#xA;&lt;p&gt;3.3.3.3&lt;/p&gt;&#xA;&lt;p&gt;4.4.4.4&lt;/p&gt;&#xA;&lt;p&gt;4.4.4.4&lt;/p&gt;&#xA;&lt;p&gt;5.5.5.5&lt;/p&gt;&#xA;&lt;p&gt;となる。重複してる値はもちろんケアしてくれないので、頑張って取り除く必要あり。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>海外のVPS Linodeを借りました</title>
				<link>https://journal.lampetty.net/posts/wp/370/</link>
				<pubDate>Fri, 19 Mar 2010 22:03:57 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/370/</guid>
				<description>&lt;p&gt;表題の通りなのですが、やっぱり自宅サーバでサービスを運営するのがすごい嫌になったので&lt;a href=&#34;http://www.linode.com/&#34;&gt;Linode&lt;/a&gt;を契約しました。プランは一番安いLinode 360で、契約してもうかれこれ3週間ぐらいですが、かなり快適に使ってます。良い点を挙げると...&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;データセンターにFremont(カリフォルニア)を選ぶと、SSHでストレスはない(&lt;a href=&#34;http://www.slicehost.com/&#34;&gt;Slicehost&lt;/a&gt;の時はアメリカの真ん中でネットワーク遅延が激しかったので使い物にならなかった)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;CPUが(空いてれば)最大で4つまで使える。ちなみにCPUは&amp;quot;Intel(R) Xeon(R) CPU L5520 @ 2.27GHz&amp;quot; でかなり速い&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;まだ試してないけど簡単にプランがアップグレードできる(12分間のダウンタイムあり)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;OSが自由に選べる(日本のVPSだと選択肢が少なかったり)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;という感じで、今のところ不満はありません。なお契約してから知ったのですが、メモリの増量も 90MBで$5 / month で可能なようです。というわけでもしVPS探している人がいれば&lt;a href=&#34;http://www.linode.com/?r=daff622a3693dd3eee9b4133bfdbc13957ca06af&#34;&gt;こちら&lt;/a&gt;からどうぞ。(僕にアフィリエイトが入ります)&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]4774145017[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>MuninでMySQLプラグインのグラフが描画されない時の解決方法</title>
				<link>https://journal.lampetty.net/posts/wp/369/</link>
				<pubDate>Tue, 09 Mar 2010 14:03:58 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/369/</guid>
				<description>&lt;p&gt;先日設定したサーバでMuninをインストールして監視していたのですが、どうもMySQL関連のプラグイン(mysql_bytes, mysql_queries, mysql_threadsなど)でグラフが描画されず、どうしたものかと思ってぐぐってみたところ、&lt;a href=&#34;http://www.mydigitallife.info/2007/08/25/fix-for-munin-mysql-monitoring-plugin-graph-not-showing-or-blank/&#34;&gt;このエントリ&lt;/a&gt;を見つけました。まさにビンゴで /etc/munin/plugin-conf.d/munin-node に以下の行を足してmunin-nodeをrestartしたところ、うまくグラフが描画されるようになりました。&lt;/p&gt;&#xA;&lt;p&gt;env.mysqladmin /usr/local/bin/mysqladmin&lt;/p&gt;&#xA;&lt;p&gt;Muninの問題なのか何なのか、自分のケースでは mysql 関連のコマンドを /usr/local/bin/ 配下にインストールしてたので、ここにPATHが通っていなかったのが問題のようです。&lt;/p&gt;&#xA;&lt;p&gt;$ sudo -umunin munin-run mysql_bytes&lt;/p&gt;&#xA;&lt;p&gt;と実行してもうまく数値が出てきたのでどうしたものかと悩んでいたのですが、解決してすっきりしました。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>UbuntuでTimeZoneを変更する方法</title>
				<link>https://journal.lampetty.net/posts/wp/368/</link>
				<pubDate>Sun, 28 Feb 2010 05:02:44 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/368/</guid>
				<description>&lt;p&gt;昔は tzconfig というのを使えばよかったらしいのですが、deprecated と言われました...&lt;/p&gt;&#xA;&lt;p&gt;# dpkg-reconfigure tzdata&lt;/p&gt;&#xA;&lt;p&gt;と入力して、Asia -&amp;gt; Tokyo を選択すればOKです。終わったら date コマンドで確認すればOK。&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]4774145017[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>DBI-&gt;connectのHandleError</title>
				<link>https://journal.lampetty.net/posts/wp/366/</link>
				<pubDate>Wed, 10 Feb 2010 15:02:28 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/366/</guid>
				<description>&lt;p&gt;DBIのちょっとしたTIPSです。DBIには connect する時に&lt;/p&gt;&#xA;&lt;p&gt;DBI-&amp;gt;connect(&#39;dbi:mysql:database=hoge&#39;, &#39;root&#39;, &#39;whatever&#39;, { ... });&lt;/p&gt;&#xA;&lt;p&gt;とオプションを渡すことができます。(たとえば RaiseError) 。このオプションのひとつに HandleError というものがあってデバッグにはなかなか便利なので紹介してみます。端的にいうと HandleError でサブルーチンを登録しておくと、エラーが発生したときにこのサブルーチンを使ってエラーを投げてくれるようになります。以下は具体例。&lt;/p&gt;&#xA;&lt;p&gt;# MyDB.pm&lt;/p&gt;&#xA;&lt;p&gt;package MyDB;&lt;/p&gt;&#xA;&lt;p&gt;use strict;&lt;/p&gt;&#xA;&lt;p&gt;use warnings;&lt;/p&gt;&#xA;&lt;p&gt;use Carp ();&lt;/p&gt;&#xA;&lt;p&gt;use DBI;&lt;/p&gt;&#xA;&lt;p&gt;sub new {&lt;/p&gt;&#xA;&lt;p&gt;bless {}, shift;&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;p&gt;sub connect {&lt;/p&gt;&#xA;&lt;p&gt;my ($self) = @_;&lt;/p&gt;&#xA;&lt;p&gt;$self-&amp;gt;{dbh} = DBI-&amp;gt;connect(&lt;/p&gt;&#xA;&lt;p&gt;&#39;dbi:mysql:database=dbix_thin_test&#39;, &#39;root&#39;, &#39;root&#39;,&lt;/p&gt;&#xA;&lt;p&gt;{ RaiseError =&amp;gt; 1, HandleError =&amp;gt; &amp;amp;Carp::confess } # here&lt;/p&gt;&#xA;&lt;p&gt;);&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;p&gt;sub select {&lt;/p&gt;&#xA;&lt;p&gt;my ($self, $sql) = @_;&lt;/p&gt;&#xA;&lt;p&gt;my $sth = $self-&amp;gt;{dbh}-&amp;gt;prepare($sql); # error!&lt;/p&gt;&#xA;&lt;p&gt;$sth-&amp;gt;execute();&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;p&gt;1;&lt;/p&gt;&#xA;&lt;p&gt;# dbi_handle_error.pl&lt;/p&gt;&#xA;&lt;p&gt;#!/usr/bin/env perl&lt;/p&gt;&#xA;&lt;p&gt;use strict;&lt;/p&gt;&#xA;&lt;p&gt;use warnings;&lt;/p&gt;&#xA;&lt;p&gt;use FindBin qw($Bin);&lt;/p&gt;&#xA;&lt;p&gt;use lib &amp;quot;$Bin&amp;quot;;&lt;/p&gt;&#xA;&lt;p&gt;use MyDB;&lt;/p&gt;&#xA;&lt;p&gt;my $db = MyDB-&amp;gt;new;&lt;/p&gt;&#xA;&lt;p&gt;$db-&amp;gt;connect();&lt;/p&gt;&#xA;&lt;p&gt;$db-&amp;gt;select(&amp;quot;select * from not_exist&amp;quot;);&lt;/p&gt;&#xA;&lt;p&gt;と書いてわざと MyDB#select でエラーになるようにしておき、このスクリプトを実行します。&lt;/p&gt;&#xA;&lt;p&gt;すると&lt;/p&gt;&#xA;&lt;p&gt;$ perl ~/script/perl/dbi_handle_error.pl&lt;/p&gt;&#xA;&lt;p&gt;DBD::mysql::st execute failed: Table &#39;dbix_thin_test.not_exist&#39; doesn&#39;t existDBI::st=HASH(0x248a900) at /home/kazuhiro/script/perl/MyDB.pm line 23&lt;/p&gt;&#xA;&lt;p&gt;MyDB::select(&#39;MyDB=HASH(0x21b8df0)&#39;) called at /home/kazuhiro/script/perl/dbi_handle_error.pl line 11&lt;/p&gt;&#xA;&lt;p&gt;のように DBI-&amp;gt;connectの HandleError で渡した Carp::confess が呼ばれ、エラーになった時にスタックトレースが表示されます。HandleError を指定しない場合は&lt;/p&gt;&#xA;&lt;p&gt;$ perl ~/script/perl/dbi_handle_error.pl&lt;/p&gt;&#xA;&lt;p&gt;DBD::mysql::st execute failed: Table &#39;dbix_thin_test.not_exist&#39; doesn&#39;t exist at /home/kazuhiro/script/perl/MyDB.pm line 23.&lt;/p&gt;&#xA;&lt;p&gt;DBD::mysql::st execute failed: Table &#39;dbix_thin_test.not_exist&#39; doesn&#39;t exist at /home/kazuhiro/script/perl/MyDB.pm line 23.&lt;/p&gt;&#xA;&lt;p&gt;のようになってしまい、実際にエラーが発生している箇所と問題のクエリの関連性がわかりにくいですが、HandleErrorで Carp::confess を指定しておくとファイル名と行番号がわかるのでどこでエラーになっているかあたりがつけやすいと思います。(この例だとメソッドのネストが少ないのでそのありがたみがわからないですが...)&lt;/p&gt;&#xA;&lt;p&gt;以上、生DBIでもこんなマニアックなオプションがあるんだよという紹介でした。&lt;a href=&#34;http://d.hatena.ne.jp/ZIGOROu/20090731/1249050735&#34;&gt;ZIGOROuさんの生 DBI ユーザーのための DBI Cookbook (1)&lt;/a&gt;を見ててよく思うのですが、DBIってなかなか奥が深いです。&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]4798119172[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>VMWare FusionでゲストOSを強制的にシャットダウン</title>
				<link>https://journal.lampetty.net/posts/wp/365/</link>
				<pubDate>Tue, 02 Feb 2010 18:02:28 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/365/</guid>
				<description>&lt;p&gt;VMWare FusionのゲストOSとしてWindows XPを使っていたのですが、シャットダウン中に「Windowsをシャットダウンしています...」というメッセージからいっこうに進まなくなり、どうしようもなくなった時の対処方法。&lt;/p&gt;&#xA;&lt;p&gt;VMware Fusionの「仮想マシン」メニューを選択して「option」キーを押しっぱなしにすると、ゲストOSの制御メニューが以下のように変化します。そして「強制シャットダウン」を選択するとシャットダウンできるようになります。&lt;/p&gt;&#xA;&lt;p&gt;レジューム&lt;/p&gt;&#xA;&lt;p&gt;再起動&lt;/p&gt;&#xA;&lt;p&gt;シャットダウン&lt;/p&gt;&#xA;&lt;p&gt;↓&lt;/p&gt;&#xA;&lt;p&gt;強制レジューム&lt;/p&gt;&#xA;&lt;p&gt;強制再起動&lt;/p&gt;&#xA;&lt;p&gt;強制シャットダウン&lt;/p&gt;&#xA;&lt;p&gt;ちなみにVMWare Fusion 3の場合です。2だと表記が違うっぽいです。&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]4798118095[/tmkm-amazon]&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]B002TK93ZW[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>DBIx::ThinをCPANから削除</title>
				<link>https://journal.lampetty.net/posts/wp/364/</link>
				<pubDate>Tue, 12 Jan 2010 17:01:02 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/364/</guid>
				<description>&lt;p&gt;表題の通りですが、思うところがあって&lt;a href=&#34;http://github.com/oinume/p5-dbix-thin&#34;&gt;DBIx::Thin&lt;/a&gt;を削除しました。きっかけは、&lt;a href=&#34;http://cpanratings.perl.org/dist/DBIx-Thin&#34;&gt;CPAN Ratingsのレビュー&lt;/a&gt;です(以下引用)。&lt;/p&gt;&#xA;&lt;p&gt;DBIx-Thin (0.05) **&lt;/p&gt;&#xA;&lt;p&gt;It strikes me as odd how almost most of Japanese authors (of course, except honourable and admirable authors) don&#39;t write why they have written their modules and the intention of the modules.&lt;/p&gt;&#xA;&lt;p&gt;So is the author of this module.&lt;/p&gt;&#xA;&lt;p&gt;The module is yet another ORM module but unfocused one. What the heck is different from DBIx::Skinny? The explanation is nowhere to be found, but there is just an enumeration of methods. And yet could anyone else use the module?&lt;/p&gt;&#xA;&lt;p&gt;言われてみればその通りで、PODにコンセプトも書いてなければ&lt;a href=&#34;http://search.cpan.org/dist/DBIx-Skinny/&#34;&gt;DBIx::Skinny&lt;/a&gt;と違うところも良くわからないと。その辺に関しては&lt;a href=&#34;http://github.com/oinume/p5-dbix-thin/blob/master/lib/DBIx/Thin.pm&#34;&gt;モジュールのPOD&lt;/a&gt;に書いておきましたが、それでもDBIx::Skinnyとあんまり変わらないし、現時点で自分以外の誰かが使っているとも思えないので、変な混乱を招かないようにCPANからは削除しました。んで&lt;a href=&#34;http://github.com/oinume/p5-dbix-thin&#34;&gt;github&lt;/a&gt;では開発を継続していきます。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>WordPressで自分の投稿にリンクを貼るためのプラグイン &#34;The Permalinker&#34;</title>
				<link>https://journal.lampetty.net/posts/wp/362/</link>
				<pubDate>Mon, 04 Jan 2010 17:01:39 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/362/</guid>
				<description>&lt;p&gt;WordPressで文章を書いている際に過去の自分の投稿にリンクしたいことがよくあります。今までは&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://journal.lampetty.net/tech/index.php/archives/12345&#34;&gt;過去の投稿へのリンク&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;のように普通のアンカータグでリンクを貼っていたのですが、これだと万が一パーマリンクのURLの設定を変えた場合に手動で一つ一つリンクを直すのが嫌だなぁと思ってました。&lt;/p&gt;&#xA;&lt;p&gt;で、これを回避するのが最近見つけた&lt;a href=&#34;http://wordpress.org/extend/plugins/the-permalinker/&#34;&gt;The Permalinker&lt;/a&gt;というプラグイン。&lt;/p&gt;&#xA;&lt;p&gt;[permalink id=12345]過去の投稿へのリンク[/permalink]&lt;/p&gt;&#xA;&lt;p&gt;というように書くと過去の投稿へのリンクを生成してくれます。こういうプラグイン絶対あると思ってたんですが、なかなか見つけられなくて悔しい思いをしていたので、非常に嬉しいです。よかったよかった。&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]4798022012[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>MySQL 5.1の最新のソースからdebを作成する</title>
				<link>https://journal.lampetty.net/posts/wp/360/</link>
				<pubDate>Sun, 03 Jan 2010 09:01:08 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/360/</guid>
				<description>&lt;p&gt;以前[permalink id=331]MySQL 5.1の最新版のdebパッケージを作成する方法[/permalink]というエントリを書いたのですが、Ubuntuの最新の開発版パッケージではなく、MySQLが出している最新のMySQLのソースをビルドしてdebパッケージを作成する方法を見つけたのでメモしておきます。ちなみにMySQL以外にもperlとかのパッケージもこの方法で最新にすることが出来ると思います。&lt;/p&gt;&#xA;&lt;h3 id=&#34;debを作成するための準備&#34;&gt;debを作成するための準備&lt;/h3&gt;&#xA;&lt;p&gt;まずはビルドする人間のメールアドレスと名前を環境変数で設定しておきます。適当に自分のものに置き換えて下さい。&lt;/p&gt;&#xA;&lt;p&gt;$ export DEBEMAIL=&amp;quot;hogehoge@foo.com&amp;quot;&lt;/p&gt;&#xA;&lt;p&gt;$ export DEBFULLNAME=&amp;quot;Your Name&amp;quot;&lt;/p&gt;&#xA;&lt;p&gt;次にパッケージをビルドするために必要なものをインストールします。&lt;/p&gt;&#xA;&lt;p&gt;$ sudo aptitude install dh-make devscripts debhelper fakeroot lintian sudo pbuilder piuparts dpatch build-essential&lt;/p&gt;&#xA;&lt;p&gt;$ sudo aptitude build-dep mysql-server-5.1&lt;/p&gt;&#xA;&lt;h3 id=&#34;ソースの取得&#34;&gt;ソースの取得&lt;/h3&gt;&#xA;&lt;p&gt;Ubuntuのdebを作成するのに使われているソースを取得します。ソースはカレントディレクトリに展開されるので、必要があれば適当なディレクトリに cd しておいてください。&lt;/p&gt;&#xA;&lt;p&gt;$ apt-get source mysql-server-5.1&lt;/p&gt;&#xA;&lt;p&gt;次に最新のMySQLのソースを&lt;a href=&#34;http://dev.mysql.com/downloads/mysql/5.1.html#source&#34;&gt;mysql.com&lt;/a&gt;より取得します。&amp;quot;Select Platform&amp;quot;というプルダウンで&amp;quot;Source Code&amp;quot;を選択し、&amp;quot;Generic Linux (Architecture Independent), Compressed TAR Archive&amp;quot;をダウンロードして下さい。現在の最新版は5.1.42になるので、mysql-5.1.42.tar.gz としてダウンロードしています。&lt;/p&gt;&#xA;&lt;h3 id=&#34;ビルド&#34;&gt;ビルド&lt;/h3&gt;&#xA;&lt;p&gt;ではビルドを始めます。uupdate というコマンドを使うと、自動的に引数で指定した最新のソースパッケージを展開しそこにDebianのパッケージを作成するためのファイルが生成されます。(つーか&lt;/p&gt;&#xA;&lt;p&gt;uupdate便利過ぎ！)&lt;/p&gt;&#xA;&lt;p&gt;$ cd mysql-dfsg-5.1-5.1.37&lt;/p&gt;&#xA;&lt;p&gt;$ uupdate ../mysql-5.1.42.tar.gz&lt;/p&gt;&#xA;&lt;p&gt;&amp;quot;cd ../mysql-dfsg-5.1-5.1.42 しろ&amp;quot;と言われるので、cd してパッケージをビルドします。(私はAthlon X2 5050eの環境で約2.5時間かかりました)&lt;/p&gt;&#xA;&lt;p&gt;$ dpkg-buildpackage -uc -us -rfakeroot&lt;/p&gt;&#xA;&lt;h3 id=&#34;インストール&#34;&gt;インストール&lt;/h3&gt;&#xA;&lt;p&gt;ビルドが完了すると .deb パッケージがソースパッケージのディレクトリに作成されているので、必要なものをdpkg -iしてインストールします。ただし、依存関係が若干複雑なのでエラーが出たら依存しているものを先にインストールすると良いでしょう。&lt;/p&gt;&#xA;&lt;p&gt;sudo dpkg -i&lt;/p&gt;&#xA;&lt;p&gt;libmysqlclient16_5.1.42-0ubuntu1_amd64.deb&lt;/p&gt;&#xA;&lt;p&gt;libmysqlclient-dev_5.1.42-0ubuntu1_amd64.deb&lt;/p&gt;&#xA;&lt;p&gt;libmysqlclient16-dev_5.1.42-0ubuntu1_all.deb&lt;/p&gt;&#xA;&lt;p&gt;mysql-common_5.1.42-0ubuntu1_all.deb&lt;/p&gt;&#xA;&lt;p&gt;mysql-client-5.1_5.1.42-0ubuntu1_amd64.deb&lt;/p&gt;&#xA;&lt;p&gt;mysql-client_5.1.42-0ubuntu1_all.deb&lt;/p&gt;&#xA;&lt;p&gt;mysql-server-5.1_5.1.42-0ubuntu1_amd64.deb&lt;/p&gt;&#xA;&lt;p&gt;mysql-server-core-5.1_5.1.42-0ubuntu1_amd64.deb&lt;/p&gt;&#xA;&lt;p&gt;mysql-server_5.1.42-0ubuntu1_all.deb&lt;/p&gt;&#xA;&lt;p&gt;libmysqld-dev_5.1.42-0ubuntu1_amd64.deb&lt;/p&gt;&#xA;&lt;p&gt;libmysqld-pic_5.1.42-0ubuntu1_amd64.deb&lt;/p&gt;&#xA;&lt;p&gt;無事にインストールできれば、これでmysql-server-5.1が最新版になっています。mysqlコマンドでSQLを発行して動作を確認してみて下さい。&lt;/p&gt;&#xA;&lt;p&gt;$ mysql -uroot -pxxxxx&lt;/p&gt;&#xA;&lt;p&gt;Welcome to the MySQL monitor. Commands end with ; or g.&lt;/p&gt;&#xA;&lt;p&gt;Your MySQL connection id is 72&lt;/p&gt;&#xA;&lt;p&gt;Server version: 5.1.42-0ubuntu1-log (Ubuntu)&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>rackspace cloudが安い</title>
				<link>https://journal.lampetty.net/posts/wp/359/</link>
				<pubDate>Wed, 30 Dec 2009 17:12:12 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/359/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;http://diary.lampetty.net/20081108.html#p01&#34;&gt;海外の安いVPS&lt;/a&gt;というエントリで&lt;a href=&#34;http://www.linode.com/index.cfm&#34;&gt;Linode&lt;/a&gt;というVPSを紹介したのですが、(条件次第では)それよりもさらに安い&lt;a href=&#34;http://www.rackspacecloud.com/cloud_hosting_products/servers&#34;&gt;rackspace cloud&lt;/a&gt;というサービスを見つけました。&lt;/p&gt;&#xA;&lt;p&gt;プランのスペックが微妙に違うし、データ転送量の料金次第な面もあるので一概に比較出来ませんが、Linodeの540とrackspaceの512MBのプランだとrackspaceの方が7$ぐらいお得。データ転送量が少なければrackspaceも全然ありだなぁ。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>DBIx::ThinというORMapperをリリースしました</title>
				<link>https://journal.lampetty.net/posts/wp/357/</link>
				<pubDate>Tue, 29 Dec 2009 02:12:14 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/357/</guid>
				<description>&lt;p&gt;今年のYAPC(9月)からすき間時間を使って作っていた&lt;a href=&#34;http://search.cpan.org/dist/DBIx-Thin/lib/DBIx/Thin.pm&#34;&gt;DBIx::Thin&lt;/a&gt;という、&lt;a href=&#34;http://search.cpan.org/dist/DBIx-Skinny/lib/DBIx/Skinny.pm&#34;&gt;DBIx::Skinny&lt;/a&gt;インスパイアなモジュールを昨日やっとリリースしました。作った動機は単に自己満足の追求と車輪の再発明による個人のスキルアップですが、前職で3年前ぐらいに自作したORMのコードを忘れないうちに改良して世に出したいなぁとずっと思っていたのです。SkinnyのAdvent Calendarが日々更新されているのを読み、途中で何度も「これSkinny使えばいいんじゃね？」って思って挫折しかけましたが、Skinnyも細かいところでは自分のポリシーと合わない部分があったりしたのと、とりあえず作ってしまったので世に出してみます。&lt;/p&gt;&#xA;&lt;p&gt;特徴としては&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;生SQL派にやさしい&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Skinnyより書き方は冗長だと思うけど、コードを見て何をやっているかわかるようにした&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;依存モジュールが少ない(標準以外のものは3つ)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Schemaクラスを生成するジェネレータが標準添付(ただしまだMySQL以外のDBに対応していない)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;かなと思います。SQLはなんだかんだ言ってもまだWebエンジニアの共通言語だと思うので、ORMでゴリゴリJOINのコードを書くより生SQLの方がわかりやすい、と思っているので、生SQLなモジュールを作りました。&lt;/p&gt;&#xA;&lt;p&gt;「Skinnyより書き方は冗長」というのは、例えばSkinnyだと&lt;/p&gt;&#xA;&lt;p&gt;my $iterator = Your::Model-&amp;gt;search(&lt;/p&gt;&#xA;&lt;p&gt;&#39;user&#39;,&lt;/p&gt;&#xA;&lt;p&gt;{id =&amp;gt; 1},&lt;/p&gt;&#xA;&lt;p&gt;{order_by =&amp;gt; &#39;id&#39;}&lt;/p&gt;&#xA;&lt;p&gt;);&lt;/p&gt;&#xA;&lt;p&gt;と書きますが、2つ目の引数が何を表しているのかぱっと見わからないので、Thinの場合は&lt;/p&gt;&#xA;&lt;p&gt;my $iterator = Your::Model-&amp;gt;search(&lt;/p&gt;&#xA;&lt;p&gt;&#39;user&#39;,&lt;/p&gt;&#xA;&lt;p&gt;where =&amp;gt; {id =&amp;gt; 1}, # これ&lt;/p&gt;&#xA;&lt;p&gt;order_by =&amp;gt; &#39;id&#39;,&lt;/p&gt;&#xA;&lt;p&gt;);&lt;/p&gt;&#xA;&lt;p&gt;と書くようにしています。もちろんSkinnyも学習すれば全然わかると思うので、細かいどうでもいいことかもしれませんが...&lt;/p&gt;&#xA;&lt;p&gt;あとSkinnyと違う点は、&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;SchemaクラスとレコードのRowクラスは分離されていますが、シンプルさを重視してあえて一緒のクラスにまとめているところ(Your::Model::UserみたいなクラスがSchema定義をしてさらにこれのインスタンスがRowオブジェクト)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Schemaクラスの書き方がSkinnyはinflateやutf8がルールベースで全テーブルに適用されますが、こっちは基本的にテーブルの各カラムごとに書くようにさせてます&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;ところぐらいでしょうか。&lt;/p&gt;&#xA;&lt;p&gt;最後に、Skinnyのコードはすごく綺麗で色々な部分を参考にさせてもらいました。作者の&lt;a href=&#34;http://d.hatena.ne.jp/nekokak/&#34;&gt;nekokakさん&lt;/a&gt;、どうもありがとうございました。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>MySQLのdrop tableでは複数のテーブルを一気に削除できる</title>
				<link>https://journal.lampetty.net/posts/wp/356/</link>
				<pubDate>Wed, 23 Dec 2009 16:12:31 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/356/</guid>
				<description>&lt;p&gt;タイトル通りなんですが、今までは複数のテーブルを削除する時は&lt;/p&gt;&#xA;&lt;p&gt;&amp;gt; drop table hoge;&lt;/p&gt;&#xA;&lt;p&gt;&amp;gt; drop table fuga;&lt;/p&gt;&#xA;&lt;p&gt;なんてやってましたが、&lt;/p&gt;&#xA;&lt;p&gt;&amp;gt; drop table hoge fuga;&lt;/p&gt;&#xA;&lt;p&gt;って書けるんですね。豆知識。&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]4774142948[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Gitの共有リポジトリを運用する場合の個人的なベストプラクティス</title>
				<link>https://journal.lampetty.net/posts/wp/353/</link>
				<pubDate>Thu, 17 Dec 2009 13:12:36 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/353/</guid>
				<description>&lt;p&gt;最近Gitの共有リポジトリを構築する機会があったのですが、以下のような感じで運用しています。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;gitプロトコルではなくsshでアクセス(ポート開けるのだるいので)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;サーバ側にgitユーザを作って、アクセスさせたい人にsshの公開鍵をもらってそれを /home/git/.ssh/authorized_keys に追加して公開鍵認証&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;git clone ssh://git@lampetty.net/var/cache/git/hoge.git みたいな感じでclone&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;いちいちサーバ側にユーザ追加して、gitリポジトリのディレクトリにパーミッション付与するよりこっちの方がたぶん楽。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>PerlのDateTimeとTime::Pieceモジュールのベンチマーク</title>
				<link>https://journal.lampetty.net/posts/wp/352/</link>
				<pubDate>Sat, 05 Dec 2009 15:12:24 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/352/</guid>
				<description>&lt;p&gt;Perlで日付関連の処理をする代表的なモジュールに&lt;a href=&#34;http://search.cpan.org/dist/DateTime/lib/DateTime.pm&#34;&gt;DateTime&lt;/a&gt;というものがありますが、メモリ消費量が激しいのがずっと気になっていました。でで、&lt;a href=&#34;http://search.cpan.org/dist/Time-Piece/Piece.pm&#34;&gt;Time::Piece&lt;/a&gt;が5.10.1からPerlに標準添付になったという話を聞いて、乗り換えようかどうか検討しています。&lt;a href=&#34;http://digit.que.ne.jp/work/wiki.cgi?Perl%E3%83%A1%E3%83%A2%2FTime%3A%3APiece%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB&#34; title=&#34;Perlメモ/Time::Pieceモジュール - Walrus, Digit.&#34;&gt;Perlメモ/Time::Pieceモジュール - Walrus, Digit.&lt;/a&gt;を見ると、DateTimeでできることは大体できるので、以下のユースケースでの速度面を測ってみます。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;#use_memory&#34;&gt;use 時のメモリ使用量&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;#now&#34;&gt;現在日時でオブジェクトを生成する&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;#add&#34;&gt;日付オブジェクトに対する日付の加算&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;#subtract&#34;&gt;日付オブジェクト同士の減算(A - B して何日経ったかみたいな)&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;#compare&#34;&gt;日付オブジェクト同士の比較&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;#stringify&#34;&gt;日付オブジェクトを文字列にする&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;環境は以下で、ベンチマークのスクリプトは最後に載せてあります。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;OS: Ubuntu 9.04 amd64&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Perl: 5.10.0 x86_64-linux-gnu-thread-multi&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;DateTime 0.51&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Time::Piece 1.15&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;use-時のメモリ使用量&#34;&gt;use 時のメモリ使用量&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://journal.lampetty.net/tech/index.php/archives/344#gtop&#34;&gt;こちらのgtop.pl&lt;/a&gt;を使って測ります。&lt;/p&gt;&#xA;&lt;p&gt;$ gtop.pl &#39;use DateTime&#39;&lt;/p&gt;&#xA;&lt;p&gt;10.2M : use DateTime&lt;/p&gt;&#xA;&lt;p&gt;$ gtop.pl &#39;use Time::Piece&#39;&lt;/p&gt;&#xA;&lt;p&gt;2.5M : use Time::Piece&lt;/p&gt;&#xA;&lt;p&gt;おおお、なんと4分の1！&lt;/p&gt;&#xA;&lt;h3 id=&#34;現在日時でオブジェクトを生成する&#34;&gt;現在日時でオブジェクトを生成する&lt;/h3&gt;&#xA;&lt;p&gt;$ ./benchmark_datetime.pl now&lt;/p&gt;&#xA;&lt;p&gt;Benchmark: running now_datetime, now_time_piece for at least 3 CPU seconds...&lt;/p&gt;&#xA;&lt;p&gt;now_datetime: 4 wallclock secs ( 3.03 usr + 0.00 sys = 3.03 CPU) @ 3149.83/s (n=9544)&lt;/p&gt;&#xA;&lt;p&gt;now_time_piece: 2 wallclock secs ( 2.58 usr + 0.53 sys = 3.11 CPU) @ 52694.86/s (n=163881)&lt;/p&gt;&#xA;&lt;p&gt;Rate now_datetime now_time_piece&lt;/p&gt;&#xA;&lt;p&gt;now_datetime 3150/s -- -94%&lt;/p&gt;&#xA;&lt;p&gt;now_time_piece 52695/s 1573% --&lt;/p&gt;&#xA;&lt;p&gt;15倍！&lt;/p&gt;&#xA;&lt;h3 id=&#34;日付オブジェクトに対する日付の加算&#34;&gt;日付オブジェクトに対する日付の加算&lt;/h3&gt;&#xA;&lt;p&gt;$ ./benchmark_datetime.pl add&lt;/p&gt;&#xA;&lt;p&gt;Benchmark: running add_datetime, add_time_piece for at least 3 CPU seconds...&lt;/p&gt;&#xA;&lt;p&gt;add_datetime: 3 wallclock secs ( 3.05 usr + 0.00 sys = 3.05 CPU) @ 1853.44/s (n=5653)&lt;/p&gt;&#xA;&lt;p&gt;add_time_piece: 3 wallclock secs ( 2.76 usr + 0.42 sys = 3.18 CPU) @ 54969.81/s (n=174804)&lt;/p&gt;&#xA;&lt;p&gt;Rate add_datetime add_time_piece&lt;/p&gt;&#xA;&lt;p&gt;add_datetime 1853/s -- -97%&lt;/p&gt;&#xA;&lt;p&gt;add_time_piece 54970/s 2866% --&lt;/p&gt;&#xA;&lt;p&gt;Time::Pieceの圧倒的勝利。28倍！&lt;/p&gt;&#xA;&lt;h3 id=&#34;日付オブジェクト同士の減算&#34;&gt;日付オブジェクト同士の減算&lt;/h3&gt;&#xA;&lt;p&gt;$ ./benchmark_datetime.pl subtract&lt;/p&gt;&#xA;&lt;p&gt;Benchmark: running subtract_datetime, subtract_time_piece for at least 3 CPU seconds...&lt;/p&gt;&#xA;&lt;p&gt;subtract_datetime: 3 wallclock secs ( 3.00 usr + 0.00 sys = 3.00 CPU) @ 4065.00/s (n=12195)&lt;/p&gt;&#xA;&lt;p&gt;subtract_time_piece: 4 wallclock secs ( 3.15 usr + 0.00 sys = 3.15 CPU) @ 132329.84/s (n=416839)&lt;/p&gt;&#xA;&lt;p&gt;Rate subtract_datetime subtract_time_piece&lt;/p&gt;&#xA;&lt;p&gt;subtract_datetime 4065/s -- -97%&lt;/p&gt;&#xA;&lt;p&gt;subtract_time_piece 132330/s 3155% --&lt;/p&gt;&#xA;&lt;p&gt;引き算もTime::Pieceの方が圧倒的に速いですね。&lt;/p&gt;&#xA;&lt;h3 id=&#34;日付オブジェクト同士の比較&#34;&gt;日付オブジェクト同士の比較&lt;/h3&gt;&#xA;&lt;p&gt;$ ./benchmark_datetime.pl compare&lt;/p&gt;&#xA;&lt;p&gt;Benchmark: running compare_datetime, compare_time_piece for at least 3 CPU seconds...&lt;/p&gt;&#xA;&lt;p&gt;compare_datetime: 3 wallclock secs ( 3.04 usr + 0.00 sys = 3.04 CPU) @ 47709.21/s (n=145036)&lt;/p&gt;&#xA;&lt;p&gt;compare_time_piece: 4 wallclock secs ( 3.09 usr + -0.01 sys = 3.08 CPU) @ 173623.70/s (n=534761)&lt;/p&gt;&#xA;&lt;p&gt;Rate compare_datetime compare_time_piece&lt;/p&gt;&#xA;&lt;p&gt;compare_datetime 47709/s -- -73%&lt;/p&gt;&#xA;&lt;p&gt;compare_time_piece 173624/s 264% --&lt;/p&gt;&#xA;&lt;h3 id=&#34;日付オブジェクトを文字列にする&#34;&gt;日付オブジェクトを文字列にする&lt;/h3&gt;&#xA;&lt;p&gt;$ ./benchmark_datetime.pl stringify&lt;/p&gt;&#xA;&lt;p&gt;Benchmark: running stringify_datetime, stringify_time_piece for at least 3 CPU seconds...&lt;/p&gt;&#xA;&lt;p&gt;stringify_datetime: 3 wallclock secs ( 3.00 usr + 0.00 sys = 3.00 CPU) @ 44470.33/s (n=133411)&lt;/p&gt;&#xA;&lt;p&gt;stringify_time_piece: 3 wallclock secs ( 2.45 usr + 0.66 sys = 3.11 CPU) @ 116681.35/s (n=362879)&lt;/p&gt;&#xA;&lt;p&gt;Rate stringify_datetime stringify_time_piece&lt;/p&gt;&#xA;&lt;p&gt;stringify_datetime 44470/s -- -62%&lt;/p&gt;&#xA;&lt;p&gt;stringify_time_piece 116681/s 162% --&lt;/p&gt;&#xA;&lt;h3 id=&#34;まとめ&#34;&gt;まとめ&lt;/h3&gt;&#xA;&lt;p&gt;総じてDateTimeよりTime::Pieceの方が高い性能を叩き出しました。速度にシビアな状況ではTime::Pieceを使った方が良いと感じました。&lt;a href=&#34;http://blog.nomadscafe.jp/archives/000514.html&#34;&gt;こういう罠&lt;/a&gt;もあるみたいなので気をつけなくてはいけないところもありますが... インタフェースはどちらも綺麗に出来ているので使い勝手としては同じぐらいかなと思います。それにしてももっと速くTime::Pieceを検証しておけばよかったと思う今日この頃です。&lt;/p&gt;&#xA;&lt;h3 id=&#34;ベンチマークスクリプトbenchmark_datetimepl&#34;&gt;ベンチマークスクリプト(benchmark_datetime.pl)&lt;/h3&gt;&#xA;&lt;p&gt;#!/usr/bin/env perl&lt;/p&gt;&#xA;&lt;p&gt;use strict;&lt;/p&gt;&#xA;&lt;p&gt;use warnings;&lt;/p&gt;&#xA;&lt;p&gt;use Benchmark qw(cmpthese timethese);&lt;/p&gt;&#xA;&lt;p&gt;use DateTime;&lt;/p&gt;&#xA;&lt;p&gt;use Time::Piece;&lt;/p&gt;&#xA;&lt;p&gt;use Time::Seconds;&lt;/p&gt;&#xA;&lt;p&gt;my $timezone = DateTime::TimeZone-&amp;gt;new(name =&amp;gt; &#39;local&#39;);&lt;/p&gt;&#xA;&lt;p&gt;#----------------------#&lt;/p&gt;&#xA;&lt;p&gt;# now&lt;/p&gt;&#xA;&lt;p&gt;#----------------------#&lt;/p&gt;&#xA;&lt;p&gt;sub now_datetime {&lt;/p&gt;&#xA;&lt;p&gt;my $now = DateTime-&amp;gt;now(time_zone =&amp;gt; $timezone);&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;p&gt;sub now_time_piece {&lt;/p&gt;&#xA;&lt;p&gt;my $now = localtime;&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;p&gt;#----------------------#&lt;/p&gt;&#xA;&lt;p&gt;# add&lt;/p&gt;&#xA;&lt;p&gt;#----------------------#&lt;/p&gt;&#xA;&lt;p&gt;my $add_dt = DateTime-&amp;gt;now(time_zone =&amp;gt; $timezone);&lt;/p&gt;&#xA;&lt;p&gt;sub add_datetime {&lt;/p&gt;&#xA;&lt;p&gt;$add_dt-&amp;gt;add(days =&amp;gt; 1);&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;p&gt;my $add_tp = localtime;&lt;/p&gt;&#xA;&lt;p&gt;sub add_time_piece {&lt;/p&gt;&#xA;&lt;p&gt;$add_tp += ONE_DAY;&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;p&gt;#----------------------#&lt;/p&gt;&#xA;&lt;p&gt;# subtract&lt;/p&gt;&#xA;&lt;p&gt;#----------------------#&lt;/p&gt;&#xA;&lt;p&gt;my $sub_dt1 = DateTime-&amp;gt;now(time_zone =&amp;gt; $timezone);&lt;/p&gt;&#xA;&lt;p&gt;my $sub_dt2 = DateTime-&amp;gt;new(&lt;/p&gt;&#xA;&lt;p&gt;year =&amp;gt; 2008,&lt;/p&gt;&#xA;&lt;p&gt;month =&amp;gt; 12,&lt;/p&gt;&#xA;&lt;p&gt;day =&amp;gt; 1,&lt;/p&gt;&#xA;&lt;p&gt;);&lt;/p&gt;&#xA;&lt;p&gt;sub subtract_datetime {&lt;/p&gt;&#xA;&lt;p&gt;my $dur = $sub_dt1-&amp;gt;subtract_datetime($sub_dt2);&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;p&gt;my $sub_tp1 = localtime;&lt;/p&gt;&#xA;&lt;p&gt;my $sub_tp2 = Time::Piece-&amp;gt;strptime(&#39;2008-12-01&#39;, &#39;%Y-%m-%d&#39;);&lt;/p&gt;&#xA;&lt;p&gt;sub subtract_time_piece {&lt;/p&gt;&#xA;&lt;p&gt;my $sec = $sub_tp1 - $sub_tp2;&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;p&gt;#----------------------#&lt;/p&gt;&#xA;&lt;p&gt;# compare&lt;/p&gt;&#xA;&lt;p&gt;#----------------------#&lt;/p&gt;&#xA;&lt;p&gt;my $compare_dt1 = DateTime-&amp;gt;now(time_zone =&amp;gt; $timezone);&lt;/p&gt;&#xA;&lt;p&gt;my $compare_dt2 = DateTime-&amp;gt;now(time_zone =&amp;gt; $timezone);&lt;/p&gt;&#xA;&lt;p&gt;sub compare_datetime {&lt;/p&gt;&#xA;&lt;p&gt;my $result = DateTime-&amp;gt;compare($compare_dt1, $compare_dt2) &amp;lt;= 0;&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;p&gt;my $compare_tp1 = localtime;&lt;/p&gt;&#xA;&lt;p&gt;my $compare_tp2 = localtime;&lt;/p&gt;&#xA;&lt;p&gt;sub compare_time_piece {&lt;/p&gt;&#xA;&lt;p&gt;my $result = $compare_tp1 &amp;lt;= $compare_tp2;&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;p&gt;#----------------------#&lt;/p&gt;&#xA;&lt;p&gt;# stringify&lt;/p&gt;&#xA;&lt;p&gt;#----------------------#&lt;/p&gt;&#xA;&lt;p&gt;my $now_dt = DateTime-&amp;gt;now(time_zone =&amp;gt; $timezone);&lt;/p&gt;&#xA;&lt;p&gt;sub stringify_datetime {&lt;/p&gt;&#xA;&lt;p&gt;$now_dt-&amp;gt;strftime(&amp;quot;%Y-%m-%d&amp;quot;);&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;p&gt;my $now_tp = localtime;&lt;/p&gt;&#xA;&lt;p&gt;sub stringify_time_piece {&lt;/p&gt;&#xA;&lt;p&gt;$now_tp-&amp;gt;strftime(&amp;quot;%Y-%m-%d&amp;quot;);&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;p&gt;#----------------------#&lt;/p&gt;&#xA;&lt;p&gt;# main&lt;/p&gt;&#xA;&lt;p&gt;#----------------------#&lt;/p&gt;&#xA;&lt;p&gt;my $mode = shift @ARGV || &#39;now&#39;;&lt;/p&gt;&#xA;&lt;p&gt;my $count = shift @ARGV || -3;&lt;/p&gt;&#xA;&lt;p&gt;if ($mode eq &#39;now&#39;) {&lt;/p&gt;&#xA;&lt;p&gt;cmpthese timethese $count, {&lt;/p&gt;&#xA;&lt;p&gt;&#39;now_datetime&#39; =&amp;gt; &amp;amp;now_datetime,&lt;/p&gt;&#xA;&lt;p&gt;&#39;now_time_piece&#39; =&amp;gt; &amp;amp;now_time_piece,&lt;/p&gt;&#xA;&lt;p&gt;};&lt;/p&gt;&#xA;&lt;p&gt;} elsif ($mode eq &#39;add&#39;) {&lt;/p&gt;&#xA;&lt;p&gt;cmpthese timethese $count, {&lt;/p&gt;&#xA;&lt;p&gt;&#39;add_datetime&#39; =&amp;gt; &amp;amp;add_datetime,&lt;/p&gt;&#xA;&lt;p&gt;&#39;add_time_piece&#39; =&amp;gt; &amp;amp;add_time_piece,&lt;/p&gt;&#xA;&lt;p&gt;};&lt;/p&gt;&#xA;&lt;p&gt;} elsif ($mode eq &#39;subtract&#39;) {&lt;/p&gt;&#xA;&lt;p&gt;cmpthese timethese $count, {&lt;/p&gt;&#xA;&lt;p&gt;&#39;subtract_datetime&#39; =&amp;gt; &amp;amp;subtract_datetime,&lt;/p&gt;&#xA;&lt;p&gt;&#39;subtract_time_piece&#39; =&amp;gt; &amp;amp;subtract_time_piece,&lt;/p&gt;&#xA;&lt;p&gt;};&lt;/p&gt;&#xA;&lt;p&gt;} elsif ($mode eq &#39;compare&#39;) {&lt;/p&gt;&#xA;&lt;p&gt;cmpthese timethese $count, {&lt;/p&gt;&#xA;&lt;p&gt;&#39;compare_datetime&#39; =&amp;gt; &amp;amp;compare_datetime,&lt;/p&gt;&#xA;&lt;p&gt;&#39;compare_time_piece&#39; =&amp;gt; &amp;amp;compare_time_piece,&lt;/p&gt;&#xA;&lt;p&gt;};&lt;/p&gt;&#xA;&lt;p&gt;} elsif ($mode eq &#39;stringify&#39;) {&lt;/p&gt;&#xA;&lt;p&gt;cmpthese timethese $count, {&lt;/p&gt;&#xA;&lt;p&gt;&#39;stringify_datetime&#39; =&amp;gt; &amp;amp;stringify_datetime,&lt;/p&gt;&#xA;&lt;p&gt;&#39;stringify_time_piece&#39; =&amp;gt; &amp;amp;stringify_time_piece,&lt;/p&gt;&#xA;&lt;p&gt;};&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;p&gt;[rakuten]book:13309692[/rakuten]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Text::MicroTemplate 0.10で速度が速くなっている件</title>
				<link>https://journal.lampetty.net/posts/wp/350/</link>
				<pubDate>Sat, 21 Nov 2009 02:11:11 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/350/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;http://d.hatena.ne.jp/gfx/20091120/1258695709&#34; title=&#34;Now Text::MicroTemplate is even faster than HTML::Template::Pro - use GFx::WebLog;&#34;&gt;Now Text::MicroTemplate is even faster than HTML::Template::Pro - use GFx::WebLog;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Text::MicroTemplate 0.10で動作速度が改善されたとのことなので、自分のところでもベンチマークしてみました。&lt;/p&gt;&#xA;&lt;p&gt;$ perl benchmark_templates.pl 1&lt;/p&gt;&#xA;&lt;p&gt;Perl/5.10.0 (x86_64-linux-gnu-thread-multi)&lt;/p&gt;&#xA;&lt;p&gt;HTML::Template/2.9&lt;/p&gt;&#xA;&lt;p&gt;HTML::Template::Compiled/0.94&lt;/p&gt;&#xA;&lt;p&gt;HTML::Template::Pro/0.92&lt;/p&gt;&#xA;&lt;p&gt;Template/2.20&lt;/p&gt;&#xA;&lt;p&gt;Text::MicroTemplate/0.10&lt;/p&gt;&#xA;&lt;p&gt;Benchmark: running HT, HT::C, HT::Pro, MT, TT for at least 1 CPU seconds...&lt;/p&gt;&#xA;&lt;p&gt;HT: 1 wallclock secs ( 1.03 usr + 0.00 sys = 1.03 CPU) @ 1094.17/s (n=1127)&lt;/p&gt;&#xA;&lt;p&gt;HT::C: 1 wallclock secs ( 1.03 usr + 0.00 sys = 1.03 CPU) @ 11598.06/s (n=11946)&lt;/p&gt;&#xA;&lt;p&gt;HT::Pro: 2 wallclock secs ( 0.82 usr + 0.29 sys = 1.11 CPU) @ 17611.71/s (n=19549)&lt;/p&gt;&#xA;&lt;p&gt;MT: 1 wallclock secs ( 0.96 usr + 0.08 sys = 1.04 CPU) @ 15904.81/s (n=16541)&lt;/p&gt;&#xA;&lt;p&gt;TT: 1 wallclock secs ( 1.08 usr + 0.00 sys = 1.08 CPU) @ 7110.19/s (n=7679)&lt;/p&gt;&#xA;&lt;p&gt;Rate HT TT HT::C MT HT::Pro&lt;/p&gt;&#xA;&lt;p&gt;HT 1094/s -- -85% -91% -93% -94%&lt;/p&gt;&#xA;&lt;p&gt;TT 7110/s 550% -- -39% -55% -60%&lt;/p&gt;&#xA;&lt;p&gt;HT::C 11598/s 960% 63% -- -27% -34%&lt;/p&gt;&#xA;&lt;p&gt;MT 15905/s 1354% 124% 37% -- -10%&lt;/p&gt;&#xA;&lt;p&gt;HT::Pro 17612/s 1510% 148% 52% 11% --&lt;/p&gt;&#xA;&lt;p&gt;何回かやったのですが、自分の環境ではまだHTML::Template::Proが速いみたい。でも僅差なのでまったく気にならないレベルですね。とにかくgfxさん++すぎる。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Text::MicroTemplateとHTML::Template::Proの比較</title>
				<link>https://journal.lampetty.net/posts/wp/348/</link>
				<pubDate>Sat, 21 Nov 2009 01:11:04 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/348/</guid>
				<description>&lt;p&gt;PerlでWebアプリを作る時のテンプレートエンジンをどれにしようか相変わらず模索中なのですが、以下の2つのエントリーで動作速度とメモリについて調べた結果、どうやらText::MicroTemplateとHTML::Template::Proのどちらかを選択するのが良いだろうと思っています。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://journal.lampetty.net/tech/index.php/archives/342&#34;&gt;Text::MicroTemplateの速度を簡単にベンチマーク&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://journal.lampetty.net/tech/index.php/archives/344&#34;&gt;Text::MicroTemplateのメモリ使用量をベンチマーク&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;textmicrotemplateの良い点&#34;&gt;Text::MicroTemplateの良い点&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Perlのコードが書けるので自由度が高い&lt;/li&gt;&#xA;&lt;li&gt;そこそこ速い&lt;/li&gt;&#xA;&lt;li&gt;省メモリ&lt;/li&gt;&#xA;&lt;li&gt;デフォルトでHTMLエスケープしてくれるのでセキュリティ的にもグッド&lt;/li&gt;&#xA;&lt;li&gt;コードがシンプルなので拡張しやすい&lt;/li&gt;&#xA;&lt;li&gt;loopやifで改行の制御が出来る(&lt;? 〜 ?&gt;と ? )&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;htmltemplateproの良い点&#34;&gt;HTML::Template::Proの良い点&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;文法がシンプル&lt;/li&gt;&#xA;&lt;li&gt;爆速&lt;/li&gt;&#xA;&lt;li&gt;そこそこ省メモリ&lt;/li&gt;&#xA;&lt;li&gt;register_functionでテンプレート内から呼び出せる関数が登録できるので、拡張性はそれなりにある&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;textmicrotemplateのイマイチな点&#34;&gt;Text::MicroTemplateのイマイチな点&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;自由度が高い分、色々できてしまう(Viewにロジックをガリガリ書いたりとか)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Includeがデフォルトでは出来ない(Text::MicroTemplate::Extended使えば似たようなことはできる)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;htmltemplateproのイマイチな点&#34;&gt;HTML::Template::Proのイマイチな点&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&amp;lt;TMPL_IF&amp;gt;、&amp;lt;TMPL_LOOP&amp;gt;などの制御を書く時の改行のコントロールが難しい&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;デフォルトではHTMLエスケープがかからないので、自前で自動エスケープのロジックを書くかテンプレート側で毎度エスケープしなくてはいけない&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;「&amp;lt;TMPL_IF&amp;gt;、&amp;lt;TMPL_LOOP&amp;gt;で改行のコントロールが難しい」というのは、例えば以下のテンプレートファイルがあって、それを実際に出力した時のHTMLに改行が入ってしまう、ということです。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;テンプレートファイル&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&amp;lt;TMPL_IF NAME=hoge&amp;gt;&lt;/p&gt;&#xA;&lt;p&gt;hoge&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;出力されるHTML&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;#ここに改行&lt;/p&gt;&#xA;&lt;p&gt;hoge&lt;/p&gt;&#xA;&lt;p&gt;#ここにも改行&lt;/p&gt;&#xA;&lt;p&gt;出力するのがHTMLであればそんなに問題はないのですが、メールの文面をテンプレートエンジンで動的に生成したい場合、改行が実直に反映されてしまうので、いつもどうしようか悩んでしまいます。この改行のためにHTMLの生成とメールの生成で別々のテンプレートエンジン使うのも微妙ですし。&lt;/p&gt;&#xA;&lt;p&gt;もしかするとHTML::Template::Proの filter 機能でなんとかできるのかもしれませんが、まだそこまでは考えられてないです。というわけで相変わらずテンプレートエンジンどうしようか悩み中...&lt;/p&gt;&#xA;&lt;p&gt;[rakuten]book:11294491[/rakuten]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Text::MicroTemplateのメモリ使用量をベンチマーク</title>
				<link>https://journal.lampetty.net/posts/memory-usage-of-text-micro-template/</link>
				<pubDate>Sun, 15 Nov 2009 13:11:31 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/memory-usage-of-text-micro-template/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;https://journal.lampetty.net/tech/index.php/archives/342&#34;&gt;Text::MicroTemplateの速度を簡単にベンチマーク&lt;/a&gt;でText::MicroTemplateの動作速度を簡単にベンチマークしましたが、今回はメモリ使用量を他のテンプレートエンジンと比較してみました。環境はUbuntu 9.04 amd64, Perl 5.10.0 で、&lt;a href=&#34;http://search.cpan.org/dist/GTop/&#34;&gt;GTop&lt;/a&gt;を使って測っています。&lt;/p&gt;&#xA;&lt;h3 id=&#34;useした時のメモリ使用量&#34;&gt;useした時のメモリ使用量&lt;/h3&gt;&#xA;&lt;p&gt;独自に作ったスクリプト(use_memory_size.pl)でuse時のメモリ使用量を測ってみます。&lt;/p&gt;&#xA;&lt;p&gt;$ ./use_memory_size.pl&lt;/p&gt;&#xA;&lt;p&gt;3.2M : use HTML::Template&lt;/p&gt;&#xA;&lt;p&gt;11.7M : use HTML::Template::Compiled&lt;/p&gt;&#xA;&lt;p&gt;2.5M : use HTML::Template::Pro&lt;/p&gt;&#xA;&lt;p&gt;264k : use Text::MicroTemplate&lt;/p&gt;&#xA;&lt;p&gt;3.6M : use Template&lt;/p&gt;&#xA;&lt;p&gt;HTML::Template::Compiledは多くのモジュールで構成されているので、メモリ使用量が多そうな感じです。一方、ソースコードがとてもコンパクトな Text::MicroTemplate は他のテンプレートエンジンと比べてメモリ使用量が一桁少ない。これはすごい。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;use_memory_size.pl&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;#!/usr/bin/env perl&lt;/p&gt;&#xA;&lt;p&gt;use strict;&lt;/p&gt;&#xA;&lt;p&gt;use warnings;&lt;/p&gt;&#xA;&lt;p&gt;for my $module (qw(HTML::Template&lt;/p&gt;&#xA;&lt;p&gt;HTML::Template::Compiled&lt;/p&gt;&#xA;&lt;p&gt;HTML::Template::Pro&lt;/p&gt;&#xA;&lt;p&gt;Text::MicroTemplate&lt;/p&gt;&#xA;&lt;p&gt;Template)) {&lt;/p&gt;&#xA;&lt;p&gt;system &amp;quot;gtop.pl &#39;use $module&#39;&amp;quot;;&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;p&gt;(プロセスのメモリ使用量を調べるために必要なGTopモジュール(およびlibgtop2)をインストールして、下記スクリプトをgtop.plとしてどこかパスの通ってるところに保存しておいてください)&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;gtop.pl&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;#!/usr/bin/env perl&lt;/p&gt;&#xA;&lt;p&gt;use strict;&lt;/p&gt;&#xA;&lt;p&gt;use warnings;&lt;/p&gt;&#xA;&lt;p&gt;use GTop;&lt;/p&gt;&#xA;&lt;p&gt;unless (@ARGV) {&lt;/p&gt;&#xA;&lt;p&gt;print STDERR &amp;quot;Argument required.n&amp;quot;;&lt;/p&gt;&#xA;&lt;p&gt;exit 1;&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;p&gt;my $gtop = GTop-&amp;gt;new;&lt;/p&gt;&#xA;&lt;p&gt;my $before = $gtop-&amp;gt;proc_mem($$)-&amp;gt;size;&lt;/p&gt;&#xA;&lt;p&gt;eval $ARGV[0];&lt;/p&gt;&#xA;&lt;p&gt;die $@ if $@;&lt;/p&gt;&#xA;&lt;p&gt;my $after = $gtop-&amp;gt;proc_mem($$)-&amp;gt;size;&lt;/p&gt;&#xA;&lt;p&gt;my $diff = GTop::size_string($after - $before);&lt;/p&gt;&#xA;&lt;p&gt;print &amp;quot;$diff : $ARGV[0]n&amp;quot;;&lt;/p&gt;&#xA;&lt;h3 id=&#34;newしてレンダリングさせた後のメモリ使用量&#34;&gt;newしてレンダリングさせた後のメモリ使用量&lt;/h3&gt;&#xA;&lt;p&gt;モジュールをuseした時のメモリ使用量だけでなく、newしてoutputした後のメモリ使用量も調べてみました。結果は以下になります。&lt;/p&gt;&#xA;&lt;p&gt;$ ./new_memory_size.pl&lt;/p&gt;&#xA;&lt;p&gt;3.2M : use HTML::Template;my $t = HTML::Template-&amp;gt;new(filename =&amp;gt; q{template_speed_file.ht});my $s = $t-&amp;gt;output;&lt;/p&gt;&#xA;&lt;p&gt;11.7M : use HTML::Template::Compiled;my $t = HTML::Template::Compiled-&amp;gt;new(filename =&amp;gt; q{template_speed_file.ht});my $s = $t-&amp;gt;output;&lt;/p&gt;&#xA;&lt;p&gt;2.5M : use HTML::Template::Pro;my $t = HTML::Template::Pro-&amp;gt;new(filename =&amp;gt; q{template_speed_file.ht});my $s = $t-&amp;gt;output;&lt;/p&gt;&#xA;&lt;p&gt;796k : use Text::MicroTemplate::File;my $t = Text::MicroTemplate::File-&amp;gt;new;my $s = $t-&amp;gt;render_file(q{template_speed_file.mt})-&amp;gt;as_string;;&lt;/p&gt;&#xA;&lt;p&gt;11.4M : use Template;my $t = Template-&amp;gt;new;$t-&amp;gt;process(q{template_speed_file.tt}, {}, my $s);&lt;/p&gt;&#xA;&lt;p&gt;相変わらずText::MicroTemplateは良好な成績ですね。あまりメモリを積んでいないマシンでもこれなら安心して使えそうな感じです。HTML::Template::Proも2.5MBと省メモリですね。スピードも爆速なので、テンプレートにゴリゴリPerlのコードを書く必要がない場合はこれが一番よいかもしれません。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;new_memory_size.pl&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;#!/usr/bin/env perl&lt;/p&gt;&#xA;&lt;p&gt;use strict;&lt;/p&gt;&#xA;&lt;p&gt;use warnings;&lt;/p&gt;&#xA;&lt;p&gt;# HTML::Template&lt;/p&gt;&#xA;&lt;p&gt;my $ht = &amp;lt;&amp;lt;&#39;...&#39;;&lt;/p&gt;&#xA;&lt;p&gt;use HTML::Template;&lt;/p&gt;&#xA;&lt;p&gt;my $t = HTML::Template-&amp;gt;new(filename =&amp;gt; q{template_speed_file.ht});&lt;/p&gt;&#xA;&lt;p&gt;my $s = $t-&amp;gt;output;&lt;/p&gt;&#xA;&lt;p&gt;...&lt;/p&gt;&#xA;&lt;p&gt;# HTML::Template::Compiled&lt;/p&gt;&#xA;&lt;p&gt;my $htc = &amp;lt;&amp;lt;&#39;...&#39;;&lt;/p&gt;&#xA;&lt;p&gt;use HTML::Template::Compiled;&lt;/p&gt;&#xA;&lt;p&gt;my $t = HTML::Template::Compiled-&amp;gt;new(filename =&amp;gt; q{template_speed_file.ht});&lt;/p&gt;&#xA;&lt;p&gt;my $s = $t-&amp;gt;output;&lt;/p&gt;&#xA;&lt;p&gt;...&lt;/p&gt;&#xA;&lt;p&gt;# HTML::Template::Pro&lt;/p&gt;&#xA;&lt;p&gt;my $htp = &amp;lt;&amp;lt;&#39;...&#39;;&lt;/p&gt;&#xA;&lt;p&gt;use HTML::Template::Pro;&lt;/p&gt;&#xA;&lt;p&gt;my $t = HTML::Template::Pro-&amp;gt;new(filename =&amp;gt; q{template_speed_file.ht});&lt;/p&gt;&#xA;&lt;p&gt;my $s = $t-&amp;gt;output;&lt;/p&gt;&#xA;&lt;p&gt;...&lt;/p&gt;&#xA;&lt;p&gt;# Text::MicroTemplate&lt;/p&gt;&#xA;&lt;p&gt;my $mt = &amp;lt;&amp;lt;&#39;...&#39;;&lt;/p&gt;&#xA;&lt;p&gt;use Text::MicroTemplate::File;&lt;/p&gt;&#xA;&lt;p&gt;my $t = Text::MicroTemplate::File-&amp;gt;new;&lt;/p&gt;&#xA;&lt;p&gt;my $s = $t-&amp;gt;render_file(q{template_speed_file.mt})-&amp;gt;as_string;;&lt;/p&gt;&#xA;&lt;p&gt;...&lt;/p&gt;&#xA;&lt;p&gt;# Template&lt;/p&gt;&#xA;&lt;p&gt;my $tt = &amp;lt;&amp;lt;&#39;...&#39;;&lt;/p&gt;&#xA;&lt;p&gt;use Template;&lt;/p&gt;&#xA;&lt;p&gt;my $t = Template-&amp;gt;new;&lt;/p&gt;&#xA;&lt;p&gt;$t-&amp;gt;process(q{template_speed_file.tt}, {}, my $s);&lt;/p&gt;&#xA;&lt;p&gt;...&lt;/p&gt;&#xA;&lt;p&gt;for my $code ($ht, $htc, $htp, $mt, $tt) {&lt;/p&gt;&#xA;&lt;p&gt;$code =~ s/n//g;&lt;/p&gt;&#xA;&lt;p&gt;system qq{gtop.pl &#39;$code&#39;};&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;p&gt;[rakuten]book:11995194[/rakuten]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Text::MicroTemplateの速度を簡単にベンチマーク</title>
				<link>https://journal.lampetty.net/posts/wp/342/</link>
				<pubDate>Sat, 14 Nov 2009 16:11:34 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/342/</guid>
				<description>&lt;p&gt;&lt;strong&gt;2009/11/15 追記&lt;/strong&gt;：&lt;a href=&#34;#comment-152&#34;&gt;tokuhiromさんのコメント&lt;/a&gt;を受けて、Text::MicroTemplate以外のテンプレートファイルにHTMLエスケープの処理を追加してベンチマークを取り直しています。&lt;/p&gt;&#xA;&lt;p&gt;Perlのテンプレートエンジンでどれを使おうか悩んでいるので、Text::MicroTemplateをはじめとする以下のテンプレートエンジンの速度を簡単にベンチマークしてみました。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://search.cpan.org/dist/Text-MicroTemplate/lib/Text/MicroTemplate.pm&#34;&gt;Text::MicroTemplate&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://search.cpan.org/dist/HTML-Template/Template.pm&#34;&gt;HTML::Template&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://search.cpan.org/dist/HTML-Template-Pro/lib/HTML/Template/Pro.pm&#34;&gt;HTML::Template::Pro&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://search.cpan.org/dist/HTML-Template-Compiled/lib/HTML/Template/Compiled.pm&#34;&gt;HTML::Template::Compiled&lt;/a&gt; (PODにはHTML::Templateの3-7倍速いと書かれている)&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://search.cpan.org/dist/Template-Toolkit/lib/Template.pm&#34;&gt;Template-Toolkit&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;下記の要因で単純に比較できない部分もあるので、これを鵜呑みにしないでなるべく自身のユースケースの延長でもベンチマークを取ることをお奨めします。あくまで参考値ということで。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;そもそも持っている機能が全然違うので単純に比較できない&lt;/li&gt;&#xA;&lt;li&gt;実際のテンプレートファイルはもっと複雑なはず&lt;/li&gt;&#xA;&lt;li&gt;utf8 flagの処理入れる場合もある&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;ではとりあえず結果から。&lt;/p&gt;&#xA;&lt;h3 id=&#34;キャッシュなし&#34;&gt;キャッシュなし&lt;/h3&gt;&#xA;&lt;p&gt;$ perl template_speed_file.pl 3000 0&lt;/p&gt;&#xA;&lt;p&gt;Benchmark: timing 3000 iterations of HT, HT::Compiled, HT::Pro, MT, TT...&lt;/p&gt;&#xA;&lt;p&gt;HT: 5 wallclock secs ( 4.60 usr + 0.09 sys = 4.69 CPU) @ 639.66/s (n=3000)&lt;/p&gt;&#xA;&lt;p&gt;HT::Compiled: 10 wallclock secs (10.56 usr + 0.10 sys = 10.66 CPU) @ 281.43/s (n=3000)&lt;/p&gt;&#xA;&lt;p&gt;HT::Pro: 1 wallclock secs ( 0.20 usr + 0.04 sys = 0.24 CPU) @ 12500.00/s (n=3000)&lt;/p&gt;&#xA;&lt;p&gt;(warning: too few iterations for a reliable count)&lt;/p&gt;&#xA;&lt;p&gt;MT: 2 wallclock secs ( 2.39 usr + 0.07 sys = 2.46 CPU) @ 1219.51/s (n=3000)&lt;/p&gt;&#xA;&lt;p&gt;TT: 10 wallclock secs ( 9.65 usr + 0.17 sys = 9.82 CPU) @ 305.50/s (n=3000)&lt;/p&gt;&#xA;&lt;p&gt;Rate HT::Compiled TT HT MT HT::Pro&lt;/p&gt;&#xA;&lt;p&gt;HT::Compiled 281/s -- -8% -56% -77% -98%&lt;/p&gt;&#xA;&lt;p&gt;TT 305/s 9% -- -52% -75% -98%&lt;/p&gt;&#xA;&lt;p&gt;HT 640/s 127% 109% -- -48% -95%&lt;/p&gt;&#xA;&lt;p&gt;MT 1220/s 333% 299% 91% -- -90%&lt;/p&gt;&#xA;&lt;p&gt;HT::Pro 12500/s 4342% 3992% 1854% 925% --&lt;/p&gt;&#xA;&lt;h3 id=&#34;キャッシュあり&#34;&gt;キャッシュあり&lt;/h3&gt;&#xA;&lt;p&gt;コードを見てもらえばわかるのですが、「キャッシュあり」とは具体的には&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;テンプレートのインスタンスを作るのは最初の1回だけ(キャッシュなしの場合は毎回作っている)&lt;/li&gt;&#xA;&lt;li&gt;テンプレートエンジンに対して、「キャッシュあり」とコンストラクタで指令&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;ということになります。&lt;/p&gt;&#xA;&lt;p&gt;$ perl template_speed_file.pl 3000 1&lt;/p&gt;&#xA;&lt;p&gt;Benchmark: timing 3000 iterations of HT, HT::Compiled, HT::Pro, MT, TT...&lt;/p&gt;&#xA;&lt;p&gt;HT: 3 wallclock secs ( 2.69 usr + 0.00 sys = 2.69 CPU) @ 1115.24/s (n=3000)&lt;/p&gt;&#xA;&lt;p&gt;HT::Compiled: 0 wallclock secs ( 0.28 usr + 0.00 sys = 0.28 CPU) @ 10714.29/s (n=3000)&lt;/p&gt;&#xA;&lt;p&gt;(warning: too few iterations for a reliable count)&lt;/p&gt;&#xA;&lt;p&gt;HT::Pro: 0 wallclock secs ( 0.13 usr + 0.02 sys = 0.15 CPU) @ 20000.00/s (n=3000)&lt;/p&gt;&#xA;&lt;p&gt;(warning: too few iterations for a reliable count)&lt;/p&gt;&#xA;&lt;p&gt;MT: 1 wallclock secs ( 0.22 usr + 0.01 sys = 0.23 CPU) @ 13043.48/s (n=3000)&lt;/p&gt;&#xA;&lt;p&gt;(warning: too few iterations for a reliable count)&lt;/p&gt;&#xA;&lt;p&gt;TT: 1 wallclock secs ( 1.84 usr + 0.00 sys = 1.84 CPU) @ 1630.43/s (n=3000)&lt;/p&gt;&#xA;&lt;p&gt;Rate HT TT HT::Compiled MT HT::Pro&lt;/p&gt;&#xA;&lt;p&gt;HT 1115/s -- -32% -90% -91% -94%&lt;/p&gt;&#xA;&lt;p&gt;TT 1630/s 46% -- -85% -87% -92%&lt;/p&gt;&#xA;&lt;p&gt;HT::Compiled 10714/s 861% 557% -- -18% -46%&lt;/p&gt;&#xA;&lt;p&gt;MT 13043/s 1070% 700% 22% -- -35%&lt;/p&gt;&#xA;&lt;p&gt;HT::Pro 20000/s 1693% 1127% 87% 53% --&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;HTML::Template::Proが爆速！&lt;/li&gt;&#xA;&lt;li&gt;Text::MicroTemplateは、キャッシュなしだとそこそこ、キャッシュありはかなり速い部類に入るようです。キャッシュありだとHTML::Template::Proには及ばないものの、かなり速いです。&lt;/li&gt;&#xA;&lt;li&gt;HTML::Template::Compiledはキャッシュを無効にするとTTより遅いという結果ですが、キャッシュを有効にすると猛烈に速くなるようです。ソースが追えてないのですが、中でガチンコにキャッシュしてるのでしょうか。&lt;/li&gt;&#xA;&lt;li&gt;たぶん一番使われているTTはよく「遅い」と言われていますが、キャッシュを有効にすると意外にもHTML::Templateより速くなりました。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;というのがポイントだと思います。この結果だけで判断すると、HTML::Template::Proは神がかり的な速さなのですが、そもそもPerlのコードをテンプレートに記述できず自由度は低いので(*1)、使う場合にはそれなりに不便さを覚悟した方がよいと思います。「便利さ」という点だとText::MicroTemplateはテンプレート内にPerlのコードが書ける分かなり自由度が高い、かつ速度もいい感じでバランスが取れていると言えます。&lt;/p&gt;&#xA;&lt;p&gt;*1) Perlのコードをテンプレートに書けてしまっていいのかどうかは使う人次第だと思いますが&lt;/p&gt;&#xA;&lt;p&gt;以下にソースを載せておきます。テストに使ったマシンはUbuntu 9.04, perl 5.10.0, CPUが Athlon Dual Core Processor 5050e です。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;template_speed_file.pl&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;#!/usr/bin/env perl&lt;/p&gt;&#xA;&lt;p&gt;use strict;&lt;/p&gt;&#xA;&lt;p&gt;use warnings;&lt;/p&gt;&#xA;&lt;p&gt;use HTML::Template;&lt;/p&gt;&#xA;&lt;p&gt;use HTML::Template::Compiled speed =&amp;gt; 1;&lt;/p&gt;&#xA;&lt;p&gt;use HTML::Template::Pro;&lt;/p&gt;&#xA;&lt;p&gt;use Template;&lt;/p&gt;&#xA;&lt;p&gt;use Text::MicroTemplate::File;&lt;/p&gt;&#xA;&lt;p&gt;use Benchmark qw(timethese cmpthese);&lt;/p&gt;&#xA;&lt;p&gt;my @LANGUAGES = (&lt;/p&gt;&#xA;&lt;p&gt;{ language =&amp;gt; &#39;Perl&#39;, ll =&amp;gt; 1 },&lt;/p&gt;&#xA;&lt;p&gt;{ language =&amp;gt; &#39;Ruby&#39;, ll =&amp;gt; 1 },&lt;/p&gt;&#xA;&lt;p&gt;{ language =&amp;gt; &#39;Python&#39;, ll =&amp;gt; 1 },&lt;/p&gt;&#xA;&lt;p&gt;{ language =&amp;gt; &#39;PHP&#39;, ll =&amp;gt; 1 },&lt;/p&gt;&#xA;&lt;p&gt;{ language =&amp;gt; &#39;Java&#39; },&lt;/p&gt;&#xA;&lt;p&gt;{ language =&amp;gt; &#39;C&#39; },&lt;/p&gt;&#xA;&lt;p&gt;{ language =&amp;gt; &#39;C++&#39; },&lt;/p&gt;&#xA;&lt;p&gt;{ language =&amp;gt; &#39;C#&#39; },&lt;/p&gt;&#xA;&lt;p&gt;{ language =&amp;gt; &#39;VB&#39; },&lt;/p&gt;&#xA;&lt;p&gt;{ language =&amp;gt; &#39;VB.NET&#39; },&lt;/p&gt;&#xA;&lt;p&gt;{ language =&amp;gt; &#39;ASP.NET&#39; },&lt;/p&gt;&#xA;&lt;p&gt;{ language =&amp;gt; &#39;Delphi&#39; },&lt;/p&gt;&#xA;&lt;p&gt;{ language =&amp;gt; &#39;Erlang&#39; },&lt;/p&gt;&#xA;&lt;p&gt;{ language =&amp;gt; &#39;Scala&#39;, ll =&amp;gt; 1 },&lt;/p&gt;&#xA;&lt;p&gt;{ language =&amp;gt; &#39;Go&#39; },&lt;/p&gt;&#xA;&lt;p&gt;);&lt;/p&gt;&#xA;&lt;p&gt;my $count = shift @ARGV || 1000;&lt;/p&gt;&#xA;&lt;p&gt;my $cache = shift @ARGV || 0;&lt;/p&gt;&#xA;&lt;p&gt;my $mt = undef;&lt;/p&gt;&#xA;&lt;p&gt;sub mt {&lt;/p&gt;&#xA;&lt;p&gt;my %args = (use_cache =&amp;gt; $cache);&lt;/p&gt;&#xA;&lt;p&gt;if ($cache) {&lt;/p&gt;&#xA;&lt;p&gt;$mt ||= Text::MicroTemplate::File-&amp;gt;new(%args);&lt;/p&gt;&#xA;&lt;p&gt;} else {&lt;/p&gt;&#xA;&lt;p&gt;$mt = Text::MicroTemplate::File-&amp;gt;new(%args);&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;p&gt;my $s = $mt-&amp;gt;render_file(&lt;/p&gt;&#xA;&lt;p&gt;&#39;template_speed_file.mt&#39;,&lt;/p&gt;&#xA;&lt;p&gt;{&lt;/p&gt;&#xA;&lt;p&gt;page_title =&amp;gt; &#39;LL Programming languages&#39;,&lt;/p&gt;&#xA;&lt;p&gt;languages =&amp;gt; @LANGUAGES,&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;p&gt;)-&amp;gt;as_string;&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;p&gt;my $ht = undef;&lt;/p&gt;&#xA;&lt;p&gt;sub ht {&lt;/p&gt;&#xA;&lt;p&gt;my %args = (&lt;/p&gt;&#xA;&lt;p&gt;filename =&amp;gt; &#39;template_speed_file.ht&#39;,&lt;/p&gt;&#xA;&lt;p&gt;case_sensitive =&amp;gt; 1,&lt;/p&gt;&#xA;&lt;p&gt;die_on_bad_params =&amp;gt; 0,&lt;/p&gt;&#xA;&lt;p&gt;cache =&amp;gt; $cache,&lt;/p&gt;&#xA;&lt;p&gt;);&lt;/p&gt;&#xA;&lt;p&gt;if ($cache) {&lt;/p&gt;&#xA;&lt;p&gt;$ht ||= HTML::Template-&amp;gt;new(%args);&lt;/p&gt;&#xA;&lt;p&gt;} else {&lt;/p&gt;&#xA;&lt;p&gt;$ht = HTML::Template-&amp;gt;new(%args);&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;p&gt;$ht-&amp;gt;param(&lt;/p&gt;&#xA;&lt;p&gt;page_title =&amp;gt; &#39;LL Programming languages&#39;,&lt;/p&gt;&#xA;&lt;p&gt;languages =&amp;gt; @LANGUAGES,&lt;/p&gt;&#xA;&lt;p&gt;);&lt;/p&gt;&#xA;&lt;p&gt;my $s = $ht-&amp;gt;output;&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;p&gt;my $htc = undef;&lt;/p&gt;&#xA;&lt;p&gt;sub htc {&lt;/p&gt;&#xA;&lt;p&gt;my %args = (&lt;/p&gt;&#xA;&lt;p&gt;filename =&amp;gt; &#39;template_speed_file.ht&#39;,&lt;/p&gt;&#xA;&lt;p&gt;case_sensitive =&amp;gt; 1,&lt;/p&gt;&#xA;&lt;p&gt;die_on_bad_params =&amp;gt; 0,&lt;/p&gt;&#xA;&lt;p&gt;cache =&amp;gt; $cache,&lt;/p&gt;&#xA;&lt;p&gt;);&lt;/p&gt;&#xA;&lt;p&gt;if ($cache) {&lt;/p&gt;&#xA;&lt;p&gt;$htc ||= HTML::Template::Compiled-&amp;gt;new(%args);&lt;/p&gt;&#xA;&lt;p&gt;} else {&lt;/p&gt;&#xA;&lt;p&gt;$htc = HTML::Template::Compiled-&amp;gt;new(%args);&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;p&gt;$htc-&amp;gt;param(&lt;/p&gt;&#xA;&lt;p&gt;page_title =&amp;gt; &#39;LL Programming languages&#39;,&lt;/p&gt;&#xA;&lt;p&gt;languages =&amp;gt; @LANGUAGES,&lt;/p&gt;&#xA;&lt;p&gt;);&lt;/p&gt;&#xA;&lt;p&gt;my $s = $htc-&amp;gt;output;&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;p&gt;my $htp = undef;&lt;/p&gt;&#xA;&lt;p&gt;sub htp {&lt;/p&gt;&#xA;&lt;p&gt;my %args = (&lt;/p&gt;&#xA;&lt;p&gt;filename =&amp;gt; &#39;template_speed_file.ht&#39;,&lt;/p&gt;&#xA;&lt;p&gt;case_sensitive =&amp;gt; 1,&lt;/p&gt;&#xA;&lt;p&gt;die_on_bad_params =&amp;gt; 0,&lt;/p&gt;&#xA;&lt;p&gt;cache =&amp;gt; $cache,&lt;/p&gt;&#xA;&lt;p&gt;);&lt;/p&gt;&#xA;&lt;p&gt;if ($cache) {&lt;/p&gt;&#xA;&lt;p&gt;$htp ||= HTML::Template::Pro-&amp;gt;new(%args);&lt;/p&gt;&#xA;&lt;p&gt;} else {&lt;/p&gt;&#xA;&lt;p&gt;$htp = HTML::Template::Pro-&amp;gt;new(%args);&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;p&gt;$htp-&amp;gt;param(&lt;/p&gt;&#xA;&lt;p&gt;page_title =&amp;gt; &#39;LL Programming languages&#39;,&lt;/p&gt;&#xA;&lt;p&gt;languages =&amp;gt; @LANGUAGES,&lt;/p&gt;&#xA;&lt;p&gt;);&lt;/p&gt;&#xA;&lt;p&gt;my $s = $htp-&amp;gt;output;&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;p&gt;my $tt = undef;&lt;/p&gt;&#xA;&lt;p&gt;sub tt {&lt;/p&gt;&#xA;&lt;p&gt;if ($cache) {&lt;/p&gt;&#xA;&lt;p&gt;$tt ||= Template-&amp;gt;new(&lt;/p&gt;&#xA;&lt;p&gt;CACHE_SIZE =&amp;gt; $cache ? undef : 0,&lt;/p&gt;&#xA;&lt;p&gt;);&lt;/p&gt;&#xA;&lt;p&gt;} else {&lt;/p&gt;&#xA;&lt;p&gt;$tt = Template-&amp;gt;new;&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;p&gt;$tt-&amp;gt;process(&lt;/p&gt;&#xA;&lt;p&gt;&#39;template_speed_file.tt&#39;,&lt;/p&gt;&#xA;&lt;p&gt;{&lt;/p&gt;&#xA;&lt;p&gt;page_title =&amp;gt; &#39;LL Programming languages&#39;,&lt;/p&gt;&#xA;&lt;p&gt;languages =&amp;gt; @LANGUAGES,&lt;/p&gt;&#xA;&lt;p&gt;},&lt;/p&gt;&#xA;&lt;p&gt;my $out,&lt;/p&gt;&#xA;&lt;p&gt;) or die $tt-&amp;gt;error() . &amp;quot;n&amp;quot;;&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;p&gt;# main&lt;/p&gt;&#xA;&lt;p&gt;my $comp = timethese(&lt;/p&gt;&#xA;&lt;p&gt;$count,&lt;/p&gt;&#xA;&lt;p&gt;{&lt;/p&gt;&#xA;&lt;p&gt;&#39;MT&#39; =&amp;gt; &amp;amp;mt,&lt;/p&gt;&#xA;&lt;p&gt;&#39;HT&#39; =&amp;gt; &amp;amp;ht,&lt;/p&gt;&#xA;&lt;p&gt;&#39;HT::Pro&#39; =&amp;gt; &amp;amp;htp,&lt;/p&gt;&#xA;&lt;p&gt;&#39;HT::Compiled&#39; =&amp;gt; &amp;amp;htc,&lt;/p&gt;&#xA;&lt;p&gt;&#39;TT&#39; =&amp;gt; &amp;amp;tt,&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;p&gt;);&lt;/p&gt;&#xA;&lt;p&gt;cmpthese $comp;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;template_speed_file.mt - Text::MicroTemplate用のファイル&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;? my $p = $_[0];&lt;/p&gt;&#xA;&lt;p&gt;Programming languages&lt;/p&gt;&#xA;&lt;p&gt;? for my $language (@{ $p-&amp;gt;{languages} }) {&lt;/p&gt;&#xA;&lt;p&gt;? }&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;template_speed_file.ht - HTML::Template::*用のファイル&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Programming languages&lt;/p&gt;&#xA;&lt;h1 id=&#34;tmpl_var-namepage_title-escapehtml&#34;&gt;&amp;lt;TMPL_VAR NAME=page_title ESCAPE=HTML&amp;gt;&lt;/h1&gt;&#xA;&lt;p&gt;&amp;lt;TMPL_LOOP NAME=languages&amp;gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&amp;lt;TMPL_IF NAME=ll&amp;gt;*&amp;lt;TMPL_VAR NAME=language ESCAPE=HTML&amp;gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;strong&gt;template_speed_file.tt - Template::Toolkit用のファイル&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Programming languages&lt;/p&gt;&#xA;&lt;h1 id=&#34;-page_title--html-&#34;&gt;[% page_title | html %]&lt;/h1&gt;&#xA;&lt;p&gt;[% FOREACH language IN languages %]&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;[% language.language | html %]&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;[% END %]&lt;/p&gt;&#xA;&lt;h3 id=&#34;htmlエスケープありなしのスピードについて&#34;&gt;HTMLエスケープあり/なしのスピードについて&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;#comment-152&#34;&gt;tokuhiromさんのコメント&lt;/a&gt;にあるように、Text::MicroTemplateは自動でHTMLエスケープがかかる一方、他のテンプレートエンジンでは手動でやる必要があるので、HTMLエスケープを入れて測り直してみました。ちなみに上に載せているベンチの結果は、HTMLエスケープを入れたものになっています。&lt;/p&gt;&#xA;&lt;p&gt;特筆すべきなのは、HTML::Template::CompiledがキャッシュありかつHTMLエスケープありの場合、HTMLエスケープなしに比べてパフォーマンスがかなり劣化している点です。(その他はちょっとずつパフォーマンスが劣化していますね)。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;キャッシュなしかつHTMLエスケープなし&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;$ perl template_speed_file.pl 3000 0&lt;/p&gt;&#xA;&lt;p&gt;Benchmark: timing 3000 iterations of HT, HT::Compiled, HT::Pro, MT, TT...&lt;/p&gt;&#xA;&lt;p&gt;HT: 4 wallclock secs ( 3.85 usr + 0.10 sys = 3.95 CPU) @ 759.49/s (n=3000)&lt;/p&gt;&#xA;&lt;p&gt;HT::Compiled: 10 wallclock secs ( 9.99 usr + 0.09 sys = 10.08 CPU) @ 297.62/s (n=3000)&lt;/p&gt;&#xA;&lt;p&gt;HT::Pro: 1 wallclock secs ( 0.21 usr + 0.02 sys = 0.23 CPU) @ 13043.48/s (n=3000)&lt;/p&gt;&#xA;&lt;p&gt;(warning: too few iterations for a reliable count)&lt;/p&gt;&#xA;&lt;p&gt;MT: 2 wallclock secs ( 2.35 usr + 0.05 sys = 2.40 CPU) @ 1250.00/s (n=3000)&lt;/p&gt;&#xA;&lt;p&gt;TT: 8 wallclock secs ( 7.83 usr + 0.15 sys = 7.98 CPU) @ 375.94/s (n=3000)&lt;/p&gt;&#xA;&lt;p&gt;Rate HT::Compiled TT HT MT HT::Pro&lt;/p&gt;&#xA;&lt;p&gt;HT::Compiled 298/s -- -21% -61% -76% -98%&lt;/p&gt;&#xA;&lt;p&gt;TT 376/s 26% -- -51% -70% -97%&lt;/p&gt;&#xA;&lt;p&gt;HT 759/s 155% 102% -- -39% -94%&lt;/p&gt;&#xA;&lt;p&gt;MT 1250/s 320% 233% 65% -- -90%&lt;/p&gt;&#xA;&lt;p&gt;HT::Pro 13043/s 4283% 3370% 1617% 943% --&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;キャッシュなしかつHTMLエスケープあり&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Benchmark: timing 3000 iterations of HT, HT::Compiled, HT::Pro, MT, TT...&lt;/p&gt;&#xA;&lt;p&gt;HT: 5 wallclock secs ( 4.60 usr + 0.09 sys = 4.69 CPU) @ 639.66/s (n=3000)&lt;/p&gt;&#xA;&lt;p&gt;HT::Compiled: 10 wallclock secs (10.56 usr + 0.10 sys = 10.66 CPU) @ 281.43/s (n=3000)&lt;/p&gt;&#xA;&lt;p&gt;HT::Pro: 1 wallclock secs ( 0.20 usr + 0.04 sys = 0.24 CPU) @ 12500.00/s (n=3000)&lt;/p&gt;&#xA;&lt;p&gt;(warning: too few iterations for a reliable count)&lt;/p&gt;&#xA;&lt;p&gt;MT: 2 wallclock secs ( 2.39 usr + 0.07 sys = 2.46 CPU) @ 1219.51/s (n=3000)&lt;/p&gt;&#xA;&lt;p&gt;TT: 10 wallclock secs ( 9.65 usr + 0.17 sys = 9.82 CPU) @ 305.50/s (n=3000)&lt;/p&gt;&#xA;&lt;p&gt;Rate HT::Compiled TT HT MT HT::Pro&lt;/p&gt;&#xA;&lt;p&gt;HT::Compiled 281/s -- -8% -56% -77% -98%&lt;/p&gt;&#xA;&lt;p&gt;TT 305/s 9% -- -52% -75% -98%&lt;/p&gt;&#xA;&lt;p&gt;HT 640/s 127% 109% -- -48% -95%&lt;/p&gt;&#xA;&lt;p&gt;MT 1220/s 333% 299% 91% -- -90%&lt;/p&gt;&#xA;&lt;p&gt;HT::Pro 12500/s 4342% 3992% 1854% 925% --&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;キャッシュありかつHTMLエスケープなし&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;$ perl template_speed_file.pl 3000 1&lt;/p&gt;&#xA;&lt;p&gt;Benchmark: timing 3000 iterations of HT, HT::Compiled, HT::Pro, MT, TT...&lt;/p&gt;&#xA;&lt;p&gt;HT: 3 wallclock secs ( 2.50 usr + 0.00 sys = 2.50 CPU) @ 1200.00/s (n=3000)&lt;/p&gt;&#xA;&lt;p&gt;HT::Compiled: 0 wallclock secs ( 0.15 usr + 0.00 sys = 0.15 CPU) @ 20000.00/s (n=3000)&lt;/p&gt;&#xA;&lt;p&gt;(warning: too few iterations for a reliable count)&lt;/p&gt;&#xA;&lt;p&gt;HT::Pro: 0 wallclock secs ( 0.10 usr + 0.04 sys = 0.14 CPU) @ 21428.57/s (n=3000)&lt;/p&gt;&#xA;&lt;p&gt;(warning: too few iterations for a reliable count)&lt;/p&gt;&#xA;&lt;p&gt;MT: 0 wallclock secs ( 0.21 usr + 0.00 sys = 0.21 CPU) @ 14285.71/s (n=3000)&lt;/p&gt;&#xA;&lt;p&gt;(warning: too few iterations for a reliable count)&lt;/p&gt;&#xA;&lt;p&gt;TT: 1 wallclock secs ( 1.19 usr + 0.01 sys = 1.20 CPU) @ 2500.00/s (n=3000)&lt;/p&gt;&#xA;&lt;p&gt;Rate HT TT MT HT::Compiled HT::Pro&lt;/p&gt;&#xA;&lt;p&gt;HT 1200/s -- -52% -92% -94% -94%&lt;/p&gt;&#xA;&lt;p&gt;TT 2500/s 108% -- -82% -87% -88%&lt;/p&gt;&#xA;&lt;p&gt;MT 14286/s 1090% 471% -- -29% -33%&lt;/p&gt;&#xA;&lt;p&gt;HT::Compiled 20000/s 1567% 700% 40% -- -7%&lt;/p&gt;&#xA;&lt;p&gt;HT::Pro 21429/s 1686% 757% 50% 7% --&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;キャッシュありかつHTMLエスケープあり&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Benchmark: timing 3000 iterations of HT, HT::Compiled, HT::Pro, MT, TT...&lt;/p&gt;&#xA;&lt;p&gt;HT: 3 wallclock secs ( 2.69 usr + 0.00 sys = 2.69 CPU) @ 1115.24/s (n=3000)&lt;/p&gt;&#xA;&lt;p&gt;HT::Compiled: 0 wallclock secs ( 0.28 usr + 0.00 sys = 0.28 CPU) @ 10714.29/s (n=3000)&lt;/p&gt;&#xA;&lt;p&gt;(warning: too few iterations for a reliable count)&lt;/p&gt;&#xA;&lt;p&gt;HT::Pro: 0 wallclock secs ( 0.13 usr + 0.02 sys = 0.15 CPU) @ 20000.00/s (n=3000)&lt;/p&gt;&#xA;&lt;p&gt;(warning: too few iterations for a reliable count)&lt;/p&gt;&#xA;&lt;p&gt;MT: 1 wallclock secs ( 0.22 usr + 0.01 sys = 0.23 CPU) @ 13043.48/s (n=3000)&lt;/p&gt;&#xA;&lt;p&gt;(warning: too few iterations for a reliable count)&lt;/p&gt;&#xA;&lt;p&gt;TT: 1 wallclock secs ( 1.84 usr + 0.00 sys = 1.84 CPU) @ 1630.43/s (n=3000)&lt;/p&gt;&#xA;&lt;p&gt;Rate HT TT HT::Compiled MT HT::Pro&lt;/p&gt;&#xA;&lt;p&gt;HT 1115/s -- -32% -90% -91% -94%&lt;/p&gt;&#xA;&lt;p&gt;TT 1630/s 46% -- -85% -87% -92%&lt;/p&gt;&#xA;&lt;p&gt;HT::Compiled 10714/s 861% 557% -- -18% -46%&lt;/p&gt;&#xA;&lt;p&gt;MT 13043/s 1070% 700% 22% -- -35%&lt;/p&gt;&#xA;&lt;p&gt;HT::Pro 20000/s 1693% 1127% 87% 53% --&lt;/p&gt;&#xA;&lt;p&gt;[rakuten]book:11995194[/rakuten]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>hbstudy#5に参加してきました</title>
				<link>https://journal.lampetty.net/posts/wp/347/</link>
				<pubDate>Sat, 14 Nov 2009 16:11:33 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/347/</guid>
				<description>&lt;p&gt;インフラエンジニアじゃないけど&lt;a href=&#34;http://heartbeats.jp/hbstudy/2009/11/hbstudy5.html&#34;&gt;インフラエンジニア勉強会 hbstudy#5&lt;/a&gt;に参加してきました。もともとこのイベントには参加したいなぁと思っていて、参加登録したらいいタイミングで松信さんが講演することにw 貴重なMySQLのチューニングの話が生で聞けてとてもよかったよかった。&lt;/p&gt;&#xA;&lt;p&gt;あと、最初にPostgreSQLの話をしていた永安さんのセッションもよかった。普通DBの入門の話ってあまりつっこんだ運用の話は出てこないと思うのですが、運用を意識した入門編でこういうのはすごい貴重だったのではないかと。&lt;/p&gt;&#xA;&lt;h3 id=&#34;postgresql安定運用のコツ2009&#34;&gt;PostgreSQL安定運用のコツ2009&lt;/h3&gt;&#xA;&lt;p&gt;永安さんの話は&lt;a href=&#34;http://www.slideshare.net/uptimejp/postgresql2009-hbstudy5&#34;&gt;スライド&lt;/a&gt;を見てもらえばほぼ全てわかります。スライドが充実し過ぎていてあまりメモを取っていなかったのですが、最近のポスグレはAuto Vacuumなんて仕組みがあって、あまりVacuumを意識しなくてよいのだなぁと。あとポスグレもチューニングはいかに共有バッファをうまく使うかっていうところで、あんまりMySQLと変わらないんだなって思いました。&lt;/p&gt;&#xA;&lt;h3 id=&#34;linux-mysqlサーバーのパフォーマンスチューニング&#34;&gt;Linux MySQLサーバーのパフォーマンスチューニング&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.mysql.gr.jp/frame/modules/bwiki/index.php?plugin=attach&amp;amp;refer=matsunobu&amp;amp;openfile=Linux-MySQL-PT.pdf&#34;&gt;資料(PDF)&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;MySQLのチューニングの基本はデータサイズを小さくしていかにメモリにのっけるか、という話。たとえば、日時を格納するカラムはDATETIME(8byte使用)じゃなくてTIMESTAMP(4byte)を使えとか。statusみたいな1/0しか入らないカラムは文字列型じゃなくてTINYINTかENUM使えとか。ちなみに日時は2038年問題が気にならないのであれば、UNIXTIME化してINT型のフィールドにしてしまうという荒技もありますよね。アプリケーション側でいちいち変換しなくてはいけないですが。&lt;/p&gt;&#xA;&lt;p&gt;あと「巨大なTEXT/BLOBはクエリ効率を悪化させる」という話で、巨大なデータを格納するカラムは別テーブルにすると、それ以外のカラムのデータをSELECTするときに悪影響が出ないらしい。ちょっとどういう話か失念してしまったので、資料が公開されたら復習します。一定以上の大きさのテキストフィールドを別領域に保存するストレージエンジンとして、Falcon, PBXTがあるとのこと。ちなみに、HDDが一秒間に処理できるランダムI/Oはせいぜい数百ぐらいなので、とても遅いですと。&lt;/p&gt;&#xA;&lt;p&gt;あとは実データを引かずにCovering Index(インデックスだけを読む検索)でうまく処理する方法もあるそうで、&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;テーブルのレコードにアクセスする必要がなくなるので、高速になる&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Indexのサイズが大きくなるので、更新のコストが高くなる&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Limit句を使うときにも効果がある&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;というメリットデメリットがあるそうです。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;メモリを十分に確保してダイレクトI/Oを活用する&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;オンライン処理のあとに、バッチ処理で巨大なテーブルに対してフルスキャンするのは問題がある&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;バッチ処理によるバッファプールが占有され、オンラインのバッファプールが追い出されてしまうため&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;OOM Killerに注意する&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;ダイレクトI/Oを使うとプロセス内にデータが置かれるので、プロセスのサイズが大きくなる&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;DBサーバとしてはファイルシステムキャッシュを縮小してほしい&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;# echo 0 &amp;gt; /proc/sys/vm/swappiness = 0&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;-&amp;gt; Direct I/Oとセットで使うことが多い&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;cpで大きいファイルをコピー&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;cpに対してファイルシステムキャッシュが使われる&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;InnoDBのプロセスのデータがスワップに追い出される-&amp;gt;これは避けたい&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;ファイルシステムはext3&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;もっとも使われていて安全&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;dir_index, noatime(relatime)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;xfsはDirect I/Oだと並列で書き込める&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;xfsは巨大なファイルのコピーがはやい&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;でもxfs使っている人少なすぎなので、おすすめできないｗ&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;監視の方法&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;iotop: プロセス単位でI/O量を取る kernel 2.6.20以降&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;ネットワーク統計: MySQL Cluster使う人には必要かも&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;mtstat: 一秒おきに受信/送信byte数を表示&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;/proc/net/dev をみればわかる情報&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;SSD&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;ランダムリードはHDD: 200回にたいして、25000回のI/O (Intel X25E)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;書き込み性能は製品による差が激しい&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;write cache必須&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;バッテリーで守れていることが重要。RAIDコントローラに任せるものとSSD自身で持つものがある(RAID Controllerの場合はそれがSSDに対応していることが重要)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;SSDは並列性が重要。Crystalなんとかのベンチはシングルプロセスの話なのであてにならない&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;PCI-E型SSDにも注目 -&amp;gt; I/Fの速度が速い(300MB -&amp;gt; 2GB)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;途中から殴り書きですが、TIMESTAMP型が4byteとDATETIMEの半分で済むことにこの日初めて知りました。その他Covering Indexなど、知らなかったテクニックなのでとても勉強になりました。あとSSDは本当もうすぐそこまで来ていて、これを入れるだけで数倍DBのI/Oが速くなることを考えるとすごいなぁと。しかし色々ベンチ取られていて、すごく説得力のあるお話でした。この人にコンサル頼んだらいくらかかるんだろう...&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>PHPでFatal error: Allowed memory size of ...が出た場合の対処方法</title>
				<link>https://journal.lampetty.net/posts/wp/341/</link>
				<pubDate>Sat, 07 Nov 2009 14:11:30 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/341/</guid>
				<description>&lt;p&gt;あまりPHPのことわからないのですが、WordPressで&lt;/p&gt;&#xA;&lt;p&gt;Fatal error: Allowed memory size of 8388608 bytes exhausted&lt;/p&gt;&#xA;&lt;p&gt;というエラーメッセージが出ました。ぐぐると「php.iniのmemory_limitを64Mとか大きな値に設定すべし」とあるのですが、Ubuntuの /usr/share/php5/php.ini を&lt;/p&gt;&#xA;&lt;p&gt;memory_limit = 64M&lt;/p&gt;&#xA;&lt;p&gt;と直しても改善しませんでした。で、さらに調べてみるとどうやら /etc/php5/apache2/php.ini なんていうファイルが... これを上記と同じように64Mにしてapacheを再起動すると、めでたくエラーは出なくなりました。紛らわしいからphp.iniは一つにしておいてほしい...&lt;/p&gt;&#xA;&lt;p&gt;[rakuten]book:13992207[/rakuten]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>キーボードショートカットでMacをシステム終了</title>
				<link>https://journal.lampetty.net/posts/wp/340/</link>
				<pubDate>Sat, 07 Nov 2009 14:11:21 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/340/</guid>
				<description>&lt;p&gt;いっつも忘れるのでメモ。Macをキーボードショートカットだけで終了する方法はControl + Option + Command + Eject 。右手でControlとOptionを押して、左手でCommand + Ejectを押す感じにしています。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Perlで楽天ブックスジャンル検索APIを使う</title>
				<link>https://journal.lampetty.net/posts/wp/339/</link>
				<pubDate>Wed, 23 Sep 2009 14:09:14 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/339/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;https://journal.lampetty.net/tech/index.php/archives/338&#34;&gt;PerlでAmazon Product Advertising APIのBrowseNodeLookupを行なう&lt;/a&gt;の楽天版です。Amazon Product Advertising APIはRESTしかないのですが、楽天ウェブサービスはRESTとJSONに対応しているので、今回はJSONを使ってみます。&lt;/p&gt;&#xA;&lt;p&gt;(ファイル名はsample_books_genre_search.pl)&lt;/p&gt;&#xA;&lt;p&gt;#!/usr/bin/env perl&lt;/p&gt;&#xA;&lt;p&gt;use strict;&lt;/p&gt;&#xA;&lt;p&gt;use warnings;&lt;/p&gt;&#xA;&lt;p&gt;use Data::Dumper qw(Dumper);&lt;/p&gt;&#xA;&lt;p&gt;use JSON::Syck qw(Load);&lt;/p&gt;&#xA;&lt;p&gt;use LWP::UserAgent;&lt;/p&gt;&#xA;&lt;p&gt;use URI;&lt;/p&gt;&#xA;&lt;p&gt;my $uri = URI-&amp;gt;new(&#39;&lt;a href=&#34;http://api.rakuten.co.jp/rws/2.0/json&#39;);&#34;&gt;http://api.rakuten.co.jp/rws/2.0/json&#39;);&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;$uri-&amp;gt;query_form(&lt;/p&gt;&#xA;&lt;p&gt;developerId =&amp;gt; &#39;Your Developer ID&#39;,&lt;/p&gt;&#xA;&lt;p&gt;operation =&amp;gt; &#39;BooksGenreSearch&#39;,&lt;/p&gt;&#xA;&lt;p&gt;version =&amp;gt; &#39;2009-03-26&#39;,&lt;/p&gt;&#xA;&lt;p&gt;booksGenreId =&amp;gt; shift || &#39;000&#39;,&lt;/p&gt;&#xA;&lt;p&gt;);&lt;/p&gt;&#xA;&lt;p&gt;my $ua = LWP::UserAgent-&amp;gt;new;&lt;/p&gt;&#xA;&lt;p&gt;my $res = $ua-&amp;gt;get($uri);&lt;/p&gt;&#xA;&lt;p&gt;$Data::Dumper::Indent = 1;&lt;/p&gt;&#xA;&lt;p&gt;if ($res-&amp;gt;is_success) {&lt;/p&gt;&#xA;&lt;p&gt;print Dumper(Load($res-&amp;gt;content)-&amp;gt;{Body}), &amp;quot;n&amp;quot;;&lt;/p&gt;&#xA;&lt;p&gt;} else {&lt;/p&gt;&#xA;&lt;p&gt;print $res-&amp;gt;status_line, $res-&amp;gt;as_string, &amp;quot;n&amp;quot;;&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;p&gt;$ perl sample_books_genre_search.pl 000&lt;/p&gt;&#xA;&lt;p&gt;と実行すると、以下のような結果が得られます。引数の&amp;quot;000&amp;quot;はルートのジャンルIDです。これを&amp;quot;001&amp;quot;のようにすると、&amp;quot;本&amp;quot;のジャンルの子ジャンルが取れます。&lt;/p&gt;&#xA;&lt;p&gt;$VAR1 = {&lt;/p&gt;&#xA;&lt;p&gt;&#39;BooksGenreSearch&#39; =&amp;gt; {&lt;/p&gt;&#xA;&lt;p&gt;&#39;parent&#39; =&amp;gt; ,&lt;/p&gt;&#xA;&lt;p&gt;&#39;current&#39; =&amp;gt; ,&lt;/p&gt;&#xA;&lt;p&gt;&#39;child&#39; =&amp;gt; [&lt;/p&gt;&#xA;&lt;p&gt;{&lt;/p&gt;&#xA;&lt;p&gt;&#39;genreName&#39; =&amp;gt; &#39;本&#39;,&lt;/p&gt;&#xA;&lt;p&gt;&#39;genreId&#39; =&amp;gt; &#39;001&#39;,&lt;/p&gt;&#xA;&lt;p&gt;&#39;genreLevel&#39; =&amp;gt; 1&lt;/p&gt;&#xA;&lt;p&gt;},&lt;/p&gt;&#xA;&lt;p&gt;{&lt;/p&gt;&#xA;&lt;p&gt;&#39;genreName&#39; =&amp;gt; &#39;CD&#39;,&lt;/p&gt;&#xA;&lt;p&gt;&#39;genreId&#39; =&amp;gt; &#39;002&#39;,&lt;/p&gt;&#xA;&lt;p&gt;&#39;genreLevel&#39; =&amp;gt; 1&lt;/p&gt;&#xA;&lt;p&gt;},&lt;/p&gt;&#xA;&lt;p&gt;{&lt;/p&gt;&#xA;&lt;p&gt;&#39;genreName&#39; =&amp;gt; &#39;DVD&#39;,&lt;/p&gt;&#xA;&lt;p&gt;&#39;genreId&#39; =&amp;gt; &#39;003&#39;,&lt;/p&gt;&#xA;&lt;p&gt;&#39;genreLevel&#39; =&amp;gt; 1&lt;/p&gt;&#xA;&lt;p&gt;},&lt;/p&gt;&#xA;&lt;p&gt;(以下省略)&lt;/p&gt;&#xA;&lt;p&gt;};&lt;/p&gt;&#xA;&lt;p&gt;Amazonと楽天の両方のAPIを見ていて思ったのですが、Amazonのカテゴリを表すBrowseNodeは、例えば&amp;quot;本&amp;quot;とかそういうカテゴリだけじゃなくて、&amp;quot;岩波書店&amp;quot;みたいな出版社にも適用されています。例えば、&amp;quot;岩波書店&amp;quot;にはBrowseNodeIdとして&amp;quot;516508&amp;quot;が割り振られていて、子ノードには&amp;quot;岩波文庫&amp;quot;や&amp;quot;岩波現代文庫&amp;quot;があり、「出版社別」みたいな切り口でも商品を分類することが可能です。&lt;/p&gt;&#xA;&lt;p&gt;一方で楽天の場合は、商品一つに対してジャンルという純粋な一つのカテゴリしか設定されないようなデータ構造になっています。サイトを作る上では、様々な切り口で商品を分類できた方が集客がしやすいので、個人的には楽天ウェブサービスにもBrowseNodeみたいな概念を取り入れてもらいたいなぁと思いました。(リクエストはしました)&lt;/p&gt;&#xA;&lt;p&gt;というわけであまりまとまってないですが、こうやってECサイトのAPIが利用できると個人でもECサイトが持てるので夢が広がっていいなぁと感じています。といってもアフィリエイトだったら利益はたかが知れているので、よっぽど頑張らないといけないと思いますが...&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>PerlでAmazon Product Advertising APIのBrowseNodeLookupを行なう</title>
				<link>https://journal.lampetty.net/posts/wp/338/</link>
				<pubDate>Tue, 22 Sep 2009 18:09:10 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/338/</guid>
				<description>&lt;p&gt;AmazonのProduct Advertising APIで、あるカテゴリの下にあるカテゴリ(BrowseNode)を取得するPerlスクリプトを書いてみました。最初は&lt;a href=&#34;http://search.cpan.org/dist/Net-Amazon/lib/Net/Amazon.pm&#34;&gt;Net::Amazon&lt;/a&gt;を使っていたのですが、オブジェクトを大量に生成するためかとてつもなく重いのと、返ってくるオブジェクトの構成がよくわからなかったので、自前で処理してみるとさくっとできました。&lt;/p&gt;&#xA;&lt;p&gt;#!/usr/bin/env perl&lt;/p&gt;&#xA;&lt;p&gt;use strict;&lt;/p&gt;&#xA;&lt;p&gt;use warnings;&lt;/p&gt;&#xA;&lt;p&gt;use Encode qw(encode);&lt;/p&gt;&#xA;&lt;p&gt;use LWP::UserAgent;&lt;/p&gt;&#xA;&lt;p&gt;use URI::Amazon::APA;&lt;/p&gt;&#xA;&lt;p&gt;use XML::Simple;&lt;/p&gt;&#xA;&lt;p&gt;use YAML qw(Dump);&lt;/p&gt;&#xA;&lt;p&gt;unless (@ARGV) {&lt;/p&gt;&#xA;&lt;p&gt;print STDERR &amp;quot;usage: $0 browse_node_idn&amp;quot;;&lt;/p&gt;&#xA;&lt;p&gt;exit 255;&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;p&gt;my $uri = URI::Amazon::APA-&amp;gt;new(&#39;&lt;a href=&#34;http://ecs.amazonaws.jp/onca/xml&#39;);&#34;&gt;http://ecs.amazonaws.jp/onca/xml&#39;);&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;my $browse_node_id = shift;&lt;/p&gt;&#xA;&lt;p&gt;$uri-&amp;gt;query_form(&lt;/p&gt;&#xA;&lt;p&gt;Service =&amp;gt; &#39;AWSECommerceService&#39;,&lt;/p&gt;&#xA;&lt;p&gt;Operation =&amp;gt; &#39;BrowseNodeLookup&#39;,&lt;/p&gt;&#xA;&lt;p&gt;SearchIndex =&amp;gt; &#39;Books&#39;,&lt;/p&gt;&#xA;&lt;p&gt;BrowseNodeId =&amp;gt; $browse_node_id,&lt;/p&gt;&#xA;&lt;p&gt;);&lt;/p&gt;&#xA;&lt;p&gt;$uri-&amp;gt;sign(&lt;/p&gt;&#xA;&lt;p&gt;key =&amp;gt; &#39;key&#39;,&lt;/p&gt;&#xA;&lt;p&gt;secret =&amp;gt; &#39;secret_key&#39;&lt;/p&gt;&#xA;&lt;p&gt;);&lt;/p&gt;&#xA;&lt;p&gt;my $ua = LWP::UserAgent-&amp;gt;new;&lt;/p&gt;&#xA;&lt;p&gt;my $res = $ua-&amp;gt;get($uri);&lt;/p&gt;&#xA;&lt;p&gt;my $content = XMLin($res-&amp;gt;content);&lt;/p&gt;&#xA;&lt;p&gt;my $children = $content-&amp;gt;{BrowseNodes}-&amp;gt;{BrowseNode}-&amp;gt;{Children}-&amp;gt;{BrowseNode};&lt;/p&gt;&#xA;&lt;p&gt;if ($res-&amp;gt;is_success) {&lt;/p&gt;&#xA;&lt;p&gt;print encode(&#39;utf-8&#39;, Dump($children)), &amp;quot;n&amp;quot;;&lt;/p&gt;&#xA;&lt;p&gt;} else {&lt;/p&gt;&#xA;&lt;p&gt;print $res-&amp;gt;status_line, $res-&amp;gt;as_string, &amp;quot;n&amp;quot;;&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;p&gt;$ perl sample_browse_node.pl 465610&lt;/p&gt;&#xA;&lt;p&gt;とすると下みたいな感じで下の階層のカテゴリを表示します。ちなみに465610は本のBrowseNodeIdです。Net::Amazon--、URI::Amazon::APA++ということで。&lt;/p&gt;&#xA;&lt;p&gt;---&lt;/p&gt;&#xA;&lt;p&gt;- BrowseNodeId: 466284&lt;/p&gt;&#xA;&lt;p&gt;Name: 文学・評論&lt;/p&gt;&#xA;&lt;p&gt;- BrowseNodeId: 466288&lt;/p&gt;&#xA;&lt;p&gt;Name: 思想・社会・ノンフィクション&lt;/p&gt;&#xA;&lt;p&gt;- BrowseNodeId: 571582&lt;/p&gt;&#xA;&lt;p&gt;Name: 人文・思想&lt;/p&gt;&#xA;&lt;p&gt;- BrowseNodeId: 571584&lt;/p&gt;&#xA;&lt;p&gt;Name: 社会・政治&lt;/p&gt;&#xA;&lt;p&gt;- BrowseNodeId: 492152&lt;/p&gt;&#xA;&lt;p&gt;Name: ノンフィクション&lt;/p&gt;&#xA;&lt;p&gt;- BrowseNodeId: 466286&lt;/p&gt;&#xA;&lt;p&gt;Name: 歴史・地理&lt;/p&gt;&#xA;&lt;p&gt;- BrowseNodeId: 466282&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>YAPC::Asia 2009に行ってきました(9.10)</title>
				<link>https://journal.lampetty.net/posts/wp/335/</link>
				<pubDate>Thu, 17 Sep 2009 15:09:41 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/335/</guid>
				<description>&lt;p&gt;2009/9/10,11に開催されたYAPC::Asia 2009に参加しました。今年はフレームワークやORM系のセッションがとても豪華で全部聞きたいなと思っていたので、迷うことなく有給を取って参加。というわけで殴り書きですがメモと感想を徒然に書いてみます。&lt;/p&gt;&#xA;&lt;h3 id=&#34;psgi---perl-server-gateway-interface&#34;&gt;PSGI - Perl Server Gateway Interface&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://tokuhirom.github.com/talks/20090910-yapcasia2009-psgi-plack/&#34;&gt;スライド&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;tokuhiromさんとmiyagawaさんのコラボレーション。PSGIは仕様でPlackは実装。HTTP::Engineには仕様とAPIと実装が全て入っていたのでこれを分離しましたよ、というお話。YAPCの1週間前ぐらいから開発し始めていてすごい勢いで実装されているらしいです。PlackはいわゆるReference Implementationですが、かなり速いという話でした。Reference Implementationという用語を聞いて、JavaのServlet APIをなんとなく思い出しました。&lt;/p&gt;&#xA;&lt;h3 id=&#34;シックスアパートフレームワーク&#34;&gt;シックスアパートフレームワーク&lt;/h3&gt;&#xA;&lt;p&gt;shigetaさん&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.slideshare.net/comewalk/ss-1994397&#34;&gt;スライド&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Six ApartではMTフレームワーク, ArcheTypeの2種類のフレームワークがある。&lt;/p&gt;&#xA;&lt;p&gt;MTではMTオブジェクトがData::ObjectDriverを継承している。Data::ObjectDriverはSix ApartのCTOの人が作っているORマッパ。memcachedによるwrite-throughキャッシュが実装されてたり、shardingもサポートされている。たしか2年前ぐらいのYAPCでセッションやってたと思います。&lt;/p&gt;&#xA;&lt;p&gt;驚きだったのは、TypepadではHTML::Templateを使っているということ。普通はTTとか最近だったらText::MicroTemplateのような高機能なものを使うと思うのですが、ななぜあえてHTML::Templateなんでしょうか。っていうのを質問すれば良かったと今になって後悔。&lt;/p&gt;&#xA;&lt;h3 id=&#34;api-design&#34;&gt;API Design&lt;/h3&gt;&#xA;&lt;p&gt;sartak - Shawn M Mooreさん。Mooseのコミッター。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://sartak.org/talks/yapc-asia-2009/api-design/api-design.pdf&#34;&gt;スライド&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Moose&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Path::Dispatcher&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;HTTP::Engine&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Dist::Zilla&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;IM::Engine&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;今日はこれらのプロジェクトが持つクールなAPIの話をします。大事なのはテストをたくさん書くこと！なぜならテストを書けば使いやすいAPIかどうかわかる！あとはMooseなどの話。HTTP::Engineは新しいサーバのInterfaceが出てきても一行書き換えれば対応可能なところが素晴らしい、と言っていました。&lt;/p&gt;&#xA;&lt;p&gt;英語だったので話の内容の半分も理解できなかったのが無念...&lt;/p&gt;&#xA;&lt;h3 id=&#34;modern-catalyst&#34;&gt;Modern Catalyst&lt;/h3&gt;&#xA;&lt;p&gt;hidekさん。最近DeNAに転職した? らしい。&lt;a href=&#34;http://www.slideshare.net/hidek/modern-catalyst&#34;&gt;スライド&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Catalyst 5.8について&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Mooseベースになった&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;M,V,Cの名前空間がdepreatedになった&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;NEXTが...&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Catalyst::PluginなnamespaceのプラグインをCPANにあげるとmstにおこられるw&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;他のセッションでも「Catalyst 5.8使ってます」という話をちらほら聞いたのですが、Mooseベースになったら速度が遅くなったりしてないのかな、というのが気になっています。&lt;/p&gt;&#xA;&lt;h3 id=&#34;ark---framework-inspired-by-catalyst&#34;&gt;ark - framework inspired by Catalyst&lt;/h3&gt;&#xA;&lt;p&gt;KAYACのtypesterさん。&lt;a href=&#34;http://typester.stfuawsc.com/slides/yapsasia2009-ark/&#34;&gt;スライド&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;KAYACでは大量に自社サービスを作っている。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Catalystでもいいんだけど、もうちょっとライトなWAFがよかったのでHTTP::Engineをベースに作った。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;CGIモードでも割とサクサク動くようになってる。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;CGIの場合はクラスはlazy loadingするように工夫&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;あとdispatch tableのキャッシュもしている&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;テンプレートはText::MicroTemplate::Extendedというものを使うのが推奨されている。もともとはMojo::Templateをokuさんが切り出したもので、それを拡張している。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Ark::Models - CLIスクリプトからでもModelを使える仕組み。あとlazy loadingをやったり。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Ark::Form - HTML::Shakanベース&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;KAYACのArkで作られたサービスの一部はなんとソースコードが公開されている！&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://github.com/kayac/inamena.kayac.com&#34;&gt;いなめなヶ崎&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://github.com/kayac/im.kayac.com&#34;&gt;im.kayac.com&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Ark、Catalystとほぼ互換っていうのがいいなぁというのと、日本のモバイル対応版が早くリリースされないかな、って思いました。モバイル対応はもう必須になりつつあるような世の中なので、そのあたりのベストプラクティスを積み上げていってほしいなぁと。&lt;/p&gt;&#xA;&lt;h3 id=&#34;優しいモダンなwafの作り方&#34;&gt;優しいモダンなWAFの作り方&lt;/h3&gt;&#xA;&lt;p&gt;dannさん。&lt;a href=&#34;http://www.slideshare.net/techmemo/waf&#34;&gt;スライド&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;モダンなWAFとは？&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;プラガブル - Plagger&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;サーバ抽象化 - PythonのWSGI&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;フルスタック - Rails&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Angelos::PSGI::Engine&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Plack::Requestを使ってる&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;HTTP::Routerを使ってる&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;シンプルなWAFなら2,3時間あれば作れちゃう！&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;次、WAFの拡張部分の作り方(プラグイン)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;コアは小さく&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;拡張可能な箇所を限定(Controller, View, Middleware, Request, Response)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Hookポイントを明確にする&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;プラグインの種類は大きく分けると2種類&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;RequestやResponseのライフサイクルへのHook系&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;メソッドはやす系&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;適切なデフォルトセットの提供することが重要&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;そうしないとUnicode化するためのTIPSが乱立したり、Inflate/Deflateするための(ry&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;HTTP::EngineやPlack、HTTP::RouterなどのモジュールのおかげでWAF作りがかつてないほど簡単になっている！&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Arkの話も聞いてて思ったのですが、Sinatraみたいなレベルであれば本当に2,3時間で作れそうな気がしました。これからフレームワーク戦国時代の幕開けですね。そして懇親会でも直接dannさんに言ったのですが、Angelosを早くリリースしてほしいです... (切実)&lt;/p&gt;&#xA;&lt;h3 id=&#34;bookingcom--perl&#34;&gt;Booking.com &amp;amp; Perl&lt;/h3&gt;&#xA;&lt;p&gt;Cristina Nunesさん(from リスボン,ポルトガル)。&lt;a href=&#34;http://www.slideshare.net/cmnunes/bookingcom-perl&#34;&gt;スライド&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Class::DBI(frozen version)&lt;/p&gt;&#xA;&lt;p&gt;HTML::Mason&lt;/p&gt;&#xA;&lt;p&gt;HTML::Template (forked version)&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Perl 5.8.8&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Class::DBI&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;HTML::Mason&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;HTML::Template(forked version)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;なぜPerl? --&amp;gt; 簡単で速い&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;なぜHTML::Template? --&amp;gt; 簡単&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;なぜClass::DBI? --&amp;gt; 聞き取れず(一番聞きたかったのに)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Apache + mod_perl&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;MySQL&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;memcached&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;git&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Jabber&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;将来のゴール&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Perl upgrade&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Modules upgrade&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Apache + mod_perl upgrade (to 2.x)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;MySQL upgrade (to 5.1 or 5.4)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;フロントエンドのWeb Server: 100台以上&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;MySQLサーバ: 100台以上&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;データセンターにあるサーバは700台以上&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;IT at Booking.com&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Perl developers&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Java developers&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Network engineers&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Sysadmins (社内SEみたいなものかな)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Web designers&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;世界に25オフィスある&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;1900人の従業員&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;71000L hosts over 70 countries&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;4500+ distribution partners&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;24 languages available on website&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Booking.comって初めて知ったのですが、ヨーロッパのホテルはかなり網羅されているという情報がIRCで流れてました。なんでいまだにClass::DBI使ってるんだろう、と思いましたが、mod_perlのバージョンも1.x系なので、やっぱりサーバの台数が多いとアップグレードも大変なのでしょうね。「Booking.comという会社は著名なPerl hackerを何人も抱えている会社なのです」という牧さんの補足がありました。&lt;/p&gt;&#xA;&lt;h3 id=&#34;key-value-store-with-or-mapper&#34;&gt;Key Value Store with O/R Mapper&lt;/h3&gt;&#xA;&lt;p&gt;yappoさん。&lt;a href=&#34;http://yappo.ficia.com/#album/1E8DF4EE-9DB6-11DE-B1EE-7BD1A805B909&#34;&gt;スライド&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Key Value StoreとO/R Mapperの合わせ技 --&amp;gt; Data::Model&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Data::ModelはいわゆるO/R Mapper&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;DBI, memcached protocol, Perl hash, Perl code, Gearman&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Q4Mにネイティブ対応&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;透過キャッシュ&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;MixinによるSchemaクラスの拡張&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;ちょっとなういイテレータ&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;なんで既製品では駄目だったのか？&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Class::DBI - DBICに移行する方向になってる。偉大なる先輩に感謝&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;DBIx::Class - 過去に使っていたがあまりいい思い出がなかった&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Rose::DB, Jifty::DBI - 見る時間があまり取れず...&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;DBIx::Moco - ドキュメント少ない。実際にサービスで投入されているものと公開されているモジュールの差異が激しい&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Data::ObjectDriver - Six Apart謹製。意外とテスト少ない＆document少ない。ただしコードは大分参考にさせてもらった&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;DBIx::Skinny - 日本のPerl ORM専門家のもの。シンプルなスキーマに対して「生SQL書けます」はあまり魅力的じゃなかった。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;結局調べているうちにORM作成のポイントがわかってきたので自分で作ることにした&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;ORMはSchema, Iterator, Row, SQL, DBの5つのものがあればよい&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Data::Modelのデモ(詳しくはスライドを参照)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;TokyoCabinetをストレージとして使う場合、データを小さくした方がキャッシュにのったり色々嬉しいので、データは圧縮して小さくするべし。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Perl標準のStorableはデータ効率が悪いことで有名 --&amp;gt; 代わりにMessagePackを使用(これがすごいらしい)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;KVSがストレージならALTER TABLEが必要なくなる。FriendFeedの例のようにすれば、スキーマなくても大丈夫&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;MessagePackがとにかくすごいらしい&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;まずスライドがFiciaだったのが驚きでした。なるほど、そういう使い方できるんですねー。途中のData::Modelのチュートリアルでは、その高機能さ(透過キャッシュやMasterSlave、column_sugar)に驚きました。自分でもオレオレORM作ってるのですが、相当レベル違うなと感激しましたです。その他、MessagePackがすごい使えそう、というのがよくわかりました。圧縮のアルゴリズムがカリカリ過ぎです。&lt;/p&gt;&#xA;&lt;h3 id=&#34;simple-or-mapper-dbixskinny&#34;&gt;simple or mapper DBIx::Skinny&lt;/h3&gt;&#xA;&lt;p&gt;nekokakさん。&lt;a href=&#34;http://nekokak.org/presen/yapcasia2009-dbix-skinny/&#34;&gt;スライド&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;なぜ自分でORMapperを作ったか？&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;DBIx::Classが微妙...&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;便利だけど発行されるSQLが微妙&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;パフォーマンスが出なかったりする&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;生成されるオブジェクトがでかすぎるため重い&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;カスタマイズしようにもソースがでかすぎる&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;DBICで速度でない場合は生SQL書くことがあるが、Inflateとかしてくれない&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;生SQL書いてinflate/deflateしてくれるライトなものでいいんじゃないか、というところにたどりついた&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;DBIx::Skinnyのデモ&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;relationshipは特に何もしない&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;コアは小さく、がモットーなので、拡張したい人はラッパーを書けばいい&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;何人かの人に興味持ってるみたいなので、Skinnyみたいな方向性はありなのだなと思った。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;ちょいと前にSkinnyのバグを見つけたのでメールでパッチ送ったりしていて、ちょうどYAPC当日にnekokakさんと直接お話させてもらう機会があったのですが、いやー非常に嬉しかったです。懇親会でもお話しさせてもらったのですが、やっぱり生SQL全然ありだよね、と思いました。もともと自分がSkinnyに興味を持ったのは、自分が3年前ぐらいに会社で作ったO/R Mapperと非常に設計思想が似ていて、「へー」と思ったのがきっかけです。(もちろんSkinnyの方がAPI的にも非常に洗練されているのですが...)&lt;/p&gt;&#xA;&lt;p&gt;というわけで、自分も&lt;a href=&#34;http://github.com/oinume/p5-dbix-thin/tree/master&#34;&gt;DBIx::Thin&lt;/a&gt;というのを作っているのですが、早く安定板をリリースしないと。とにかくエンジニアとしてはとても刺激になったセッションでした。&lt;/p&gt;&#xA;&lt;h3 id=&#34;ficiaインフラとperlにまつわるエトセトラ&#34;&gt;『Ficia』インフラとPerlにまつわるエトセトラ&lt;/h3&gt;&#xA;&lt;p&gt;hirose31さん＠えとらぼ。&lt;a href=&#34;http://www.slideshare.net/hirose31/ficiaperl-1981415&#34;&gt;スライド&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Linux 2.6, Apache2, mod_perl 2.0&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;mod_perl 2のメモリ関連のチューニング&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;推測するな計測するべし(ps, top)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;fork(2) - Copy On Write&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;/proc/PID/smaps (kernel &amp;gt;= 2.6.14) - 共有領域: Shared_Clean + Shared_Dirty&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;いわゆる親プロセスと子プロセスの共有メモリ領域の話&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://d.hatena.ne.jp/naoya/20080212/1202830671&#34;&gt;id:naoyaさんの日記&lt;/a&gt;が詳しい&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;使うモジュールは親プロセスで起動時に(startup.plなどで)ロードする --&amp;gt; 子プロセス独自のメモリ領域にロードしないので節約になる&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Apache起動直後は共有率99%。時間が経つと共有率が40%ぐらいになり、プロセスのメモリ消費量が多くなる&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;使用しているモジュールの一覧をどうやって取得するか？&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Apache2::Status --&amp;gt; Loaded Modules で一覧を確認&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;あと親プロセスでモジュールをロードしておくと、コンパイル済みで即戦力になるのでオーバヘッドが少ないらしい&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;サイズがもりもり太っているモジュールを探す方法 - Apache2::Status + B::TerseSize&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;。Memory Usageで一覧を確認&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;nagiosで少しでもswapしたらメールを飛ばすようにしている&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;以降、httpd.confの話&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;StartServers != {Min,Max}SpareServers&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;忙しい時はMaxに。ヒマになったらStartServersの数に戻る --&amp;gt; forkするのがむだ？だったら最初から全プロセス起動しておいた方がいい&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;/etc/init.d/httpd stop&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;stopしたのに新規リクエストが来ちゃう(ロードバランサーのヘルスチェック後とか)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;start - 起動時からフルでプロセスを起動するので、start直後にリクエストが来ると負荷が高くなってしまう。一定時間おいてからロードバランサーに入れる必要がある。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;ロードバランサーのヘルスチェックのURLを動的なものにしておき、フラグファイルがあったら200を返すようにするとか。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;あとはmatrixの話&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;mod_perlのチューニングのような話は、最近はみんなFastCGIに移行しているのかあまり聞かないので、非常にためになりました。あと、StartServersで最初から一気にプロセス立ち上げておく技は昔考えたことあったのですが、LBのヘルスチェックとか面倒だなぁと思って挫折した経験があります。なるほど、ヘルスチェックのURLを動的にしてフラグファイルで管理っていうのは全然ありだなと思いました。というかRubyのpassengerとかはそんな感じの実装になってますね。&lt;/p&gt;&#xA;&lt;h3 id=&#34;一日を通しての感想&#34;&gt;一日を通しての感想&lt;/h3&gt;&#xA;&lt;p&gt;おそらく初めて丸一日ぶっ通しでセッションを聴いたのですが、最後の方はやはり集中力がもたなくていいセッションでもあまりちゃんと聴けなかったのが残念です。ただ、エンジニアとしてのモチベーションは上がりまくりで、懇親会中も「早く家帰ってコーディングしたい」と実は思ってました。あと酔った勢いでDBIx::Skinnyのポスグレ対応とかしたのですが、バグとかテストを &lt;a href=&#34;http://d.hatena.ne.jp/sfujiwara/&#34;&gt;sfujiwara さん&lt;/a&gt;に面倒見てもらったようで、非常に恐縮でした...&lt;/p&gt;&#xA;&lt;p&gt;個人的に非常に参考になったのは、Ark、Data::Model、DBIx::Skinny、Ficiaのインフラでした。WAF, ORMapper, インフラの話が聴けて大満足です。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>YAPC::Asia 2009に行ってきました(9.11)</title>
				<link>https://journal.lampetty.net/posts/wp/337/</link>
				<pubDate>Fri, 11 Sep 2009 13:09:17 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/337/</guid>
				<description>&lt;p&gt;すごい今更ですが、記憶が残っているうちに9.11のYAPC::Asiaのレポートをば。2日目も色々セッションに参加したのですが、特に記憶に残っている最初の2つだけ。&lt;/p&gt;&#xA;&lt;h3 id=&#34;dena-loves-perl&#34;&gt;DeNA loves Perl&lt;/h3&gt;&#xA;&lt;p&gt;notoさん。&lt;a href=&#34;http://www.slideshare.net/notolab/dena-loves-perl&#34;&gt;スライド&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;DeNAはエンジニアは100人ぐらいで半分ぐらいはモバゲー&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;今回のYAPCでも3人がセッションで発表している。(hidek, zigorou, matsuda)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;最初のbiddersはJava+Oracleだった&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;モバオクを川崎さんが作る時に初めてPerlをつかった&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Perlは読みやすい、実行速度も速い&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;最近はmyDNSのDNS RRの代わりにLVSを使うようになった&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;memcachedも使っている&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;MySQLのshardingもしている。モバゲーでは90個ぐらいに分割されている&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;mobamail&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;モバイルのメール配信 - キャリアの都合で接続がdenyされることがある。大量に送り続けるとdenyされる&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;キャリアのMXレコードは異様に少ない&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;docomo.ne.jp - 4IP&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;ezweb.ne.jp - 1IP&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;softbank.ne.jp - 1IP&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;キャリアのメールサーバが少ないから、送信側で送信先を分散できない&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;mobamail - Perlで実装したモバイルメール向けの配信サーバ。配信するだけなのでMTAじゃない(SMTP受ける方は実装してない)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;コネクションを貼るところでIO::Selectを使っている&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;キャリアの制限の範囲内でなんとか最速で配信できるようにする。キャリアごとに細かい設定ができるように。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;SIELLA Engine - より速い。さらに自分たちで設定しなくても楽。最近はこっちを使っている(ズコー)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;(話は変わって)モバゲーのオープン化について&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;OpenSocial + Game API 法人に解放&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;10/5 にフォーラム。来年1月以降に一般公開&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;DeNAのエンジニアのポリシー - ビジネスの成功にコミットすること&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;お金で解決しない。技術で「安く、早く」&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;ビジネスの成功を重視しているので、きれいな技術が二の次になっているのは否めない&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;100人近くPerlエンジニアがいるのにCPANコミットがない&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;他社の特許侵害のリスク(一部上場しているので目をつけられてしまう)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;やりたい人がいたら推奨しようとしているが...&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;DeNAのPerlでの開発方針&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;「一筆書き文化」：再利用せいや汎用性の設計に時間をかけるくらいならそういうことは考えずに書く方が速い&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;サービス単位の独自性・機動性重視＝モジュールの共有なし&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;割り切りの思想、逆転の発想、これでサービスを速くリリースしてきた面も&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;今後の展望&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;大きな開発チームでのポリシー&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;more test code&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;MobaSiFの次のバージョン&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;DeNAで一緒にコードを書きましょう!&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;as DeNA software engineer / architect&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;as developer of moba-ga town&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;as CPAN author&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;携帯向けのメール配信でSIELLA Engineを使っているのが驚きでした。ああいうモバイル向けのパッケージ製品って他にも&lt;a href=&#34;http://www.klab.jp/am/&#34;&gt;Klabのアクセルメール&lt;/a&gt;とか良さそうなのいっぱいあるし、やっぱり餅は餅屋にって感じなのでしょうか。&lt;/p&gt;&#xA;&lt;p&gt;モバゲーのAPIがオープン化されるということは、PC向けにFlashでゲームも作れるのかな？というのが気になりました。現状モバゲーのPCサイトってモバイル版のはりぼてみたいなものなので、これを機にPCサイトも盛り上がるといいのかなぁと。&lt;/p&gt;&#xA;&lt;h3 id=&#34;endeworksでのweb-appの作り方&#34;&gt;endeworksでのWeb Appの作り方&lt;/h3&gt;&#xA;&lt;p&gt;33rpmさん(船木太郎さん)。&lt;a href=&#34;http://www.slideshare.net/33rpm/endeworkswebapp&#34;&gt;スライド&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;牧さんが代表の会社です。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;特別なことはやっていない&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;開発サーバは用意していない(個人のMac上で開発)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Test::FITesque が最近の流行り（読み方よくわからない）&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;ディプロイ - git pullするだけ。ディプロイツールといったものは使用していない&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Apache+FCGI - daemontoolsでFCGIのプロセスを管理&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Catalystを使用&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Mooseを使用 - Catalyst 5.8をプロダクション環境で使用&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;APIモジュール&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;CatalystのModelを使用しない&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;CatalystのModelは当たり前だけどCatalyst依存&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;ModelはWebという枠組みの外、たとえばCLIやWorkerからも呼び出したいことが多い&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;MyApp::API::* という名前空間&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;中身はORM+アプリケーションロジック&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;キャッシングのロジックもここ&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;DIコンテナは？ - アプリケーション全体で共有されるインスタンスはRegistryというモジュールに格納&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Registry - メモリ上のKVSに保存するだけのsingleton object&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Formの作成はHTML::FormFuを使用&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;生成されるHTMLに不満&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;HTML::FormFuのValidatorはとてもよくできているので、レンダリングはさせないでValidatorだけ使うというのが最近の流行&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;pixis(フレームワーク)の説明(githubで公開されている)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;WebサービスやSNSでありがちなメッセージ管理などのソーシャル機能をまとめたフレームワーク&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Catalyst 5.8依存&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;依存モジュールが多い&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>YAPC::Asia 2009で聞く予定のセッション</title>
				<link>https://journal.lampetty.net/posts/wp/334/</link>
				<pubDate>Wed, 09 Sep 2009 16:09:55 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/334/</guid>
				<description>&lt;p&gt;明日はPerl Mongersの祭典YAPC::Asia 2009です。明日と明後日は仕事を休ませてもらって(!)、フルに参加したいと思ってます。というのも、今年のYAPCは本当に聴きたいセッションばっかりなのです。&lt;/p&gt;&#xA;&lt;p&gt;というわけで、当日なるべくスムーズにセッションに参加できるようにめぼしいものをメモしておきます。はー、やばい楽しみ過ぎる！&lt;/p&gt;&#xA;&lt;h3 id=&#34;910木&#34;&gt;9/10(木)&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;10:50 PSGI - Perl Server Gateway Interface&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;11:40 シックス・アパート・フレームワーク&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;13:45 API Design&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;14:30 modern Catalystか分散ファイルストレージ&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;14:50 ark - framework inspired by Catalyst&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;15:20 優しいモダンなWAFの作り方&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;15:40 Booking.com &amp;amp; Perl&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;16:10 Key Value Store with O/R Mapper&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;16:30 simple or mapper DBIx::Skinny&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;17:00 『Ficia』インフラとPerlにまつわるエトセトラ&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;17:20 Perl database test using MySQL::Sandbox&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;18:00 Lightning Talks (1)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;19:30 懇親会(たぶん)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;911金&#34;&gt;9/11(金)&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;9:45 DeNA loves Perl&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;10:35 endeworksでのWebAppの作り方&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;11:25 大規模画像配信を支えるPerl&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;11:55 Asynchronous Database Queries with Perl&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;13:30 Asynchronous Programming for (A)synchronous Communication&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;14:20 Perl? Which Perl?&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;15:10 はてなブックマークのシステムについて&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;16:00 記憶&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;16:50 Lightning Talks (2)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;17:25 基調講演&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;18:15 Closing Ceremony&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>MySQL 5.1の最新版のdebパッケージを作成する方法</title>
				<link>https://journal.lampetty.net/posts/wp/331/</link>
				<pubDate>Sat, 29 Aug 2009 23:08:23 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/331/</guid>
				<description>&lt;p&gt;Ubuntu 9.04にはMySQL 5.1のパッケージが用意されているのですが、バージョンが5.1.31であり最新ではないので(現時点で最新は5.1.37)、最新版のdebパッケージを作成する方法を紹介します。debを作成するといっても、開発中のUbuntuに入っているmysql-server-5.1のソースを持ってきてビルドするだけなので、比較的お手軽にできます。&lt;/p&gt;&#xA;&lt;h3 id=&#34;debを作成するための準備&#34;&gt;debを作成するための準備&lt;/h3&gt;&#xA;&lt;p&gt;まずはビルドする人間のメールアドレスと名前を環境変数で設定しておきます。&lt;/p&gt;&#xA;&lt;p&gt;$ export DEBEMAIL=&amp;quot;hogehoge@foo.com&amp;quot;&lt;/p&gt;&#xA;&lt;p&gt;$ export DEBFULLNAME=&amp;quot;Your Name&amp;quot;&lt;/p&gt;&#xA;&lt;p&gt;次にパッケージをビルドするために必要なものをインストールします。&lt;/p&gt;&#xA;&lt;p&gt;$ sudo aptitude install dh-make devscripts debhelper fakeroot lintian sudo pbuilder piuparts dpatch&lt;/p&gt;&#xA;&lt;h3 id=&#34;ソースの取得&#34;&gt;ソースの取得&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://launchpad.net/ubuntu/+source/mysql-dfsg-5.1&#34;&gt;“mysql-dfsg-5.1” source package in Ubuntu&lt;/a&gt;よりdevelopmentのkarmicの方のリンクをクリックして、その先の画面で以下の3つのファイルをダウンロードします。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;mysql-dfsg-5.1_5.1.37.orig.tar.gz - ソースtarボール&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;mysql-dfsg-5.1_5.1.37-1ubuntu2.diff.gz - debを作成するためのdiff&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;mysql-dfsg-5.1_5.1.37-1ubuntu2.dsc - パッケージングのルールを記載したファイル&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;今回は ~/deb というディレクトリを作成してその中で作業するので、debディレクトリにダウンロードしておきます。&lt;/p&gt;&#xA;&lt;h3 id=&#34;mysql-dfsg-51のビルド&#34;&gt;mysql-dfsg-5.1のビルド&lt;/h3&gt;&#xA;&lt;p&gt;mysql-dfsg-5.1のビルドに必要なパッケージをインストールしておきます。&lt;/p&gt;&#xA;&lt;p&gt;$ sudo aptitude build-dep mysql-server-5.1&lt;/p&gt;&#xA;&lt;p&gt;次にソースを展開します。dpkg-source -x を実行するとソースを展開するだけはなく、パッチも自動的に当ててくれます。&lt;/p&gt;&#xA;&lt;p&gt;$ dpkg-source -x mysql-dfsg-5.1_5.1.37-1ubuntu2.dsc&lt;/p&gt;&#xA;&lt;p&gt;dpkg-source: warning: extracting unsigned source package (mysql-dfsg-5.1_5.1.37-1ubuntu2.dsc)&lt;/p&gt;&#xA;&lt;p&gt;dpkg-source: extracting mysql-dfsg-5.1 in mysql-dfsg-5.1-5.1.37&lt;/p&gt;&#xA;&lt;p&gt;dpkg-source: info: unpacking mysql-dfsg-5.1_5.1.37.orig.tar.gz&lt;/p&gt;&#xA;&lt;p&gt;dpkg-source: info: applying mysql-dfsg-5.1_5.1.37-1ubuntu2.diff.gz&lt;/p&gt;&#xA;&lt;p&gt;そしていよいよビルドです。(私はAthlon X2 5050eの環境で約2時間かかりました)&lt;/p&gt;&#xA;&lt;p&gt;$ cd mysql-dfsg-5.1-5.1.37&lt;/p&gt;&#xA;&lt;p&gt;$ debuild -us -uc&lt;/p&gt;&#xA;&lt;p&gt;場合によっては「&amp;quot;hardening-wrapper&amp;quot;というパッケージがないよ」というエラーになってビルドできないかもしれないので、このパッケージをaptitudeでインストールしておきます。&lt;/p&gt;&#xA;&lt;p&gt;完了すると .deb パッケージが~/deb/配下に作成されているので、必要なものをdpkg -iしてインストールします。ただし、依存関係が若干複雑なのでエラーが出たら依存しているものを先にインストールすると良いでしょう。&lt;/p&gt;&#xA;&lt;p&gt;$ sudo dpkg -i mysql-common_5.1.37-1ubuntu2_all.deb ¥&lt;/p&gt;&#xA;&lt;p&gt;libmysqlclient16_5.1.37-1ubuntu2_amd64.deb ¥&lt;/p&gt;&#xA;&lt;p&gt;mysql-client_5.1.37-1ubuntu2_all.deb ¥&lt;/p&gt;&#xA;&lt;p&gt;mysql-client-5.1_5.1.37-1ubuntu2_amd64.deb&lt;/p&gt;&#xA;&lt;p&gt;$ sudo dpkg -i mysql-server-core-5.1_5.1.37-1ubuntu2_amd64.deb ¥&lt;/p&gt;&#xA;&lt;p&gt;mysql-server-5.1_5.1.37-1ubuntu2_amd64.deb ¥&lt;/p&gt;&#xA;&lt;p&gt;mysql-server-5.1_5.1.37-1ubuntu2_amd64.deb&lt;/p&gt;&#xA;&lt;p&gt;なお、5.0から5.1にアップグレードするような場合、my.cnfに使えなくなったオプションを書いていたりするとmysqldの起動に失敗するので、エラーログを見て適切に対処しましょう。例えば私の場合は --skip-bdb というオプションが使えなくなっていてエラーになっていました。&lt;/p&gt;&#xA;&lt;p&gt;無事にインストールできれば、これでmysql-server-5.1が最新版になっています。mysqlコマンドでSQLを発行して動作を確認してみて下さい。&lt;/p&gt;&#xA;&lt;p&gt;$ mysql -uroot -pxxxxx&lt;/p&gt;&#xA;&lt;p&gt;Welcome to the MySQL monitor. Commands end with ; or g.&lt;/p&gt;&#xA;&lt;p&gt;Your MySQL connection id is 68&lt;/p&gt;&#xA;&lt;p&gt;Server version: 5.1.37-1ubuntu2-log (Ubuntu)&lt;/p&gt;&#xA;&lt;h3 id=&#34;補足&#34;&gt;補足&lt;/h3&gt;&#xA;&lt;p&gt;今回はUbuntu 9.04で試しましたが、Debianでも同じ手順でパッケージを作成することができるはずです。また、debパッケージの作成にあたって&lt;a href=&#34;http://wiki.debian.org/HidekiYamane?action=AttachFile&amp;amp;do=get&amp;amp;target=20080916_ylug_upload.pdf&#34;&gt;Debianパッケージ60分クッキング(PDF)&lt;/a&gt;を参考にさせて頂きました。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>LLTVにちょっとだけ行ってきました</title>
				<link>https://journal.lampetty.net/posts/wp/330/</link>
				<pubDate>Sat, 29 Aug 2009 14:08:40 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/330/</guid>
				<description>&lt;p&gt;毎年やっているLL系のカンファレンスであるLLTVに今年も行ってきました。といっても今回は時間の都合で参加したのは&lt;a href=&#34;http://ll.jus.or.jp/2009/program/cloud/&#34; title=&#34;渡る世間は雲ばかり « Lightweight Language Television (LLTV)&#34;&gt;渡る世間は雲ばかり&lt;/a&gt;だけでしたが... というわけで簡単ながらレポートします。&lt;/p&gt;&#xA;&lt;h3 id=&#34;windows-azure---荒井省三さんマイクロソフト&#34;&gt;Windows Azure - 荒井省三さん(マイクロソフト)&lt;/h3&gt;&#xA;&lt;p&gt;MSの人なのにMacBook使っていたのが印象的。いろいろ図を用意してくれていたのですが、Windows Azure自体が複雑そうであまり深く理解できなかったのが正直なところ。ストレージとしてはTable(Key Value Store)とSQL Azure(RDBMS)というものがあるのが興味深かったです。AmazonはSimpleDB、Google App EngineはBigTableと、Key Value Storeは用意しているものの、スケール可能なRDBMSを用意しているところがないのですが、AzureではTable(Key Value Store)とSQL Azure(RDBMS)を用意しているとのことで、そこがユニークだなぁと感じました。(RDBMSはそのうちOracleもクラウド環境に参入したら提供しそう)&lt;/p&gt;&#xA;&lt;h3 id=&#34;slim3---ひがやすをさん&#34;&gt;Slim3 - ひがやすをさん&lt;/h3&gt;&#xA;&lt;p&gt;Slim3はTDDベースでの開発をサポートしているのが一番の特徴、とのこと。簡単にSlim3を説明した後は、twitterライクなサービスをSlim3で作るデモをコードを書きながら淡々と行なってました。時間過ぎてたんですが、「あと5分下さい」とかなりフリーダムな雰囲気。&lt;/p&gt;&#xA;&lt;p&gt;最後に作ったアプリをGoogle App Engineにディプロイしていたのですが、Eclisepのボタン一つでディプロイが完了していて、あれはすごい便利だなぁ！と思いました。&lt;/p&gt;&#xA;&lt;h3 id=&#34;jruby-on-gae---高井直人さん&#34;&gt;JRuby on GAE - 高井直人さん&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;JRuby - JVMによる高い性能&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;RubyのWAF - rails, merb, sinatra etc...&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;JRuby-Rack - JRuby + Railsだと多層構造過ぎるので、JRubyとRack層を統合したものを作った&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;wabler - railsアプリをWARファイルにパッケージングするための自動化スクリプト&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;appengine-jruby - GAE APIのJRubyラッパー。Googleの人が作っているらしい&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;GAEでrailsアプリを動かすのはけっこうしんどい&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Engine Yardでもクラウドみたいなことをやるだろうから、そっちでやるほうが時間を有意義に使えるんじゃないか。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;kay-framework---松尾貴史さん&#34;&gt;Kay Framework - 松尾貴史さん&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;GAEのPython APIについては日本で一番詳しいかも&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;GAEで動くPythonフレームワークは色々あるけど、無駄が多かったりパッチ当てなくてはいけなかったりで、GAEに特化したFrameworkを作った&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;息子の名前をつけたかった&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;sphinx - pythonのドキュメント生成ツール。これでドキュメントを作っている&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;GAEのAPIはHTTPで叩けるので、wxPythonでGUIアプリからもAPIを叩ける&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;発表の中で「Pythonistaとしては」と言っていて、Python使いのことをPythonistaっていうんだなぁと学びました。PerlはPerl Monger、RubyはRubyistというように、言語によって言い方違うんだなぁと。&lt;/p&gt;&#xA;&lt;h3 id=&#34;まとめ&#34;&gt;まとめ&lt;/h3&gt;&#xA;&lt;p&gt;Amazon EC2は有料でサーバ1台を丸ごと貸してくれるので自由にできる一方、Google App EngineはRDBMS使えないとか言語の制限(今のところPython, Java)があったりでかなり性質が違うのかなと。ただ、GAEは500万リクエストまでは確か無料なので、画像やスタティックなファイルを置いたりして、CDN的な使い方してもいいんじゃないかなぁと思いました(ただし、データセンターがどこにあるのか次第)&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>bashでコマンド履歴を残さない方法</title>
				<link>https://journal.lampetty.net/posts/wp/329/</link>
				<pubDate>Sat, 15 Aug 2009 14:08:47 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/329/</guid>
				<description>&lt;p&gt;bashには過去に実行したコマンドを履歴として残しているので、CTRL+pなどでその履歴をさかのぼり過去に実行したコマンドをそのまま実行したり、ちょこっと直して実行することができます。しかし、この便利な機能は一方で、 rm などのファイルを削除したりするような危険なコマンドを、履歴からいとも簡単に実行してしまい、結果として大切なファイルを消してしまったりするようなミスを誘発する恐れがあります。&lt;/p&gt;&#xA;&lt;p&gt;そんなことを考える人に「特定のコマンドだけ履歴に残したくない(=.bash_historyに残さない)という技を紹介したいと思います。具体的には&lt;/p&gt;&#xA;&lt;p&gt;export HISTIGNORE=&#39;rm*:mv*&#39;&lt;/p&gt;&#xA;&lt;p&gt;のように、環境変数HISTIGNOREに履歴に残したくないコマンドを設定します。:(コロン)でコマンドを区切ることで複数のコマンドを設定することが可能です。上記の例では rm と mv を履歴に残さないようにしています。&lt;/p&gt;&#xA;&lt;p&gt;実際に試してみると&lt;/p&gt;&#xA;&lt;p&gt;$ touch hoge&lt;/p&gt;&#xA;&lt;p&gt;$ rm hoge&lt;/p&gt;&#xA;&lt;p&gt;$ history&lt;/p&gt;&#xA;&lt;p&gt;...&lt;/p&gt;&#xA;&lt;p&gt;98 touch hoge&lt;/p&gt;&#xA;&lt;p&gt;99 history&lt;/p&gt;&#xA;&lt;p&gt;のようにrmコマンドはhistoryには残っていません。実行前にコマンドを確認しないで、うっかり履歴からrmコマンドで必要なファイルを消してしまった、というようなオペレーションミス対策になると思うので、重要なサーバではぜひ設定してみると良いと思います。&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]4873113768[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>「謀略法廷」を読みました</title>
				<link>https://journal.lampetty.net/posts/wp/328/</link>
				<pubDate>Thu, 30 Jul 2009 14:07:46 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/328/</guid>
				<description>&lt;p&gt;ジョン・グリシャムの最新作が文庫本で発売になっていたので、すごく久々に小説を読みました。今回のこの小説は法廷モノというよりかは裁判の外での駆け引きがメインなので、いわゆる「弁護士と検事の闘い」というものではありません。&lt;/p&gt;&#xA;&lt;p&gt;しかし、発癌性物質を垂れ流した企業の責任を問うための裁判に、原告として関わると一体どういうことになるのか、ということが赤裸々に表現されていてその切り口が素晴らしいと感じました。&lt;/p&gt;&#xA;&lt;p&gt;一つ気になったのは、企業のトップが裁判の和解について、マスコミを情報操作して株価を操作し、株を買い漁る描写があるのですが、これってインサイダーになったりしないのかなという点。日本だったら確実にインサイダー取引で捕まってそうですが、どうなんでしょう...&lt;/p&gt;&#xA;&lt;p&gt;[rakuten]book:13215973[/rakuten]&lt;/p&gt;&#xA;&lt;p&gt;[rakuten]book:13215974[/rakuten]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>モバイルSuicaにして良かったと思う5つのこと</title>
				<link>https://journal.lampetty.net/posts/wp/327/</link>
				<pubDate>Sun, 05 Jul 2009 17:07:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/327/</guid>
				<description>&lt;p&gt;先月ぐらいにやっとこさ携帯のモバイルSuica(とEdy)を導入してみました。年会費が1000円かかりますが、もう本当にこれなしでは生きていけないぐらい便利なものなので、具体的にどこが便利かを淡々と説明します。というかさせてください。&lt;/p&gt;&#xA;&lt;h3 id=&#34;1-suicaは意外と色々なところで使える&#34;&gt;1. Suicaは意外と色々なところで使える&lt;/h3&gt;&#xA;&lt;p&gt;「自分の行動範囲の店がカバーされてる」これが一番重要だと思います。とりあえずJRの駅構内および大体のコンビニはSuica対応です。&lt;a href=&#34;http://www.jreast.co.jp/suica/area/shopping/&#34;&gt;Suicaが使えるお店検索&lt;/a&gt;でSuica対応の店がわかるので、見てみると良いでしょう。&lt;/p&gt;&#xA;&lt;h3 id=&#34;2-小銭を出す時の煩わしさから解放される&#34;&gt;2. 小銭を出す時の煩わしさから解放される&lt;/h3&gt;&#xA;&lt;p&gt;後ろにたくさんの人が並んでいる状態で、1円玉などの小銭がうまく出せない時のストレスを感じたことはありませんか？モバイルSuicaやEdyなどの電子マネーであれば、携帯やカードをかざすだけなのでこのような煩わしさから解放されます。また電子マネーで会計を済ませる人が増えれば、順番待ちの列の回転も早くなることでしょう。&lt;/p&gt;&#xA;&lt;h3 id=&#34;3-クレジットカードのポイントが貯まる&#34;&gt;3. クレジットカードのポイントが貯まる&lt;/h3&gt;&#xA;&lt;p&gt;モバイルSuicaではクレジットカード(または銀行振込)でチャージするので、Suicaを使えば使うほどクレジットカードのポイントが貯まっていきます。&lt;/p&gt;&#xA;&lt;h3 id=&#34;4-定期券を定期販売機で買う必要がなくなる&#34;&gt;4. 定期券を定期販売機で買う必要がなくなる&lt;/h3&gt;&#xA;&lt;p&gt;自分は忘れっぽいので、定期券が有効期限切れの状態で通勤してしまい無駄な交通費を支払ってしまうことがよくあります。これは改札を入ったり出たりしたタイミングで、近くに定期券の販売機が近くにないことが影響していると思いますが、モバイルSuicaにすれば、駅の外であれば「買おう」と思ったタイミングで定期券を購入することができます。自分はモバイルSuicaにしてから定期券の買い忘れがめっきりなくなりました。&lt;/p&gt;&#xA;&lt;p&gt;さらに定期代もクレジット払いになるので、カードのポイントがたまります。&lt;/p&gt;&#xA;&lt;h3 id=&#34;5-atmに行く回数が減る&#34;&gt;5. ATMに行く回数が減る&lt;/h3&gt;&#xA;&lt;p&gt;モバイルSuicaの利用頻度次第ですが、電子マネーを使い始めると当然現金を使わないので、ATMに行ってお金を下ろす機会が減ります。自分は感覚値で大体半分ぐらいになりました。コンビニでお金は下ろせますが、正直あんな色んな人が出入りするところでお金なんて下ろしたくないので、個人的には非常に嬉しいです。&lt;/p&gt;&#xA;&lt;p&gt;というわけで、皆さんもモバイルSuicaを導入して現金から解放された生活を送ってみてはいかがでしょうか？それにしても日本って本当便利な国ですわ。&lt;/p&gt;&#xA;&lt;p&gt;[rakuten]book:12931636[/rakuten]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>RailsでTwitterのOAuthを試す</title>
				<link>https://journal.lampetty.net/posts/wp/323/</link>
				<pubDate>Sat, 20 Jun 2009 18:06:26 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/323/</guid>
				<description>&lt;p&gt;OAuthが前々から気になっていたので、RailsでTwitterのOAuthを使うサンプルを作成しました。OAuthについてはここでは詳しく説明しませんが、&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://oauth.net/documentation/getting-started&#34;&gt;本家のgetting-started&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://gihyo.jp/dev/feature/01/oauth/0001&#34;&gt;OAuthとは？―OAuthの概念とOAuthでできること&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;の記事がよくまとまっているので、目を通してみるとよいでしょう。OAuthを一言でいうと、サードパーティのアプリケーション(Consumer)をサービスプロバイダ側(Service Provider)で認可するという仕組みで、端的に言えばサードパーティ側でサービスプロバイダのアカウント情報を保持する必要がなくなるというメリットがあります。&lt;/p&gt;&#xA;&lt;p&gt;たとえば、今回の例だとTwitter(=Service Provider)のデータを利用するので、Twitterから認可を受ける必要があります。これをOAuthという仕組みを使って、サンプルアプリケーション(=Consumer)ではTwitterのアカウント情報を一切入力させないようにします。&lt;/p&gt;&#xA;&lt;p&gt;Twitter API Wikiに&lt;a href=&#34;http://apiwiki.twitter.com/OAuth+Example+-+Ruby&#34;&gt;OAuth Example - Ruby&lt;/a&gt;という素晴らしいページがあるのですが、これが最新版の仕様に対応してなさそうなので、上げてみました。&lt;/p&gt;&#xA;&lt;h3 id=&#34;railsやoauthなどのライブラリのインストール&#34;&gt;railsやoauthなどのライブラリのインストール&lt;/h3&gt;&#xA;&lt;p&gt;必要なものは以下になるので、rubygemsでインストールしておきます。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;rails 2.3.2&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;oauth 0.3.5&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;json&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;$ sudo gem install rails&lt;/p&gt;&#xA;&lt;p&gt;$ sudo gem install oauth&lt;/p&gt;&#xA;&lt;p&gt;$ sudo gem install json&lt;/p&gt;&#xA;&lt;h3 id=&#34;twitterでアプリケーションを登録&#34;&gt;Twitterでアプリケーションを登録&lt;/h3&gt;&#xA;&lt;p&gt;サンプルを作る前に&lt;a href=&#34;http://twitter.com/oauth_clients&#34;&gt;TwitterのOAuthのページ&lt;/a&gt;でアプリケーションを登録します。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/8250493@N05/3644573970/&#34; title=&#34;Twitterでアプリケーションを登録&#34;&gt;&lt;img src=&#34;http://static.flickr.com/2466/3644573970_307ac49f2c.jpg&#34; alt=&#34;Twitterでアプリケーションを登録&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Callback URLは &lt;a href=&#34;http://localhost:3000/oauth_callback&#34;&gt;http://localhost:3000/oauth_callback&lt;/a&gt; とか書くとエラーになるので、&lt;a href=&#34;http://example.com/&#34;&gt;http://example.com/&lt;/a&gt; のように適当なURLを記載しておきます。(実際にここで設定したURLがコールバックされるわけではありません)&lt;/p&gt;&#xA;&lt;p&gt;全て記入して登録すると、Consumer keyとConsumer secretが発行されるのでこれを記録しておきます。後述する IndexController でこれらを使用します。&lt;/p&gt;&#xA;&lt;h3 id=&#34;サンプル作成&#34;&gt;サンプル作成&lt;/h3&gt;&#xA;&lt;p&gt;サンプルアプリの雛形を作成します。&lt;/p&gt;&#xA;&lt;p&gt;$ rails twitoauth&lt;/p&gt;&#xA;&lt;p&gt;$ cd twitoauth&lt;/p&gt;&#xA;&lt;p&gt;$ script/generate controller index&lt;/p&gt;&#xA;&lt;h3 id=&#34;indexcontrollerの作成&#34;&gt;IndexControllerの作成&lt;/h3&gt;&#xA;&lt;p&gt;app/controllers/index_controller.rbを編集して、IndexControllerを実装します。Consumer key、Consumer secretは先ほどTwitterから発行されたものを使用してください。&lt;/p&gt;&#xA;&lt;p&gt;require &#39;oauth&#39;&lt;/p&gt;&#xA;&lt;p&gt;require &#39;json&#39;&lt;/p&gt;&#xA;&lt;p&gt;class IndexController &amp;lt; ApplicationController&lt;/p&gt;&#xA;&lt;p&gt;def self.consumer&lt;/p&gt;&#xA;&lt;p&gt;OAuth::Consumer.new(&lt;/p&gt;&#xA;&lt;p&gt;&amp;quot;Consumer key&amp;quot;,&lt;/p&gt;&#xA;&lt;p&gt;&amp;quot;Consumer secret&amp;quot;,&lt;/p&gt;&#xA;&lt;p&gt;{ :site =&amp;gt; &amp;quot;&lt;a href=&#34;http://twitter.com&#34;&gt;http://twitter.com&lt;/a&gt;&amp;quot; }&lt;/p&gt;&#xA;&lt;p&gt;)&lt;/p&gt;&#xA;&lt;p&gt;end&lt;/p&gt;&#xA;&lt;p&gt;def index&lt;/p&gt;&#xA;&lt;p&gt;end&lt;/p&gt;&#xA;&lt;p&gt;def oauth&lt;/p&gt;&#xA;&lt;p&gt;# :oauth_callbackに認証後のコールバックURLを指定&lt;/p&gt;&#xA;&lt;p&gt;# この場合だとこのコントローラー内の oauth_callback メソッドが実行される&lt;/p&gt;&#xA;&lt;p&gt;request_token = IndexController.consumer.get_request_token(&lt;/p&gt;&#xA;&lt;p&gt;:oauth_callback =&amp;gt; &amp;quot;&lt;a href=&#34;http://#&#34;&gt;http://#&lt;/a&gt;{request.host_with_port}/oauth_callback&amp;quot;&lt;/p&gt;&#xA;&lt;p&gt;)&lt;/p&gt;&#xA;&lt;p&gt;session[:request_token] = request_token.token&lt;/p&gt;&#xA;&lt;p&gt;session[:request_token_secret] = request_token.secret&lt;/p&gt;&#xA;&lt;p&gt;# twitter.comで認証する&lt;/p&gt;&#xA;&lt;p&gt;redirect_to request_token.authorize_url&lt;/p&gt;&#xA;&lt;p&gt;return&lt;/p&gt;&#xA;&lt;p&gt;end&lt;/p&gt;&#xA;&lt;p&gt;def oauth_callback&lt;/p&gt;&#xA;&lt;p&gt;consumer = IndexController.consumer&lt;/p&gt;&#xA;&lt;p&gt;request_token = OAuth::RequestToken.new(&lt;/p&gt;&#xA;&lt;p&gt;consumer,&lt;/p&gt;&#xA;&lt;p&gt;session[:request_token],&lt;/p&gt;&#xA;&lt;p&gt;session[:request_token_secret]&lt;/p&gt;&#xA;&lt;p&gt;)&lt;/p&gt;&#xA;&lt;p&gt;access_token = request_token.get_access_token(&lt;/p&gt;&#xA;&lt;p&gt;{},&lt;/p&gt;&#xA;&lt;p&gt;:oauth_token =&amp;gt; params[:oauth_token],&lt;/p&gt;&#xA;&lt;p&gt;:oauth_verifier =&amp;gt; params[:oauth_verifier]&lt;/p&gt;&#xA;&lt;p&gt;)&lt;/p&gt;&#xA;&lt;p&gt;response = consumer.request(&lt;/p&gt;&#xA;&lt;p&gt;:get,&lt;/p&gt;&#xA;&lt;p&gt;&#39;/account/verify_credentials.json&#39;,&lt;/p&gt;&#xA;&lt;p&gt;access_token, { :scheme =&amp;gt; :query_string }&lt;/p&gt;&#xA;&lt;p&gt;)&lt;/p&gt;&#xA;&lt;p&gt;case response&lt;/p&gt;&#xA;&lt;p&gt;when Net::HTTPSuccess&lt;/p&gt;&#xA;&lt;p&gt;@user_info = JSON.parse(response.body)&lt;/p&gt;&#xA;&lt;p&gt;unless @user_info[&#39;screen_name&#39;]&lt;/p&gt;&#xA;&lt;p&gt;flash[:notice] = &amp;quot;Authentication failed&amp;quot;&lt;/p&gt;&#xA;&lt;p&gt;redirect_to :action =&amp;gt; :index&lt;/p&gt;&#xA;&lt;p&gt;return&lt;/p&gt;&#xA;&lt;p&gt;end&lt;/p&gt;&#xA;&lt;p&gt;else&lt;/p&gt;&#xA;&lt;p&gt;RAILS_DEFAULT_LOGGER.error &amp;quot;Failed to get user info via OAuth&amp;quot;&lt;/p&gt;&#xA;&lt;p&gt;flash[:notice] = &amp;quot;Authentication failed&amp;quot;&lt;/p&gt;&#xA;&lt;p&gt;redirect_to :action =&amp;gt; :index&lt;/p&gt;&#xA;&lt;p&gt;return&lt;/p&gt;&#xA;&lt;p&gt;end&lt;/p&gt;&#xA;&lt;p&gt;end&lt;/p&gt;&#xA;&lt;p&gt;end&lt;/p&gt;&#xA;&lt;p&gt;完了したら、indexアクションに対応するViewである app/views/index/index.erb を作成します。これは単純に /oauth に飛ばすだけのテンプレートです。&lt;/p&gt;&#xA;&lt;p&gt;OAuthのサンプル&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://journal.lampetty.net/oauth&#34;&gt;OAuthで認証&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;configroutesrb-を修正&#34;&gt;config/routes.rb を修正&lt;/h3&gt;&#xA;&lt;p&gt;次に IndexController に定義されているアクションが呼び出されるようにURLとのマッピングをします。具体的には config/routes.rb の&lt;/p&gt;&#xA;&lt;p&gt;map.connect &#39;:controller/:action/:id&#39;&lt;/p&gt;&#xA;&lt;p&gt;map.connect &#39;:controller/:action/:id.:format&#39;&lt;/p&gt;&#xA;&lt;p&gt;となっている箇所の上に下記を追記します。&lt;/p&gt;&#xA;&lt;p&gt;map.root :controller =&amp;gt; &#39;index&#39;&lt;/p&gt;&#xA;&lt;p&gt;map.connect &#39;:action&#39;, :controller =&amp;gt; &#39;index&#39;&lt;/p&gt;&#xA;&lt;h3 id=&#34;oauthを試してみる&#34;&gt;OAuthを試してみる&lt;/h3&gt;&#xA;&lt;p&gt;とりあえず9割方準備が整ったので、サーバを起動して &lt;a href=&#34;http://localhost:3000/&#34;&gt;http://localhost:3000/&lt;/a&gt; にアクセスします。&lt;/p&gt;&#xA;&lt;p&gt;$ script/server&lt;/p&gt;&#xA;&lt;p&gt;OAuthで認証のリンクをクリックすると、下記のようにTwitterにリダイレクトされたでしょうか？(うまくリダイレクトされない場合は index_controller.rb の index アクションのコードに問題がある可能性が高いです)&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/8250493@N05/3644596210/&#34; title=&#34;TwitterでOAuth認証&#34;&gt;&lt;img src=&#34;http://static.flickr.com/3657/3644596210_cbfc9e8b7a.jpg&#34; alt=&#34;TwitterでOAuth認証&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;ここでTwitterのアカウントを入力して&amp;quot;Allow&amp;quot;をクリックすると、「アプリに転送します」というメッセージが表示され、サンプルアプリに遷移します。具体的には、index_controller.rb のoauthアクション内のget_request_tokenメソッドで登録したコールバックURLにリダイレクトされています。&lt;/p&gt;&#xA;&lt;p&gt;ただ、現状だとコールバック先の画面で使用するテンプレートファイルを作成していないため&lt;/p&gt;&#xA;&lt;p&gt;Template is missing&lt;/p&gt;&#xA;&lt;p&gt;Missing template index/oauth_callback.erb in view path app/views&lt;/p&gt;&#xA;&lt;p&gt;というエラーになるので、次はこのテンプレートを作成します。&lt;/p&gt;&#xA;&lt;h3 id=&#34;最後の仕上げ&#34;&gt;最後の仕上げ&lt;/h3&gt;&#xA;&lt;p&gt;/oauth_callback のテンプレートを下記の内容で作成します。やっていることは単純で、/account/verify_credentials.json のAPIで取得した情報を表示しているだけです。&lt;/p&gt;&#xA;&lt;p&gt;TwitterからOAuthで認証してもらったよ！&lt;/p&gt;&#xA;&lt;h1 id=&#34;-user_infoname-さんの最新のつぶやき&#34;&gt;&amp;lt;%= @user_info[&#39;name&#39;] %&amp;gt;さんの最新のつぶやき&lt;/h1&gt;&#xA;&lt;p&gt;&amp;lt;%= @user_info[&#39;status&#39;][&#39;text&#39;] %&amp;gt;&lt;/p&gt;&#xA;&lt;p&gt;これを app/views/oauth_callback.rb として保存したら、もう一度 &lt;a href=&#34;http://localhost:3000/&#34;&gt;http://localhost:3000/&lt;/a&gt; にアクセスして最初から認証をやり直します。下記のようにTwitterの情報が取得できれば、OAuthでの認証+APIの呼び出しは成功です。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/8250493@N05/3644632746/&#34; title=&#34;OAuthでログインしてTwitterのデータを取得&#34;&gt;&lt;img src=&#34;http://static.flickr.com/3406/3644632746_10d63591a7.jpg&#34; alt=&#34;OAuthでログインしてTwitterのデータを取得&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;まとめ&#34;&gt;まとめ&lt;/h3&gt;&#xA;&lt;p&gt;ライブラリを使えば少しの労力でOAuthでTwitterに認証してもらえることが伝わったでしょうか？OAuthを使えば、サービス側(Consumer側)でTwitterのアカウント/パスワードを保持しなくて済むので、よりユーザに安心を提供できるはずです。現状、コールバックURLを使う方法はPCのブラウザでしか実行できませんが、モバイルやデスクトップアプリのためにPINコードを発行する方法も用意されているので、より詳しく知りたい人は本家のドキュメントを読んでみると良いと思います。&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]4274068668[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Redmine勉強会に参加してきました</title>
				<link>https://journal.lampetty.net/posts/wp/320/</link>
				<pubDate>Sun, 14 Jun 2009 00:06:15 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/320/</guid>
				<description>&lt;p&gt;Redmineのヘビーユーザではないのですが、&lt;a href=&#34;http://events.php.gr.jp/events/show/80&#34;&gt;Redmine勉強会&lt;/a&gt;に参加してきました。「ブログに書くまでが勉強会」ということで、雑記ながらログを残しておきます。それにしても大き過ぎず小さ過ぎずのいい勉強会でした。&lt;/p&gt;&#xA;&lt;p&gt;30分ぐらい遅刻したので最初の&lt;a href=&#34;http://d.hatena.ne.jp/yandod/20090612/1244824497&#34;&gt;yandod&lt;/a&gt;さんの&lt;a href=&#34;http://www.slideshare.net/yandod/20090612-redmine-draft&#34;&gt;発表&lt;/a&gt;は聞き逃してしまいました。&lt;/p&gt;&#xA;&lt;h3 id=&#34;redmine活用術--孤独なシス管の記録&#34;&gt;Redmine活用術　- 孤独なシス管の記録&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://d.hatena.ne.jp/kirara_397/&#34;&gt;kirara_397&lt;/a&gt;さん&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Tracはプロジェクトが複数ある場合に管理が大変だったのでRedmineに移行した&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;「トラブル」「要望」「タスク」等にカテゴライズ&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;rails環境を構築するまでがそこそこ大変&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;カレンダーやガントチャートがプロジェクト毎でしか表示できない→統合表示したい...&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Excel管理に慣れている人には壁があって理解されない...&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;活用する上で工夫したポイント&#34;&gt;活用する上で工夫したポイント&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;用語を分かりやすくした（チケット＝課題など）→Redmineの日本語化ファイルを変更するだけ&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;ActiveDirectoryアカウントでログインできるようにした→LDAPでもログインできる&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Windowsなのでサービス化した(mongrel_service)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;人生も1つのプロジェクトである&#34;&gt;人生も1つのプロジェクトである&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;RedmineでGTD&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;【元ネタ】Web2.0ナビ：意外と使われていない「個人用trac」活用のすすめ&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;「世界Redmine」構想→&amp;quot;Redmedia&amp;quot;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;redmineの現実的な利用法&#34;&gt;Redmineの現実的な利用法&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://d.hatena.ne.jp/tsuyoshikawa/20090613/1244871082&#34;&gt;tsuyoshikawa&lt;/a&gt;さん(&lt;a href=&#34;http://docs.google.com/Present?docid=d64hw29_12w73zscp5&#34;&gt;資料&lt;/a&gt;)&lt;/p&gt;&#xA;&lt;h4 id=&#34;夢&#34;&gt;夢&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;全工程の一元管理&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;アジャイル&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;現実&#34;&gt;現実&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;工程管理には向いてないので、そこは結局Excelでガントチャート&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;PukiWIki書いてた&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;使ってたのはプログラマだけ&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;redmineはコミュニケーション促進ツール&#34;&gt;Redmineはコミュニケーション促進ツール&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;チケット&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;文書&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;ニュース&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Wiki&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;リポジトリ&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;通知&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;メール、RSS&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;チケット&#34;&gt;チケット&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;「分類」って属性だけ追加&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;チェンジセットまぁ便利 (ref #n, fix #n)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;カスタムクエリまあ便利&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;ニュース&#34;&gt;ニュース&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;リーダーとしての方針を伝える&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;プロジェクトの大きな変化（遅延など）を知らせる&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;文書&#34;&gt;文書&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;運用の取り決め&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;コーディング規約とか&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;wiki&#34;&gt;Wiki&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;いらない子ｗ&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;PukiWiki記法に慣れてるし&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;ソースのせる用のテンポラリ領域として使用&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;リポジトリ&#34;&gt;リポジトリ&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;空気。とまっててもコミッタ以外は気付かない&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;活動&#34;&gt;活動&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;全ての活動ログ&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;一番大事&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;アクティビティ・ストリーム&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;さぼっている人が一発でわかるw&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;まとめ&#34;&gt;まとめ&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;ウォーターフォールの工程管理には向いていない&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;使い方はかなり自由度が高いので、ルール最低限でとにかく使わせてみましょう&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;大事なのは活動をRSS登録すること&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;完璧なredmineなど存在しない&#34;&gt;完璧なRedmineなど存在しない&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.sooey.com/journal/2009/06/13/1126/&#34;&gt;juno&lt;/a&gt;さん(&lt;a href=&#34;http://www.slideshare.net/juno/there-are-no-perfect-redmine&#34;&gt;資料&lt;/a&gt;)&lt;/p&gt;&#xA;&lt;p&gt;18 projects&lt;/p&gt;&#xA;&lt;p&gt;1,696 tickets&lt;/p&gt;&#xA;&lt;p&gt;22 users&lt;/p&gt;&#xA;&lt;p&gt;なぜTracをやめたか&lt;/p&gt;&#xA;&lt;p&gt;→管理画面の機能が貧弱&lt;/p&gt;&#xA;&lt;h4 id=&#34;redmine移行にあたってやったこと&#34;&gt;Redmine移行にあたってやったこと&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;マニュアルの作成&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;段階的な導入(走っているプロジェクトはTracのまま)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;自分が率先して使う&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;textile記法ないわー&#34;&gt;Textile記法ないわー&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Markdownが使いたい(WordPressでも使ってる)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Markdown Extraが使いたい。redmine_markdown_extra_formatterというのがある&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;csvで一括インポート&#34;&gt;CSVで一括インポート&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;PMからの要望 (Excel派)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;redmine_importer&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;ExcelRedmineAddIn&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;楽しく利用してもらうための細工&#34;&gt;楽しく利用してもらうための細工&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;ユーザーアイコン&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Gravatarを利用する。デフォルトで使える。ユーザが自由に画像を変更できる。ただしメールアドレスをGravatarに登録する必要がある&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Local avatars Pluginを利用する。これだと画像はRedmineサーバ上に格納される&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;他にも&#34;&gt;他にも&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;favicon.icoをちゃんと作る&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;グラフィカルなプラグイン(Gompertanなど)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;スニペット共有プラグイン(redmine_codebook)→検索の対象にならないのがネック&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;パッチのプラグイン化&#34;&gt;パッチのプラグイン化&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;通知メールのSubjectを変更する。UTF-8で長いSubjectのメールが文字化けする&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;バージョンアップのたびにソースを直す必要がある&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;参考文献：Plugin Tutorial、Plugin Internals(こっちがいい)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;alias_method_chainを使いこなすことがポイント&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;lt---csvユーザー一括登録プラグインを作ってみた話&#34;&gt;LT - CSVユーザー一括登録プラグインを作ってみた話&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://d.hatena.ne.jp/shrkw/20090612/1244915877&#34;&gt;shrkw&lt;/a&gt;さん(&lt;a href=&#34;http://www.slideshare.net/shrkw/redmine-csv&#34;&gt;資料&lt;/a&gt;)&lt;/p&gt;&#xA;&lt;h4 id=&#34;bts使用歴&#34;&gt;BTS使用歴&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Trac&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;GLPI&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Backlog&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Ruby歴2日目だったが、Redmineのほうがrailsにのっかっている分、Tracよりプラグイン作りやすい。&lt;/p&gt;&#xA;&lt;p&gt;ってか&lt;a href=&#34;https://journal.lampetty.net/tech/index.php/archives/285&#34;&gt;RedmineでCSVのユーザ情報をまとめて登録するスクリプト&lt;/a&gt;のエントリーが紹介されていた!!&lt;/p&gt;&#xA;&lt;p&gt;ユーザを一発で登録できるプラグインを作成したので、そのデモ。&lt;/p&gt;&#xA;&lt;h3 id=&#34;懇親会&#34;&gt;懇親会&lt;/h3&gt;&#xA;&lt;p&gt;中華料理屋にて懇親会。自分たちのテーブルはおそらく一番Redmineを使っていない人たちが集まったテーブルのようでした。「言語は何使ってる？」「DBはMySQL派？ポスグレ派？」「OSは？」「バージョン管理は？Git？SVN？」みたいな会話が飛び交い、Redmineの話はほとんどしませんでしたw あと、意外に影舞ユーザが多いことが判明したのも大きな収穫でした。ほら、&lt;a href=&#34;http://www.magicvox.net/archive/2007/02212310/&#34;&gt;任天堂でも影舞が使われているらしい&lt;/a&gt;し...やっぱりシンプルなものが受け入れられるのだなぁと。&lt;/p&gt;&#xA;&lt;h3 id=&#34;雑感&#34;&gt;雑感&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;「活動」は自分の作業報告をする上でうまく使えたらいいなぁと&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;みんなRedmineを改造して使っているということがわかって、それが邪道な使い方じゃないんだなぁとわかったのがよかったです。そういう意味では、「モンキーパッチをプラグイン化してRedmine本体のバージョンアップに備える」というjunoさんの路線はすごくいい気がしました。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Redmineはデザインにもっと良くした方が... ってことを言っている人がいて全く同感でした&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;あとはRedmine本家の開発体制が「独裁主義なんじゃ」という話がありました。実際のところメインの人以外でコミッターっているのでしょうか...&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>BOSE サウンドドック シリーズIIを買いました</title>
				<link>https://journal.lampetty.net/posts/wp/319/</link>
				<pubDate>Sat, 13 Jun 2009 14:06:41 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/319/</guid>
				<description>&lt;p&gt;[tmkm-amazon]B001IO6R4U[/tmkm-amazon]&lt;/p&gt;&#xA;&lt;p&gt;そろそろCD-MDのコンポを処分したいなぁと思ったので、iPodを乗せられるタイプのスピーカーを探していたら、なんやかんやでBOSEがやっぱり音が良さそうということで買いました。&lt;/p&gt;&#xA;&lt;p&gt;自分は家では爆音でライブ音源をきいたりするので、それなりの音に耐えうるスピーカーが必要だったのですが、まぁいい買い物だったと思います。&lt;/p&gt;&#xA;&lt;p&gt;操作方法はとてもシンプルでリモコンはなんと8つのボタンしかありません。iPodのドックがある他、インターフェースとしては外部入力端子を一つ備えているので、CDプレーヤーなどをつなぐことも可能です。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.bose.co.jp/jp_jp?url=https://journal.lampetty.net/consumer_audio/multimedia_speakers/for_your_ipod/sounddock_ii/sounddock_ii_features.jsp&#34;&gt;メーカーの商品ページ&lt;/a&gt;&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>WordPressを2.8にアップグレード</title>
				<link>https://journal.lampetty.net/posts/wp/318/</link>
				<pubDate>Sat, 13 Jun 2009 14:06:31 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/318/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;http://ja.wordpress.org/2009/06/11/wordpress-28/&#34;&gt;WordPress 2.8がリリースされていた&lt;/a&gt;のでアップグレードしてみました。&lt;/p&gt;&#xA;&lt;p&gt;自分の場合は&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;データベースとファイルをバックアップ&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;zipファイルをダウンロードして解凍&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;rsync -Cavz wordpress/* path-to-wordpress/ してファイルをコピー&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;wp-admin の管理画面にアクセス。Database Upgrade Required と言われるのでアップグレード&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;完了&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;という手順です。&lt;/p&gt;&#xA;&lt;p&gt;まず何より最初に、2.8はいままでよりもずいぶんスピードアップしています。&lt;/p&gt;&#xA;&lt;p&gt;とのことだったので、&lt;a href=&#34;https://journal.lampetty.net/tech/&#34;&gt;TOPページ&lt;/a&gt;のレスポンスをYSlowで測ってみたのですが、&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;2.7: 平均2.11秒&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;2.8: 平均2.11&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;で変わってなかったです。もちろんテーマとか使っているプラグイン、ウィジェット次第だと思うので、自分の場合は変化がなかったというだけの話です。&lt;/p&gt;&#xA;&lt;p&gt;ちなみに管理画面のトップページがなんかおかしい気がします。ナビゲーションの▼クリックしても何も反応しない...&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Apacheが&#34;Couldn&#39;t create accept lock&#34;で起動しない場合の対処方法</title>
				<link>https://journal.lampetty.net/posts/wp/317/</link>
				<pubDate>Wed, 10 Jun 2009 14:06:30 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/317/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;http://diary.lampetty.net/20070613.html&#34;&gt;これ&lt;/a&gt;の続編なのですが、複数人が共同で使っているサーバなどで、Apacheのプロセスを何個も起動していると、使える&lt;a href=&#34;http://itpro.nikkeibp.co.jp/article/COLUMN/20060602/239824/&#34;&gt;セマフォ&lt;/a&gt;がなくなるという事態に遭遇することがあります。対処方法は、Apacheを止めるか&lt;/p&gt;&#xA;&lt;p&gt;$ for semid in `ipcs -s | grep www-data | cut -f2 -d&amp;quot; &amp;quot;`; do ipcrm -s $semid; done&lt;/p&gt;&#xA;&lt;p&gt;としてセマフォを削除すれば解決しますが、どうしてもたくさんのApacheのプロセスを立ち上げたい場合は、kernelパラメータのkernel.semの値を大きくしてみると良いでしょう。&lt;/p&gt;&#xA;&lt;p&gt;Ubuntu 9.04 Server版の kernel.sem のデフォルト値は&lt;/p&gt;&#xA;&lt;p&gt;$ cat /proc/sys/kernel/sem&lt;/p&gt;&#xA;&lt;p&gt;250 32000 32 128&lt;/p&gt;&#xA;&lt;p&gt;となっていて、この4つの数値は左から&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;SEMMSL: セマフォ集合ごとのセマフォ数の最大値。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;SEMMNS: システム全体での、全てのセマフォ集合におけるセマフォ数の制限。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;SEMOPM: semop(2)コールに指定されるオペレーション数の最大値。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;SEMMNIシステム全体でのセマフォ識別子の最大値。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;というものらしいです。&lt;/p&gt;&#xA;&lt;p&gt;今回はためしにこの4つの数値を倍に設定してみましょう。設定するには /etc/sysctl.conf に以下の行を追加します。&lt;/p&gt;&#xA;&lt;p&gt;kernel.sem = 500 64000 64 256&lt;/p&gt;&#xA;&lt;p&gt;完了したら&lt;/p&gt;&#xA;&lt;p&gt;$ sudo sysctl -p&lt;/p&gt;&#xA;&lt;p&gt;を実行するとすぐに反映されます。これでApacheが意味不明な&amp;quot;Couldn&#39;t create accept lock&amp;quot;というエラーを吐かなくなるはずです。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>MacBookのDVDドライブが故障</title>
				<link>https://journal.lampetty.net/posts/wp/314/</link>
				<pubDate>Tue, 19 May 2009 14:05:25 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/314/</guid>
				<description>&lt;p&gt;昨年10月に購入したMacBookアルミニウムMB466J/AのDVDドライブが、先週の日曜日に突然DVDを読めなくなってしまいました。DVDを入れると「ウィーン、ウィーン」と何か頑張ってる感じがして「先生、もう駄目です」みたいな感じでイジェクトされるという現象。&lt;/p&gt;&#xA;&lt;p&gt;ネットで調べたらおそらくドライブの故障っぽかったので、その日のうちに渋谷のApple Storeに行ってみたところ、速攻で入院決定。「明日には引き取れるようになってますんで」ということだったので、家に帰ったら修理に出してから3時間足らずで「修理完了しました」の電話が...&lt;/p&gt;&#xA;&lt;p&gt;というわけでApple StoreのサポートのあまりのGJさにちょっとビビりましたが、そもそも半年でパーツが壊れるっていうところにApple製品の闇を見たような気がします。今回は購入から1年経ってなかったので保証がききましたが、保証が切れている場合¥45,000の修理代金がかかるらしく背筋がぞっとします。「Apple Care(¥31,500)に加入せよ」というありがたい神のお告げが聞こえてきますが、本当悩ましいです...&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Firefoxの起動を速くするSQLite Optimizer</title>
				<link>https://journal.lampetty.net/posts/wp/312/</link>
				<pubDate>Sat, 16 May 2009 23:05:10 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/312/</guid>
				<description>&lt;p&gt;Firefoxは使っているうちになんとなく起動速度が遅くなっていくような傾向がありますが、起動を速くするアドオン&lt;a href=&#34;https://addons.mozilla.org/ja/firefox/addon/11198&#34;&gt;SQLite Optimizer&lt;/a&gt;を見つけました。(詳しくは&lt;a href=&#34;http://mozilla-remix.seesaa.net/article/118793069.html&#34;&gt;こちら&lt;/a&gt;)&lt;/p&gt;&#xA;&lt;p&gt;インストールしてから[ツール]-&amp;gt;[アドオン]-&amp;gt;[SQLite Optimizer]の設定を開いて[今すぐREINDEXを実行する]をクリックすると、以降Firefoxの起動が速くなります。自分の場合、賞味2秒ぐらいかかっていたものが1秒ぐらいになって、体感できるぐらい起動が速くなりました。インデックス作り直すだけでこんなに速くなるものなんですねぇ。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>WordPress</title>
				<link>https://journal.lampetty.net/posts/wp/wordpress/</link>
				<pubDate>Sat, 16 May 2009 16:05:50 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/wordpress/</guid>
				<description>&lt;p&gt;2009年1月からブログをWordPressに移行しました。その過程で試したテーマやプラグインをざっくばらんに説明するページです。&lt;/p&gt;&#xA;&lt;h3 id=&#34;テーマ&#34;&gt;テーマ&lt;/h3&gt;&#xA;&lt;p&gt;ブログ開設当初から、テーマは&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Mac風の&lt;a href=&#34;http://www.ndesign-studio.com/resources/wp-themes/itheme/&#34;&gt;iTheme&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;シックで高機能な&lt;a href=&#34;http://wordpress.org/extend/themes/inove&#34;&gt;iNove&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;優しい感じの&lt;a href=&#34;http://hellowiki.com/2008/03/30/theme-hello-d-fixed/&#34;&gt;Hello :D&lt;/a&gt; &amp;lt;-- li=&amp;quot;&amp;quot;&amp;gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;という順番で変遷しています。テーマを選ぶ基準としては&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;シンプルであること&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;無駄にヘッダーに大きなスペースが裂かれていないこと(1st viewでブログの本文がそれなりに見えること)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;改造しやすいこと&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;の3つを重視しています。&lt;/p&gt;&#xA;&lt;p&gt;1つ目の「シンプルであること」というのは、主にページの表示スピードを担保するためのものです。イメージを多用しているデザインだと、初めて来た人は大量の画像をダウンロードすることになり、ページの表示スピードが遅くなってしまうのが嫌でした。&lt;/p&gt;&#xA;&lt;p&gt;2つ目「無駄にヘッダーに大きなスペースが裂かれていないこと」は、このブログにやってくる人は主に何か技術的な情報を求めてやってくるので、このブログを開いた時に本文をまず見せるようなUIが一番だと判断しているためです。&lt;/p&gt;&#xA;&lt;p&gt;3つ目の「改造しやすいこと」は、改造する際に&lt;div&gt;タグや&lt;p&gt;タグを追加しやすい構造になっているか、ということです。例えばこのブログではパンくずを表示するように&lt;div&gt;を入れていますが、marginなどの取り方が変だと調節が難しいのです。&lt;/p&gt;&#xA;&lt;p&gt;参考までに、このブログのテーマ関連の投稿を書いておきます。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://journal.lampetty.net/tech/index.php/archives/245&#34; title=&#34;WordPressで試したテーマ&#34;&gt;WordPressで試したテーマ&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://journal.lampetty.net/tech/index.php/archives/302&#34; title=&#34;WordPressのテーマをHello :Dに変更&#34;&gt;WordPressのテーマをHello :Dに変更&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;プラグイン&#34;&gt;プラグイン&lt;/h3&gt;&#xA;&lt;p&gt;このブログで導入したプラグインで今でも使っているのは以下のものです。&lt;/p&gt;&#xA;&lt;h4 id=&#34;all-in-one-seo-pack&#34;&gt;&lt;a href=&#34;https://journal.lampetty.net/tech/index.php/archives/131&#34;&gt;All in One SEO Pack&lt;/a&gt;&lt;/h4&gt;&#xA;&lt;p&gt;投稿ごとにmetaタグのkeywordsやdescriptionが設定できるようになったり、titleタグにブログのタイトルを設定できるようになります。&lt;/p&gt;&#xA;&lt;h4 id=&#34;breadcrumb-navigation-xt&#34;&gt;&lt;a href=&#34;https://journal.lampetty.net/tech/index.php/archives/109&#34;&gt;Breadcrumb Navigation XT&lt;/a&gt;&lt;/h4&gt;&#xA;&lt;p&gt;パンくずナビゲーションを追加します。サイト内のリンク構造を改善することでSEO効果が得られるようになります。&lt;/p&gt;&#xA;&lt;h4 id=&#34;dagon-design-sitemap-generator&#34;&gt;&lt;a href=&#34;http://www.dagondesign.com/articles/sitemap-generator-plugin-for-wordpress/&#34;&gt;Dagon Design Sitemap Generator&lt;/a&gt;&lt;/h4&gt;&#xA;&lt;p&gt;ブログのサイトマップを生成するプラグイン。サイトマップを作ると検索エンジンのクローラーがページを巡回してくれる確率が高くなります。&lt;/p&gt;&#xA;&lt;h4 id=&#34;feedburner-feedsmith&#34;&gt;&lt;a href=&#34;https://journal.lampetty.net/tech/index.php/archives/120&#34;&gt;FeedBurner FeedSmith&lt;/a&gt;&lt;/h4&gt;&#xA;&lt;p&gt;生成されるRSSのURLを変更できるようにするプラグイン。&lt;/p&gt;&#xA;&lt;h4 id=&#34;google-xml-sitemaps-generator-for-wordpress&#34;&gt;&lt;a href=&#34;http://www.arnebrachhold.de/projects/wordpress-plugins/google-xml-sitemaps-generator/&#34;&gt;Google (XML) Sitemaps Generator for WordPress&lt;/a&gt;&lt;/h4&gt;&#xA;&lt;p&gt;Google Sitemapプロトコルに対応した XML のサイトマップファイルを自動で生成するプラグイン。これを導入するとクローラーがページを巡回する確率が高くなります。&lt;/p&gt;&#xA;&lt;h4 id=&#34;ktai-style-携帯対応プラグイン&#34;&gt;&lt;a href=&#34;https://journal.lampetty.net/tech/index.php/archives/220&#34;&gt;Ktai Style (携帯対応プラグイン)&lt;/a&gt;&lt;/h4&gt;&#xA;&lt;p&gt;WordPressを日本の携帯端末に対応させるプラグイン。URLはそのままで携帯端末でアクセスするとモバイル用の画面が表示されます。なお、２ヶ月に1回ぐらいの頻度でバージョンアップしておりちゃんとメンテナンスがされているのが嬉しいです。&lt;/p&gt;&#xA;&lt;h4 id=&#34;pagebar&#34;&gt;&lt;a href=&#34;http://www.elektroelch.de/hacks/wp/pagebar/&#34;&gt;pagebar&lt;/a&gt;&lt;/h4&gt;&#xA;&lt;p&gt;TOPページやカテゴリの一覧ページなど、投稿を一覧表示する画面にPagenationを埋め込むプラグインです。SEO対策で全ページくまなくインデックスされるように仕込んでみました。&lt;/p&gt;&#xA;&lt;h4 id=&#34;search-word-highlight-for-multibyte&#34;&gt;&lt;a href=&#34;http://wppluginsj.sourceforge.jp/search-word-highlight-for-multibyte/&#34;&gt;Search Word Highlight for Multibyte&lt;/a&gt;&lt;/h4&gt;&#xA;&lt;p&gt;検索エンジンからサイトに飛んできた際に、検索エンジンでの検索語をサイト上でハイライト表示するプラグインです。はてなダイアリーでもこのような機能がついているので入れてみました。&lt;/p&gt;&#xA;&lt;h4 id=&#34;similar-posts&#34;&gt;&lt;a href=&#34;https://journal.lampetty.net/tech/index.php/archives/156&#34;&gt;Similar Posts&lt;/a&gt;&lt;/h4&gt;&#xA;&lt;p&gt;今表示している投稿に似ている投稿を表示するプラグイン。投稿の単語を調べて似ているものを探しているようです。読者のために似ている投稿をおすすめすることでPVアップが見込めるでしょう。またサイト内のリンク構造も改善されるのでSEO対策としても有効だと思います。&lt;/p&gt;&#xA;&lt;h4 id=&#34;ultimate-google-analytics-plugin-for-wordpress&#34;&gt;&lt;a href=&#34;http://www.oratransplant.nl/uga/&#34;&gt;Ultimate Google Analytics plugin for WordPress&lt;/a&gt;&lt;/h4&gt;&#xA;&lt;p&gt;Google Analyticsの設定をWordPressの管理画面で行うためのプラグイン。WordPressにログインしている場合はトラッキングしないなどの設定が行えます。&lt;/p&gt;&#xA;&lt;h4 id=&#34;wordpress-database-backup&#34;&gt;&lt;a href=&#34;http://www.ilfilosofo.com/blog/wp-db-backup&#34;&gt;WordPress Database Backup&lt;/a&gt;&lt;/h4&gt;&#xA;&lt;p&gt;WordPressのデータベースのバックアップを管理画面から行ってファイルをダウンロードできるようにするプラグイン。定期的にバックアップを取ってメール送信するようなこともできます。&lt;/p&gt;&#xA;&lt;h4 id=&#34;wordpress-media-flickr&#34;&gt;&lt;a href=&#34;http://factage.com/yu-ji/tag/wp-media-flickr/&#34;&gt;Wordpress Media Flickr&lt;/a&gt;&lt;/h4&gt;&#xA;&lt;p&gt;WordPressの管理画面からFlickrの写真を選択してブログに引用できるようにするプラグイン。インタフェースがわかりやすくて使いやすいです。Flickrのヘビーユーザにおすすめのプラグインです。&lt;/p&gt;&#xA;&lt;h4 id=&#34;wp-chgfontsize&#34;&gt;&lt;a href=&#34;https://journal.lampetty.net/tech/index.php/archives/194&#34;&gt;WP-chgFontSize&lt;/a&gt;&lt;/h4&gt;&#xA;&lt;p&gt;WordPressのテーマはなぜかフォントサイズが小さいので、フォントサイズを変更するプルダウンを表示するプラグインです。このブログでは右ナビに設定しています。&lt;/p&gt;&#xA;&lt;h4 id=&#34;wp-syntax&#34;&gt;&lt;a href=&#34;https://journal.lampetty.net/tech/index.php/archives/255&#34;&gt;WP-Syntax&lt;/a&gt;&lt;/h4&gt;&#xA;&lt;p&gt;ソースコードをカラー表示にしてくれるプラグイン。存在するプログラミング言語にはほぼ全て対応しているのと、&amp;lt;&amp;gt;のタグを自動でエスケープしてくれるのが素晴らしいです。&lt;/p&gt;&#xA;&lt;h4 id=&#34;wp-tmkm-amazon&#34;&gt;&lt;a href=&#34;http://wppluginsj.sourceforge.jp/wp-tmkm-amazon/&#34;&gt;wp-tmkm-amazon&lt;/a&gt;&lt;/h4&gt;&#xA;&lt;p&gt;投稿内でAmazonの書籍などを引用するためのプラグインです。Amazon系のプラグインは色々乱立していたのですが、これが一番シンプルっぽいので選びました。&lt;/p&gt;&#xA;&lt;h4 id=&#34;hatena-bookmark-anywhere&#34;&gt;&lt;a href=&#34;http://wppluginsj.sourceforge.jp/hatena-bookmark-anywhere/&#34;&gt;Hatena bookmark anywhere&lt;/a&gt;&lt;/h4&gt;&#xA;&lt;p&gt;投稿に対してはてブされているコメントをブログ内にインラインで展開してくれるプラグイン。ブログへの反響がすぐ確認できるところがいいと思います。以下は使用イメージ。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/8250493@N05/3535685051/&#34; title=&#34;WordPressのHatena-bookmark-anywhereプラグインのイメージ&#34;&gt;&lt;img src=&#34;http://static.flickr.com/2271/3535685051_89dbcaf668.jpg&#34; alt=&#34;WordPressのHatena-bookmark-anywhereプラグインのイメージ&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h4 id=&#34;the-permalinker&#34;&gt;&lt;a href=&#34;http://wordpress.org/extend/plugins/the-permalinker/&#34; title=&#34;The Permalinker&#34;&gt;The Permalinker&lt;/a&gt;&lt;/h4&gt;&#xA;&lt;p&gt;過去の記事へのリンクを絶対URLで書かなくても良くなるプラグイン。[permalink id=&amp;quot;362&amp;quot;]参考[/permalink]&lt;/p&gt;&#xA;&lt;h3 id=&#34;まとめ&#34;&gt;まとめ&lt;/h3&gt;&#xA;&lt;p&gt;というわけで、テーマやプラグインについてまとめてみました。WordPressを始めてからかれこれ4ヶ月経っているので、このブログもそれなりに枯れてきたと思います。そんな枯れた情報ですが参考になれば幸いです。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>先送り癖をなくす</title>
				<link>https://journal.lampetty.net/posts/wp/309/</link>
				<pubDate>Wed, 13 May 2009 14:05:33 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/309/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;http://www.php.co.jp/magazine/the21/?unique_issue_id=14295&#34;&gt;THE 21 2009年5月号&lt;/a&gt;の記事に「すぐやる人＝できる人」は世界共通の法則だ！という記事があって、その中の言葉に「メールを読み、そのメールをすぐ処理せず優先度を決めている人がいるが、結局優先度を決めるために1回、実際にメールを処理する際に1回、合計2回メールを読むことになり非効率だ」的なことが書いてありました。それを見てなんと目から鱗がおちたことか...&lt;/p&gt;&#xA;&lt;p&gt;自分も「一番重要なこと」を判断するために優先度を決めてやっていましたが、最初に優先度を決める段階でその件についてはすでに色々考えているので、そこで処理できるものは処理してしまう方が無駄なコンテキストスイッチがない分非常に効率的だと思うようになりました。というわけで最近それを実施しています。&lt;/p&gt;&#xA;&lt;p&gt;本当に仕事が早くなったかは計測していないのでわかりませんが、すぐできることはその場でやるようにしたため、「これとあれをあとでやらなきゃいけない」的なことが頭の中からなくなり精神衛生上はすごく楽になったと思います。下手に先送りせず、その場で処理する癖をつけるといいことがあるかもよ、というエントリーでした。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Muninでサーバのリソース監視</title>
				<link>https://journal.lampetty.net/posts/wp/308/</link>
				<pubDate>Wed, 06 May 2009 12:05:05 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/308/</guid>
				<description>&lt;p&gt;サーバのリソース監視＆グラフ化を行なうソフトウェアは色々ありますが、今日は導入が簡単と言われている&lt;a href=&#34;http://munin.projects.linpro.no/&#34;&gt;Munin&lt;/a&gt;を紹介したいと思います。&lt;/p&gt;&#xA;&lt;p&gt;個人的に感じているMuninの良い点としては&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;インストール＆初期設定が簡単&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;デフォルトで監視できる対象が多い&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;プラグイン機構があり、任意のリソースのグラフ化が可能&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;が挙げられます。仕事で使うのは Cacti とかがいいと思いますが、個人利用としては Munin はとてもお手軽でおすすめです。&lt;/p&gt;&#xA;&lt;h3 id=&#34;インストール&#34;&gt;インストール&lt;/h3&gt;&#xA;&lt;p&gt;Ubuntu Linuxだとdebパッケージがあるのでaptitudeでインストールするだけです(Fedore CoreやCentOSにもRPMがあります)。&lt;/p&gt;&#xA;&lt;p&gt;$ sudo aptitude install munin&lt;/p&gt;&#xA;&lt;p&gt;インストールしたら、munin-nodeというプログラムが起動しているかどうかを調べます。&lt;/p&gt;&#xA;&lt;p&gt;$ ps auxww |grep munin-node&lt;/p&gt;&#xA;&lt;p&gt;もし起動していない場合は下記の要領で起動しておきましょう。&lt;/p&gt;&#xA;&lt;p&gt;$ sudo /etc/init.d/munin-node start&lt;/p&gt;&#xA;&lt;h3 id=&#34;設定&#34;&gt;設定&lt;/h3&gt;&#xA;&lt;p&gt;Muninは munin-node というサーバに常駐してリソースの情報を集めるエージェントと、そのエージェントから情報を集約してリソースの状況をグラフ化する munin 本体の2つがあります。今回は1台のサーバを監視するので特に意識する必要はありませんが、サーバが複数台になった場合は、munin-node を監視したいサーバにインストールする必要があります。&lt;/p&gt;&#xA;&lt;p&gt;なお、Munin自体はデフォルトのままでも使用できますが、 Muninが /var/www/munin/ に生成したグラフのファイルをブラウザから見れるように、Apacheに以下の設定を追加します。&lt;/p&gt;&#xA;&lt;p&gt;Alias /munin/ /var/www/munin/&lt;/p&gt;&#xA;&lt;p&gt;&amp;lt;Directory &amp;quot;/var/www/munin&amp;quot;&amp;gt;&lt;/p&gt;&#xA;&lt;p&gt;Options Indexes +SymLinksIfOwnerMatch MultiViews ExecCGI&lt;/p&gt;&#xA;&lt;p&gt;AllowOverride FileInfo AuthConfig Limit Indexes&lt;/p&gt;&#xA;&lt;p&gt;Order allow,deny&lt;/p&gt;&#xA;&lt;p&gt;Allow from all&lt;/p&gt;&#xA;&lt;p&gt;設定したら Apache を再起動します。5分ぐらい待ってから &lt;a href=&#34;http://yourhost/munin/&#34;&gt;http://yourhost/munin/&lt;/a&gt; をブラウザで開くと下記のような画面が表示されるかと思います。待てないせっかちな人は下記を実行してみてください(muninのHTMLが生成されます)。&lt;/p&gt;&#xA;&lt;p&gt;$ sudo -u munin munin-cron&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/8250493@N05/3507438018/&#34; title=&#34;Munin Top&#34;&gt;&lt;img src=&#34;http://static.flickr.com/3406/3507438018_93c8410b6c.jpg&#34; alt=&#34;Munin Top&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;監視したいリソースの追加&#34;&gt;監視したいリソースの追加&lt;/h3&gt;&#xA;&lt;p&gt;デフォルトでは Munin にはApacheやMySQLなどの状況をグラフ化するプラグインが付属しているので、これを有効にしてみましょう。例えば Apache 関連のものは&lt;/p&gt;&#xA;&lt;p&gt;$ sudo ln -s /usr/share/munin/plugins/apache_* /etc/munin/plugins/&lt;/p&gt;&#xA;&lt;p&gt;のように、/etc/munin/plugins/の下にpluginのシンボリックリンクを貼るだけで監視対象とすることができます。あ、ただ munin-node の再起動が必要ですが...&lt;/p&gt;&#xA;&lt;p&gt;$ sudo /etc/init.d/munin-node restart&lt;/p&gt;&#xA;&lt;p&gt;なお、グラフが更新されるのは５分に1回なので、監視対象を追加した場合反映されるのは5分後になります。以下は apache_accesses の状況です。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/8250493@N05/3507441158/&#34; title=&#34;MuninでApacheのリソース監視&#34;&gt;&lt;img src=&#34;http://static.flickr.com/3634/3507441158_2c01a99061.jpg&#34; alt=&#34;MuninでApacheのリソース監視&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;プラグインのダウンロード&#34;&gt;プラグインのダウンロード&lt;/h3&gt;&#xA;&lt;p&gt;デフォルトでもかなりの数のプラグインが揃っていますが、memcachedなどのリソース監視を行うプラグインもあります。そのような野良プラグインは&lt;a href=&#34;http://muninexchange.projects.linpro.no/&#34;&gt;MuninExchange&lt;/a&gt;にアップされているので、使えそうなものがないかチェックしておくと良いでしょう。&lt;/p&gt;&#xA;&lt;h3 id=&#34;まとめ&#34;&gt;まとめ&lt;/h3&gt;&#xA;&lt;p&gt;Muninのお手軽さが少しは伝わったでしょうか？日本語の情報はあまりありませんが、Munin自体はとてもシンプルかつ導入が簡単なので、「試しに入れてみよう」というとっかかりになれば幸いです。プラグインで任意のリソースをグラフ化することができるのも大きなメリットなので、時間があったらプラグインの書き方でも説明したいと思います。&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]4774145017[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>「ウェブユーザビリティの法則 改訂第2版」を読みました</title>
				<link>https://journal.lampetty.net/posts/wp/307/</link>
				<pubDate>Wed, 06 May 2009 09:05:25 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/307/</guid>
				<description>&lt;p&gt;[tmkm-amazon]4797339098[/tmkm-amazon]&lt;/p&gt;&#xA;&lt;p&gt;いまさら感が漂いますが、会社の同僚に借りて読んでみました。結論からいうとユーザビリティについて当たり前のことが簡潔にまとまっている良書です。自分用に一冊買おうかと思うぐらいでした。この本から学んだことはたくさんありましたが、記憶に残っている部分を箇条書きにしておきます。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;ユーザに考えさせない: 言葉は直感的にわかるものを選んで使用する。何の情報がどこにあるかを明確にしておく。ボタンはクリックできるものだとユーザが認識できるようにデザインする。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;人はページ内の文章は読まない。ざっと読むだけ: ユーザは大抵急いでいるので全ての文章を読んだりしない。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;サイトの左上のロゴ(ID)は重要: ユーザは自分が今どのサイトにいるのかわかるようにするため。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;ユーザビリティテストは難しくない: ユーザビリティテストには何十人も必要なわけではない。たとえ一人だけのテストでもやらないよりは100%マシ。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;ユーザをもてなす心が大事: ユーザに不要な情報を入力させたりしないこと。プライバシーに関する情報を過度に取得するとユーザの信頼を失う。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;とにかく、今までこんないい本を読んでいなかったことが非常に悔やまれるぐらいのいい本です。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>サーバリプレース時にWordPressの移行ではまったこと</title>
				<link>https://journal.lampetty.net/posts/wp/305/</link>
				<pubDate>Sun, 03 May 2009 14:05:35 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/305/</guid>
				<description>&lt;p&gt;昨日のサーバリプレースでこのブログの移行も行なったのですが、&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;データはMySQLのデータベースに保存されているので、mysqldumpしてそれを新しいサーバでインポート&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;WordPressのファイルは rsync で一括転送&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;して動作確認をしていたところ、どうも wp-admin の管理画面からログインすると&lt;/p&gt;&#xA;&lt;p&gt;Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 71 bytes) in /path-to-wordpress/wp-includes/gettext.php on line 91&lt;/p&gt;&#xA;&lt;p&gt;というエラーが... メモリがオーバフローしているみたいなのでググってみると「php.iniのmemory_limitを増やせば直る」とか書いてあるのですが、それをやっても全然直らずに途方に暮れていました。もしかすると i386 -&amp;gt; amd64 のアーキテクチャ変更がまずかったのか？とあたりをつけて色々試してみたところ、WordPressの管理画面の言語を ja から en に変更したらあっさり直りました！&lt;/p&gt;&#xA;&lt;p&gt;具体的には wp-config.php の以下の部分を修正。&lt;/p&gt;&#xA;&lt;p&gt;@@ -29,7 +29,7 @@&lt;/p&gt;&#xA;&lt;p&gt;// と設定すると、日本語 (UTF-8) がサポートされます。&lt;/p&gt;&#xA;&lt;p&gt;// (訳注: このパッケージでは日本語 (UTF-8) が設定されているので、そのままお使いの場合は&lt;/p&gt;&#xA;&lt;p&gt;// 変更する必要はありません。)&lt;/p&gt;&#xA;&lt;p&gt;-define (&#39;WPLANG&#39;, &#39;ja&#39;);&lt;/p&gt;&#xA;&lt;p&gt;+define (&#39;WPLANG&#39;, &#39;en&#39;);&lt;/p&gt;&#xA;&lt;p&gt;いやはや、もう再インストールを覚悟していたので、問題回避できただけでもよかったです。日本語リソースの ja.mo が悪さをしていたのでしょうか？本当の原因がわかってないのが気持ち悪いですが、とりあえず良しとします。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Ubuntu Linux 64bit版で32bit向けバイナリを使えるようにする</title>
				<link>https://journal.lampetty.net/posts/wp/304/</link>
				<pubDate>Sun, 03 May 2009 00:05:26 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/304/</guid>
				<description>&lt;p&gt;今回このブログのサーバをリプレースするにあたり、Ubuntu Linuxを32bitから64bit(amd64)にしたのですが、64bit環境で32bit向けのi386バイナリを実行する必要があったのでその方法をメモしておきます。結論から書くと&lt;/p&gt;&#xA;&lt;p&gt;$ sudo aptitude install ia32-libs&lt;/p&gt;&#xA;&lt;p&gt;して ia32-libs というパッケージをインストールするだけで、32bit向けのバイナリが64bit環境で実行できるようになります。&lt;/p&gt;&#xA;&lt;p&gt;なんでこれが必要だったかというと、Dynamic DNSのIP更新ツールとして&lt;a href=&#34;http://www.hi-ho.ne.jp/yoshihiro_e/dice/linux.html&#34;&gt;DiCE for Linux&lt;/a&gt;を使用していて、これだけは32bit向けのバイナリしか配布しておらず、64bit環境で実行しようとすると下記のエラーが出てしまっていました。&lt;/p&gt;&#xA;&lt;p&gt;$ sudo /usr/local/DiCE/diced -e0&lt;/p&gt;&#xA;&lt;p&gt;sudo: unable to execute /usr/local/DiCE/diced: No such file or directory&lt;/p&gt;&#xA;&lt;p&gt;どうしたものかなと思ってググってみると、&lt;a href=&#34;http://sourceforge.jp/magazine/08/07/28/0221248&#34;&gt;Adobe Flashなどの32ビットアプリケーションを64ビットLinux上で利用する&lt;/a&gt;という記事を発見して ia32-libs の存在を知りました。こういうのもちゃんとパッケージ化されていて一発でインストールできるのがDebianの素晴らしいところですね。&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]4861905389[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>WordPressのテーマをHello :Dに変更</title>
				<link>https://journal.lampetty.net/posts/wp/302/</link>
				<pubDate>Sat, 02 May 2009 00:05:16 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/302/</guid>
				<description>&lt;p&gt;長らく使用していた&lt;a href=&#34;http://wordpress.org/extend/themes/inove&#34;&gt;iNove&lt;/a&gt;ですが、黒とグレーで覆われたカラーがダークな印象を与えているようで嫌だったので、もうちょっと優しい色のテーマを探していました。色々探したところ&lt;a href=&#34;http://hellowiki.com/2008/03/30/theme-hello-d-fixed/&#34;&gt;Hello :D&lt;/a&gt;がなかなかいい色使いだったので重い腰を上げてテーマを変更。&lt;/p&gt;&#xA;&lt;p&gt;デフォルトのままだと幾つか気になる点があったので以下の点を変更しました。これでだいぶ見やすくなってかなり満足です。&lt;/p&gt;&#xA;&lt;h3 id=&#34;サイドバーのリンク&#34;&gt;サイドバーのリンク&lt;/h3&gt;&#xA;&lt;p&gt;右側のサイドバーのリンクはアンダーラインがなくてリンクだと認識されにくかったので、下線を引くように修正しました。&lt;/p&gt;&#xA;&lt;p&gt;Index: css/default.css&lt;/p&gt;&#xA;&lt;p&gt;===================================================================&lt;/p&gt;&#xA;&lt;p&gt;--- css/default.css (revision 33)&lt;/p&gt;&#xA;&lt;p&gt;+++ css/default.css (working copy)&lt;/p&gt;&#xA;&lt;p&gt;@@ -350,7 +354,6 @@&lt;/p&gt;&#xA;&lt;p&gt;#sidebar a {&lt;/p&gt;&#xA;&lt;p&gt;color: #333;&lt;/p&gt;&#xA;&lt;p&gt;-text-decoration: none;&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;p&gt;#sidebar a:hover {&lt;/p&gt;&#xA;&lt;h3 id=&#34;既読リンクの色を変えるように&#34;&gt;既読リンクの色を変えるように&lt;/h3&gt;&#xA;&lt;p&gt;デフォルトでは未読リンクも既読リンクの色も同じだったのですが、個人的なユーザビリティ哲学として既読リンクはわかるようにしたかったので、これを紫にするように修正。&lt;/p&gt;&#xA;&lt;p&gt;Index: css/default.css&lt;/p&gt;&#xA;&lt;p&gt;===================================================================&lt;/p&gt;&#xA;&lt;p&gt;--- css/default.css (revision 33)&lt;/p&gt;&#xA;&lt;p&gt;+++ css/default.css (working copy)&lt;/p&gt;&#xA;&lt;p&gt;@@ -38,7 +38,7 @@&lt;/p&gt;&#xA;&lt;p&gt;text-decoration: none;&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;p&gt;-h1 a:hover, h1 a:active {&lt;/p&gt;&#xA;&lt;p&gt;+h1 a:hover, h1 a:active, h1 a:visited {&lt;/p&gt;&#xA;&lt;p&gt;color: #fff;&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;p&gt;@@ -130,6 +130,10 @@&lt;/p&gt;&#xA;&lt;p&gt;text-decoration: none;&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;p&gt;+a:visited {&lt;/p&gt;&#xA;&lt;p&gt;+color: purple;&lt;/p&gt;&#xA;&lt;p&gt;+}&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;a {&lt;/p&gt;&#xA;&lt;p&gt;color: #0063DC;&lt;/p&gt;&#xA;&lt;p&gt;text-decoration: underline;&lt;/p&gt;&#xA;&lt;p&gt;@@ -269,6 +269,11 @@&lt;/p&gt;&#xA;&lt;p&gt;text-decoration: underline;&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;p&gt;+.title h2 a:visited {&lt;/p&gt;&#xA;&lt;p&gt;+color: #369&lt;/p&gt;&#xA;&lt;p&gt;+text-decoration: none;&lt;/p&gt;&#xA;&lt;p&gt;+}&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;.postdata {&lt;/p&gt;&#xA;&lt;p&gt;color: #690;&lt;/p&gt;&#xA;&lt;p&gt;margin-left: 0.8em;&lt;/p&gt;&#xA;&lt;h3 id=&#34;パンくず&#34;&gt;パンくず&lt;/h3&gt;&#xA;&lt;p&gt;iNoveではデフォルトで表示されていたパンくずですが、Hello :Dでは表示されないのでこれを表示されるように。&lt;/p&gt;&#xA;&lt;p&gt;Index: single.php&lt;/p&gt;&#xA;&lt;p&gt;===================================================================&lt;/p&gt;&#xA;&lt;p&gt;--- single.php (revision 33)&lt;/p&gt;&#xA;&lt;p&gt;+++ single.php (working copy)&lt;/p&gt;&#xA;&lt;p&gt;@@ -3,7 +3,7 @@&lt;/p&gt;&#xA;&lt;p&gt;-&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;a href=&#34;%3C?php%20echo%20get_option(&#39;home&#39;);%20?%3E&#34;&gt;Home&lt;/a&gt; » »&lt;/p&gt;&#xA;&lt;h3 id=&#34;ページメニューの強制大文字化を解除&#34;&gt;ページメニューの強制大文字化を解除&lt;/h3&gt;&#xA;&lt;p&gt;ヘッダー部分のページメニューで &amp;quot;Apache&amp;quot; というページがなぜか &amp;quot;APACHE&amp;quot; となっていたのでこれを解除。つーか、ユーザが入力したページ名を尊重しようよ。&lt;/p&gt;&#xA;&lt;p&gt;Index: css/default.css&lt;/p&gt;&#xA;&lt;p&gt;===================================================================&lt;/p&gt;&#xA;&lt;p&gt;--- css/default.css (revision 36)&lt;/p&gt;&#xA;&lt;p&gt;+++ css/default.css (working copy)&lt;/p&gt;&#xA;&lt;p&gt;@@ -181,7 +181,6 @@&lt;/p&gt;&#xA;&lt;p&gt;top: 25px;&lt;/p&gt;&#xA;&lt;p&gt;height: 35px;&lt;/p&gt;&#xA;&lt;p&gt;margin: 0;&lt;/p&gt;&#xA;&lt;p&gt;-text-transform: uppercase;&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;h3 id=&#34;投稿内のh3タグをわかりやすく&#34;&gt;投稿内のh3タグをわかりやすく&lt;/h3&gt;&#xA;&lt;p&gt;投稿内で見出しとして使用するh3タグがあまり見出しとしての視認性を発揮していなかったので、サイドバーで使用されている画像をつけるように修正。&lt;/p&gt;&#xA;&lt;p&gt;@@ -286,6 +291,8 @@&lt;/p&gt;&#xA;&lt;p&gt;.entry h3 {&lt;/p&gt;&#xA;&lt;p&gt;font-size: 1.3em;&lt;/p&gt;&#xA;&lt;p&gt;+background: url(../images/widget_title.png) no-repeat;&lt;/p&gt;&#xA;&lt;p&gt;+padding-left: 25px;&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;h3 id=&#34;ロードするjqueryのバージョンを変更&#34;&gt;ロードするjQueryのバージョンを変更&lt;/h3&gt;&#xA;&lt;p&gt;header.phpを見てみると、タグ内でGoogle AJAX Libraries API を使ってjQueryをロードしているのですが、jQueryのバージョンが1.2.6なのでこれを1.3にします。&lt;/p&gt;&#xA;&lt;p&gt;Index: header.php&lt;/p&gt;&#xA;&lt;p&gt;===================================================================&lt;/p&gt;&#xA;&lt;p&gt;--- header.php (revision 35)&lt;/p&gt;&#xA;&lt;p&gt;+++ header.php (working copy)&lt;/p&gt;&#xA;&lt;p&gt;@@ -11,7 +11,7 @@&lt;/p&gt;&#xA;&lt;p&gt;- // &amp;lt;![CDATA[ &lt;/p&gt; &lt;p&gt;+&lt;script type=&#34;text/javascript&#34;&gt;&lt;/p&gt; &lt;p&gt; // Load jQuery&lt;/p&gt; &lt;p&gt;- google.load(&amp;quot;jquery&amp;quot;, &amp;quot;1.2.6&amp;quot;);&lt;/p&gt; &lt;p&gt;+ google.load(&amp;quot;jquery&amp;quot;, &amp;quot;1.3&amp;quot;);&lt;/p&gt; &lt;p&gt; // ]]&amp;gt;&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Debianではapt-getじゃなくてaptitudeを推奨</title>
				<link>https://journal.lampetty.net/posts/wp/301/</link>
				<pubDate>Thu, 30 Apr 2009 15:04:25 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/301/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;http://www.jp.debian.org/releases/stable/i386/release-notes/ch-whats-new.ja.html#pkgmgmt&#34;&gt;ここ&lt;/a&gt;を読んでて知ったのですが、Debianではetchからパッケージ管理のフロントエンドとして apt-get じゃなくて aptitude を推奨するようになっていたのですね。依存関係がなくなった時点でパッケージを削除したり、推奨レベルのパッケージを一緒にインストールすることができるのが理由っぽい。&lt;/p&gt;&#xA;&lt;p&gt;しばらくDebianの情報集めをしていなかったので、すっかり浦島太郎状態です...&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Ubuntu LinuxでSSDの寿命を延ばすための設定</title>
				<link>https://journal.lampetty.net/posts/wp/299/</link>
				<pubDate>Sun, 26 Apr 2009 17:04:34 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/299/</guid>
				<description>&lt;p&gt;SSDの寿命が本当に短いのか実験していないので何とも言えませんが、Ubuntu LinuxでSSDの寿命を延ばすために行なった設定を書いておきます。本当に延びるかは謎です。 &lt;/p&gt;&#xA;&lt;h3 id=&#34;swap領域をssd内に作らない&#34;&gt;swap領域をSSD内に作らない&lt;/h3&gt;&#xA;&lt;p&gt;swap領域をSSDに作ってしまうと、仮想メモリを割り当てる際にSSDに書き込みをしてしまうのでこれは避けましょう。また、/etc/sysctl.conf に以下を追記してOSごと再起動します。(再起動の代わりに sysctl -p で即時に反映することもできます)&lt;/p&gt;&#xA;&lt;p&gt;vm.swappiness = 0&lt;/p&gt;&#xA;&lt;p&gt;この設定をするとswapにページアウトしにくくなります。&lt;/p&gt;&#xA;&lt;h3 id=&#34;osのキャッシュの書き込みの頻度調整&#34;&gt;OSのキャッシュの書き込みの頻度調整&lt;/h3&gt;&#xA;&lt;p&gt;Ubuntuはデフォルトでは書き込み処理はすべてメモリ上にキャッシュされ、これを５秒に1回ディスクに書き込むという仕組みになっているらしいです。なので、このキャッシュを書き込む頻度を5秒から15秒にします。具体的には /etc/sysctl.conf に以下の行を追加します。&lt;/p&gt;&#xA;&lt;p&gt;vm.dirty_writeback_centisecs = 1500&lt;/p&gt;&#xA;&lt;p&gt;設定したら sysctl -p するかOSごと再起動しましょう。&lt;/p&gt;&#xA;&lt;h3 id=&#34;mlocateを行なう頻度を少なく&#34;&gt;mlocateを行なう頻度を少なく&lt;/h3&gt;&#xA;&lt;p&gt;locateコマンドのデータベースを作成する mlocate はデフォルトでは /etc/cron.daily にあるので１日1回動いてしまいます。これが動くと大量のディスク書き込みが発生するので、locateのデータベースを最新にしなくても良い場合、この mlocate は /etc/cron.weekly にでも移動しておきます。&lt;/p&gt;&#xA;&lt;h3 id=&#34;tmpはtmpfsに&#34;&gt;/tmpはtmpfsに&lt;/h3&gt;&#xA;&lt;p&gt;/tmpは再起動するとどうせ消えるデータなので、SSDへの書き込みを少なくするために tmpfs でマウントするようにします。具体的には /etc/fstab に以下の行を追記して再起動します。&lt;/p&gt;&#xA;&lt;p&gt;tmpfs /tmp tmpfs defaults,size=512m 0 0&lt;/p&gt;&#xA;&lt;p&gt;512m(=512MB)となっているところはお好みのサイズにしてください。&lt;/p&gt;&#xA;&lt;h3 id=&#34;mountする際はnoatimeオプションをつける&#34;&gt;mountする際はnoatimeオプションをつける&lt;/h3&gt;&#xA;&lt;p&gt;デフォルトでは読み込みが発生する度にファイルの最終アクセス時刻が更新されてしまいますが、これも寿命を縮めてしまうので、noatimeオプションを導入します。(ただし、アクセス時刻を記録したい場合はこのオプションは導入しないでください)&lt;/p&gt;&#xA;&lt;p&gt;具体的には /etc/fstab で&lt;/p&gt;&#xA;&lt;p&gt;UUID=8bac1db5-e2c6-495f-b3ce-7390dea9392a / ext3 relatime,errors=remount-ro 0 1&lt;/p&gt;&#xA;&lt;p&gt;と relatime となっているところを noatime にします。&lt;/p&gt;&#xA;&lt;p&gt;UUID=8bac1db5-e2c6-495f-b3ce-7390dea9392a / ext3 noatime,errors=remount-ro 0 1&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]B004YA8I9M[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Ubuntu Server版をインストール後にやった4つのこと</title>
				<link>https://journal.lampetty.net/posts/wp/297/</link>
				<pubDate>Sun, 26 Apr 2009 01:04:26 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/297/</guid>
				<description>&lt;p&gt;Ubuntu Linux 9.04(Jaunty Jackalope) のサーバ版をインストールした直後にやっておくべき作業の4つを覚え書きとしてまとめておきます。&lt;/p&gt;&#xA;&lt;h3 id=&#34;ipアドレスを固定に&#34;&gt;IPアドレスを固定に&lt;/h3&gt;&#xA;&lt;p&gt;サーバ用途でDHCPというのはありえないので、固定IPに設定します。/etc/network/intafacesをエディタで開いて、まずDHCPでIPが自動に割り振られないように下記をコメントアウト。&lt;/p&gt;&#xA;&lt;p&gt;iface eth0 inet dhcp&lt;/p&gt;&#xA;&lt;p&gt;↓&lt;/p&gt;&#xA;&lt;p&gt;#iface eth0 inet dhcp&lt;/p&gt;&#xA;&lt;p&gt;さらにstatic IPの設定をします。下記設定は私のネットワーク環境での設定なので、実際のIPアドレスなどはご自身のものに読み替えてください。&lt;/p&gt;&#xA;&lt;p&gt;iface eth0 inet static　 # インタフェース名 eth0 を設定&lt;/p&gt;&#xA;&lt;p&gt;address 192.168.1.2　 # IPアドレス&lt;/p&gt;&#xA;&lt;p&gt;netmask 255.255.255.0 # ネットマスク&lt;/p&gt;&#xA;&lt;p&gt;network 192.168.1.0　 # ネットワークアドレス&lt;/p&gt;&#xA;&lt;p&gt;broadcast 192.168.1.255 # ブロードキャストアドレス&lt;/p&gt;&#xA;&lt;p&gt;gateway 192.168.1.1　 # ゲートウェイアドレス&lt;/p&gt;&#xA;&lt;p&gt;終わったらネットワークインターフェースを再起動します。&lt;/p&gt;&#xA;&lt;p&gt;$ sudo /etc/init.d/networking restart&lt;/p&gt;&#xA;&lt;h3 id=&#34;パッケージのアップデート&#34;&gt;パッケージのアップデート&lt;/h3&gt;&#xA;&lt;p&gt;リリース直後にディストリビューションを新しいバージョンにアップデートした場合を除いて、パッケージが多々更新されているのでアップデートしておきます。&lt;/p&gt;&#xA;&lt;p&gt;$ sudo aptitude update&lt;/p&gt;&#xA;&lt;h3 id=&#34;パスワードなしで-sudo-できるように&#34;&gt;パスワードなしで sudo できるように&lt;/h3&gt;&#xA;&lt;p&gt;セキュリティ的には良くない設定ですが、sudo する際にパスワードを入力するのは面倒なので、特定のアカウントだけパスワードなしで sudo できるようにします。&lt;/p&gt;&#xA;&lt;p&gt;$ sudo su -&lt;/p&gt;&#xA;&lt;p&gt;# export EDITOR=vi&lt;/p&gt;&#xA;&lt;p&gt;# visudo&lt;/p&gt;&#xA;&lt;p&gt;して&lt;/p&gt;&#xA;&lt;p&gt;accountname ALL=(ALL) NOPASSWD: ALL&lt;/p&gt;&#xA;&lt;p&gt;を追記します。accountnameのところは自分のものに読み替えてください。また、&lt;/p&gt;&#xA;&lt;p&gt;%admin ALL=(ALL) ALL&lt;/p&gt;&#xA;&lt;p&gt;となっているところはコメントアウトします。なお、デフォルトだとエディタがnanoになっているので、export EDITOR=vi して visudo した時に vi が立ち上がるようにしています。&lt;/p&gt;&#xA;&lt;h3 id=&#34;不要なdaemonを止める&#34;&gt;不要なdaemonを止める&lt;/h3&gt;&#xA;&lt;p&gt;まず /etc/init.d/ 配下のdaemonの起動を制御する sysv-rc-conf というパッケージを入れておきます。&lt;/p&gt;&#xA;&lt;p&gt;$ sudo apt-get install sysv-rc-conf&lt;/p&gt;&#xA;&lt;p&gt;そして&lt;/p&gt;&#xA;&lt;p&gt;$ sudo sysv-rc-conf&lt;/p&gt;&#xA;&lt;p&gt;で起動して、不要そうな daemon で X の目印がついているところを SPACEキーで X を外します。私は以下のdaemonを止めました。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;acpid: 電源やバッテリー関連のデーモンでサーバ用途には不要だと思われます&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;atd: atによってキューに入れられたジョブを実行します。必要ないので停止しましょう。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;dns-clean: よくわかりませんが pppconfig パッケージに含まれているものなので、止めました。(ルータとしては使用しないため)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;dovecot: popは利用しないので停止&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;pppd-dns: これもよくわかりませんがルーターとしては使用しないので止めました。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;rsync: rsync daemonは不要なので止めました。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;[tmkm-amazon]4774145017[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>SSDのマシンにUbuntu 9.04 Serverをインストール</title>
				<link>https://journal.lampetty.net/posts/wp/295/</link>
				<pubDate>Sat, 25 Apr 2009 17:04:16 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/295/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;https://journal.lampetty.net/tech/index.php/archives/293&#34;&gt;先週購入したSSDのマシン&lt;/a&gt;を組み立てました。SSDは2.5インチなので3.5インチ用のマウンタを買ったのですが、けっきょくネジをちゃんと締めれば必要なかったり、SATAのポートが2本しかないのにDVD-ROMがSATA接続だったり色々トラブルがあって5時間近くかかってしまいました。あと今回買ったShuttleのケースはなんとCPUファンじゃなくヒートシンクのみの構成でした。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/8250493@N05/3473998738/&#34; title=&#34;CPUファンがなくてヒートシンクだけ&#34;&gt;&lt;img src=&#34;http://static.flickr.com/3561/3473998738_6960d23aab.jpg&#34; alt=&#34;CPUファンがなくてヒートシンクだけ&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;セットアップは無事完了したので、このマシンにUbuntu 9.04 Server版(amd64)をインストール。通常の7200RPMのHDDでhdparmした結果とSSDのマシンでhdparmした結果はこんな感じ。&lt;/p&gt;&#xA;&lt;p&gt;### HDDのマシン&lt;/p&gt;&#xA;&lt;p&gt;$ sudo hdparm -t /dev/sda&lt;/p&gt;&#xA;&lt;p&gt;/dev/sda:&lt;/p&gt;&#xA;&lt;p&gt;Timing buffered disk reads: 174 MB in 3.01 seconds = 57.84 MB/sec&lt;/p&gt;&#xA;&lt;p&gt;### SSDのマシン&lt;/p&gt;&#xA;&lt;p&gt;$ sudo hdparm -t /dev/sda&lt;/p&gt;&#xA;&lt;p&gt;/dev/sda:&lt;/p&gt;&#xA;&lt;p&gt;Timing buffered disk reads: 418 MB in 3.01 seconds = 138.86 MB/sec&lt;/p&gt;&#xA;&lt;p&gt;すごい、2倍以上違う。さらにSSDはHDDより圧倒的に静かで軽いです。大きさも手のひらサイズでした。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/8250493@N05/3474000326/&#34; title=&#34;SSDは手のひらサイズ&#34;&gt;&lt;img src=&#34;http://static.flickr.com/3410/3474000326_23b1af9a99.jpg&#34; alt=&#34;SSDは手のひらサイズ&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;そして極めつけはUbuntuが起動するまでに約15秒しかかからないことでしょうか。え、もう起動したの？なんかバグってるんじゃない？っていうぐらい速かったです。今回購入したSSDはSilicon PowerのSP064GBSSD650S25で、いわゆる「プチフリ」するJMicronのJMF602のコントローラを積んでいるらしいのですが、プチフリ現象は今のところ起きてません。どのぐらい寿命が持つのかはわかりませんが、この速さは一度体感したら元には戻れない感じです。&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]4774145017[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>「すべての「見える化」で会社は変わる」を読みました</title>
				<link>https://journal.lampetty.net/posts/wp/294/</link>
				<pubDate>Sat, 25 Apr 2009 04:04:27 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/294/</guid>
				<description>&lt;p&gt;[tmkm-amazon]4788907534[/tmkm-amazon]&lt;/p&gt;&#xA;&lt;p&gt;会社経営に興味があるわけではないのですが、Amazonでやたら評価が高かったので気になって読みました。21世紀の会社経営について、どうしていけば良いのかを明確にしていてすごくわかりやすかったです。この本から学んだことを箇条書きにしてみます。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;現代の会社経営は市場や環境の変化が早いため非常に難易度が高い。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;そのような状況で経営していくには、KPIなどを決め数値をモニタリングし、経営のコックピットを作ることが大切（見える化）。会社経営は飛行機の操縦以上に難しい&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;「見えるようにすれば、気付く→気付けば動く→動けば変化する→変化を目に見えるようにする」というサイクルを作ることが重要（ちょっと違うけどPDCAみたいなもの）&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;やる気・モチベーションのような精神論だけでは駄目。社員に考えさせて行動させる。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;社員に考えさせるにはビジョンや戦略を共有することが大事。同じ価値観・問題意識を醸成させる→今流行りの「全員が経営者」&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;先月の売り上げなどの結果を見ることは大事だが、先行管理の方が重要。見積もり→受注→売上というプロセスがあるが、売上までには時間がかかるので、売上だけを見ても遅い。見積もり→受注のプロセスを管理するべし。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;見える化することで社員に対して公正な評価を付けやすくなる→ただ、100%公正にはできないと思いますが...&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;競合他社を真似ることで短期的には他社に追いつけるが、それでは新しいマーケットは作れない。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;現場で起こっていることを知るには「IT日報」が一番。また日報をただの報告ではなく「今日の結果を考えて明日どうするか」を考えさせるツールにするべき。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;本の最後の方は「IT日報」をどう活用するか、という話が多い気がしましたが、この人はIT日報エバンジェリストみたいなので、ここは話半分で読みました。全体的には非常にポイントがわかりやすく、色々勉強になった本でした。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Athlon X2 5050e＋メモリ4GB＋SSD 64GBで5万円</title>
				<link>https://journal.lampetty.net/posts/wp/293/</link>
				<pubDate>Mon, 20 Apr 2009 16:04:51 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/293/</guid>
				<description>&lt;p&gt;このサイトがある自宅サーバが&lt;a href=&#34;http://diary.lampetty.net/20051216.html#p02&#34;&gt;購入&lt;/a&gt;から3年を迎えたので、マシンの買い替えを検討。Pentium Dual-Core系でいくかAthlon X2でいくかで悩みましたが、省電力性と価格でAthlon X2 5050eで行くことに決めました。構成としては以下のスペックで、(64GBのSSDを買ったのに)なんと4万9000円に抑えられました。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;CPU: &lt;a href=&#34;http://kakaku.com/item/05100511625/&#34;&gt;Athlon X2 Dual-Core 5050e BOX&lt;/a&gt; ¥6,076&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;メモリ: 4GB &lt;a href=&#34;http://bbs.kakaku.com/bbs/05201612186/&#34;&gt;W2U800CQ-2GL5J&lt;/a&gt; ¥4,067&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;SSD: 64GB &lt;a href=&#34;http://kakaku.com/item/05372010243/&#34;&gt;SP064GBSSD650S25&lt;/a&gt; ¥14095&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;ケース: &lt;a href=&#34;http://kakaku.com/item/05855010801/&#34;&gt;Shuttle SN68SG2&lt;/a&gt; ¥20,968&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;DVD Drive: &lt;a href=&#34;http://kakaku.com/item/01254819195/&#34;&gt;LITEON iHAS120-27&lt;/a&gt; ¥2,838&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;送料: ¥429+¥525&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;先ほど全部ネットで注文して配達は今週末。さてどのぐらいのマシンパワーが出るのか非常に楽しみです。特にSSD化した時のMySQLの速度が気になります。&lt;/p&gt;&#xA;&lt;p&gt;[rakuten]pckoubou:10082910[/rakuten]&lt;/p&gt;&#xA;&lt;p&gt;[rakuten]pctwotop:10005408[/rakuten]&lt;/p&gt;&#xA;&lt;p&gt;[rakuten]goodwill:10129602[/rakuten]&lt;/p&gt;&#xA;&lt;p&gt;[rakuten]good-media:10005633[/rakuten]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>mysqldumpでバックアップをする時につけるオプション</title>
				<link>https://journal.lampetty.net/posts/wp/292/</link>
				<pubDate>Sat, 18 Apr 2009 03:04:17 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/292/</guid>
				<description>&lt;p&gt;MySQLのデータベースをバックアップする際にmysqldumpを使用しますが、個人的に「これはつけたらよさそう」と思っているオプションを紹介します。&lt;/p&gt;&#xA;&lt;h3 id=&#34;--opt&#34;&gt;--opt&lt;/h3&gt;&#xA;&lt;p&gt;--quick --add-drop-table --add-locks --extended-insert --lock-tables を指定するのと同じです。ダンプしたデータをMySQL サーバに読み込むための最速ダンプを提供します。(マニュアルそのまんま)&lt;/p&gt;&#xA;&lt;h3 id=&#34;--single-transaction&#34;&gt;--single-transaction&lt;/h3&gt;&#xA;&lt;p&gt;ダンプする際に先頭にBEGINをつけるため、ダンプ時のデータのトランザクションの一貫性を保つことができます。ただしInnoDBなどのトランザクションが有効なストレージエンジンではないと意味がないです。&lt;/p&gt;&#xA;&lt;h3 id=&#34;--flush-logs&#34;&gt;--flush-logs&lt;/h3&gt;&#xA;&lt;p&gt;ダンプを開始する前に、MySQL サーバ内のログファイルをフラッシュします。バイナリログを保存するような設定になっている場合はこれがフラッシュされます。ダンプしたデータとバイナリログを使用してデータを復元する場合に有用です。&lt;/p&gt;&#xA;&lt;h3 id=&#34;--master-data&#34;&gt;--master-data&lt;/h3&gt;&#xA;&lt;p&gt;CHANGE MASTER TOコマンドをダンプの先頭に付加します。--master-data=2を指定するとCHANGE MASTER TOがコメントアウトされた状態になります。--maser-data=1と指定するとコメントアウトされずにダンプされます。&lt;/p&gt;&#xA;&lt;h3 id=&#34;--default-character-set&#34;&gt;--default-character-set&lt;/h3&gt;&#xA;&lt;p&gt;ダンプする際の文字コードを指定します。&lt;/p&gt;&#xA;&lt;h3 id=&#34;--hex-blob&#34;&gt;--hex-blob&lt;/h3&gt;&#xA;&lt;p&gt;バイナリ型のデータをエスケープ処理を行わずに実際に格納された値の16進表記でダンプします。 これを指定しないと default-character-set がSJIS系の場合エスケープ処理に失敗し、バイナリデータが壊れてしまう場合があります。&lt;/p&gt;&#xA;&lt;h3 id=&#34;まとめ&#34;&gt;まとめ&lt;/h3&gt;&#xA;&lt;p&gt;自分はこんな感じでバックアップをとっています。&lt;/p&gt;&#xA;&lt;p&gt;$ mysqldump -uroot -pxxxxxxxx --opt --flush-logs --single-transaction --master-data=2 --default-character-set=utf8 --hex-blob $database&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Apache</title>
				<link>https://journal.lampetty.net/posts/wp/apache/</link>
				<pubDate>Thu, 16 Apr 2009 16:04:54 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/apache/</guid>
				<description>&lt;p&gt;世界で一番使われているWebサーバ &amp;quot;Apache&amp;quot; についてのリンク集です。&lt;/p&gt;&#xA;&lt;h3 id=&#34;本家のドキュメント&#34;&gt;本家のドキュメント&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://httpd.apache.org/docs/2.2/&#34;&gt;Apache本家のドキュメント&lt;/a&gt;は非常に充実していることで有名です。各ディレクティブの詳細やmod_**** のモジュールの解説など、とても詳しく書かれています(さらにほぼ日本語化されてます！)。なのでわからないことがあったらまずは本家のドキュメントを読んでみることをお勧めします。&lt;/p&gt;&#xA;&lt;h3 id=&#34;mod_rewrite&#34;&gt;mod_rewrite&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://blog.koss.jp/?id=100&amp;amp;date=200412&#34;&gt;黒魔術 mod_rewrite の具体的な設定方法（その１）&lt;/a&gt;: mod_rewriteについて簡潔にまとまっています。このブログを読んでQSAオプションの存在を知りました&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://japache.infoscience.co.jp/rewriteguide/&#34;&gt;A Users Guide to URL Rewriting with the Apache Webserverの日本語訳&lt;/a&gt;: mod_rewriteの詳細なドキュメントです。逆引きtips的な感じで情報がまとまっています。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;mod_proxy&#34;&gt;mod_proxy&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://journal.lampetty.net/tech/index.php/archives/238&#34;&gt;Apacheでリバースプロキシ(mod_proxy)を活用する(1) - インストール編&lt;/a&gt; - 軽量なフロントエンドのmod_proxyのインストール方法&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://journal.lampetty.net/tech/index.php/archives/246&#34;&gt;Apacheでリバースプロキシ(mod_proxy)を活用する(2) - 設定編&lt;/a&gt; - mod_proxyとバックエンドのサーバを用いたリバースプロキシ環境の構築&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://journal.lampetty.net/tech/index.php/archives/246&#34;&gt;Apacheでリバースプロキシ(mod_proxy)を活用する(3) - 負荷分散編&lt;/a&gt; - バックエンドのサーバを増やして負荷分散する方法&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;セキュリティ&#34;&gt;セキュリティ&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://journal.lampetty.net/tech/index.php/archives/124&#34;&gt;Apacheが出力するServerヘッダを隠す&lt;/a&gt; - Server: Apache のようなレスポンスヘッダーを隠す方法&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>WordPressの投稿にはてブのコメントを表示するプラグイン</title>
				<link>https://journal.lampetty.net/posts/wp/290/</link>
				<pubDate>Thu, 16 Apr 2009 16:04:40 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/290/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;http://www.func09.com/wordpress/archives/505&#34;&gt;このエントリ&lt;/a&gt;のようにはてブのコメントをブログ内で展開するのってどんなプラグインなのだろう、と思って調べたら&lt;a href=&#34;http://wppluginsj.sourceforge.jp/hatena-bookmark-anywhere/&#34;&gt;Hatena bookmark anywhere&lt;/a&gt;というものでした。というわけで早速インストールしてみて&lt;a href=&#34;https://journal.lampetty.net/tech/index.php/archives/288&#34;&gt;こんな感じ&lt;/a&gt;になりました。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Apacheでリバースプロキシ(mod_proxy)を活用する(3) - 負荷分散編</title>
				<link>https://journal.lampetty.net/posts/wp/288/</link>
				<pubDate>Sun, 12 Apr 2009 13:04:20 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/288/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;https://journal.lampetty.net/entry/wp/246&#34;&gt;前回のApacheでリバースプロキシ(mod_proxy)を活用する(2) - 設定編&lt;/a&gt;ではフロントエンドのリバースプロキシとバックエンドのCGIサーバの設定を行ないました。今回は、サイトの負荷が大きくなってきた時にバックエンドのサーバを複数台にする設定を説明します。イメージ図としては下記のような感じです。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.flickr.com/photos/8250493@N05/3433727583/&#34; title=&#34;リバースプロキシでの負荷分散のイメージ&#34;&gt;&lt;img src=&#34;http://static.flickr.com/3578/3433727583_883728521b.jpg&#34; alt=&#34;リバースプロキシでの負荷分散のイメージ&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;バックエンドの準備&#34;&gt;バックエンドの準備&lt;/h3&gt;&#xA;&lt;p&gt;まずは負荷分散が確認できるようにバックエンドのサーバを2台に増やします。前回作成した /etc/apache2/httpd_backend_8080.conf をコピーして /etc/apache2/httpd_backend_8081.conf を作成し、このhttpd_backend_8081.confがListenするポートを以下のように8080から8081にします。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;---&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;httpd_backend_8080&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;conf&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2009&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;04&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;07&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;00&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;32&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;55.000000000&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0900&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;+++&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;httpd_backend_8081&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;conf&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2009&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;04&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;07&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;00&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;36&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;09.000000000&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0900&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;@@&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;5&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;5&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;@@&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;#&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# /etc/apache2/httpd_backend_8080.conf&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# /etc/apache2/httpd_backend_8081.conf&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;#&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;User&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;www&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Group&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;www&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;@@&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;12&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;15&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;12&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;15&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;@@&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;LoadModule&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mime_module&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;usr&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;lib&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;apache2&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;modules&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mod_mime&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;so&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;ServerRoot&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;/etc/apache2&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Listen&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;8080&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ServerName&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;localhost&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;8080&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;PidFile&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tmp&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;httpd_backend_8080&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pid&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Listen&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;8081&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ServerName&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;localhost&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;8081&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;PidFile&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tmp&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;httpd_backend_8081&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pid&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;ServerAdmin&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;example_at_example&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;com&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;DocumentRoot&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;/var/www/html&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;TypesConfig&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;etc&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mime&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;types&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;LogFormat&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;%h %l &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;%u&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt; %t &amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;sa&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34; %&amp;gt;s %b &amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Referer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;User&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Agent&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;combined&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ErrorLog&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tmp&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;error_8080&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;log&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;CustomLog&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tmp&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;access_8080&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;log&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;combined&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ErrorLog&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tmp&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;error_8081&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;log&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;CustomLog&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tmp&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;access_8081&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;log&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;combined&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;UseCanonicalName&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Off&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;AddHandler&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cgi&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;script&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pl&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ポートを変更したら、下記のコマンドでこの8081でListenするApacheを立ち上げておきます。&lt;/p&gt;&#xA;&lt;p&gt;$ sudo /usr/sbin/apache2ctl -f /etc/apache2/httpd_backend_8081.conf -k start&lt;/p&gt;&#xA;&lt;p&gt;8080のサーバも停止しているようであれば起動しておきましょう。&lt;/p&gt;&#xA;&lt;p&gt;$ sudo /usr/sbin/apache2ctl -f /etc/apache2/httpd_backend_8080.conf -k start&lt;/p&gt;&#xA;&lt;h3 id=&#34;リバースプロキシで負荷分散の設定&#34;&gt;リバースプロキシで負荷分散の設定&lt;/h3&gt;&#xA;&lt;p&gt;バックエンドのサーバを2台に増設したら、その2台にリクエストを振り分けられるようにフロントエンドのリバースプロキシを設定し直します。やり方は色々ありますが、まずは一番シンプルな「リクエストをランダムに2台に振り分ける」というやり方を試してみたいと思います。&lt;/p&gt;&#xA;&lt;p&gt;前回の設定では&lt;/p&gt;&#xA;&lt;p&gt;RewriteEngine on&#xA;RewriteRule ^/(.+).pl$ &lt;a href=&#34;http://localhost:8080/index.pl&#34;&gt;http://localhost:8080/index.pl&lt;/a&gt; [L,P,QSA]&#xA;RewriteRule ^/(.+).(gif)$ /var/www/html/$1.$2 [L,QSA]&lt;/p&gt;&#xA;&lt;p&gt;というように、.plファイルへのアクセスを localhost:8080 に振り分ける設定でした。今回はこの部分を変更して、localhost:8080とlocalhost:8081に振り分けるように設定します。具体的には、前回のhttpd.confに対して&lt;/p&gt;&#xA;&lt;p&gt;RewriteMap server rnd:/usr/local/httpd_proxy_2.2.11/conf/server.txt&lt;/p&gt;&#xA;&lt;p&gt;という設定をRewriteRuleの前に追加し、RewriteRuleを下記のように変更します。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;RewriteRule ^/(.+).pl$ http://localhost:8080/index.pl [P,QSA]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;↓&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;RewriteRule ^/(.+).pl$ http://${server:backend}/index.pl [L,P,QSA]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;つまり前回のhttpd.confの設定との差分は下記のようになります。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;---&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;httpd&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;conf&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;entry246&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2009&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;04&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;12&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;22&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;07.000000000&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0900&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;+++&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;httpd&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;conf&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2009&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;04&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;12&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;17&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;29&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;49.000000000&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0900&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;@@&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;421&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;6&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;421&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;7&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;@@&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;RewriteEngine&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;on&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;RewriteRule&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;^/&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.+&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pl&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;localhost&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;8080&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;index&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pl&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;P&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;QSA&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;RewriteMap&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;server&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;rnd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;usr&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;local&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;httpd_proxy_2&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;2.11&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;conf&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;server&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;txt&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;RewriteRule&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;^/&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.+&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pl&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;//$&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;server&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;backend&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;index&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pl&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;L&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;P&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;QSA&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;RewriteRule&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;^/&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.+&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;gif&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;var&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;www&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;html&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/$&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;1.&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;L&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;QSA&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;httpd.confを書き換えたら、RewriteMapで指定した /usr/local/httpd_proxy_2.2.11/conf/server.txt というファイルを作成します。&lt;/p&gt;&#xA;&lt;p&gt;# echo &#39;backend localhost:8080|localhost:8081&#39; &amp;gt; /usr/local/httpd_proxy_2.2.11/conf/server.txt&lt;/p&gt;&#xA;&lt;p&gt;これらの設定は何を意味するかというと&lt;/p&gt;&#xA;&lt;p&gt;RewriteRuleで指定したパターンにマッチするリクエストがあった場合、RewriteMapで定義したサーバのどれか1台にランダムでリクエストを転送する&lt;/p&gt;&#xA;&lt;p&gt;ということです。RewriteMapというディレクティブでは /usr/local/httpd_proxy_2.2.11/conf/server.txt というファイルを指定して、そのファイルの中身は&lt;/p&gt;&#xA;&lt;p&gt;backend localhost:8080|localhost:8081&lt;/p&gt;&#xA;&lt;p&gt;となっています。ここで定義したバックエンドのサーバをその後ろのRewirteRuleで ${server:backend} として参照しているわけです。前回の設定では1台にしかリクエストを転送していませんでしたが、このような設定をすることで「どれか1台にランダムで」という形で負荷分散することが可能になります。&lt;/p&gt;&#xA;&lt;p&gt;というわけで、設定が完了したら mod_proxyサーバを再起動します。&lt;/p&gt;&#xA;&lt;p&gt;$ sudo /usr/local/httpd_proxy_2.2.11/bin/apachectl -k restart&lt;/p&gt;&#xA;&lt;h3 id=&#34;動作確認&#34;&gt;動作確認&lt;/h3&gt;&#xA;&lt;p&gt;サーバが起動したらブラウザから &lt;a href=&#34;http://example/index.pl&#34;&gt;http://example/index.pl&lt;/a&gt; に何回かアクセスしてみましょう(exampleの部分は自身のホスト名に適宜変更してください)。/tmp/access_8080.logと/tmp/access_8081.log の両方に下記のようなログが残っているはずです。&lt;/p&gt;&#xA;&lt;p&gt;127.0.0.1 - - [12/Apr/2009:17:46:35 +0900] &amp;quot;GET /index.pl HTTP/1.1&amp;quot; 200 129 &amp;quot;-&amp;quot; &amp;quot;Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; ja-JP-mac; rv:1.9.0.8) Gecko/2009032608 Firefox/3.0.8&amp;quot;&lt;/p&gt;&#xA;&lt;p&gt;これが確認できれば localhost:8080 と localhost:8081 の2台のバックエンドのサーバでの負荷分散環境が構築できたということになります。(なお、例によってそのままの設定だとセキュリティに問題があるので、作業が終了したら起動したApacheのプロセスは止めておくことをお奨めします)&lt;/p&gt;&#xA;&lt;h3 id=&#34;まとめ&#34;&gt;まとめ&lt;/h3&gt;&#xA;&lt;p&gt;mod_proxyを使った負荷分散環境の構築は、バックエンドのサーバさえしっかり準備ができていればリバースプロキシの設定はかなり簡単だったのではないでしょうか。このような複数台のバックエンドのサーバにリクエストを振り分けるような設定は負荷分散としても有効ですが、その他の使い道として「バックエンドのサーバを1台メンテナンスで一時的に止めたい」というような時にサイトを止めることなくメンテナンスが可能になります。(具体的には、server.txtからメンテナンス対象のサーバを削除するだけでリクエストが転送されなくなります)&lt;/p&gt;&#xA;&lt;p&gt;このように、リバースプロキシの用途は単純な負荷分散以外にもあるので、設定の仕方を知っておくだけでサイトの運用に非常に役立つと思います。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>MacBookのメモリ(1GB)とマザーボード(MSI 761GM2-V)売却</title>
				<link>https://journal.lampetty.net/posts/wp/287/</link>
				<pubDate>Sun, 05 Apr 2009 04:04:40 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/287/</guid>
				<description>&lt;p&gt;タイトルの通りまたまた渋谷ビックカメラのsofmapで売ってきました。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;204P 1GB PC3-8500: ¥1000&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;MSI 761GM2-V(廉価なMicroATXのマザー): ¥700&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;マザーボードは購入価格が¥7000ぐらいだったと思いますが、バックパネルや説明書、箱がそろっていれば¥1000ぐらいで売れるようです。&lt;a href=&#34;http://diary.lampetty.net/20081026.html#p01&#34;&gt;いらなくなったPCパーツを売却&lt;/a&gt;でも書きましたが、PCのパーツは以外と古くて型落ちしまくってても結構高値で売れるので、今までそのまま粗大ゴミ出していたような人はちゃんとバラして売るといいかもしれません。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>優れたビジネスマンと経営者は必ずしもイコールではない</title>
				<link>https://journal.lampetty.net/posts/wp/286/</link>
				<pubDate>Sat, 04 Apr 2009 16:04:24 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/286/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;http://www.arcarna.com/harada/?p=48&#34; title=&#34;アルカーナな日々 » 経営者とビジネスと&#34;&gt;アルカーナな日々 » 経営者とビジネスと&lt;/a&gt;のエントリーの&lt;/p&gt;&#xA;&lt;p&gt;経営者は、組織を考え、人事を考え、事業の総体を考える。そして、その上に（あるいは下に）ビジネスがのっかってくる。多分、その上のような気もするが、どっちもどっちかもしれない。&lt;/p&gt;&#xA;&lt;p&gt;という文章を読んで、はっと思う感じでした。事業を開発し育てる能力は確かに経営者に必要なスキルの一つだと思いますが、経営者は組織開発の能力にも長けている必要があると思います。組織開発というものは、自分の部下を育てたり、メンバーが気持ちよく仕事ができる環境を用意してあげたり、様々な方法で人を支援する仕事なのかなと。そういう組織の上で事業の成果が出て行くのではないでしょうか。&lt;/p&gt;&#xA;&lt;p&gt;というようなことを最近ずっと考えていて、この不況でも業績を伸ばしている企業というのは、やっぱり組織開発がうまいのではないのかなぁと思っています。こういう成功要因について、企業が情報発信してくれるとそれを参考にすることで、日本の企業が活性化するのではないかのかなと思ったりしています。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>RedmineでCSVのユーザ情報をまとめて登録するスクリプト</title>
				<link>https://journal.lampetty.net/posts/wp/285/</link>
				<pubDate>Fri, 20 Mar 2009 05:03:23 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/285/</guid>
				<description>&lt;p&gt;Web上からチマチマ登録するのもあれだったので、CSVのユーザ情報を一括で users テーブルにぶち込むためのスクリプトを作りました。作った後にタイムゾーンとかの設定が users テーブルじゃなくて user_preferences にあることを知りましたが、あまり細かいことを追求する時間はなかったので、とりあえず&lt;a href=&#34;http://coderepos.org/share/browser/platform/redmine/contrib/add_users_from_csv.rb&#34;&gt;codereposにアップしました&lt;/a&gt;。ご自由にお使い下さい。&lt;/p&gt;&#xA;&lt;p&gt;Redmine(というかRails)的にこういう類のスクリプトをどこに保存するべきかわからなかったので、codereposには platform/redmine/contrib というディレクトリをでっち上げています。「作法的にはここだろ」というものがあれば教えてもらえると嬉しいです。&lt;/p&gt;&#xA;&lt;p&gt;Railsは ver 1.2以来さわっていなかったのですが、ActiveRecordは以外に変わっていなかったのですんなり書けました。でもPerl の手癖が抜けなくて 変数宣言に my つけたり、行末にセミコロンつけたり(これは動くけど)で大変でした。&lt;/p&gt;&#xA;&lt;p&gt;[rakuten]book:13937889[/rakuten]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Nagiosのメモ</title>
				<link>https://journal.lampetty.net/posts/wp/284/</link>
				<pubDate>Wed, 18 Mar 2009 16:03:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/284/</guid>
				<description>&lt;p&gt;ここ最近Nagiosを設定する機会があったのですが、なかなか設定を覚えるのに時間がかかったので備忘録的な自分へのメモ。&lt;/p&gt;&#xA;&lt;h3 id=&#34;そもそもnagiosって&#34;&gt;そもそもNagiosって？&lt;/h3&gt;&#xA;&lt;p&gt;サーバや特定のポートの死活監視を行うソフトウェア。死んでいる場合は設定した連絡先にメールを送ったりすることができます。昔はNetSaintという名前でした。&lt;/p&gt;&#xA;&lt;h3 id=&#34;インストール&#34;&gt;インストール&lt;/h3&gt;&#xA;&lt;p&gt;ソースからインストールする場合は&lt;a href=&#34;http://umiushi.dip.jp/wordpress/linuxconfig/nagios30_02/&#34;&gt;Nagios3.0xで監視サーバを作る - 02 Nagiosインストールの前準備&lt;/a&gt;を参考にすると良いでしょう。&lt;/p&gt;&#xA;&lt;h3 id=&#34;用語&#34;&gt;用語&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;host: 監視対象となるサーバ、ルータなど&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;hostgroup: Webインターフェースでhostをグループ化して表示するためのもの&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;service: hostで動いているサービス。HTTP, SMTP, FTPなどのポートでLISTENしているサービスであったり、pingの応答性やディスクの空き容量などが該当する。ようは監視する対象となるもの。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;servicegroup: Webインターフェースでserviceをグループ化して表示するためのもの&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;contact: serviceに問題がある際の通知先の定義。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;contactgroup: 複数のcontactをグループ化したもの。serviceに問題がある場合、このcontactgroupで定義した連絡先に通知を送る。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;timeperiod: serviceの監視を行う時間帯や問題があった時に通知を送る時間帯の定義&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;command: サービスをチェックする時のコマンドの定義&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;servicedependencyとかserviceescalationは必要性が良くわかってないので使ってません。&lt;/p&gt;&#xA;&lt;h3 id=&#34;定義の継承&#34;&gt;定義の継承&lt;/h3&gt;&#xA;&lt;p&gt;監視対象のホストやサービスを定義するために&lt;/p&gt;&#xA;&lt;p&gt;define host {&lt;/p&gt;&#xA;&lt;p&gt;name hoge&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;p&gt;のように定義を書きますが、このhostやserviceの定義に必要な項目がけっこう多いです。そのためか、Nagiosでは「定義の継承」という仕組みがあって、テンプレート的に不完全な定義を作っておいてそれを継承する、ということができます。&lt;/p&gt;&#xA;&lt;p&gt;と書いてもわかりにくいので実際の例を書くと&lt;/p&gt;&#xA;&lt;p&gt;define host {&lt;/p&gt;&#xA;&lt;p&gt;name myserver&lt;/p&gt;&#xA;&lt;p&gt;notifications_enabled 1&lt;/p&gt;&#xA;&lt;p&gt;event_handler_enabled 1&lt;/p&gt;&#xA;&lt;p&gt;flap_detection_enabled 1&lt;/p&gt;&#xA;&lt;p&gt;process_perf_data 1&lt;/p&gt;&#xA;&lt;p&gt;retain_status_information 1&lt;/p&gt;&#xA;&lt;p&gt;retain_nonstatus_information 1&lt;/p&gt;&#xA;&lt;p&gt;check_command check-host-alive&lt;/p&gt;&#xA;&lt;p&gt;max_check_attempts 3&lt;/p&gt;&#xA;&lt;p&gt;notification_interval 20&lt;/p&gt;&#xA;&lt;p&gt;notification_period 24x7&lt;/p&gt;&#xA;&lt;p&gt;notification_options d,u,r&lt;/p&gt;&#xA;&lt;p&gt;contact_groups mycontact-group&lt;/p&gt;&#xA;&lt;p&gt;register 0 ; これが重要&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;p&gt;な感じで host の定義のテンプレートを作っておくと、実際の host の定義は以下のように簡潔なものになります。&lt;/p&gt;&#xA;&lt;p&gt;define host {&lt;/p&gt;&#xA;&lt;p&gt;use myserver ; use で使用するテンプレートを指定&lt;/p&gt;&#xA;&lt;p&gt;host_name localhost&lt;/p&gt;&#xA;&lt;p&gt;alias localhost&lt;/p&gt;&#xA;&lt;p&gt;address 127.0.0.1&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;p&gt;Nagiosの設定項目は多岐にわたるので、このような定義の継承の仕組みは、設定の記述を簡略化する目的では非常に便利です。&lt;/p&gt;&#xA;&lt;h3 id=&#34;設定ファイルの構造&#34;&gt;設定ファイルの構造&lt;/h3&gt;&#xA;&lt;p&gt;Nagiosが例えば /usr/local/nagios にインストールされている場合、設定ファイルはetc/nagios.cfg になります。下記のように cfg_dir=hogehoge.cfg という感じで、このファイルからさらに色々なファイルをインクルードしています。&lt;/p&gt;&#xA;&lt;p&gt;cfg_file=/usr/local/nagios/etc/objects/commands.cfg&lt;/p&gt;&#xA;&lt;p&gt;cfg_file=/usr/local/nagios/etc/objects/contacts.cfg&lt;/p&gt;&#xA;&lt;p&gt;cfg_file=/usr/local/nagios/etc/objects/timeperiods.cfg&lt;/p&gt;&#xA;&lt;p&gt;cfg_file=/usr/local/nagios/etc/objects/templates.cfg&lt;/p&gt;&#xA;&lt;p&gt;自分はデフォルトの設定ファイルを汚したくないので&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;objects/mycommands.cfg: 独自のcommandを定義しているファイル&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;myconfig.cfg: hostやserviceの定義のテンプレート+contactgroupの定義&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;hosts/localhost.cfg: localhostのhost, serviceの設定&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;という風にファイルを作ってこれらを nagios.cfg からインクルードしています。&lt;/p&gt;&#xA;&lt;h3 id=&#34;追加で定義しているコマンド&#34;&gt;追加で定義しているコマンド&lt;/h3&gt;&#xA;&lt;p&gt;httpsとmemcached(ポート11211)を監視するコマンドを自分用に追加しています。&lt;/p&gt;&#xA;&lt;p&gt;# &#39;check_https&#39; command definition&lt;/p&gt;&#xA;&lt;p&gt;define command {&lt;/p&gt;&#xA;&lt;p&gt;command_name check_https&lt;/p&gt;&#xA;&lt;p&gt;command_line $USER1$/check_http -I $HOSTADDRESS$ $ARG1$ -S&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;p&gt;# &#39;check_memcached&#39; command definition&lt;/p&gt;&#xA;&lt;p&gt;define command {&lt;/p&gt;&#xA;&lt;p&gt;command_name check_memcached&lt;/p&gt;&#xA;&lt;p&gt;command_line $USER1$/check_tcp -H $HOSTADDRESS$ -p 11211 -t 5&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;h3 id=&#34;まとめ&#34;&gt;まとめ&lt;/h3&gt;&#xA;&lt;p&gt;Nagiosは設定項目が複雑な分色々とカスタマイズできるので、あらゆる類のサービスの監視ができるでしょう。また、バージョンも3になって機能的にも非常に枯れたソフトウェアになっているので、割と安心して使えるものだなと感じました。&lt;/p&gt;&#xA;&lt;p&gt;[rakuten]book:14440026[/rakuten]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>MacBookをデュアルディスプレイ化</title>
				<link>https://journal.lampetty.net/posts/wp/279/</link>
				<pubDate>Sat, 07 Mar 2009 23:03:28 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/279/</guid>
				<description>&lt;p&gt;[tmkm-amazon]B001I91IF8[/tmkm-amazon]&lt;/p&gt;&#xA;&lt;p&gt;↑を使ってMacBookにデルの20インチのモニタを接続してみました。マウスカーソルをメインウィンドウの左側に持っていくと2つ目のディスプレイにカーソルが移動する、いわゆる「デュアルディスプレイ」環境になったのでこの点は満足なのですが、Spacesとシームレスに統合できないのがちょっと残念です。というのは、普段MacBookを使っている場合はSpacesの2番目の領域にiTunes、3番目の領域にVMware Fusion、というように切り替えているのですが、2番目の領域に2つ目のモニタを割り当てられれば、モニタを外している場合でも特にそれを意識する必要がない、ということです。&lt;/p&gt;&#xA;&lt;p&gt;とりあえず↓のようにSpaces開いてセカンドモニタに表示しておきたいアプリケーションを移動できることはわかったので、これでしのいでみようと思います。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/8250493@N05/3336674328/&#34; title=&#34;デュアルディスプレイ＋Spaces&#34;&gt;&lt;img src=&#34;http://static.flickr.com/3401/3336674328_00e2b3d5fa_m.jpg&#34; alt=&#34;デュアルディスプレイ＋Spaces&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>「Web担当者 現場のノウハウ SEOスペシャル 2009 冬号」を読みました</title>
				<link>https://journal.lampetty.net/posts/wp/278/</link>
				<pubDate>Tue, 03 Mar 2009 14:03:11 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/278/</guid>
				<description>&lt;p&gt;[tmkm-amazon]4844326503[/tmkm-amazon]&lt;/p&gt;&#xA;&lt;p&gt;発売されてから2ヶ月ぐらい経ってしまったのですが、ようやっと読み終わりました。雑誌ということで、普通の書籍より先端的な情報が入っていて非常に参考になる雑誌でした。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;バーティカル検索などの昨今の検索エンジンの状況&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;検索エンジンとユーザの消費活動の関係&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;SEOの基礎(リンク構造、titleやmetaタグ、URLの構造)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;キーワードの選び方&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;専門家による検索結果順位決定の要因分析&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;などなど。個人的に「へぇ」と思ったのは、meta keywordsタグでのキーワードの使用はもはや検索結果の順位にはもはや影響ないとか、meta descriptionタグでのキーワードの使用も順位にはあまり関係ないとかそのあたりでした。この2つってわりとSEOの中では常套手段的なものだと思っていたのですが、小手先のテクニックでできることなのであまり意味がないのですね。&lt;/p&gt;&#xA;&lt;p&gt;最近SEOをかじっていて思うことは、「検索してやってくる人のことを考えてページを作るべし」ということでした。至極当たり前のことですが、ユーザがどういうキーワードでランディングして、どのような動きをしてサイトを離れていくかを徹底的に分析することで1セッションあたりのPVにも大きく影響が出たりしますし、その結果として検索結果の順位もよくなっていくのかなと。meta descriptionが検索結果には影響がないと言っても、ここにキーワードを入れておくと検索結果一覧でキーワードがハイライトされるので、結果的にユーザは「おっ」と思ってクリックしてくれたりするわけです。&lt;/p&gt;&#xA;&lt;p&gt;なので、やっぱりユーザビリティを考えれば自然とSEO効果っていうのは出てくるんじゃないかなぁと思っています。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Redmine 0.8.1をPhusion Passengerで動かす</title>
				<link>https://journal.lampetty.net/posts/wp/276/</link>
				<pubDate>Thu, 19 Feb 2009 15:02:19 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/276/</guid>
				<description>&lt;h3 id=&#34;はじめに---phusion-passengerとは&#34;&gt;はじめに - Phusion Passengerとは&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://journal.lampetty.net/tech/index.php/archives/266&#34;&gt;Redmine 0.8.0をインストール&lt;/a&gt;の記事を書いた直後に0.8.1がリリースされていたので、アップデートがてら&lt;a href=&#34;http://www.modrails.com/&#34;&gt;Phusion Passenger&lt;/a&gt;を使ってApacheでRemineを動かしてみたいと思います。Phusion Passengerとは、別名mod_railsとも呼ばれるApacheモジュールとして実装されたRailsの実行環境で、インストールや設定が簡単なのが特徴です。&lt;/p&gt;&#xA;&lt;h3 id=&#34;phusion-passengerのインストール&#34;&gt;Phusion Passengerのインストール&lt;/h3&gt;&#xA;&lt;p&gt;まずは passenger をビルドするために Apache の apxs などをインストールしておきます。例によって環境は Ubuntu 8.10 です。&lt;/p&gt;&#xA;&lt;p&gt;$ su -&lt;/p&gt;&#xA;&lt;p&gt;# aptitude install apache2-dev ruby1.8-dev&lt;/p&gt;&#xA;&lt;p&gt;# export APXS2=/usr/bin/apxs2&lt;/p&gt;&#xA;&lt;p&gt;終わったらpassengerのインストールです。といっても以下のコマンドを実行するだけですが。&lt;/p&gt;&#xA;&lt;p&gt;# gem install passenger&lt;/p&gt;&#xA;&lt;p&gt;# passenger-install-apache2-module&lt;/p&gt;&#xA;&lt;p&gt;インストールが完了すると下記のように Apache の httpd.conf に書き込む設定内容が表示されるので、これを /etc/apache2/sites-available/default にコピペします。&lt;/p&gt;&#xA;&lt;p&gt;LoadModule passenger_module /usr/lib/ruby/gems/1.8/gems/passenger-2.0.6/ext/apache2/mod_passenger.so&lt;/p&gt;&#xA;&lt;p&gt;PassengerRoot /usr/lib/ruby/gems/1.8/gems/passenger-2.0.6&lt;/p&gt;&#xA;&lt;p&gt;RailsRuby /usr/bin/ruby1.8&lt;/p&gt;&#xA;&lt;p&gt;あとは DocumentRoot を Redmine のインストールディレクトリ下の public に設定します。&lt;/p&gt;&#xA;&lt;p&gt;Redmineが/var/www/redmineにインストールされている場合は&lt;/p&gt;&#xA;&lt;p&gt;DocumentRoot /var/www/redmine/public&lt;/p&gt;&#xA;&lt;p&gt;と設定します。なお、DocumentRoot を /var/www に設定しておき、&lt;a href=&#34;http://localhost/redmine/&#34;&gt;http://localhost/redmine/&lt;/a&gt; のように Redmine をサブディレクトリとして扱いたい場合は以下のようにRedmine のインストールディレクトリにシンボリックリンクを張ります。&lt;/p&gt;&#xA;&lt;p&gt;# ln -s $REDMINE_ROOT/public /var/www/redmine&lt;/p&gt;&#xA;&lt;p&gt;そして Apache の設定ファイルに&lt;/p&gt;&#xA;&lt;p&gt;RailsBaseURI /redmine&lt;/p&gt;&#xA;&lt;p&gt;を追加します。これで /redmine/ のURLでアクセスできるようになります。&lt;/p&gt;&#xA;&lt;p&gt;というわけで設定が終わったら Apache を起動してみましょう。&lt;/p&gt;&#xA;&lt;p&gt;# /etc/init.d/apache2 restart&lt;/p&gt;&#xA;&lt;p&gt;今回は http://ホスト名/redmine/ でアクセスしてみます。どうでしょう？RedmineのTOPページが表示されたでしょうか？404や403エラーになる場合、Apacheのエラーログが /var/log/apache2/error.log にあるので、これを見てみると原因が分かるかもしれません。&lt;/p&gt;&#xA;&lt;p&gt;Passengerの詳細な設定項目については&lt;a href=&#34;http://www.modrails.com/documentation/Users%20guide.html&#34;&gt;Phusion Passenger users guide&lt;/a&gt;に詳しく書いてあるので一読してみると良いと思います。&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]4798021377[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Apache &#43; mod_fcgid &#43; tDiaryでrubyプロセスが残りっぱなし</title>
				<link>https://journal.lampetty.net/posts/wp/275/</link>
				<pubDate>Mon, 16 Feb 2009 12:02:36 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/275/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;http://diary.lampetty.net/&#34;&gt;古いおいぬま日報(不定期)&lt;/a&gt;のtDiaryなのですが、Ubuntu 8.10にしてからどうも調子が悪くて悩んでいます(*1)。というのは、tDiaryをapacheのmod_fcgid で動かしているのですが、CPU使用率100%近くなっているFastCGIのrubyプロセスがずっと残りっぱなしになっているようなのです。おかげで無駄にCPUリソースを食って非エコ状態になっています。&lt;/p&gt;&#xA;&lt;p&gt;*1) 環境はUbuntu 8.10 + Apache 2.2.11 + mod_fcgid 2.2 + tDiary 2.2.0&lt;/p&gt;&#xA;&lt;p&gt;apacheのエラーログには&lt;/p&gt;&#xA;&lt;p&gt;[Mon Feb 16 20:17:26 2009] [notice] mod_fcgid: process /home/kazuhiro/www/diary/htdocs/index.fcgi(30333) exit(communication error), get stop signal 9&lt;/p&gt;&#xA;&lt;p&gt;と何やらあやしげなログが出ているのですが、なぜ communication errorになるのかさっぱりわかりません。&lt;/p&gt;&#xA;&lt;p&gt;該当プロセスをkillすればCPUリソース使い過ぎな状態は回避できるので、10分以上経ったrubyプロセスを強制的にkillするスクリプトをでっち上げてcronで動かすように。&lt;/p&gt;&#xA;&lt;p&gt;#!/usr/local/bin/perl&lt;/p&gt;&#xA;&lt;p&gt;# $ sudo aptitude install libproc-processtable-perl&lt;/p&gt;&#xA;&lt;p&gt;use strict;&lt;/p&gt;&#xA;&lt;p&gt;use Proc::ProcessTable;&lt;/p&gt;&#xA;&lt;p&gt;my $pt = Proc::ProcessTable-&amp;gt;new(&#39;cache_ttys&#39; =&amp;gt; 1);&lt;/p&gt;&#xA;&lt;p&gt;for my $p (@{ $pt-&amp;gt;table }) {&lt;/p&gt;&#xA;&lt;p&gt;if ($p-&amp;gt;cmndline =~ /^ruby.+index.fcgi/) {&lt;/p&gt;&#xA;&lt;p&gt;my $elapsed = time() - $p-&amp;gt;start;&lt;/p&gt;&#xA;&lt;p&gt;if ($elapsed &amp;gt; 60 * 10) {&lt;/p&gt;&#xA;&lt;p&gt;$p-&amp;gt;kill(9);&lt;/p&gt;&#xA;&lt;p&gt;print sprintf &amp;quot;%s (%s) killed!n&amp;quot;, $p-&amp;gt;pid, $p-&amp;gt;fname;&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;p&gt;mod_fcgidじゃなくてmod_fastcgiにすれば改善しそうな気もしますが、もうちょっと切羽詰まってから試してみようと思います。それにして&lt;a href=&#34;http://search.cpan.org/dist/Proc-ProcessTable/ProcessTable.pm&#34;&gt;Proc::ProcessTableモジュール&lt;/a&gt;は便利でした。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>検索エンジンに正規のURLを教えるcanonical属性</title>
				<link>https://journal.lampetty.net/posts/wp/271/</link>
				<pubDate>Sat, 14 Feb 2009 05:02:54 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/271/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;http://www.sem-r.com/09/20090213153711.html&#34; title=&#34;検索エンジン3社、正しいサイトURLを認識させるcanonical属性を導入（URLの正規化） :: SEM R&#34;&gt;検索エンジン3社、正しいサイトURLを認識させるcanonical属性を導入（URLの正規化） :: SEM R&lt;/a&gt;で取り上げられていますが、効果測定などのために「同じコンテンツを返すけど異なるURLを持つページ」で「正規のURLはこれだよ」と検索エンジンに伝えるcanonical属性のサポートがGoogle, Yahoo, Microsoftで始まったようです。&lt;/p&gt;&#xA;&lt;p&gt;具体的には&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.example.com/?ref=rss&#34;&gt;http://www.example.com/?ref=rss&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.example.com/?ref=adwords&#34;&gt;http://www.example.com/?ref=adwords&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;のように、/ のページに複数のURLがある場合に&lt;/p&gt;&#xA;&lt;p&gt;というタグをタグ内に指定すると / を正規のURLとして扱ってくれるようにヒントを与えられる、ということです。なお、これはあくまでヒントであり、実際にどのURLが正規のものかは検索エンジンが最終的に判断するようです。&lt;/p&gt;&#xA;&lt;p&gt;アクセス経路を判断するために、上のような方法でクエリ文字列にパラメータを指定しているようなサイトには非常に有用なのではないでしょうか。&lt;/p&gt;&#xA;&lt;p&gt;個人的に気になったのは日本のモバイル版の検索エンジンもこの対応をしてくれるのかなということです。モバイルサイトの場合&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.example.com/?session_id=xyz&#34;&gt;http://www.example.com/?session_id=xyz&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;のようにセッションIDをURLにつけている場合が多いので、むしろモバイルサイトの方が有効利用されそうなんじゃないかと思いました。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>YUI Compressorを使ってWordPressのjsファイルを圧縮する</title>
				<link>https://journal.lampetty.net/posts/wp/270/</link>
				<pubDate>Thu, 12 Feb 2009 15:02:59 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/270/</guid>
				<description>&lt;p&gt;Webサイト高速化の手法の一つとして、Steve Souders さんが唱えている&amp;quot;&lt;a href=&#34;http://developer.yahoo.com/performance/rules.html#minify&#34;&gt;Minify JavaScript and CSS&lt;/a&gt;&amp;quot; (JavaScriptとCSSを圧縮せよ) というのがあります。若干今更感がありますが、ちょっとでも高速化するために、このブログで使用しているiNoveテーマのJSファイルを&lt;a href=&#34;http://developer.yahoo.com/yui/compressor/&#34;&gt;YUI Compressor&lt;/a&gt;を使って圧縮してみました。&lt;/p&gt;&#xA;&lt;h3 id=&#34;yui-compressorのインストール&#34;&gt;YUI Compressorのインストール&lt;/h3&gt;&#xA;&lt;p&gt;例によってUbuntu 8.10な環境ですが、YUI CompressorはJava製なのでJDK 6.0を入れます。&lt;/p&gt;&#xA;&lt;p&gt;$ sudo aptitude install sun-java6-jdk&lt;/p&gt;&#xA;&lt;p&gt;終わったらYUI Compressorをダウンロードして解凍します(以後、解凍してできたディレクトリを$YUI_ROOTとします)。&lt;/p&gt;&#xA;&lt;h3 id=&#34;wordpressのinoveテーマで使っているjavascriptファイルを圧縮&#34;&gt;WordPressのiNoveテーマで使っているJavaScriptファイルを圧縮&lt;/h3&gt;&#xA;&lt;p&gt;試しにこのブログで使用しているテーマiNoveのJavaScriptをYUI Compressorを使って圧縮してみます。&lt;/p&gt;&#xA;&lt;p&gt;$ cd ~/tech/wp-content/themes/inove/js/&lt;/p&gt;&#xA;&lt;p&gt;$ java -jar $YUI_ROOT/build/yuicompressor-2.4.2.jar menu.js &amp;gt; menu.js.new&lt;/p&gt;&#xA;&lt;p&gt;結果は標準出力に書き出されるので、適当に別ファイルにでもリダイレクトします(-o でもOK)。出来上がったファイルのサイズを見てみると、下記のように5.8KBのファイルが4.0KBに減っているのがわかります。(約68%になりました)&lt;/p&gt;&#xA;&lt;p&gt;$ ls -lh menu.js*&lt;/p&gt;&#xA;&lt;p&gt;-rw-r--r-- 1 kazuhiro kazuhiro 5.8K 2009-02-13 00:21 menu.js&lt;/p&gt;&#xA;&lt;p&gt;-rw-rw-r-- 1 kazuhiro kazuhiro 4.0K 2009-02-13 00:23 menu.js.new&lt;/p&gt;&#xA;&lt;p&gt;こうやってどんどんファイルを小さくしていけば、クライアントの.jsファイルの取得が速くなるのでサイトの高速化が見込めます。どのぐらい速くなるかはクライアントの海鮮速度に大きく依存するので一概には言えませんが、ガンガン圧縮して試してみると良いと思います。&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]487311361X[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Firefoxで覚えておくと便利なショートカット</title>
				<link>https://journal.lampetty.net/posts/wp/268/</link>
				<pubDate>Wed, 11 Feb 2009 09:02:57 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/268/</guid>
				<description>&lt;p&gt;ただの自分用のメモですが。本家のショートカットのページで全部網羅されてます。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Ctrl + T : 空のタブを開く&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Ctrl + Tab : タブを移動&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Ctrl + Shift + T : 最後に閉じたタブを復活(Tab Mix Plusを入れている場合)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Ctrl + W : タブを閉じる&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Ctrl + F : ページ検索&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Ctrl + U : ページのソースを開く&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Ctrl + I : ページ情報を開く&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Ctrl + L : ロケーションバーを選択&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Ctrl + K : 右上のWeb検索にカーソルを移動&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Ctrl + J : ダウンロードマネージャーを表示&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Ctrl + Shift + K : Firebugを表示(Firebugを入れている場合のみ)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Ctrl + Shift + L : Live HTTP Headersをサイドバーに表示(Live HTTP Headersを入れている場合のみ)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>iTunesで再生中の曲の歌詞をダウンロードできるLyrics Master</title>
				<link>https://journal.lampetty.net/posts/wp/267/</link>
				<pubDate>Wed, 11 Feb 2009 08:02:18 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/267/</guid>
				<description>&lt;p&gt;iTunesと連携して現在再生中の曲の歌詞をダウンロードして表示するソフト&lt;a href=&#34;http://www.kenichimaehashi.com/lyricsmaster/&#34;&gt;Lyrics Master&lt;/a&gt;というものを見つけました。ダウンロードしてきた歌詞をiTunes, iPodに保存することもできます。完全に自動的にiTunesに歌詞のデータを保存するのは難しいっぽいですが、これだけでも十分素晴らしいです。これでデジタル音楽ライフがまた少し盛り上がりそう。&lt;/p&gt;&#xA;&lt;p&gt;しかもよく見たらMacだけでなくWindows版もありました。今までしらなかったことが悔やまれます...&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Redmine 0.8.0をインストール</title>
				<link>https://journal.lampetty.net/posts/wp/266/</link>
				<pubDate>Wed, 11 Feb 2009 05:02:39 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/266/</guid>
				<description>&lt;p&gt;「使ってみないとその善し悪しはわかりません」ということで、プロジェクト管理ツールである&lt;a href=&#34;http://www.redmine.org/&#34;&gt;Redmine&lt;/a&gt;をインストールしてみました。&lt;a href=&#34;http://www.redmine.org/wiki/redmine/RedmineInstall&#34;&gt;Installing Redmine&lt;/a&gt;通りにやっても微妙にうまくいかなかったので備忘録がてらメモを残しておきます。環境はUbuntu 8.10 + MySQL 5.0.67です。&lt;/p&gt;&#xA;&lt;h3 id=&#34;事前準備&#34;&gt;事前準備&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Ruby 1.8.6 - 今回はUbuntu の 1.8.7 (2008-08-11 patchlevel 72) を使いました&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;RubyGems 1.3.1&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Rake 0.8.3&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;openssl&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;RMagick&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;が必要です。まずは&lt;a href=&#34;http://rubyforge.org/projects/rubygems/&#34;&gt;RubyGems&lt;/a&gt;をダウンロードして解凍してインストールしましょう。&lt;/p&gt;&#xA;&lt;p&gt;$ sudo ruby setup.rb&lt;/p&gt;&#xA;&lt;p&gt;これがおわったらgemsでRakeをインストールします。&lt;/p&gt;&#xA;&lt;p&gt;$ sudo gem install rake&lt;/p&gt;&#xA;&lt;p&gt;あとは openssl と rmagickです。&lt;/p&gt;&#xA;&lt;p&gt;$ sudo aptitude install libopenssl-ruby librmagick-ruby&lt;/p&gt;&#xA;&lt;p&gt;これで準備完了です！&lt;/p&gt;&#xA;&lt;h3 id=&#34;redmineのインストール&#34;&gt;Redmineのインストール&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://rubyforge.org/frs/?group_id=1850&#34;&gt;RubyForge&lt;/a&gt;から0.8.0をダウンロードして解凍します(できたディレクトリを便宜上 $REDMINE_ROOT とします)。そして空のデータベースを作成しておきます。本家のドキュメントではproductionのDBしか作ってないですが、development, testも作っておくとよいでしょう。&lt;/p&gt;&#xA;&lt;p&gt;mysql&amp;gt; create database redmine character set utf8;&lt;/p&gt;&#xA;&lt;p&gt;mysql&amp;gt; create database redmine_development character set utf8;&lt;/p&gt;&#xA;&lt;p&gt;mysql&amp;gt; create database redmine_test character set utf8;&lt;/p&gt;&#xA;&lt;p&gt;DBを作成したら $REDMINE_ROOT/config/database.yml.example を database.yml としてコピーし、以下のように編集します。&lt;/p&gt;&#xA;&lt;p&gt;--- config/database.yml.example 2008-12-30 19:09:27.000000000 +0900&lt;/p&gt;&#xA;&lt;p&gt;+++ config/database.yml 2009-02-11 12:13:15.000000000 +0900&lt;/p&gt;&#xA;&lt;p&gt;@@ -10,25 +10,28 @@&lt;/p&gt;&#xA;&lt;p&gt;adapter: mysql&lt;/p&gt;&#xA;&lt;p&gt;database: redmine&lt;/p&gt;&#xA;&lt;p&gt;host: localhost&lt;/p&gt;&#xA;&lt;p&gt;encoding: utf8&lt;/p&gt;&#xA;&lt;p&gt;+ socket: /var/run/mysqld/mysqld.sock&lt;/p&gt;&#xA;&lt;p&gt;development:&lt;/p&gt;&#xA;&lt;p&gt;adapter: mysql&lt;/p&gt;&#xA;&lt;p&gt;database: redmine_development&lt;/p&gt;&#xA;&lt;p&gt;host: localhost&lt;/p&gt;&#xA;&lt;p&gt;encoding: utf8&lt;/p&gt;&#xA;&lt;p&gt;+ socket: /var/run/mysqld/mysqld.sock&lt;/p&gt;&#xA;&lt;p&gt;test:&lt;/p&gt;&#xA;&lt;p&gt;adapter: mysql&lt;/p&gt;&#xA;&lt;p&gt;database: redmine_test&lt;/p&gt;&#xA;&lt;p&gt;host: localhost&lt;/p&gt;&#xA;&lt;p&gt;encoding: utf8&lt;/p&gt;&#xA;&lt;p&gt;+ socket: /var/run/mysqld/mysqld.sock&lt;/p&gt;&#xA;&lt;p&gt;test_pgsql:&lt;/p&gt;&#xA;&lt;p&gt;adapter: postgresql&lt;/p&gt;&#xA;&lt;p&gt;socket: /var/run/mysqld/mysqld.sock を足しているのは、何も設定しないと rails が/tmp/mysql.sock を参照するようになっていて、UbuntuのMySQLの設定とかみ合っていないからです。また、このsocketのパスは人によってはカスタマイズしているかもしれないので、うまくいかない場合は /etc/mysql/my.cnf を参照し、そこで指定しているパスと同じものを指定するようにしてください。また、username/password もデフォルトから変えている場合は、それも合わせて database.yml に変更を加えてください。&lt;/p&gt;&#xA;&lt;p&gt;次にデータベースの初期設定を行ないます。本家のドキュメントによると RAILS_ENV=&amp;quot;production&amp;quot; を指定するようになっていますが、今回はお試しなので development でやってみます。&lt;/p&gt;&#xA;&lt;p&gt;$ rake db:migrate RAILS_ENV=&amp;quot;development&amp;quot;&lt;/p&gt;&#xA;&lt;p&gt;終わったら $REDMINE_ROOT/tmp/{files,log,tmp} ディレクトリのパーミッションを変更します。&lt;/p&gt;&#xA;&lt;p&gt;$ sudo chmod -R 777 files log tmp&lt;/p&gt;&#xA;&lt;p&gt;今回は説明を簡素化するために端折ってますが、本来なら 777 の設定はよろしくないので、真面目にやるのであれば Webサーバを実行するユーザがこれらのディレクトリを所有するように chown するのがよいでしょう。&lt;/p&gt;&#xA;&lt;p&gt;あとはfcgiスクリプトをコピーして、サーバを起動します。&lt;/p&gt;&#xA;&lt;p&gt;$ cp public/dispatch.fcgi.example public/dispatch.fcgi&lt;/p&gt;&#xA;&lt;p&gt;$ ruby script/server&lt;/p&gt;&#xA;&lt;p&gt;問題なくサーバが起動したら http://サーバ名:3000/ にアクセスしてみましょう。下記のような画面が表示されればインストール完了です。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/8250493@N05/3271364480/&#34; title=&#34;Redmine起動直後の画面&#34;&gt;&lt;img src=&#34;http://static.flickr.com/3453/3271364480_d0e3d0e146_m.jpg&#34; alt=&#34;Redmine起動直後の画面&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;使ってみた感想&#34;&gt;使ってみた感想&lt;/h3&gt;&#xA;&lt;p&gt;さっくり30分ぐらい使ってみた感想としては&lt;strong&gt;インターフェースが簡素&lt;/strong&gt;ということでしょうか。すごく質素なページしか表示されないので、最初何をやればいいのかよくわかりませんでした。チケットの新規発行はトラッカーは設定してないと使えなかったりとか、真面目にドキュメントを読まないとわからなかったりするので、もう少し初心者向けのチュートリアルがRedmine自体に組み込んであると良いのかなと思いました。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>モバイルサイトのアクセス解析をGoogle Analyticsで行なうことについて</title>
				<link>https://journal.lampetty.net/posts/wp/265/</link>
				<pubDate>Wed, 11 Feb 2009 02:02:42 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/265/</guid>
				<description>&lt;p&gt;selene.GA4Kを入れてこのブログのモバイル版にもアクセス解析のコードをいれていたのですが、実際にやってみて思ったのは&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;そもそもPCサイトとモバイルサイトではUIやリンク構造が全く違うので、直帰率とか1セッションあたりのPV数などごちゃ混ぜになってしまってデータがおかしくなってしまう&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;selene.GA4Kはバグが多いし、フォーラムでの解答状況を見る限りサポートが手薄である。(この状態で商用利用では金取ろうってのがすごい)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;ということでした。なのでGA4Kやめて&lt;a href=&#34;http://myrt.auriq.com/mobile/jp/&#34; title=&#34;myRTモバイル&#34;&gt;myRTモバイル&lt;/a&gt;を使ってみようと思います。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>「アクセス解析 徹底活用術 ~ネットで売上を増やす!~」を読みました</title>
				<link>https://journal.lampetty.net/posts/wp/264/</link>
				<pubDate>Mon, 09 Feb 2009 17:02:38 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/264/</guid>
				<description>&lt;p&gt;[tmkm-amazon]4839926018[/tmkm-amazon]&lt;/p&gt;&#xA;&lt;p&gt;仕事でサイトの運営をやっているのですが、こういうアクセス解析の教科書的な本を真面目に読んだことがなかったので買いました。&lt;/p&gt;&#xA;&lt;p&gt;構成としては&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;アクセスログ解析の必要性&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;アクセスログ解析でわかること&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;アクセスログ解析の仕組みとツールの比較&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;ツール選定のための指標&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;アクセスログ解析の活用事例 - BtoBサイト&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;アクセスログ解析の活用事例 - BtoCサイト&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;付録&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;となっています。アクセスログ解析は仕事でもこのブログでも行っているので、その必要性や測定できる数値などはすでにわかっていましたが、それをどう応用していくかが書かれている活用事例の部分が参考になりました。&lt;/p&gt;&#xA;&lt;p&gt;とくにBtoBの場合は「まずは問い合わせを増やす」をゴールにしたアクセスログ解析の活用事例がわかりやすく説明されていてよかったです。また、コンバージョンしたユーザの行動履歴から成功パターンを見いだしたり、逆に離脱した人から問題点を把握することは、アクセスログからサイトの構造やユーザビリティを改善する上では必須の作業なのだということを改めて思い知らされました。&lt;/p&gt;&#xA;&lt;p&gt;また、特定の行動履歴を持つ人にだけ自動でバナーを出したりするようなアクセスログ解析ツールもあるようで、今の時代はアクセスログ解析＋αな製品もあるようです。実際使えるのかはわかりませんが、これはすごいと思いました。&lt;/p&gt;&#xA;&lt;p&gt;そして最後についている付録には、「コンバージョン」「直帰率」などアクセス解析する上で知っておかなければならない単語の意味がずらずらっと書いてあって参考になります。&lt;/p&gt;&#xA;&lt;p&gt;アクセスログ解析というのは、本来であれば非常に難解なテーマだと思うのですが、この本を読んでいて「難しい」と感じたことは一度もありませんでした。1600円というお手頃な値段なのでサイト運営に携わっている人にはぜひお奨めしたい本の一つです。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>「入門Redmine Linux/Windows対応」を読みました</title>
				<link>https://journal.lampetty.net/posts/wp/262/</link>
				<pubDate>Sun, 08 Feb 2009 03:02:50 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/262/</guid>
				<description>&lt;p&gt;[tmkm-amazon]4798021377[/tmkm-amazon]&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.redmine.org/&#34; title=&#34;Redmine&#34;&gt;Redmine&lt;/a&gt;がソフトウェアの開発管理を行う上で気になっていたので買って読んでみました。読み終わって思ったのは**これ、便利そう！**ということ。似ているソフトウェアとしては&lt;a href=&#34;http://trac.edgewall.org/&#34;&gt;Trac&lt;/a&gt;というものがありますが、Redmineが優れている点として&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;SubversionなどのSCMの対応状況。Git, Mercurial, Bazaar, CVSにも対応している。TracはSubversionのみ プラグインを入れることでTracでもこれらのSCMに対応できるようです。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;チケットの開始日・期限日・進捗率のデータからプロジェクトのガントチャートが自動で作れる。→これもTracでは&lt;a href=&#34;http://tidus.ultimania.org/diary/?date=20071020#p01&#34;&gt;プラグイン&lt;/a&gt;で実現できるようです。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;というところでしょうか。個人的にこの手のソフトウェアに期待するのはチケット(BTS)のカスタマイズ製ですね。自分たちの業務フローにマッチさせることができるのかどうか。あとTracでは&lt;a href=&#34;http://trac-hacks.org/wiki/PeerReviewPlugin&#34;&gt;ソースコードレビューのためのプラグイン&lt;/a&gt;があるようなのですが、Redmineにはなさそうです。&lt;/p&gt;&#xA;&lt;p&gt;で、この本自体はそんなRedmineの導入から使い方までを懇切丁寧に教えてくれる本です。この本を読んでいれば「試しに使ってみる」ことの敷居は非常に下がりますし、「機能とか調べるのにいちいち試してらんねーよ」という人にもお奨めな本だと思います。&lt;/p&gt;&#xA;&lt;p&gt;2009/2/9：gitなどのSCMの対応やガントチャートの表示はTracでもプラグインを利用すれば実現可能なようです。その辺りの文章を修正しました。コードレビューのプラグインもあることを考えれば俄然Tracの方が良さそうな気がしてきました。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>GA4Kでクローラーのアクセスを除外するパッチ</title>
				<link>https://journal.lampetty.net/posts/wp/260/</link>
				<pubDate>Sat, 07 Feb 2009 13:02:04 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/260/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;http://tech.lampetty.net/tech/index.php/archives/252&#34; title=&#34;Google Analyticsを携帯サイトで利用するためのGA4Kにバグ？&#34;&gt;Google Analyticsを携帯サイトで利用するためのGA4Kにバグ？&lt;/a&gt;と書きましたが、ちゃんと検索エンジンのクローラーのアクセスを除外するようなパッチを書いてみました。マニュアルには「クローラからのアクセスを無視するための設定手順」というのがあるのですが、クローラーはUserAgentを携帯端末のように詐称してくるので、これが機能してないように思います。&lt;/p&gt;&#xA;&lt;p&gt;diff -Naru selene_ga4k.orig/GoogleAnalytics/Config/analytics_config.php selene_ga4k/GoogleAnalytics/Config/analytics_config.php&lt;/p&gt;&#xA;&lt;p&gt;--- selene_ga4k.orig/GoogleAnalytics/Config/analytics_config.php 2009-01-05 10:59:41.000000000 +0900&lt;/p&gt;&#xA;&lt;p&gt;+++ selene_ga4k/GoogleAnalytics/Config/analytics_config.php 2009-02-07 22:02:41.000000000 +0900&lt;/p&gt;&#xA;&lt;p&gt;@@ -29,7 +29,7 @@&lt;/p&gt;&#xA;&lt;p&gt;define(&#39;USER_AGENT_PATTERN_SOFTBANK&#39;, &#39;^SoftBank|^J-PHONE|^Vodafone|^MOT-&#39;);&lt;/p&gt;&#xA;&lt;p&gt;define(&#39;USER_AGENT_PATTERN_AU&#39;, &#39;^KDDI-|^UP.Browser&#39;);&lt;/p&gt;&#xA;&lt;h2 id=&#34;defineuser_agent_pattern_willcom-mozilla301f-f6037609-ddipocketwillcom&#34;&gt;define(&#39;USER_AGENT_PATTERN_WILLCOM&#39;, &#39;^Mozilla/3.0[*1](#f-f6037609 &amp;quot;?:DDIPOCKET|WILLCOM);&#39;);&lt;/h2&gt;&#xA;&lt;p&gt;+define(&#39;USER_AGENT_PATTERN_CRAWLER&#39;, &#39;Y!J-SRD|Y!J-MBS|Googlebot-Mobile&#39;);&#xA;//=================================================================================&#xA;//各種設定&#xA;diff -Naru selene_ga4k.orig/GoogleAnalytics/Service/analytics.php selene_ga4k/GoogleAnalytics/Service/analytics.php&#xA;--- selene_ga4k.orig/GoogleAnalytics/Service/analytics.php 2009-01-05 10:59:34.000000000 +0900&#xA;+++ selene_ga4k/GoogleAnalytics/Service/analytics.php 2009-02-07 22:01:38.000000000 +0900&#xA;@@ -81,7 +81,10 @@&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;@return boolean&#xA;*/&#xA;function isMobile($user_agent){&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;if(eregi(USER_AGENT_PATTERN_CRAWLER, $user_agent&amp;quot;){&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;+ return false;&lt;/p&gt;&#xA;&lt;p&gt;+ }&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;$mobile_flg = false;&lt;/p&gt;&#xA;&lt;p&gt;if(eregi(USER_AGENT_PATTERN_DOCOMO, $user_agent)){&lt;/p&gt;&#xA;&lt;p&gt;とりあえずこのサイトで動かしているので、様子見て問題なさそうだったらバグレポートしようと思います。 &lt;a href=&#34;http://eos.exbridge.jp/boards/21/topics/show/671&#34;&gt;バグレポート&lt;/a&gt;しました。&lt;/p&gt;&#xA;&lt;p&gt;2009/2/17追記：&lt;a href=&#34;http://eos.exbridge.jp/news/show/17&#34;&gt;http://eos.exbridge.jp/news/show/17&lt;/a&gt; の1.1.1でこの問題は修正されているようです。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;#fn-f6037609&#34;&gt;*1&lt;/a&gt;:?:DDIPOCKET|WILLCOM);&#39;);&lt;/p&gt;&#xA;&lt;p&gt;-&lt;/p&gt;&#xA;&lt;p&gt;+define(&#39;USER_AGENT_PATTERN_CRAWLER&#39;, &#39;Y!J-SRD|Y!J-MBS|Googlebot-Mobile&#39;);&lt;/p&gt;&#xA;&lt;p&gt;//=================================================================================&lt;/p&gt;&#xA;&lt;p&gt;//各種設定&lt;/p&gt;&#xA;&lt;p&gt;diff -Naru selene_ga4k.orig/GoogleAnalytics/Service/analytics.php selene_ga4k/GoogleAnalytics/Service/analytics.php&lt;/p&gt;&#xA;&lt;p&gt;--- selene_ga4k.orig/GoogleAnalytics/Service/analytics.php 2009-01-05 10:59:34.000000000 +0900&lt;/p&gt;&#xA;&lt;p&gt;+++ selene_ga4k/GoogleAnalytics/Service/analytics.php 2009-02-07 22:01:38.000000000 +0900&lt;/p&gt;&#xA;&lt;p&gt;@@ -81,7 +81,10 @@&lt;/p&gt;&#xA;&lt;p&gt;* @return boolean&lt;/p&gt;&#xA;&lt;p&gt;*/&lt;/p&gt;&#xA;&lt;p&gt;function isMobile($user_agent){&lt;/p&gt;&#xA;&lt;p&gt;-&lt;/p&gt;&#xA;&lt;p&gt;+ if(eregi(USER_AGENT_PATTERN_CRAWLER, $user_agent&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>「できる100ワザ SEO &amp; SEM」読みました</title>
				<link>https://journal.lampetty.net/posts/wp/258/</link>
				<pubDate>Sat, 07 Feb 2009 04:02:41 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/258/</guid>
				<description>&lt;p&gt;[tmkm-amazon]4844323024[/tmkm-amazon]&lt;/p&gt;&#xA;&lt;p&gt;SEOの基本中の基本を理解したかったので買いました。&lt;/p&gt;&#xA;&lt;p&gt;まずは検索エンジンで「実際に検索されているキーワード」を見極めてそれをHTMLに落とし込んでいくやり方が書いてあります。初版が2006年なので最新の情報はカバーされていませんが、Google Analyticsによるアクセス解析の方法（のさわり）まで盛り込まれています。&lt;/p&gt;&#xA;&lt;p&gt;ただ、ちょっと気になったのは実際にHTMLを作成するツールに「ホームページビルダー」を使っていたこと。このソフトは不要なタグをいっぱい吐いてくれるので、検索エンジンが好むシンプルなマークアップにはならないんじゃないかと...この本の趣旨はホームページ制作ではなくSEOとSEMの説明なのであまり関係ないと思いますが。&lt;/p&gt;&#xA;&lt;p&gt;なお、SEMの部分は商用サイトを運用しているわけではないので読んでいません。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>WP-Syntaxをインストールしてソースコードをカラー表示</title>
				<link>https://journal.lampetty.net/posts/wp/255/</link>
				<pubDate>Fri, 06 Feb 2009 15:02:12 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/255/</guid>
				<description>&lt;p&gt;WordPressでのデフォルトのソースコードの表示がいまいち気に入らなかったので、これを綺麗にカラー表示してくれるプラグイン&lt;a href=&#34;http://wordpress.org/extend/plugins/wp-syntax/&#34;&gt;WP-Syntaxプラグイン&lt;/a&gt;をインストールしました。&lt;/p&gt;&#xA;&lt;p&gt;で、このプラグインの良い点4つほど。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;対応している言語が非常に多い。C〜Ocamlまで対応している&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&amp;lt;&amp;gt;などのタグのエスケープが必要ない&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;ソースが本文領域からはみ出す場合、横スクロールバーを出してくれる(iNoveはデフォルトではこれを出してくれず表示されなくなってしまう)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;pre lang=&#34;perl&#34;&gt; とするだけなのでお手軽&#xA;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;ただ、これはiNoveテーマの問題かもしれないのですが、&lt;pre lang=&#34;...&#34;&gt;で囲むと文字サイズが12pxに固定されるという問題があったので、wp-content/themes/inove/wp-syntax.css を以下のように修正しました。&lt;/p&gt;&#xA;&lt;p&gt;Index: wp-syntax.css&lt;/p&gt;&#xA;&lt;p&gt;===================================================================&lt;/p&gt;&#xA;&lt;p&gt;--- wp-syntax.css (revision 8)&lt;/p&gt;&#xA;&lt;p&gt;+++ wp-syntax.css (working copy)&lt;/p&gt;&#xA;&lt;p&gt;@@ -41,7 +41,7 @@&lt;/p&gt;&#xA;&lt;p&gt;float:none;&lt;/p&gt;&#xA;&lt;p&gt;clear:none;&lt;/p&gt;&#xA;&lt;p&gt;overflow:visible;&lt;/p&gt;&#xA;&lt;p&gt;- font-size:12px;&lt;/p&gt;&#xA;&lt;p&gt;+ font-size:108%;&lt;/p&gt;&#xA;&lt;p&gt;line-height:1.333;&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;p&gt;.line_numbers pre {&lt;/p&gt;&#xA;&lt;p&gt;これで通常の文章と同じフォントサイズでさらに可変になります。このプラグインのおかげでブログにコードを掲載するのが少し楽しくなりましたとさ。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>WordPressで試したテーマ</title>
				<link>https://journal.lampetty.net/posts/wp/245/</link>
				<pubDate>Fri, 06 Feb 2009 14:02:53 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/245/</guid>
				<description>&lt;p&gt;WordPressをインストールしてから1ヶ月の間に試してそこそこ良かったテーマです。色々と試したりしたのですが、最終的に悩んだものは以下の3つでした。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;今使っている&lt;a href=&#34;http://wordpress.org/extend/themes/inove&#34;&gt;iNove&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;シンプルな&lt;a href=&#34;http://wp.vicuna.jp/&#34;&gt;wp.Vicuna&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Macっぽい&lt;a href=&#34;http://www.ndesign-studio.com/resources/wp-themes/itheme/&#34;&gt;iTheme&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;wp.Vicunaはモジュール化されているようでCSSファイルが複数に分かれていてけっこう表示速度が遅かったので、今はiNoveに落ち着いています。&lt;a href=&#34;http://diary.lampetty.net/&#34;&gt;昔のおいぬま日報&lt;/a&gt;で使っていたような透き通った感じのものがよかったのですが、細部までこだわり出すとなかなかいいものがありませんでした。&lt;/p&gt;&#xA;&lt;p&gt;なんかいいものがあったら乗り換えたいものです...&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Google Analyticsを携帯サイトで利用するためのGA4K 1.1.0にバグ？</title>
				<link>https://journal.lampetty.net/posts/wp/252/</link>
				<pubDate>Thu, 05 Feb 2009 16:02:48 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/252/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;https://journal.lampetty.net/tech/index.php/archives/220&#34;&gt;WordPressをモバイル対応させるプラグインKtai StyleとGoogle Analyticsでのアクセス解析&lt;/a&gt;でGoogle Analyticsを携帯サイトで利用するためのライブラリ&lt;a href=&#34;http://eos.exbridge.jp/projects/show/ga4k&#34;&gt;GA4K&lt;/a&gt;を導入したと書きましたが、ちょっと挙動があやしかったので一時的に使用をやめていました。(GA4Kのバージョンは1.1.0)&lt;/p&gt;&#xA;&lt;p&gt;というのも、どうやらクローラーのアクセスもカウントしている節があるのです。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/8250493@N05/3256013830/&#34; title=&#34;google-analytics-mobile-docomo&#34;&gt;&lt;img src=&#34;http://static.flickr.com/3506/3256013830_b721f46f0b.jpg&#34; alt=&#34;google-analytics-mobile-docomo&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;具体的には、Google Analytics上で↑のようなDoCoMoからのアクセスがあるのですが、Apacheのログを見ても下記のようなYahoo!のモバイル版クローラーのアクセスしか見当たらないのです。&lt;/p&gt;&#xA;&lt;p&gt;124.83.159.168 - - [01/Feb/2009:18:00:58 +0900] &amp;quot;GET /tech/index.php/archives/156?view=co_post HTTP/1.1&amp;quot; 206 3625 &amp;quot;-&amp;quot; &amp;quot;DoCoMo/2.0 SH902i (compatible; Y!J-SRD/1.0; &lt;a href=&#34;http://help.yahoo.co.jp/help/jp/search/indexing/indexing-27.html)&#34;&gt;http://help.yahoo.co.jp/help/jp/search/indexing/indexing-27.html)&lt;/a&gt;&amp;quot;&lt;/p&gt;&#xA;&lt;p&gt;ちょっとコードを見てみると、GoogleAnalytics/Service/analytics.php L36あたりで&lt;/p&gt;&#xA;&lt;p&gt;//モバイル判定&lt;/p&gt;&#xA;&lt;p&gt;$send_flg = isMobile($_SERVER[&#39;HTTP_USER_AGENT&#39;]);&lt;/p&gt;&#xA;&lt;p&gt;みたいなことをやってて、isMobile()の中の処理を見てみると&lt;/p&gt;&#xA;&lt;p&gt;function isMobile($user_agent){&lt;/p&gt;&#xA;&lt;p&gt;$mobile_flg = false;&lt;/p&gt;&#xA;&lt;p&gt;if(eregi(USER_AGENT_PATTERN_DOCOMO, $user_agent)){&lt;/p&gt;&#xA;&lt;p&gt;//echo(&amp;quot;ドコモ&amp;quot;);&lt;/p&gt;&#xA;&lt;p&gt;$mobile_flg = true;&lt;/p&gt;&#xA;&lt;p&gt;}else if(eregi(USER_AGENT_PATTERN_SOFTBANK, $user_agent)){&lt;/p&gt;&#xA;&lt;p&gt;...&lt;/p&gt;&#xA;&lt;p&gt;となっていました。USER_AGENT_PATTERN_DOCOMOは残念なことに&lt;/p&gt;&#xA;&lt;p&gt;define(&#39;USER_AGENT_PATTERN_DOCOMO&#39;, &#39;^DoCoMo&#39;);&lt;/p&gt;&#xA;&lt;p&gt;なので、&amp;quot;DoCoMo&amp;quot;という文字列が UserAgent に存在すると、それがクローラーでも集計されてしまうというシナリオのようです。ここまでわかればPHP超初心者の自分でもパッチが作れそうだと思ったのですが、今日は寝不足で力尽きたのでまた次回。&lt;/p&gt;&#xA;&lt;p&gt;2009/2/17追記：&lt;a href=&#34;http://eos.exbridge.jp/news/show/17&#34;&gt;http://eos.exbridge.jp/news/show/17&lt;/a&gt; の1.1.1でこの問題は修正されているようです。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>ケータイ対応だけじゃ駄目だよね</title>
				<link>https://journal.lampetty.net/posts/wp/250/</link>
				<pubDate>Wed, 04 Feb 2009 12:02:36 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/250/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;http://www.castle104.com/blog/?p=656&#34;&gt;ミクシィのケータイへのシフトを読み解く at Naofumi Kagami&lt;/a&gt;というエントリの最後の方に書いてある&lt;/p&gt;&#xA;&lt;p&gt;日本のインターネット産業には、安易に携帯電話にシフトするのではなく、パソコンでのビジネスモデルをどのように発展させていくかということをもっと真剣にやってもらいたいと思っています。&lt;/p&gt;&#xA;&lt;p&gt;という一文にはっと思いました。確かに今の日本のモバイルの利用状況は半端なく、今や携帯で転職活動までしてしまう時代ですが、そういう状況はいつまでも続かないよね、っていうのを完全に忘れていました。昨年は日本でもiPhoneが発売されたし、Googleのアンドロイド携帯もそろそろ来そうな感じなので、携帯電話のPC化という土壌は徐々に出来上がっているのだと思います。&lt;/p&gt;&#xA;&lt;p&gt;ケータイの過熱ぶりに冷水を浴びせるいいエントリだと思いました。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>UQ WiMAXモニターに申し込みました</title>
				<link>https://journal.lampetty.net/posts/wp/249/</link>
				<pubDate>Tue, 03 Feb 2009 17:02:37 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/249/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;http://www.itmedia.co.jp/news/articles/0902/03/news074.html&#34;&gt;IT Mediaの記事&lt;/a&gt;によると&lt;/p&gt;&#xA;&lt;p&gt;KDDIや米Intel Capitalなど6社が出資するUQコミュニケーションズは2月3日、モバイルWiMAXサービス「UQ WiMAX」の無償トライアルを2月26日に始めると発表した。有料の本サービスは7月1日にスタート。月額4480円で使い放題になる。&lt;/p&gt;&#xA;&lt;p&gt;　UQ WiMAXは、国内で唯一、全国をカバーする予定のWiMAXサービス。下り最大40Mbps、上り最大10Mbpsで通信でき、発表会を行った帝国ホテル（東京都千代田区）では、下り約16Mbps、上り約3.9Mbpsで通信していた。&lt;/p&gt;&#xA;&lt;p&gt;とのことなので、勢いで6月まで無料なモニターに応募してみました。興味のある人は&lt;a href=&#34;http://www.uqwimax.jp/service/application/&#34;&gt;こちら&lt;/a&gt;からどうぞ。今年はwilcomも高速データ通信をリリースするはずなので、今年はモバイル通信が楽しくなりそうです。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>FirefoxでDNSプリフェッチを行うアドオン</title>
				<link>https://journal.lampetty.net/posts/wp/247/</link>
				<pubDate>Sun, 01 Feb 2009 05:02:07 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/247/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;http://www.atmarkit.co.jp/news/analysis/200812/22/chrome.html&#34;&gt;Chromeはなぜ速いのか − ＠IT&lt;/a&gt;の記事でDNSプリフェッチで高速化をしているということが載っていたので、Firefoxで同じことができないかを調べていたら、&lt;a href=&#34;https://addons.mozilla.org/ja/firefox/addon/8923&#34;&gt;DNS Prefetch :: Firefox Add-ons&lt;/a&gt;というそのままずばりのアドオンを見つけました。&lt;/p&gt;&#xA;&lt;p&gt;で、早速入れてみたのですが、体感的には「ちょっと速くなったかも」というレベルのものでした。ウチのネットワークにはDNSキャッシュサーバがあるので、そもそもそんなに名前解決に時間かかっていなかったのかも...プロバイダが提供しているDNS使っている場合とかは恩恵に預かれるのでしょうか...&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>WordPressをインストールしてからインストールしたプラグイン</title>
				<link>https://journal.lampetty.net/posts/wp/244/</link>
				<pubDate>Fri, 30 Jan 2009 14:01:15 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/244/</guid>
				<description>&lt;p&gt;WordPressをインストールしてからそろそろ1ヶ月になるので、その間にインストールしたプラグインをまとめてみました。全部実用に足るものだったので個人的にはおすすめです。*印がついているものはこのブログの該当エントリーへのリンクで、それ以外はプラグイン本体へのリンクです。&lt;/p&gt;&#xA;&lt;h3 id=&#34;all-in-one-seo-pack&#34;&gt;*&lt;a href=&#34;https://journal.lampetty.net/tech/index.php/archives/131&#34;&gt;All in One SEO Pack&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;投稿ごとにmetaタグのkeywordsやdescriptionが設定できるようになったり、titleタグにブログのタイトルを設定できるようになります。&lt;/p&gt;&#xA;&lt;h3 id=&#34;breadcrumb-navigation-xt&#34;&gt;*&lt;a href=&#34;https://journal.lampetty.net/tech/index.php/archives/109&#34;&gt;Breadcrumb Navigation XT&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;パンくずナビゲーションを追加します。サイト内のリンク構造を改善することでSEO効果が得られるようになります。&lt;/p&gt;&#xA;&lt;h3 id=&#34;broken-link-checker&#34;&gt;&lt;a href=&#34;http://wordpress.org/extend/plugins/broken-link-checker/&#34;&gt;Broken Link Checker&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;ブログ内のリンクでリンク切れになっているものを見つけてくれるプラグイン。&lt;/p&gt;&#xA;&lt;h3 id=&#34;dagon-design-sitemap-generator&#34;&gt;&lt;a href=&#34;http://www.dagondesign.com/articles/sitemap-generator-plugin-for-wordpress/&#34;&gt;Dagon Design Sitemap Generator&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;ブログのサイトマップを生成するプラグイン。サイトマップを作ると検索エンジンのクローラーがページを巡回してくれる確率が高くなります。&lt;/p&gt;&#xA;&lt;h3 id=&#34;feedburner-feedsmith&#34;&gt;*&lt;a href=&#34;https://journal.lampetty.net/tech/index.php/archives/120&#34;&gt;FeedBurner FeedSmith&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;生成されるRSSのURLを変更できるようにするプラグイン。&lt;/p&gt;&#xA;&lt;h3 id=&#34;google-xml-sitemaps-generator-for-wordpress&#34;&gt;&lt;a href=&#34;http://www.arnebrachhold.de/projects/wordpress-plugins/google-xml-sitemaps-generator/&#34;&gt;Google (XML) Sitemaps Generator for WordPress&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;Google Sitemapプロトコルに対応した XML のサイトマップファイルを自動で生成するプラグイン。これを導入するとクローラーがページを巡回する確率が高くなります。&lt;/p&gt;&#xA;&lt;h3 id=&#34;ktai-style-携帯対応プラグイン&#34;&gt;*&lt;a href=&#34;https://journal.lampetty.net/tech/index.php/archives/220&#34;&gt;Ktai Style (携帯対応プラグイン)&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;WordPressを日本の携帯端末に対応させるプラグイン。URLはそのままで携帯端末でアクセスするとモバイル用の画面が表示されます。&lt;/p&gt;&#xA;&lt;h3 id=&#34;pagebar&#34;&gt;&lt;a href=&#34;http://www.elektroelch.de/hacks/wp/pagebar/&#34;&gt;pagebar&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;TOPページやカテゴリの一覧ページなど、投稿を一覧表示する画面にPagenationを埋め込むプラグインです。SEO対策で全ページくまなくインデックスされるように仕込んでみました。&lt;/p&gt;&#xA;&lt;h3 id=&#34;search-word-highlight-for-multibyte&#34;&gt;&lt;a href=&#34;http://wppluginsj.sourceforge.jp/search-word-highlight-for-multibyte/&#34;&gt;Search Word Highlight for Multibyte&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;検索エンジンからサイトに飛んできた際に、検索エンジンでの検索語をサイト上でハイライト表示するプラグインです。はてなダイアリーでもこのような機能がついているので入れてみました。&lt;/p&gt;&#xA;&lt;h3 id=&#34;similar-posts&#34;&gt;*&lt;a href=&#34;https://journal.lampetty.net/tech/index.php/archives/156&#34;&gt;Similar Posts&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;今表示している投稿に似ている投稿を表示するプラグイン。投稿の単語を調べて似ているものを探しているようです。読者のために似ている投稿をおすすめすることでPVアップが見込めるでしょう。またサイト内のリンク構造も改善されるのでSEO対策としても有効だと思います。&lt;/p&gt;&#xA;&lt;h3 id=&#34;ultimate-google-analytics-plugin-for-wordpress&#34;&gt;&lt;a href=&#34;http://www.oratransplant.nl/uga/&#34;&gt;Ultimate Google Analytics plugin for WordPress&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;Google Analyticsの設定をWordPressの管理画面で行うためのプラグイン。WordPressにログインしている場合はトラッキングしないなどの設定が行えます。&lt;/p&gt;&#xA;&lt;h3 id=&#34;wordpress-database-backup&#34;&gt;&lt;a href=&#34;http://www.ilfilosofo.com/blog/wp-db-backup&#34;&gt;WordPress Database Backup&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;WordPressのデータベースのバックアップを管理画面から行ってファイルをダウンロードできるようにするプラグイン。定期的にバックアップを取ってメール送信するようなこともできます。&lt;/p&gt;&#xA;&lt;h3 id=&#34;wordpress-media-flickr&#34;&gt;&lt;a href=&#34;http://factage.com/yu-ji/tag/wp-media-flickr/&#34;&gt;Wordpress Media Flickr&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;WordPressの管理画面からFlickrの写真を選択してブログに引用できるようにするプラグイン。インタフェースがわかりやすくて使いやすいです。Flickrのヘビーユーザにおすすめのプラグインです。&lt;/p&gt;&#xA;&lt;h3 id=&#34;wp-chgfontsize&#34;&gt;*&lt;a href=&#34;https://journal.lampetty.net/tech/index.php/archives/194&#34;&gt;WP-chgFontSize&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;WordPressのテーマはなぜかフォントサイズが小さいので、フォントサイズを変更するプルダウンを表示するプラグインです。このブログでは右ナビに設定しています。&lt;/p&gt;&#xA;&lt;h3 id=&#34;wp-syntax&#34;&gt;*&lt;a href=&#34;https://journal.lampetty.net/tech/index.php/archives/255&#34;&gt;WP-Syntax&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;ソースコードをカラー表示にしてくれるプラグイン。存在するプログラミング言語にはほぼ全て対応しているのと、&amp;lt;&amp;gt;のタグを自動でエスケープしてくれるのが素晴らしいです。&lt;/p&gt;&#xA;&lt;h4 id=&#34;wp-tmkm-amazon&#34;&gt;&lt;a href=&#34;http://wppluginsj.sourceforge.jp/wp-tmkm-amazon/&#34;&gt;wp-tmkm-amazon&lt;/a&gt;&lt;/h4&gt;&#xA;&lt;p&gt;投稿内でAmazonの書籍などを引用するためのプラグインです。Amazon系のプラグインは色々乱立していたのですが、これが一番シンプルっぽいので選びました。&lt;/p&gt;&#xA;&lt;p&gt;なお、プラグインの選定に関しては以下のページを参考にさせてもらっています。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://coliss.com/articles/blog/wordpress/plugin/1532.html&#34;&gt;Wordpressの便利なプラグイン集 -2008年10月&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.ideaxidea.com/archives/2008/12/wordpress.html&#34;&gt;WordPressで導入したプラグインまとめ&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://seofromusa.com/wordpress-customizazion/wordpress-starter-guide/&#34;&gt;WordPressでブログを作ったらまずやる26項目―SEO・アクセスアップのためのカスタマイズ&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>Apacheでリバースプロキシ(mod_proxy)を活用する(1) - インストール編</title>
				<link>https://journal.lampetty.net/posts/wp/238/</link>
				<pubDate>Wed, 28 Jan 2009 17:01:57 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/238/</guid>
				<description>&lt;p&gt;Apacheはとてもとても有名なWeb Serverですが、今日はそのチューニング方法の一つであるリバースプロキシについて書きたいと思います。&lt;/p&gt;&#xA;&lt;h3 id=&#34;webサーバの種類&#34;&gt;Webサーバの種類&lt;/h3&gt;&#xA;&lt;p&gt;一口にWebサーバと言っても、ダイナミックなWebコンテンツを生成するサイトにおいてWebサーバがserveするものは2種類あります。一つはプログラムで動的に生成されるHTMLファイル。もう一つがGIFやJPEG, PNGなどの画像、および Flash, JavaScript, CSSなどの静的なファイルです。&lt;/p&gt;&#xA;&lt;p&gt;プログラムで動的にHTMLを生成するためには、そのプログラムを動かす実行環境がWebサーバ(Apache)と連携する必要があります。いわゆるCGIとか最近だとFastCGI, mod_php, mod_perl, mod_rails, mod_pythonなどのスクリプト環境がよく使われています。これらの環境は昨今では「事前に実行環境(インタープリター)の起動をしてプログラムをコンパイルしておきそれを再利用する」というような使われ方をするため、Apacheがクライアントからの要求を処理するために生成する子プロセスのメモリ使用量が肥大化し、プロセスを起動する処理が重くなる傾向にあります。&lt;/p&gt;&#xA;&lt;p&gt;一方で、単純にファイルの中身をそのままクライアントに渡せばいいようなスタティックなファイルが、このような肥大化したプロセスで処理されることには非常に無駄があります。そこでリバースプロキシの出番です。リバースプロキシの動作は凄くシンプルで、リクエストを受けたら、ダイナミックなページのリクエストのみバックエンドのアプリケーションサーバに渡し、それ以外のスタティックなファイルは自分自身で直接処理します(*1)。図にするとこんな感じでしょうか。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/8250493@N05/3260285170/&#34; title=&#34;リバースプロキシのイメージ&#34;&gt;&lt;img src=&#34;http://static.flickr.com/3420/3260285170_53e07990d8.jpg&#34; alt=&#34;リバースプロキシのイメージ&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;このような単純な動作なので、リバースプロキシ自体にはmod_perlやmod_phpなどを組み込む必要がなくなり、プロセスのサイズは非常にスリムになります。実際このブログを動かしているマシンでも&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;リバースプロキシのプロセスサイズは3.5MB程度&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;mod_phpのプロセスサイズは25MB程度&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;となっており、一プロセスあたりで20MBも違います。&lt;/p&gt;&#xA;&lt;p&gt;さらに、リバースプロキシは動作がシンプルなので、ApacheのMPM(Multi-Proccessing Module)にworkerというものを選択することができます。worker mpmはクライアントからのリクエストを処理するのにプロセスより軽量なスレッドを使用するため(*2)、prefork mpmと比べて動作が軽いという特徴があります。&lt;/p&gt;&#xA;&lt;p&gt;*1)これは設定自体でどうにでも変更できます&lt;/p&gt;&#xA;&lt;p&gt;*2)厳密に言うとプロセス＋スレッドのハイブリッド方式です&lt;/p&gt;&#xA;&lt;p&gt;また、フロントエンドのリバースプロキシ＋バックエンドのアプリケーションサーバという構成にしておくことで、リバースプロキシは止めずにバックエンドのサーバを増やしたり交換したりすることが可能です。このため&lt;strong&gt;負荷分散のためのメンテナンスが非常にやりやすくなります&lt;/strong&gt;。このあたりはmod_proxy_balancerというモジュールの話になるので今回は割愛しますが、また機会があればということで。&lt;/p&gt;&#xA;&lt;h3 id=&#34;apache-2211のインストール&#34;&gt;Apache 2.2.11のインストール&lt;/h3&gt;&#xA;&lt;p&gt;前置きが長くなりましたが、リバースプロキシを導入するメリットがわかったところで実際にApacheをインストールしてみたいと思います。環境は Ubuntu 8.10 Interpid です。&lt;/p&gt;&#xA;&lt;p&gt;まずは最新版である2.2.11のソースを &lt;a href=&#34;http://httpd.apache.org/download.cgi&#34;&gt;Apache本家&lt;/a&gt; からダウンロードしておきます。&lt;/p&gt;&#xA;&lt;p&gt;$ tar xvzf httpd-2.2.11.tar.gz&lt;/p&gt;&#xA;&lt;p&gt;# ちょっとでも最適化する&lt;/p&gt;&#xA;&lt;p&gt;$ export CFLAGS=&amp;quot;-O3&amp;quot;&lt;/p&gt;&#xA;&lt;p&gt;$ cd httpd-2.2.11&lt;/p&gt;&#xA;&lt;p&gt;$ ./configure --prefix=/usr/local/httpd_proxy_2.2.11&lt;/p&gt;&#xA;&lt;p&gt;--with-mpm=worker&lt;/p&gt;&#xA;&lt;p&gt;--enable-shared&lt;/p&gt;&#xA;&lt;p&gt;--enable-so&lt;/p&gt;&#xA;&lt;p&gt;--disable-asis&lt;/p&gt;&#xA;&lt;p&gt;--disable-cgid&lt;/p&gt;&#xA;&lt;p&gt;--disable-proxy-connect&lt;/p&gt;&#xA;&lt;p&gt;--disable-proxy-ftp&lt;/p&gt;&#xA;&lt;p&gt;--disable-proxy-ajp&lt;/p&gt;&#xA;&lt;p&gt;--disable-userdir&lt;/p&gt;&#xA;&lt;p&gt;--disable-actions&lt;/p&gt;&#xA;&lt;p&gt;--enable-modules=&#39;rewrite proxy proxy_balancer proxy_http cgi deflate headers expires&#39;&lt;/p&gt;&#xA;&lt;p&gt;--enable-mods-shared=&#39;ssl cache disk_cache mem_cache&#39;&lt;/p&gt;&#xA;&lt;p&gt;&amp;amp;&amp;amp; make &amp;amp;&amp;amp; sudo make install&lt;/p&gt;&#xA;&lt;p&gt;でインストールが完了です。configureにいろいろとオプションを渡していますが、これらは&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;確実に使用するモジュールを静的にリンクさせる&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;不要なモジュールは無効にする&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;必要になるかもしれないモジュールはDSOとして組み込めるようにしておく&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;という指定です。/usr/local/httpd_proxy_2.2.11 にApacheのファイル一式がインストールされているので、起動確認を行いましょう。&lt;/p&gt;&#xA;&lt;p&gt;$ sudo /usr/local/httpd_proxy_2.2.11/bin/apachectl start&lt;/p&gt;&#xA;&lt;p&gt;でサーバが起動するので、&lt;a href=&#34;http://localhost/&#34;&gt;http://localhost/&lt;/a&gt; にアクセスしてみてください。&amp;quot;It works!&amp;quot;と表示されればインストール成功です。次回は具体的なリバースプロキシの設定方法を説明します。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>ブログのファイルをSubversionリポジトリで管理するように</title>
				<link>https://journal.lampetty.net/posts/wp/231/</link>
				<pubDate>Sun, 25 Jan 2009 13:01:40 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/231/</guid>
				<description>&lt;p&gt;色々気になるところがあってiNoveのテーマのファイルをいじりまくっているのですが、テーマをバージョンアップするとせっかく施した修正が吹っ飛んでしまうので、どこをどう修正したのかを管理するためにSubversionでバージョン管理するようにしました。&lt;/p&gt;&#xA;&lt;p&gt;世間の流れ的に、最初は張り切ってgitを使っていたのですが&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;git statusとかgit commitとか、フルスペルでタイプしないといけない(svnはsvn st、svn ciとか略式がある)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;git push origin master とかコマンド群がわかりづらい&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;git status の表示が見にくい&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;という点がどうしても気になったので、慣れ親しんだsvnで管理することにしました。まぁ上の3点ははっきりいって慣れの問題ですし、gitのブランチの作成→マージのお手軽さは素晴らしいのですが、&lt;strong&gt;svnが許されるのは小学生まで&lt;/strong&gt;と言われるまではsvnで頑張ろうと思います。ヒマがあったら&lt;a href=&#34;http://ja.wikipedia.org/wiki/Bazaar&#34;&gt;bazaar&lt;/a&gt;も試してみたいです。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>WordPressをモバイル対応させるプラグインKtai StyleとGoogle Analyticsでのアクセス解析</title>
				<link>https://journal.lampetty.net/posts/wp/220/</link>
				<pubDate>Sat, 24 Jan 2009 18:01:06 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/220/</guid>
				<description>&lt;p&gt;先週ぐらいにWordPressをモバイルに対応させるプラグイン&lt;a href=&#34;http://wppluginsj.sourceforge.jp/ktai_style/&#34;&gt;Ktai Style&lt;/a&gt;を導入したのですが、Google Analyticsだとモバイルサイトのアクセス解析ができなくってどうしようかと思っていたら、&lt;a href=&#34;http://ke-tai.org/blog/2009/01/16/selenga4k/&#34;&gt;ケータイサイトでGoogle Analyticsを利用するためのライブラリ&lt;/a&gt;という記事があったので早速試してみました。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;まずはファイルを&lt;a href=&#34;http://eos.exbridge.jp/projects/show/ga4k&#34;&gt;GA4K&lt;/a&gt;からダウンロードして解凍し、&amp;quot;GoogleAnalytics&amp;quot;というディレクトリをKtai Styleプラグインで利用しているテーマ(自分の場合は&amp;quot;default&amp;quot;)のディレクトリである wp-content/plugins/ktai_style/themes/default/ 配下にコピーします。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;そしてコピーしたGoogleAnalyticsディレクトリ配下にある Config/analytics_config.php にトラッキングしたいサイトのIDとドメインを設定します。該当箇所がコメントアウトされているのでこれを解除します。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;最後にトラッキングするため、以下のようにコードを wp-content/plugins/ktai_style/themes/default/header.php あたりに追加します。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;--- header.php.orig 2009-01-25 19:46:39.000000000 +0900&lt;/p&gt;&#xA;&lt;p&gt;+++ header.php 2009-02-01 23:01:34.000000000 +0900&lt;/p&gt;&#xA;&lt;p&gt;@@ -6,6 +6,15 @@&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;+/* customize: Google Analytics */&lt;/p&gt;&#xA;&lt;p&gt;+require_once (dirname(__FILE__) . &#39;/GoogleAnalytics/Service/analytics.php&#39;);&lt;/p&gt;&#xA;&lt;p&gt;+require_once (dirname(__FILE__) . &#39;/GoogleAnalytics/Config/analytics_config.php&#39;);&lt;/p&gt;&#xA;&lt;p&gt;+sendGoogleAnalytics(ANALYTICS_ID, WEBSITE_DOMAIN);&lt;/p&gt;&#xA;&lt;p&gt;+/* /customize: Google Analytics */&lt;/p&gt;&#xA;&lt;p&gt;+?&amp;gt;&lt;/p&gt;&#xA;&lt;p&gt;@@ -28,4 +37,4 @@&lt;/p&gt;&#xA;&lt;p&gt;これで実際に携帯でアクセスしてみてから1,2時間後にGoogle Analyticsをチェックしてみると、以下のように携帯端末のアクセスが記録されているはずです。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.flickr.com/photos/8250493@N05/3222442543/&#34; title=&#34;google-analytics-mobile&#34;&gt;&lt;img src=&#34;http://static.flickr.com/3524/3222442543_cfed40d07d.jpg&#34; alt=&#34;google-analytics-mobile&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;それにしてもKtai Styleプラグインの携帯対応ぶりがすごい。プラグインの自由度が高いからここまでできるのですかね...なお、Google Analyticsのモバイル対応にあたっては&lt;a href=&#34;http://m120.scriptkiddie.net/wordpress/?p=142&#34;&gt;こちら&lt;/a&gt;を参考にさせてもらいました。&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]4883376737[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>このブログにLDRizeを設定</title>
				<link>https://journal.lampetty.net/posts/wp/207/</link>
				<pubDate>Thu, 22 Jan 2009 16:01:02 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/207/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;http://tech.lampetty.net/tech/index.php/archives/202&#34;&gt;昨日のAutoPagerize&lt;/a&gt;に引き続き、&lt;a href=&#34;http://white.s151.xrea.com/wiki/index.php?script%2FLDRize&#34;&gt;LDRize&lt;/a&gt;も設定しました。LDRizeは&lt;a href=&#34;http://white.s151.xrea.com/wiki/index.php?script%2FLDRize%2Fsiteinfo&#34;&gt;script/LDRize/siteinfo&lt;/a&gt;のWikiに追記すると設定できますが、例によって一旦ローカルでうまく動くか試すのがよいでしょう。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Greasemonkeyのアイコンを右クリック&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;ユーザスクリプトの管理&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;LDRizeを選択&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;”編集”ボタンをクリック&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;してスクリプトを開き、var SITEINFO に以下を追加します。&lt;/p&gt;&#xA;&lt;p&gt;{&lt;/p&gt;&#xA;&lt;p&gt;name: &#39;おいぬま日報&#39;,&lt;/p&gt;&#xA;&lt;p&gt;domain: &#39;^&lt;a href=&#34;http://tech&#34;&gt;http://tech&lt;/a&gt;¥.lampetty¥.net/tech/&#39;,&lt;/p&gt;&#xA;&lt;p&gt;paragraph: &#39;//div[@class=&amp;quot;post&amp;quot;]&#39;,&lt;/p&gt;&#xA;&lt;p&gt;link: &#39;h2/a&#39;,&lt;/p&gt;&#xA;&lt;p&gt;view: &#39;h2/a/text()&#39;,&lt;/p&gt;&#xA;&lt;p&gt;}&lt;/p&gt;&#xA;&lt;p&gt;これで動作確認したらローカルのスクリプトは元に戻しておいて、&lt;a href=&#34;http://white.s151.xrea.com/wiki/index.php?script%2FLDRize%2Fsiteinfo&#34;&gt;script/LDRize/siteinfoのWiki&lt;/a&gt;に追記します。で、Greasemonkeyのアイコンを右クリック-&amp;gt;ユーザスクリプトコマンド-&amp;gt;LDRize - update siteinfoをクリックするとSITEINFOのデータが最新の状態になります。&lt;/p&gt;&#xA;&lt;p&gt;これで&amp;quot;j&amp;quot;, &amp;quot;k&amp;quot;, &amp;quot;p&amp;quot;, &amp;quot;o&amp;quot;キーで一気に読めるようになりました。めでたしめでたし。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>このブログにAutoPagerizeを設定</title>
				<link>https://journal.lampetty.net/posts/wp/202/</link>
				<pubDate>Wed, 21 Jan 2009 16:01:39 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/202/</guid>
				<description>&lt;p&gt;タイトル通り、このブログに&lt;a href=&#34;http://userscripts.org/scripts/show/8551&#34;&gt;AutoPagerize&lt;/a&gt;を設定しました。これでGreasemonkeyでAutoPagerizeを入れている人はちょっと幸せになれるはず。今回も&lt;a href=&#34;http://wedata.net/databases/AutoPagerize/items&#34;&gt;wedata&lt;/a&gt;を使っているのですが、ここに書き込む前にローカルで動作確認をしました。具体的には&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Greasemonkeyのアイコンを右クリック&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;ユーザスクリプトの管理&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;AutoPagerizeを選択&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&amp;quot;編集&amp;quot;ボタンをクリック&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;してスクリプトを開き、var SITEINFO に以下を追加して下書きをします。&lt;/p&gt;&#xA;&lt;p&gt;{&lt;/p&gt;&#xA;&lt;p&gt;url: &#39;^&lt;a href=&#34;http://tech.lampetty.net/tech/&#39;,&#34;&gt;http://tech.lampetty.net/tech/&#39;,&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;nextLink: &#39;//span[contains(@class,&amp;quot;older&amp;quot;) or contains(@class,&amp;quot;next&amp;quot;)]/a&#39;,&lt;/p&gt;&#xA;&lt;p&gt;pageElement: &#39;//div[contains(@class,&amp;quot;post&amp;quot;)]&#39;,&lt;/p&gt;&#xA;&lt;p&gt;insertBefore: &#39;//div[@id=&amp;quot;postnavi&amp;quot;]&#39;,&lt;/p&gt;&#xA;&lt;p&gt;exampleUrl: &#39;&lt;a href=&#34;http://tech.lampetty.net/tech/&#39;,&#34;&gt;http://tech.lampetty.net/tech/&#39;,&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;},&lt;/p&gt;&#xA;&lt;p&gt;これでコメント欄の直後に次のページの内容が挿入されるので、あとはブラウザをリロードして正しく動くかどうかを確認。問題なかったらこっちはコメントあうとして、wedataに反映させます。&lt;/p&gt;&#xA;&lt;p&gt;コンテンツを作っているのは自分なので、本来であればHTMLにmicroformatsで入れても良いのですが、あんまりテーマのファイルをいじりたくないのでwedataに書き込みました。さて、次はLDRizeをやらないと...&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>デザインが崩れてました...</title>
				<link>https://journal.lampetty.net/posts/wp/197/</link>
				<pubDate>Sun, 18 Jan 2009 05:01:35 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/197/</guid>
				<description>&lt;p&gt;投稿を表示するページをIEまたはSafariで表示するとデザインが崩れてました。あらためてクロスブラウザチェックの必要性を感じた今日この頃orz...&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>WordPressでフォントサイズを変更できるようにするプラグイン</title>
				<link>https://journal.lampetty.net/posts/wp/194/</link>
				<pubDate>Sat, 17 Jan 2009 13:01:01 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/194/</guid>
				<description>&lt;p&gt;どうもこの&lt;a href=&#34;http://wordpress.org/extend/themes/inove&#34;&gt;iNove&lt;/a&gt;というテーマのフォントサイズが小さい(bodyタグで12px指定)のが無性に気になったので、WordPressでフォントサイズを変更できるプラグインがないかを探してみたら、&lt;a href=&#34;http://wordpress.org/extend/plugins/wp-chgfontsize/&#34;&gt;WP-chgFontSize&lt;/a&gt;というそのままずばりのものを発見しました。&lt;/p&gt;&#xA;&lt;p&gt;インストールはいつものようにファイルをダウンロード→解凍→wp-content/plugins に移動→管理画面から有効化するだけです。で、管理画面から設定をするんですが、フォントサイズの単位が px, em, %が選べるので、自分は&lt;a href=&#34;http://webtech-walker.com/archive/2008/05/16032443.html&#34;&gt;font-sizeのパーセント表記一覧 - Webtech Walker&lt;/a&gt;を参考にさせてもらい、パーセンテージ指定にしました。具体的には&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Min: 100 (12px相当)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Max: 150 (18px相当)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Default Font Size: 108 (13px相当)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;という感じです。これで12pxという小さいフォントサイズは解消できたのでめでたしめでたし。本当は14px相当にしてもよかったのですが、投稿タイトルのh2タグのフォントサイズがなぜか大きくできないので、本文のフォントサイズは控えめにしてあります。&lt;/p&gt;&#xA;&lt;p&gt;[tmkm-amazon]4798022012[/tmkm-amazon]&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Google Notebookが開発終了</title>
				<link>https://journal.lampetty.net/posts/wp/187/</link>
				<pubDate>Thu, 15 Jan 2009 15:01:17 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/187/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;http://google-mania.net/archives/1118&#34;&gt;Google Mania&lt;/a&gt;経由で知ったのですが、&lt;a href=&#34;http://www.google.com/notebook/&#34;&gt;Google Notebook&lt;/a&gt;の開発が中止され、今後新機能が追加されなくなるようです。ちょっとしたメモ書きを残すのに便利に使っていたので、非常にショックです。ただ、開発は中止になってもサービス自体は継続されるらしいので、しばらくは利用できるらしいのですが、先行き不安...&lt;/p&gt;&#xA;&lt;p&gt;不景気だからGoogleも採算の取れないサービスに見切りをつけ始めたのですかねぇ。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>MySQLをインストールした後に設定する項目</title>
				<link>https://journal.lampetty.net/posts/wp/174/</link>
				<pubDate>Wed, 14 Jan 2009 16:01:35 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/174/</guid>
				<description>&lt;p&gt;MySQL 5.5用の設定は[permalink id=471]こちら[/permalink]&lt;/p&gt;&#xA;&lt;p&gt;自分がMySQLをインストールしたあとに行う設定を備忘録がてら書いてみます。サーバのスペックによって若干変動するところもありますが、チューニングする項目というのは大体こんなもんでしょう。&lt;/p&gt;&#xA;&lt;p&gt;user = mysql&lt;/p&gt;&#xA;&lt;p&gt;pid-file = /var/run/mysqld/mysqld.pid&lt;/p&gt;&#xA;&lt;p&gt;socket = /var/run/mysqld/mysqld.sock&lt;/p&gt;&#xA;&lt;p&gt;port = 3306&lt;/p&gt;&#xA;&lt;p&gt;basedir = /usr&lt;/p&gt;&#xA;&lt;p&gt;datadir = /var/lib/mysql&lt;/p&gt;&#xA;&lt;p&gt;tmpdir = /tmp&lt;/p&gt;&#xA;&lt;p&gt;language = /usr/share/mysql/english&lt;/p&gt;&#xA;&lt;p&gt;skip-external-locking&lt;/p&gt;&#xA;&lt;p&gt;# ここまではわりとお決まりの設定。環境によってファイルのパスは適宜変えます。&lt;/p&gt;&#xA;&lt;p&gt;# サーバ側で使用する文字コードの設定&lt;/p&gt;&#xA;&lt;p&gt;default-character-set = utf8&lt;/p&gt;&#xA;&lt;p&gt;# クライアント/サーバ側での文字コード変換を行わない&lt;/p&gt;&#xA;&lt;p&gt;skip-character-set-client-handshake&lt;/p&gt;&#xA;&lt;p&gt;# CREATE TABLE する際に ENGINE=InnoDB の指定をしなくてもInnoDBにする&lt;/p&gt;&#xA;&lt;p&gt;default-table-type = InnoDB&lt;/p&gt;&#xA;&lt;p&gt;# クライアント/サーバがやり取りすることのできるパケットサイズを指定&lt;/p&gt;&#xA;&lt;p&gt;# 巨大なデータをやり取りする場合は指定した方がよい&lt;/p&gt;&#xA;&lt;p&gt;max_allowed_packet = 16M&lt;/p&gt;&#xA;&lt;p&gt;# MyISAMで使用するINDEXのキャッシュサイズ&lt;/p&gt;&#xA;&lt;p&gt;key_buffer = 64M&lt;/p&gt;&#xA;&lt;p&gt;# スレッドのスタック領域のサイズ&lt;/p&gt;&#xA;&lt;p&gt;thread_stack = 128K&lt;/p&gt;&#xA;&lt;p&gt;# 生成されたコネクション用のスレッドをキャッシュしておく数&lt;/p&gt;&#xA;&lt;p&gt;thread_cache_size = 16&lt;/p&gt;&#xA;&lt;p&gt;# 最大同時接続数。メモリ搭載量にもよるが100〜300ぐらいが良いらしい&lt;/p&gt;&#xA;&lt;p&gt;max_connections = 150&lt;/p&gt;&#xA;&lt;p&gt;# MyISAMで一度開いたテーブルをキャッシュしておく数&lt;/p&gt;&#xA;&lt;p&gt;table_cache = 128&lt;/p&gt;&#xA;&lt;p&gt;# 同時に実行できるスレッド数。CPUのコア数の2倍を設定&lt;/p&gt;&#xA;&lt;p&gt;thread_concurrency = 2&lt;/p&gt;&#xA;&lt;p&gt;# query cacheの設定&lt;/p&gt;&#xA;&lt;p&gt;# 0: OFF, 1:ON, 2:DEMAND&lt;/p&gt;&#xA;&lt;p&gt;query_cache_type = 1&lt;/p&gt;&#xA;&lt;p&gt;# キャッシュするクエリ結果の最大サイズ&lt;/p&gt;&#xA;&lt;p&gt;query_cache_limit = 1M&lt;/p&gt;&#xA;&lt;p&gt;# クエリキャッシュに割り当てるメモリ量&lt;/p&gt;&#xA;&lt;p&gt;query_cache_size = 16M&lt;/p&gt;&#xA;&lt;p&gt;# slow logの設定&lt;/p&gt;&#xA;&lt;p&gt;log_slow_queries = /var/log/mysql/mysql-slow.log&lt;/p&gt;&#xA;&lt;p&gt;# 3秒以上かかったクエリは上記ログファイルに出力&lt;/p&gt;&#xA;&lt;p&gt;long_query_time = 3&lt;/p&gt;&#xA;&lt;p&gt;# ここからレプリケーションの設定&lt;/p&gt;&#xA;&lt;p&gt;# MySQLサーバごとに固有のID&lt;/p&gt;&#xA;&lt;p&gt;server-id = 1&lt;/p&gt;&#xA;&lt;p&gt;# バイナリログ出力先&lt;/p&gt;&#xA;&lt;p&gt;log_bin = /var/log/mysql/mysql-bin.log&lt;/p&gt;&#xA;&lt;p&gt;# データ書き込み(トランザクションのコミット)を何回行ったらバイナリログを&lt;/p&gt;&#xA;&lt;p&gt;# フラッシュするかの回数。0の場合はデータ書き込みがあってもバイナリログをフラッシュしない&lt;/p&gt;&#xA;&lt;p&gt;sync_binlog = 0&lt;/p&gt;&#xA;&lt;p&gt;# バイナリログを保持しておく日数&lt;/p&gt;&#xA;&lt;p&gt;expire_logs_days = 60&lt;/p&gt;&#xA;&lt;p&gt;# バイナリログの1ファイルあたりの最大サイズ&lt;/p&gt;&#xA;&lt;p&gt;max_binlog_size = 1024M&lt;/p&gt;&#xA;&lt;p&gt;# バイナリログを出力する対象のDB&lt;/p&gt;&#xA;&lt;p&gt;binlog_do_db = hoge&lt;/p&gt;&#xA;&lt;p&gt;# バイナリログの出力対象外とするDB&lt;/p&gt;&#xA;&lt;p&gt;binlog_ignore_db = mysql information_schema&lt;/p&gt;&#xA;&lt;p&gt;# Berkley DBは使わない&lt;/p&gt;&#xA;&lt;p&gt;skip-bdb&lt;/p&gt;&#xA;&lt;p&gt;# InnoDBのデータファイルの名前とどのぐらいで自動拡張するか&lt;/p&gt;&#xA;&lt;p&gt;innodb_data_file_path = ibdata1:128M:autoextend&lt;/p&gt;&#xA;&lt;p&gt;# テーブルごとに.ibdのデータファイルを作成するかどうか&lt;/p&gt;&#xA;&lt;p&gt;innodb_file_per_table = 1&lt;/p&gt;&#xA;&lt;p&gt;# InnoDBの内部データなどを保持するための領域&lt;/p&gt;&#xA;&lt;p&gt;innodb_additional_mem_pool_size = 20M&lt;/p&gt;&#xA;&lt;p&gt;# InnoDBのデータやインデックスをキャッシュするためのメモリ上の領域&lt;/p&gt;&#xA;&lt;p&gt;# DBサーバ専用のマシンの場合はメモリの50%-80%を指定&lt;/p&gt;&#xA;&lt;p&gt;innodb_buffer_pool_size = 256M&lt;/p&gt;&#xA;&lt;p&gt;# InnoDBの更新ログを記録するメモリ上の領域&lt;/p&gt;&#xA;&lt;p&gt;innodb_log_buffer_size = 8M&lt;/p&gt;&#xA;&lt;p&gt;# InnoDBの更新ログを記録するディスク上のファイルのサイズ&lt;/p&gt;&#xA;&lt;p&gt;# 大きくするとパフォーマンスはあがるがクラッシュ時のリカバリに時間がかかるようになる&lt;/p&gt;&#xA;&lt;p&gt;innodb_log_file_size = 64M&lt;/p&gt;&#xA;&lt;p&gt;# データをファイルに書き込む際のメソッド。&lt;/p&gt;&#xA;&lt;p&gt;# Linuxの場合は O_DIRECTがパフォーマンス的にはよい&lt;/p&gt;&#xA;&lt;p&gt;innodb_flush_method = O_DIRECT&lt;/p&gt;&#xA;&lt;p&gt;# InnoDBのログバッファをInnoDBログファイルに書き込むタイミングを決める&lt;/p&gt;&#xA;&lt;p&gt;# 基本的には1&lt;/p&gt;&#xA;&lt;p&gt;innodb_flush_log_at_trx_commit = 1&lt;/p&gt;&#xA;&lt;p&gt;# 2相コミットを行うかどうか&lt;/p&gt;&#xA;&lt;p&gt;innodb_support_xa = OFF&lt;/p&gt;&#xA;&lt;p&gt;# クラッシュ対策としてデータの二重書き込みを無効にする&lt;/p&gt;&#xA;&lt;p&gt;skip-innodb_doublewrite&lt;/p&gt;&#xA;&lt;p&gt;innodb_で始まるInnoDB関連の設定項目の詳細については&lt;a href=&#34;http://www.klab.jp/media/mysql/index3.html&#34;&gt;MySQL5開拓団 ストレージエンジンの吟味 (2)&lt;/a&gt;にとても詳しく載っているので一読してみた方がよいです。あとは&lt;a href=&#34;http://dsas.blog.klab.org/archives/50860867.html&#34;&gt;DSAS開発者の部屋:5分でできる、MySQLのメモリ関係のチューニング！&lt;/a&gt;も非常に参考になるでしょう。MySQLの設定はなかなか奥が深いですが、設定項目の意味を理解していればよいパフォーマンスを引き出せると思います。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>WordPressに関連する投稿を表示するSimilar Postsプラグインを入れてみた</title>
				<link>https://journal.lampetty.net/posts/wp/156/</link>
				<pubDate>Mon, 12 Jan 2009 16:01:32 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/156/</guid>
				<description>&lt;p&gt;WordPressで現在表示している投稿に関連するものを自動で抽出して表示するプラグインである&lt;a href=&#34;http://rmarsh.com/plugins/similar-posts/&#34;&gt;Similar Posts&lt;/a&gt;を入れてみました。インストールは、このプラグインが必要とする&lt;a href=&#34;http://rmarsh.com/plugins/post-plugin-library/&#34;&gt;Post Plugin Library&lt;/a&gt;というものが必要なので、これもあわせてダウンロードしていつものようにwp-content/plugins/ に放り込んで管理画面から有効化するだけです。あとは管理画面で表示する投稿の数を設定したり、カテゴリをこえて関連する投稿を表示するかなどの設定をします。&lt;/p&gt;&#xA;&lt;p&gt;中身はPHPよくわからないのでほとんど知らないのですが、このプラグインをインストールするとどうやら wp_similar_posts, wp_term_relationships, wp_term_taxonomy などのテーブルができていて、現在の投稿に関連する情報を保存しているようです。で、投稿を表示するときに表示スピードが遅くなったりしないか少し気になったのですが、プラグインを無効にした状態と有効にした状態で差異がありませんでした(どちらでも1.4秒程度)。というわけで安心して使えそうです。&lt;/p&gt;&#xA;&lt;p&gt;それにしても最近WordPressの話ばかりだなぁ...&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>WordPressに All in One SEO Pack を入れてみた</title>
				<link>https://journal.lampetty.net/posts/wp/131/</link>
				<pubDate>Sun, 11 Jan 2009 04:01:44 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/131/</guid>
				<description>&lt;p&gt;WordPressでのSEO対策の定番らしい&lt;a href=&#34;http://wp.uberdose.com/2007/03/24/all-in-one-seo-pack/&#34;&gt;All in One SEO Pack&lt;/a&gt;。これを入れると&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;TOPページにmetaタグのkeywordsやdescriptionが設定できる&lt;/li&gt;&#xA;&lt;li&gt;記事ごとにmetaタグのkeywordsやdescriptionが設定できる&lt;/li&gt;&#xA;&lt;li&gt;それぞれの投稿ページのタイトルを「タイトル | ブログのタイトル」のように設定できる&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;ので入れてみました。インストール自体はお決まりの wp-content/plugins/ に放り込んで管理画面から有効にするだけ。実際に使っていて気になったのが、出力されるmetaタグの位置。テーマによるのかもしれませんが、CSSやJavaScriptの後ろに来ちゃっているのでこれをなんとかしたいです。&lt;/p&gt;&#xA;&lt;p&gt;あと管理画面から設定できるオプションで Use noindex for Categories, Use noindex for Archives っていうのがあるのですが、デフォルトでONになっています。カテゴリやアーカイブの一覧ページでは&lt;/p&gt;&#xA;&lt;meta name=&#34;robots&#34; content=&#34;noindex,follow&#34; /&gt;&#xA;&lt;p&gt;と出力されるのですが、インデックスされなくなっちゃうとSEO的にはマイナスなのではないかと思いました。noindexにしないと逆にspamだと思われちゃったりするのかなぁ。時間があったら本家のドキュメント読んでみたいと思います。FAQのページなどを読んでみましたが特に書いてなかったので謎。&lt;/p&gt;&#xA;&lt;p&gt;なお、導入にあたっては&lt;a href=&#34;http://www.bizmemowp.com/wordpress-biz158&#34;&gt;こちら&lt;/a&gt;を参考にさせてもらいました。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Apacheが出力するServerヘッダを隠す</title>
				<link>https://journal.lampetty.net/posts/wp/124/</link>
				<pubDate>Sat, 10 Jan 2009 11:01:21 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/124/</guid>
				<description>&lt;p&gt;Apacheでは何も設定しないとデフォルトでレスポンスヘッダーに&lt;/p&gt;&#xA;&lt;p&gt;Server: Apache&lt;/p&gt;&#xA;&lt;p&gt;のような情報を残してしまいます。ServerTokens ProductOnly としてもApacheであることは隠せないので、mod_headersを使って&lt;/p&gt;&#xA;&lt;p&gt;Header unset Server&lt;/p&gt;&#xA;&lt;p&gt;とするのが正解なのか一応ぐぐってみたところ、&lt;a href=&#34;http://oshiete1.watch.impress.co.jp/qa4210509.html&#34;&gt;ここ&lt;/a&gt;のような「ソースを修正する」という残念なアドバイスが載っていました。それmod_headersでできるよ！とつっこんであげたかったのですが、解答が締め切られていたのが残念です。&lt;/p&gt;&#xA;&lt;p&gt;ちなみにPHPは何も設定しないと&lt;/p&gt;&#xA;&lt;p&gt;X-Powered-By: PHP/5.2.6-2ubuntu4&lt;/p&gt;&#xA;&lt;p&gt;というようなヘッダーを出してしまうので、これもあわせて&lt;/p&gt;&#xA;&lt;p&gt;Header unset X-Powered-By&lt;/p&gt;&#xA;&lt;p&gt;しておきました。php.iniを修正すればいいらしいのですが、Ubuntuだとどこにあるのか調べるのが面倒だったのでApache側で対処。しかしデフォルトの設定っていうのは本当に怖いなぁと思いました。&lt;/p&gt;&#xA;&lt;p&gt;2009/6/28 追記：Header unset Serverはリバースプロキシの環境でしかunsetできなさそうです。Header set Server hogeのようにして隠すことはできるはずです(未検証ですが)&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>WordPressでFeedのURLを変える</title>
				<link>https://journal.lampetty.net/posts/wp/120/</link>
				<pubDate>Sat, 10 Jan 2009 06:01:11 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/120/</guid>
				<description>&lt;p&gt;もともとFeedBurnerを使っていたので、WordPressが生成するFeedのURLを変えたいと思って色々ぐぐっていたら、&lt;a href=&#34;http://niiyan.s8.xrea.com/blosxom/wordpress/wordpress-feedburner-feedsmith-plugin.htm&#34;&gt;そのままずばりのことを書いている&lt;/a&gt;方がいらっしゃいました。というわけでありがたくそのままやってみると管理画面からFeedのURLを入力するだけで見事変わりました。&lt;/p&gt;&#xA;&lt;p&gt;オリジナルのソースは&lt;a href=&#34;http://www.google.com/support/feedburner/bin/answer.py?answer=78483&amp;amp;topic=13252&#34;&gt;Creating your WordPress feed (self-hosted WordPress)&lt;/a&gt;に書いてあって、FeedBurner自体がこのような情報提供を行っていることにちょっと驚き。WordPressってやはりすごい使われているのですな。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>WordPressでパンくずを表示するプラグイン</title>
				<link>https://journal.lampetty.net/posts/wp/109/</link>
				<pubDate>Sat, 10 Jan 2009 05:01:55 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/109/</guid>
				<description>&lt;p&gt;ユーザビリティ兼SEO対策としてパンくずを表示できるプラグインを探していたところ、&lt;a href=&#34;http://sw-guide.de/wordpress/plugins/breadcrumb-nav-xt/&#34;&gt;Breadcrumb Navigation XT&lt;/a&gt;というのがメジャーらしいのでこれを使ってみました。プラグイン自体はダウンロードしてwp-content/plugins/ に放り込んで管理画面から有効化するだけなのですが、ちょっと面倒なのが現在使用しているテーマのファイルをいじってパンくずを表示したい箇所にコードを挿入しなくてはいけないこと。&lt;/p&gt;&#xA;&lt;?php&#xA;&#xA;if (class\_exists(&#39;breadcrumb\_navigation\_xt&#39;)) {&#xA;&#xA;// new breadcrumb object&#xA;&#xA;$mybreadcrumb = new breadcrumb\_navigation\_xt;&#xA;&#xA;$mybreadcrumb-&gt;opt\[&#39;title\_blog&#39;\] = &#39;おいぬま日報2&#39;;&#xA;&#xA;$mybreadcrumb-&gt;opt\[&#39;singleblogpost\_prefix&#39;\] = &#39;&#39;;&#xA;&#xA;$mybreadcrumb-&gt;opt\[&#39;separator&#39;\] = &#39; &amp;raquo; &#39;;&#xA;&#xA;$mybreadcrumb-&gt;opt\[&#39;singleblogpost\_category\_display&#39;\] = true;&#xA;&#xA;// Display the breadcrumb&#xA;&#xA;$mybreadcrumb-&gt;display();&#xA;&#xA;}&#xA;&#xA;?&gt;&#xA;&lt;p&gt;こんな感じのコードを今使っているテーマのsingle.phpに入れなくてはいけないのですが、自分はテーマのコードをあまり汚したくないので、wp-content/themes/今使っているテーマ/breadcrumb.php というファイルを作ってその中に上記のコードを入れました。&lt;/p&gt;&#xA;&lt;p&gt;で、あとは wp-content/themes/single.php から&lt;/p&gt;&#xA;&lt;div class=&#34;breadcrumb&#34;&gt;&#xA;&lt;?php include(TEMPLATEPATH . &#34;/breadcrumb.php&#34;); ?&gt;&#xA;&lt;/div&gt; &lt;!-- \[breadcrumb\] --&gt;&#xA;&lt;p&gt;を挿入。これでちょっとはすっきりしました。&lt;/p&gt;&#xA;&lt;p&gt;それにしてもプラグインが生成するコードをテーマごとに手作業で入れなくてはいけないなんてイケてない設計のような気が...&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>WordPressに移行しました</title>
				<link>https://journal.lampetty.net/posts/wp/118/</link>
				<pubDate>Fri, 09 Jan 2009 14:01:26 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/118/</guid>
				<description>&lt;p&gt;約5年間使ってきたtDiaryですが、やっぱりイマイチレスポンスが遅いのとWordPressの方が圧倒的に使いやすいのでこちらに移行しました。RSSはFeedBurnerなので今から新しい方が出るように直してます。こういう時には便利なサービスだなぁ。&lt;/p&gt;&#xA;&lt;p&gt;というわけでありがとう&lt;a href=&#34;http://www.tdiary.org/&#34;&gt;tDiary&lt;/a&gt;！よろしく&lt;a href=&#34;http://wordpress.org/&#34;&gt;WordPress&lt;/a&gt;！&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>MySQLでテーブルのコピーを簡単に作る方法</title>
				<link>https://journal.lampetty.net/posts/wp/273/</link>
				<pubDate>Sat, 22 Nov 2008 22:11:18 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/273/</guid>
				<description>&lt;p&gt;hogeテーブルをhoge_20081123というテーブルにコピーする方法。&lt;/p&gt;&#xA;&lt;p&gt;/* hogeテーブルのスキーマをコピーしてテーブル作成 */&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;CREATE TABLE hoge_20081123 LIKE hoge;&#xA;/* hogeテーブルのデータをINSERT */&#xA;INSERT INTO hoge_20081123 SELECT * FROM hoge;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;たまにしかやらないのですが、いっつも忘れているのでメモ。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4873116384/kazzhomeunixo-22/&#34;&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/51li6EcTU%2BL._SL160_.jpg&#34; alt=&#34;実践ハイパフォーマンスMySQL 第3版&#34; loading=&#34;lazy&#34; title=&#34;実践ハイパフォーマンスMySQL 第3版&#34;&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.co.jp/exec/obidos/ASIN/4873116384/kazzhomeunixo-22/&#34;&gt;実践ハイパフォーマンスMySQL 第3版&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;作者: Baron Schwartz,Peter Zaitsev,Vadim Tkachenko,菊池研自(監訳),株式会社クイープ&lt;/li&gt;&#xA;&lt;li&gt;出版社/メーカー: オライリージャパン&lt;/li&gt;&#xA;&lt;li&gt;発売日: 2013/11/25&lt;/li&gt;&#xA;&lt;li&gt;メディア: 大型本&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://d.hatena.ne.jp/asin/4873116384/kazzhomeunixo-22&#34;&gt;この商品を含むブログ (6件) を見る&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>MacBookを買ってからやったことやインストールしたアプリなど</title>
				<link>https://journal.lampetty.net/posts/wp/82/</link>
				<pubDate>Tue, 28 Oct 2008 14:10:29 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/82/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;http://japanese.engadget.com/2008/10/14/macbook-hands-on/&#34;&gt;2008年10月に発売になったアルミボディのMacBook&lt;/a&gt;を買いました。自分にはこれが初めてのMacで右も左もわからないのですが、ひとまずインストールしたソフトや行った設定などをつらつらと書いてみます。&lt;/p&gt;&#xA;&lt;h3 id=&#34;インストールしたアプリ&#34;&gt;インストールしたアプリ&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://mozilla.jp/firefox/&#34;&gt;Firefox&lt;/a&gt; : Safariでもよいのですがやはりアドオンの豊富さが魅力。ちなみに私のインストールしているアドオンは&lt;a href=&#34;http://diary.lampetty.net/20080620.html&#34;&gt;こちら&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.videolan.org/vlc/&#34;&gt;VLC&lt;/a&gt; : DVDや動画の再生プレーヤー&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://perian.org/&#34;&gt;Perian&lt;/a&gt;: QuickTimeで様々な動画フォーマットを再生できるようにするためのCodecs。DivX, AVI, ms-mpeg4, FLVなどをサポートしています。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://wakaba.c3.cx/s/apps/unarchiver.html&#34;&gt;The Unarchiver&lt;/a&gt; : アーカイブの解凍用ソフト。tar.gz, tar.bz2, rar, zip, lzhなどに対応しています。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.blacktree.com/&#34;&gt;QuickSilver&lt;/a&gt; : アプリケーションランチャー。というには機能が豊富過ぎで、これを使いこなせるようになればDockからアプリケーションの起動の頻度が落ちることは間違いなし。キーを入力してくれると候補を出してくれるのですがそのセンスが素晴らしいです。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;iAntiVirus : その名の通りアンチウィルスソフト。無料です。どこまで検知してくれるのかは未知数...&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.neooffice.org/neojava/ja/index.php&#34;&gt;NeoOffice&lt;/a&gt; : OpenOfficeをMac向けに改良したオフィススイート。ただしインストールしてから未使用。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.vmware.com/jp/products/fusion/&#34;&gt;VMware Fusion&lt;/a&gt; : Mac用のVMware。有償ですがVMware本家からだと10,900円ぐらいで購入できます(本家からダウンロード版を買うのが一番安い)。仮想マシンは他のVMware製品と互換性があります。Windowsを入れるとMacから直接Excelを開けたりします。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://homepage.mac.com/zenitani/emacs-j.html&#34;&gt;Carbon Emacs&lt;/a&gt; : Mac用のGUI版Emacs。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.pqrs.org/tekezo/macosx/keyremap4macbook/index.html.ja&#34;&gt;KeyRemap4MacBook&lt;/a&gt; : Commandキーなどのキーを好きなように割り当てられるツール。Emacsで辛いので、自分はこれでfnキーをControlにしています。それ以外でも英数記号以外の全てのキーの設定をいじれるのでカスタマイズし放題です。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://developer.apple.com/jp/products/online.html&#34;&gt;Xcode&lt;/a&gt; : 開発ツール。GCCとかmakeとかソースのコンパイルに必要なものが色々入っています。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.macports.org/&#34;&gt;MacPorts&lt;/a&gt; : パッケージ管理システム。Linuxでいうところのaptやyumみたいなもの。4400以上のパッケージがあるそうです。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://metaquark.de/appfresh/&#34;&gt;AppFresh&lt;/a&gt; : インストールされているアプリが最新版かをチェックして必要であればインストールまでしてくれるもの。アプリケーションによっては自動インストールがうまくいかない場合もあるのですが、それでも最新版が出ていることを知らせてくれるので、常に最新にしておきたい人にはお勧めです。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.freemacsoft.net/AppCleaner/&#34;&gt;AppCleaner&lt;/a&gt;：インストールしたアプリケーションを綺麗にアンインストールしてくれるアプリケーションです。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://toolbar.google.com/gmail-helper/notifier_mac.html&#34;&gt;Google Notifier&lt;/a&gt;：Gmailでメッセージを受信した時に通知してくれるアプリケーションです。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;覚えている限りの行った設定&#34;&gt;(覚えている限りの)行った設定&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Spacesを使えるようにして、Space2にVMwareを専用で割り&lt;/li&gt;&#xA;&lt;li&gt;spotlightのキーはCommand+Space&lt;/li&gt;&#xA;&lt;li&gt;Growl(イベント通知)を有効に&lt;/li&gt;&#xA;&lt;li&gt;システム環境設定→共有→リモートログインを有効に&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;とりあえずこんなところですがまた何か思い出したら追記していこうと思います。ちなみに以下のサイトを参考にさせてもらいました。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://d.hatena.ne.jp/HolyGrail/20080826/1219773234&#34;&gt;MacBook Air 再インストール物語 第3回 「OSX設定完了後のアプリケーション再インストール」&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.pqrs.org/tekezo/macosx/doc/unix/index.html&#34;&gt;UNIX 狂が使う Mac OS X (Leopard編)&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://veadardiary.blog29.fc2.com/&#34;&gt;Macの手書き説明書&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>Perlでパッケージに定義されているメソッドを出力する</title>
				<link>https://journal.lampetty.net/posts/wp/274/</link>
				<pubDate>Tue, 14 Mar 2006 15:03:52 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/274/</guid>
				<description>&lt;p&gt;Perlであるパッケージに定義されているメソッドを調べたい場合は、シンボルテーブル(%パッケージ名::)をダンプしてやればオッケーなようです。例えばClass::Accessorのシンボルテーブルをダンプするには下記のように書けばOK。&lt;/p&gt;&#xA;&lt;p&gt;$ perl -MClass::Accessor -MData::Dumper -e &#39;print Dumper(%Class::Accessor::)&#39;&lt;/p&gt;&#xA;&lt;p&gt;$VAR1 = {&lt;/p&gt;&#xA;&lt;p&gt;&#39;__ANON__&#39; =&amp;gt; *Class::Accessor::__ANON__,&lt;/p&gt;&#xA;&lt;p&gt;&#39;mk_wo_accessors&#39; =&amp;gt; *Class::Accessor::mk_wo_accessors,&lt;/p&gt;&#xA;&lt;p&gt;&#39;mk_accessors&#39; =&amp;gt; *Class::Accessor::mk_accessors,&lt;/p&gt;&#xA;&lt;p&gt;&#39;make_ro_accessor&#39; =&amp;gt; *Class::Accessor::make_ro_accessor,&lt;/p&gt;&#xA;&lt;p&gt;&#39;mk_ro_accessors&#39; =&amp;gt; *Class::Accessor::mk_ro_accessors,&lt;/p&gt;&#xA;&lt;p&gt;&#39;BEGIN&#39; =&amp;gt; *Class::Accessor::BEGIN,&lt;/p&gt;&#xA;&lt;p&gt;&#39;_mk_accessors&#39; =&amp;gt; *Class::Accessor::_mk_accessors,&lt;/p&gt;&#xA;&lt;p&gt;&#39;get&#39; =&amp;gt; *Class::Accessor::get,&lt;/p&gt;&#xA;&lt;p&gt;&#39;new&#39; =&amp;gt; *Class::Accessor::new,&lt;/p&gt;&#xA;&lt;p&gt;&#39;set&#39; =&amp;gt; *Class::Accessor::set,&lt;/p&gt;&#xA;&lt;p&gt;&#39;_carp&#39; =&amp;gt; *Class::Accessor::_carp,&lt;/p&gt;&#xA;&lt;p&gt;&#39;make_wo_accessor&#39; =&amp;gt; *Class::Accessor::make_wo_accessor,&lt;/p&gt;&#xA;&lt;p&gt;&#39;import&#39; =&amp;gt; *Class::Accessor::import,&lt;/p&gt;&#xA;&lt;p&gt;&#39;make_accessor&#39; =&amp;gt; *Class::Accessor::make_accessor,&lt;/p&gt;&#xA;&lt;p&gt;&#39;VERSION&#39; =&amp;gt; *Class::Accessor::VERSION,&lt;/p&gt;&#xA;&lt;p&gt;&#39;_croak&#39; =&amp;gt; *Class::Accessor::_croak&lt;/p&gt;&#xA;&lt;p&gt;};&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://search.cpan.org/dist/Devel-Symdump/lib/Devel/Symdump.pm&#34;&gt;Devel::Symdump&lt;/a&gt;を使うとサブルーチンだったりスカラー変数などを区別することが可能です。まじめにシンボルテーブルを参照するようなプログラムであればこれを使った方が楽かもしれません。&lt;/p&gt;&#xA;&lt;p&gt;$ perl -MDevel::Symdump -MClass::Accessor -MData::Dumper -e &#39;print Dumper([ Devel::Symdump-&amp;gt;new(&amp;quot;Class::Accessor&amp;quot;)-&amp;gt;functions ])&#39;&lt;/p&gt;&#xA;&lt;p&gt;$VAR1 = [&lt;/p&gt;&#xA;&lt;p&gt;&#39;Class::Accessor::mk_accessors&#39;,&lt;/p&gt;&#xA;&lt;p&gt;&#39;Class::Accessor::mk_wo_accessors&#39;,&lt;/p&gt;&#xA;&lt;p&gt;&#39;Class::Accessor::accessor_name_for&#39;,&lt;/p&gt;&#xA;&lt;p&gt;&#39;Class::Accessor::make_ro_accessor&#39;,&lt;/p&gt;&#xA;&lt;p&gt;&#39;Class::Accessor::mk_ro_accessors&#39;,&lt;/p&gt;&#xA;&lt;p&gt;&#39;Class::Accessor::get&#39;,&lt;/p&gt;&#xA;&lt;p&gt;&#39;Class::Accessor::_mk_accessors&#39;,&lt;/p&gt;&#xA;&lt;p&gt;&#39;Class::Accessor::best_practice_accessor_name_for&#39;,&lt;/p&gt;&#xA;&lt;p&gt;&#39;Class::Accessor::new&#39;,&lt;/p&gt;&#xA;&lt;p&gt;&#39;Class::Accessor::set&#39;,&lt;/p&gt;&#xA;&lt;p&gt;&#39;Class::Accessor::best_practice_mutator_name_for&#39;,&lt;/p&gt;&#xA;&lt;p&gt;&#39;Class::Accessor::_carp&#39;,&lt;/p&gt;&#xA;&lt;p&gt;&#39;Class::Accessor::mutator_name_for&#39;,&lt;/p&gt;&#xA;&lt;p&gt;&#39;Class::Accessor::make_wo_accessor&#39;,&lt;/p&gt;&#xA;&lt;p&gt;&#39;Class::Accessor::follow_best_practice&#39;,&lt;/p&gt;&#xA;&lt;p&gt;&#39;Class::Accessor::make_accessor&#39;,&lt;/p&gt;&#xA;&lt;p&gt;&#39;Class::Accessor::_croak&#39;&lt;/p&gt;&#xA;&lt;p&gt;];&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>転職活動日記</title>
				<link>https://journal.lampetty.net/posts/wp/career-change-2005/</link>
				<pubDate>Mon, 08 Aug 2005 16:08:54 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/career-change-2005/</guid>
				<description>&lt;p&gt;2005年の7月頭から約1ヶ月間転職活動をしていました。20代半ばのエンジニアだと転職適齢期だと思いますが、同年代の、同じように転職を考えている方の役に立てばと思いその内容を記録しておいたページです。&lt;/p&gt;&#xA;&lt;p&gt;転職活動中に感じたことや得た教訓などを日記形式でざっくばらんに書いています。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://journal.lampetty.net/tech/index.php/archives/5&#34;&gt;私の履歴書&lt;/a&gt; - 個人情報を除いた簡単な履歴書です。&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://journal.lampetty.net/tech/index.php/archives/69&#34;&gt;応募した会社&lt;/a&gt; - 今回の転職活動で受けた会社を簡単に説明しています。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;転職日記&#34;&gt;転職日記&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://journal.lampetty.net/tech/index.php/archives/date/2005/06&#34;&gt;2005年6月の日記&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://journal.lampetty.net/tech/index.php/archives/date/2005/07&#34;&gt;2005年7月の日記&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://journal.lampetty.net/tech/index.php/archives/date/2005/08&#34;&gt;2005年8月の日記&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;転職活動を振り返ってみて&#34;&gt;転職活動を振り返ってみて&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://journal.lampetty.net/tech/index.php/archives/71&#34;&gt;こちら&lt;/a&gt;を参照してください。内定率50%ということでなかなかの好成績だったと思います。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>今回の転職活動の実績</title>
				<link>https://journal.lampetty.net/posts/wp/71/</link>
				<pubDate>Thu, 04 Aug 2005 14:08:50 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/71/</guid>
				<description>&lt;p&gt;今回の転職活動を振り返ってみると...&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;応募した会社の数: 10&lt;/li&gt;&#xA;&lt;li&gt;選考途中で辞退した会社の数: 3&lt;/li&gt;&#xA;&lt;li&gt;内定をもらった会社の数: 5&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;でした。こうしてみると、内定率50%でなかなか好成績のように見えます。でも、就職活動って別に何個内定もらったかなんてはっきり言ってどうでもいいと思うんですよ。自分が本当に行きたい会社から内定もらえれば。それにせっかく採用通知を出してもらったのに、それを断るのはやっぱり心苦しいです。&lt;/p&gt;&#xA;&lt;p&gt;なので、今就職活動中の人でこのページを読んでもらっている人に言いたいのは「本当に行きたいと思った会社だけ受けろ」です。行きたくもない会社に(嘘の志望動機とか書いて)応募して内定もらっても、最後にはお互い嫌な思いするだけだと思います。実際私も最初は「とりあえず保険として内定欲しい」みたいな軽い気持ちで色んな会社に応募してましたが、そういう会社に対する自己PRとか志望動機ってやっぱり熱意がないんですよね。そんな熱意のないものに対して「まぁいっか、採用」とか言っちゃってくれる会社もどうかと思いますし...っちゅうことで、まずは一番気になる会社から怖じけずガンガン受けましょう。もしそこがダメだったら違う会社も見てみましょう～。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>今回の転職活動にて応募した会社</title>
				<link>https://journal.lampetty.net/posts/wp/69/</link>
				<pubDate>Wed, 03 Aug 2005 16:08:11 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/69/</guid>
				<description>&lt;h3 id=&#34;ターゲットの業界業種&#34;&gt;ターゲットの業界、業種&lt;/h3&gt;&#xA;&lt;p&gt;今までは主に業務系のシステムを作ることが多かったのですが、やっぱり一般ユーザが使うようなサービスを構築する方が自分のアイデアが生かせるし、その分やりがいもあるし、ユーザの意見とかもダイレクトに聞けるし、ということでBtoC向けのサービスを提供している会社を中心に選考を受けました。具体的には下記の会社たちです。&lt;/p&gt;&#xA;&lt;h3 id=&#34;受けた会社順不同&#34;&gt;受けた会社(順不同)&lt;/h3&gt;&#xA;&lt;p&gt;企業イメージを下げる、または企業秘密を暴露するようなことは書いていませんが、会社名は一応イニシャルにしてあります。&lt;/p&gt;&#xA;&lt;h4 id=&#34;株式会社tol&#34;&gt;株式会社TOL&lt;/h4&gt;&#xA;&lt;p&gt;大手レンタル業者のITサービス会社。よく半額クーポンのメールを送ってきます。Perlが得意らしい。応募フォームみたいなところから応募したのですが、誤って編集途中で送信してしまい、見事書類選考で落ちました...&lt;/p&gt;&#xA;&lt;h4 id=&#34;ecj株式会社&#34;&gt;ECJ株式会社&lt;/h4&gt;&#xA;&lt;p&gt;Webサイト構築の受託開発を行っている。SEO対策やコンテンツ管理の自社製品を作っているようだ。軽い気持ちで応募フォームから情報を送信したら、とても難しげな課題を出されました。その時点ではそんなことをやっている暇がなかったのと、軽い気持ちだったのでパス。&lt;/p&gt;&#xA;&lt;h4 id=&#34;株式会社kee&#34;&gt;株式会社KEE&lt;/h4&gt;&#xA;&lt;p&gt;大手からサイト構築の受託開発を行っている小さな会社(社員数10人ぐらい)。Webデザインも開発もこなす。Linux,FreeBSD,Perl,PostgreSQLなどオープンソースが得意みたい。&lt;/p&gt;&#xA;&lt;h4 id=&#34;yah株式会社&#34;&gt;YAH株式会社&lt;/h4&gt;&#xA;&lt;p&gt;もはや説明不要のNo.1ポータルサイト。1999年頃と比べるともはや大企業と化しています。&lt;/p&gt;&#xA;&lt;h4 id=&#34;exc株式会社&#34;&gt;EXC株式会社&lt;/h4&gt;&#xA;&lt;p&gt;これもポータルサイトを運営している会社。YAHと比べるとそのサービスの質はやはりどこか見劣りしている。KDDIと組んでBREWアプリを色々開発しているらしい。&lt;/p&gt;&#xA;&lt;h4 id=&#34;nem株式会社&#34;&gt;NEM株式会社&lt;/h4&gt;&#xA;&lt;p&gt;東京八重洲付近にあるベンチャー会社。ユニシスをスピンアウトした社長さん率いる、プロジェクト型ベンチャー企業。やっていることや言っていることはとても面白かったです。規模は社員数30名ぐらい。&lt;/p&gt;&#xA;&lt;h4 id=&#34;hic株式会社&#34;&gt;HIC株式会社&lt;/h4&gt;&#xA;&lt;p&gt;価格.comのような価格の比較を行うサイトを運営している会社。社員数15名程度ですが、これから急成長する予定だそうです。話を聞いた限り本当に急成長しそうな感じでした。開発言語はPHP。&lt;/p&gt;&#xA;&lt;h4 id=&#34;itc株式会社&#34;&gt;ITC株式会社&lt;/h4&gt;&#xA;&lt;p&gt;IT関連のニュースサイトを運営している会社。実際は親会社のAERが何もかも仕切っていそうな雰囲気。&lt;/p&gt;&#xA;&lt;h4 id=&#34;gmm株式会社&#34;&gt;GMM株式会社&lt;/h4&gt;&#xA;&lt;p&gt;最近(2005年6月)に東証一部上場した、社長さんが有名なインターネット会社の子会社。渋谷セルリアンタワーのオフィス受付は「結婚式場？」と思うぐらいの華やかさです。&lt;/p&gt;&#xA;&lt;h4 id=&#34;株式会社emc&#34;&gt;株式会社EMC&lt;/h4&gt;&#xA;&lt;p&gt;色んな意味で今回一番お世話になった会社。某転職サイトやシェアNo.1のSNSサイトを運営しているベンチャー企業です。ここも開発はもっぱらPerlらしい。週間ダイヤモンドの7/23号に社長さんのコメントが出ていましたね。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>決断の日</title>
				<link>https://journal.lampetty.net/posts/wp/67/</link>
				<pubDate>Wed, 03 Aug 2005 14:08:56 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/67/</guid>
				<description>&lt;p&gt;今日はYAHの最終面接だったのですが、昨日の時点でもうEMCに決めてしまっていたので、最終面接を辞退する旨のメールを送りました。やっぱりドタキャンは良くないかなと思ったのですが、もはやYAHで働く自分を想像できなかったのでどうせ最終を受けても落ちそうな予感がしたんですよね。もう１回志望動機なんて言わせられたら、それはもはや嘘になってしまうわけですし。大手なので私一人が入らなくったって別に困るわけでもないでしょうしね。&lt;/p&gt;&#xA;&lt;p&gt;というわけで、EMCのTさんに「御社に決めました」メールを送って入社日なんかを調整。結局1週間後の8/10(水)から勤務になりました。その他、内定を貰っていたGMMには辞退のメールを丁寧に書いて送りました。以上、これにて転職活動終了です！&lt;/p&gt;&#xA;&lt;p&gt;長いようで短かった転職活動期間兼夏休み、色んな人/会社の話を聞いてとても刺激になりましたし、楽しかったです。それに職務経歴書を書くと今までの経験の棚卸しが出来るので、自分を客観的に見つめ直すことが出来ました。特に今回の転職活動では特に意地の悪い会社なんかに当たることもなく、戦績がボロボロというわけでもなかったので割とストレスなく進められたかなとも思いました。&lt;/p&gt;&#xA;&lt;p&gt;就職活動においては内定がゴールです。しかしその会社で働くという意味では、まだスタート地点に立ったただけなので「この会社でやっていけるのか」などの不安が当然あります。でも、これだけの時間をかけて選んだ会社なのだから、「ここで頑張って結果を残そう」と改めて決心しました。そういう意味でEMCが働き甲斐のある会社だといいなぁ。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>最後の一押し</title>
				<link>https://journal.lampetty.net/posts/wp/64/</link>
				<pubDate>Tue, 02 Aug 2005 10:08:18 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/64/</guid>
				<description>&lt;p&gt;今日はEMCで社長さんと面談です。もう選考自体は終わっていて、単に私からのリクエストで実現した対談(?)なのですが、「選考とは無関係」と頭ではわかっていてもやっぱり緊張はしました(^^; (この社長さんはITニュースとかビジネス誌によく出ていらっしゃるので)&lt;/p&gt;&#xA;&lt;p&gt;社長さんへの私からの質問は「同じぐらいの時期にサイバーエージェントやオンザエッヂ(現ライブドア)が設立されていて、今ではとても大きな会社に成長しているのに、なぜ御社はそうならなかったのでしょうか？何か理由があったのでしょうか？」ということでした。それに対する解答は「サイバーエージェントやライブドアは比較的&amp;quot;なんでもかんでも&amp;quot;やろうとしているけど、ウチは事業の柱をしっかり決めて取り組んでいるので成長の仕方がやっぱり違うんだと思います。あとはスタートアップ時の従業員数も結構差があったかと。ちなみに&amp;quot;事業を拡大したくない&amp;quot;わけではないです。」でした。なるほど～。ちなみに社長のKさんは写真から想像していたイメージとほぼ同じで、とても落ち着いた雰囲気を出していて安心しました(^^&lt;/p&gt;&#xA;&lt;p&gt;その他、1次面接からずっとお相手をしてもらっていたTさんから、給与などの条件面での話をしてもらい(GMMよりは安かった...)、さらには今後の事業展開(とっても企業秘密)についてのお話も頂きました。&lt;/p&gt;&#xA;&lt;p&gt;話が終わった後は、これから働くことになるであろうEMCの職場を見学させてもらいました。っていうか「おいぬまさんの席はここです！」って実際の席まで案内してもらいました。自分の席の近くの人を簡単に紹介してもらってから、今後一緒に仕事をすることになるであろうメンバー(最終面接のメンバー)で食事に向かうことに。ちなみにEMCには社長席みたいなものはなく、Kさんが窓際で普通の席に座っているのが印象的でした。&lt;/p&gt;&#xA;&lt;p&gt;食事は私の希望を聞いてもらって「和食」になっていたので、一瞬高級料亭かと思われるような和食屋さんに連れていってもらいました。まずは普通に乾杯したあと、選考途中のYAHの話に始まり、「彼女いるんですか？」から話が始まってmixiのマイミクの仕様の話になり、もはや&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;ただの飲み会&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;でした(笑)。まぁ面接もはっきり言って雑談だったのでこうなることは予想してたんですが...&lt;/p&gt;&#xA;&lt;p&gt;そんなわけでHICの時と同様、色々ご馳走になってしまいました(お会計もおそらくかなりの額でした...)。でも、一緒に仕事をすることになるであろう人達の人となりがわかったという点では、この食事会の意義は大きかったです。とにかくこれでこの会社に入らなかったら刺されますねきっと。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>7月29日(金)</title>
				<link>https://journal.lampetty.net/posts/wp/62/</link>
				<pubDate>Fri, 29 Jul 2005 13:07:26 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/62/</guid>
				<description>&lt;p&gt;今日は何もないので家でひたすらネットを見ていました...メールチェックしていると、YAHから「8/3に最終面接やります」の案内が来ています。なんか色々と失敗しているにも関わらず、これだけスムーズに次のステップに進んでいることに逆に不安を覚えました...そう言えばYAHで働いている知り合いがいたことを思い出したので、「YAHってどんな会社？働いていて楽しい？」みたいな質問を投げてみました。&lt;/p&gt;&#xA;&lt;p&gt;さらにあれだけのダメダメっぷりにも関わらず、GMMの最終面接はOK、つまり内定を貰いました。給料も今まで提示された中では一番高い(正直、この給与額で第一志望のEMCがちょっと揺らぎましたｗ)!! しかし、この内定の保証期間は8/5までと書かれていて、本当だったらYAHの最終とかEMCの社長面談とか一切合財終わってからどこに行くか決めようと思っていたのに、それが出来なくなりました(少なくともGMMとYAHはこの時点で二者択一)。そんなわけで、EMCの社長面談が8/2(火)にあるので、8/3まで内定に対する返事を待ってほしいと返信しました。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>7月28日(木)</title>
				<link>https://journal.lampetty.net/posts/wp/60/</link>
				<pubDate>Thu, 28 Jul 2005 10:07:22 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/60/</guid>
				<description>&lt;p&gt;最近は新しい会社には手を出していないんで、今週はダイブ暇々な感じです。今日も結局HICを訪問するだけ。ちなみに今日の訪問の目的は内定を辞退することです。あれだけ接待されてかなり心苦しいのですが、やっぱり第一志望のEMCと比較するとこの会社はちょっと微妙でした。PHPってそもそもあんまり好きじゃないですしね...&lt;/p&gt;&#xA;&lt;p&gt;というわけで、社長さんを尋ねてHICのオフィスがある恵比寿へ。ちょっと待たされてから社長さんともう一人幹部の方がみえました。「で、EMCはどうでした？」と聞かれたので「内定をもらいました。今はEMCに行こうと思ってます」と率直に答えました。かなり残念がっていたみたいですが「まぁしょうがないですね」という感じで納得されていました。大人だなぁ...「誰かいい人いたらぜひ紹介して」と言われたのですが、回りではPHP出来る人はいないのですよね...&lt;/p&gt;&#xA;&lt;p&gt;帰り際にこの社長さんが「やっぱり、&amp;quot;他社から内定が出ている&amp;quot;と言われるとこっちも内定を出したくなるのが企業側の心理」とポロッと呟いていました。確かに全然内定の実績のない人を採用するより、1社でも内定を出している人の方が安心できますもんね。というわけで嘘でも「XXからはすでに内定もらっています」とアピールしましょう(コラ)。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>7月27日(水)</title>
				<link>https://journal.lampetty.net/posts/wp/57/</link>
				<pubDate>Wed, 27 Jul 2005 13:07:24 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/57/</guid>
				<description>&lt;p&gt;18:00よりGMMの最終面接です。今日は本部長さんとの面談後、職場見学もさせてくれるとのこと。しかし、どうも風邪を引いてしまったようで&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;すこぶる調子が悪い&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;ことこの上ない感じでした。とりあえず面接前に風邪薬を飲んで行きましたけど。&lt;/p&gt;&#xA;&lt;p&gt;んで、またもやセルリアンタワーなどというけったいな場所の小綺麗な応接室に通され、1次面接の担当者だったSさんが登場。本部長さんはちょっと遅れてくるということで、技術的な雑談をしていました。5分ほど経って&lt;/p&gt;&#xA;&lt;p&gt;本部長のHさんが登場したのですが、この人&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;メチャメチャ渋いナイスガイ&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;でした(笑)。私はゲイではないですが、Hさんのあまりのナイスガイっぷりにかなり動揺して、名刺の受け取り方も間違えてしまうほど(ちなみに私はゲイではないのであしからず...)。とにかく動揺は続き、もはや経歴の説明や自己PRもしどろもどろで自分でも何が言いたいのかよくわからない状態でした...一通りこっちの話が終わると、「BtoBとBtoCのシステムで(システム的に)異なる部分としてどんなことがあると思います？」と質問されました。「アクセス数が読めないこと、ですかねぇ」と答えたらこれは正解だったようです。あと2つ、と言われたのですが、これ以上はわからなかったのでギブアップすると、「セキュリティ」と「(エンドユーザのOSやブラウザなどに)制限がないこと」だと教えてもらいました。なるほど。有名なサイトになるとかなりの腕のクラッカーが侵入を試みて来るのだとか(有名サイトじゃなくてもクラッカーは来ますけどね...)。&lt;/p&gt;&#xA;&lt;p&gt;んで後は何を喋ったか覚えてないのですが(風邪引いてたんで)、穏やかに面接は終わり、Sさんに案内されて職場を見学させてもらうことに。オフィスは面接をしたフロアとは違うのでエレベータで移動です。そして、もし入社したら仲間になるであろう開発チームの面々を紹介してもらいました。中には耳にヘッドフォンして仕事をしている人もいて「何かわかんないことがあっても質問しにくそう」な雰囲気を醸し出しています。でも基本的にはみなさんいい人そうでした。見学して感じたのは、受付のある階と違って働くところはいたって普通の、どこにでもあるオフィスだということ。おかげでちょっと安心しました(^^&lt;/p&gt;&#xA;&lt;p&gt;とにかく体調が悪かったのと、心はやっぱり第一志望のEMCだったのであまり深入りはせずに帰ってきました(笑)。しかし今日ほどボロボロだった面接は今までなかったんじゃなかろうか。そのぐらいのダメダメっぷりでした。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>7月26日(火)</title>
				<link>https://journal.lampetty.net/posts/wp/55/</link>
				<pubDate>Tue, 26 Jul 2005 11:07:19 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/55/</guid>
				<description>&lt;p&gt;18:30よりYAHの2次面接でした。人事の人も含めて相手は合計4人。そのうちの2人はYメール部門と乗り換え案内なんかのサービスをやっている部門の偉い人みたいでした。&lt;/p&gt;&#xA;&lt;p&gt;1次面接と同様に、今までの経歴を簡潔に話してから質疑応答に。「今までやってきたプロジェクトの中で、具体的に何かツールを使って効率化を図ったような例はありますか？」と聞かれ、某プロジェクトでAntを(ほぼ独善的に)導入したことを話しました。「Yメールは全部C++で出来てるんだけど、そこら辺の経験は大丈夫？」と聞かれましたが、一応経験はあるので(心の声：半年だけですけどね)大丈夫ですよと解答。そういえばYAHはC/C++の独自フレームワークがあるという話をどこかで聞いたような。「そう言えばYメールって最近携帯にも対応しましたよね～」と近況的な話題も振ってみました。そういえば携帯のiアプリなんかも同じYメール部門で作ってるのかどうか聞くの忘れた！&lt;/p&gt;&#xA;&lt;p&gt;そんな感じで、正味20分ぐらいで面接は終了です。今日は遅刻もしなかったし(当たり前)、1次面接よりはハキハキ答えられたと思います。面接のしょっぱなは緊張ムードでしたが、次第に面接官の方も和んできてくれて最後の方はかなりリラックスした雰囲気になっていたのもまぁ良かったんじゃないかと。自分自身にある程度の自信があれば、会話の主導権をこっちが握ってしまった方が楽なんじゃないかと感じました。&lt;/p&gt;&#xA;&lt;p&gt;家に帰ってメールを見ると、先週接待されたHICから「今週のどこかでお話出来ませんか」というメールが来ていてので、7/28(木)でアポを取りました。そういえばこの会社には「EMCが第一志望」と伝えてあったので、HICからの内定をどうするのか知りたいのだろうと推測。EMCから一応内定はもらっているので、HICはキッパリ断ろうと思います。接待の時にケッコウ飲み喰いしたんで非常に心が痛みますが...&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>まさかの書類選考通過のメール</title>
				<link>https://journal.lampetty.net/posts/wp/53/</link>
				<pubDate>Fri, 22 Jul 2005 13:07:49 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/53/</guid>
				<description>&lt;p&gt;夕方ぐらいにメールを見たら、かつての第一志望だったEXCから「書類選考の結果、ぜひ面接したいのですが」というメールが!!&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;つーか、遅すぎ！！&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;書類選考に一体何日かかっているのでしょうか？応募フォームを送信してから約2週間経ってますけど...とにかく今はEMCからすでに内定を貰っている状態なので、「こんなスピードの遅い会社なんかこっちから願い下げよ」みたいな感じで選考辞退のメールを送りました。あと1週間早ければ辞退はしなかったんですけどねぇ...世の中タイミングが大事ってことですな。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>7月21日(木)</title>
				<link>https://journal.lampetty.net/posts/wp/50/</link>
				<pubDate>Thu, 21 Jul 2005 14:07:00 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/50/</guid>
				<description>&lt;p&gt;今日は10時より第一志望のEMCの最終面接です。メンバーはこの前お相手してもらったTさんとエンジニアのリーダーであるKさん、それとエンジニアのTAさんでした。本当は社長さん(よく雑誌載っていたりして結構有名人!)も参加するはずだったらしいのですが、どうやら用事ができてしまったようで不参加。&lt;/p&gt;&#xA;&lt;p&gt;相変わらず雑談っぽい流れでしたが(笑)、話題としては技術的な話が中心でした。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;一番好きなプログラミング言語は何ですか？&lt;/li&gt;&#xA;&lt;li&gt;Perlって大丈夫ですか？&lt;/li&gt;&#xA;&lt;li&gt;尊敬する人はいますか？&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;などなど。あとは他社の選考状況なんかも話したり。そんな感じで今日もあまり内容がない感じであっさり終わってしまいました(笑)。これ本当に最終面接なのでしょうか...&lt;/p&gt;&#xA;&lt;p&gt;家に帰ってメールを見ると昨日のITCから「採用です」とのメールが...うーん、あんな面接一回で決まってしまうなんてはっきり言って技術力さえあれば誰でもよさそうな雰囲気だったので、これは丁重に辞退しました。正直あんまりイメージ良くなかったですし。&lt;/p&gt;&#xA;&lt;p&gt;夜になってから、今日面接に行ったEMCに「やっぱり社長さんと一回話す機会が欲しい」というメールを送りました。そのメールに対して「ウチとしては今日面接に参加した全員が是非入社してほしい」とのことで、社長さんも私に会いたいとのこと。ついでに食事でもしながら(タダ飯!?)今後の事業内容や仕事内容などをざっくばらんに(今までもだいぶざっくばらんだった気が...)話したいとのこと。ということでだいぶ先ですが、8/2(火)にアポを取りました。いやー、それにしても一番好きな会社にフラれなくて良かったです(^^ やっぱりちゃんと就職活動して良かったなと思いました！&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>7月20日(水)</title>
				<link>https://journal.lampetty.net/posts/wp/48/</link>
				<pubDate>Wed, 20 Jul 2005 14:07:42 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/48/</guid>
				<description>&lt;p&gt;今日は夕方からITCの面接なので、履歴書と職務経歴書を用意。あとはひたすらメールの対応に追われていました。まずは昨日1次面接だったEMCから明日10時から最終面接をおこないたいとの連絡。もちろんOKです。それと、7/14に最終面接だったNEMから採用の通知が来ていました。ただ、内定を保証するのが7/24までだったので悩んだ挙句にお断りしました。第一志望であるEMCの結果はたぶん7/24までには出ないだろうと判断したためです。&lt;/p&gt;&#xA;&lt;p&gt;その他、YAHから2次面接の案内が来ていました。1次で思いっきり遅刻したのに、しかも話もしどろもどろだったのに...というわけで7/26にまた六本木ヒルズです。&lt;/p&gt;&#xA;&lt;p&gt;さらに嬉しいことにGMMからも2次面接の案内が来てました。今度は本部長さんと面接だそうで...ちょっと緊張です。つーか派遣とかやっててちゃんとしたキャリアの持ち主ではないのになんでこんなに調子いいんだろうかとか思ってしまったり。しかも私ってそんな人を惹きつけるような人格の持ち主ではないと思うんですよねぇ。自分ではこんな風に思っているので、受けるトコ受けるトコ2次面接まで行ったり内定くれたりするのが本当に不思議でした。もちろんとても嬉しいんですけどね...&lt;/p&gt;&#xA;&lt;p&gt;さて、ITCの面接は18時から赤坂のビルだったので1時間前に出発です。ただし、地図がとてもわかりづらく案の定道に迷いました...色んな人に道を聞いてまたまた時間ギリギリ{{fn &amp;quot;またか...&amp;quot;}}にITCのあるビルに到着。&lt;/p&gt;&#xA;&lt;p&gt;応接室に通され、堅そうなおじさん2名が登場しました。このお二方の雰囲気(フォース?)によって、面接自体も非常に堅い、緊張した空気が流れました。流れとしては、自己紹介(経歴も)→志望理由説明→質疑応答というありふれたパターンでした。ちなみにこのITCという会社はIT系の有名なニュースサイトを運営している会社なのですが、それ以外にも受託開発でさまざまなプロジェクトがあるそうです。私はニュースサイトの運営がやりたいと言っていたのですが、「たぶんそれだけでは済まされない」みたいに言われました。そんなこんなで面接終了。お疲れさまでした。つーか空気が重かったので本当に疲れたよ。この面接の空気と仕事内容から、正直この会社はもはやどうでもよくなりましたとさ。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>7月19日(火)</title>
				<link>https://journal.lampetty.net/posts/wp/46/</link>
				<pubDate>Tue, 19 Jul 2005 14:07:09 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/46/</guid>
				<description>&lt;p&gt;今日も面接3件の過密スケジュール。たぶん今週が山場っぽい。そう言えば第一志望のEXC応募したのにいっこうに連絡が来ませんねぇ。落ちたのかな。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;10時: GMM1次面接＠渋谷&lt;/li&gt;&#xA;&lt;li&gt;13時: EMC1次面接＠渋谷&lt;/li&gt;&#xA;&lt;li&gt;18時: HIC2次面接＠恵比寿&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;gmm1次面接渋谷&#34;&gt;GMM1次面接＠渋谷&lt;/h3&gt;&#xA;&lt;p&gt;本日1発目の面接は「ニッポンのインターネット部」で有名な某社のグループ会社さんです。40階建てぐらいの渋谷セルリアンタワーというところに所在しており、受付もYAHなんかと比べても高級感がありました。&lt;/p&gt;&#xA;&lt;p&gt;受付嬢に名前を告げて待つこと10分。システム開発部の部長であるSさんがやってきて、社訓のようなものの感想とアンケートをまず書かされました。その後は普通の面接通りに、こっちの自己紹介、経歴、自己PR、志望動機を話して質疑応答に。会社の仕事としてはまぁBtoCのサイトやグループ会社から降りてきた受託開発の仕事がメインで、言語はJava,PHP,Perlなんかが多いらしい。DBはOracleとMySQL(Postgresは遅いのでアクセス数が多いサイトではどうしても使えないらしい)がメインだそうな。「それなりにトラフィックのあるサイトを運営しているので、やりがいはもちろんありますよ」みたいな感じでした。それと「YAHやRKTに比べると残業は少ないかも」ともおっしゃってました。&lt;/p&gt;&#xA;&lt;p&gt;まぁ可もなく不可もなく、というのが第一印象。おそらく入社しても後悔はしないし、それなりに技術力はあると思われます。Javaが一番のメインらしいので、そういう点では今までの経験が一番生かせる会社のような気がしました。&lt;/p&gt;&#xA;&lt;h3 id=&#34;emc1次面接渋谷&#34;&gt;EMC1次面接＠渋谷&lt;/h3&gt;&#xA;&lt;p&gt;GMMの面接が終わったのが12時近かったので、宮益坂の大戸屋で食事を取った後、今度はEMCのあるマークシティ(今日は高層ビル中心？)に向かいます。目指すは11階。&lt;/p&gt;&#xA;&lt;p&gt;目的の会社の中に入って受付すると、1次面接としてはやや不適切な程大きな会議室に通されました。でも結局は部屋違いだったそうで(^^;、別の小さな会議室に通されました。&lt;/p&gt;&#xA;&lt;p&gt;今回の面接のお相手は、年齢的にはたぶん自分と同い年ぐらいだと思われる、物腰の柔らかい非常に話易いTさんという方でした。んで面接では何を話したかというと...はっきり言って覚えてません(笑)。たぶん今までやったプロジェクトの話とかもしていたのだと思いますが、「ずっと雑談してたんじゃ...」っていうぐらい趣味の話とか、mixiの話をしていた記憶しかないです。あ、ちなみに私はmixiをとある事情で一回辞めているのですが、その理由を話したら案の定笑っておられました。プライベートなことを初対面の人に話すのはかなり勇気がいりましたが、とりあえず笑いが取れたのでよしとします。&lt;/p&gt;&#xA;&lt;p&gt;そんなこんなで雑談も終わりを告げたので、Tさんは「では次が最終面接になりますが、合否はまた...」といいかけ、「いや、ぜひ最終面接にも来てください！」なんておっしゃってくれました。面接なんて所詮フィーリングなんだなとこの時つくづく感じました(笑)。もちろん即決してくれるこの方の決断力みたいなものにも感心しましたが...&lt;/p&gt;&#xA;&lt;p&gt;というわけで最終面接の日程はまたメールで、という話になって今日のところはおいとまです。この人と一緒に仕事やれたら楽しいだろうなぁと思えるぐらいこの面接は良かったので、現時点での第一志望の会社は未だ連絡のこないEXCからこのEMCに取って代わりました。&lt;/p&gt;&#xA;&lt;h3 id=&#34;hic2次面接恵比寿&#34;&gt;HIC2次面接＠恵比寿&lt;/h3&gt;&#xA;&lt;p&gt;先週の木曜日に1次面接をしたHICの2次面接(最終?)です。今日は社長さんの他に経営陣の方2名とお話ししました。ざっと経歴を話した気がしますがこれもはっきり言って覚えてません(笑)。その後「ウチは全社員がOK出さないと採用はしないんですよ」ということで、営業の方など本当に全員がゾロゾロと私の履歴書や職務経歴書などを見て、矢継ぎ早に質問を投げかけてきます。一番真剣な質問の1つに「システムがわからないお客さんとの打ち合わせに、場合によっては出てもらうことがありますけど、システムのことをわかりやすくお客さんに説明できますか？」と言われて、「普段から友達のパソコンをセットアップして、あーだこーだ説明してわかってもらってるので大丈夫です」と答えました。でも正直あまり自信はないのですけどね...&lt;/p&gt;&#xA;&lt;p&gt;質問が終わった段階で社長さんが登場して「突然ですけどこのあと暇ですか？食事にでも行きませんか？」と誘われました。ちょっと嫌な予感がしたのですが断る理由も見付からなかったので「ダイジョブですよ」と答えると、幹部の皆さんも同席で同じビルの1階にある飲み屋に連れていかれて、人生初の接待を受けることとなりました(笑)。&lt;/p&gt;&#xA;&lt;p&gt;そしてこの酒の席で「他にどんな会社受けてるの？」などとかなり根掘り葉掘り聞かれて、「実はEMCが第一志望です」と馬鹿正直にゲロってしまいました。「EMCか～、いやぁあそこはいい会社だよ」と社長さんは言ってましたが、一体どこからどこまでが本音なのかも全然わかりません(笑)。まぁそんなこんなで2,3時間コンフィデンシャルな話が続いたところで、もう10時を回ったのでなんとか解放してもらいました。ちなみに私は接待などというやり方はもともと好きではないので、この時点でこの会社のポイントは逆に下がりました(笑)。さんざん飲んだり喰ったりしたのにねぇ。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>YAHの1次面接</title>
				<link>https://journal.lampetty.net/posts/wp/44/</link>
				<pubDate>Fri, 15 Jul 2005 14:07:28 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/44/</guid>
				<description>&lt;h3 id=&#34;yah1次面接六本木&#34;&gt;YAH1次面接＠六本木&lt;/h3&gt;&#xA;&lt;p&gt;今日は9:30からYAHの1次面接だったのでやや早起き。んでいざ家を出ようと思ったらとてつもない腹痛が...トイレに籠ること約30分、本当ならかなり余裕を持ってYAH本社に到着する予定だったのですが、激ダッシュしてなんとか電車の乗り換えがうまくいってギリギリ間に合うかな？ぐらい余裕がなくなりました(^^;&lt;/p&gt;&#xA;&lt;p&gt;六本木駅までたどり着いて、そこからダッシュして六本木ヒルズのYAH受付を尋ねると&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;受付にはありえないぐらいの行列が!!&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;おかげで受け付けられるのに10分もかかってしまい遅刻。この時点で「あーあ、確実に落ちたな」と落胆しておりました。かといってバックれるわけにもいかないんで、気を取り直してビルの中へGO。ここでもう1回受付のおねーさんに「9:30から面接の件で伺いました。遅れてすいません」と伝えてしばし待つこと5分。そうすると女の人がやってきて小さな応接室に通されました。「遅刻してすみません」と謝ると、「どうされました？」と返されたので「受付が予想以上に混んでいて...」と思わず受付の行列のせいにしてしまいました。本当は腹が痛くなることを考慮してもっと早起きしてれば遅刻せずに済んだっていう話なのに。嘘ついたわけではないにしても、ちょっとだけ心が痛みました。&lt;/p&gt;&#xA;&lt;p&gt;とまぁ気を取り直して人事の人とサシで面接開始。「まずは今までのご経歴について教えて下さい」と言われたので、新卒で入った会社でやったプロジェクトを1つ1つ言っていたら、「えっと、全部のプロジェクトをお話しになられると時間が足りませんので、掻い摘んで説明してもらえますか？」と爽やかなツッコミを頂きました(笑)。はい確かにその通りですね。それでまぁ経歴を掻い摘んで説明すると今度は志望動機を聞かれました。「応募フォームに書いたやんけ」とは思いつつもにこやかに喋りました。&lt;/p&gt;&#xA;&lt;p&gt;それから「YAHのOSはFreeBSDで、よく使う言語はC/C++です。そのあたりご経験があまりなさそうですが大丈夫ですか？なんなら研修とかありますけど？」と聞かれました。ちなみに研修を受けると自分が希望している部署には行けないかも、とも言われました。C/C++は確かにあんまやったことないけど、わざわざ言語の研修を受ける程ではないので、「ダイジョブっす」と答えました。だって今までだって未経験でもその場その場で覚えてったし。&lt;/p&gt;&#xA;&lt;p&gt;さらに話は昨日受けた技術試験にまで及びました。ネットワーク以外はまぁまぁ出来ていたようで、それなりに評価されているようです。あとはこっちからの質問を2つほどして面接は終了。&lt;/p&gt;&#xA;&lt;p&gt;遅刻して緊張とかはしてなかったのですが、心の準備が全く出来ていなかったのでかなりしどろもどりになってしまいました。2次面接に進むのはあんまり期待できない感じですかねぇ...&lt;/p&gt;&#xA;&lt;h3 id=&#34;kee辞退&#34;&gt;KEE辞退&lt;/h3&gt;&#xA;&lt;p&gt;NEMやらYAHやら色々と受けている中で、やっぱり自分としては「1つのことにじっくり腰を据えて取り組みたい」感じになって来たので、受託開発で色々こなすって感じのKEEはどうも違うような気がしてきました。というわけで、下手に内定を貰ってしまう前にやっぱり辞退のメールを送りました。んで、Kさんから「今まさに給与などの条件面を添えてメールを出そうとしていたところで、辞退はとても残念です」との返信が...うぅ、本当にごめんなさい。&lt;/p&gt;&#xA;&lt;p&gt;軽い気持ちで面接に行くのも、新しい発見があっていいかもしれません。ただ、その会社で仕事をする自分をイメージできないのならばさっさとその旨を伝えた方がいいですね。まぁ保険という意味でも内定は欲しいところでしたが...&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>過密スケジュールをこなす</title>
				<link>https://journal.lampetty.net/posts/wp/42/</link>
				<pubDate>Thu, 14 Jul 2005 14:07:56 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/42/</guid>
				<description>&lt;p&gt;今日は&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;10時: HIC1次面接＠恵比寿&lt;/li&gt;&#xA;&lt;li&gt;13時: NEM最終面接＠東京&lt;/li&gt;&#xA;&lt;li&gt;19時: YAH技術試験＠渋谷&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;という過密スケジュールです。「この暑さの中スーツなんて着たくない」とかぶー垂れつつもまずは1件目、HICに行ってきました。遅刻するのが嫌だったのでかなり余裕を持って家を出たのですが、やっぱり早く着き過ぎたので近くのフレッシュネスで休憩すること30分。&lt;/p&gt;&#xA;&lt;h3 id=&#34;hic-1次面接恵比寿&#34;&gt;HIC 1次面接＠恵比寿&lt;/h3&gt;&#xA;&lt;p&gt;なんとなく予想はしてましたが、HICという会社のオフィスはややマンションっぽい感じでした。会議室に通されて社長さんとご対面。第一印象は&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;カリスマ性なさそう&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;でした(^^; でもとても堅実っぽい感じで逆に安心できるタイプの方でした(フォロー)。&lt;/p&gt;&#xA;&lt;p&gt;事業内容は&lt;a href=&#34;http://kakaku.com/&#34;&gt;価格.com&lt;/a&gt;のような比較サイトの運営。サーバ管理から開発まで全て自社でやっていて言語はPHPだそうです。会社の業績的にはずーっと黒字でこれまで無借金経営だそうで、「3年後には従業員100人ぐらいに増やして上場したい！」ということもおっしゃっていました。うーん、どこかで聞いたような、でも決して実現しなかったセリフですね(前の会社の話です)。&lt;/p&gt;&#xA;&lt;p&gt;社長さんと話した後は、この会社のエンジニアの方3名とお話ししました。主にXMLのこと、PHPでフレームワークは使ってるのかとか、使ってるエディタは何でしょう？とかそんな感じ。私としては「この人達とだったら安心して一緒に仕事できるな」と感じました(後から聞いた話ですが、向こうの3人も同じように思ってくれていたそうです)。&lt;/p&gt;&#xA;&lt;p&gt;というわけで「ちょっと話だけでも聞いてみるかぁ」的な軽いノリだったのですが、なかなかいい会社だと思いました。EXCやYAHが落ちたらぜひここで働きたい、そんな感じ。&lt;/p&gt;&#xA;&lt;h3 id=&#34;nem最終面接東京&#34;&gt;NEM最終面接＠東京&lt;/h3&gt;&#xA;&lt;p&gt;開発部のリーダーをされているWさんとマンツーマンで面接でした。まずは私から、今までやってきたプロジェクトの説明をしてそれに対する質疑応答。そして煙草を吸いながらの雑談(笑) (ちなみに私は禁煙したので吸ってません)。1次面接の時にもチラッと聞いたのですが、この会社は開発作業を部分的にベトナムに委託しているようです。と言っても、いわゆる大手が中国に対してやっているようなオフショアではなくって、実際にこっちの人が半年以上も向こうに行って、「一緒に頑張ろうぜ」みたいな感じだそうな。正直、「設計も開発も運用も全部自分でやりたい」というのが私の希望なので、それを考えるとこの会社は向いていないんじゃないかなぁと少し不安に。ただ、少なくとも上司になるであろう人はとても尊敬できる人なので(所詮フィーリングですけど(笑)。でもフィーリングは大事)、いざここで働くとなるとかなり悩ましい会社ではあります。&lt;/p&gt;&#xA;&lt;p&gt;その後は例の立ち上がりかけのプロジェクトのミーティングに、インターンで働こうとしている東大の学生サン(ぱっと見、&lt;a href=&#34;http://www3.vis.ne.jp/~asaki/p_diary/diary.cgi&#34;&gt;たけぞうさん&lt;/a&gt;にとても良く似ていました)と一緒に参加しました。内容はとても面白そうで、微力ながら私も「システム的にこんな機能ないとダメですよね？」と発言してみました。というわけで、会議がよりコンフィデンシャルな段階に突入しそうになったので、東大生と私は解放されました。ちなみに会議に参加していた人はみな喫煙者で部屋がモクモクしていてちと辛かったっす。&lt;/p&gt;&#xA;&lt;h3 id=&#34;yah技術試験渋谷&#34;&gt;YAH技術試験＠渋谷&lt;/h3&gt;&#xA;&lt;p&gt;渋谷のポーラビルというビルの1室を借り切っての試験。エンジニアと非エンジニアで試験の内容も部屋も違うのですが、非エンジニアの試験ルームに入っていった方々は「何勘違いしてんのこの人？」みたいなファッションの方が多かったです(^^; つーかこっちは地味にスーツで来てるんですけどねぇ...面接ぐらいはスーツで来るもんじゃないのでしょうか？&lt;/p&gt;&#xA;&lt;p&gt;技術試験は&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;ネットワーク&lt;/li&gt;&#xA;&lt;li&gt;プログラミング言語(JavaかCの選択)&lt;/li&gt;&#xA;&lt;li&gt;ソフトウェア開発の一般常識&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;みたいなカテゴリーに分かれていました。中でもネットワークの問題がかなり難しく、ネットワーク系のエンジニアではないとわからないような難題ばかり。これは落ちたかも...ちなみに試験は4択式で90分の時間があったのですが、私はなぜか30分ぐらいで終わってしまい(笑)、他の人を置き去りにして退室しました。たぶんネットワーク以外は結構出来てると思われますがどうでしょう～。&lt;/p&gt;&#xA;&lt;h3 id=&#34;その他&#34;&gt;その他&lt;/h3&gt;&#xA;&lt;p&gt;家に帰ってメールを見ると、この前指摘したFind Job !の検討中フォルダに関する返信が来てました。「(Firefox)ではなくIEを使ってください」とのこと。うーんそうじゃなくて、「Firefoxってネスケ6.0と基本的には同じ物のはずなので、Firefoxで動かないんだったらネスケ6.0でも動かないんじゃ...ネスケ6.0以上は&lt;a href=&#34;http://www.find-job.net/help/recommend.html&#34;&gt;推奨環境&lt;/a&gt;のはずですよね？」ということをいいたかったのですが...時間のある時にネスケを入れて試してみよう。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>7月13日(水)</title>
				<link>https://journal.lampetty.net/posts/wp/40/</link>
				<pubDate>Wed, 13 Jul 2005 12:07:09 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/40/</guid>
				<description>&lt;p&gt;昨日応募したITCから早速メールが来て7/20に面接したいとのこと。特に予定はないので大丈夫ですよと返信。さらに昨日面接してもらったNEMからも2次面接(最終)の案内が。「いくらなんでも明日ってちょっと急過ぎ」と思いましたがちょうどその時間はぽっかり空いていたので了承。さらに「立ち上がりそうなプロジェクトの会議に是非とも参加してもらいたい」とか言ってるし。「私は他の会社も受けているし、例え明日御社から採用の通知を貰っても即決出来ませんが、そんな人間がプロジェクト会議なんて参加してしまっていいんでしょうか？」と返信したら、「それでもいいよ」とおっしゃってくれたので、ついでにプロジェクト会議にも参加することにしました(プロジェクトの内容はとても面白そうだったのです)。&lt;/p&gt;&#xA;&lt;p&gt;あと、GMM株式会社に対して応募フォームを記入して送信。そうしたら、1時間後にシステム開発部の部長さんから直接携帯に電話がかかってきて「ぜひお会いしたい」とのこと。今週はちょっと忙しいので、来週の火曜日でアポを取りました。それにしても1時間後ってすごい反射神経ですなぁ(^^;&lt;/p&gt;&#xA;&lt;p&gt;んで、17時にはKEEの最終面接がありました。もう場所はわかっているので今度はきっちり10分前に到着です。&lt;/p&gt;&#xA;&lt;p&gt;面接は1次面接のKさん＋統括ディレクターのMさん+社長のSさんでした。Sさんは後から参加でしたけど。初めての方もいらっしゃったのでまた簡単に自己紹介してから質疑応答に。まず、「とりあえずウチは一つのことをじっくりっていう感じではないけど大丈夫？」と言われました。正直あまり大丈夫じゃないのですが、「大丈夫です」と勢いで答えてしまいました(^^; だってここで「大丈夫じゃない」なんて答えたらこの場が終わってしまいますし...その他「どんな会社受けてるんですか」って聞かれて「YAHやEXCとベンチャー企業です」と答えたら「EXCの社員は仕事しないよな～」なんて他社さんの批判が始まりただの雑談みたいになってきたので、話を本題に戻して強引に面接を終了させました(^^; 正直なところ「この会社に行きたい」とはどうしても思えず...&lt;/p&gt;&#xA;&lt;p&gt;とにもかくにも「採用の合否は今週中にお伝えします」とのことでした。&lt;/p&gt;&#xA;&lt;p&gt;KEEの面接から帰ったら今日もクタクタでしたが、明日1次面接があるHIC向けに、履歴書と職務経歴書をなんとか仕上げました。「やっぱり仕事やりながらこれだけの会社受けるのは無理だよなぁ、辞めて正解」なんてことを思いつつ...&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>7月12日(火) EMCからのスカウトメール</title>
				<link>https://journal.lampetty.net/posts/wp/36/</link>
				<pubDate>Tue, 12 Jul 2005 12:07:56 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/36/</guid>
				<description>&lt;p&gt;朝起きてまずITC株式会社に応募。ここは有名なIT系ニュースサイトをやっているので、これをやりたいなぁと思っていたからです。&lt;/p&gt;&#xA;&lt;p&gt;それと&lt;a href=&#34;http://www.find-job.net/&#34;&gt;Find Job !&lt;/a&gt;に検討中フォルダという、求人情報のブックマークみたいな機能があるのですが、Firefoxではここから求人情報を削除できなかったので(IEでは出来た)、不具合を報告しました。(普段は不具合なんか見付けてもイチイチ報告しませんが、FindJobはしばらくお世話になりそうだったので)&lt;/p&gt;&#xA;&lt;p&gt;午後はNEMの面接でした。東京駅の八重洲近辺にある会社なのですが、とにかく場所がわかりづらい...あらかじめ「これプリントアウトして持ってくれば大丈夫ですよ」と送られた地図を持っていたのでなんとか時間通りにたどり着けました。この会社のビルはいい場所にあるせいか結構ボロかったですが(^^; 内装はそこそこ綺麗でした。&lt;/p&gt;&#xA;&lt;p&gt;社長さんが出てきて、会社を設立した経緯を教えてもらいました。社長さんは日本ユニシスの営業サンだったらしいのですが、まだモザイク(ブラウザのことね)が出たころにWebアプリの開発を受注してしまい、自社内ではどうにも開発できなかったので、世界中に散らばるハッカーにお願いして作ってもらったそうです(笑)なんと無茶苦茶な...まぁそれがルーツとなって今のNEMのハッカーズギルド的な考えが出来ているそうな。なんともぶっ飛んでいる会社だなというのが第一印象でした(笑)&lt;/p&gt;&#xA;&lt;p&gt;でも社長さんはとてもいい人だし、なんか私の尊敬する人と同じ雰囲気を持っていそうだったので私的には好印象でした(^^&lt;/p&gt;&#xA;&lt;p&gt;それとHIC株式会社から来ていた、返事を保留にしていたスカウトメールの返信を「とりあえず面接がてらお会いしてお話が聞きたいです」みたいな感じで出して、7/14(金)の10時で面接のアポを取りました。&lt;/p&gt;&#xA;&lt;p&gt;ついでにスカウトメールをチェックするとFind Job !を運営しているEMCからスカウトメールが来ていました。この会社は1999年ぐらいから「FindJobを運営している会社」としてずーっと存在だけは知っていたので少し気になっていたのですが、「YAHやEXCが落ちたら受けてみよう」ぐらいにしか考えていませんでした。でもちょうどいい機会だったので、面接を受けてみることに。とりあえず7/19(火)13時でアポを取りました。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>7月11日(月)</title>
				<link>https://journal.lampetty.net/posts/wp/32/</link>
				<pubDate>Mon, 11 Jul 2005 11:07:05 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/32/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;http://www.find-job.net/&#34;&gt;Find Job !&lt;/a&gt;経由でスカウトされたNEMの面接が明日あるため、提出用の履歴書・職務経歴書を書いてました。プラス志望動機のための企業研究もそれなりに。&lt;/p&gt;&#xA;&lt;p&gt;夜は友達の家でこの前買ったsakusakuのDVD見てました。音楽番組だけあって、ジゴロウが作る変な唄が一番面白いです。友達はtvkが映らないことを非常に残念がってました。&lt;/p&gt;&#xA;&lt;p&gt;そうそう、先週の金曜日に応募したポータル最大手YAHから「1次面接・技術試験のご案内」のメールが届いてました。とても嬉しかったのですが、日時が勝手に指定されていて「私達にあなたが合わせるのよ」みたいな、いかにも大企業的な雰囲気がちょっと気にくわない。まぁ今は働いているわけでもないですし、指定された時間で全く問題ないんですけどね...&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>KEEから最終面接の案内</title>
				<link>https://journal.lampetty.net/posts/wp/29/</link>
				<pubDate>Sat, 09 Jul 2005 03:07:41 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/29/</guid>
				<description>&lt;p&gt;起きてメールを見たら、7/8付けでKEEから最終面接の案内メールが来ていました。「たぶんここ受かっても他の会社が受かれば行かないだろうなぁ」と思いつつ、でもこの時は内定を1個でも確保しておきたかったので最終面接まで受けることに。7月13日(水)17時でアポをとりました。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>YAHに応募と面接</title>
				<link>https://journal.lampetty.net/posts/wp/27/</link>
				<pubDate>Fri, 08 Jul 2005 11:07:28 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/27/</guid>
				<description>&lt;p&gt;起きてから第二志望であるポータルサイト最大手のYAHに応募。職種は「ウェブアプリケーションエンジニア」の個人ツールサービス系です。志望動機はかなり力を入れ、情熱的かつアジテーションありありな感じにしました。とてつもなく恥ずかしいですがそのまま転載しておきます。&lt;/p&gt;&#xA;&lt;p&gt;一番の志望理由は、御社が日本一のポータルサイトであり私自身よく利用しているからです。&lt;/p&gt;&#xA;&lt;p&gt;自分自身が利用し、さらに多くの人から利用されているサービスの開発・保守ほど自分のモチベーションを刺激するものはないと考えています。&lt;/p&gt;&#xA;&lt;p&gt;また、私自身御社のサービスを使いながら、「いつの間にこんな便利な機能が」(例えば、Yahoo!路線情報の駅登録機能など)といった改善点に気付くこともあり、常に自社のサービスの使い勝手を吟味し改善を行っている企業なのだなと感じ、そのような姿勢に対して純粋に感動を覚えました。&lt;/p&gt;&#xA;&lt;p&gt;私はこれまで、自分の仕事をより効率よくするツールやフレームワークなどに興味を持ち、積極的にそれらを利用して仕事の効率化を図ってきました。例を上げれば、AntやEclipseなどはメジャーになる前から目を付け、英語のドキュメントを読み漁り自分で使い方をマスターしていました。もし、私が御社に入社すればこういった今ある自分の仕事を効率化することによって、そこで空いた時間を新しいサービスの開発や、既存のサービスの改善に注ぐことが出来ます。&lt;/p&gt;&#xA;&lt;p&gt;大量のトラフィックをさばくための技術などは不足しているかもしれませんが、それは入社してからでも学べることであり、&lt;/p&gt;&#xA;&lt;p&gt;大事なのは現状に満足せず、興味を持ったものごとに対して積極的にトライしていく姿勢だと思っています。&lt;/p&gt;&#xA;&lt;p&gt;そういう点で、御社は常に改善の精神を持っている企業だと感じました。その部分に共感したのも志望動機の一つです。&lt;/p&gt;&#xA;&lt;p&gt;「本当かよ」というツッコミはまぁ控えてもらうとして(笑)、YAHのサービスは本当に常日頃から利用しているので比較的ポイントは絞りやすかったです。この志望動機を書き上げてからというもの、「振り向いてもらえる自己PR、志望動機」の書き方がなんとなくわかったような気がします。企業に応募するといっても、応募書類を審査するのはやっぱり「人」なので、感情的な文章には弱いのでしょう。まずは相手の良いところに気付いてあげて、そこを褒め殺すとかなり効果的みたいです(笑)。褒められるとやっぱり相手としても嬉しいし、「おっ」って思ってくれるはずです。さらに自己PRではその企業に対して「自分が入社したら一体何が出来るのか？」を具体的にイメージさせるようにすればもう完璧だと思います。まぁそんな偉そうなこと言える立場ではないのですが、少なくとも私はそう感じましたしそんな感じでやってました。&lt;/p&gt;&#xA;&lt;p&gt;んで今日は19時からKEEの面接だったので新宿まで赴きました。地図をプリントしていったのですが案の定道に迷い、19時ギリギリにKEEがあるビルに到着。つーかちょっと遅刻(^^;&lt;/p&gt;&#xA;&lt;p&gt;担当の人(以降Kさん)をお願いすると、ソファーのあるところに通されました。しっかし綺麗なオフィスなんですがなんかスペースがやたらと余っていて変な印象を受けました。あと、おもむろに見える仮眠ベッド(笑)。やっぱり徹夜とかしなきゃいけないときもあるんでしょうねぇ...&lt;/p&gt;&#xA;&lt;p&gt;しばらく待たされてKさんが登場。なんか今風な兄ちゃんという感じでした。面接では簡単に自己紹介して、職務経歴や志望動機やらをサラッと伝えました。KEEではPerlがメインだということで、SledgeやPerlモジュール、オブジェクト指向なんかの話でちょっと盛り上がりました。どうやらこの会社は以前エッヂ(今でいうライブドア)で働いていた人がスピンアウトして作ったものらしい。そういえば取引先にライブドアの名前がありましたね。&lt;/p&gt;&#xA;&lt;p&gt;まぁそんなこんなで「いいね君、もう採用だよ」と軽いノリで言われました(笑)。嬉しかったですが、この会社はやっぱり受託開発、つまりは下請けなんでそこら辺を考えるとちょっと悩ましいところ。それに結構忙しそう(色んなことを並行してやっていかなきゃいけない)なのが気になりました。根本的にマルチタスクな人間じゃないし、一気に色んなことをやろうとするのはコンテキストスイッチ(頭の切り替え)が発生する分オーバーヘッドが発生して効率悪いんだよなと考えてる人間なので、「この会社は向いてないかも」とか思ってしまいました。まぁ次の面接もまだあるみたいなのでそれまでにじっくり考えようと思います。他の会社も受けていることですし。&lt;/p&gt;&#xA;&lt;p&gt;この暑さの中長袖のワイシャツ来てスーツ着てたせいか、ちょっと新宿に出向いただけだったのにえらい疲れて、帰ったらソッコウで就寝。まぁ明日土曜日だし特にやらなきゃいけないこともないのでまいっかと思いつつ...&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>起き抜けのスカウトメール</title>
				<link>https://journal.lampetty.net/posts/wp/26/</link>
				<pubDate>Thu, 07 Jul 2005 03:07:39 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/26/</guid>
				<description>&lt;p&gt;起きて&lt;a href=&#34;http://www.find-job.net/&#34;&gt;Find Job !&lt;/a&gt;を開くとまたスカウトメールが...全部興味なかったので辞退、辞退、辞退っと。ただ一つだけ気になっていた会社(HIC株式会社)からスカウトメールが来ていたので、これだけは辞退を保留にしました。余力があったらあって事業内容とか詳しく聞きたいなと思ったので。&lt;/p&gt;&#xA;&lt;p&gt;明日はKEEの面接なので履歴書と職務経歴書を書き書き。今どきの転職活動では履歴書もワードでサクッと作るものなのかもしれませんが、「手書きじゃないとやっぱり印象は良くないよな～」と思ったので手書きにしました。職務経歴書は今までのプロジェクト全部書き出すとかなりな量になるので、自分でフォーマット決めてワードで作りました。2つ合わせると2～3時間かかったので、たかが書類作成とはいえ結構あなどれない...&lt;/p&gt;&#xA;&lt;p&gt;履歴書書き終えたら、第一志望であるポータルサイトの有名どころEXCの応募フォームを書いて送信。志望動機はちょっと手抜きでしたが一般に公開されている以上のことを知らないのに、いきなり志望動機を書けと言われてもそれはそれで困ってしまいますよね～。まぁこの会社は一番になれていない会社なのでその辺をつけば良かったのかもしれませんが...&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Find Job !でのスカウトメール</title>
				<link>https://journal.lampetty.net/posts/wp/24/</link>
				<pubDate>Wed, 06 Jul 2005 13:07:16 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/24/</guid>
				<description>&lt;p&gt;今日も山のように(つっても5,6通ですが)&lt;a href=&#34;http://www.find-job.net/&#34;&gt;Find Job !&lt;/a&gt;でスカウトメールが来ています。その中で一つ気になったものがありました。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;貴方のFind-Jobのスカウト欄を見ましたところ、Javaのご経験だけでなく、文系出身ながら、独学で実力をつけてきたという前向きな部分に、現在探している人材ではと思い、スカウトメールしています。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;なんて嬉しいことを言ってくれています。やっぱりスカウトメール送る方も経歴をしっかり見てるんですね。こっちとしても、なりふり構わず大量にスカウトしている感じのメールより、こういう風に自分の経歴やPRを見て丁寧なメールを書いてくれる方は好感が持てます。この会社は事業内容も結構面白そうだったので、とりあえず話を聞くだけでもと思って面接のアポをとりました。というわけで記念すべき初面接の予定ができましたワーイ(^^ このところ自己PRとか職務経歴書いてばかりで引きこもりがちだったので人と会うのが妙に楽しみです。&lt;/p&gt;&#xA;&lt;p&gt;もう1つ、月曜日に応募したKEEからメールがありました。内容は「面接したいんだけど7月8日(金)の19時でどうでしょう？」みたいな感じ。この会社は正直軽い気持ちで応募したのですが、面接慣れする意味でも場数踏んだ方がいいのでOKしました。&lt;/p&gt;&#xA;&lt;p&gt;今日は先の予定が少しだけ固まりつつあり、ホッと一息つける日でした。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>挑戦者への課題</title>
				<link>https://journal.lampetty.net/posts/wp/21/</link>
				<pubDate>Tue, 05 Jul 2005 13:07:15 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/21/</guid>
				<description>&lt;p&gt;ECJからメールで連絡あり。「課題を送るので一週間以内に解答を付けて送り返してください」とのこと。で、その課題の内容を見てみる。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;えらい難しいです!!&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;本気でやっても1週間ぐらいかかりそうな雰囲気。これじゃあ他の会社の選考の準備とか一切出来ない感じです。というわけで、この会社は完全に無視することにしました(w だって別にそんな行きたい会社ってわけでもなかったしぃ...&lt;/p&gt;&#xA;&lt;p&gt;そういえば、この日からFindJobのスカウトメールがよく来るようになりました。Web履歴書をクソ真面目に書いたからでしょうか？でも来るメールの大半がいわゆる零細ソフトウェア会社で、前の会社と変わらない感じだったので全部辞退しました。スカウトメールの辞退はボタンをポチッとおすだけでいいので、本当重宝しましたよ(笑)&lt;/p&gt;&#xA;&lt;p&gt;つーか希望する雇用形態を「正社員」にしているのに、派遣の仕事の紹介してくる会社って一体...&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>3社に応募</title>
				<link>https://journal.lampetty.net/posts/wp/19/</link>
				<pubDate>Mon, 04 Jul 2005 13:07:17 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/19/</guid>
				<description>&lt;p&gt;今日もFindJobのWeb履歴書を書いてました。自己PRも含めて自分的には満足な内容になったので、これを元に下記の会社に採用のWebページ経由で応募。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;TOL&lt;/li&gt;&#xA;&lt;li&gt;TCJ&lt;/li&gt;&#xA;&lt;li&gt;KEE&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;ちなみに私の会社を選ぶ基準は&lt;a href=&#34;http://d.hatena.ne.jp/keyword/%E8%BB%A2%E8%81%B7%2F%E5%BF%9C%E5%8B%9F%E3%81%97%E3%81%9F%E4%BC%9A%E7%A4%BE&#34;&gt;転職/応募した会社&lt;/a&gt;に書きましたが、こういう会社をどこで見つけているかというと、有名どころを除いて大体がFindJobだったんですよね。(2,3ヶ月前から気になる会社を見付けては採用のWebページをブックマークしておいたのです。FindJobは掲載期間が終わってしまうとその求人広告はもう見れなくなってしまうので)&lt;/p&gt;&#xA;&lt;p&gt;本命はEXC株式会社ですが、色々不慣れな状態から本命に行って玉砕するのも嫌だったのでこの時点ではEXCには応募しないでおきました。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>スターウォーズ エピソード3</title>
				<link>https://journal.lampetty.net/posts/wp/17/</link>
				<pubDate>Sat, 02 Jul 2005 13:07:33 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/17/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;http://diary.lampetty.net/20050702.html#p01&#34;&gt;日報&lt;/a&gt;の方にも書いていますが、「スターウォーズ エピソード3」を観て来ました。アナキンがあんなにヒドイやつになっていく部分、特にパドメの首を締めているシーンがとても泣けました。「そりゃないぜアニー!!」と言いたかった。あと、一緒に観に行った友達に泣いてるのをバレないようにするのがちょっと大変でした...グスグス鼻すすらないと鼻水が止めどなく出てきてたので(ただの風邪?)&lt;/p&gt;&#xA;&lt;p&gt;今年のビッグイベントの1つが終わってしまったのは悲しいですが、30年も続いた一大銀河ファンタジーの終焉がリアルタイムで観れる時代に生きていたことがとても嬉しかったです。さぁ来週から本格的に頑張ろう～。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>転職活動開始！</title>
				<link>https://journal.lampetty.net/posts/wp/14/</link>
				<pubDate>Fri, 01 Jul 2005 01:07:13 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/14/</guid>
				<description>&lt;p&gt;そんなわけで今日から転職活動開始！なわけですが、まずは健康保険を国民健康保険に切り替えないと。ということで近所の出張所まで行ってきて保険証を取得。&lt;/p&gt;&#xA;&lt;p&gt;その後はこの前登録したFindJobのWEB履歴書をひたすら書いてました。その他「どの企業にどんな内容で応募したか」という情報を管理するために、ローカルなWikiをインストール。採用ページのフォームから応募する形式を取っている企業も多かったので、「どんな内容で応募したか」を書いて(もし面接まで進んだ場合に、自己PRや志望動機で何書いたか思い出せるようにするため)、企業単位でページを作っていきます。その他、履歴書の内容や職務経歴やら自己PRやらもWiki上で保存しておくことに。おかげでコピペ応募の土台が出来あがりましたとさ。&lt;/p&gt;&#xA;&lt;p&gt;※ただし、コピペ応募だとやっぱり企業側は「この人ウチの会社ちゃんと研究してるのかな～？」と思うのか、書類で落ちる可能性高いです。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>最後の日</title>
				<link>https://journal.lampetty.net/posts/wp/10/</link>
				<pubDate>Thu, 30 Jun 2005 13:06:12 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/10/</guid>
				<description>&lt;p&gt;今日で派遣先での仕事は終了、ということで最後退社する時に社員の皆さんから見送られて退社しました。この会社にはたった半年しかいなかったし、対してこの会社の役にも立っていなかったはずなのに、なんでこんな風に厚遇されたんだろう...いくら派遣とはいえ、ちょっと辛い瞬間でした。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>そろそろ...</title>
				<link>https://journal.lampetty.net/posts/wp/8/</link>
				<pubDate>Mon, 27 Jun 2005 13:06:06 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/8/</guid>
				<description>&lt;p&gt;今週で派遣先の会社との契約が切れるので、転職活動をそろそろ開始しないといけないなぁと思いつつ、なんか仕事が最後の最後までドタバタしていてあんまり活動できなそうな感じ。とりあえず、就・転職サイトに登録だけでも...と思い、昔から馴染みのある&lt;a href=&#34;http://www.find-job.net/&#34; title=&#34;Find Job !&#34;&gt;Find Job !&lt;/a&gt;にだけ登録しました。&lt;a href=&#34;http://rikunabi-next.yahoo.co.jp/&#34; title=&#34;リクナビNEXT&#34;&gt;リクナビNEXT&lt;/a&gt;にも昔から登録してあるけど、こっちは職務経歴なんかをほとんど更新してないですな。学生時代の就活の経験からあんまり転職サイトをあれこれ使っても単に面倒なだけなので、とりあえずFind Job !だけでいっかな～。&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>私の履歴書</title>
				<link>https://journal.lampetty.net/posts/wp/5/</link>
				<pubDate>Sun, 26 Jun 2005 13:06:05 +0900</pubDate>
				<guid>https://journal.lampetty.net/posts/wp/5/</guid>
				<description>&lt;p&gt;自分のキャリアを棚卸ししてみるとこんな感じです。客観的に見て社会人5年目としてはイマイチかな～と思ってます。あんまりリーダー経験とかないですしね...&lt;/p&gt;&#xA;&lt;h3 id=&#34;経歴&#34;&gt;経歴&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;1979年生まれ。転職活動をしている時点で満26歳&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;東京都23区内在住&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;2001年3月、某私立大学文学部卒業。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;2001年4月、なぜかNCI社という受託系中小(零細?)ソフトウェア会社に入社(全ての間違いはここから...)。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;2003年1月、NCI社より常駐(派遣?)で大手SI会社のHSE社に行くことに(いわゆる出稼ぎです)。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;2004年7月、自分のやりたいことと将来やることが乖離し始めたのでNCI社を退社&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;2005年1月、派遣社員としてFTR社で仕事をすることに。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;2005年6月、やっぱり就職したくなったのでFTR社を退社。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;資格系&#34;&gt;資格系&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;1997年9月、普通自動車第一種免許取得&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;2003年2月、XMLマスターベーシック取得&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;2003年4月、Sun Certifiedなんちゃらfor Java取得&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;2004年9月、TOEIC 665点&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;(基本情報とか取らなきゃなー、とか思いつつ...)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;コンピュータスキル&#34;&gt;コンピュータスキル&lt;/h3&gt;&#xA;&lt;p&gt;■ オフィスツール&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Word：実務2年以上&lt;/li&gt;&#xA;&lt;li&gt;Excel：実務2年以上&lt;/li&gt;&#xA;&lt;li&gt;PowerPoint：独学&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;■ OS&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Windows：実務経験2年以上&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Linux： 実務経験4ヶ月。個人的には2年以上使用中。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Solaris：実務1年未満(基本的な操作が行える程度)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;■ プログラム言語&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Java：実務経験2年5ヶ月&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Perl：実務経験4ヶ月&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;JSP： 実務経験8ヶ月&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;C： 実務経験6ヶ月&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;C++： 実務経験6ヶ月&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;JavaScript：実務経験8ヶ月&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;XML：独学で6ヶ月程度かな&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;■ データベース&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Oracle：実務1年未満&lt;/li&gt;&#xA;&lt;li&gt;PostgreSQL：実務1年未満&lt;/li&gt;&#xA;&lt;li&gt;MySQL：独学&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;趣味系&#34;&gt;趣味系&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;音楽観賞(ライブに行ったりもします)&lt;/li&gt;&#xA;&lt;li&gt;サッカー観戦(最近だけど)&lt;/li&gt;&#xA;&lt;li&gt;自転車に乗る(プジョーのCOM70Mが愛車)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
			</item>
			<item>
				<title>Search</title>
				<link>https://journal.lampetty.net/search/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://journal.lampetty.net/search/</guid>
				<description></description>
			</item>
	</channel>
</rss>
