読者です 読者をやめる 読者になる 読者になる

tkuchikiの日記

Linux やプログラミングについて書きます。

bash で特定のコマンドを実行前にキャンセルする

DEBUG を trap すれば、コマンド実行前に任意の処理を挟めるということがわかったので、特定のコマンドが入力されたらキャンセルできないか試してみました。 COMMANDS=$(cat <

bash の history からコマンドを実行できなくする & コマンドの履歴は見られるようにする設定

bash で以前実行したコマンドを ↑ キーや Ctrl+p、Ctrl+r で検索すると思います。 このとき、 以前実行したコマンドの引数を一部変えて実行したいから history からコマンドを探して一部だけ書き換えようと思っていたのに間違えて Enter を押してそのまま実…

RDS for MySQL と Amazon Aurora でクエリによる取得行数を取得するなら SHOW GLOBAL STATUS WHERE variable_name = 'Innodb_rows_read' を使うのが良い

WEB+DB PRESS vol.94 特集1第5章P32 で、MySQL のクエリによる取得行数を取得するには、 mysql -u root -e "SHOW ENGINE INNODB STATUS\G" | grep "Number of rows" を実行すると記載しましたが、Amazon Aurora の Reader(Read Replica) は SHOW ENGINE INNO…

【CentOS 6, Amazon Linux 対応】 unbound と ldns の RPM 作成方法

epel repo から unbound が削除されました。 追記: CentOS6 の extras に unbound が入っているという情報をいただきました。@hfm さんありがとうございます! 無いなら作りましょう、ということで RPM 作成方法です。 検証環境 Amazon Linux 2016.03 CentOS…

mackerel-agent-plugin の diff の出力結果を加工してデータを per sec にする

mackerel-plugin-mysql を例にすると、 $ ./mackerel-plugin-mysql | grep Com_ mysql.cmd.Com_insert 0.000000 1475200487 mysql.cmd.Com_select 6.000000 1475200487 mysql.cmd.Com_update 0.000000 1475200487 mysql.cmd.Com_update_multi 0.000000 14752…

ISUCON6 予選2日目2位通過しました

@hilotter さん、@Konboi と流れ弾として ISUCON6 予選2日目に参加して2位通過しました。 使用言語は Go で、私は足回りを整えて少しコードを書きました。 謝辞 運営の皆様ありがとうございました。 とても充実した時間を過ごすことができました。 やったこ…

WEB+DB PRESS Vol.94 で特集「実践スケーラブルAWS」を執筆しました & 恵贈御礼

本日 8/24 発売の WEB+DB PRESS Vol.94 で、 特集1「[鍵は監視にあり!]実践スケーラブルAWS 規模に適した設計,負荷に応じた増減,障害への自動対応」 の第3章から5章を執筆しました。 gihyo.jp 謝辞 株式会社技術評論社 WEB+DB PRESS編集部様からご恵贈…

HAProxy の external-check で Read Replica から Master に昇格した Amazon Aurora に接続できないようにする

追記 2016/07/22 19:06 error: 'Lost connection to MySQL server at 'reading initial communication packet', system error: 0' というエラーがでて接続できなくなる現象が発生するようなので、改良が必要なようです。 エラーの検証をしようとしたら再現で…

Amazon Linux で certbot(letsencrypt) を使って SSL 証明書を取得する

※2016年5月16日現在の情報です。 バージョンが変わると動作しなくなる可能性があります。 letsencrypt のクライアントが certbot に改名したようです (See: https://github.com/certbot/certbot)。 Amazon Linux 上で certbot-auto(letsencrypt-auto) を使っ…

Github Webhook を受けて任意のスクリプトを実行するツール

ghooks-cmd-runner という、 Github の Webhook を受けて任意のスクリプトを実行する Go 製のツールを書きました。 Installation https://github.com/tkuchiki/ghooks-cmd-runner/releases にバイナリがあるので、ダウンロードして解答してください。 Usage …

時刻文字列をいい感じに parse する Go の package

parsetime という時刻文字列をいい感じに parse する Go のライブラリを書きました。 Example 使用例です。 package main import ( "fmt" "github.com/tkuchiki/parsetime" "log" ) func main() { p, err := parsetime.NewParseTime() if err != nil { log.F…

php-build が libphp[57].so を上書きしないようになりました

php-build が libphp5.so を上書きしないようにするパッチ で、 php-build が libphp5.so を上書きしてしまう問題を紹介しました。 2015-12-11 に Remove hard-patch code for APXS handling #353 が merge され、 libphp5.so(PHP 7 は libphp7.so なので、…

jq で JSON を LTSV に変換する

結論 [ {"foo": "bar1", "hoge": "piyo1"}, {"foo": "bar2", "hoge": "piyo2"}, {"foo": "bar3", "hoge": "piyo3"} ] という json(test.json とする) があるときに、 $ cat test.json | jq -r '.[] | to_entries | map("\(.key):\(.value)") | join("\t")' …

fluentd の out forward の secondary を S3 にして信頼性を向上する

オートスケールするサーバ(web、アプリ)に立てている fluentd(以下、sender) から、 ログ集約用の fluentd(以下、aggregator) にデータを送るとき、 aggregator がデータを受け付けられないと sender で buffer すると思います。 この状態でスケールイン(デ…

プロセスのメモリ使用量とCPU使用率などが取れる mackerel-plugin-linux-proc-stats をリリースしました

プロセスのメモリ使用量と CPU 使用率などのメトリクスが取れる、 mackerel-plugin-linux-proc-stats をリリースしました。 Installation https://github.com/tkuchiki/mackerel-plugin-linux-proc-stats/releases からバイナリをダウンロードして解凍してく…

IAM の Switch Role を捗らせる

AWS のクロスアカウントアクセスを利用すると、 IAM ユーザを AWS アカウントごとに作成しなくても良くなり管理が容易になるのですが、 Switch Role する アカウントが多いと、履歴が 5 件しかないのでアカウントとロールを再入力しなくてはならないことが増…

setusergroups の RPM spec ファイル

setusergroups については、作者の tokuhirom さんのブログを御覧ください。 supplementary groups をサポートする setuidgid であるところの setusergroups.c 書いた supplementary groups をサポートした setuidgid が欲しいケースがある。 これを相談され…

norikra-listener-zabbix 0.2.0 をリリースしました

norikra-listener-zabbix (rubygems) 0.2.0 をリリースしました。 変更点 group の記述を変更 port を廃止し、ZABBIX_SERVER:[PORT] と記述するようになりました。 -- group ZABBIX(localhost:10051, zabbix host) のように記述します。 IPv6 サポート IPv6 …

Norikra の集計結果を直接 Zabbix に送る norikra-listener-zabbix をリリースしました

追記(2016/02/08 15:30):0.2.0 で group の記述方式を変更しましたので、 norikra-listener-zabbix 0.2.0 をリリースしました をご確認ください。 Norikra から直接 Zabbix にデータを送る norikra-listener-zabbix (rubygems) をリリースしました。 Zabbix…

Consul Multiple Datacenters 検証結果 +α

この記事は、HashiCorp Advent Calendar 2015 17日目の記事です。 検証環境の Consul は、 $ consul --version Consul v0.6.0 Consul Protocol: 3 (Understands back to: 1) です。 検証環境は v0.6.0 ですが、v0.6.0 に依存した話しはほとんどないと思いま…

mackerel-plugin-rack-stats を例にした mackerel agent plugin の作り方

この記事は、Mackerel Advent Calendar 2015 16日目の記事です。 mackerel-agent-plugins には様々な plugin がありますが、無い場合は自作する必要がありますよね。 ということで、mackerel-plugin-rack-stats を例に mackerel agent plugin の作り方を紹介…

Mackerel のホスト名を ssh の補完候補リストに出力する

この記事は、Mackerel Advent Calendar 2015 8日目の記事です。 Mackerel に登録しているホストに ssh するとき、 補完できたら楽かもしれないと思い、その実現方法を模索してみました。 補完機能を一から書くのは大変なので、 bash-completion を使います。…

mackerel-agent を root 以外で動かす

執筆時の mackerel-agent の version は、 mackerel-agent version 0.25.0 (rev 0ce0115) [linux 386 go1.4.2] です。 RHEL 系の Linux で mackerel-agent を root 以外で動かす方法です。 mackerel-agent を動かすユーザは mackerel とします。 設定 以下の…

Deploy ツール Stretcher で Rollback する

Stretcher を使うと、Consul と連携して、所謂 Pull 型の Deploy ができるようになります。 Consul と連携させる場合は、 $ consul event -name deploy s3://xxx-stretcher-files/deploy-20151112-193139.yml のように、consul event で Manifest の path を…

AWS Lambda のスケジュールイベントで定期的に RDS の Snapshot を作成する

AWS Lambda でスケジュールイベントの設定ができるようになりました。 Amazon Web Services ブログ: 【AWS発表】AWS Lambdaのアップデート – Python, VPC, 実行時間の延長, スケジュールなど http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/getting-sta…

Nginx で query string を見て動的にファイルを配信する

server { listen 80; server_name localhost; rewrite_log on; error_log /var/log/nginx/rewrite.log notice; location ~ ^/weather+\.json { rewrite ^ /weather/$arg_date.json; } location ~ ^/weather/.*\.json { default_type application/json; root …

application で認証した後に nginx で static file を配信する

application で認証している場合のみファイルをダウンロードさせたい場合があると思いますが、 そんなときの設定例です。 以下に簡単に試す方法を記載しています。tkuchiki/nginx-direct-data-transfer-sample · GitHub例では Basic 認証ですが、実際はちゃ…

Bats を使って Travis CI で bash(シェルスクリプト) のCI を回す

Bats で bash のテストを書く - tkuchikiの日記 の続きです。bash のテストができるようになると CI を回したくなりますよね。 ということで、Travis CI でテストを回すまでの方法を説明します。https://github.com/tkuchiki/bats-travis-ci にすべてのコー…

Bats で bash(シェルスクリプト) のテストを書く

※記事を書いて公開するまで1年くらい経っているので情報が古い可能性があります。Bats(Bash Automated Testing System)は、bash のテスティングフレームワークです。sstephenson/bats · GitHubTest Kitchen(Bussser) の Bats plugin で使うことができるので…

linux で TZ の offset を出力する

date +%z を使います。 $ TZ=UTC date +%z +0000 $ TZ=Asia/Tokyo date +%z +0900 $ TZ=EST date +%z -0500 全ての TZ と offset を出力する場合は、以下のシェルスクリプトを実行します。 実行結果 $ ./tz.sh EST5EDT -0500 MST7MDT -0700 Portugal +0000 J…

HAPrxoy 1.6.0 で導入された DNS の動的名前解決の検証結果

追記(2016-07-13 16:40) Changelog に書いてあるとおり(BUG/MEDIUM: dns: unbreak DNS resolver after header fix)、 動的名前解決ができないバグが修正されました。 HAProxy 1.6.6 で動的名前解決できないバグが修正されていました(Changelog にも書いてい…

zabbix の LLD で gearmand の job を動的に監視する

検証した環境の zabbix のバージョンは、2.0.15 です。 gearmand の監視を zabbix で行う際、 job の数がアプリケーションによって違うと思いますので、 テンプレートを作っても汎用的に使うことができません。 こういうケースで使えるのが LLD(ローレベルデ…

/etc/shadow の hash を生成するコマンドを作りました

perl, php, python の標準モジュールで /etc/shadow の hash を生成する方法 - tkuchikiの日記 で、/etc/shadow の hash を生成する方法を書きましたが、 どの環境でも同じ方法で出来たら楽だと思いましたので、 https://github.com/tkuchiki/encrypt-pw を…

AWS に SSL 証明書をアップロードしたりするコマンドを作りました

aws iam list-server-certificates aws iam upload-server-certificate aws iam update-server-certificate aws iam delete-server-certificate 相当の処理を行う、 https://github.com/tkuchiki/iam-server-cert を作りました。 実行例は、github の README…

golang の spec ファイル

執筆時の go の最新安定版は1.5.1 です。 rpm をインストールすると、 /usr/local/go /usr/bin/go (/usr/local/go/bin/go の symlink) /usr/bin/gofmt (/usr/local/go/bin/gofmt の symlink) /usr/bin/godoc (/usr/local/go/bin/godoc の symlink) をインス…

gaurun の spec ファイル

github.com の spec ファイルを書きました。 rpm をインストールすると、 /usr/bin/gaurun /usr/bin/gaurun_recover をインストールできます。 golang を rpm で入れていない場合は、BuildRequires: golang を削除してください。 v0.4.0 の時点では gopkg.in…

tcpstat の RPM 作成手順

tcpstat は、 UCP/TCP トラフィックの統計情報を出力するコマンドです。 tcpstat -i eth0 -f "dst port 3306" -o "%S %B\n" のように実行すると、eth0 からの port 3306 への outboud traffic(bytes) を出力することができます。 -f のフィルタは、ヘルプに…

LTSV 形式の Web サーバのアクセスログを集計するツールを作りました

LTSV 形式の Web サーバのアクセスログを集計する、 tkuchiki/alp · GitHub を作成しました。 Install https://github.com/tkuchiki/alp/releases から各 OS 用のバイナリを取得できます。 Linux 以外では動作確認していませんが、おそらく動作すると思いま…

sift の spec ファイル

Twitter の TL を眺めていたら、ag より早い sift というものがあるということでしたので、 spec ファイルを書いてみました。 About | sift - a fast and powerful open source alternative to grep ちなみに、Go 製なので普通に使うだけなら tar.gz 落とし…

ISUCON4 予選アプリ(Ruby)を Ubuntu で動かせるようにセットアップするスクリプト

Ubuntu14.04 用のスクリプトです。 GCP の Ubuntu 14.04 で動かした時は、 少し足りない package があって途中で修正して実行しなおしたので、 まっさらな状態から通ることは確認していませんがおそらく動くと思います。 Ruby をインストールしている部分と …

YAPC::Asia TOKYO 2015 で発表してきました

YAPC::Asia TOKYO 2015 に前夜祭から参加してきました。 謝辞 トークを採用してくださった YAPC::Asia Tokyo 2015 実行委員会・運営の皆様、 足を運んでくださった皆様に厚くお礼申し上げます。 発表内容 ソーシャルゲームにおける AWS 移行事例 - YAPC::Asi…

検証用に 1 台のサーバで consul を複数起動する

consul cluster の検証用にサーバを何台も立ち上げるのは面倒ですよね? ということで、1台でなんとかできないかなと思い試してみました。 data_dir 作成 server 3 台、node 1 台を立ちあげられるように、4 つディレクトリを作成します。 $ mkdir -p /var/li…

ステータスが cancelled の状態で動いている Spot Instance を terminate する

Jenkins EC2 Plugin を使っていたら、 ステータスが cancelled なのに動いたままのインスタンスがありました。 今まで cancelled になっていたら terminate されていたので、 cancel = terminate だと思っていたのですが、それは間違いなようです。 詳細は、…

Golang で filepath.Abs に ~(ホームディレクトリ) を指定した時にカレントワーキングディレクトリが先頭についてしまう

検証した環境は以下のとおりです。 $ go version go version go1.4.2 linux/amd64 $ whoami tkuchiki $ touch ~/testfile $ cd /tmp した状態で、 // main.go package main import ( "fmt" "path/filepath" ) func main() { abspath, _ := filepath.Abs("~/t…

ログインユーザ名を取得する

su コマンドで root になった場合などで、 ログインしたときのユーザ名を取得する方法です。 結論から書くと、logname(1) を使えば良いです。 $ ssh ec2-user@ec2-host $ whoami ec2-user $ sudo su - $ whoami root $ logname ec2-user Amazon Linux, CentO…

2015年うるう秒の検証方法と検証結果 (Amazon Linux, CentOS)

日本時間 2015/07/01 08:59:59 から 09:00:00 の間にうるう秒が挿入されます。 検証手順と、どのように対応すれば良さそうか検証した結果をまとめます。 情報は、すべて執筆時(2015/06/18)のものです。検証環境は Amazon Linux 2015.03、Timezone は Asia/To…

指定ディレクトリ以下の git の remote url 一覧を出力する

環境移行用に書いたワンライナーです。実行すると以下のような出力になります。 git clone git@github.com:path/to/repo git clone https://github.com/path/to/repo2 ...あとは、移行後の環境でこれを実行すると、git clone をしてくれます。 注意 git -C …

awscli の profile 名を補完できるようにする patch

aws-cli/1.7.29 用の patch です。Command Completion - AWS Command Line Interface を参考にコマンドを実行すると、 aws コマンドの補完ができるようになります。Configuring the AWS Command Line Interface - AWS Command Line Interface にあるように、…

nginx の location に deny all; と return 200; を書くと return が優先される

server { listen 80 default_server; server_name _; error_page 403 = @403_page; location / { deny all; return 200 "OK"; } location @403_page { return 403 "Forbidden"; } } と書いた時、403 Forbidden が返ってくるかと思っていましたが、 200 OK が…

nginx の HttpGeoModule を使って、特定 ip からのアクセス以外は 503 を返すのを簡潔に書く

特定の ip からのアクセス以外は 503 を返す例です。 nginxで特定ホスト以外からのアクセスをメンテナンス画面にする方法 (2) - (ひ)メモ を参考にさせていただきました。 ありがとうございます。以下が設定です。 geo $geo { default 1; 127.0.0.1 0; } ser…