vimからはてなブログに投稿できるプラグインを作ったよ!

この記事は、Vim Advent Calendar 2012の284日目の記事です。昨日は @tyruさん の SQLのデータをtableタグから作成する - Humanity でした。
今日は、vimからはてなブログに投稿するプラグインの紹介です。このエントリもvimで書いてます。

作ったプラグイン(筆者初プラグインです(ドキドキ))

toyamarinyon/hatenablog-vim
今は、はてなブログへの投稿しか出来ませんが、動いています。
githubや、プラグインの中ドキュメントがないので、このブログを参考に導入してみてください。

インストール

mattnさんのwebapi-vimに依存しています。NeoBundleの場合は以下のようなコードをvimrcに追加すればOKです。

NeoBundle 'toymarinyon/hatenablog-vim', {'depends' : 'mattn/webapi-vim' } 

その他の場合は…よしなにやってください(´・ω・`)

準備

APIにつなぐためのhatenaIDとブログID、それからAPIキーを手元に用意してください。

hatenaID はてなのログインID
ブログID ブログのドメイン(このブログだったら "toyamarinyon.hatenablog.jp")
APIキー ブログの詳細設定に記載されたAPIキー

これを、環境変数か、vimの変数に設定します。(おすすめは環境変数)

$ cat ~/.zprofile
// 環境変数にID・PASSを設定
export HATENABLOG_USERNAME=hatena_id
export HATENABLOG_DOMAIN=blog_domain
export HATENABLOG_PASSWORD=api_key

---

$ cat ~/.vimrc
" .vimrc に直書き
let g:hatenablog_config = {
\ 'username'  :hatena_id, 
\ 'domain'    :blog_domain,
\ 'password'  :api_key
\}

使ってみる

上記の設定ができたら、後はvimを立ち上げてがりがりエントリを書いて、PostHatenaBlog でポストします。
そう、今使えるコマンドは、 PostHatenaBlog だけです。

:PostHatenaBlog

そうするとタイトルの入力を促されるので入力してください。本文は現在編集中のバッファの内容をそのまま投稿します。

今後

いろいろ作っていきたいと思っています。他にも要望があればissueまで!
□ 投稿中のエントリの一覧の取得、変更
□ 下書き状態で投稿
□ unite-source


駆け足になりましたが、vimからはてなブログに投稿するプラグインの紹介でした。
今回初めてプラグインを作りましたが、とても楽しいですね。ハマりそうです。

ラピッドスタディAWS 〜 5.AWS SDK for Ruby でアクセスキーとリージョンを環境変数に設定する

ラピッドスタディAWSの5稿目の記事です。
前回は、ラピッドスタディAWS 〜 4.AWS SDK for Ruby で EC2を作成してSSHでログインでした。
今回から、CDP(クラウドデザインパターン)の実践をしていくと予告していたのですが、その前にちょっと落ち穂拾いをしておきたいと思います。

アクセスキーとリージョンを環境変数に設定する

AWS SDK for Rubyを使ってAWSを操作するには、まずアクセスキーとリージョンを設定します。
スクリプトに直に書くと

require 'aws-sdk'

AWS.config(
	:access_key_id => 'YOUR_ACCESS_KEY',
	:secret_access_key => 'SECRET_ACCESS_KEY',
        :region => 'YOUR_REGION'
)

s3 = AWS::S3.new

s3.buckets.collect(&:name).each do |bucket|
	p bucket
end

みたいな感じでS3に登録しているbucketの一覧が表示できるのですが、このスクリプトをうっかりgithubのパブリックリポジトリに上げてしまったら最後、誰でも私のアカウントでAWSを操作出来てしまいます((((;゚Д゚))))ガクガクブルブル


これは不便すぎるので、アクセスキーとリージョンを環境変数に設定します。

export AWS_ACCESS_KEY_ID='YOUR_ACCESS_KEY'
export AWS_SECRET_ACCESS_KEY='SECRET_ACCESS_KEY'
export AWS_REGION='YOUR_REGION'

これで先ほどのスクリプトの冒頭部分 AWS.config~ を消しても動きます。

require 'aws-sdk'

s3 = AWS::S3.new

s3.buckets.collect(&:name).each do |bucket|
	p bucket
end

素晴らしい!

次回からは本当にCDPやっていきます。

ラピッドスタディAWS 〜 4.AWS SDK for Ruby で EC2を作成してSSHでログイン

ラピッドスタディAWSの4稿目の記事です。
前回は、ラピッドスタディAWS 〜 2.AWS SDK for Ruby で EC2を作成でした。とりあえず、EC2が作れたので「やったー」と思っていたのですが、前回のスクリプトにはいくつか欠陥がありました。
特に致命的なのが以下の2つ

  1. セキュリティグループを設定していないので、pingも通らない
  2. 公開鍵を登録していないので、sshできない

今は両方とも解決して、無事sshでログインできていますので、それぞれの設定方法を書いておきます。

セキュリティグループを設定していないので、pingも通らない

これはセキュリティグループに穴を開ければいいので簡単です。

$cat ec2_sg_ingress.rb
require 'aws-sdk'

ec2 = AWS::EC2.new
sg = ec2.security_groups.first
sg.authorize_ingress(:icmp, -1..-1)
sg.authorize_ingress(:tcp, 22)

sg.authorize_ingress でセキュリティグループに穴を開けられるので、2つ設定しています。
1つ目の:icmpはpingを通すためのもの。-1..-1で「全てのポート」を表現するみたい。
2つ目の:tcpはsshを通すため。

公開鍵を登録していないので、sshできない

これは、あとからやればいいやと思って前回は飛ばしていたのだけれど、それが良くなかった。
そもそもec2のインスタンスを作るとき、秘密鍵を設定すると応する公開鍵が自動的に登録される。
ということは、後からでも秘密鍵があれば自動的に公開鍵を登録できると思っていたのだが、これが違った。
後から公開鍵を登録するには、自分で秘密鍵から公開鍵を作って、登録しないといけない。
まずった。
まぁ作りなおせばOKなので、まずは前回のインスタンスを削除。

$cat ec2_instance_delete.rb
require 'aws-sdk'

ec2 = AWS::EC2.new
sg = ec2.instances.first.delete

そして、改めてインスタンスを作る。
オプションにkeypairを渡すために、予め作っておきます。

require 'aws-sdk'

ec2 = AWS::EC2.new

# keypairを作成
keypair = ec2.key_pairs.create('tamurine_ec2')

# 作成したkeypairをオプションに設定してインスタンスを作成
instance = ec2.instances.create(
	:image_id => "ami-xxxxxxxx", 
	:instance_type => "t1.micro",
	:key_pair => keypair,
	:security_group_ids => 'sg-xxxxxx',
	:subnet => 'subnet-xxxxxxx'
)

# keypairの秘密鍵をローカルに保存
File.open(File.expand_path('~/.ssh/tamurine_ec2.pam'), 'w', 0600) do |file|
	file.write(keypair.private_key)
end

インスタンスが立ち上がったら

$ ssh -i ~/.ssh/tamurin_ec2.pem ec2-user@instance_dns

でログインチェック。。できるか?




f:id:toyamarinyon:20130820183546p:plain
よっしゃあ!
次回からは今回作成したインスタンスを使って、CDP(クラウドデザインパターン)を1つずつ試していきます。

ようやくスタート地点です。頑張ります。

ラピッドスタディAWS 〜 2.AWS SDK for Ruby で EC2を作成

ラピッドスタディAWSの3稿目の記事です。
前回は、ラピッドスタディAWS 〜 1.AWS SDK for Rubyの導入 - toyamarinyon's diaryでした。
投稿が2週間も空いてしまい、ラピッド感がない。。お盆休みで頑張るぞー。

で、今回は前回導入したAWS SDK for Rubyを使ってElastic Compute Cloud(以下EC2)を作成します。
結論としては、『超カンタン』です。2行でできます。
SecurityGroupも秘密鍵も設定していないので、SSHでログインすることはできません。
それでもManagementConsoleからやるのがバカバカしくなるくらいカンタンでした。

それでは、早速はじめましょう。
(今回はAWS SDK for Ruby の導入は終わっている状態として話を進めます)

EC2について

まずAWSの公式ページの説明を引用します。

Amazon Elastic Compute Cloud(Amazon EC2)とは、クラウド内で規模の変更が可能なコンピュータ処理能力を提供するウェブサービスです。開発者がより簡単にウェブスケールでのコンピュータ作業をできるように設計されています。

うんうん、なるほど。実際に使用するには、以下の手順でいいらしい。

  1. 即座に稼働を開始するには、事前設定済みの、テンプレート化された Amazon マシンイメージ(AMI)を選択します。または、使用するアプリケーション、ライブラリ、データ、および関連する設定から成る AMI を作成します。
  2. Amazon EC2 インスタンス上でセキュリティやネットワークアクセスを設定します。
  3. 目的のインスタンスタイプを選択したら、AMI のインスタンスを必要な数だけ開始し、監視し、終了します。この作業には、ウェブサービス API や、提供されているさまざまな管理ツールを使用できます。
  4. インスタンスに対して、複数のロケーションで実行したいのか、固定 IP のエンドポイントを利用するのか、または堅牢なブロックストレージを追加するのか等を決定します。
  5. 利用料金は、インスタンス稼働時間またはデータ転送のような、お客様が実際に消費するリソースに対してのみ発生します。

いろいろと設定することもあるみたいですが、今回は、『事前設定済みのAMIから稼働』をやってみたいと思います。

AWS SDK for Ruby で EC2を作成!

まずは『事前設定済みのAMI』を見つけましょう。
今回はAmazon Linux の最新版を使おうと思うので、MarketPlaceで探します。
(AWS SDK for Rubyで検索できることもわかっているですが、実装が追いついていません。。)
AmazonLinux東京リージョンAMIのimage_id(AMIを一意にするキー)は"ami-173fbf16"でした。

AMIが決まればあと一息!
以下のスクリプトを作成して bundle exec ruby hello_ec2.rb すると、インスタンスが立ち上がります。

$ cat hello_aws.rb
require 'aws-sdk'

AWS.config(
	:access_key_id => 'YOUR_ACCESS_KEY_ID', 
	:secret_access_key => 'YOUR_SECRET_ACCESS_KEY',
        :region => 'ap-northeast-1'
)

ec2 = AWS::EC2.new

ec2.instances.create(:image_id => "ami-173fbf16", :instance_type => "t1.micro")

instance_typeを指定しないと、デフォルトでm1.smallで立ち上がってしまい課金的に辛いです。
でも、これだけでインスタンスが立ち上がってしましました。。恐るべしAWS...
今回はここまでで、次回は、立ち上げたインスタンスにセキュリティグループとか秘密鍵の設定をしてSSHでログイン出来るようにしたいと思います。

ラピッドスタディAWS 〜 1.AWS SDK for Rubyの導入

ラピッドスタディAWSの2稿目の記事です。
前回は、ラピッドスタディAWS 〜 0.はじめに - toyamarinyon's diaryでした。

今回は実作業のファースト・ステップとして、AWS Command Lint Tool(以下AWS CLI)を導入する予定でした。
が、AWS SDK for Rubyの導入に変えました。
というのも、AWS CLIはPythonで書かれているんですが、Python全然使ったことなくて、AWSの前に、言語の学習コストがかかりそうで厳しいなーと思いました。
一方でRubyは、railsとかsinatraとかchefなんかを勉強した時ににそれなりに使っていて、ひと通り問題ないかなと思っていています。ちなみにAWS SDKは他にもたくさんの言語があるので、自分の好きなやつでやるのがいいのかなーと思います。便利な時代だなー。
ただAWS CLIとAWS SDK for xxxでできることに違いがあったら嫌ですよね。どうなんやろ。
(ちょっと調べた感じEC2とかVPCとか直近やりたいところは問題無さそうなので、いったんOKです。)

それでは、早速導入してみましょう。
AWS公式のチュートリアルではシステムワイドなrubyを使っていて、ライブラリもグローバルに入れていますが、今回はrbenvでrubyを使い、ライブラリもグローバルには入れず、bundlerで管理したいと思います。
一言で言うとモダンな感じで導入するよってことですね。

rbenvとかbundlerについては説明が長くなるのでググってください。

Gemfileの作成と、bundle install

作業用のディレクトリを切ってGemfileを作成、あとはbundle installでOKですね。

$ pwd
> /home/tamurine/
$ mkdir aws-ruby && cd aws-ruby
$ pwd
> /home/tamurine/aws-ruby
$ echo -e "source 'https://rubygems.org'\n\ngem 'aws-sdk'"> Gemfile
$ cat Gemfile
source 'https://rubygems.org'

gem 'aws-sdk'

$ budle install --path vendor/bundle

次に接続確認用のスクリプトをこんな感じで作成
S3のオブジェクトを作り、テスト用のBucketsを作り、アカウントが持っているBucketsを一覧で表示します。

$ cat hello_aws.rb
require 'aws-sdk'

AWS.config(
	:access_key_id => 'YOUR_ACCESS_KEY_ID', 
	:secret_access_key => 'YOUR_SECRET_ACCESS_KEY'
)

s3 = AWS::S3.new
s3.buckets.create('UNIQ_BUCKET_NAME')

s3.buckets.collect(&:name).each do |bucket|
	p bucket
end

ACCESS_KEY,SECRET_ACCESS_KEYは自分のもので置き換えてくださいね。また、バケット名もユニークな名前になるようにしてください。
ここでは"HELLO_AWS_RUBY_20130801"というバケット名にしたとします。
で、これを実行すると、、

$ bundle exec ruby hello_aws.rb
HELLO_AWS_RUBY_20130801

できたー!
ここまで30分かかってない!まさしく、RAPID Study!
すごいなー。これでrubyでAWSをごにょごにょできちゃうわけですよ。

ManagementConsoleより楽じゃん!

ということで、次回はEC2を起動してみたいと思います。

ラピッドスタディAWS 〜 0.はじめに

社会人3年目が始まり、もう3ヶ月が過ぎた。
「社会人になって最初の3年が勝負」と言われている中、残り時間は僅かだ。

入社してからこれまでの2年間は、批判されることを恐れて思っていることを伝えようとしてこなかった。
3年目の今期はそんな自分を捨てて、稚拙でも何でもいいから思っていることを伝える努力をしようと思っている。
だから、この前のチームミーティングで、『会社の新卒入社メンバーの中で一番のエンジニアになる!』と大口を叩いたことはよかったと思う。

だけど、公言した目標を達成するための努力が全然できていない。
はてブや、twitterで気になった技術やライブラリは見たりするけど、上辺ばかりで自分の力になっている気がしない。
このままではいけない。本腰入れて勉強しよう。

今は勉強するにはちょうどいい目標がある。AWS認定プログラムの合格だ。

AWS認定プログラムの公式ページによるとテスト範囲は以下の通り。

AWS のコンピューティング、ネットワーキング、ストレージ、データベースサービスの実践的な使用経験
エラスティシティおよびスケーラビリティの概念に対する理解
AWS に関連するネットワーク技術の理解
AWS が提供するセキュリティ機能およびツール全般と、従来型サービスとの連携に関する高度な理解
AWS サービス(AWS SDK、AWS API、コマンドラインインターフェイス、AWS CloudFormation)の操作方法に関する深い理解
AWS のデプロイおよび管理サービスに関する実践経験

…ちょっとよくわからないので、絶対に必要と思われそうなところから始めよう。

  • IAM( Identity and Access Management )
  • EC2( Elastic Cloud Conpute )
  • VPC( Virtual Private Cloud )

この辺りか。

で、テキストに残したいので、作業は出来る限りCUIでやる。これが大事。
Management Consoleは最小限にする。

明日は、AWS Command Line Toolの導入について。

プラグインなしvimで使える便利コマンド(補完・diff・文字コード表示・整形)

この記事は、Vim Advent Calendar 2012の47日目の記事です。昨日は @Shaula__さん の オレオレ貼り付け処理の実装 でした。

今日はプラグインなしのvim(初期状態)で使える、便利なコマンドを紹介させていただきます。

1.なんでプラグインなし?
プラグイン使ってこそのvimですよね。
私もpluginたくさん使っていますし、vundle+git でいつでもどこでも自分の環境を作れます。

しかしながら、会社の共有マシンにはpluginが入っておらず、導入には手続きというか、上司の目とか上司の目とか、、いろいろ面倒なこと、ありますよね。

「じゃあvimってあんまり使えないなー」ってお思いのアナタにこの記事を捧げます。


2.補完
eclipseだと”インテリ”とか言われてるあれです。
補完プラグインだとShougo/neocomplcache · GitHubとかAutoComplPop - Automatically opens popup menu for completions : vim onlineとかありますが、実は、プラグインなしでも出来るんです。プラグインなしでも出来るんです。
しかも使い方はとっても簡単。

<Ctrl+N>

これでバッファ内のテキストが補完されます。

#!/bin/sh

hoge='hoge'

h[カーソル]

上記の状態で <Ctrl-N>を押すと hogeと表示されます。
複数の候補がある時は、<Ctrl-N> <Ctrl-P>で補完先を選択して <CR>で決定です。
ちょっとスクリプト書いたりする時に重宝します。


3. 2ファイルの差分を表示

開発環境と本番サーバでなぜか挙動が違う。。そんなときに役立つdiffコマンドですが vim でも2つのファイルの比較をすることはできます。さらに、リアルタイムに修正した内容が反映され差分を埋めることが出来ます。これが、プラグインなしでも出来るんです。

またまた使い方はとっても簡単、2ファイルを開いた状態で

:windo diffthis<CR>

これで2つのファイルの差分が整形されて表示されます。
あとは、差分箇所を修正すると、リアルタイムで差分情報が更新され、2ファイルを同じ状態にすることが出来ます。


4. 文字のASCIIコードを表示

「a ← この文字のASCIIコードが知りたい!」
そんな時、どうしますか?
vimなら一瞬です。そう、プラグイン無しでね。
カーソルを文字に合わせて

:ascii

これでASCIIコードやらなんやらが画面下に表示されます。
不可視文字の判別もこれで簡単にできますね。


5. オートフォーマット

<?php
if ( $isEnableXXXX ) { echo 'hello';}

    if ( $isEnableYYYY ) 
    {
    if ( $isEnableZZZZ ) 
    {
    }
    }
?>

みたいなphpファイルを整形したい時は、整形したい範囲を選択して

=

これで

<?php
if ( $isEnableXXXX ) { echo 'hello';}

if ( $isEnableYYYY ) 
{
if ( $isEnableZZZZ ) 
{
}
}
?>

知ってると何かと役に立ちます。


6. 終わり
以上4つでしたが、この4つがあれば、他人のvimでも部長のvimでも怖いものなしです。
どんな環境でもvimを使いこしてこそvimmerたるもの、私ももっと精進します。

明日は、@ujihisa さんです。