けなくの中堅プログラマが読むべき本10冊


ここで中級者とは、仕事でもプライベートでも構いませんが、日常的にプログラムを書き続けて、5~10年であることとします。
ただプログラムを書くのでは無く、より良い書き方の追求、より良い開発環境の構築(スクリプト、CI等)、
他の言語の習得、使っているツールのソースリーディング。
これらを続けての5〜10年とします。

初心者の方はこちらへ

けなくのプログラマが読むべき本10冊 - WeBLoG
http://d.hatena.ne.jp/kennak/20070509/1178766259


また、CIやらないといけないのは解っているけど、一人じゃできないとか、
忙しいからできない等の言い訳も初心者とします。
本題、開発を続けて年数が経つと全体がなんとなく見えてきます。
開発しながら、自分の環境、言語、プログラムを改善し続けてきて、更に見えてくること。
改善するのは開発だけではいけないという事実。
という訳で、前回の初心者向けではプログラムを書くことを、書けることに主眼
を置いていましたが、
今回は開発に目を向けて関連する本を前半後半に分けて。
まずは前半。

継続的デリバリー 信頼できるソフトウェアリリースのためのビルド・テスト・デプロイメントの自動化

継続的デリバリー 信頼できるソフトウェアリリースのためのビルド・テスト・デプロイメントの自動化

ウェブオペレーション ―サイト運用管理の実践テクニック (THEORY/IN/PRACTICE)

ウェブオペレーション ―サイト運用管理の実践テクニック (THEORY/IN/PRACTICE)

アジャイル開発の本質とスケールアップ 変化に強い大規模開発を成功させる14のベストプラクティス (IT Architects’ Archive)

アジャイル開発の本質とスケールアップ 変化に強い大規模開発を成功させる14のベストプラクティス (IT Architects’ Archive)

エリック・エヴァンスのドメイン駆動設計 (IT Architects’Archive ソフトウェア開発の実践)

エリック・エヴァンスのドメイン駆動設計 (IT Architects’Archive ソフトウェア開発の実践)

Making Software ―エビデンスが変えるソフトウェア開発

Making Software ―エビデンスが変えるソフトウェア開発


とりあえず上記5冊。
全て読み終えたときに開発全体の未来が見えるはず。


さて、次は後半。
前半は開発、では後半はというと、
言語について、です。
良いプログラマは言葉を大切にします。
例えば、なぜforよりeachの方が良いのか。
この意味が解る人、解らない人、ピンと来た人は以下を、
上から順に読んで行くことに意味があります。
言語都市 (新★ハヤカワ・SF・シリーズ)

言語都市 (新★ハヤカワ・SF・シリーズ)

語りえぬものを語る

語りえぬものを語る



あ、一冊足りないや。
最後の一冊はあなたの心の中にあります。
この仕事を始めた頃に読んだあの本。
読み返すと新たな発見があるかもしれません。

VMWare EsxiとJenkinsとGradleでインフラのコード化&CI

要件は

  • 作業のログは永遠に残す必要がある
  • いつ、誰が、どういった理由でインフラを変更したかわかるようにする

ひとつ、落とすと

  • インフラをコードで書けるようにする
  • 開発、本番共にVMWareで構成された基盤なのでVMWare仮想マシンが作れるコードを書く
  • インフラコードをバージョン管理し、変更毎に構築できるかテストする
  • コードで構築されたインフラでアプリケーションの全てのテストが通るか確認する(インフラの要件は設定ファイルがあるかどうかではなく、アプリケーションが動作するかどうか)
  • テストは既に動作しているCIがあるので、それを使い回す
  • ログの保持もJenkinsにしてもらおう

やること

  • Jenkinsから仮想マシン作成、OSのインストール
  • Jenkinsのノードに作成された仮想マシンを追加
  • 追加されたノードでOSインストール後の設定やミドルウェアのインストール
  • 環境の整ったノードに対してアプリのデプロイとテスト

インフラ定義Gradleファイル

applyEx {
  plugins 'java_ext',
          'sh',
          'tomcat_ext',
          'vm',
          'mkdir',
          'proxy_auth'
  files   'common/yum_update.gradle',
          'common/set_ntp.gradle',
          'common/install_httpd.gradle',
          'common/install_ssh.gradle',
          'common/set_secretkey.gradle'
}

vCenter {
  url = 'http://xxx.xxx.xxx.xxx/sdk'
  user = 'root'
  passwd 'JM*rtTS**MfJgDt**CXXZ*4gNiyB***jssVS'
}

vm {
  description = 'テスト用アプリケーションサーバ'
  name = 'testap'

  registry {
    center = 'vCenter'
    datastore = 'test'
    host = 'test_cluster'
  }

  cpu {
    core = 4
    socket = 1
  }
  memory {
    sizeGB = 8
  }
  hdd {
    sizeGB = 128
    type = 'thin'
  }

  iso {
    file = 'iso/CentOS-6.4-x86_64-netinstall.iso'
    datastore = 'test'
  }

  network {
    name = 'VM Network'
    ip = '192.168.**.**'
    openPorts = ['http', '5900:tcp', '8080:tcp', '8081:tcp']
    gateway = '192.168.**.**'
  }
  passwd 'JM*rtTS**MfJgDt**CXXZ*4gNiyB***jssVS'
}

dir {
  root {
    var {
      log {
        testApp(perm:755)
      }
    }
  }
}

java {
  version = '7u21'
}

tomcat {
  version = '7.0.40'

  option = ['-Dfile.encoding=UTF-8',
            '-Dcatalina.logbase=/var/log/tomcat',
            '-Dnet.sf.ehcache.skipUpdateCheck=true',
            '-XX:-UseSplitVerifier',
            '-XX:+DoEscapeAnalysis',
            '-XX:+CMSClassUnloadingEnabled',
            '-XX:+UseParNewGC',
            '-XX:+UseConcMarkSweepGC',
            '-XX:PermSize=128m -XX:MaxPermSize=256m',
            '-Xms256m -Xmx512m',
            '-server']
}

システムの設定 << {
  os.insert('/etc/sysctl.conf'.asType(File), 'vm.swappiness = 30')
  os.execute('sysctl -p')
}

//固有設定を追加
Httpdのインストール << {
  '/etc/httpd/conf/httpd.conf'.asType(File).with {
    write text.replaceAll('#ServerName www.example.com:80',"ServerName ${vm.name}:80")
    write text.replaceAll('Options Indexes FollowSymLinks','Options FollowSymLinks')
    println path
    println text
  }

  '/etc/httpd/conf.modules.d/01-mpm.conf'.asType(File).with {
    write '''# event MPM
            |# StartServers: initial number of server processes to start
            |# MinSpareThreads: minimum number of worker threads which are kept spare
            |# MaxSpareThreads: maximum number of worker threads which are kept spare
            |# ThreadsPerChild: constant number of worker threads in each server process
            |# MaxRequestWorkers: maximum number of worker threads
            |# MaxConnectionsPerChild: maximum number of connections a server process serves
            |#                         before terminating
            |<IfModule mpm_event_module>
            |    StartServers             2
            |    MinSpareThreads         25
            |    MaxSpareThreads         75
            |    ThreadsPerChild         25
            |    MaxRequestWorkers      150
            |    MaxConnectionsPerChild   0
            |</IfModule>'''.stripMargin()
    println path
    println text
  }
}

task installModJk << {
  os.installRPM('http://repo/repos/CentOS/6/x86_64/', 'mod_jk-1.2.37-1.x86_64.rpm')
  new File('/etc/httpd/conf.modules.d/00-mod_jk.conf').with {
  new File('/etc/httpd/conf.modules.d/workers.properties').with {
    write '''worker.list=ajp13
            |worker.ajp13.port=8009
            |worker.ajp13.host=localhost
            |worker.ajp13.type=ajp13'''.stripMargin()
  }
  def conf = '/etc/httpd/conf.modules.d/00-proxy.conf'.asType(File)
  conf.write(conf.text.replaceAll('^LoadModule proxy_ajp_module','#LoadModule proxy_ajp_module'))
}

秘密鍵の設定 {
  host = 'serverA'
  user = 'root'
  password = '1to*oCY*et06axq*9TahD***QvRxu**/n8e'
}

defaultTasks (
  'システムの更新',
  'VMWareToolsのインストール',
  'VMWareToolsの更新',
  'mkdir',
  'Javaの設定',
  'Ntpの設定',
  'Httpdのインストール',
  'Tomcatのインストール',
  'modJkのインストール',
  'システムの設定',
  '秘密鍵の設定',
  '再起動'
)

このコードを実行すると仮想マシンが作成されるので、
その後、Jenkins上のスクリプトでノードに追加し、ミドルウェアの設定を実行するジョブを後続として流す。
ミドルの変更前にスナップショットが取られるので、テストがうまくいったら削除する(ここはまだ自動化してない)。
見えてない部分のコードでは泥臭くyum installとかwgetとかやっていて、VMの作成はvijavaを使用している。
ミドルウェアの設定ジョブが終わったら、テストジョブを後続として流して、インフラのCI環境の完成。

次にやりたいのは設定や、ミドルウェアをマトリクスで一斉にパフォーマンステストして・・・みたいなことをやりたい。

忙しいプログラマ、SEが購読すべきニュース系RSS

地下鉄でさっとRSSを読みたい。
Google Readerで全文ボタンなんてかったるくて押していられない。
けどニュースは読みたい。
そんな人向けのRSS
年末に向けてRSSを整理したのでついでに公開してみる。
ニュースサイトはタイトルのRSS自体出してない所もあり、対策として全文サービス等をメタメタに使用しているのでRSSのURLが面白いことになっているが気にしない。
少し前まで、まるごとRSSだけで完結してたんだけど、テキスト以外のいいねボタンとかも入ってくるのが嫌なので、他の全文サービスに一部切り替えて使用。
iPhoneではreederが良い。


InfoQ.com Japan
http://mrss.dokoda.jp/a/http/www.infoq.com/jp/rss/rss.action?token=yiTZl4Djkwx6iiLiBnhGQtG8FGpuvKT5

News Spiral
http://mrss.dokoda.jp/a/http/www.the-journal.jp/contents/newsspiral/atom.xml

Newsweek コラム&ブログ
http://mrss.dokoda.jp/a/http/newsweekjapan.jp/column/rss.xml

Publickey
http://fulltextrssfeed.com/www.publickey1.jp/atom.xml

Reuters: トップニュース
http://mrss.dokoda.jp/a/http/feeds.reuters.com/reuters/JPTopNews

SourceForge.JP Magazine
http://mrss.dokoda.jp/a/http/rss.rssad.jp/rss/sourceforge/magazine/rss

The Daily WTF
http://syndication.thedailywtf.com/TheDailyWtf

WIRED VISION
http://www.wizardrss.com/feed/feed.rssad.jp/rss/wired/feed.rdf

「文藝春秋」最新記事一覧 - 文春.jp
http://mrss.dokoda.jp/a/http/bunshun.jp/bungeishunju/bungeishunju.xml

エンタメ スクープ
http://mrss.dokoda.jp/a/http/entameblog.seesaa.net/index.rdf

スラッシュドット・ジャパン
http://rss.rssad.jp/rss/slashdot/slashdot.rss

セキュリティ、個人情報の最新ニュース
http://mrss.dokoda.jp/a/http/b.hatena.ne.jp/entrylist?sort=hot&threshold=1&url=http://www.security-next.com/&mode=rss

ナショナルジオグラフィック ニュース
http://mrss.dokoda.jp/a/http/www.nationalgeographic.co.jp/news/rss.php

ニッセイ基礎研究所 新着情報一覧
http://mrss.dokoda.jp/a/http/www.nli-research.co.jp/rss/index.rdf

リコールナビ
http://mrss.dokoda.jp/a/http/recall-navi.com/modules/whatsnew/atom.php

世界の三面記事・オモロイド
http://mrss.dokoda.jp/a/http/omoroid.blog103.fc2.com/?xml

主要ニュース 東京新聞
http://mrss.dokoda.jp/a/http/www.zou3.net/php/rss/tokyo2rss.php?cat=main

国際ニュース - CNN.co.jp
http://mrss.dokoda.jp/a/http/feeds.cnn.co.jp/rss/cnn/cnn.rdf

地震情報 - goo 天気
http://weather.goo.ne.jp/earthquake/index.rdf

日本経済新聞 すべて
http://fulltextrssfeed.com/www.zou3.net/php/rss/nikkei2rss.php?head=main

暗いニュースリンク
http://mrss.dokoda.jp/a/http/hiddennews.cocolog-nifty.com/gloomynews/atom.xml

NEWS WEEK最新記事
http://mrss.dokoda.jp/a/http/newsweekjapan.jp/story/rss.xml

海外経済全般:経済レポート一覧
http://www3.keizaireport.com/rss/node_52.xml

科学ニュースあらかると
http://mrss.dokoda.jp/a/http/www.mypress.jp/v2_writers/beep/cache/rss.rdf

読売新聞の医療・介護・健康情報サイト「yomiDr.(ヨミドクター)」
http://mrss.dokoda.jp/a/http/rss.rssad.jp/rss/yomidr/rss00-news

ジョナサン・ケイナー - 今週の射手座
http://www.wizardrss.com/feed/www.cainer.com/japan/weekly/sagittarius.html

firefoxでgoogleキャッシュが見れない

突然、firefoxgoogleキャッシュを見ようとすると、
squid The request or reply is too large」とか出るようになった。
ieだと大丈夫だったのでsquidのせいではない。
キャッシュ増やしても対処はできるだろうけど。
firefox>オプション>履歴の詳細設定から
webcache.googleusercontent.com
のクッキーを全て削除して、クッキーの例外に追加したら治った。