歳は気にするな。という自戒

自分はLinuxは社会人になった26歳(新卒研修中に27歳になってたけど)から、WEB系技術は最初の転職の29歳から、と全体的にスタートが遅かった。
※ちなみにプログラムは大学院の24歳から。CとC++とVBを少々。

なのでずっと、歳相応の能力がない点についてそれを言い訳的に使うことが多かったし、
個人に関する何かの決断について、もうけっこういい歳だしなぁみたいなことを考えることも多かった。
※この業界はすんごく若くて優秀なやつがいっぱいいるからね!

まぁでも、

CAのoranieさんは26歳までアパレル店員だったし、
ペパボだと四天王の黒田さんは30歳まで郵便局員で、
技術責任者のあんちぽさんは32歳まで役場職員だった。

うろ覚えだけど。

少なくともWEB系のエンジニアとしてなら何をするにせよ、ビジネス的な成果を出すために最低限必要なスキルを身につけることに関して、そんなに長大な時間を要することはあんま無い。

なのでやりたいことがあれば年齢は気にする必要はない。

ただ向き不向きはメチャメチャあるので見極め大事。

なんであんまりブログ書かなくなったのか

なんでだろう。

まとめる。書く。の前で止まってる

個人的な日記、技術TIPSは特に、twitterとかに書きなぐって満足しちゃうことが多くなった。

自分で検証しなくなった

新技術系は、そもそもそういう情報をアウトプットする人が増えたので、見て満足するようになった。

そもそもインプットが減った

一例としてここ数年で読んだ技術書をまとめてみたところ、だいぶ減っていた。

というところかな。

このへんふまえて、とうぶん、

ブログに限ったことではないけど、インプットとアウトプットを意識して増やそうかなと思います。

ベンチャーあこがれで徐々に所属組織/サービスの規模を小さくしていったところ、技術的にトンがるメリットが薄れたというのもあるんだけど、
自分の現状スキルとここ数年の成長度合いを考えると、こういうふうに『なんかちょっと飽きた』状態になるのが早すぎたな、と思った。
自分はそこまで勉強大好きキャラではないんだけど、残念ながら自分の能力ではある程度個人の時間をコミットし続けないとそれなりのエンジニアで居続けることは難しそうだし。

平日は早朝3時間を週3回、土日はどっちかの半日、ぐらいを使うようにする予定。
※ムリ目標じゃなくて、新卒から5年くらいはもうちょっとやっていた。
嫁子どもができたら減らすけど!

というわけでブログ書くぞー。

AWS SDK for JavaScriptでブラウザからEC2、CloudWatchを操作できるか

試してみました。

なんでそんなことやろうと思ったかというと、

『EC2の料金を円建て月額で表示するページを作ってみた』という記事を書いたところ、
友達に『稼働インスタンスの価格付きリストも出して』と言われて、

  • 確かに支払情報と合わせてインスタンスの想定月額付きリストが簡単に見れると便利かも
  • さらにCloudWatchからCPU/メモリ使用率を取得すればコスト削減の提案が出来るかも

とか思ったからです。

で、結論、CloudWatchはいけるけどEC2はダメそう(´・ω・`)

んー、CloudWatchだけだとちょっと辛いすなぁ。
やっぱりChrome拡張に作りなおせばいけるだろうけど、うーむ・・・

以下、確認手順です。

確認手順

まず公式githubに書いてあるように、sdkを読み込むHTMLを用意する。

<html lang="ja">
  <head>
    <meta charaset="utf-8">
    <script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
    <script src="https://sdk.amazonaws.com/js/aws-sdk-2.1.4.min.js"></script>
    <script src="js/index.js"></script>
  </head>
  <body>
    <div id="test"></div>
  </body>
</html>

JavaScriptファイルはこんな感じ。
今回はEC2、RDS、CloudWatchとS3のテキトウなデータを取得してみる。

$(function(){
  function print_result(service_name, err, data){
    if (err){
      console.log(service_name + " error : " + err.message);
    }else{
      console.log(service_name + " success");
      console.log(data);
    }
  }

  AWS.config.update({
    accessKeyId: 'XXX',
    secretAccessKey: 'XXX',
    region: 'ap-northeast-1'
  });

  var ec2 = new AWS.EC2();
  ec2.describeInstances({}, function(err, data){
    print_result("EC2", err, data);
  });

  var rds = new AWS.RDS();
  rds.describeDBInstances({}, function(err, data){
    print_result("RDS", err, data);
  });

  var s3 = new AWS.S3({params: {Bucket: 'mikeda-test'}});
  s3.listObjects({}, function(err, data){
    print_result("S3", err, data);
  });

  var cloudwatch = new AWS.CloudWatch();
  cloudwatch.listMetrics({}, function(err, data){
    print_result("CloudWatch", err, data);
  });

});

WEBサーバを起動して

$ python -m SimpleHTTPServer
Serving HTTP on 0.0.0.0 port 8000 ...

アクセスしてみる。

f:id:mikeda:20150108144835p:plain

エラー。
AWS.S3あるけど、AWS.EC2はそもそも定義されていないらしい。

なんかもうこの時点でダメそうな予感はするものの、いちおうEC2を含むように手元でビルドして、

$ git clone git@github.com:aws/aws-sdk-js.git
$ cd aws-sdk-js/
$ npm install
$ node dist-tools/browser-builder.js s3,ec2,rds,cloudwatch > /path/to/sample/js/aws-sdk.js

読み込むSDKファイルを変更してみる。

<html lang="ja">
  <head>
    <meta charaset="utf-8">
    <script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
    <script src="js/aws-sdk.js"></script>
    <script src="js/index.js"></script>
  </head>
  <body>
    <div id="test"></div>
  </body>
</html>

アクセスすると、

f:id:mikeda:20150108144838p:plain

CORSエラー祭り。

エラーを非表示にすると、

f:id:mikeda:20150108144836p:plain

CloudWatchだけ取得できているけど、他は全部CORSエラーすね(´・ω・`)

S3に関してはPermissionsからCORS設定を追加してやれば、
※こんなにいろんな権限いらないです。

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>*</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <AllowedMethod>PUT</AllowedMethod>
        <AllowedMethod>POST</AllowedMethod>
        <AllowedMethod>DELETE</AllowedMethod>
        <AllowedHeader>*</AllowedHeader>
    </CORSRule>
</CORSConfiguration>

アクセスできるようになります。

f:id:mikeda:20150108144837p:plain

EC2、RDSに関しては、まぁセキュリティ的にしゃあないかな。

AWS SDK for Ruby V2使ってみたけどまだ辛かった

そういえばAWS SDK for RubyのV2が出てたけどまだ試してないなぁ、
と思って手元のEC2インスタンス作成スクリプトをV2に書き換えてみたら辛かったです。

V1

V2

日本語でのV2の紹介記事はクラスメソッドさんのブログにありました。

v2のコードは、

  • 基本機能が定義されたaws-sdk-core
  • 抽象化されたリソースクラスが定義されたaws-sdk-resources

という2つのgemに分かれています。

aws-sdk-coreはstableですが、aws-sdk-resourcesはまだpreviewです。

じゃあまぁ、

  • aws-sdk-coreだけでどの程度使えるのか
  • aws-sdk-resourcesがどの程度preview版なのか

というところが気になるところです。

スクリプト仕様

こんな感じでスクリプトをたたくと、

$ export AWS_ACCESS_KEY_ID=XXX
$ export AWS_SECRET_ACCESS_KEY=XXX
$ ./bin/ec2_create_instance.rb v2-test01 ec2_default t2.micro

このあたりが実行されて

  • EC2インスタンスの作成
  • EIPの取得とアタッチ
  • インスタンス、EBSボリュームにNameタグを設定
  • Route53でホスト名とEIPの外部ドメイン名をCNAMEでヒモ付け

すぐにSSHでログインして作業できる。(実際はまずknife soloを実行する)

$ ssh ec2-user@v2-test01.mikeda.jp

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2014.09-release-notes/
18 package(s) needed for security, out of 42 available
Run "sudo yum update" to apply all updates.
[ec2-user@v2-test01 ~]$ 

スクリプトの2つ目の引数はrole的なもので、外部のYAMLファイルに定義しています。

default: &default
  region: ap-northeast-1
  vpc_id: vpc-4c6f2825
  subnet_id: subnet-456f282c # ap-northeast-1b

ec2_default: &ec2_default
  <<: *default
  image_id: ami-4985b048 # Amazon Linux AMI 2014.09.1 (HVM)
  security_group_ids:
    - sg-d65d42ba # default
    - sg-1454ac71 # ssh-login
  key_name: "mikeda"
  hosted_zone_id: Z3J5MVVWBVNX6B # mikeda.jp
  iam_instance_profile: "default"
  ebs_size: 30

xxx_app:
  <<: *ec2_default
  ebs_size: 50
  iam_instance_profile: xxx-app

...

まぁこのへんは今回の話にはあんま関係ないです。

既存のv1スクリプト

こんな感じでした。
共通の前処理は省略しているので、全体を確認したい場合はここを見て下さい。

#!/usr/bin/env ruby

require 'aws-sdk-v1'

### 引数取得、設定ファイル読み込み、user_data作成など
### 共通処理なので省略

ec2 = AWS::EC2.new

### インスタンス作成
instance = ec2.instances.create(
  image_id:        config['image_id'],
  instance_type:   instance_type,
  key_name:        config['key_name'],
  subnet:          config['subnet_id'],
  user_data:       user_data,
  security_group_ids: config['security_group_ids'],
  iam_instance_profile: config['iam_instance_profile'],
  block_device_mappings: [
    {
      device_name: '/dev/xvda',
      ebs: { volume_size: config['ebs_size'].to_i }
    }
  ]
)

while instance.status != :running
  puts "Launching instance #{instance.id}, status: #{instance.status}"
  sleep 5
end

### EIPのAllocateとAssociate
elastic_ip = ec2.elastic_ips.create(vpc: config['vpc_id'])
# なんかエラーになるのでちょっとsleep
sleep 5

instance.associate_elastic_ip(elastic_ip)
puts "associated EIP : #{elastic_ip.ip_address}"

### タグ設定
root_volume = instance.attachments['/dev/xvda'].volume

ec2.tags.create(instance,    'Name', value: hostname)
ec2.tags.create(root_volume, 'Name', value: "#{hostname}_root")

### Route53にレコード追加
r53 = AWS::Route53.new
hosted_zone = r53.hosted_zones[config['hosted_zone_id']]
fqdn = hostname + '.' + hosted_zone.name
hosted_zone.rrsets.create(
  fqdn,
  'CNAME',
  ttl: 300,
  resource_records: [
    { value: instance.public_dns_name}
  ]
)

操作には抽象化されたインタフェースを使い、
EC2インスタンス、EIP、Route53のHostedZone等はそれぞれのリソースを表すClassのインスタンスとして取得しています。

例えば、ec2.instancesはEC2に関する抽象化された操作をまとめたAWS::EC2::InstanceCollectionのインスタンスで、
ec2.instances.createの返り値はEC2インスタンスを表すAWS::EC2::Instanceのインスタンスです。

v2スクリプト

aws-sdk-coreのみを使って書くとこうなります。

#!/usr/bin/env ruby

require 'aws-sdk-core'
require 'base64'
require 'yaml'

### 引数取得、設定ファイル読み込み、user_data作成など
### 共通処理なので省略

ec2 = Aws::EC2::Client.new

### インスタンス作成
puts "run_instances"
response = ec2.run_instances(
  image_id:  config['image_id'],
  min_count: 1,
  max_count: 1,
  instance_type: instance_type,
  key_name: config['key_name'],
  subnet_id: config['subnet_id'],
  user_data: Base64.encode64(user_data),
  security_group_ids: config['security_group_ids'],
  iam_instance_profile: {
    name: config['iam_instance_profile']['name']
  },
  block_device_mappings: [
    {
      device_name: '/dev/xvda',
      ebs: { volume_size: config['ebs_size'].to_i }
    }
  ]
)

instance = response.instances.first

puts "wait until instance_running"
ec2.wait_until(:instance_running, instance_ids: [ instance.instance_id ]) do |w|
  w.interval = 5
  w.max_attempts = 20
  w.before_wait do |attempt, prev_response|
    instance = prev_response.reservations.first.instances.first
    puts "#{instance.instance_id} : #{instance.state.name}"
  end
end

### EIPの取得とアタッチ
eip = ec2.allocate_address(
  domain: "vpc",
)

ec2.associate_address(
  instance_id: instance.instance_id,
  allocation_id: eip.allocation_id
)

### インスタンスとEBSにタグ付け
ec2.create_tags(
  resources: [ instance.instance_id ],
  tags: [ { key: "Name", value: hostname } ]
)

ec2.create_tags(
  resources: [ instance.block_device_mappings.first.ebs.volume_id ],
  tags: [ { key: "Name", value: "#{hostname}_root" } ]
)

### Route53にCNAMEを登録
route53 = Aws::Route53::Client.new()
hosted_zone = route53.get_hosted_zone(id: config['hosted_zone_id']).hosted_zone
fqdn = hostname + '.' + hosted_zone.name
route53.change_resource_record_sets(
  hosted_zone_id: hosted_zone.id,
  change_batch: {
    changes: [
      action: 'CREATE',
      resource_record_set: {
        name: fqdn,
        type: 'CNAME',
        ttl: 300,
        resource_records: [
          { value: instance.public_dns_name }
        ]
      }
    ]
  }
)
puts "create DNS record : #{fqdn}"

『なんとか_id』が目白押し!

EC2の操作はAws::EC2::Clientクラスのオブジェクトで全て実行しています。
そして例えば、ec2.run_instancesの返り値はEC2インスタンスを表すクラスのオブジェクトじゃなく、ただのStructです。

[13] pry(main)> response
=> #<struct 
 reservation_id="r-9b024082",
 owner_id="518578968550",
 requester_id=nil,
 groups=[],
 instances=
  [#<struct 
    instance_id="i-dc1c18c5",
    image_id="ami-4985b048",
    state=#<struct  code=0, name="pending">,
    private_dns_name="ip-10-0-0-226.ap-northeast-1.compute.internal",
    public_dns_name="",
    state_transition_reason="",

EIPやタグの設定も各種IDをメソッドの引数として引き回して操作する。
APIそのままで、まぁダルいです。

じゃあaws-sdk-resourcesを使えばいいのか

aws-sdk-resourcesを使うとインスタンス作成部分はこんな感じで書けます。

require 'aws-sdk-resources'

### 引数取得、設定ファイル読み込み、user_data作成など
### 共通処理なので省略

ec2 = Aws::EC2::Resource.new

instances = ec2.create_instances(
  image_id:  config['image_id'],
  min_count: 1,
  max_count: 1,
  instance_type: instance_type,
  key_name: config['key_name'],
  subnet_id: config['subnet_id'],
  user_data: Base64.encode64(user_data),
  security_group_ids: config['security_group_ids'],
  iam_instance_profile: {
    name: config['iam_instance_profile']
  },
  block_device_mappings: [
    {
      device_name: '/dev/xvda',
      ebs: { volume_size: config['ebs_size'].to_i }
    }
  ]
)
instance = instances.first
instance.wait_until_running

操作にはAws::EC2::Clientではなく、Aws::EC2::Resourceのインスタンスを使っていて、ec2.create_instancesの返り値はAws::EC2::Instanceクラスのインスタンスです。
インスタンス起動まで待機するwait_until_runningみたいなメソッドもあってなかなかいい。

しかし、Aws::EC2::ElasticIPはまだ無いようで、
けっきょくEIPの設定には前述のAws::EC2::Clientを使わないといけない。

現状、EC2関連で定義されているリソースはこのあたり。

[2] pry(main)> Aws::EC2.constants
=> [:Client,
 :Errors,
 :Resource,
 :DhcpOptions,
 :Image,
 :Instance,
 :InternetGateway,
 :KeyPair,
 :NetworkAcl,
 :NetworkInterface,
 :PlacementGroup,
 :RouteTable,
 :RouteTableAssociation,
 :SecurityGroup,
 :Snapshot,
 :Subnet,
 :Tag,
 :Volume,
 :Vpc,
 :VpcPeeringConnection]

v1にあったこのへんは実装待ちということなのかな。

Attachment
AvailabilityZone
CustomerGateway
DHCPOptions
ElasticIp
ExportTask
Region
ReservedInstances
ReservedInstancesOffering

そしてRoute53のほうはというと、

[3] pry(main)> Aws::Route53.constants
=> [:Client, :Errors, :Resource]

HostedZoneもResourceRecordSetもなんもない(´・ω・`)

まとめ

AWS SDK for Ruby V2を使ってEC2インスタンスを作成してみました。

v2のコードは、

  • 基本機能が定義されたaws-sdk-core
  • 抽象化されたリソースクラスが定義されたaws-sdk-resources

という2つのgemに分かれているのですが、

  • aws-sdk-coreだけではコーディングがけっこう辛い
  • aws-sdk-resourcesはまだ未対応のリソースが多そう

というわけで今回は切り替えを見送りました。

切り替えを実施する場合は、使いそうなリソースがaws-sdk-resourcesに定義されているかをちゃんと確認したほうがいいかもです。

ここ数年で読んだ技術書

ふと思い立って、ここ数年で読んだ技術書を年ごとにまとめてみました。

読んだ本は読書メーターで記録してます。

読んだ本を見ると、このころ仕事でこんなことやってたな、というのが思い出せて面白いですね。

2014年 5冊

パーフェクト Ruby on Rails

パーフェクト Ruby on Rails

HTML+CSSデザイン|基本原則、これだけ。【HTML5 & CSS3対応版】

HTML+CSSデザイン|基本原則、これだけ。【HTML5 & CSS3対応版】

CakePHP2 実践入門 (WEB+DB PRESS plus)

CakePHP2 実践入門 (WEB+DB PRESS plus)

パーフェクトPHP (PERFECT SERIES 3)

パーフェクトPHP (PERFECT SERIES 3)

過負荷に耐えるWebの作り方 ~国民的アイドルグループ選抜総選挙の舞台裏 (Software Design plus)

過負荷に耐えるWebの作り方 ~国民的アイドルグループ選抜総選挙の舞台裏 (Software Design plus)

4月から不動産系のベンチャーに転職して、CakePHPとHTML/CSSを急いで勉強しました。
そして新サービスからRailsにしよう!ということになりRailsも。

この年はホントに業務で使うことしか勉強してないですねぇ。

面白かったのは『パーフェクトPHP』かな。
5.2以降のバージョンを追えてなかったのを知識更新できたのと、WAFやMiniBlogの実装、セキュリティ関連など実践的な内容がメインで勉強になった。

2013年 10冊

パーフェクトRuby (PERFECT SERIES 6)

パーフェクトRuby (PERFECT SERIES 6)

インフラエンジニアの教科書

インフラエンジニアの教科書

Amazon Web Services クラウドデザインパターン 設計ガイド

Amazon Web Services クラウドデザインパターン 設計ガイド

7つのデータベース 7つの世界

7つのデータベース 7つの世界

Mapion・日本一の地図システムの作り方 (Software Design plus)

Mapion・日本一の地図システムの作り方 (Software Design plus)

[改訂新版] Apache Solr入門 ~オープンソース全文検索エンジン (Software Design plus)

[改訂新版] Apache Solr入門 ~オープンソース全文検索エンジン (Software Design plus)

プロのための Linuxシステム・10年効く技術 (Software Design plus)

プロのための Linuxシステム・10年効く技術 (Software Design plus)

Cassandra実用システムインテグレーション (NEXT-ONE)

Cassandra実用システムインテグレーション (NEXT-ONE)

rsyslog 実践ログ管理入門

rsyslog 実践ログ管理入門

業務に必要なものプラスアルファな感じですね。

面白かったのは、
周辺ツールまで含めて幅広くRubyについて学べた『パーフェクトRuby』と、
思想の違ういろんなデータストアを紹介した『7つのデータベース 7つの世界』。

2012年 8冊

Hadoopファーストガイド

Hadoopファーストガイド

Cassandra

Cassandra

プログラミングRuby 1.9 −言語編−

プログラミングRuby 1.9 −言語編−

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

Mobageを支える技術 ~ソーシャルゲームの舞台裏~ (WEB+DB PRESS plus)

Mobageを支える技術 ~ソーシャルゲームの舞台裏~ (WEB+DB PRESS plus)

まつもとゆきひろ コードの未来

まつもとゆきひろ コードの未来

Webエンジニアのための データベース技術[実践]入門 (Software Design plus)

Webエンジニアのための データベース技術[実践]入門 (Software Design plus)

オンラインゲームを支える技術  ??壮大なプレイ空間の舞台裏 (WEB+DB PRESS plus)

オンラインゲームを支える技術  ??壮大なプレイ空間の舞台裏 (WEB+DB PRESS plus)

10月からEC系のASPに転職して、サービス用言語がPHPからRubyなったのでRubyを勉強しました。
このころから細かいツールrubyで書くようになります。
そしてCassandraを運用することになったのでオライリー本を読んだんだけど、冗長化や分散のアルゴリズムスキーマ設計まわりがぜんぜん理解できなくてビックリしました。
分散データストアはホントに難しい。

面白かったのは、敷居の高めなHadoopをサクッと学べて試せる『Hadoopファーストガイド』。
あとは『まつもとゆきひろ コードの未来』

2011年 10冊

7つの言語 7つの世界

7つの言語 7つの世界

jQueryで作る Ajaxアプリケーション

jQueryで作る Ajaxアプリケーション

iPhone & Android HTML5ではじめるアプリ制作の手引き

iPhone & Android HTML5ではじめるアプリ制作の手引き

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

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

プログラマが知るべき97のこと

プログラマが知るべき97のこと

Amazon Web Services ガイドブック クラウドでWebサービスを作ろう!

Amazon Web Services ガイドブック クラウドでWebサービスを作ろう!

改訂新版 BIND9によるDNSサーバ構築 (エッセンシャルソフトウェアガイドブック)

改訂新版 BIND9によるDNSサーバ構築 (エッセンシャルソフトウェアガイドブック)

プロのための Linuxシステム構築・運用技術 (Software Design plus)

プロのための Linuxシステム構築・運用技術 (Software Design plus)

クラウド大全 第2版

クラウド大全 第2版

プロのための Linuxシステム・ネットワーク管理技術 (Software Design plus)

プロのための Linuxシステム・ネットワーク管理技術 (Software Design plus)

海外用で初めてクラウド(AWS)を触った年ですね。
VPCを導入したけどそのころあんまり事例がなくて苦労しました。
複数サブネット』、『ローカルサブネット+NATインスタンス』と、オンプレ感覚をかなり引きずった構成でした。
このころはひたすら値段が高いなぁと思ってました。

フロント系を勉強してるのは、社内システムのモバイル版の開発を、開発者で空いてる人がいなくて自分がやってたからかな。

面白かったのは、クラウド初めて触ったこともあって『Amazon Web Services ガイドブック』。
あと『プロのための』シリーズは基本全部オススメ。

2010 10冊

ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門

ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門

KVM徹底入門 Linuxカーネル仮想化基盤構築ガイド

KVM徹底入門 Linuxカーネル仮想化基盤構築ガイド

OpenVPNで構築する超簡単VPN入門―Windows/Mac OS X/Linux対応

OpenVPNで構築する超簡単VPN入門―Windows/Mac OS X/Linux対応

PerlフレームワークCatalyst完全入門

PerlフレームワークCatalyst完全入門

ソーシャルアプリ入門 SNSプラットフォームビジネスの企画・開発・運営ガイド

ソーシャルアプリ入門 SNSプラットフォームビジネスの企画・開発・運営ガイド

Joel on Software

Joel on Software

モダンPerl入門 (CodeZine BOOKS)

モダンPerl入門 (CodeZine BOOKS)

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

このころはPerlをよく勉強していて、細かいツールperlで書いてました。
理由はどんなサーバにも同じバージョンで入っていることと、
サービスはPHPを使っていたんですが、このころは『用途ごとに複数PHPをインストールする』みたいなことはやりたくなかったからあえて分けていた。
最近は用途ごとに言語のバイナリや依存ライブラリを分けてインストールするのは一般的になったし、汎用的に使えるスクリプト言語がメインなら全体で統一するようにしてます。

あと監視ツールのhobbitを置き換えようとZabbixをすごく勉強してたころですね。
何でも出来るぶんいろいろハマり込んでしまって、勉強会でいろいろ話したりもしたけど、けっきょく切り替えはデキなかった。

Haskell本は参照透過性のような関数型言語の考え方を学ぶのは面白かったけど、実際に書くのは(´;ω;`)ウッ…辛い・・・と思いました。
Scala勉強しよ。

2009年 13冊

2月からしか記録がないので、実際はもうちょっと多いかも。

キャパシティプランニング ― リソースを最大限に活かすサイト分析・予測・配置

キャパシティプランニング ― リソースを最大限に活かすサイト分析・予測・配置

まつもとゆきひろ コードの世界?スーパー・プログラマになる14の思考法

まつもとゆきひろ コードの世界?スーパー・プログラマになる14の思考法

4Gbpsを超えるWebサービス構築術

4Gbpsを超えるWebサービス構築術

MySQLによるタフなサイトの作り方

MySQLによるタフなサイトの作り方

現場で使える MySQL (DB Magazine SELECTION)

現場で使える MySQL (DB Magazine SELECTION)

Linuxサーバ Hacks 2 ―コネクティング、モニタリング、トラブルシューティング

Linuxサーバ Hacks 2 ―コネクティング、モニタリング、トラブルシューティング

システム管理者のためのLDAP徹底理解

システム管理者のためのLDAP徹底理解

スケーラブルWebサイト

スケーラブルWebサイト

WEBアプリケーション・サーバー 設計・構築ノウハウ

WEBアプリケーション・サーバー 設計・構築ノウハウ

Effective Perl (ASCII Addison Wesley Programming Series)

Effective Perl (ASCII Addison Wesley Programming Series)

増補改訂版Java言語で学ぶデザインパターン入門

増補改訂版Java言語で学ぶデザインパターン入門

Subversion実践入門:達人プログラマに学ぶバージョン管理(第2版)

Subversion実践入門:達人プログラマに学ぶバージョン管理(第2版)

プログラミング作法

プログラミング作法

NW系SIerからWEB系に転職したころで、それまでApacheMySQLも使ったことなくて、何をするにも何が正解なのかホントにわからなかった。
ライブドアサイバーエージェント、YahooやFlickrとかの、中の人が書いた運用系の本をひたすら読みあさってました。
はてな、Klabの人が書いた[24時間365日] サーバ/インフラを支える技術 ?スケーラビリティ、ハイパフォーマンス、省力運用 (WEB+DB PRESS plusシリーズ)も読み返しました。

オススメは『まつもとゆきひろ コードの世界』、『4Gbpsを超えるWebサービス構築術』、『Effective Perl』、『Java言語で学ぶデザインパターン入門』あたり。

まとめ?

自分の読書速度だと年間10冊、月に1冊弱ぐらいがいい目安になりそう。

あとやっぱり、言語、MW、運用系の本ばっかりだなぁ。
DBMS/SQL、開発フロー、プロジェクト管理系の本をもっと読むようにしよう。

フォロワーのブログのはてブ数を調べてみた

最近久しぶりにまた個人ブログを書き始めたんですが、
なんとなく気になって、Twitterでフォローしてる人達のブログの総はてブ数を調べてみました。

  1. 31761 元RX-7乗りの適当な日々 @namikawa
  2. 20355 delirious thoughts @kentaro
  3. 19416 blog.nomadscafe.jp @kazeburo
  4. 14450 (ひ)メモ @hirose31
  5. 13739 As a Futurist… @riywo
  6. 13684 たごもりすメモ @tagomoris
  7. 12067 昼メシ物語 @mirakui
  8. 10943 (゚∀゚)o彡 sasata299's blog @sasata299
  9. 10235 Glide Note - グライドノート @glidenote
  10. 9611 すぎゃーんメモ @sugyan
  11. 8340 酒日記 はてな支店 @sfujiwara
  12. 7794 stanaka's blog @stanaka
  13. 7226 ゆううきブログ @y_uuk1
  14. 6274 HsbtDiary @hsbt
  15. 5964 Carpe Diem @n0ts
  16. 5724 外道父の匠 @GedowFather
  17. 5528 tumblr @shim0mura
  18. 5115 おそらくはそれさえも平凡な日々 @songmu
  19. 4505 Dマイナー志向 @matsuu
  20. 4261 sonots:blog @sonots
  21. 4165 Ore no homepage | おれのホームページ @la_luna_azul
  22. 3449 suz-lab - blog @suz_lab
  23. 3439 さよならインターネット @kenjiskywalker
  24. 2984 256bitの殺人メニュー @kuwa_tw
  25. 2901 iをgに変えるとorangeになることに気づいたoranieの日記 @oranie
  26. 2898 Y-Ken Studio @yoshi_ken
  27. 2473 かみぽわーる @kamipo
  28. 2445 カイワレの大冒険 @masudaK
  29. 2142 Pocketstudio.jp log3 | 鯖管理やクラウド話 @zembutsu
  30. 1763 debiancdn | AWS, Content Delivery Network and Debian @ar1
  31. 1259 mikedaの日記 @mikeda
  32. 1221 Studio3104::BLOG.new @studio3104
  33. 1188 blog.hansode.org @hansode
  34. 1129 双六工場日誌 @sechiro
  35. 799 hasegaw blog @hasegaw
  36. 735 cat /dev/random > /dev/null & @xcir
  37. 730 netmark.jp @netmarkjp
  38. 653 まいんだーのはてなブログ @myfinder
  39. 537 hack in 3 minites @tnmt
  40. 385 おいぬま日報 @oinume
  41. 99 どんまいこの花嫁修業 @mnakajima18

こうやって見ると、このブログもぜんぜんすなぁ。

補足的なやつ

いちおうリストの作成方法をのせておきます。
※1つずつ調べる場合は、はてブチェッカーというサイトで調べるのが簡単そうです。

はてな記法とかで簡単にできなそうだったので、はてなブックマーク被ブックマーク合計数取得APIを使いました。

## Twitter見ながらアカウントとブログのリストを作る(*´Д`)ハァハァ
$ cat blog_list 
oranie http://d.hatena.ne.jp/oranie/
mikeda http://mikeda.hatenablog.com/
kenjiskywalker http://blog.kenjiskywalker.org/
...

## ブログのタイトルと総ブクマ数を取得する
$ perl bookmark_count.pl blog_list > blog_list.csv
$ head blog_list.csv
namikawa,http://d.hatena.ne.jp/rx7/,元RX-7乗りの適当な日々,31761
kentaro,http://blog.kentarok.org/,delirious thoughts,20355
kazeburo,http://blog.nomadscafe.jp/,blog.nomadscafe.jp,19416

## markdownに変換
$ perl -F, -alne 'printf "%d. %d [%s](%s) @%s\n", $. , @F[3,2,1,0]' blog_list.csv
1. 31761 [元RX-7乗りの適当な日々](http://d.hatena.ne.jp/rx7/) @namikawa
2. 20355 [delirious thoughts](http://blog.kentarok.org/) @kentaro
3. 19416 [blog.nomadscafe.jp](http://blog.nomadscafe.jp/) @kazeburo
...

ブログのタイトルと総ブクマ数を取得するスクリプトの中身はこんな感じです。

#!/usr/local/bin/perl
use strict;
use warnings;
use XMLRPC::Lite;
use LWP::UserAgent;
use HTTP::Request;
use URI::Title;
use Data::Dumper;

binmode(STDOUT, ":utf8");

my @users = ();
while(my $line = <>){
  chomp $line;
  my ($twitter_id, $url) = split(' ', $line);
  my $boomark_count = get_bookmark_count($url);
  my $title = URI::Title::title($url);
  push( @users, {
    twitter_id => $twitter_id,
    url => $url,
    title => $title,
    boomark_count => $boomark_count,
  });
}

for my $user (sort {$b->{boomark_count} <=> $a->{boomark_count}} @users){
  print join(",", @{$user}{qw(twitter_id url title boomark_count)})  ."\n";
}

exit;

sub get_bookmark_count {
  my ( $url ) = @_;
  my $EndPoint = 'http://b.hatena.ne.jp/xmlrpc';
  my $count = XMLRPC::Lite
      ->proxy($EndPoint)
      ->call('bookmark.getTotalCount', $url)
      ->result;
  
  return $count;
}

そういやtophatenarはなんで更新されなくなったんだろう。

追記

その1

gistにCSVをアップしました。
https://gist.github.com/mikeda/ce4c9c661cac17d333c1

ブログ名に「,」が入ってる人がいるのでバグってます。

その2

tagomorisさんのはてなダイアリーはてなブログが統合されたそうなので更新。ブクマ数が9652から13684に。

その3

@さんからコメントが!

画像APIというのがあって、これで簡単に取得できます。 http://b.hatena.ne.jp/bc/de/http://dqn.sakusakutto.jp/

プログラマブルにやるならこんな感じで。 curl --silent --head http://b.hatena.ne.jp/bc/de/http://dqn.sakusakutto.jp/ | grep Location

こんなのあったのか!!

Markdownだとこう書けば

![画像](http://b.hatena.ne.jp/bc/de/http://mikeda.hatenablog.com/)

こう表示される。

画像

これで全はてブ数を取れるのかー。こっちのほうが簡単だったなw

友達の会社めぐり 六本木ヒルズ編

久しぶりに六本木ヒルズ行ったので、
せっかくだから友達の会社いろいろのぞいていくかー
と突発的に思い立ってやってみました。

フリークアウト

@さんにお願いして初訪問。

f:id:mikeda:20141225141615j:plain

f:id:mikeda:20141225141753j:plain

f:id:mikeda:20141225141813j:plain

f:id:mikeda:20141225142334j:plain

すごく凝っててカッコいい!
他の会社であんま見ない、男の子っぽい感じのカッコよさですね。

執務スペースは社長室含めて全く仕切りがなくて、すごく開放的な感じ。
そして全体的にスペースをかなり広めに取ってて、今後もガンガン成長する予定なんだろうなぁ。

GREE

いわなちゃん!

f:id:mikeda:20141225144033j:plain

勉強会で来たことあったけど、オフィスっぽいところは初訪問!

しかしオフィスはすんごい普通でした(フリークアウトの後だから特にw)。
なので写真は無いw

ただあそこからあそこまでインフラ部、と言われてやっぱデカイなーと驚いた。
※インフラといってもサーバ/MWの管理だけなじゃくて、いわゆる横串技術基盤チームっぽい組織らしい
そしていわなちゃんの周りの人達のギーク感(机のグチャグチャ感とか、まともにイスに座ってない感とか)がすごかった!

そしてCTOの藤本さんに初めて会った!(軽く挨拶しただけだけどw)

CROOZ

f:id:mikeda:20141225145555j:plain

f:id:mikeda:20141225145726j:plain

f:id:mikeda:20141225152904j:plain

2年前まで在籍してたとこなので、あんまウロウロせずにインフラチームの人達といろいろ話をしました。
『あそこはあの後どうなったか』とか『この前CROOZブログ落ちてたやん!』とか。
社員数は数倍になってますが、インフラチームは相変わらずの安定感とゆるふわ感で安心しました。

やめた会社の人達と話して、自分がいなくなった後どうなったか(何が残って何が無くなったかとか)を聞くのはすごく参考になるのでオススメです。

まとめ

というわけで、『友達の会社めぐり 六本木ヒルズ編』でした。
あとグラニも行ってみたかったんだけど、知り合いが捕まらずで残念。

会社訪問とか何も考えずに行くと15分くらいでやること無くなっちゃうけど、こうやってまとめてまわるとすごくいい感じ。
ちょっとのぞきに行く程度ならだいたい断られないので、みなさんもぜひやってみてください。

そして急な連絡に快く対応してくれたmyfinderさん、いわなちゃん、伊藤さん、ありがとうございました!!!
次はヒカリエ行くか!!!