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

ぶていのログでぶログ

思い出したが吉日

Re:dashの日付フォーマットをYYYY/MM/DDにする

最近、社内ツールとしてRe:dashを導入しました。 DBやTreasureDataなどへアクセスするツールとしてとても便利なツールです。 また、Dockerに対応したおかげで docker-compose up するだけで環境構築できるのもお手軽でいいですね!

で、実際に使ってみているのですが、日付フォーマットが DD/MM/YY になっていて分かりづらい!! どうにかして変更できないかなぁっと思っていたのですが変える方法見つけました!

User configuration for date/time format & default timezone · Issue #618 · getredash/redash

↑のissueにあるとおり REDASH_DATE_FORMAT を設定すればよいようです。 試しに、docker-compose.ymlに REDASH_DATE_FORMAT: "YYYY/MM/DD" を追加して再起動したところ期待通り反映されました! やったぜ

f:id:buty4649:20160803113725p:plain

Nginxの真偽値とmruby_setの戻り値について

ngx_mrubyを使ってNginxを制御するときに、 mruby_setif を使うことが多いと思います。

例えばiPhoneからのアクセスの場合のみ特定の処理をしたいとします。 その場合以下の様なコード(nginx.conf)になると思います。

mruby_set_code $is_iphone '
  hin = Nginx::Headers_in.new

  # 判定分が雑だけど例題なのでご容赦・・・
  /iPhone/ === hin['User-Agent']
';

if($is_iphone) {
  # iPhoneの時だけ行なう処理
}

User-AgentiPhoneという文字列が含まれていれば true を返し、そうでなければ falseを返却し、その結果を $is_iphone 変数に格納します。 そして、この変数が真の時だけ特定の処理を行います。

これは意図した動作を行なうのでしょうか?

一見問題なさそうに見えますが、 これは意図した動作をしません。 なぜなら、 iPhone以外のアクセスの時($is_iphoneがfalseの時)もif分の中の処理を実行してしまいます

これはなぜかというと、 ngx_mrubyが*1終値をStringに変換してNginxの変数に格納しているのです。 つまり $is_iphoneにはtrueまたはfalseという文字列が格納されています

Nginxにおける if は、空文字または0の場合は偽として処理されますが、それ以外は真として処理されます。

a variable name; false if the value of a variable is an empty string or “0”; http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#if

よって、意図した動作をさせるためにはif分を以下のように書き換えます。

if($is_iphone = ture) {
  # iPhoneの時だけ行なう処理
}

これで期待する動作を行うようになりました!

2016/08/01追記

id:matsumoto_r さんによって、Nginx::TRUENginx::FALSE という定数が追加されました!

この定数を使って、以下のように書きなおすことができ、if ディレクティブで特別意識する必要がなくなりました!

mruby_set_code $is_iphone '
  hin = Nginx::Headers_in.new
  /iPhone/ === hin['User-Agent'] ? Nginx::TRUE : Nginx::FALSE
';

if($is_iphone) {
  # iPhoneの時だけ行なう処理
}

*1:ngx_mrubyがやっているのだろうと思ってソースを読んだのですが確信はないです。。間違っているかも。。

CiscoのCatalyst2960G-8TC-Lを手に入れた

Ciscoファンレス、ギガ8ポートなスイッチがヤフオクで8000円で出ていたので2台ほどポチってしまった!

Ciscoといえば、知る人ぞ知るネッワーク機器の巨人! ビジネスとか会社ではよく使うけど、コンシューマが使うにはハードルが高い。 しかし、自宅サーバを運用していると、Ciscoの機器を使っているというと尊敬の眼差しを浴びることができる!(※個人の意見です)

今まで、Ciscoスイッチが欲しくてヤフオクとかを漁っていた。 しかし、業務用ということもあって、基本はラックマウントタイプだしファン付きであった。 しかし、データセンターで使うのを前提にしているせいか、結構轟音がする! そこで今までは、ファンレスでありながらもインテリジェントスイッチなバッファローBS-G2008MRを使っていたのであった。

今回手に入れたCatalyst2960G-8TC-Lは、なんとファンレス!! これで自宅で使っても騒音で悩まされることはない!! そして、慣れ親しんだCiscoコマンド! SFPポート(デュアルパーパス)付きなので、カッパーに飽きたらSFPモジュールを買ってきて光ケーブルにすることも可能!!!

なんて夢が広がりングなんだ!

Mackerel UG Meeting Vol.1を開催しました。

Mackerel User Group Meeting Vol.1 - connpass

Mackerel User Groupコアメンバーとして参加していて、今日はUG初のミーティングを行いました。 ご来場いただいた皆様ありがとうございました 🙇🏻

発表していただいた内容がどれも個性的で、Mackerelの使い方は無限大だなっと思いました! その中でも、まさか Get WildをMackerelで表現したのはさすがGet Wilderさんだと思いましたw

また定期的にミーティングを行いたいと思いますので何卒よろしくお願いします。 (私の資料は技術的な内容ではないので、Mackerel UGのブログにでも貼り付けます。Not めんどくさい)

貴様は今までにSlackで審議リアクションを付けられた数を覚えているのか?

A. 85


Slack APIでリアクションが取れることを知ったので実際にカウントしてみた。 最初 reactions.list で取ろうと思ったけど、これはリアクション した リストなので目的が達成できなかった。。

仕方ないので、 search.messages を使うことにした。 queryに has:reaction を付けるとリアクション付きのメッセージが検索できる。 APIのレスポンスに含まれる messages にはなぜか、reactions が含まれないので reactions.getに必要な情報を渡して、一覧を取る必要があった。

ここまで来て、ワンライナーでできないことがわかったのでrubyでシュッと作った。

github.com

実行すると↓みたいな感じになる。 長いので途中省略…

$ be ./summarize-reaction.rb
message total: 374
reaction total: 653

reactions
---------
eyes: 23
hai: 34
hachanhasiru: 1
hunya: 4
otsu: 3
clap::skin-tone-4: 1
bob: 1
interrobang: 1
muscle: 4
sabachi: 1
clapping: 2
innocent: 28
hachanhai: 2
usu: 2
hachansuman: 1
niceyoshimoto: 2
+1: 32
metal: 2
pray: 12
toilet: 3
closed_lock_with_key: 2
tada: 17
cina2: 1
shingi: 85
(snip)

追記: shingiが85でダントツトップであった。 次に多かったのがhaiで34。ダブルスコアを付けている。。

追記2: Slackのヘルプを見ていたら、 :shingi: の付けられたメッセージ数だけなら検索クエリに has::shingi: をつけてあげればいける気がしてきた。 ただ、これで取得できるのはメッセージ数だけなのでリアクション数を取るには一手間加える必要がありそうだ。 https://get.slack.help/hc/en-us/articles/202528808-Searching-in-Slack

AtCoder034のA,BとAtCoder038のA,B,Cを解いた

先週サボってしまったので社内で課題になっていたAtCoder034と、来週までの宿題のAtCoder038を解いた。

AtCoder034

特筆すべきところはなし。 Cはあとで…

AtCoder038

Aで入力に対して chomp を忘れてしまい何度かやり直した… Bは配列同士の集合積が取れるの一瞬で解けた。これを使わないとifを4回やることになるけど、まぁたぶんタイム的にも問題無い範囲で解けると思う。 Cは力押しで解いたけど例のごとくTLE。 もう少しアルゴリズムを捻ってみることにする…。

AtCoder035を解いた(その3)

buty4649.hatenablog.com

前回解けなかったAtCoder035のCを解き直した。

マスクビット列の生成を文字列 -> to_iしていて(("1" * n).to_i(2)) 遅かったので、Integerで作るようにした。 n個の連続した 1を作るには 2^(n-1)-1 すればいい。 前回よりも解ける範囲は増えたが、やはりTLEになってしまった。。

abc035.contest.atcoder.jp

そうしたら、前回の記事に

C問題、「いもす法」というヒントをコメントします...!

というヒントを頂いた。

いもす法 - いもす研 (imos laboratory)

今回の問題の場合、オセロを反転させる範囲を矩形関数として見ることができるので、そこに利用する。 これを使って解いたところ一発で通った!!

abc035.contest.atcoder.jp

野生のsuzupyありがたやぁ〜 🙇

↑で解けることがわかったので調子にのってAWKでも解いてみたw 解法がわかっていればAWKでも解けないことはないですね。

abc035.contest.atcoder.jp