くりにっき

フルスタックキュアエンジニアです

キャンペーンではてなTシャツをもらいました

はてなブックマーク & はてなブログをアプリで使いこなして、はてなTシャツをもらおう! - はてなブックマーク開発ブログ のキャンペーンに参加してはてなのTシャツをもらいました!

はてなさんからTシャツもらいました!

キャンペーン参加した時のエントリはこちら

sue445.hatenablog.com

Tシャツの会社 の関連エントリを書いてはてなTシャツをもらうなんてネタにもほどがあるw

はてなとspicelifeには足を向けて眠れないです

ブコメレス

id:kasumi19732004

キャンペーンではなくキェンペーンに応募したのですね

タイトルtypoしてたので修正 ('A`)

懇親会でピザとビールの発注量を計算するツールを作った

そういうツールを作りました(開発期間2日くらい)

Pizza Beer計算機

https://sue445.github.io/pizza-beer/ hatebu

f:id:sue445:20160708013451p:plain

モチベーション

この手のツールとしては Party が有名で便利なのですが、ピザの単価が安すぎて *1個人的に直したいと思いがありました。

かといって修正してPullRequestを送ろうにもどこに送ればいいか分からない(そもそもOSSなのか?)というのもあって Mithril の勉強も兼ねて自分で作りました

リポジトリ

github.com

masterブランチの代わりにgh-pagesブランチを使うことで、修正したものが即サイトに反映されるようにしています。デプロイいらずで便利

Partyと比べてのPizza Beer計算機のメリット

  • 計算時にサーバにPOSTしない
    • フォーム入力時に自動計算されて表示される(サーバへの通信無し)
  • ピザやビールの単価を調整できる
  • 1人辺りのビールの本数も調整できる(例:1人ビール1.5本とか)
  • スマホ対応

便利だと思うので是非ご利用ください

*1:Lサイズ1枚2500円だと選択肢がほとんどない。。。

golangのバイナリを雑にクロスコンパイルしたかった

zatsu_monitorを作った時の副産物です

sue445.hatenablog.com

やりたかったこと

  • golangのクロスコンパイルを楽にやりたかった
  • ビルドしたバイナリはzipで圧縮しつつ、zipのファイル名にosやarchもつけたかった
    • 例)zatsu_monitor_unix_amd64.zip
    • バージョン名もつくとベスト
    • zipをそのままリポジトリreleases にアップロードしたかった
  • ただしバイナリにはosやarchは つけたくなかった
    • 例)zatsu_monitor
    • 好みの問題だと思うのですが、バイナリにosなどがつくとプロビジョニングツールで削るのが面倒なので
      • プロビジョニングツールではunzipして出てきたファイルをポン置きするだけにしたかった

gox が一番理想に近かったのですが、バイナリにosやarchがつくのが嫌だったので自分でビルドスクリプトを書きました

ビルドスクリプト

https://github.com/sue445/zatsu_monitor/blob/0.2.0/build.sh

できること

  • 各OS, archごとに<バイナリ名>_<バージョン>_<os>_<arch>.zipの形式のzipファイルを作成
  • zipを解凍したらosやarchはつかないバイナリが出てくる
  • バージョンでtagを生成してpushする

使い方

Macの場合は gnu-sed をインストール

Macでデフォルトで入ってるBSD版のsedだと正規表現が使えなくて機能が貧弱なので gru-sedをインストールしてください

brew install gnu-sed

version.go にバージョン情報を記載

package main

const VERSION = "0.1.0"

build.shを適宜変更

readonly DIST_DIR="dist"
readonly BIN_NAME="zatsu_monitor"
  • DIST_DIR : バイナリの出力先
  • BIN_NAME : バイナリ名

実行

distディレクトリに出力するので予め作っておいてください。(あと .gitignore への登録も)

$ ./build.sh
Write: dist/zatsu_monitor_0.1.0_darwin_amd64.zip
Write: dist/zatsu_monitor_0.1.0_linux_amd64.zip
Write: dist/zatsu_monitor_0.1.0_linux_arm.zip

zipの中身

$ unzip -l dist/zatsu_monitor_0.1.0_linux_amd64.zip
Archive:  dist/zatsu_monitor_0.1.0_linux_amd64.zip
  Length     Date   Time    Name
 --------    ----   ----    ----
 11623512  07-06-16 23:23   zatsu_monitor
 --------                   -------
 11623512                   1 file

./build sh release のように実行すると自動的にバージョンのtagを生成してリポジトリにpushまでします

50行くらいのスクリプトなので詳しくはソースを読んでください

ライセンスとか

zatsu_monitor同様MITなので煮るなり焼くなりしてください( ◜◡◝ )

【今月のgem】kiriban_getterというキリ番チェックをするためのgemを作った

社内LT大会ネタで作ったやつ(第2弾)

モチベーション

キリ番には夢がある(断言)

github.com

使い方

refinementsを使っているので

using KiribanGetter

したところでのみ下記のメソッドが使えるようになります

kiriban?

100.kiriban?
#=> true

101.kiriban?
#=> false

111.kiriban?
#=> true

zorome?

111.zorome?
#=> true

2222.zorome?
#=> true

2223.zorome?
#=> false

kuraiban?

100.kuraiban?
#=> true

101.kuraiban?
#=> false

111.kuraiban?
#=> false

余談

  • 「最上位以外の数字が全部0」という数字の名前を調べるのが一番難しかった(いろいろググったら「位番」がしっくり来たので採用)

その他

  • kuraiban? , zorome? ともに何種類か作ってベンチマークとって速いやつを採用
    • Stringや正規表現での判定は整数演算の1.5〜2倍くらい遅いという学び
    • ただしString#lengthはチョッパヤ
  • Rubyでアクセスカウンターを作る時にご利用ください

kiribanとの違い

最初kiribanって名前のgemを作ってpushしようとしたら下記の同名gemがあったので名前を変えてリリースしました(つらい)

secret-garden.hatenablog.com

github.com

  • kiribanはRubyのコアクラス(ObjectやString)をオープンクラスしてメソッドを直接生やしているが、kiriban_getterはrefinementsを使ってるので影響範囲は using KiribanGetter したところのみ
  • kiribanの方が対応してるキリ番は多い
  • kiribanは文字列に変換できるオブジェクトなら AAA のようなやつでもチェックできるが、kirban_getterは Integer のみチェック

ベンチマーク結果

ベンチマークをとったらkiriban_getterの方が速かったです

$ bundle exec ruby benchmark/kiriban_getter.rb
Warming up --------------------------------------
    digit_1 (legacy)    72.272k i/100ms
    digit_2 (v0.1.0)    78.053k i/100ms
Calculating -------------------------------------
    digit_1 (legacy)      1.229M (± 3.0%) i/s -      6.215M in   5.060381s
    digit_2 (v0.1.0)      1.315M (± 4.3%) i/s -      6.635M in   5.057391s

Comparison:
    digit_2 (v0.1.0):  1314506.8 i/s
    digit_1 (legacy):  1229392.4 i/s - same-ish: difference falls within error

Warming up --------------------------------------
kuraiban_1? (legacy)    42.554k i/100ms
kuraiban_2? (v0.1.0)    65.051k i/100ms
zeroban? (kiriban gem)
                         9.175k i/100ms
Calculating -------------------------------------
kuraiban_1? (legacy)    598.862k (± 4.7%) i/s -      3.021M in   5.058023s
kuraiban_2? (v0.1.0)      1.010M (± 2.9%) i/s -      5.074M in   5.027767s
zeroban? (kiriban gem)
                        100.042k (± 5.0%) i/s -    504.625k in   5.057287s

Comparison:
kuraiban_2? (v0.1.0):  1010089.6 i/s
kuraiban_1? (legacy):   598862.0 i/s - 1.69x slower
zeroban? (kiriban gem):   100042.3 i/s - 10.10x slower

Warming up --------------------------------------
  zorome_1? (legacy)    10.264k i/100ms
  zorome_2? (v0.1.0)    25.113k i/100ms
zoroban? (kiriban gem)
                         7.585k i/100ms
Calculating -------------------------------------
  zorome_1? (legacy)    122.994k (± 4.9%) i/s -    615.840k in   5.019815s
  zorome_2? (v0.1.0)    329.715k (± 4.7%) i/s -      1.657M in   5.039460s
zoroban? (kiriban gem)
                         90.235k (± 3.8%) i/s -    455.100k in   5.050971s

Comparison:
  zorome_2? (v0.1.0):   329715.0 i/s
  zorome_1? (legacy):   122994.0 i/s - 2.68x slower
zoroban? (kiriban gem):    90235.3 i/s - 3.65x slower

教訓

  • gemを作る時は https://rubygems.org/ で事前にチェックしよう
  • 空いてたら名前を取られないようにbetaでもいいからリリースすべき

zatsu_monitorという雑な監視ツールを作った

社内LT大会ネタで作ったやつ(第1弾)

モチベーション

  • 社内外で公開してる個人アプリをURL監視したかった
    • 社内だとOpenStack、社外だとHerokuに計10個くらい?
    • HerokuにもRollBar *1 はあるんだけど、たまにDyno(インスタンス)の起動でこけるのは検知できない *2
  • Mackerelだと社内ツール*3 が監視できない

無いなら作ろう

github.com

使い方

雑にyamlを書いて

# zatsu_monitor.yml
google:
  type: slack
  check_url: "https://www.google.com/"
  api_token: "AAAAAAAA"
  channel: "#general"
  user_name: "zatsu_monitor"
github:
  type: chatwork
  check_url: "https://github.com/"
  api_token: "AAAAAAAA"
  room_id: "111111"

雑に実行

/path/to/zatsu_monitor -config /path/to/zatsu_monitor.yml -data /path/to/data_dir
  • -config : 設定ファイルの場所
  • -data : 直前のhttpステータスを保存するキャッシュディレクト

ステータスが変わった時だけ投稿

f:id:sue445:20160625204655p:plain

  • ホストが解決できなかった時とかは便宜上ステータス0です

仕様

yamlなので値を継承できるのが嬉しい

トークンなどを1ヶ所に定義して、監視したいサイトで継承することができます

slack: &common
  type: slack
  channel: "#general"
  api_token: "xoxp-0000000000-0000000000-0000000000-000000"

github:
  # inherit common values
  <<: *common

  # override common values
  check_url: "https://github.com/"
  chennel: "#github"

google:
  <<: *common
  check_url: "https://www.google.com/"
  chennel: "#google"

*1:アプリ内のエラーを監視するプラグイン https://rollbar.com/

*2:ログ見ても「app crashed」しか出てないので原因不明

*3:社内からしかアクセスできないアプリ

GitHubでLICENSEや.gitignoreを後から手軽に追加する方法

tl;dr

GitHub上からファイル作成でOK

前置き

GitHubリポジトリを作った直後はREADMEやLICENCEを作成するリンクが出ていて、いい感じにテンプレートを選択することができます

f:id:sue445:20160623233524p:plain

f:id:sue445:20160623233753p:plain

ただ、一度ファイルをリポジトリにコミットしてしまうとこのリンクが出なくなってしまいます

f:id:sue445:20160623234133p:plain

LICENSEを最初に作り忘れて後から追加したいってことが自分の場合よくあるので、お手軽に作る方法を偶然発見したので書きます

やり方

トップで Create new file をクリックした後に

f:id:sue445:20160623234410p:plain

ファイル名を入力するだけです。LICENSEや .gitignore ってファイル名を入力した瞬間テンプレート選択のプルダウン出てきます

f:id:sue445:20160623235336g:plain

f:id:sue445:20160623235116g:plain

てっきり今まで新しくリポジトリ作った直後にしかテンプレートから作成できないと思ってたよ、、、

僕がよく使っているalias

はてなブックマークで気になったニュース

を読んで僕がよく使ってるaliasを調べてみました

~/.bash_historyからよく使われるコマンドを集計

$ cat ~/.bash_history | grep -e "^[^#]" | awk '{ print $1 }' | sort | uniq -c | sort -r
208 g
99 t
41 be
29 cd
26 wget
14 gs
13 ag

多い順に出しました。

grep -e "^[^#]" で先頭の # を除外してるのは HISTTIMEFORMAT でコマンドの実行時刻を記録しているためです ref. http://qiita.com/kawaz/items/92457e3d1664383b18bc

  • g
    • git
  • t
    • tig
  • be
    • bundle exec
  • gs
    • git status -sb

https://github.com/sue445/dotfiles

gコマンドのみで集計

gが圧倒的に多かったのでサブコマンドでも集計しました

$ cat ~/.bash_history | grep -e "^g " | awk '{ print $1, $2 }' | sort | uniq -c | sort -r
42 g n
41 g co
28 g push
17 g ci
17 g br
15 g di
10 g fm
7 g ca
6 g sy
  • g n
    • git now --all --stat
    • tmpコミットを作る時によく使います。コミットメッセージは下記のようになります
commit 3ead7875c942d057f6918807210305b717f61403
Author: sue445 <sue445@example.com>
Date: Thu Jun 16 15:18:26 2016 +0900
[from now] 2016/06/16 15:18:26
app/controllers/application_controller.rb | 3 +++
1 file changed, 3 insertions(+)

追伸

このエントリは はてなブックマーク & はてなブログをアプリで使いこなして、はてなTシャツをもらおう! - はてなブックマーク開発ブログ の応募レギュレーションの関係でコマンド実行以外は全部iPhoneで書いています。フリックでmarkdownはきつい、、、