<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~files/atom.xsl"?>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedpress="https://feed.press/xmlns">
  <feedpress:locale>en</feedpress:locale>
  <link rel="hub" href="http://feedpress.superfeedr.com/"/>
  <id>tag:blogger.com,1999:blog-4491739846469721202</id>
  <updated>2020-02-28T20:11:20.812+09:00</updated>
  <category term="Python"/>
  <category term="日記"/>
  <category term="Blogger"/>
  <category term="Angular.js"/>
  <category term="Chrome"/>
  <category term="Fabric"/>
  <category term="ISUCON"/>
  <category term="IntelliJ IDEA"/>
  <category term="Java"/>
  <category term="Linux"/>
  <category term="Mac"/>
  <category term="Markdown"/>
  <category term="Maven"/>
  <category term="SublimeText"/>
  <category term="memcached"/>
  <title type="text">おいぬま日報</title>
  <subtitle type="html">しがないプログラマーの雑記</subtitle>
  <link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://blogger.lampetty.net/feeds/posts/default"/>
  <link rel="self" type="application/atom+xml" href="http://feedpress.me/blogger-lampetty-net"/>
  <link rel="alternate" type="text/html" href="http://blogger.lampetty.net/"/>
  <link rel="hub" href="http://pubsubhubbub.appspot.com/"/>
  <author>
    <name>おいぬめ</name>
    <uri>http://www.blogger.com/profile/02863622759561006842</uri>
    <email>noreply@blogger.com</email>
    <gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_9yL0QjJSsuE/Sfqeg_NILzI/AAAAAAAAArQ/5eKH3HVGOmk/s1600-R/8250493%40N05.jpg%3F1232891863"/>
  </author>
  <generator version="7.00" uri="http://www.blogger.com">Blogger</generator>
  <openSearch:totalResults>22</openSearch:totalResults>
  <openSearch:startIndex>1</openSearch:startIndex>
  <openSearch:itemsPerPage>500</openSearch:itemsPerPage>
  <entry>
    <id>tag:blogger.com,1999:blog-4491739846469721202.post-9028889129370258625</id>
    <published>2014-01-14T09:00:00.000+09:00</published>
    <updated>2014-01-14T09:47:45.993+09:00</updated>
    <category scheme="http://www.blogger.com/atom/ns#" term="Angular.js"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="Blogger"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="Markdown"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="Python"/>
    <title type="text">アメブロまたはBloggerでMarkdownでブログを書くためのmd2ameblo作った話</title>
    <content type="html">&lt;p&gt;&lt;a href="http://md2ameblo.herokuapp.com/"&gt;http://md2ameblo.herokuapp.com/&lt;/a&gt;(&lt;a href="https://github.com/oinume/md2ameblo"&gt;ソースコード&lt;/a&gt;)&lt;/p&gt;&lt;p&gt;といっても半年以上前に作ったやつなんですが、今回Angular.jsを使ってUIをけっこう変えたのであらためて告知。&lt;/p&gt;&lt;h4&gt;これは何？&lt;/h4&gt;&lt;p&gt;MarkdownのテキストをアメブロやBlogger向けのHTMLに変換するヤツ。作ろうと思ったきっかけは会社でエンジニアブログを書かなくてはいけない時に、アメブロのエディタがアレ過ぎて辛かったので(*1)ついカッとなって作った。&lt;/p&gt;&lt;p&gt;*1) HTMLタグを書くエディタモードでも、改行が勝手にbrとか挿入されてm9(&lt;sup&gt;Д&lt;sup&gt;)ﾌﾟｷﾞｬｰってなる&lt;/sup&gt;&lt;/sup&gt;&lt;/p&gt;&lt;h4&gt;自分の使い方&lt;/h4&gt;&lt;p&gt;自分はブログはBloggerで書いていて&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="https://wri.pe/app"&gt;wri.pe&lt;/a&gt;でMarkdownで記事を保存&lt;/li&gt;&lt;li&gt;&lt;a href="http://md2ameblo.herokuapp.com/"&gt;md2ameblo&lt;/a&gt;でHTMLに変換&lt;/li&gt;&lt;li&gt;Bloggerのエディタにコピペ&lt;/li&gt;&lt;li&gt;「ブログに書いた」という意味合いでwri.peで該当の記事をアーカイブ&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;という感じで使ってる。今年は昨年よりもっとブログを書こうと思っているので、ガンガン使っていく所存です。&lt;/p&gt;&lt;h4&gt;使った技術&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;Angular.js&lt;/li&gt;&lt;li&gt;Python (サーバサイド)&lt;ul&gt;&lt;li&gt;bottle&lt;/li&gt;&lt;li&gt;misaka - MarkdownをHTMLに変換するライブラリ&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Heroku&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;データベースも使ってないのでHerokuに置いてある。git push でディプロイできてHeroku超便利。&lt;/p&gt;&lt;h4&gt;今後&lt;/h4&gt;&lt;p&gt;やっぱり変換かけるのが面倒なので、wri.pe的なエディタ作ってそこからワンクリックでBloggerに投稿するやつを作り中。&lt;/p&gt;&lt;div class="amazlet-box" style="margin-bottom:0px;"&gt;&lt;div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4881669354/kazzhomeunixo-22/ref=nosim/" name="amazletlink" target="_blank"&gt;&lt;img src="http://ecx.images-amazon.com/images/I/51Z-4CQS4sL._SL160_.jpg" alt="アメブロ Perfect GuideBook" style="border: none;"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"&gt;&lt;div class="amazlet-name" style="margin-bottom:10px;line-height:120%"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4881669354/kazzhomeunixo-22/ref=nosim/" name="amazletlink" target="_blank"&gt;アメブロ Perfect GuideBook&lt;/a&gt;&lt;div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%"&gt;posted with&lt;a href="http://www.amazlet.com/" title="amazlet" target="_blank"&gt;amazlet&lt;/a&gt;at 14.01.13&lt;/div&gt;&lt;/div&gt;&lt;div class="amazlet-detail"&gt;榎本 元&lt;br&gt;&lt;/br&gt;ソーテック社&lt;br&gt;&lt;/br&gt;売り上げランキング: 3,535&lt;br&gt;&lt;/br&gt;&lt;/div&gt;&lt;div class="amazlet-sub-info" style="float: left;"&gt;&lt;div class="amazlet-link" style="margin-top: 5px"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4881669354/kazzhomeunixo-22/ref=nosim/" name="amazletlink" target="_blank"&gt;Amazon.co.jpで詳細を見る&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="amazlet-footer" style="clear: left"&gt;&lt;/div&gt;&lt;/div&gt;</content>
    <link rel="replies" type="application/atom+xml" href="http://blogger.lampetty.net/feeds/9028889129370258625/comments/default" title="コメントの投稿"/>
    <link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4491739846469721202&amp;postID=9028889129370258625" title="0 件のコメント"/>
    <link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4491739846469721202/posts/default/9028889129370258625"/>
    <link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4491739846469721202/posts/default/9028889129370258625"/>
    <link rel="alternate" type="text/html" href="http://blogger.lampetty.net/2014/01/md2ameblo.html" title="アメブロまたはBloggerでMarkdownでブログを書くためのmd2ameblo作った話"/>
    <author>
      <name>おいぬめ</name>
      <uri>http://www.blogger.com/profile/02863622759561006842</uri>
      <email>noreply@blogger.com</email>
      <gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_9yL0QjJSsuE/Sfqeg_NILzI/AAAAAAAAArQ/5eKH3HVGOmk/s1600-R/8250493%40N05.jpg%3F1232891863"/>
    </author>
    <thr:total>0</thr:total>
  </entry>
  <entry>
    <id>tag:blogger.com,1999:blog-4491739846469721202.post-3290068577771417499</id>
    <published>2014-01-04T14:31:00.000+09:00</published>
    <updated>2014-01-04T18:03:53.269+09:00</updated>
    <category scheme="http://www.blogger.com/atom/ns#" term="日記"/>
    <title type="text">ヨドバシドットコムが始まり過ぎてる件</title>
    <content type="html">&lt;p&gt;最近は日用品はスーパーやドラッグストア、アマゾンで買っていたんだけど、下記のものについてはヨドバシドットコムで買うようになった。利用しているうちにヨドバシの13時注文分までは無料で当日配送、品揃えの豊富さについてすごいなぁと思うようになってしまったので、その素晴らしさをここに書いておきたい。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;日用品&lt;ul&gt;&lt;li&gt;歯磨き、ティッシュ、洗剤などの掃除用品、アルカリ電池など&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;電化製品&lt;ul&gt;&lt;li&gt;USBメモリなどの小物から掃除機、加湿器などの大型のものまで&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;書籍&lt;/li&gt;&lt;li&gt;ゲーム&lt;/li&gt;&lt;li&gt;米&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;「なぜヨドバシなのか」は以下の通りである。&lt;/p&gt;&lt;h4&gt;13時までに注文すれば当日配送&lt;/h4&gt;&lt;p&gt;対象に地域でかつ在庫があれば、という条件付きだけれども、13時までに注文すれば無料で当日配送してくれるのは本当にありがたい。自分はアマゾンプレミアム会員ではなかったんだけど、ヨドバシを利用するようになってからこの当日配送のありがたみがすごくよくわかった。&lt;/p&gt;&lt;h4&gt;ポイントがつく＆品揃えが豊富&lt;/h4&gt;&lt;p&gt;だいたいのものは10%のポイントがつく(書籍は例外的に3%)。日用品は近所のドラッグストアで買うよりヨドバシのポイントがつくほうがありがたいし、購入して家まで持って帰ってくるのがだるいのでヨドバシで売っている日用品は軒並みヨドバシで買うようになってしまった。ネット通販だと家にある在庫を確認しながら注文できるのも利点の一つ。&lt;/p&gt;&lt;p&gt;猫を飼っているので、これでペット用品があれば言うことないのになぁ。&lt;/p&gt;&lt;h4&gt;あえてアマゾンではない理由&lt;/h4&gt;&lt;p&gt;「アマゾンの方が品揃え豊富じゃん」というのはその通りでアマゾンすごく便利なんだけど、アマゾンやアップルのように日本で大々的に商売しておきながら法人税をちゃんと払っていない企業は正直どうかなと思う。というわけで、ポイント込みの値段がヨドバシとアマゾンでほぼ同じならば自分はヨドバシで買うようにしている。&lt;/p&gt;&lt;p&gt;結果としてアマゾンで買うものは以下のものに限定されてしまった。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;ヨドバシにない商品&lt;/li&gt;&lt;li&gt;Kindle書籍&lt;/li&gt;&lt;li&gt;中古書籍&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;まとめ&lt;/h4&gt;&lt;p&gt;今後も打倒アマゾンを目指して頑張ってほしいなぁと思う。興味がある人はこのへんも読んでみると良いと思います。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://matome.naver.jp/odai/2138469141764777201"&gt;Amazonを超える日も近い？最近のヨドバシカメラが凄い！ - NAVER まとめ&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://ecnomikata.com/news/tsuhan/post-360.html"&gt;ヨドバシカメラ、サービス強化で打倒アマゾン｜通販新聞ニュース | EC業界を知る【ECのミカタ】&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;</content>
    <link rel="replies" type="application/atom+xml" href="http://blogger.lampetty.net/feeds/3290068577771417499/comments/default" title="コメントの投稿"/>
    <link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4491739846469721202&amp;postID=3290068577771417499" title="0 件のコメント"/>
    <link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4491739846469721202/posts/default/3290068577771417499"/>
    <link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4491739846469721202/posts/default/3290068577771417499"/>
    <link rel="alternate" type="text/html" href="http://blogger.lampetty.net/2014/01/yodobashi-is-awesome.html" title="ヨドバシドットコムが始まり過ぎてる件"/>
    <author>
      <name>おいぬめ</name>
      <uri>http://www.blogger.com/profile/02863622759561006842</uri>
      <email>noreply@blogger.com</email>
      <gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_9yL0QjJSsuE/Sfqeg_NILzI/AAAAAAAAArQ/5eKH3HVGOmk/s1600-R/8250493%40N05.jpg%3F1232891863"/>
    </author>
    <thr:total>0</thr:total>
  </entry>
  <entry>
    <id>tag:blogger.com,1999:blog-4491739846469721202.post-1829211337552812245</id>
    <published>2013-12-31T23:59:00.000+09:00</published>
    <updated>2014-01-01T00:04:28.831+09:00</updated>
    <category scheme="http://www.blogger.com/atom/ns#" term="日記"/>
    <title type="text">2013年を雑に振り返り</title>
    <content type="html">&lt;p&gt;今年もあと1時間弱で終わりそうってことで振り返りをしてみる。もう1月1日まで時間がないのですごく雑になっちゃったｗ&lt;/p&gt;&lt;h4&gt;仕事&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;ORMapper作った&lt;/li&gt;&lt;li&gt;サービスの新規立ち上げ3本をお手伝い&lt;/li&gt;&lt;li&gt;Chef覚えた&lt;/li&gt;&lt;li&gt;Fabric覚えた&lt;/li&gt;&lt;li&gt;MySQL 5.6実戦投入した&lt;/li&gt;&lt;li&gt;Jenkinsが嫌いになった&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;プライベート&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;5月：猫を飼い始めた！&lt;/li&gt;&lt;li&gt;10月：&lt;a href="/2013/10/isucon3-20131005.html"&gt;ISUCON予選で惨敗した&lt;/a&gt;&lt;/li&gt;&lt;li&gt;11月：DevLove甲子園で&lt;a href="http://www.slideshare.net/oinume/20131109-devlove"&gt;コードはナマモノ 腐らせないために今までやってきたこと&lt;/a&gt;という発表をした&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;まとめ&lt;/h4&gt;&lt;p&gt;今年一番の思い出はISUCONの予選に惨敗したことだった。自分のショボさを思い知らされた＆界隈で凄腕とされるエンジニアの人たちは本当にすごいんだなぁということをすごく痛感したイベントだった。もっと貪欲になってスキルを磨かないとなと思ったのと、とにかくレベルの高い人たちと一緒に仕事をしたいと前にも増して思うようになった。あと、仕事では相変わらずやっていることが1.5年前と変わらなくなってきたので、今年の年末年始はUnityで糞ゲーでも作ろうかと思っている。しかしUnity覚えることが多くて大変＆糞ゲーを作るにも才能が必要なのだと感じているところ。&lt;/p&gt;&lt;p&gt;プライベートでは猫(ししまる)を飼い始めたのが一番大きかった。猫なのにやたら人なつっこくて(家に帰ってくると玄関までダッシュしてくる)、本当に毎日癒やされている。奥さんともいっつもししまるの話ばっかしている。&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.flickr.com/photos/oinume/11668341413/" title="年越し蕎麦を狙うししまる by oinume, on Flickr"&gt;&lt;img src="http://farm8.staticflickr.com/7453/11668341413_ee83ee57af.jpg" width="500" height="375" alt="年越し蕎麦を狙うししまる"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;そして来年は家族構成がインクリメントされるので、家でも仕事ももっと濃い時間が過ごせるように頑張っていこうと思う。来年も皆さまよろしくお願いします。&lt;/p&gt;</content>
    <link rel="replies" type="application/atom+xml" href="http://blogger.lampetty.net/feeds/1829211337552812245/comments/default" title="コメントの投稿"/>
    <link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4491739846469721202&amp;postID=1829211337552812245" title="0 件のコメント"/>
    <link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4491739846469721202/posts/default/1829211337552812245"/>
    <link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4491739846469721202/posts/default/1829211337552812245"/>
    <link rel="alternate" type="text/html" href="http://blogger.lampetty.net/2014/01/looking-back-at-2013.html" title="2013年を雑に振り返り"/>
    <author>
      <name>おいぬめ</name>
      <uri>http://www.blogger.com/profile/02863622759561006842</uri>
      <email>noreply@blogger.com</email>
      <gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_9yL0QjJSsuE/Sfqeg_NILzI/AAAAAAAAArQ/5eKH3HVGOmk/s1600-R/8250493%40N05.jpg%3F1232891863"/>
    </author>
    <thr:total>0</thr:total>
  </entry>
  <entry>
    <id>tag:blogger.com,1999:blog-4491739846469721202.post-9090302667878495453</id>
    <published>2013-12-30T12:44:00.000+09:00</published>
    <updated>2013-12-30T12:46:04.896+09:00</updated>
    <category scheme="http://www.blogger.com/atom/ns#" term="Linux"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="memcached"/>
    <title type="text">ncコマンドでmemcachedにコマンドを送りつける</title>
    <content type="html">&lt;p&gt;開発用のサーバでmemcachedのキャッシュを全消しするために flush_all をよく使うんだけど、telnetで対話的にコマンド送り込むのだるいのでそういう場合はnc(netcat)を使えばいいよー、という話。&lt;/p&gt;&lt;p&gt;下記はlocalhostの11211でLISTENしてるmemcachedにflush_allを送りつける例。&lt;/p&gt;&lt;pre style="background-color:#444;color:#0f0;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;&lt;br /&gt;$ echo flush_al | nc localhost 11211&lt;br /&gt;&lt;/pre&gt;</content>
    <link rel="replies" type="application/atom+xml" href="http://blogger.lampetty.net/feeds/9090302667878495453/comments/default" title="コメントの投稿"/>
    <link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4491739846469721202&amp;postID=9090302667878495453" title="0 件のコメント"/>
    <link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4491739846469721202/posts/default/9090302667878495453"/>
    <link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4491739846469721202/posts/default/9090302667878495453"/>
    <link rel="alternate" type="text/html" href="http://blogger.lampetty.net/2013/12/send-command-to-memcached-with-nc.html" title="ncコマンドでmemcachedにコマンドを送りつける"/>
    <author>
      <name>おいぬめ</name>
      <uri>http://www.blogger.com/profile/02863622759561006842</uri>
      <email>noreply@blogger.com</email>
      <gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_9yL0QjJSsuE/Sfqeg_NILzI/AAAAAAAAArQ/5eKH3HVGOmk/s1600-R/8250493%40N05.jpg%3F1232891863"/>
    </author>
    <thr:total>0</thr:total>
  </entry>
  <entry>
    <id>tag:blogger.com,1999:blog-4491739846469721202.post-7647908293633987307</id>
    <published>2013-12-28T21:12:00.000+09:00</published>
    <updated>2013-12-28T21:12:34.471+09:00</updated>
    <category scheme="http://www.blogger.com/atom/ns#" term="IntelliJ IDEA"/>
    <title type="text">IntelliJ IDEAを使いやすくするための設定とか</title>
    <content type="html">&lt;p&gt;3ヶ月前ぐらいからPython、RubyやJavaScriptなどのスクリプト言語でコードを書く時はIntelliJ IDEA(有償版)を使うようになった。以前はEmacsユーザだった。乗り換えた理由としては&lt;/p&gt;&lt;ul&gt;&lt;li&gt;IntelliJを試しに使ってみたらけっこう使い勝手が良かった&lt;ul&gt;&lt;li&gt;例えばPythonだと、SDKの設定さえすればimportしているモジュールのメソッドに簡単にジャンプできたり、変数や関数などのシンボルも可能な限り補完してくれる&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Emacsの設定をするのが辛くなった(プログラマとして恥ずべきことであるのは知っている)&lt;/li&gt;&lt;li&gt;IntelliJが様々な言語に対応しているため、これ一つあれば大丈夫感が強い&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;などだろうか。有償版はパーソナルライセンスで2万円ぐらいだけど、そのぐらい払う価値はあるかなぁと今のところ感じている。ただ、そんなIntelliJさんもやっぱり使いづらいところはあるので、個人的に必ず設定している項目を書いてみる。なお環境はMacで、IntelliJのバージョンは13。&lt;/p&gt;&lt;h4&gt;概念とか&lt;/h4&gt;&lt;p&gt;Eclipseユーザの人は&lt;a href="http://d.hatena.ne.jp/fuzzhead/20110731/p1"&gt;Eclipseユーザの為のIntelliJ IDEA QA&lt;/a&gt;を読むといいと思う。Eclipseとの違いが書かれている。ちなみに自分はJavaを書く時はいまだにEclipse使ってるｗ 長年蓄積された手癖というものがどうにも捨てられない。&lt;/p&gt;&lt;h4&gt;プラグインのインストール&lt;/h4&gt;&lt;p&gt;IntelliJでPythonやRubyを書くにはプラグインをインストールする必要がある。PreferencesのPluginsからポチポチ選択する。自分が入れているのは下記。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Python&lt;/li&gt;&lt;li&gt;Ruby&lt;/li&gt;&lt;li&gt;NodeJS&lt;/li&gt;&lt;li&gt;Scala&lt;/li&gt;&lt;li&gt;ReStructuredText&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;IDEAが使うJVMを変更する&lt;/h4&gt;&lt;p&gt;IntelliJはJVM上で動く。そのJVMを変えたい場合は&lt;/p&gt;&lt;p&gt;/Applications/IntelliJ\ IDEA\ 13.app/Contents/Info.plist を下記のように修正&lt;/p&gt;&lt;pre style="border:solid #666 1px;background-color:#fff;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;&lt;br /&gt;&amp;lt;key&amp;gt;JVMVersion&amp;lt;/key&amp;gt;&lt;br /&gt;&amp;lt;string&amp;gt;1.6*&amp;lt;/string&amp;gt;&lt;br /&gt;       ↓&lt;br /&gt;&amp;lt;key&amp;gt;JVMVersion&amp;lt;/key&amp;gt;&lt;br /&gt;&amp;lt;string&amp;gt;1.7*&amp;lt;/string&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;h4&gt;IntelliJ IDEAのヒープサイズ&lt;/h4&gt;&lt;p&gt;Version 12以降は /Applications/IntelliJ IDEA XX.app/bin/idea.vmoptions を ~/Library/Preferences/IntelliJIdeaXX/ にコピーして編集する。自分は下記のようにしてる。&lt;/p&gt;&lt;pre style="border:solid #666 1px;background-color:#fff;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;&lt;br /&gt;-Xms768m&lt;br /&gt;-Xmx768m&lt;br /&gt;-Xmn384m&lt;br /&gt;-XX:MaxPermSize=384m&lt;br /&gt;-XX:ReservedCodeCacheSize=96m&lt;br /&gt;-XX:+UseCodeCacheFlushing&lt;br /&gt;-XX:+UseCompressedOops&lt;br /&gt;&lt;/pre&gt;&lt;h4&gt;設定のimport/export&lt;/h4&gt;&lt;pre style="border:solid #666 1px;background-color:#fff;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;&lt;br /&gt;Preferences -&amp;gt; File -&amp;gt; import settings / export settings&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;でできる。SDKの設定はexport/importしない方が無難かもしれない。&lt;/p&gt;&lt;h4&gt;エディタのタブの設定&lt;/h4&gt;&lt;pre style="border:solid #666 1px;background-color:#fff;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;&lt;br /&gt;Preferences -&amp;gt; Editor -&amp;gt; Editor Tabs&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;以下の2つの設定をデフォルトから変えている。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Show directory in editor tabs for non-unique filenames: ファイル名が同じものを開いている場合ディレクトリ名を表示&lt;/li&gt;&lt;li&gt;Mark modified tabs with asterisk: 編集されたファイルのタブにはアスタリスクをつける&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;エディタ上でコピペした時に自動でフォーマットしない&lt;/h4&gt;&lt;p&gt;コピペする時に勝手にフォーマットしてくれて元のテキストの体裁を維持してくれない場合があるので、自分はCmd + V でペーストした場合の挙動を変えている。&lt;/p&gt;&lt;pre style="border:solid #666 1px;background-color:#fff;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;&lt;br /&gt;Preferences -&amp;gt; Keymap -&amp;gt; Paste Simple にCmd + V を割り当て&lt;br /&gt;&lt;/pre&gt;&lt;h4&gt;英語のスペルチェックをオフ&lt;/h4&gt;&lt;p&gt;造語などにいちいち波線がついてうざいのでオフにしてる。&lt;/p&gt;&lt;pre style="border:solid #666 1px;background-color:#fff;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;&lt;br /&gt;Preferences -&amp;gt; Inspections -&amp;gt; Spellingのチェックを外す&lt;br /&gt;&lt;/pre&gt;&lt;h4&gt;クォートやカッコを自動挿入しない&lt;/h4&gt;&lt;p&gt;自分はこういうのオフにする派。&lt;/p&gt;&lt;pre style="border:solid #666 1px;background-color:#fff;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;&lt;br /&gt;Preferences -&amp;gt; Editor -&amp;gt; SmarkKeys -&amp;gt; Insert pair bracket&lt;br /&gt;&lt;/pre&gt;&lt;h4&gt;エディタで表示しているファイルとプロジェクトのツリーの選択ファイルを同期する&lt;/h4&gt;&lt;p&gt;Eclipseではデフォルトで有効になっている機能。ファイルが多いプロジェクトだとこの機能ないとつらい。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;プロジェクトを開いた状態で、projectの設定(歯車みたいなやつ)をクリック&lt;/li&gt;&lt;li&gt;Auto Scroll from Sourceにチェックをつける&lt;/li&gt;&lt;/ul&gt;</content>
    <link rel="replies" type="application/atom+xml" href="http://blogger.lampetty.net/feeds/7647908293633987307/comments/default" title="コメントの投稿"/>
    <link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4491739846469721202&amp;postID=7647908293633987307" title="0 件のコメント"/>
    <link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4491739846469721202/posts/default/7647908293633987307"/>
    <link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4491739846469721202/posts/default/7647908293633987307"/>
    <link rel="alternate" type="text/html" href="http://blogger.lampetty.net/2013/12/custom-configuration-for-intellij-idea.html" title="IntelliJ IDEAを使いやすくするための設定とか"/>
    <author>
      <name>おいぬめ</name>
      <uri>http://www.blogger.com/profile/02863622759561006842</uri>
      <email>noreply@blogger.com</email>
      <gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_9yL0QjJSsuE/Sfqeg_NILzI/AAAAAAAAArQ/5eKH3HVGOmk/s1600-R/8250493%40N05.jpg%3F1232891863"/>
    </author>
    <thr:total>0</thr:total>
  </entry>
  <entry>
    <id>tag:blogger.com,1999:blog-4491739846469721202.post-6611411417529185517</id>
    <published>2013-12-14T12:17:00.001+09:00</published>
    <updated>2013-12-14T18:36:07.555+09:00</updated>
    <category scheme="http://www.blogger.com/atom/ns#" term="日記"/>
    <title type="text">環境をリセットする</title>
    <content type="html">&lt;p&gt;最近日々思っていることを文章にしてみる。特に深い意味はないし結論もない。&lt;/p&gt;&lt;p&gt;何年も同じ会社や部署にいると、自分の立ち位置・イメージみたいなものが凝り固まってくる。「この人はすごいデキる人だ」「この人と一緒に仕事をすればいいものが作れる」とか、もしくはその逆。こうなってくると自分は定期的に「ああ、リセットしてゼロからやり直したい」と思ってしまう。いわゆるダーマの神殿行く的な？おそらく頻繁に転職する人だったり部署異動する人はこういうリセット志向が強い人だと思う。&lt;/p&gt;&lt;p&gt;例えば転職して新しい会社でまわりは誰も知らない人だと、早く一人前に仕事できるようになってまわりからの期待に応えたいと思うし、そうやって信頼を勝ち取って行くのは自分にとってもすごく嬉しい。何より転職前に比べてモチベーションは圧倒的に高い。&lt;/p&gt;&lt;p&gt;なので、頻繁に転職するいわゆるジョブホッパーな人は、ネガティブに見れば「どこの組織でもうまくやれてない」可能性もあるんだけど、上のようなリセット力の高い人もけっこういるんじゃないかなぁと思うし、そういう人はいろんな環境・仕事をやってて経験豊富で優秀だったりする。でも世間ではあまりこういう考え方が浸透していない気がしていて残念。&lt;/p&gt;</content>
    <link rel="replies" type="application/atom+xml" href="http://blogger.lampetty.net/feeds/6611411417529185517/comments/default" title="コメントの投稿"/>
    <link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4491739846469721202&amp;postID=6611411417529185517" title="0 件のコメント"/>
    <link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4491739846469721202/posts/default/6611411417529185517"/>
    <link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4491739846469721202/posts/default/6611411417529185517"/>
    <link rel="alternate" type="text/html" href="http://blogger.lampetty.net/2013/12/reset-workplace.html" title="環境をリセットする"/>
    <author>
      <name>おいぬめ</name>
      <uri>http://www.blogger.com/profile/02863622759561006842</uri>
      <email>noreply@blogger.com</email>
      <gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_9yL0QjJSsuE/Sfqeg_NILzI/AAAAAAAAArQ/5eKH3HVGOmk/s1600-R/8250493%40N05.jpg%3F1232891863"/>
    </author>
    <thr:total>0</thr:total>
  </entry>
  <entry>
    <id>tag:blogger.com,1999:blog-4491739846469721202.post-7834355617158098428</id>
    <published>2013-12-07T14:59:00.002+09:00</published>
    <updated>2013-12-07T15:07:29.908+09:00</updated>
    <category scheme="http://www.blogger.com/atom/ns#" term="SublimeText"/>
    <title type="text">MacでターミナルからSublimeTextでファイルを開く</title>
    <content type="html">&lt;p&gt;こんな感じでPATHが通っているところにsublコマンドのシンボリックリンクをはってやる。&lt;/p&gt;&lt;pre style="background-color:#444;color:#0f0;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;&lt;br /&gt;$ ln -s /Applications/Sublime\ Text\ 2.app/Contents/SharedSupport/bin/subl /usr/local/bin/subl&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;で、あとはsublコマンドでファイルなりディレクトリを開けばOK。&lt;/p&gt;</content>
    <link rel="replies" type="application/atom+xml" href="http://blogger.lampetty.net/feeds/7834355617158098428/comments/default" title="コメントの投稿"/>
    <link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4491739846469721202&amp;postID=7834355617158098428" title="0 件のコメント"/>
    <link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4491739846469721202/posts/default/7834355617158098428"/>
    <link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4491739846469721202/posts/default/7834355617158098428"/>
    <link rel="alternate" type="text/html" href="http://blogger.lampetty.net/2013/12/open-with-sublime-text2.html" title="MacでターミナルからSublimeTextでファイルを開く"/>
    <author>
      <name>おいぬめ</name>
      <uri>http://www.blogger.com/profile/02863622759561006842</uri>
      <email>noreply@blogger.com</email>
      <gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_9yL0QjJSsuE/Sfqeg_NILzI/AAAAAAAAArQ/5eKH3HVGOmk/s1600-R/8250493%40N05.jpg%3F1232891863"/>
    </author>
    <thr:total>0</thr:total>
  </entry>
  <entry>
    <id>tag:blogger.com,1999:blog-4491739846469721202.post-4218460684472429301</id>
    <published>2013-10-20T23:53:00.000+09:00</published>
    <updated>2013-10-20T23:53:18.910+09:00</updated>
    <category scheme="http://www.blogger.com/atom/ns#" term="Python"/>
    <title type="text">標準出力・標準エラー出力をキャプチャするPythonのライブラリを作った</title>
    <content type="html">&lt;p&gt;&lt;a href="https://pypi.python.org/pypi/iocapture"&gt;https://pypi.python.org/pypi/iocapture&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Perlでいう&lt;a href="http://search.cpan.org/dist/Capture-Tiny/lib/Capture/Tiny.pm"&gt;Capture::Tiny&lt;/a&gt;みたいなやつのPython版が欲しかったので作ってみた。Python3にも対応させた(つもり)。&lt;/p&gt;</content>
    <link rel="replies" type="application/atom+xml" href="http://blogger.lampetty.net/feeds/4218460684472429301/comments/default" title="コメントの投稿"/>
    <link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4491739846469721202&amp;postID=4218460684472429301" title="0 件のコメント"/>
    <link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4491739846469721202/posts/default/4218460684472429301"/>
    <link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4491739846469721202/posts/default/4218460684472429301"/>
    <link rel="alternate" type="text/html" href="http://blogger.lampetty.net/2013/10/released-python-iocapture.html" title="標準出力・標準エラー出力をキャプチャするPythonのライブラリを作った"/>
    <author>
      <name>おいぬめ</name>
      <uri>http://www.blogger.com/profile/02863622759561006842</uri>
      <email>noreply@blogger.com</email>
      <gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_9yL0QjJSsuE/Sfqeg_NILzI/AAAAAAAAArQ/5eKH3HVGOmk/s1600-R/8250493%40N05.jpg%3F1232891863"/>
    </author>
    <thr:total>0</thr:total>
  </entry>
  <entry>
    <id>tag:blogger.com,1999:blog-4491739846469721202.post-5892891527311939089</id>
    <published>2013-10-20T02:43:00.000+09:00</published>
    <updated>2013-10-20T02:43:13.124+09:00</updated>
    <category scheme="http://www.blogger.com/atom/ns#" term="日記"/>
    <title type="text">ここ3ヶ月で取り組んだ技術とか</title>
    <content type="html">&lt;p&gt;去年から新規のソーシャルゲームの立ち上げのヘルプをしていて、つい最近も1つリリースした。リリースも何とか無事に終わりデスマも落ちついたので、ここ3ヶ月ぐらい主に仕事で使ってきた技術をここらでまとめておこうと思う。&lt;/p&gt;&lt;h4&gt;Java&lt;/h4&gt;&lt;p&gt;うちの会社はサーバサイドの言語はJavaかNode.js(JavaScript)が多い。自分がたずさわっているプロジェクトはJava。正直Javaなんて面倒なんでやめたいんだけど、これ使えばけっこう開発が楽になる、っていう技術が2つ。&lt;/p&gt;&lt;h4&gt;&lt;a href="http://zeroturnaround.com/software/jrebel/"&gt;JRebel&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;いわゆるホットリローディングを実現してくれるソフトウェア。IDEに組み込んで使う。該当クラスのソースを編集すると自動的にクラスを再ロードしてくれる。有償製品だけどJRebel Socialなんていう謎なライセンスで無料で使うことができる。&lt;/p&gt;&lt;h4&gt;&lt;a href="http://projectlombok.org/"&gt;Lombok&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;a href="http://ameblo.jp/principia-ca/entry-11562887744.html"&gt;会社のブログ&lt;/a&gt;に概要を書いたので見てくらはい。&lt;/p&gt;&lt;h4&gt;&lt;a href="http://newrelic.com/"&gt;NewRelic&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;パフォーマンス解析ツール。負荷テストをしながらNewRelicを使ってどこがボトルネックかを調査した。任意のURL(に対する処理)を一定時間プロファイリングするX-Rayっていう機能が便利だった。ただNewRelicの全機能の10%も使ってないと思われる。&lt;/p&gt;&lt;h4&gt;&lt;a href="http://www.vagrantup.com/"&gt;Vagrant&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;うちの会社はChefでサーバ構築するようになってきていて、自分もやっと真面目にChefに取り組んでみた。VagrantはChefのレシピをテストするのに使っていた。&lt;/p&gt;&lt;pre style="background-color:#444;color:#0f0;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;&lt;br /&gt;$ vagrant up&lt;br /&gt;$ vagrant provision&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;で cookbooks がゲストOSに転送されてchef-soloが実行される。すごいシームレスに統合されていてすごいなぁと思う。ドキュメントもしっかりしていて特に躓くこともなかった。&lt;/p&gt;&lt;h4&gt;&lt;a href="http://docs.fabfile.org/en/latest/"&gt;Fabric&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Python版のCapistranoみたいなやつ。最初はShellScriptでディプロイスクリプトを書いていたんだけど、複雑な処理をやらせるにはちょっと役不足だったので、代わりにこれを使った。@parallel っていうデコレータつけるだけでタスクが並列で実行されるのがよい。&lt;/p&gt;&lt;h4&gt;&lt;a href="http://gruntjs.com/"&gt;Grunt&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;最近流行っているnode.js製のJavaScript関連のタスクランナー。JavaScriptのminifyとかconcatするのに使った。&lt;/p&gt;&lt;h4&gt;&lt;a href="http://www.chatwork.com/ja/"&gt;ChatWork&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Skypeの代わりにこれを使っていた。ただ正直Skypeの方が好きだ。HipChatはいつか試したい。&lt;/p&gt;&lt;h4&gt;&lt;a href="http://www.jetbrains.com/idea/"&gt;IntelliJ IDEA&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;JavaのコードはEclipseで書いてたんだけど、PythonやRubyのコードはIntelliJで書いてる。ちょっと設定するだけで補完が利くようになるのがいい。&lt;/p&gt; </content>
    <link rel="replies" type="application/atom+xml" href="http://blogger.lampetty.net/feeds/5892891527311939089/comments/default" title="コメントの投稿"/>
    <link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4491739846469721202&amp;postID=5892891527311939089" title="0 件のコメント"/>
    <link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4491739846469721202/posts/default/5892891527311939089"/>
    <link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4491739846469721202/posts/default/5892891527311939089"/>
    <link rel="alternate" type="text/html" href="http://blogger.lampetty.net/2013/10/2013-10-recent-tech.html" title="ここ3ヶ月で取り組んだ技術とか"/>
    <author>
      <name>おいぬめ</name>
      <uri>http://www.blogger.com/profile/02863622759561006842</uri>
      <email>noreply@blogger.com</email>
      <gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_9yL0QjJSsuE/Sfqeg_NILzI/AAAAAAAAArQ/5eKH3HVGOmk/s1600-R/8250493%40N05.jpg%3F1232891863"/>
    </author>
    <thr:total>0</thr:total>
  </entry>
  <entry>
    <id>tag:blogger.com,1999:blog-4491739846469721202.post-8988436485766698784</id>
    <published>2013-10-07T01:42:00.001+09:00</published>
    <updated>2013-10-07T19:54:00.028+09:00</updated>
    <category scheme="http://www.blogger.com/atom/ns#" term="ISUCON"/>
    <title type="text">#isucon の予選に出場して惨敗してきた( ｰ`дｰ´)ｷﾘｯ</title>
    <content type="html">&lt;p&gt;&lt;a href="https://twitter.com/la_luna_azul"&gt;@la_luna_azul&lt;/a&gt;さんと&lt;a href="https://twitter.com/oranie"&gt;@oranie&lt;/a&gt;さんとでISUCON1日目に参戦してきた。結果から言うとトップと約8倍差がついて惨敗10位ぐらいには入れるかなーと思ったけど考えが甘かったし、準備も実力も足りなかった。&lt;/p&gt;&lt;h4&gt;準備&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;bitbucketにプライベートリポジトリ作って、そこのWikiに事前にやったほうがいいことなどをまとめたりした。&lt;/li&gt;&lt;li&gt;必要そうなRPMを事前に作ってもらった&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;やったこと&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;言語はPythonを選択&lt;ul&gt;&lt;li&gt;Python 3.3.2が使われていたのが予想外だった&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;ソースはすべてbitbucketのプライベートリポジトリに突っ込み、簡単にディプロイするようにした&lt;/li&gt;&lt;li&gt;最初の方はset global general_log =ONにしたり、mysqldumpslowやapachetopで傾向を把握&lt;/li&gt;&lt;li&gt;memcachedが11212で立ち上がっていたので、アプリからmemcachedへの向き先のポートを変えた&lt;/li&gt;&lt;li&gt;my.cnfのチューニング&lt;ul&gt;&lt;li&gt;クエリキャッシュ多め&lt;/li&gt;&lt;li&gt;あとは一般的なチューニング&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;SELECT username FROM users WHERE id = ? みたいなクエリが多かったのと、userのレコード数が400だったので、usernameをアプリ起動時に全件取得してmemcachedに全て突っ込むようにした&lt;ul&gt;&lt;li&gt;Flaskには @before_first_request なんていう便利なデコレータがあることをこの時初めて知る&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;memosのuser, created_atにインデックスが貼ってなかったのではった&lt;ul&gt;&lt;li&gt;複合インデックスより個別にインデックスを貼ったほうがなぜか速かった&lt;/li&gt;&lt;li&gt;ただしbenchコマンドを実行するとテーブルが初期化されることに14時ぐらいまで気付かなかったorz&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;静的ファイルをApacheで返すようにした&lt;ul&gt;&lt;li&gt;最後にはnginxに変更。ただしスコア的には変わらず&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;SELECT count(id) AS c FROM memos WHERE is_private=0 みたいなカウントをmemcachedに突っ込んだ&lt;/li&gt;&lt;li&gt;自家製のスクリプトを使って下記のようにどのURLが全体として遅いのかを把握&lt;/li&gt;&lt;li&gt;MarkdownをHTMLに変換する処理がbin/markdownコマンドをサブプロセス起動で行っていたので、これをPythonのMarkdownモジュールを使って変換するようにした。結局、これが一番スコアに効いた&lt;/li&gt;&lt;li&gt;SELECT COUNT(*) しているところを SELECT COUNT(id)に変えた&lt;/li&gt;&lt;li&gt;SELECT * FROM users WHERE id=? をキャッシュするようにした&lt;/li&gt;&lt;li&gt;NewRelicのインストールを試みるもうまくいかず頓挫&lt;/li&gt;&lt;li&gt;SELECT * FROM memos WHERE is_private=0 ORDER BY created_at DESC, id DESC LIMIT 100 みたいなクエリがあったので、created_atとidをASCでソートできるように逆順カラムを作った。ただしこれは最後のほうにbenchmarkコマンドでFAILしたので諦めた&lt;/li&gt;&lt;li&gt;geventをインストールしようとするも頓挫&lt;/li&gt;&lt;li&gt;gunicornのworker数の調整&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;反省点&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;事前の打ち合わせで @la_luna_azul = フロント回り、@oranie = データベース回り、@oinume = アプリ回りと役割を分担してしまっていたため、「その時の最大のボトルネック」を直すことより各々で担当領域のことをやってしまっていた。ボトルネックを全員で全力で解決するアプローチのほうがこういうケースだと良かったのでは？と反省会で話していた。&lt;/li&gt;&lt;li&gt;EC2のインスタンスを3人分作ってやっていたので、おのおのが行ったサーバの設定変更などを反映させるのに無駄に時間がかかってしまった。本番環境とテスト環境、の2つぐらいで良かったのでは？と思う。&lt;/li&gt;&lt;li&gt;「このURLが遅いしアクセス数も多い」みたいなことまでしか把握せずに、アプリケーションのどこがボトルネックかを正確に追ってなかったので、効果が高いチューニングをあまり行えなかったような気がする&lt;/li&gt;&lt;li&gt;Markdownのサブプロセス問題に気付いたのが14:00ぐらいだった。最初からソースを全部読んでいればもっと早くここは直せたように思う。&lt;/li&gt;&lt;li&gt;NewRelicインストールできなかった&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;感想&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;自分の力のなさがわかっただけでも参加した甲斐があった&lt;/li&gt;&lt;li&gt;コードの修正は意外と早くできたので、もっと怪しい箇所のあたりをつけるのを的確にできるようになりたい(ので修行します)&lt;/li&gt;&lt;li&gt;正攻法では突き抜けたスコアは出ないだろうなぁと思ったけど意外とそうでもなさそうだった(1, 2位の人たち以外)&lt;/li&gt;&lt;li&gt;あの問題やベンチマークツールを作るの大変だっただろうなぁ。運営の皆さまお疲れさまでした！&lt;/li&gt;&lt;/ul&gt;</content>
    <link rel="replies" type="application/atom+xml" href="http://blogger.lampetty.net/feeds/8988436485766698784/comments/default" title="コメントの投稿"/>
    <link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4491739846469721202&amp;postID=8988436485766698784" title="0 件のコメント"/>
    <link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4491739846469721202/posts/default/8988436485766698784"/>
    <link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4491739846469721202/posts/default/8988436485766698784"/>
    <link rel="alternate" type="text/html" href="http://blogger.lampetty.net/2013/10/isucon3-20131005.html" title="#isucon の予選に出場して惨敗してきた( ｰ`дｰ´)ｷﾘｯ"/>
    <author>
      <name>おいぬめ</name>
      <uri>http://www.blogger.com/profile/02863622759561006842</uri>
      <email>noreply@blogger.com</email>
      <gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_9yL0QjJSsuE/Sfqeg_NILzI/AAAAAAAAArQ/5eKH3HVGOmk/s1600-R/8250493%40N05.jpg%3F1232891863"/>
    </author>
    <thr:total>0</thr:total>
  </entry>
  <entry>
    <id>tag:blogger.com,1999:blog-4491739846469721202.post-3261644584696622475</id>
    <published>2013-09-20T02:06:00.002+09:00</published>
    <updated>2013-09-20T02:07:53.104+09:00</updated>
    <category scheme="http://www.blogger.com/atom/ns#" term="Python"/>
    <title type="text">PyCon APAC 2013 2日目に行ってきた(2) #pyconapac</title>
    <content type="html">&lt;ul&gt;&lt;li&gt;&lt;a href="/2013/09/pycon-apac-2013-09-14-1.html"&gt;PyCon APAC 2013 1日目に行ってきた(1) #pyconapac&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="/2013/09/pycon-apac-2013-09-14-2.html"&gt;PyCon APAC 2013 1日目に行ってきた(2) #pyconapac&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="/2013/09/pycon-apac-2013-09-14-3.html"&gt;PyCon APAC 2013 1日目に行ってきた(3) #pyconapac&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="/2013/09/pycon-apac-2013-09-15-1.html"&gt;PyCon APAC 2013 2日目に行ってきた(1) #pyconapac&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;ちょっと間が空いてしまったけど、PyCon APACの2日目の後半。Pythonでハードウェアを操る話、ちょうどRasberryPiを買ったので耳寄り情報が多かった。とりあえずpyserialは入れとけと。&lt;/p&gt;&lt;p&gt;あとDjangoのデバッグの話は、django-debug-toolbarなど興味深かった。これって他のフレームワークにも移植されてて、Flask版やBottle版もあるみたい。そういえばBottleはwerkzeugで動かすこともできたような。&lt;/p&gt;&lt;h4&gt;PythonでハードウェアをWebAPIにした話&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;北神雄太さん @nonNoise&lt;/li&gt;&lt;li&gt;所属：ArtifactNoise&lt;/li&gt;&lt;li&gt;職業：発明家&lt;/li&gt;&lt;li&gt;主な開発：Elpis Framework&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.slideshare.net/yutakitagami/pythonwebapi-pyconapac"&gt;スライド&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;気になってる話題&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;Tessel&lt;ul&gt;&lt;li&gt;JavaScript, Nodeが動くらしい&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Arduino YUN (アードゥイーノ ヤン)&lt;ul&gt;&lt;li&gt;Linuxが乗ってる&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;GALAXY Gear&lt;/li&gt;&lt;li&gt;Nymi&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;ハードウェア界隈の話&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;Arduinoの進化&lt;/li&gt;&lt;li&gt;RaspberryPiなどのカード型PCの登場&lt;/li&gt;&lt;li&gt;RaspberryPiのPiはPythonのパイらしい&lt;/li&gt;&lt;li&gt;PyGameが標準で入っている！&lt;/li&gt;&lt;li&gt;Linuxなら標準で入っているので、カード型PCでPythonを動かし、特殊なハードウェアをコントロールする新しいムーブメント&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;Pythonでハードウェアを扱う方法&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;Pyserialを使う。簡単&lt;/li&gt;&lt;li&gt;USBが刺さった時にどっちのポートが刺さったかわからない&lt;/li&gt;&lt;li&gt;USB Serial変換チップ&lt;ul&gt;&lt;li&gt;USBがttyとして認識される！&lt;/li&gt;&lt;li&gt;USBのドライバを書かなくてすむ&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;マザーボードのIOを直接操作できる&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;ハードウェアとのやりとり&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;基本的にはコマンド方式がほとんど&lt;ul&gt;&lt;li&gt;1(前へ進む), 2(後ろへ進む)&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;ハードウェアをWebAPIにする&lt;/h5&gt;&lt;p&gt;(メモあんまり残ってない)&lt;/p&gt;&lt;pre style="border:solid #666 1px;background-color:#fff;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;&lt;br /&gt;ser.getline()&lt;br /&gt;&lt;/pre&gt;&lt;h4&gt;Django最速デバッグ指南&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;@hirokiky さん&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.slideshare.net/hirokiky/django-yconapac2013"&gt;スライド&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;django-pdb&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;-pm&lt;ul&gt;&lt;li&gt;Exception出たらデバッガが起動する&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;django-devserver&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;SQLのクエリのログ&lt;/li&gt;&lt;li&gt;リクエストの情報&lt;/li&gt;&lt;li&gt;プロファイリング情報&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;などをコンソールに出力。&lt;/p&gt;&lt;p&gt;django-debugtoolbarはテンプレートを使っていないと表示されない。APIだとデバッグ情報は見れない。あとJSが走るのでJSゴリゴリ書いているとエラーになる可能性がある。&lt;/p&gt;&lt;h5&gt;runserverwerkzeug&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;Flaskの人が作っているWSGI実装&lt;/li&gt;&lt;li&gt;ブラウザ上でインタラクティブなデバッガーが使える&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;logging&lt;/h5&gt;&lt;ol&gt;&lt;li&gt;logger.error(Invalid code: %s%azunyan)&lt;/li&gt;&lt;li&gt;logger.error(Invalid code: %s,miotan)&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;2.が正しい。理由は2.で書いておくとログ集約ができるから。&lt;/p&gt;&lt;p&gt;重要な点&lt;/p&gt;&lt;ul&gt;&lt;li&gt;正しく使う&lt;/li&gt;&lt;li&gt;ログレベルの認識を一致させる&lt;/li&gt;&lt;li&gt;ログの頻度の統一&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;debug,info,warning(warn),error,critical(crit)&lt;/p&gt;&lt;ul&gt;&lt;li&gt;debug&lt;ul&gt;&lt;li&gt;開発時のみ出力&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;info&lt;ul&gt;&lt;li&gt;ファイル出力&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;warning&lt;ul&gt;&lt;li&gt;機能は動作してるけど何か間違っている&lt;/li&gt;&lt;li&gt;処理は継続できるけど何かがおかしい&lt;/li&gt;&lt;li&gt;バリデーションエラーぐらいの認識&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;error&lt;ul&gt;&lt;li&gt;500エラー&lt;/li&gt;&lt;li&gt;バッチが落ちるレベル&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;critical&lt;ul&gt;&lt;li&gt;使わない&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;その他開発・運用で使っているツール&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;PyCharm: Python向けIDE(IntelliJ)&lt;/li&gt;&lt;li&gt;Sentry: ログ収集プラットフォーム&lt;ul&gt;&lt;li&gt;ログを集約してメールで通知とか&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;まとめ&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;デバッグには何が起こっているのかを理解するのが大事&lt;/li&gt;&lt;li&gt;ツールを正しく使えばデバッグ時の負荷を減らせる&lt;/li&gt;&lt;/ul&gt; </content>
    <link rel="replies" type="application/atom+xml" href="http://blogger.lampetty.net/feeds/3261644584696622475/comments/default" title="コメントの投稿"/>
    <link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4491739846469721202&amp;postID=3261644584696622475" title="0 件のコメント"/>
    <link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4491739846469721202/posts/default/3261644584696622475"/>
    <link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4491739846469721202/posts/default/3261644584696622475"/>
    <link rel="alternate" type="text/html" href="http://blogger.lampetty.net/2013/09/pycon-apac-2013-09-15-2.html" title="PyCon APAC 2013 2日目に行ってきた(2) #pyconapac"/>
    <author>
      <name>おいぬめ</name>
      <uri>http://www.blogger.com/profile/02863622759561006842</uri>
      <email>noreply@blogger.com</email>
      <gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_9yL0QjJSsuE/Sfqeg_NILzI/AAAAAAAAArQ/5eKH3HVGOmk/s1600-R/8250493%40N05.jpg%3F1232891863"/>
    </author>
    <thr:total>0</thr:total>
  </entry>
  <entry>
    <id>tag:blogger.com,1999:blog-4491739846469721202.post-6944259756194008474</id>
    <published>2013-09-17T00:15:00.001+09:00</published>
    <updated>2013-09-17T00:46:43.778+09:00</updated>
    <category scheme="http://www.blogger.com/atom/ns#" term="Python"/>
    <title type="text">PyCon APAC 2013 2日目に行ってきた(1) #pyconapac</title>
    <content type="html">&lt;ul&gt;&lt;li&gt;&lt;a href="/2013/09/pycon-apac-2013-09-14-1.html"&gt;PyCon APAC 2013 1日目に行ってきた(1) #pyconapac&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="/2013/09/pycon-apac-2013-09-14-2.html"&gt;PyCon APAC 2013 1日目に行ってきた(2) #pyconapac&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="/2013/09/pycon-apac-2013-09-14-3.html"&gt;PyCon APAC 2013 1日目に行ってきた(3) #pyconapac&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;今日も基調講演は聞けなかったんだけど、その日のうちにYouTubeにアップされていたので早速見てみたら、リアルタイムで見れなかったのがすごい悔やまれる内容だった。Pythonが遅いとか、信頼できるシステムを作りにくいとか言われるけど、本当この人の言っている通りだなぁと思った。自分は普段Java書いてて、Javaはたしかにスレッドがあるから速いしスケーラブルだけど、その速さ・スケーラブルさを必要とするシーンって一体どのぐらいあるんだろう？っていうのはいつも思っていて。よく「TwitterがRailsやめてJVMに移行したからこれからはJVMの時代だぜヒャッハー」みたいなことをいう人がいるけど、「TwitterレベルのトラフィックだからJVMが必要」なんであって大抵のケースにはJVMは必要ないんだよねー。だってDropboxですらPythonなんだもの。&lt;/p&gt;&lt;p&gt;あと、清水川さんの2.5から3.3まで対応させる話、ちょうど&lt;a href="https://github.com/oinume/tomahawk"&gt;tomahawk&lt;/a&gt;をPython3対応しないとなぁと思っていたので渡りに舟だった。sixっていうモジュールは名前は知っていたんだけどあそこまで便利に使えるヤツだとは知らなかったので、その話が聞けただけでも今日は来た甲斐があった。&lt;/p&gt;&lt;h4&gt;Keynote: One Million Lines of Python&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;Rian Hunterさん&lt;/li&gt;&lt;li&gt;Dropboxの3人めの社員&lt;/li&gt;&lt;li&gt;最初の仕事はLinux版のデスクトップクライアントを作ることだった&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.youtube.com/watch?v=as3ISHCknz0"&gt;動画&lt;/a&gt;&lt;/li&gt;&lt;li&gt;C, Python, Haskell を書く&lt;/li&gt;&lt;li&gt;Python makes me feel good&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;動的型付け言語ではRobustなシステムは作れない？&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;You can build a reliable foundation with Python&lt;/li&gt;&lt;li&gt;We did (かっこいい！)&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;「Pythonが遅い」問題&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;あなたのコードのボトルネックはCPUバウンドな処理なのか？&lt;ul&gt;&lt;li&gt;たいてい違う&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;CPUバウンドじゃないなら、Pythonが遅くてもそれは関係ない&lt;/li&gt;&lt;li&gt;本当にCPUバウンドなら、その部分だけCで書けばいい&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;GIL&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;multithreading以外にもmultiprocessingがある&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;Dynamically typed じゃなくて Duck typing&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/100511"&gt;これ&lt;/a&gt;に感銘を受けた(The Zen of Duck Typing)&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;Python2.5から3.3で動作するツールの作り方&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;@shimizukawa さん&lt;/li&gt;&lt;li&gt;ビープラウド所属&lt;/li&gt;&lt;li&gt;&lt;a href="http://shimizukawa.bitbucket.org/pyconapac2013-how-to-make-with-python2-to-3/"&gt;スライド&lt;/a&gt;&lt;/li&gt;&lt;li&gt;題材は sphinx-intl&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;sphinx-intl&lt;/h5&gt;&lt;p&gt;国際化機能をサポートするツール&lt;/p&gt;&lt;ul&gt;&lt;li&gt;potから言語別poの生成、更新、ビルド&lt;/li&gt;&lt;li&gt;モチベーション&lt;ul&gt;&lt;li&gt;sphinxの対応バージョンが2.5-3.3&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;本体500行ぐらい&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;2.5から3.3の違い&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;ライブラリの違い&lt;/li&gt;&lt;li&gt;ビルトイン関数の違い&lt;/li&gt;&lt;li&gt;文法の違い&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;ライブラリの違い&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;optparse(まだある)&lt;ul&gt;&lt;li&gt;argparse(2.7以降、3.2以降)&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;OrderedDict(2.7から)&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;optparseとargparse&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;optparseよりargparseの方が使いやすい&lt;/li&gt;&lt;li&gt;2.7, 3.2以降で標準ライブラリになった&lt;ul&gt;&lt;li&gt;pip install argparse でインストールできる&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;sphinx-intl ではoptparseをまだ使っている&lt;ul&gt;&lt;li&gt;なるべく標準ライブラリで動かしたいので&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;OrderedDict&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;Dicionaryだけど順番を保持してくれる便利なアレ&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;unicode, str, bytes&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;Python2のstr()はPython3のbytes()&lt;/li&gt;&lt;li&gt;2のunicode()は3のstr()&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;func&lt;em&gt;codeと&lt;/em&gt;&lt;em&gt;code&lt;/em&gt;_&lt;/h5&gt;&lt;p&gt;関数オブジェクトの属性を取る&lt;br&gt;関数の引数の数や変数名とかいろいろ取れる&lt;/p&gt;&lt;pre style="border:solid #666 1px;background-color:#fff;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;&lt;br /&gt;argcount = spam.func_code.co_argument&lt;br /&gt;spam.func_code.co_varnames[:argcount]&lt;br /&gt;&lt;br /&gt;argcount = spam.__code__.co_argument&lt;br /&gt;spam.__code__.co_varnames[:argcount]&lt;br /&gt;&lt;/pre&gt;&lt;h5&gt;callable&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;3.0,3.1で組み込み関数から消えたが3.2で復活した&lt;/li&gt;&lt;li&gt;そのオブジェクトが関数として呼び出し可能かどうか判定する&lt;/li&gt;&lt;li&gt;なんで削除されたのだろう？&lt;/li&gt;&lt;/ul&gt;&lt;pre style="border:solid #666 1px;background-color:#fff;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;&lt;br /&gt;try:&lt;br /&gt;   callable = callable&lt;br /&gt;except NameError:&lt;br /&gt;   def callable(obj):&lt;br /&gt;      __mro__みて__call__があるか調べる&lt;br /&gt;&lt;/pre&gt;&lt;h5&gt;execfile消滅&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;evalみたいなもん？&lt;/li&gt;&lt;li&gt;open(), read(), compile(), exec() をやれば同じことができる&lt;/li&gt;&lt;li&gt;execもPy3で文から式に変わった&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;with&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;2.5から from&lt;strong&gt;future&lt;/strong&gt;import with_statement&lt;/li&gt;&lt;li&gt;2.6以上はimportしなくても使える&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;print文とprint関数&lt;/h5&gt;&lt;p&gt;Py2はprintは文&lt;/p&gt;&lt;pre style="border:solid #666 1px;background-color:#fff;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;&lt;br /&gt;# Py2&lt;br /&gt;&amp;gt; print 'spam', 'egg', 'ham'&lt;br /&gt;spam egg ham&lt;br /&gt;&lt;br /&gt;&amp;gt; print('spam', 'egg', 'ham')&lt;br /&gt;('spam', 'egg', 'ham')&lt;br /&gt;&lt;br /&gt;# Py3&lt;br /&gt;&amp;gt; print('spam', 'egg', 'ham')&lt;br /&gt;spam egg ham&lt;br /&gt;&lt;/pre&gt;&lt;pre style="border:solid #666 1px;background-color:#fff;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;&lt;br /&gt;print &amp;gt;&amp;gt;sys.stderr, ,&lt;br /&gt;...&lt;br /&gt;print 'done'&lt;br /&gt;&lt;br /&gt;print('image', filename, 'loading...', end=' ', file=sys.stderr)&lt;br /&gt;data = load_image(filename)&lt;br /&gt;print('done.')&lt;br /&gt;&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;from&lt;strong&gt;future&lt;/strong&gt;import print_function&lt;ul&gt;&lt;li&gt;python2.5では使えない&lt;/li&gt;&lt;li&gt;じゃあprint関数を自分で実装するか！&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;じゃあどうやって2でも3でも動かすか&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;2to3を使う&lt;/li&gt;&lt;li&gt;両対応コードを書く&lt;/li&gt;&lt;li&gt;sixを使う&lt;ul&gt;&lt;li&gt;2 x 3だからsixっていう名前らしい&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;2to3&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;Py3には2to3が用意されている&lt;/li&gt;&lt;li&gt;Py2をPy3に変換するプログラム&lt;/li&gt;&lt;li&gt;setuptoolsはsetup(2to3=True)って書いておくとインストール時に変換できる&lt;/li&gt;&lt;/ul&gt;&lt;h6&gt;Pros&lt;/h6&gt;&lt;ul&gt;&lt;li&gt;既存の資産を簡単に活かせる&lt;/li&gt;&lt;/ul&gt;&lt;h6&gt;Cons&lt;/h6&gt;&lt;ul&gt;&lt;li&gt;2to3は遅い&lt;/li&gt;&lt;li&gt;テスト実行のために毎回2to3を動かす必要がある&lt;/li&gt;&lt;li&gt;Py3でのみエラーがある場合、変換後のコードで問題があると面倒&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;両対応コード&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;2to3がいらない&lt;/li&gt;&lt;li&gt;デバッグしやすい(重要)&lt;/li&gt;&lt;li&gt;Py2.6以降ならだいたいPy3互換の書き方ができる&lt;/li&gt;&lt;li&gt;Py2.4対応は可能だが絶望的&lt;/li&gt;&lt;li&gt;Py2.5を投げ捨てたくなる&lt;/li&gt;&lt;li&gt;差異の吸収を自前で実装するのはつらい&lt;ul&gt;&lt;li&gt;print関数とかね&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;sphinx-intlはどうしたか&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;諦めてsixを使った&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;six&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;1.4.1 release (2013/9/2)&lt;/li&gt;&lt;li&gt;2.4から3.3まで対応&lt;/li&gt;&lt;li&gt;移動や名前変更は内部でバージョン判定して呼び直している(movesパッケージ)&lt;/li&gt;&lt;li&gt;execfileだけは自前で実装する必要がある&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;sphinx-intlで避けられなかった2to3&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;sphinxのconf.pyはユーザが書くものなので、2か3で書いてあるかわからない&lt;/li&gt;&lt;li&gt;execfileで読み込んでエラーが出たら2to3で変換する、という方法で対応した&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;パッケージングにおける課題&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;distlib登場。3.4で同梱予定&lt;/li&gt;&lt;li&gt;wheel登場。eggの代わりのパッケージのバイナリフォーマット&lt;/li&gt;&lt;li&gt;distribute廃止。setuptoolsに統合された。setuptoolsがPy3対応&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;Py2,3で動作するsetup.pyを作る&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;Py2,3で動作するようにしておく&lt;/li&gt;&lt;li&gt;2to3もsetup.pyに対しては動かせない&lt;/li&gt;&lt;li&gt;特定バージョンの場合に依存パッケージがある場合は自前で定義する&lt;/li&gt;&lt;/ul&gt;&lt;pre style="border:solid #666 1px;background-color:#fff;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;&lt;br /&gt;requires = [ 'six', 'polib', 'sphinx' ]&lt;br /&gt;if sys.version_info &amp;lt; (2, 7):&lt;br /&gt;   requires.append('ordereddict')&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;transifexってなんだろ？&lt;/p&gt;&lt;ul&gt;&lt;li&gt;対応しているバージョンはsetup.pyのclassifiersにかこう！&lt;ul&gt;&lt;li&gt;Python3をclassifi入れるとpypiのロゴに3がつく！！&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;まとめ&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;Python2.5はそろそろ消滅するべき！&lt;ul&gt;&lt;li&gt;会場内には一人しかいなかった&lt;/li&gt;&lt;li&gt;AppEngineはちょっと前まで2.5しかサポートしてなかった&lt;/li&gt;&lt;li&gt;CentOS5は2.4, CentOS6は2.6&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;2to3は大変&lt;/li&gt;&lt;li&gt;sixは便利&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;質問&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;いろんなバージョンでテストするにはどうすれば？&lt;ul&gt;&lt;li&gt;テストはtox使うといろんなバージョンでテストできるので便利&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr&gt;&lt;div class="amazlet-box" style="margin-bottom:0px;"&gt;&lt;div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/477415539X/kazzhomeunixo-22/ref=nosim/" name="amazletlink" target="_blank"&gt;&lt;img src="http://ecx.images-amazon.com/images/I/51qCCa-gPLL._SL160_.jpg" alt="パーフェクトPython (PERFECT SERIES 5)" style="border: none;"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"&gt;&lt;div class="amazlet-name" style="margin-bottom:10px;line-height:120%"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/477415539X/kazzhomeunixo-22/ref=nosim/" name="amazletlink" target="_blank"&gt;パーフェクトPython (PERFECT SERIES 5)&lt;/a&gt;&lt;div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%"&gt;posted with&lt;a href="http://www.amazlet.com/" title="amazlet" target="_blank"&gt;amazlet&lt;/a&gt;at 13.09.16&lt;/div&gt;&lt;/div&gt;&lt;div class="amazlet-detail"&gt;Pythonサポーターズ&lt;br&gt;&lt;/br&gt;技術評論社&lt;br&gt;&lt;/br&gt;売り上げランキング: 57,978&lt;br&gt;&lt;/br&gt;&lt;/div&gt;&lt;div class="amazlet-sub-info" style="float: left;"&gt;&lt;div class="amazlet-link" style="margin-top: 5px"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/477415539X/kazzhomeunixo-22/ref=nosim/" name="amazletlink" target="_blank"&gt;Amazon.co.jpで詳細を見る&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="amazlet-footer" style="clear: left"&gt;&lt;/div&gt;&lt;/div&gt;</content>
    <link rel="replies" type="application/atom+xml" href="http://blogger.lampetty.net/feeds/6944259756194008474/comments/default" title="コメントの投稿"/>
    <link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4491739846469721202&amp;postID=6944259756194008474" title="0 件のコメント"/>
    <link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4491739846469721202/posts/default/6944259756194008474"/>
    <link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4491739846469721202/posts/default/6944259756194008474"/>
    <link rel="alternate" type="text/html" href="http://blogger.lampetty.net/2013/09/pycon-apac-2013-09-15-1.html" title="PyCon APAC 2013 2日目に行ってきた(1) #pyconapac"/>
    <author>
      <name>おいぬめ</name>
      <uri>http://www.blogger.com/profile/02863622759561006842</uri>
      <email>noreply@blogger.com</email>
      <gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_9yL0QjJSsuE/Sfqeg_NILzI/AAAAAAAAArQ/5eKH3HVGOmk/s1600-R/8250493%40N05.jpg%3F1232891863"/>
    </author>
    <thr:total>0</thr:total>
  </entry>
  <entry>
    <id>tag:blogger.com,1999:blog-4491739846469721202.post-3834917581828702605</id>
    <published>2013-09-16T01:10:00.001+09:00</published>
    <updated>2013-09-16T23:43:23.118+09:00</updated>
    <category scheme="http://www.blogger.com/atom/ns#" term="Python"/>
    <title type="text">PyCon APAC 2013 1日目に行ってきた(3) #pyconapac</title>
    <content type="html">&lt;ul&gt;&lt;li&gt;&lt;a href="/2013/09/pycon-apac-2013-09-14-1.html"&gt;PyCon APAC 2013 1日目に行ってきた(1) #pyconapac&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="/2013/09/pycon-apac-2013-09-14-2.html"&gt;PyCon APAC 2013 1日目に行ってきた(2) #pyconapac&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;というわけで1日目の最後のエントリー。1日目は濃い目のトークが多かったせいか終わった後の疲労感がハンパなかったっす。&lt;/p&gt;&lt;h4&gt;実践C拡張モジュール開発&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;@mopemopeさん&lt;/li&gt;&lt;li&gt;Abby CTO&lt;/li&gt;&lt;li&gt;&lt;a href="https://speakerdeck.com/mopemope/shi-jian-c-kuo-zhang-moziyurukai-fa"&gt;スライド&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;C拡張モジュールを書く意義について&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;Pythonでないといけないのか？&lt;ul&gt;&lt;li&gt;Java, Go, Lispなど&lt;/li&gt;&lt;li&gt;Rustはやめておけ&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Cのライブラリを呼ぶだけならctypesでおｋ&lt;/li&gt;&lt;li&gt;今ならばPyPyも検討&lt;/li&gt;&lt;li&gt;必要な箇所だけCで書く高速化&lt;/li&gt;&lt;li&gt;パフォーマンス&lt;ul&gt;&lt;li&gt;Cコンパイラによる最適化の恩恵&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;なぜCythonではダメなのか？&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;学習コスト&lt;/li&gt;&lt;li&gt;構文などCython自身の知識が必要&lt;/li&gt;&lt;li&gt;C/APIの知識も必要&lt;/li&gt;&lt;li&gt;Cデバッガで追うことになった場合の対応が難しい&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;開発環境の準備&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;C/API ドキュメント&lt;/li&gt;&lt;li&gt;コンパイラ&lt;/li&gt;&lt;li&gt;開発用Python(debugビルド)&lt;ul&gt;&lt;li&gt;ビルドに必要なライブラリ&lt;/li&gt;&lt;li&gt;virtualenv, py.test or nose&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;デバッガ(gdb)&lt;/li&gt;&lt;li&gt;Valgrind&lt;/li&gt;&lt;/ul&gt;&lt;pre style="background-color:#444;color:#0f0;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;&lt;br /&gt;./configure --prefix=~/opt/py33 --with-pydebug --with-valgrind&lt;br /&gt;make&lt;br /&gt;make install&lt;br /&gt;&lt;/pre&gt;&lt;h5&gt;DebugモードのPythonについて&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;メモリプールの無効化&lt;ul&gt;&lt;li&gt;無効にしないとリーク検出が難しい&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;生存Object数の表示&lt;/li&gt;&lt;li&gt;closeされていないFDなど各種warning表示&lt;/li&gt;&lt;li&gt;Valgrind&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;その他準備&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;エディタ&lt;/li&gt;&lt;li&gt;coredumpを吐くようにしておく&lt;/li&gt;&lt;/ul&gt;&lt;pre style="background-color:#444;color:#0f0;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;&lt;br /&gt;$ ulimit -c unlimited&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;setuptools, distribute&lt;/p&gt;&lt;pre style="border:solid #666 1px;background-color:#fff;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;&lt;br /&gt;$ python setup.py develop&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;開発ディレクトリがライブラリのパスに入る&lt;/p&gt;&lt;h5&gt;実際の開発&lt;/h5&gt;&lt;p&gt;C, Pythonで別々にしておく&lt;/p&gt;&lt;ul&gt;&lt;li&gt;src&lt;ul&gt;&lt;li&gt;Cソース・ヘッダー&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;jega - pythonパッケージ&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;ディレクトリはC/Pythonで分けた方が無難&lt;/p&gt;&lt;h5&gt;setup.pyの役割&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;distutilsを使ってモジュールをビルドするためのもの。Makefileはいらない&lt;/li&gt;&lt;li&gt;環境の判別&lt;/li&gt;&lt;li&gt;コンパイルするソース指定&lt;/li&gt;&lt;li&gt;コンパイルオプションの設定&lt;ul&gt;&lt;li&gt;ライブラリのヘッダー、リンク&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;configure なども実行できる&lt;/li&gt;&lt;li&gt;C拡張以外のPythonパッケージのインストール&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;まずutil関数を書いておく&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;OS,Pythonのバージョンアップチェック&lt;/li&gt;&lt;li&gt;Cファイルの一覧作成&lt;/li&gt;&lt;li&gt;デバッグモードなどマクロの切り替え&lt;/li&gt;&lt;li&gt;他のライブラリのヘッダーファイルの検索&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;Python C/API&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;略語が少ないため、コードが読みやすい&lt;/li&gt;&lt;li&gt;ユーティリティ関数も準備されている&lt;/li&gt;&lt;li&gt;2.x, 3.xでもほぼ変わらない(安定)&lt;/li&gt;&lt;li&gt;ドキュメントもしっかりしている&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;コードの記述&lt;/h5&gt;&lt;p&gt;ソースファイル&lt;br&gt;* 1機能毎にわける&lt;br&gt;* シンプルなファイル名&lt;br&gt;* ヘッダーとソースは用意する&lt;/p&gt;&lt;ul&gt;&lt;li&gt;構造体&lt;ul&gt;&lt;li&gt;PyObjectの場合は大文字から始める&lt;/li&gt;&lt;li&gt;それ以外は_tで終わる&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;接頭語&lt;ul&gt;&lt;li&gt;モジュール：ExampleMod_xxxx&lt;/li&gt;&lt;li&gt;クラス名_メソッド名&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre style="border:solid #666 1px;background-color:#fff;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;&lt;br /&gt;static PyMethodDef LoopObject_methods[] = {&lt;br /&gt;   { &amp;quot;switch&amp;quot;, ... }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Cであるので必ず返り値を返し、エラーであるかをチェックする&lt;/p&gt;&lt;ul&gt;&lt;li&gt;例外が発生している場合には必ずNULLを返す&lt;/li&gt;&lt;li&gt;Noneを帰す場合は、 Py_RETURN_NONE を返す&lt;/li&gt;&lt;li&gt;&lt;p&gt;その他の場合：intでエラー時には負の数を返す&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;New reference&lt;/p&gt;&lt;ul&gt;&lt;li&gt;参照が +1 されて返る&lt;/li&gt;&lt;li&gt;通常のPythonコードもコレにあたる&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Borrowed Reference&lt;/p&gt;&lt;ul&gt;&lt;li&gt;参照カウントが上がらない&lt;/li&gt;&lt;li&gt;Tuple などがこれにあたる&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;参照カウントの規則&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;PyObject *型を返す関数&lt;ul&gt;&lt;li&gt;必ず Py_INCREF をしてから返す&lt;/li&gt;&lt;li&gt;呼び出し側で Py_DECREF するコードで統一&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Borrowedは別関数として分ける&lt;ul&gt;&lt;li&gt;DECREF していいのかをわかりやすく&lt;/li&gt;&lt;li&gt;内部で使いまわしたい&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;ThreadとGIL&lt;/h5&gt;&lt;p&gt;Pythonから呼ばれる以上、スレッドセーフになっている場合がほとんど。N/W IOが走る場合は下記で囲んでおく&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Py_BEGIN_ALLOW_THREADS&lt;/li&gt;&lt;li&gt;Py_END_ALLOW_THREADS&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;インスタンス継承&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;Cで作成したクラスをPython側で継承&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;その他&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;Cでも iter を使おう&lt;ul&gt;&lt;li&gt;PyObject_GetIter でiterを取得&lt;/li&gt;&lt;li&gt;PyIter_Nextで繰り返す&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;PySequence_Fast&lt;ul&gt;&lt;li&gt;高速&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;DEBUGマクロを使おう&lt;/p&gt;&lt;ul&gt;&lt;li&gt;関数の最初、最後にかならずログを表示&lt;/li&gt;&lt;li&gt;オブジェクトの生成・削除のログは必ず取る&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;マクロによる分岐&lt;/p&gt;&lt;p&gt;PyBytesString使う&lt;/p&gt;&lt;h5&gt;質疑応答&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;まずはPythonで書いてみて、本当に遅いか判断する&lt;/li&gt;&lt;li&gt;Pythonで書くのが大変だと、Cだとさらに大変になる&lt;/li&gt;&lt;/ul&gt; </content>
    <link rel="replies" type="application/atom+xml" href="http://blogger.lampetty.net/feeds/3834917581828702605/comments/default" title="コメントの投稿"/>
    <link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4491739846469721202&amp;postID=3834917581828702605" title="0 件のコメント"/>
    <link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4491739846469721202/posts/default/3834917581828702605"/>
    <link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4491739846469721202/posts/default/3834917581828702605"/>
    <link rel="alternate" type="text/html" href="http://blogger.lampetty.net/2013/09/pycon-apac-2013-09-14-3.html" title="PyCon APAC 2013 1日目に行ってきた(3) #pyconapac"/>
    <author>
      <name>おいぬめ</name>
      <uri>http://www.blogger.com/profile/02863622759561006842</uri>
      <email>noreply@blogger.com</email>
      <gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_9yL0QjJSsuE/Sfqeg_NILzI/AAAAAAAAArQ/5eKH3HVGOmk/s1600-R/8250493%40N05.jpg%3F1232891863"/>
    </author>
    <thr:total>0</thr:total>
  </entry>
  <entry>
    <id>tag:blogger.com,1999:blog-4491739846469721202.post-2905619593755103588</id>
    <published>2013-09-15T16:39:00.000+09:00</published>
    <updated>2013-09-15T16:39:40.840+09:00</updated>
    <category scheme="http://www.blogger.com/atom/ns#" term="Python"/>
    <title type="text">PyCon APAC 2013 1日目に行ってきた(2) #pyconapac</title>
    <content type="html">&lt;p&gt;昨日の&lt;a href="/2013/09/pycon-apac-2013-09-14-1.html"&gt;PyCon APAC 2013 1日目に行ってきた(1) #pyconapac&lt;/a&gt;に行ってきた、の続き。&lt;/p&gt;&lt;h4&gt;Interrupt-Driven programming&lt;/h4&gt;&lt;p&gt;スライドはまだ上がっていないっぽいんだけど、だいたい&lt;a href="http://evzijst.bitbucket.org/pycon.au/#/"&gt;これ&lt;/a&gt;と同じだと思われる。SIGALRMによるタイムアウトのハンドリングはPythonだけではなく一般的なUnixであればどの言語でも使えるのでよい手法だなーと思った。それを使いやすくしたのが&lt;a href="https://pypi.python.org/pypi/interruptingco"&gt;interruptingcow&lt;/a&gt;でこれは便利そうだと思った。全体的には英語＋喋るスピードが速くてほとんど聞き取れなかったけど、スライドの内容はだいたい理解できたと思う。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Erik van Zijstさん(@erikvanzijst)&lt;/li&gt;&lt;li&gt;BitBucketの中の人&lt;/li&gt;&lt;li&gt;&lt;a href="https://bitbucket.org/evzijst"&gt;https://bitbucket.org/evzijst&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;はじめに&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;bitbucketはDjango&lt;/li&gt;&lt;li&gt;githubbitbucketのAPIのレスポンス時間が比較された&lt;ul&gt;&lt;li&gt;bitbucketが遅いという内容&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;レスポンスタイムでaverageは見るな&lt;/li&gt;&lt;li&gt;slow requests have a big impact&lt;ul&gt;&lt;li&gt;ユーザをいらつかせる&lt;/li&gt;&lt;li&gt;APIクライアントを壊す(timeout)&lt;/li&gt;&lt;li&gt;Rants on Twitter&lt;/li&gt;&lt;li&gt;foncus on the remining 2% instead.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;logging timeouts&lt;/h5&gt;&lt;p&gt;タイムアウトをログに記録する。&lt;/p&gt;&lt;p&gt;コードのイメージ&lt;/p&gt;&lt;pre style="border:solid #666 1px;background-color:#fff;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;&lt;br /&gt;def handler(*args):&lt;br /&gt;    raise Excepiton(&amp;quot;Request timed out&amp;quot;)&lt;br /&gt;&lt;br /&gt;signal.signal(signal.SIGALRM, handler)&lt;br /&gt;&lt;br /&gt;signal.setitimer(signal.ITIMER_REAL, 28)&lt;br /&gt;try:&lt;br /&gt;    アプリケーションの処理&lt;br /&gt;finally:&lt;br /&gt;    signal.setitimer(signal.ITIMER_REAL, 0)&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;→Tracebackが得られる！あとは遅いところをひたすら治す&lt;/p&gt;&lt;ul&gt;&lt;li&gt;legacy/bad code often resists refactoring&lt;/li&gt;&lt;li&gt;Unpredictable input&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;interruptingcow&lt;/h5&gt;&lt;p&gt;&lt;a href="https://pypi.python.org/pypi/interruptingcow"&gt;https://pypi.python.org/pypi/interruptingcow&lt;/a&gt;&lt;/p&gt;&lt;p&gt;さっきのSIGALRMのあれをモジュールにして使いやすくしたもの。&lt;/p&gt;&lt;pre style="border:solid #666 1px;background-color:#fff;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;&lt;br /&gt;from interruptingcow import timeout&lt;br /&gt;with timeout(2, RuntimeError):&lt;br /&gt;    なんか処理&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;みたいに書ける。&lt;/p&gt;&lt;p&gt;Scalable content linkification の例&lt;/p&gt;&lt;pre style="border:solid #666 1px;background-color:#fff;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;&lt;br /&gt;def prelace(doc, pattern, tmpl):&lt;br /&gt;    try:&lt;br /&gt;        replace処理&lt;br /&gt;    exception TimeoutExcepiton:&lt;br /&gt;        pass&lt;br /&gt;    return doc&lt;br /&gt;&lt;br /&gt;with timeout(.1, TimeoutException):&lt;br /&gt;     print replace(doc, re.compile, '&amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;sss&amp;lt;/a&amp;gt;')&lt;br /&gt;&lt;/pre&gt;&lt;h5&gt;django-timelimit&lt;/h5&gt;&lt;p&gt;これもこの人が作っているモジュール。詳細は調べきれてない。&lt;/p&gt;&lt;h5&gt;Unique Aspects&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;works with legacy code&lt;/li&gt;&lt;li&gt;Generic solution to different problems&lt;/li&gt;&lt;li&gt;Optimistic approach (EAFP vs LBYL)&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;まとめ&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;Page render times highly dependent on runtime factors&lt;/li&gt;&lt;li&gt;Page timeouts have a disproportinally large impact&lt;/li&gt;&lt;li&gt;Refactor, pre-compute, paginate, remove funcionality, etc&lt;/li&gt;&lt;li&gt;Time-box expensive code with cheap fallback&lt;/li&gt;&lt;li&gt;interruptingcow - time-box arbitrary Python code&lt;/li&gt;&lt;li&gt;django-timelimit - time-box Django template fragments&lt;/li&gt;&lt;li&gt;the average color of the universe isCosmic Latte&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;Fabric for fun and profit&lt;/h4&gt;&lt;p&gt;Fabricはちょっと前に&lt;a href="/2013/09/fabric.html"&gt;Fabricの豆知識&lt;/a&gt;で書いたようにちょっと触ってたのでわりと復習的な感じだった。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;@jairtrejo さん&lt;/li&gt;&lt;li&gt;Operations Director at Vinco Orbis&lt;/li&gt;&lt;li&gt;&lt;a href="http://jairtrejo.mx"&gt;http://jairtrejo.mx&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://speakerdeck.com/jairtrejo/fabric-for-fun-and-profit"&gt;スライド&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;はじめに&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;We script everything&lt;/li&gt;&lt;li&gt;We ssh in and out servers all the time&lt;/li&gt;&lt;li&gt;FabricはPythonでsshでやっていたことを効率よくするためのツール&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;Fabricの簡単な説明&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;fabfile.py&lt;/li&gt;&lt;li&gt;@task&lt;/li&gt;&lt;li&gt;$ fab hello&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;Environment configuration&lt;/h5&gt;&lt;pre style="border:solid #666 1px;background-color:#fff;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;&lt;br /&gt;@task&lt;br /&gt;def production();&lt;br /&gt;    env.user = 'pdfs'&lt;br /&gt;    env.hosts = [ 'example.com' ]&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;it is just python. we can mix python codes into system commands&lt;/p&gt;&lt;h5&gt;Vagrant development&lt;/h5&gt;&lt;pre style="background-color:#444;color:#0f0;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;&lt;br /&gt;$ fab vargrant -- sudo service couchdb restart&lt;br /&gt;&lt;/pre&gt;&lt;h5&gt;Fabricの代替&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.ansibleworks.com/docs/"&gt;Ansible&lt;/a&gt;- Chefのような構成管理ツール&lt;/li&gt;&lt;li&gt;&lt;a href="http://docs.pyinvoke.org/en/latest/"&gt;Invoke&lt;/a&gt;- タスクを定義して実行&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;How the Mock library helps me developing client-side applications&lt;/h4&gt;&lt;p&gt;MockというPython3.3から標準に含まれるようになったモックライブラリの説明と、外部のWebAPI呼び出しにおける使い方の説明。Mockって1回使ってみたんだけど個人的には微妙で(でもなんで微妙だったか思い出せない)、個人的には&lt;a href="https://pypi.python.org/pypi/pytest"&gt;py.test&lt;/a&gt;のmonkeypatchより複雑なことをしたいときは&lt;a href="https://pypi.python.org/pypi/flexmock"&gt;FlexMock&lt;/a&gt;というものを使っている。3.3から標準添付されたので今後はやっぱりこっちを使ってみようかな。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;@clsung さん from Taiwan&lt;/li&gt;&lt;li&gt;仕事はフリーランス&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;はじめに&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;モックライブラリはmock以外にMox, Flexmockがある&lt;/li&gt;&lt;li&gt;mock はPython 3.3から標準ライブラリになった&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;Mockの特徴&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;Mock()&lt;/li&gt;&lt;li&gt;MagickMock()&lt;/li&gt;&lt;li&gt;@patch decorator&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;How mock helps me&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;Develop/test client-side applications&lt;/li&gt;&lt;li&gt;Server-side APIs (Google Drive v2)&lt;/li&gt;&lt;li&gt;Client-side request library (requests)&lt;ul&gt;&lt;li&gt;HTTP requests&lt;/li&gt;&lt;li&gt;HTTP&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;とかとか。&lt;/p&gt;&lt;p&gt;Mock open() - StringIO&lt;/p&gt;&lt;pre style="border:solid #666 1px;background-color:#fff;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;&lt;br /&gt;with patch('__builtin__.open') as m:&lt;br /&gt;    m.return_value = ...&lt;br /&gt;&lt;/pre&gt;&lt;pre style="border:solid #666 1px;background-color:#fff;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;&lt;br /&gt;patch.object(requests, 'requests', autospec=True).start()&lt;br /&gt;&lt;/pre&gt;&lt;pre style="border:solid #666 1px;background-color:#fff;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;&lt;br /&gt;patch('gdapi.utils.retry', lambda: x, y)&lt;br /&gt;&lt;/pre&gt;&lt;h5&gt;その他テストで使える有用なライブラリ&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;factory_boy&lt;/li&gt;&lt;li&gt;httpretty&lt;/li&gt;&lt;li&gt;testfixtures&lt;/li&gt;&lt;/ul&gt;</content>
    <link rel="replies" type="application/atom+xml" href="http://blogger.lampetty.net/feeds/2905619593755103588/comments/default" title="コメントの投稿"/>
    <link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4491739846469721202&amp;postID=2905619593755103588" title="0 件のコメント"/>
    <link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4491739846469721202/posts/default/2905619593755103588"/>
    <link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4491739846469721202/posts/default/2905619593755103588"/>
    <link rel="alternate" type="text/html" href="http://blogger.lampetty.net/2013/09/pycon-apac-2013-09-14-2.html" title="PyCon APAC 2013 1日目に行ってきた(2) #pyconapac"/>
    <author>
      <name>おいぬめ</name>
      <uri>http://www.blogger.com/profile/02863622759561006842</uri>
      <email>noreply@blogger.com</email>
      <gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_9yL0QjJSsuE/Sfqeg_NILzI/AAAAAAAAArQ/5eKH3HVGOmk/s1600-R/8250493%40N05.jpg%3F1232891863"/>
    </author>
    <thr:total>0</thr:total>
  </entry>
  <entry>
    <id>tag:blogger.com,1999:blog-4491739846469721202.post-1655690701534722361</id>
    <published>2013-09-14T22:50:00.000+09:00</published>
    <updated>2013-09-20T01:57:04.359+09:00</updated>
    <category scheme="http://www.blogger.com/atom/ns#" term="Python"/>
    <title type="text">PyCon APAC 2013 1日目に行ってきた(1) #pyconapac</title>
    <content type="html">&lt;p&gt;にわかPython使いだけど、年に1回のお祭りなので行ってきた。今回のPyConはAPACというのがタイトルについているせいか、他の言語のカンファレンスより海外の人が多い気がした。Pythonは自分が知る限り日本ではあまり人気がないけど、海外ではけっこう使われているみたいなのでそういうのが反映された結果なのだろうか。とにかく、今日は全体的に濃い目の内容が多くてすごく参考になる話が多かった(でもその分脳力を使ったので終わったあとはぐったりしてた)。&lt;/p&gt;&lt;p&gt;仕事ではPythonを書くことはほぼなくて、プライベートで&lt;a href="https://github.com/oinume/tomahawk"&gt;tomahawk&lt;/a&gt;のメンテをする時ぐらいしかPython書かないんだけど、個人的には一番好きな言語なので今回は参加してよかった。まだ終わってないけどすでに5000円分のもとは取れたように思う。&lt;/p&gt;&lt;p&gt;というわけで、自分が聞いたTalkのメモ。(長いので複数のエントリに分ける)&lt;/p&gt;&lt;h4&gt;パッケージングの今と未来&lt;/h4&gt;&lt;p&gt;aodagさん発表。&lt;a href="http://www.slideshare.net/aodag/ss-26183017"&gt;スライド&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Pythonでのパッケージ関連のツールの説明と使い方、およびその未来。あとsetup.pyの書き方をけっこう詳しく話していた。setup.pyは自分も他のライブラリのものをコピペしてるだけであまり深く知らなかったので今回勉強させてもらった。ので、いろいろ目から鱗の話が多かった。&lt;/p&gt;&lt;p&gt;最後に「RubyのBundlerみたく特定のディレクトリにライブラリをインストールするのは、Pythonだとvirtualenvとrequirements.txtを使うのでよい？」と質問させてもらったんだけど、このやり方でいいみたい。(というか今日の話聞く限りBundlerみたいなのはなさそうなので、これしかやりようないと思ったんだけど)&lt;/p&gt;&lt;p&gt;以下は手元に残っていたメモ。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;pypaツール群&lt;/li&gt;&lt;li&gt;setuptoolsベースのパッケージング&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;pypa - Python Packaging Authority&lt;/h5&gt;&lt;p&gt;pip, virtualenv, setuptools, pypi, distlib&lt;/p&gt;&lt;pre style="background-color:#444;color:#0f0;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;&lt;br /&gt;$ pip install git+https://github.com/fabric/fabric@changeset &lt;br /&gt;&lt;/pre&gt;&lt;h5&gt;setuptools/distribute&lt;/h5&gt;&lt;h6&gt;pkg_resources&lt;/h6&gt;&lt;ul&gt;&lt;li&gt;メタデータを利用するためのライブラリ&lt;/li&gt;&lt;li&gt;パッケージに含まれるメディアデータの取得など&lt;/li&gt;&lt;li&gt;entry_point&lt;/li&gt;&lt;/ul&gt;&lt;h6&gt;setuptoolsとdistributeの関係&lt;/h6&gt;&lt;ul&gt;&lt;li&gt;setuptoolsからforkしたのがdistribute&lt;/li&gt;&lt;li&gt;distributeがpy3対応などいろいろ&lt;/li&gt;&lt;li&gt;2013 pycon US でマージ宣言し、pypaがメンテする&lt;/li&gt;&lt;li&gt;distributeコードベースでsetuptools-0.7&lt;/li&gt;&lt;li&gt;setuptools 1.1.5まで上がってる&lt;/li&gt;&lt;li&gt;distributeのことは忘れてあげてくださいｗｗ&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;setuptools&lt;/h5&gt;&lt;pre style="border:solid #666 1px;background-color:#fff;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;&lt;br /&gt;packages = find_packages()&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;packagesに自分でパッケージ羅列しなくても良い&lt;/p&gt;&lt;h5&gt;entry_point&lt;/h5&gt;&lt;p&gt;プラグインの仕組み&lt;/p&gt;&lt;pre style="border:solid #666 1px;background-color:#fff;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;&lt;br /&gt;entry_point = {&lt;br /&gt;   'console_scripts': [&lt;br /&gt;       'hello=hello:greeting',&lt;br /&gt;   ]&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;PasteDeploy, nose, cliff, setuptoolsのサブコマンドがこれを利用している。&lt;/p&gt;&lt;h5&gt;egg&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;バイナリパッケージのこと&lt;/li&gt;&lt;li&gt;C拡張などのコンパイル済みライブラリなどを含める&lt;/li&gt;&lt;li&gt;ソースとメタデータをzipでアーカイブしたもの&lt;/li&gt;&lt;li&gt;pipでは扱えない&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;pypi (ぱいぴーあい)&lt;/h5&gt;&lt;p&gt;CPANやrubygems.orgみたいなサイト&lt;/p&gt;&lt;h5&gt;setup.py&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;install_requires&lt;/li&gt;&lt;li&gt;tests_require&lt;/li&gt;&lt;li&gt;test_suite&lt;/li&gt;&lt;/ul&gt;&lt;pre style="border:solid #666 1px;background-color:#fff;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;&lt;br /&gt;extra_require = {&lt;br /&gt;    'testing': tests_require,&lt;br /&gt;    'docs': docs_require,&lt;br /&gt;    'dev': tests_require,+ docs_require,&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;今開発中のソースをパッケージとする方法。&lt;/p&gt;&lt;pre style="background-color:#444;color:#0f0;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;&lt;br /&gt;$ pip install -e .&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;→これは python setup.py develop と何が違うんだろう？&lt;/p&gt;&lt;pre style="background-color:#444;color:#0f0;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;&lt;br /&gt;python setup.py test egg_info check register sdist&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color:#444;color:#0f0;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;&lt;br /&gt;pip install -e .[dev]&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;setup.cfg&lt;/p&gt;&lt;pre style="border:solid #666 1px;background-color:#fff;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;&lt;br /&gt;[egg_info]&lt;br /&gt;tag-build = dev&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;→パッケージに-devがつく&lt;/p&gt;&lt;pre style="border:solid #666 1px;background-color:#fff;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;&lt;br /&gt;[upload_docs]&lt;br /&gt;upload_dir = docs/build/html&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;とか。&lt;/p&gt;&lt;p&gt;エイリアス。&lt;/p&gt;&lt;pre style="border:solid #666 1px;background-color:#fff;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;&lt;br /&gt;[aliases]&lt;br /&gt;release = egg_info -Rdb&lt;br /&gt;source = register sdist binary&lt;br /&gt;binary = bdist_egg upload --show-response&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color:#444;color:#0f0;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;&lt;br /&gt;$ python setup.py release source&lt;br /&gt;&lt;/pre&gt;&lt;h5&gt;パッケージングの未来&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;関連PEPが出てきてる&lt;/li&gt;&lt;li&gt;wheel&lt;/li&gt;&lt;li&gt;distlib&lt;/li&gt;&lt;li&gt;Metadata 2.0&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;wheel&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;バイナリパッケージフォーマット&lt;/li&gt;&lt;li&gt;Metadata 2.0&lt;/li&gt;&lt;li&gt;bdist_wheel, egg2wheel, distlib.wheel などで作成&lt;/li&gt;&lt;li&gt;C拡張などを含まない場合はpy2,py3両方のユニバーサル構成も可能&lt;/li&gt;&lt;/ul&gt;</content>
    <link rel="replies" type="application/atom+xml" href="http://blogger.lampetty.net/feeds/1655690701534722361/comments/default" title="コメントの投稿"/>
    <link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4491739846469721202&amp;postID=1655690701534722361" title="0 件のコメント"/>
    <link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4491739846469721202/posts/default/1655690701534722361"/>
    <link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4491739846469721202/posts/default/1655690701534722361"/>
    <link rel="alternate" type="text/html" href="http://blogger.lampetty.net/2013/09/pycon-apac-2013-09-14-1.html" title="PyCon APAC 2013 1日目に行ってきた(1) #pyconapac"/>
    <author>
      <name>おいぬめ</name>
      <uri>http://www.blogger.com/profile/02863622759561006842</uri>
      <email>noreply@blogger.com</email>
      <gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_9yL0QjJSsuE/Sfqeg_NILzI/AAAAAAAAArQ/5eKH3HVGOmk/s1600-R/8250493%40N05.jpg%3F1232891863"/>
    </author>
    <thr:total>0</thr:total>
  </entry>
  <entry>
    <id>tag:blogger.com,1999:blog-4491739846469721202.post-1549933461717084222</id>
    <published>2013-09-14T04:20:00.001+09:00</published>
    <updated>2013-10-11T23:35:12.496+09:00</updated>
    <category scheme="http://www.blogger.com/atom/ns#" term="Java"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="Maven"/>
    <title type="text">Mavenでwarなプロジェクトからjarを作る</title>
    <content type="html">&lt;p&gt;同僚にやってもらったことをブログに書く簡単なお仕事。&lt;/p&gt;&lt;h4&gt;やりたいこと&lt;/h4&gt;&lt;p&gt;warなプロジェクト(Webアプリケーション)を別のプロジェクトから使うため、WebアプリケーションなんだけどMavenでjarファイルを生成したい。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;example-web&lt;/li&gt;&lt;li&gt;example-admin&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;のように2つのプロジェクトがあって、「example-webにあるクラスをexample-adminからも使いたい！」みたいな。&lt;/p&gt;&lt;p&gt;なお、使用するMavenは3.0.x以上を想定している。&lt;/p&gt;&lt;h4&gt;pom.xml&lt;/h4&gt;&lt;p&gt;pom.xml上では&lt;/p&gt;&lt;pre style="border:solid #666 1px;background-color:#fff;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;&lt;br /&gt;&amp;lt;packaging&amp;gt;war&amp;lt;/packaging&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;のように通常のwarのプロジェクトとして定義するが、以下のmaven-jar-pluginをbuildpluginsに足すことで maven packageコマンドでwarファイルとともにjarファイルが生成されるようになる。&lt;/p&gt;&lt;pre style="border:solid #666 1px;background-color:#fff;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;&lt;br /&gt;            &amp;lt;plugin&amp;gt;&lt;br /&gt;                &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;&lt;br /&gt;                &amp;lt;artifactId&amp;gt;maven-jar-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;                &amp;lt;version&amp;gt;2.4&amp;lt;/version&amp;gt;&lt;br /&gt;                &amp;lt;executions&amp;gt;&lt;br /&gt;                    &amp;lt;execution&amp;gt;&lt;br /&gt;                        &amp;lt;id&amp;gt;make-a-jar&amp;lt;/id&amp;gt;&lt;br /&gt;                        &amp;lt;phase&amp;gt;compile&amp;lt;/phase&amp;gt;&lt;br /&gt;                        &amp;lt;goals&amp;gt;&lt;br /&gt;                            &amp;lt;goal&amp;gt;jar&amp;lt;/goal&amp;gt;&lt;br /&gt;                        &amp;lt;/goals&amp;gt;&lt;br /&gt;                        &amp;lt;configuration&amp;gt;&lt;br /&gt;                            &amp;lt;excludes&amp;gt;&lt;br /&gt;                                &amp;lt;exclude&amp;gt;**/*.xml&amp;lt;/exclude&amp;gt;&lt;br /&gt;                                &amp;lt;exclude&amp;gt;**/*.properties&amp;lt;/exclude&amp;gt;&lt;br /&gt;                                &amp;lt;exclude&amp;gt;**/SampleController*&amp;lt;/exclude&amp;gt;&lt;br /&gt;                            &amp;lt;/excludes&amp;gt;&lt;br /&gt;                        &amp;lt;/configuration&amp;gt;&lt;br /&gt;                    &amp;lt;/execution&amp;gt;&lt;br /&gt;                &amp;lt;/executions&amp;gt;&lt;br /&gt;            &amp;lt;/plugin&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;↑のようにconfigurationでjarパッケージング時に除外するファイルや逆にインクルードするファイルを指定することができる。&lt;/p&gt;&lt;p&gt;やってみよう。&lt;/p&gt;&lt;pre style="background-color:#444;color:#0f0;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;&lt;br /&gt;$ mvn package&lt;br /&gt;...&lt;br /&gt;$ ls -l target/war-jar-sample.*&lt;br /&gt;-rw-r--r--  1 kazuhiro  staff     3535  9 14 03:06 target/war-jar-sample.jar&lt;br /&gt;-rw-r--r--  1 kazuhiro  staff  3842928  9 14 03:06 target/war-jar-sample.war&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;ちゃんとjarファイルができている。&lt;/p&gt;&lt;h4&gt;mvn installしたい&lt;/h4&gt;&lt;p&gt;生成したjarファイルをローカルマシンのMavenリポジトリ(~/.m2/repository)に配置したい場合はmaven-install-pluginを追加する。&lt;/p&gt;&lt;pre style="border:solid #666 1px;background-color:#fff;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;&lt;br /&gt;           &amp;lt;plugin&amp;gt;&lt;br /&gt;                &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;&lt;br /&gt;                &amp;lt;artifactId&amp;gt;maven-install-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;                &amp;lt;version&amp;gt;2.4&amp;lt;/version&amp;gt;&lt;br /&gt;                &amp;lt;executions&amp;gt;&lt;br /&gt;                    &amp;lt;execution&amp;gt;&lt;br /&gt;                        &amp;lt;phase&amp;gt;install&amp;lt;/phase&amp;gt;&lt;br /&gt;                        &amp;lt;goals&amp;gt;&lt;br /&gt;                            &amp;lt;goal&amp;gt;install-file&amp;lt;/goal&amp;gt;&lt;br /&gt;                        &amp;lt;/goals&amp;gt;&lt;br /&gt;                        &amp;lt;configuration&amp;gt;&lt;br /&gt;                            &amp;lt;packaging&amp;gt;jar&amp;lt;/packaging&amp;gt;&lt;br /&gt;                            &amp;lt;artifactId&amp;gt;${project.artifactId}&amp;lt;/artifactId&amp;gt;&lt;br /&gt;                            &amp;lt;groupId&amp;gt;${project.groupId}&amp;lt;/groupId&amp;gt;&lt;br /&gt;                            &amp;lt;version&amp;gt;${project.version}&amp;lt;/version&amp;gt;&lt;br /&gt;                            &amp;lt;file&amp;gt;${project.build.directory}/${project.artifactId}.jar&amp;lt;/file&amp;gt;&lt;br /&gt;                        &amp;lt;/configuration&amp;gt;&lt;br /&gt;                    &amp;lt;/execution&amp;gt;&lt;br /&gt;                &amp;lt;/executions&amp;gt;&lt;br /&gt;            &amp;lt;/plugin&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;やってみよう。&lt;/p&gt;&lt;pre style="background-color:#444;color:#0f0;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;&lt;br /&gt;$ mvn install&lt;br /&gt;...&lt;br /&gt;$ ls -l ~/.m2/repository/net/lampetty/war-jar-sample/1.0.0-SNAPSHOT&lt;br /&gt;total 7552&lt;br /&gt;-rw-r--r--  1 kazuhiro  staff      234  9 14 03:09 _maven.repositories&lt;br /&gt;-rw-r--r--  1 kazuhiro  staff      876  9 14 03:09 maven-metadata-local.xml&lt;br /&gt;-rw-r--r--  1 kazuhiro  staff     3535  9 14 03:09 war-jar-sample-1.0.0-SNAPSHOT.jar&lt;br /&gt;-rw-r--r--  1 kazuhiro  staff     7045  9 14 03:06 war-jar-sample-1.0.0-SNAPSHOT.pom&lt;br /&gt;-rw-r--r--  1 kazuhiro  staff  3842926  9 14 03:09 war-jar-sample-1.0.0-SNAPSHOT.war```&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;ちゃんとjarファイルが ~/.m2/repository にできている。&lt;/p&gt;&lt;h4&gt;mvn deployしたい&lt;/h4&gt;&lt;p&gt;同様にリモートのMavenリポジトリにdeployしたい場合は以下のmaven-deploy-pluginプラグインを追加する。&lt;/p&gt;&lt;pre style="border:solid #666 1px;background-color:#fff;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;&lt;br /&gt;            &amp;lt;plugin&amp;gt;&lt;br /&gt;                &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;&lt;br /&gt;                &amp;lt;artifactId&amp;gt;maven-deploy-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;                &amp;lt;version&amp;gt;2.7&amp;lt;/version&amp;gt;&lt;br /&gt;                &amp;lt;executions&amp;gt;&lt;br /&gt;                    &amp;lt;execution&amp;gt;&lt;br /&gt;                        &amp;lt;phase&amp;gt;package&amp;lt;/phase&amp;gt;&lt;br /&gt;                        &amp;lt;goals&amp;gt;&lt;br /&gt;                            &amp;lt;goal&amp;gt;deploy-file&amp;lt;/goal&amp;gt;&lt;br /&gt;                        &amp;lt;/goals&amp;gt;&lt;br /&gt;                        &amp;lt;configuration&amp;gt;&lt;br /&gt;                            &amp;lt;packaging&amp;gt;jar&amp;lt;/packaging&amp;gt;&lt;br /&gt;                            &amp;lt;generatepom&amp;gt;true&amp;lt;/generatepom&amp;gt;&lt;br /&gt;                            &amp;lt;repositoryid&amp;gt;snapshots&amp;lt;/repositoryid&amp;gt;&lt;br /&gt;                            &amp;lt;url&amp;gt;${project.distributionManagement.snapshotRepository.url}&amp;lt;/url&amp;gt;&lt;br /&gt;                            &amp;lt;artifactId&amp;gt;${project.artifactId}&amp;lt;/artifactId&amp;gt;&lt;br /&gt;                            &amp;lt;groupId&amp;gt;${project.groupId}&amp;lt;/groupId&amp;gt;&lt;br /&gt;                            &amp;lt;version&amp;gt;${project.version}&amp;lt;/version&amp;gt;&lt;br /&gt;                            &amp;lt;file&amp;gt;${project.build.directory}/${project.artifactId}.jar&amp;lt;/file&amp;gt;&lt;br /&gt;                        &amp;lt;/configuration&amp;gt;&lt;br /&gt;                    &amp;lt;/execution&amp;gt;&lt;br /&gt;                &amp;lt;/executions&amp;gt;&lt;br /&gt;            &amp;lt;/plugin&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;h4&gt;まとめ&lt;/h4&gt;&lt;p&gt;最終的に出来上がったpom.xmlは&lt;a href="https://github.com/oinume/war-jar-sample/"&gt;https://github.com/oinume/war-jar-sample/&lt;/a&gt;に上げてあるので、実際に試してみると良いでしょう。&lt;/p&gt;&lt;hr&gt;&lt;div class="amazlet-box" style="margin-bottom:0px;"&gt;&lt;div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/404886324X/kazzhomeunixo-22/ref=nosim/" name="amazletlink" target="_blank"&gt;&lt;img src="http://ecx.images-amazon.com/images/I/51yX-u7wv2L._SL160_.jpg" alt="Apache Maven 3クックブック Javaソフトウェア開発のための特選レシピ集" style="border: none;"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"&gt;&lt;div class="amazlet-name" style="margin-bottom:10px;line-height:120%"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/404886324X/kazzhomeunixo-22/ref=nosim/" name="amazletlink" target="_blank"&gt;Apache Maven 3クックブック Javaソフトウェア開発のための特選レシピ集&lt;/a&gt;&lt;div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%"&gt;posted with&lt;a href="http://www.amazlet.com/" title="amazlet" target="_blank"&gt;amazlet&lt;/a&gt;at 13.09.13&lt;/div&gt;&lt;/div&gt;&lt;div class="amazlet-detail"&gt;Srirangan&lt;br&gt;&lt;/br&gt;アスキー・メディアワークス&lt;br&gt;&lt;/br&gt;売り上げランキング: 134,948&lt;br&gt;&lt;/br&gt;&lt;/div&gt;&lt;div class="amazlet-sub-info" style="float: left;"&gt;&lt;div class="amazlet-link" style="margin-top: 5px"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/404886324X/kazzhomeunixo-22/ref=nosim/" name="amazletlink" target="_blank"&gt;Amazon.co.jpで詳細を見る&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="amazlet-footer" style="clear: left"&gt;&lt;/div&gt;&lt;/div&gt;</content>
    <link rel="replies" type="application/atom+xml" href="http://blogger.lampetty.net/feeds/1549933461717084222/comments/default" title="コメントの投稿"/>
    <link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4491739846469721202&amp;postID=1549933461717084222" title="0 件のコメント"/>
    <link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4491739846469721202/posts/default/1549933461717084222"/>
    <link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4491739846469721202/posts/default/1549933461717084222"/>
    <link rel="alternate" type="text/html" href="http://blogger.lampetty.net/2013/09/maven-jar-from-war-project.html" title="Mavenでwarなプロジェクトからjarを作る"/>
    <author>
      <name>おいぬめ</name>
      <uri>http://www.blogger.com/profile/02863622759561006842</uri>
      <email>noreply@blogger.com</email>
      <gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_9yL0QjJSsuE/Sfqeg_NILzI/AAAAAAAAArQ/5eKH3HVGOmk/s1600-R/8250493%40N05.jpg%3F1232891863"/>
    </author>
    <thr:total>0</thr:total>
  </entry>
  <entry>
    <id>tag:blogger.com,1999:blog-4491739846469721202.post-2533214477227230267</id>
    <published>2013-09-09T08:00:00.000+09:00</published>
    <updated>2013-09-14T03:14:08.062+09:00</updated>
    <category scheme="http://www.blogger.com/atom/ns#" term="Fabric"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="Python"/>
    <title type="text">Fabricの豆知識</title>
    <content type="html">&lt;p&gt;Python製のCapistrano的なツールである&lt;a href="http://docs.fabfile.org/en/1.7/"&gt;Fabric&lt;/a&gt;を少しだけ使ってみた。けっこう機能が多いので自分が使いそうなところをまとめておく。バージョンは1.7.0。&lt;/p&gt;&lt;h4&gt;Fabricの基本的な機能&lt;/h4&gt;&lt;h5&gt;下記で任意のコマンドが実行可能&lt;/h5&gt;&lt;pre style="background-color:#444;color:#0f0;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;$ fab -H localhost -- uptime&lt;br /&gt;&lt;/pre&gt;&lt;h5&gt;またはfabfile.pyにタスクを書く&lt;/h5&gt;&lt;pre style="border:solid #666 1px;background-color:#fff;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;from fabric.api import run&lt;br /&gt;def uptime():&lt;br /&gt;    run('uptime')&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color:#444;color:#0f0;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;$ fab -H host1,host2 uptime&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color:#444;color:#0f0;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;$ fab --list&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;でfabfile.pyに定義されているタスク一覧を表示する。&lt;/p&gt;&lt;h5&gt;ホストの定義はenv.hosts または env.roledefsで。&lt;/h5&gt;&lt;pre style="border:solid #666 1px;background-color:#fff;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;env.hosts = [ 'host1', 'host2' ]&lt;br /&gt;# or&lt;br /&gt;env.roledefs = { 'web': ['host1', 'host2'] }&lt;br /&gt;&lt;/pre&gt;&lt;h5&gt;並列実行&lt;/h5&gt;&lt;pre style="background-color:#444;color:#0f0;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;fab -P  -H host1,host2,host3 -- uptime&lt;br /&gt;&lt;/pre&gt;&lt;h5&gt;たくさんのホストにコマンドを実行する時にpasswordをきかれまくる場合&lt;/h5&gt;&lt;p&gt;最初にパスワードを入力する&lt;/p&gt;&lt;pre style="background-color:#444;color:#0f0;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;$ fab -I -H host1,host2,host3 -- uptime&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;引数にパスワードを渡しちゃう(セキュリティ的にオススメできない)&lt;/p&gt;&lt;pre style="background-color:#444;color:#0f0;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;$ fab -p &amp;lt;password&amp;gt; -I -H host1,host2,host3 -- uptime&lt;br /&gt;&lt;/pre&gt;&lt;h5&gt;taskに引数を渡す&lt;/h5&gt;&lt;pre style="background-color:#444;color:#0f0;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;$ fab create_user:username=oinume&lt;br /&gt;&lt;/pre&gt;&lt;h5&gt;途中でエラーが発生しても処理を継続させる&lt;/h5&gt;&lt;p&gt;-wで失敗しても処理を継続。デフォルトは失敗したらその時点でAbortする&lt;br&gt;fabfile.py の中で&lt;/p&gt;&lt;pre style="border:solid #666 1px;background-color:#fff;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;with warn_only():&lt;br /&gt;    pass&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;でも可&lt;/p&gt;&lt;h4&gt;よくあるユースケース&lt;/h4&gt;&lt;h5&gt;リモートのサーバにコマンドを発行する&lt;/h5&gt;&lt;pre style="background-color:#444;color:#0f0;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;$ fab -H host1,host2,host3 -- mpstat -P ALL 1 1&lt;br /&gt;&lt;/pre&gt;&lt;h5&gt;サーバにファイルをアップロードする&lt;/h5&gt;&lt;pre style="border:solid #666 1px;background-color:#fff;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;from fabric.api import put&lt;br /&gt;&lt;br /&gt;put('authorized_keys', '.ssh/authorized_keys')&lt;br /&gt;&lt;/pre&gt;&lt;h5&gt;rsyncでサーバにファイルをアップロードしたい&lt;/h5&gt;&lt;pre style="border:solid #666 1px;background-color:#fff;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;from fabric.contrib import project&lt;br /&gt;&lt;br /&gt;project.rsync_project(local_dir='authorized_keys', remote_dir='.ssh/authorized_keys')&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;rsyncはローカルマシンから rsync コマンドを実行するだけのようだ。&lt;/p&gt;&lt;h5&gt;rsyncでサーバからファイルをダウンロードする&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;rsync_project()の引数にupload=Falseを指定する&lt;/li&gt;&lt;li&gt;サーバが複数ある場合はダウンロード先の /tmp/my.cnf が上書きされちゃうので、ホスト名をサフィックスにつけている。env.host 現在実行しているホスト名が取れる。&lt;/li&gt;&lt;/ul&gt;&lt;pre style="border:solid #666 1px;background-color:#fff;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;from fabric.api import env&lt;br /&gt;from fabric.contrib import project&lt;br /&gt;&lt;br /&gt;project.rsync_project(remote_dir='/etc/my.cnf', local_dir='/tmp/my.cnf.' + env.host, upload=False)&lt;br /&gt;&lt;/pre&gt;&lt;h4&gt;Fabricのその他の豆知識&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;colorize-errors: エラーが発生したら赤字になる&lt;/li&gt;&lt;li&gt;hide=LEVELS: 出力する情報を制限できる。例えばhide=stdout,stderr,running と指定すると一切の情報が出なくなる&lt;ul&gt;&lt;li&gt;stdout: コマンド実行時の標準出力&lt;/li&gt;&lt;li&gt;stderr: コマンド実行時のエラー出力&lt;/li&gt;&lt;li&gt;running: 実行時の出力&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;-x HOSTS: 対象外にしたいホスト名を指定&lt;/li&gt;&lt;li&gt;-i PATH: SSHの秘密鍵を指定できる&lt;/li&gt;&lt;/ul&gt;&lt;hr&gt;&lt;div class="amazlet-box" style="margin-bottom:0px;"&gt;&lt;div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/477415539X/kazzhomeunixo-22/ref=nosim/" name="amazletlink" target="_blank"&gt;&lt;img src="http://ecx.images-amazon.com/images/I/51qCCa-gPLL._SL160_.jpg" alt="パーフェクトPython (PERFECT SERIES 5)" style="border: none;"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"&gt;&lt;div class="amazlet-name" style="margin-bottom:10px;line-height:120%"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/477415539X/kazzhomeunixo-22/ref=nosim/" name="amazletlink" target="_blank"&gt;パーフェクトPython (PERFECT SERIES 5)&lt;/a&gt;&lt;div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%"&gt;posted with&lt;a href="http://www.amazlet.com/" title="amazlet" target="_blank"&gt;amazlet&lt;/a&gt;at 13.09.13&lt;/div&gt;&lt;/div&gt;&lt;div class="amazlet-detail"&gt;Pythonサポーターズ&lt;br&gt;&lt;/br&gt;技術評論社&lt;br&gt;&lt;/br&gt;売り上げランキング: 12,569&lt;br&gt;&lt;/br&gt;&lt;/div&gt;&lt;div class="amazlet-sub-info" style="float: left;"&gt;&lt;div class="amazlet-link" style="margin-top: 5px"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/477415539X/kazzhomeunixo-22/ref=nosim/" name="amazletlink" target="_blank"&gt;Amazon.co.jpで詳細を見る&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="amazlet-footer" style="clear: left"&gt;&lt;/div&gt;&lt;/div&gt;</content>
    <link rel="replies" type="application/atom+xml" href="http://blogger.lampetty.net/feeds/2533214477227230267/comments/default" title="コメントの投稿"/>
    <link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4491739846469721202&amp;postID=2533214477227230267" title="1 件のコメント"/>
    <link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4491739846469721202/posts/default/2533214477227230267"/>
    <link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4491739846469721202/posts/default/2533214477227230267"/>
    <link rel="alternate" type="text/html" href="http://blogger.lampetty.net/2013/09/fabric.html" title="Fabricの豆知識"/>
    <author>
      <name>おいぬめ</name>
      <uri>http://www.blogger.com/profile/02863622759561006842</uri>
      <email>noreply@blogger.com</email>
      <gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_9yL0QjJSsuE/Sfqeg_NILzI/AAAAAAAAArQ/5eKH3HVGOmk/s1600-R/8250493%40N05.jpg%3F1232891863"/>
    </author>
    <thr:total>1</thr:total>
  </entry>
  <entry>
    <id>tag:blogger.com,1999:blog-4491739846469721202.post-104458549511897666</id>
    <published>2013-09-08T22:23:00.000+09:00</published>
    <updated>2013-09-08T22:23:37.733+09:00</updated>
    <category scheme="http://www.blogger.com/atom/ns#" term="日記"/>
    <title type="text">某退職エントリーのコメントに対して思うこと</title>
    <content type="html">&lt;a href="http://b.hatena.ne.jp/entry/mizchi.hatenablog.com/entry/2013/09/07/171644"&gt;Web系エンジニア1年半ですが、このたびは転職する運びとなりまして、各位に連絡させていただきます - mizchi&amp;apos;s blog&lt;/a&gt;のコメントで、 &lt;blockquote&gt;転職時に古巣の社名を出してdisるのは好きではない。あからさまなブラック企業なら悪くはないが、創業数年のベンチャーで給料が低いことに不満の言うのは何か違う気がする。 &lt;/blockquote&gt;というコメントがあったんだけど、 &lt;blockquote&gt;エンジニア界隈的には僕と@udzuraがAimingの客寄せパンダならぬエンジニア寄せ的な位置にいたらしいので、僕自身の会社へのモチベーションが低い現状で人を誘うのも申し訳ないといった気持ちもありました。 &lt;/blockquote&gt;ということが退職エントリーに書いてあるし mizchi さんはAimingに入ろうとしている若手に対して警鐘を鳴らしているのではないかなーと思った。単純に「古巣へのDISり」みたいに片付けるのはどうなんだろうって思った。このmizchiさんを一切知らないのでただの推測ですが。 </content>
    <link rel="replies" type="application/atom+xml" href="http://blogger.lampetty.net/feeds/104458549511897666/comments/default" title="コメントの投稿"/>
    <link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4491739846469721202&amp;postID=104458549511897666" title="0 件のコメント"/>
    <link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4491739846469721202/posts/default/104458549511897666"/>
    <link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4491739846469721202/posts/default/104458549511897666"/>
    <link rel="alternate" type="text/html" href="http://blogger.lampetty.net/2013/09/mizchi-resignation-entry.html" title="某退職エントリーのコメントに対して思うこと"/>
    <author>
      <name>おいぬめ</name>
      <uri>http://www.blogger.com/profile/02863622759561006842</uri>
      <email>noreply@blogger.com</email>
      <gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_9yL0QjJSsuE/Sfqeg_NILzI/AAAAAAAAArQ/5eKH3HVGOmk/s1600-R/8250493%40N05.jpg%3F1232891863"/>
    </author>
    <thr:total>0</thr:total>
  </entry>
  <entry>
    <id>tag:blogger.com,1999:blog-4491739846469721202.post-4830003443748002483</id>
    <published>2013-09-04T00:19:00.000+09:00</published>
    <updated>2013-09-06T00:40:44.022+09:00</updated>
    <category scheme="http://www.blogger.com/atom/ns#" term="Chrome"/>
    <title type="text">Chromeで検索結果を英語または日本語だけにする</title>
    <content type="html">&lt;p&gt;最近英語でググる事が多いので、基本的には検索結果は英語＋日本語にしていて、どうしてもという時に日本語のみにしている。具体的にどうやって切り替えるかというと、Google検索時のURLのパラメータで&lt;strong&gt;lr&lt;/strong&gt;というパラメータがあるので、これに&lt;strong&gt;lr=lang_en&lt;/strong&gt;とすればよい。&lt;/p&gt;&lt;h5&gt;英語の検索結果のみを表示&lt;/h5&gt;&lt;pre style="border:solid #666 1px;background-color:#fff;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;https://www.google.com/search?q=chrome&amp;lr=lang_en&lt;br /&gt;&lt;/pre&gt;&lt;h5&gt;日本語の検索結果のみ&lt;/h5&gt;&lt;pre style="border:solid #666 1px;background-color:#fff;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;https://www.google.com/search?q=chrome&amp;lr=lang_ja&lt;br /&gt;&lt;/pre&gt;&lt;h5&gt;英語と日本語両方の検索結果を表示&lt;/h5&gt;&lt;pre style="border:solid #666 1px;background-color:#fff;white-space:pre-wrap;word-wrap:break-word;padding:4px;"&gt;https://www.google.com/search?q=chrome&amp;lr=lang_en%7Clang_ja&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;lrに複数の言語を指定する場合は&lt;strong&gt;%7C&lt;/strong&gt;で区切れば良いみたい。あとは「英語だけで検索」とかを ge というキーワードで検索できるようにChromeの検索エンジンの管理で登録しておくと良さげ。&lt;/p&gt;&lt;p&gt;※ hl パラメータが検索結果の言語を切り替えるものだというブログ記事を多く見かけたけど、2013年9月時点では lr パラメータに変わっているっぽかった。&lt;/p&gt;</content>
    <link rel="replies" type="application/atom+xml" href="http://blogger.lampetty.net/feeds/4830003443748002483/comments/default" title="コメントの投稿"/>
    <link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4491739846469721202&amp;postID=4830003443748002483" title="1 件のコメント"/>
    <link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4491739846469721202/posts/default/4830003443748002483"/>
    <link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4491739846469721202/posts/default/4830003443748002483"/>
    <link rel="alternate" type="text/html" href="http://blogger.lampetty.net/2013/09/chrome-search-result-language.html" title="Chromeで検索結果を英語または日本語だけにする"/>
    <author>
      <name>おいぬめ</name>
      <uri>http://www.blogger.com/profile/02863622759561006842</uri>
      <email>noreply@blogger.com</email>
      <gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_9yL0QjJSsuE/Sfqeg_NILzI/AAAAAAAAArQ/5eKH3HVGOmk/s1600-R/8250493%40N05.jpg%3F1232891863"/>
    </author>
    <thr:total>1</thr:total>
  </entry>
  <entry>
    <id>tag:blogger.com,1999:blog-4491739846469721202.post-672858143860535767</id>
    <published>2013-08-26T01:57:00.002+09:00</published>
    <updated>2013-08-26T02:00:18.332+09:00</updated>
    <category scheme="http://www.blogger.com/atom/ns#" term="Blogger"/>
    <title type="text">Bloggerを独自ドメインで運用する</title>
    <content type="html">&lt;p&gt;ググって出てきた記事だとちょっと情報が古かったので。自分はドメインは&lt;a href="http://value-domain.com/"&gt;value domain&lt;/a&gt;で取得しているので、value domainでの設定方法をば。 &lt;/p&gt; &lt;h4&gt;value domainのDNSの設定&lt;/h4&gt;まず、設定する独自ドメインが blogger.lampetty.net だとする。  &lt;ul&gt;&lt;li&gt;value domainにログインする&lt;/li&gt;&lt;li&gt;メニューで「DNSレコード/URL転送の変更」をクリック&lt;/li&gt;&lt;li&gt;対象のドメインを選択&lt;/li&gt;&lt;li&gt;下記の2つのレコードを定義する(末尾の . のつけ忘れに注意！)&lt;/li&gt;&lt;pre&gt;&lt;br /&gt;cname yoectwasv3gk gv-pqase73paobfnq.dv.googlehosted.com.&lt;br /&gt;cname blogger ghs.google.com.&lt;br /&gt;&lt;/pre&gt;&lt;li&gt;(DNSの変更が反映されるまで)しばらく待つ。キャッシュもあるので1,2時間ぐらいかな&lt;/li&gt;&lt;/ul&gt; &lt;h4&gt;Bloggerでの設定&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;http://www.blogger.com/home からメニューの「設定」を選択&lt;/li&gt;&lt;li&gt;ブログのアドレスの部分で下記のように設定する。&lt;/li&gt;&lt;p&gt;&lt;a href="http://www.flickr.com/photos/oinume/9592997540/" title="blogger-domain by oinume, on Flickr"&gt;&lt;img src="http://farm4.staticflickr.com/3759/9592997540_01927d7fdd.jpg" width="500" height="239" alt="blogger-domain"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/ul&gt; </content>
    <link rel="replies" type="application/atom+xml" href="http://blogger.lampetty.net/feeds/672858143860535767/comments/default" title="コメントの投稿"/>
    <link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4491739846469721202&amp;postID=672858143860535767" title="0 件のコメント"/>
    <link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4491739846469721202/posts/default/672858143860535767"/>
    <link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4491739846469721202/posts/default/672858143860535767"/>
    <link rel="alternate" type="text/html" href="http://blogger.lampetty.net/2013/08/blogger-custom-domain.html" title="Bloggerを独自ドメインで運用する"/>
    <author>
      <name>おいぬめ</name>
      <uri>http://www.blogger.com/profile/02863622759561006842</uri>
      <email>noreply@blogger.com</email>
      <gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_9yL0QjJSsuE/Sfqeg_NILzI/AAAAAAAAArQ/5eKH3HVGOmk/s1600-R/8250493%40N05.jpg%3F1232891863"/>
    </author>
    <thr:total>0</thr:total>
  </entry>
  <entry>
    <id>tag:blogger.com,1999:blog-4491739846469721202.post-8614317798438246418</id>
    <published>2013-08-24T10:27:00.000+09:00</published>
    <updated>2013-09-04T00:39:44.774+09:00</updated>
    <category scheme="http://www.blogger.com/atom/ns#" term="Mac"/>
    <title type="text">Mac OSX Mountain LionがApp Storeからダウンロードできない</title>
    <content type="html">&lt;h4&gt;症状&lt;/h4&gt;Mac OSX Mountain LionをAppStoreで購入しダウンロードしようとしても10.4MBまでダウンロードしたあたりで「アプリケーションをダウンロードできませんでした。」というエラーのダイアログが表示される。  &lt;ul&gt;&lt;li&gt;OSを再起動してもダメ&lt;/li&gt;&lt;li&gt;Disk自体は100GB空きがある&lt;/li&gt;&lt;li&gt;インターネット接続は問題なし&lt;/li&gt;&lt;li&gt;他のアプリケーションはダウンロード＆インストールできる(サイズが大きいアプリがダメ？0&lt;/li&gt;&lt;/ul&gt; &lt;h4&gt;解決策&lt;/h4&gt;DNSの設定で 8.8.8.8 を設定していたが、これをISPのDNSサーバに変更したら無事ダウンロードできた！ただし原因はよくわからない。  &lt;hr&gt;&lt;div class="amazlet-box" style="margin-bottom:0px;"&gt;&lt;div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4839944296/kazzhomeunixo-22/ref=nosim/" name="amazletlink" target="_blank"&gt;&lt;img src="http://ecx.images-amazon.com/images/I/51kNbRW-ctL._SL160_.jpg" alt="Mac OS X Mountain Lionマスターブック (Mac Fan Books)" style="border: none;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"&gt;&lt;div class="amazlet-name" style="margin-bottom:10px;line-height:120%"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4839944296/kazzhomeunixo-22/ref=nosim/" name="amazletlink" target="_blank"&gt;Mac OS X Mountain Lionマスターブック (Mac Fan Books)&lt;/a&gt;&lt;div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%"&gt;posted with &lt;a href="http://www.amazlet.com/" title="amazlet" target="_blank"&gt;amazlet&lt;/a&gt; at 13.09.03&lt;/div&gt;&lt;/div&gt;&lt;div class="amazlet-detail"&gt;小山 香織 &lt;br /&gt;マイナビ &lt;br /&gt;売り上げランキング: 26,482&lt;br /&gt;&lt;/div&gt;&lt;div class="amazlet-sub-info" style="float: left;"&gt;&lt;div class="amazlet-link" style="margin-top: 5px"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4839944296/kazzhomeunixo-22/ref=nosim/" name="amazletlink" target="_blank"&gt;Amazon.co.jpで詳細を見る&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="amazlet-footer" style="clear: left"&gt;&lt;/div&gt;&lt;/div&gt;</content>
    <link rel="replies" type="application/atom+xml" href="http://blogger.lampetty.net/feeds/8614317798438246418/comments/default" title="コメントの投稿"/>
    <link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4491739846469721202&amp;postID=8614317798438246418" title="0 件のコメント"/>
    <link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4491739846469721202/posts/default/8614317798438246418"/>
    <link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4491739846469721202/posts/default/8614317798438246418"/>
    <link rel="alternate" type="text/html" href="http://blogger.lampetty.net/2013/08/mountain-lion-download-problem.html" title="Mac OSX Mountain LionがApp Storeからダウンロードできない"/>
    <author>
      <name>おいぬめ</name>
      <uri>http://www.blogger.com/profile/02863622759561006842</uri>
      <email>noreply@blogger.com</email>
      <gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_9yL0QjJSsuE/Sfqeg_NILzI/AAAAAAAAArQ/5eKH3HVGOmk/s1600-R/8250493%40N05.jpg%3F1232891863"/>
    </author>
    <thr:total>0</thr:total>
  </entry>
  <entry>
    <id>tag:blogger.com,1999:blog-4491739846469721202.post-8417751600533705064</id>
    <published>2013-08-24T02:03:00.001+09:00</published>
    <updated>2013-08-24T10:27:55.344+09:00</updated>
    <category scheme="http://www.blogger.com/atom/ns#" term="日記"/>
    <title type="text">Bloggerに移行してみた</title>
    <content type="html">はてなブログはサイドバーにリンクが貼れないので諦めた... Markdownで書けるのはすごい良かったんだけどね。  </content>
    <link rel="replies" type="application/atom+xml" href="http://blogger.lampetty.net/feeds/8417751600533705064/comments/default" title="コメントの投稿"/>
    <link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=4491739846469721202&amp;postID=8417751600533705064" title="0 件のコメント"/>
    <link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4491739846469721202/posts/default/8417751600533705064"/>
    <link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4491739846469721202/posts/default/8417751600533705064"/>
    <link rel="alternate" type="text/html" href="http://blogger.lampetty.net/2013/08/move-to-blogger.html" title="Bloggerに移行してみた"/>
    <author>
      <name>おいぬめ</name>
      <uri>http://www.blogger.com/profile/02863622759561006842</uri>
      <email>noreply@blogger.com</email>
      <gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_9yL0QjJSsuE/Sfqeg_NILzI/AAAAAAAAArQ/5eKH3HVGOmk/s1600-R/8250493%40N05.jpg%3F1232891863"/>
    </author>
    <thr:total>0</thr:total>
  </entry>
</feed>
