動かざることバグの如し

近づきたいよ 君の理想に

ターミナルに雨雲画像を表示してくれるコマンドameshが便利

これは便利(確信

これから雨が降るのか、今降ってる雨がどれくらい長引くのか確認したい時がある。 かといってわざわざ雨雲ググるのも面倒なときはotiai10/ameshが最強

f:id:thr3a:20180813213336p:plain

快晴でスクショが全く映えない (´・ω・`)

ターミナルでameshを叩くだけで表示される。

インストール

goが動かせる環境が必要

go get github.com/otiai10/amesh/amesh

公式ドキュメントに載ってるがDocker版も用意されてて草

実行

amesh

おわり

元ネタ

Pythonで2つの日付からdate rangeを取得する

環境

やりたいこと

2つの日付からfor文で日付を回したい場合

rubyでいう

require 'date'
(Date.parse('2017-12-01')..Date.parse('2018-1-31')).each do |date|
  puts date.strftime("%F")
end

的なのをやりたい

コード

from datetime import date, timedelta
d1 = date(2017,12,1)
d2 = date(2018,1,31)

for i in range((d2 - d1).days + 1):
    date = d1 + timedelta(i)
    print(date.strftime("%F %R"))

以下のようにちゃんと日付が連続して出力される

2017-12-01 00:00
2017-12-02 00:00
2017-12-03 00:00
2017-12-04 00:00
2017-12-05 00:00
2017-12-06 00:00
2017-12-07 00:00
2017-12-08 00:00
2017-12-09 00:00
2017-12-10 00:00
2017-12-11 00:00
2017-12-12 00:00
2017-12-13 00:00
2017-12-14 00:00
2017-12-15 00:00
2017-12-16 00:00
2017-12-17 00:00
2017-12-18 00:00
2017-12-19 00:00
2017-12-20 00:00
2017-12-21 00:00
2017-12-22 00:00
2017-12-23 00:00
2017-12-24 00:00
2017-12-25 00:00
2017-12-26 00:00
2017-12-27 00:00
2017-12-28 00:00
2017-12-29 00:00
2017-12-30 00:00
2017-12-31 00:00
2018-01-01 00:00
2018-01-02 00:00
2018-01-03 00:00
2018-01-04 00:00
2018-01-05 00:00
2018-01-06 00:00
2018-01-07 00:00
2018-01-08 00:00
2018-01-09 00:00
2018-01-10 00:00
2018-01-11 00:00
2018-01-12 00:00
2018-01-13 00:00
2018-01-14 00:00
2018-01-15 00:00
2018-01-16 00:00
2018-01-17 00:00
2018-01-18 00:00
2018-01-19 00:00
2018-01-20 00:00
2018-01-21 00:00
2018-01-22 00:00
2018-01-23 00:00
2018-01-24 00:00
2018-01-25 00:00
2018-01-26 00:00
2018-01-27 00:00
2018-01-28 00:00
2018-01-29 00:00
2018-01-30 00:00
2018-01-31 00:00

変数汚したくない人向けにメソッド化したやつ

from datetime import date, timedelta

def daterange(date1, date2):
    for n in range(int ((date2 - date1).days)+1):
        yield date1 + timedelta(n)

start_date = date(2017,12,1)
end_date = date(2018,1,31)
for dt in daterange(start_date, end_date):
    print(dt.strftime("%Y-%m-%d"))

rubyだと一発でかけるがPythonまだまだだな。。

参考リンク

MySQLで複数カラムのマージして出現回数をカウントしたい

やりたいこと

例えばdata1、data2、data3のカラムがあってそれぞれのカラムを合体して文字の出現回数を調べたい

テーブル

CREATE TABLE `hoge` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `data1` varchar(255) NOT NULL,
  `data2` varchar(255) NOT NULL,
  `data3` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4;

ダミーデータ

INSERT INTO `hoge` (`id`, `data1`, `data2`, `data3`)
VALUES
    (1, 'a', 'b', 'c'),
    (2, 'c', 'd', 'b'),
    (3, 'c', 'b', 'a'),
    (4, 'b', 'b', 'a'),
    (5, 'd', 'a', 'd');

SQL

select count(*) AS cnt, data1 from 
(select data1 from hoge
UNION ALL
select data2 from hoge
UNION ALL
select data3 from hoge
) AS tmp
group by data1 order by cnt desc

すると

cnt  data1
5   b
4   a
3   c
3   d

と取得できる

RailsでpumaのCPU使用率を取得する方法

環境

railsの負荷を計測するのは一筋縄ではいかず、一発でこうすれば取得できるってのはないのだが、なんとかして負荷度を計測したい。

ってときにtopコマンドでpumaのCPUの使用率を取得すると概算できることがわかったのでメモ

取得方法

top -bc -n 1 | grep $(cat /var/www/article_polls/shared/tmp/pids/puma.pid)| awk '{s += $9} END {print s}'

puma.pidのパスは各自変えて

ポイントは以下

  • CPU使用率の取得にpsコマンドを使ってはいけない 別にtopコマンド使わなくてもpsでええやんと思うかもしれない 実際自分もそう思っていたがだめ
  • topコマンドで -bcをつけると出力だけ行って終わる
  • topコマンドの$9の部分はOSによって若干変わる
  • こればっかりは仕方ないので実際に叩いてCPU使用率が記載されている列を数えるしかない 例では9列目
thr3a@rails:~$ top -bc -n 1 | grep $(cat /var/www/article_polls/shared/tmp/pids/puma.pid)
10797 thr3a     20   0  276996  75764   1940 S  0.0  7.5   5:56.77 puma 3.11.3 (unix:///var/www/article_polls/shared/tmp/sockets/puma.sock) [2018+
10801 thr3a     20   0  760276  93956      0 S  0.0  9.3  25:37.99 puma: cluster worker 0: 10797 [20180610031659]
17051 thr3a     20   0   14728   1120   1024 S  0.0  0.1   0:00.00 grep --color=auto 10797