2015年12月27日日曜日

AmazonLinuxにErlang+Elixir+Phoenixをインストールしてみた

仕事で Phoenixという、Elixirというプログラム言語で作られたWebアプリケーションフレームワークの構築検証した時のメモです。
Elixirは、Erlangという早くて 低いレイヤ向けのプログラム言語に、Ruby風の着ぐるみ(と言っていいのかわかりませんが…)を着せて、Rubyができるエンジニアが低い学習コストで高速なアプリを作れるように開発された、今時のプログラム言語です。
とりあえず今回は、サンプル画面が動いた!というレベルです。
ここからデプロイだったりチューニングだったり運用だったりを整えていかないといけないのですが、その辺はまだキャッチアップできていないので、出来次第ブログに書ければと思います。
感想としては、登場人物(プログラム)が多くて、最初はインストールするのがすごくめんどくさく感じます。 brunch.io という html/css のファイル管理ツールもつかっているため、Node.jsとかもインストールしなければいけません。

EPELリポジトリのインストール

後述する inotifywait をインストールするために、EPELリポジトリを追加します。
sudo yum install epel-release

Gitのインストール

node.jsのバージョン管理ツールであるnvmをインストールするために、Gitをインストールします。
sudo yum install git

Erlang被依存パッケージのインストール

sudo yum install ncurses ncurses-devel openssl openssl-devel gcc-c++ unixODBC unixODBC-devel fop java-1.6.0-openjdk-devel

Erlangのインストール

wget http://www.erlang.org/download/otp_src_18.0.tar.gz
tar xvzf otp_src_18.0.tar.gz
cd otp_src_18.0
./configure
以下は出力されても無視します。GUI開発用とのことで、今回は利用しないためです。
*********************************************************************
**********************  APPLICATIONS INFORMATION  *******************
*********************************************************************
wx           : wxWidgets not found, wx will NOT be usable
*********************************************************************
configureできたらmakeしてインストールします。
sudo make
sudo make install
erl
Ctrl+c -> a

Elixirのインストール

cd ~
git clone https://github.com/elixir-lang/elixir.git
cd elixir
make clean test
mv elixir /opt/
sudo ln -s /opt/elixir/bin/elixir /usr/bin/elixir
sudo ln -s /opt/elixir/bin/iex /usr/bin/iex
sudo ln -s /opt/elixir/bin/elixirc /usr/bin/elixirc
sudo ln -s /opt/elixir/bin/mix /usr/bin/mix

mixとHexのインストール

mixはErlangに付属しています。
mix
mix local.hex
mix hex

nvmのインストール

git clone https://github.com/creationix/nvm.git ~/.nvm
source ~/.nvm/nvm.sh
nvm help

npm(Node.js)のインストール

nvm ls-remote
nvm install v5.3.0
node -v

inotifywaitのインストール

sudo yum install --enablerepo=epel inotify-tools

Phoenixのインストール

mix archive.install https://github.com/phoenixframework/phoenix/releases/download/v1.1.0/phoenix_new-1.1.0.ez

Phoenixアプリテンプレートのセットアップ

mix phoenix.new hello_phoenix

brunch.ioのインストール

cd hello_phoenix
npm install brunch

charmのインストール

cd hello_phoenix
npm install charm

Phoenixアプリ起動

cd hello_phoenix
mix phoenix.server

参考にしたサイト

Dockerに頼らずにCentOS7でElixir開発環境を整備した話 - sat0yu's blog http://sat0yu.hatenablog.jp/entry/2015/08/09/193241 いまアツいJavaScript!ゼロから始めるNode.js入門〜5分で環境構築編〜 http://liginc.co.jp/web/programming/node-js/85318 ElixirとPhoenixをインストールするメモ - bokuweb.me http://blog.bokuweb.me/entry/2015/10/03/153300 Phoenix と Elixir をインストールして ブログを作りはじめます http://www.kaeruspoon.net/articles/1131 Brunch - ultra-fast HTML5 build tool http://brunch.io/ Installation · Phoenix http://www.phoenixframework.org/docs/installation Up And Running · Phoenix http://www.phoenixframework.org/docs/up-and-running

2015年12月5日土曜日

プログラミング初心者がGoに入門しようとしてサンプルアプリのテキストwikiを動かすまで

この記事は Go その2 Advent Calendar 2015 の5日目の記事です。


日付変更と共に公開できず、しかも内容も他の方の記事に比べてショボくて申し訳ありませんが、タイトルの通りサンプルとしてWeb上に公開されているテキストwikiが動くまでにやったことの記録です。

動機

同僚のリードプログラマがGo言語を使ってシステムに機能追加を行いました。
私はサーバ構築をサポートしましたが、ミドルウェアやフレームワークなど、まだまだ彼にGo言語プロダクトの責任が偏っています。そしてそもそもGoのソースコードは1ミリもわかりません…。
今後はチームとしてスマートに動けるように、責任を平準化し、ソースコードや開発手法について議論を深めたいので、私もGoを学んでみようと思いました。

成果物

結論としてはたった2ファイル
https://github.com/TearTheSky/golangStudy/blob/master/textwiki/textwiki.go
https://github.com/TearTheSky/dotfiles/blob/master/.vimrc

textwiki.go というgoプログラムができました。
これをWebサーバに持って行って起動し、Webサーバへのアクセスを127.0.0.1:9000に渡すように設定変更してあげればテキストwikiが利用できました。
Webサーバにはnginxを使っています。
ローカルでもできるやろそれ、と言われそう(実際言われました)が、netライブラリあたりが原因なのか、うまく使えなかったので、ローカルで動く版も作りたいと思います…。



やったこと

Goのインストール

最近はMacを使っています。Macの場合はhomebrewですぐにGoをインストールして環境構築を始めることができます。
brew install go で、Go1.4がインストールされ、brew update と brew upgrade を行うと1.5にバージョンアップしました。
安易にbrew upgrade していいのかちょっと怪しいですが、せっかく最新になったので使っていこうと思います。

NeoBundleとカラースキーマとvim-goのインストール

Vim pluginへの入門[NeoBundle.vim] を参考にさせていただいて、NeoBundleをインストールしました。NeoBundleはVimのプラグイン管理を楽にしてくれるプラグインです。
外部からプラグインをダウンロードしてくる方法が分かったので、既存のしょぼい .vimrc に追記して、vim-goをインストールします。
ついでにカラースキーマも変更します。背景色は黒板みたいな深緑がいいんだけど、探したり作るのがめんどくさいので、とりあえずSublimeText使ってるし馴染みのある molokai を入れます。黒板風カラースキーマの作成、あとでやろう。あとで…。


ブラウザ上からHelloWorld!する


AWSnginx+golangが動く環境を作る 」を参考にさせていただいて、Nginxサーバを立てて、そこへのアクセスをGo言語がListenする9000番ポートにパスするようにしました。
そしてHelloWorldを出力するプログラムを起動しておけば、ブラウザ上からサーバへアクセスしたときにHelloWorldが出力されます。

チュートリアルに沿って書く

古すぎて参考にしてはいけないサイトとして有名らしい(知らなかった) golang.jp にある「 Codelab: Webアプリケーションを書いてみよう 」を読みながらソースコードを増やしていきます。
コピペですコピペ。
でも、ただのコピペじゃ動きません。
古すぎるのでライブラリ名が変わったりしていてエラーになります。
エラー名をググりながら修正していきます。
WebGolangで作ろうとハマった」 などは非常に助かりました。ありがとうございました。
それから、/view/用のhtmlテンプレートがないので作ります。/edit/をコピーしてちょっといじればすぐです。

これからやらなきゃいけないこと・やりたいこと

やらなきゃいけないことは無限に湧いて出ると思いますが、とりあえず次のステップに進むために必要そうなことを何個か…



明日は tienlen さんの記事です。パッケージ管理についてということなので、読んで勉強します!




2015年12月1日火曜日

filemeal.com で好き勝手にリストを作ってみた

この記事は、filemeal Advent Calendar 2015 の1日目の記事です。

filemealとは?

フォローしている @ohashimasaki さんが開発したWebサービス「filemeal」を使ってみました。
filemealは「一般の(非Techな)人々はウェブサイトやデータベースを意識していないし、意識しなくて良いようなデータ編集・公開プラットフォームがあるべき」という発想で開発されたようです。
(たしか開発中にそんな感じのことを呟いてたような…)

何ができるの?

まず、今回のブログを書くにあたって私が作ってみたリストがこちらです。
コーヒーの淹れ方について簡単にまとめてみました。
ブログなどに埋め込むこともできるようですので、下に埋め込んでみます。


使ってみてわかったメリットを簡単に紹介すると、
  1. すぐにリストを作って公開できる
  2. それなりにオシャレな見た目のページがすぐに公開できる
  3. 入れ子の作り方さえ覚えれば自分だけのオリジナルWikiが簡単に作れる
  4. Wikipediaのように公共性や中立性のないドキュメントを書いて怒られることがない
  5. 作ったリストをiframeタグで埋め込んだり、プログラムで外部から呼び出したりできる
といった点があります。

使い方

アカウント登録はしていたものの、使い方がイマイチわかっていなかったので、せっかくだしスクリーンショットをとってゆっくり覚えていきたいと思いました。

ということで、以下使い方の簡単な説明になります。

まず、アカウント登録してログインしてみると、下のようなページになります。


これだけじゃなにができるのかよくわかりません…とりあえず自分のアイコンを変更してみます。
アイコンの変更は、右上の「設定」を押すと行えます。


ついでに背景色も変更してみました。落ち着いた色が多くて良いですね。個人的には黒板のような深い緑が欲しいです先生…。でもこの色も好き。


さて、アイコンを変更したら早速リストを作ってみましょう。とりあえず右下の「リストを作成する」をクリックして、名前を入力します。今回はなんとなく「コーヒーの淹れ方」にしました。


するとこんな感じで「コーヒーの淹れ方」ができます。
できたら、それをクリックしてみてください。


クリックするとこんな風に「コーヒーの淹れ方」のページに進むことができます。
ここにはまだなにもありません。
今度は淹れ方の種類を書いてみましょう。
「項目を一括で追加」をクリックします。


するとこんな風にテキストエリアが出てくるので、1項目1行として入力してください。
今回は手元にあったコーヒー辞典を見て、載っている淹れ方を書いてみました。


するとこんな風に一気にリストが出来上がりました。
なんか嬉しいですね。
最近はエスプレッソがかなり幅を利かせているので、一番上に表示させて、ドリップはドリップでまとめたいと思います。
リストの右側の上下の矢印を押すと、リストを上下に動かすことができます。


リストの順番を修正したので、早速公開したいと思います。右上の「共有」をクリックすると、真ん中に共有するための情報が表示されます。
「リンク」と書かれているところにあるURLをブラウザで開くと、専用のWebページが自動で作られていて、そこが表示されます。
「埋め込み」と書かれているところにあるHTMLタグはブログや自分のサイトに埋め込むことができます。
何種類かスタイルを選ぶことができるのもいいですね。


さて、これだけではちょっと物足りないので、さらに情報を付け足していきたいと思います。
エスプレッソをクリックしてエスプレッソのページに飛び、右下に「ページとして開く」があるため、そこをクリックします。
するとリストではなく「エスプレッソ」のためのページを作ることができます。
ただの文字列のリストではなくて、文章や画像や地図などを入れて、しっかりしたWebページを簡単に作ることができます。


ということで、文章と画像を入れ込んでみました。なんかそれらしくなりましたね。画像は、自分が持っている画像をアップロードできるほか、よそのサイトのURLを指定するとそこから引っ張ってくることもできます。ただし、画像には著作権があり、どこの画像も好き勝手に引っ張ってきて良いわけではないので注意が必要です。
今回はWikipediaの画像サイトであるWikimediaの画像をここに表示させることにしました。


著作権やライセンスはWikipedia上でこういうページが表示されるので、そこで確認することができます。


著作者はここで確認できますね。


ということで、作成したエスプレッソのページはこちらです。
エスプレッソマシーンが欲しいので、それも追記してみました。
Wikipediaだと「お前が欲しいだけだろ!却下!」となりますが、これは個人的なデータなので、誰にも怒られません。(著作権やライセンス等で違反していたり、表示停止の申し出がある場合は別ですが…)



そんな感じで、ブログはかけるけどWebサイトは作り方よくわからない、でもブログじゃなくてなんか体系的な情報をまとめたいんだよなー…という方には結構おすすめです。

欲しい機能

今回リストを作っていて、こういう機能があったらいいんじゃないかなぁと思います。
  • タイムラインか最近の更新一覧
  • どんな人がいてどんな情報を書いているのかを見て回れる機能
  • TwitterやFacebookで作ったリストをシェアできるボタン
  • 画像の登録情報を変更なしで更新しようとすると登録情報が空になる→そのままの情報になるようにする
  • 自分のトップページも1枚のリストもしくはページになっているので、記事単位などにする
  • html形式でリストをみたときに、パンくずかもしくは親(一つ上の階層)要素に戻るようなリンクを表示する


さいごに

Twitterのタイムラインを眺めていて、自分の理想を呟くとこから完成するところまでたどり着いた  @ohashimasaki さんをみて、すごいなぁと思ったし、応援したいと思い、この記事を書きました。
みなさんもぜひ一度使ってみてください!


2015年9月28日月曜日

#ISUCON 5に参加して普通に予選敗退しましたが楽しかったです

チーム名「恵比寿ローラーコラボ」でISUCON5に参加しました。

ISUCONは全員が初めてで、GCPも全員が初めてだったので、はっきり言ってどうなるかわからない、すごく情けない結果で終わるのではないか、ということで、記念受験のつもりで気楽にいこう、という意識と、お昼は半額のドミノピザにしようという2つのコンセンサスだけ得た上で臨みました。

結果としてはベストスコア 8387 、最終スコア 7806でベスト20入れず…でした。
しかしもともと1000未満くらいのスコアで終わってしまうのではと思っていたので、打ち上げでHUBで飲んでいた時には、「思ったよりスコア取れてよかったよね」とか、「次はランク20以内とかに入りたいね」なんていうかなり前向きな言葉が出てきて気持ち良くビールをいただくことができました。

こんな楽しいイベントを企画していただき、実装していただいた運営者の皆様には深くお礼申し上げます。とても楽しかったし、勉強になりました。ありがとうございました。

スコア遷移


score 状況
546 初期状態で起動されてるrubyのアプリがベンチマークに通る
702 Goのアプリに変えてベンチマーク
983 ググりながらDBにインデックスを貼る。この時点ではみなさん初回ベンチマーク通過に苦戦しておりなんと暫定4位!W
1042 MySQLにバッファプールの設定などを追加して再起動。この時点で12時すぎ。みんなでドミノピザを食べる。このときたしがギリギリ19位。
1030 プログラム方面の解析でまだ具体的な変更を出せないのでMySQL周りを引き続きいじるも結果でず
1008 同上。
1041 同上。
1031 同上。この辺りから(たいしてスキルもないのに)ミドルのチューニングじゃもう稼げないかななどと思い始める。
0 インデックス貼り直し中にベンチマークしてしまいCPUが耐えられずfail
7 アプリの改修がうまくいっておらずfail
7 思いついた案がことごとくfail
7 つらい
1114 そんなさなかNginxの設定を見直してハイスコア更新。希望の光がほんのり戻る。15時くらい。このころはもう20位が7000とか取ってて自分たちはTOP20からあっさり消え失せる。
1064 SQLがネックなはずという方向性でアプリを修正するも
1070 うまく結果が出ず
1046 迷走
1378 SQLのSELECT分で * を指定しているところは個別にカラムを指定したほうがいいのでは?という発想からSQLを修正する。
1917 relationsテーブルに関するSQLでORを使っているところがあったが冗長だからいらなくね?という発想からSQLを修正する。この時点でラスト1時間くらい。
3373 引き続きrelations関連のSQLのORを消す
8387 LIMIT 1000してるところは1000行もいらなくね?& isFriend関数通す必要なくね?という発想からSQLとGoをちょこっと修正したら効果絶大。
7806 最後にベンチしたらなんか下がった。


よかったこと


  • apt-getでアップデートして死んだりとかしてるチームもいたので、そういうことはやらずに、最後まで最初のインスタンスでトラブルなくやれたこと
  • 午前中に例のタマキさんバグが出たけど、割とすぐ「ベンチマークをやり直せば回避できるバグだ」ということを発見し、チームに対処不要の通達ができたこと
  • すごく遅くなったけどスロークエリのログを出して一番時間がかかっているSQLを特定できたこと(インデックス追加した後だったのでどれも1秒未満だったけど…)
  • ぐぐりながらだけどNginxやMySQLの設定を追加してスコアアップに貢献できたこと。
  • Nginxのgzip圧縮を試して、それがベンチマークアプリ的にダメだとわかって、切り戻してfail回避して作業継続できたこと。
  • Githubのプライベートリポジトリでソースコード管理して慎重に改善できた


改善点


  • スロークエリを特定してアプリ担当にフィードバックするまでを午前中にできたらもっと違ってた。ソッコーでやるべきだった。
  • 3人中Goがわかる人が一人だけだった。みんなのGo基礎力が高かったらもっと違ってたかも
  • Redisの経験がなくてRDSのデータ載せ替えとか全然やれなかった。練習しとくべきだった
  • GCPも全然練習できなかった。
  • DBのAnalyzeとかExplainとか全然できなかった
  • GCPのインスタンスとローカルでファイルをやりとりする、デプロイするところが思ったより苦戦した。Ansibleでサクッと自前ユーザを追加したりすればよかった。

私はインフラ担当として参加しましたが、わたしのインフラスキルが総じて低く、プログラマがより成果を出せる開発基盤を提供することがうまくできなかったことがやっぱりチームのネックの一員だったのかなと思います。
ただ、実際に時間内でのパフォーマンスチューニングを行ってみたり、他の好スコアのチームのブログなどを読んで、「もっとこうすればよかったんだ!」というところが所々見えてきたような気がするので、前向きにスキルアップに臨みたいというモチベーションが上がっています。
そういう点も含めて、ISUCONに出て非常によかったと思います。
改めて、運営のみなさん、非常に有意義なイベントをご提供いただきまして、ありがとうございました!


2015年8月12日水曜日

AmazonLinuxにZabbix2.4をPostgreSQLを使ってインストール


最近は業務でAWSをよく使っており、AmazonLinuxを操作することが増えてきました。
Zabbixは業務で使う可能性が出てきたので、模索しながらインストール手順をまとめました。必要最低限レベルですが、なんとか自分で構築したZabbixにログインして管理画面を拝むことができました。
使ったAMIは amzn-ami-hvm-2015.03.0.x86_64-gp2 (ami-cbf90ecb) です。
AmazonLinuxを使う時は、RHELもしくはCentOSの6だと思って色々適用してみるとよさそうですね、ベースとしてCentOSを使っているということですし。

参考にさせていただいたページ


Zabbix以外の必要プログラムのインストール

システム系プログラムのアップデート

sudo yum update -y

Apacheのインストール

sudo yum install -y httpd24

PostgreSQLのインストール

sudo yum install -y postgresql93 postgresql93-server postgresql93-devel postgresql-93-libs

Zabbixのインストール

sudo rpm -ivh http://repo.zabbix.com/zabbix/2.4/rhel/6/x86_64/zabbix-release-2.4-1.el6.noarch.rpm
sudo yum install -y zabbix-server-pgsql zabbix-web-pgsql zabbix-agent

Zabbix用データベースとしてのPostgreSQLの設定

sudo /etc/init.d/postgresql93 initdb
sudo /etc/init.d/postgresql93 start

postgresユーザでログインしてzabbixユーザを作り、パスワードを設定

sudo su postgres
psql
create user zabbix;
alter user zabbix with password 'yourPassword';
alter user postgres with password 'yourPassword';
\q

ec2-userに戻る

exit

PostgreSQLへのログイン方法の変更

sudo vim /var/lib/pgsql93/data/pg_hba.conf
# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     md5
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5

設定反映のために再起動

sudo /etc/init.d/postgresql93 restart

zabbix用データベースの作成

psql -U postgres
create database zabbix owner zabbix;
\q

Zabbix用データベースの中身の構築

sudo psql -U zabbix zabbix < /usr/share/doc/zabbix-server-pgsql-2.4.6/create/schema.sql
sudo psql -U zabbix zabbix < /usr/share/doc/zabbix-server-pgsql-2.4.6/create/images.sql
sudo psql -U zabbix zabbix < /usr/share/doc/zabbix-server-pgsql-2.4.6/create/data.sql

Zabbix自体の設定

Zabbixサーバの設定

sudo vim /etc/zabbix/zabbix_server.conf
DBName=zabbix
DBUser=zabbix
DBPassword=yourPassword

管理画面ディレクトリの設定

sudo chmod -R 755 /usr/share/zabbix
sudo vim /etc/httpd/conf.d/zabbix.conf
#
# Zabbix monitoring system php web frontend
#

Alias /zabbix /usr/share/zabbix


    Options FollowSymLinks
    AllowOverride None
#    Order allow,deny
#    Allow from all
    Require all granted

    php_value max_execution_time 300
    php_value memory_limit 128M
    php_value post_max_size 16M
    php_value upload_max_filesize 2M
    php_value max_input_time 300
    # php_value date.timezone Europe/Riga



#    Order deny,allow
#    Deny from all
    Require all granted
    
        Order deny,allow
        Deny from all
    



#    Order deny,allow
#    Deny from all
    Require all granted
    
        Order deny,allow
        Deny from all
    



#    Order deny,allow
#    Deny from all
    Require all granted
    
        Order deny,allow
        Deny from all
    



#    Order deny,allow
#    Deny from all
    Require all granted
    
        Order deny,allow
        Deny from all
    

phpのタイムゾーンの設定(行わないとWeb画面でのインストール作業が進められない)

sudo vim /etc/php.ini
### 追記
date.timezone = Asia/Tokyo

### 有効化
always_populate_raw_post_data = -1

Zabbixの起動

sudo /etc/init.d/zabbix-server start
sudo /etc/init.d/zabbix-agent start
sudo /etc/init.d/httpd start

自動起動の有効化

sudo chkconfig zabbix-server on
sudo chkconfig zabbix-agent on
sudo chkconfig httpd on
sudo chkconfig postgresql93 on

自動起動の確認

[ec2-user@ip-10-0-3-197 ~]$ sudo chkconfig --list zabbix-server
zabbix-server   0:off   1:off   2:on    3:on    4:on    5:on    6:off
[ec2-user@ip-10-0-3-197 ~]$ sudo chkconfig --list zabbix-agent
zabbix-agent    0:off   1:off   2:on    3:on    4:on    5:on    6:off
[ec2-user@ip-10-0-3-197 ~]$ sudo chkconfig --list httpd
httpd           0:off   1:off   2:on    3:on    4:on    5:on    6:off
[ec2-user@ip-10-0-3-197 ~]$ sudo chkconfig --list postgresql
サービス postgresql に関する情報の読み込み中にエラーが発生しました: そのようなファイルやディレクトリはありません
[ec2-user@ip-10-0-3-197 ~]$ sudo chkconfig --list postgresql93
postgresql93    0:off   1:off   2:on    3:on    4:on    5:on    6:off

Zabbixサーバの起動確認

http://インストールしたサーバのIPアドレス/zabbix/ へアクセス
「2. Check of pre-requisites」の画面で確認項目が全てOKであればOK。


世の中に出ている情報はMySQLをデータベースとして利用しているものが多くて、欲しい情報になかなかたどり着けずに苦戦しました。
参考にさせていただいた記事は本当に助かりました。ありがとうございました。



2015年7月5日日曜日

すっごい遅くなったけど、@opera_jp さんから コラプシブルボトル をいただきました。

一ヶ月ぐらい前に、 @opera_jp さんが、こんなツイートをしていたので、勢いでおねだりしてみました。




そしたら、ちゃんと送っていただけました!すばらしい!



膨らませると、500ml弱ぐらいは入るんじゃないかな?という程度になって、自立しました。
自立するっていいですね。
最初に膨らませるのに、結構肺活量がいりました…w

20個希望して8個いただきました。社内で欲しいと挙手してくれた方に優先して配りました。
何気に非IT系の女性社員にウケが良かったです。赤いボトルは結構アクティブ感があっておしゃれかもしれません。

で、肝心のOperaブラウザですが、ボトルの応募を出してからすぐに仕事用のMacと自分のAndroidに入れてみました。
Macからだとニコニコ動画が見れない(フラッシュプレイヤーが古いと言われて動画が再生できない)ため、メイン使いはちょっとあきらめて、サブブラウザとして使うことにしました。

一方スマートフォンの場合だと、動画を見たい場合は専用アプリを使うので、その辺気になりません。メインのブラウザにして、サクサクブラウジングしています。

8個は全部社内で配ってしまったので、もしあまってたらまた欲しいですw
白ワインでも入れて飲みながら河川敷をだらだら歩きたい…w
なんか思いついたらスマートフォンからOperaを開いて検索したり。

そう思うと、早く梅雨が明けてほしいですね!



2015年3月30日月曜日

CentOS7で特定のプロセスを全部消す

お久しぶりでございます。

先日、CentOS7で、ある時間になったら特定のプロセスを全部削除したいというタスクをこなすことになりました。特定のプロセスとは、今回の場合はwgetです。
バックアップ的な理由で毎日wgetをサーバで実行しているのですが、万が一に備えて、朝の業務開始前までに終わっていないプロセスがあったら、それを削除して中断することにしました。

killコマンドで消せることぐらいしか理解できていなかったので、以下のようにpsコマンドでプロセスを探してパイプでつないでkillすることを思いつきました。






するとこんなご指導が。





リプライいただいたように、Linuxにはkillallというありがたいコマンドがあるため、無駄にパイプをつながなくても、 killall プロセス名 で、特定の名前のプロセスをすべて削除できるのでした。

ということで、さっそく実験。しかし、コマンドが無いと言われてしまいました…。

あれ、CentOS7にKillallって無いの…?

こういうのはきっとすでに先人が解決してくれているに違いないと思ってググってみました。


あ、とりあえずデフォでは使えないんですね…?
killallは、psmisc という、プロセスに関するコマンド群の追加パッケージとしてスタメンから左遷されちゃったみたいです。

なので、yum install psmisc をして psmisc をインストールすると使えるようになります。

でもそんなものをインストールしたくなかったり、いろんな理由でインストールが許されない場合はどうするか?
私が思いついたあの長いコマンドを使うという手もあります。
しかし、 pkill というコマンドでも killall のような動作を行わせることができるようなので、そっちのほうが短くて楽かなぁとか思います。



ということで、 pkill -f wget を cron に登録して事なきを得ました。
もっとモダンなタスクスケジュールの仕組みを用意できている場合は、そちらに登録しましょう。


ちなみに、


という点については、systemctl kill は、デーモンにしか使えないため、今回私がkillしたかったwgetプロセスを消すことはできませんでした…。

なので、 pkill を使うのがスマートかもしれません。
 さん、ディスカッションありがとうございました!


2015年1月11日日曜日

DNSの移行方法について

お仕事の話ですが、最近、DNSを自社で保持しているBINDから、Amazon Web Services の Route53 にゾーン情報を移行しました。DNSに関する知識がほとんど無いところからやったので色々調べまくったりして大変でした。
その上で分かったDNSサーバの移行(ゾーン情報の移行)の方法について、今後の自分のためにメモを残しておきたいと思います。

覚えておきたい基礎知識

下記のようなサイトを見て学習しました。まずは「○○レコードってなんぞや?」というところを理解する必要があります。その次に、「じゃあ、具体的にどういう流れで移行すればいいんだ?」というところを調べていきます。


1.移行元ゾーンの様々なTTLを怒られない程度に短くする(移行2日前など)

まずは自社のBIND内のゾーンの色んなTTLを可能な限り短くします。
AレコードやNSレコードはもちろんのこと、SOAレコードのTTLも短くしてください。
目安としては、AレコードやNSレコードは300秒程度まで減らしてください。
SOAレコードは複数種類のTTLがありますが、それぞれ10分の1程度まで減らします。
個体差はあると思いますが、1日もあれば短くなったTTLで各DNSサーバの情報が書き換わっている(更新した情報が浸透できている)と思いますので、変更作業実施予定日の2日前ぐらいにはやっておきたいところです。

変更値の目安(これくらいまで短くしてください)

Aレコード … 300秒
NSレコード … 300秒
MXレコード … 300秒
TXTレコード … 300秒
SOAレコードのRefresh … 600
SOAレコードのRetry … 300
SOAレコードのExpire … 6000
SOAレコードのNegative cache TTL … 300
SOAレコードは特に’‘Negative cache TTL’‘を短くすることが大切です。これが短くなってると、もしなんかのミスで「そんなサーバ存在しねーよ」状態になってもNegative CacheのTTLの間隔で更新することが可能になります。


2.移行元を停止せずに移行先にゾーン情報をコピーする(移行2日前)

コピー方法はいろいろありますが、移行先サーバを作成して、そこに移管したいゾーンと全く同じ情報を登録します。
すみません、すべての情報のうち、移行元のDNSサーバー自身に関する情報は不要です。
すなわち、DNSサーバーを指し示すAレコードや、CNAME、NSレコードなどです。
BINDからAWS Route53への移行方法としては、Perlのスクリプトを使う方法が有名みたいです。しかし、この記事執筆時の移行元BINDサーバは、なぜかそれが使えなかったため、手動でコピーしました。ゾーンが数十など行くようであれば、どうにかしてツールでコピーすることをお勧めします。


3.移行先ゾーンの様々なTTLを怒られない程度に短くする(移行2日前)

移行先のゾーンのTTLも短くしてください。短さの程度は移行元と同じ程度で構いません。
理由は、移行の際に移行先ゾーンのTTLも短いと、設定漏れ内容の再設定を行うカバー作業の時間が短縮されるためです。
移行が完了したら、世の中のためにデフォルト値に戻しておきましょう。


4.移行元のゾーン情報に移管先のDNSサーバをNSレコードで登録する(移行2日前)

移行元のBINDサーバのゾーンに、移行先のDNSサーバをNSレコードとして登録します。
それにより、一時的に「DNSサーバの仲間が増えたから紹介するぜ!」状態になります。
つまり、レジストラの管理画面からWhois情報変更後に、古い情報を元に移行元サーバへ
問い合わせを行ってきたエンドユーザーに対して、応答可能なDNSサーバな1つとして、
移行先のサーバを紹介することができ、アクセスが途切れるのを防ぎます。
これをやっておかないと、さまざまなキャッシュが消えるまで全く接続できない状態になります。


5.移行先のサーバが世に出たことを確認する(移行1日前)

nslookup(dig)テスト【DNSサーバ接続確認】([[http://www.cman.jp/network/support/nslookup.html]])
などを使って、移行先のサーバが移行元サーバの新しいNSレコードとして追加されたかを確認する。
追加されていれば、前述の「DNSサーバの仲間が増えたから紹介するぜ!」状態になっていると言えます。

6.レジストラの管理画面からDNSサーバを移管先へ変更する(移行1日前)

お名前.comやムームードメインの管理画面へログインし、DNSサーバー(ネームサーバーと書かれていることも)の設定内容を変更します。 
自社でDNSサーバーを運用している場合は、そのDNSサーバーが設定画面に書かれていると思いますので、 その内容を移行先のDNSサーバーのものへ更新します。 
‘’これが実質的な「移行開始作業」’‘となり、ここから色んなキャッシュがクリアされるまで、いわゆる「長ければ数日、 サイトが見れなくなる」可能性があります。

7.旧サーバが参照されていないことを確認する (移行2、3日後)

TTLを確認して、切れたタイミングでDNSサーバー接続確認を再度行ってください。
SOAレコードおよびその他すべてのレコードの情報が移行先のDNSサーバーで設定したものとなっていれば、
移行は完了しています。それを確認した後、移行元DNSサーバからゾーン情報を削除するなり、
移行元DNSサーバーを停止するなりしてください。
もしものために、ゾーン情報を削除したり、サーバー自体を削除したりする前に、一度停止してみることをオススメします。


以上、これでいつかまた自分がDNSサーバの移行をやらなきゃいけなくなった時に、自分の記事を見てなんとかできることでしょう。未来の俺、検討を祈る。


2015年1月1日木曜日

2014年の個人的な目標の達成度合いを確認してみた。

あけましておめでとうございます。
皆様にとって2014年はいかがでしたでしょうか?
私にとってはとても荒波にもまれた一年でした。いやー辛かった!
正直死ぬかと思いました。でも死にませんでした。
今年も精一杯頑張ろうと思います。
今年もよろしくお願いします。

もしよろしければ、元旦に投げ銭をお願いします!
Kindleでさくっと見れる写真集になっています。
内容としてはちょっと悲しい感じの、寂れた地方の写真集なのですが、ちょっと大きな志をお持ちの方にとっては刺激になる内容だと思います。「地方はこんなに寂れているのか!再生しなければ!」的な。あと海綺麗です。




ということで、新年最初の投稿は、去年の目標の結果を確認してみましたという内容です。
相変わらず目標(というか希望)を書くだけ書いて定期チェックとかしていない模様。


No目標結果コメント
1月に1回この目標の進捗状況を確認する確認していなかった。
212kg痩せろ夏は痩せてたんだけど今は去年の正月と同じぐらいまでに戻っていてまずい。
3入院しない入院しなかった。
4視力悪化させない極端に悪くなってメガネをかけたりはしなかった。現状維持できたと言える。
5月間残業時間平均30時間位内無理
6ノリで仕事せずに帰る転職してからは帰ることができていたけど、年末はちょっとノリで仕事してた。
7技術書を月に1冊以上読むGoogle Analyticsなど、ちょっと軽めのものもあったけど、年に12冊は読むことが出来た。
8一年で40冊以上本を読む27冊でした。一応記録更新。
9年始と年末で積み本の数を比較する比較していなかったので比較する
10Androidアプリを完成させるやってない
11GooglePlayに開発者アカウント開設してアプリ公開やってない
12Kindleで技術書を出すやってない
13IT技術系スライドを1個以上うpやってない
14自分のvim設定ファイルを作って管理するクライアントエディタとしてVim使ってない。
15WindowsServer2012R2のブログ記事20個Windows Server 触らなくなったから書いてない
16PowerShellのブログ記事10個書いてない
17windowsでメールサーバを立てられるようになるできた
18Linuxでメールサーバを立てられるようになるできた
19systemdについて勉強する今年は早々に勉強しなきゃ
20LPIC1取る101のみ
21IT系勉強会に1回くらい参加するしてない
22PCの大掃除してない
23USB3+SSD+Win8.1なノートPC買う買ったノートはUSB3+SSD+Win7
24GoogleAppEngineを触ってみるやってない
25ネットワークスペシャリスト試験を受けるやってない
26ネットワークスペシャリストに合格するやってない
27積み本の英語勉強系書籍を2冊は読む読んでない
28TOEICを受ける受けてない
29TOEICの点数50点以上UP(前回は390)受けてない
30ブログ記事40個以上無理
31週に一度ジョギングする総合するとやれてない
32「週に一度ジョギングする」が守れないのでなんかリマインドの仕組み考える考えてない
33NISA口座開設やってない
34投資信託に挑戦やってない
35外国株式について勉強するやってない
36株式150%一応投入したお金はほんの少しだけ増えた。
37引っ越しする引っ越しした
38洗濯機を買い換える買い替えた。ビッグドラム超優秀
39文房具を断舎利する捨てた
40文房具整理を設計する設計というか筆箱の数減らした
41実家へ仕送り○○○○万円頑張って仕送りした。
42ExchangeManagementShellのチートシートを作る作ってない。関わらなくなったのでもういいや
43SoundCloudに曲を6曲以上うp2015年はやりたい
44マイク(まともな入力デバイス)を買うマイク買った
45埃かぶってる巡音ルカで曲を作る作りたい
46IncubusのEchoをギター完コピやってない
47http://ondav.tumblr.com/ を更新する更新してない。存在すらわすれてた
48フォロワーさんとカラオケ行く行ってない。カラオケ好きなフォロワーさんいたら是非
49スタジオに2回くらい行く1回行った気がする
50美術館に1回くらい行く1回も行ってない
51陶芸体験教室でマイマグカップ作る(ほしくなった)なんでこんなこと思いついたの?
52編み物をするか毛糸を捨てる毛糸捨てた
53赤いブーツを買う買ってない。いまあるブーツを履きつぶす
54新しい服を買う買った。部屋着
55電気毛布を買う買ってない。もう1個欲しい。
56スマフォ買い換える(たぶんAndroid)買い替えた。Galaxy Note 3
57ポケモン全国図鑑完成少し進んだけど全然完成までたどりついてない。
58ポケモン大会に挑戦(6年ぶり2度目)募集期間とかすれ違ってできなかった。
59住宅ローンを支払い終える(どうぶつの森)あと3回ぐらい
60年末は実家に帰る帰ってない
61親戚の子どもたちに3DSLLかWiiU投げつけるポケモンROASを送りつけた!
62年賀状を書く書いた!
63年内にこの目標の評価をする評価してない




種類個数
13
4
44
合計63

○率は20%くらいかな?
マイルストーンを設定して定期進捗確認を行うべきだと思います。
進捗、割とダメでした!
でも、色々無駄に風呂敷広げた目標の20%達成しているとかんがえるとあながち悪くなかったのかも。
今年もおんなじ感じで行こうかしら?それとももっと範囲を狭めて、オールクリアできる目標を立てるべきかしら?

とりあえず「自分」というプロジェクトのマネジメントは破綻してたことがよく分かりましたw