下級エンジニアの綴

新しく発見したことを綴っていこうと思っています。夢はでっかく上級エンジニアになることです。

Wunderlistに設定しているタスクを毎日(平日限定)slackに通知する流れを作ってみた

slackにタスクを毎日通知してくれるいい感じのツールが見つからなかったので、自作してみました。

必要なもの

手順

※wunderlistにタスクが登録されている前提で進めていきます

node.jsのインストール
yum install epel-release
yum install nodejs npm
yum install gcc gcc-c++
wunderlineのインストール
npm install -g wunderline
rubyのインストール

下記サイトを参考にしてください(手抜きで大変申し訳ないですmm)

CentOS に Ruby をインストールする - kzy52's blog

実際のコード
#!/usr/bin/env ruby
require 'slack'
require 'json'

### confの内容
※confは下記のように定義しています
######################################
slack_token,slack_token
wunderlist_token,wunderlist_token
client_id,client_id
channel,channel
wunder_list_url,wunder_list_url
######################################

- slack_token          # slackに通知するためのtoken
- wunderlist_token     # wunderlistに通知するためのtoken
- client_id            # wunderlistのclient_id
- channel               # 通知したいslackのチャンネル
- wunder_list_url      # wunderlistで叩きたいapiのURL


conf_file_path = '/home/[ユーザー名]/slack_bots/schedule_conf.txt' # cronを実行するユーザーがfile openするので絶対パスがおすすめ

### confの取得
datas = []
begin
  File.open(conf_file_path) do |file|
    file.each_line do |line|
      datas.push(line.chomp!)
    end
  end
end

### 取得したconfをhash化する
scheduler = {}
datas.each do |data|
  ary = data.split(',')
  scheduler[ary.first] = ary.last
end

### wunserlistからjson形式でパラメータを取得
result = `curl -H "X-Access-Token: #{scheduler["wunderlist_token"]}" -H "X-Client-ID: #{scheduler["client_id"]}" #{scheduler["wunderlist_url"]}`

result = JSON.parse(result)

### slackで表示するために整形
tasks = []
result.each do |r|
  tasks.push(r["title"])
end

task_list = tasks.join("\n")

Slack.configure do |config|
  config.token = scheduler["slack_token"]
end

line = "---------------------------\n"
text = case Time.now.hour
       when 11 then "#{line} today tasks confirm \n #{line} #{task_list}"
       else
         'Error!!'
       end

Slack.chat_postMessage(text: text, channel: scheduler["channel"], link_names: true, username: 'scheduler')
cronに登録
$ cat /home/[ユーザー名]/slack_bots/config/schedule.rb
every '30 23 * * 1-5' do
  command '/home/[ユーザー名]/slack_bots/time_signal.rb'
end

$ bundle exec whenever --update-crontab

結果

出来たー!! 表示のさせかたはもう少し修正が必要ですが、とりあえず欲しい物は作れました。

気になってるところ

  • とりあえず動けば良い程度のコードになっているので、もっときれいに書き直したいですね。(curlを叩くところとか)
  • WunderlistのAPIを叩くためのtokenの発行の仕方が結構わかりにくかったので、もしかするとそこで結構詰まるかもしれないです・・・

参考リンク

タスク管理ツール WunderlistのAPIで遊んでみた - Qiita

Wunderlist をコマンドラインから操作する Wunderline - WebDelog

10分コーディング! Rubyでつくる Slack時報 | Money Forward Engineers' Blog

linuxのfind -mtimeの挙動で失敗したのでメモ

今回はlinuxのfindコマンドのmtimeオプションで失敗したのでメモするために書きました。

今回失敗したこととしては、ファイルの削除cronを回しているときにfindコマンドを使って-mtimeオプションで時間を指定して削除処理をおこなっていました。 しかし、消しては行けないフォルダまで消してしまったので色んな問題が発生しました。

本題

  • これが初期状態です。
[vagrant@localhost test]$ ll -a memo/
total 8
drwxrwxr-x 2 vagrant vagrant 4096 Feb  2  2002 .
drwxrwxr-x 3 vagrant vagrant 4096 Jan 14 18:50 ..
-rw-rw-r-- 1 vagrant vagrant    0 Jan 14 18:45 aaaa.txt
-rw-rw-r-- 1 vagrant vagrant    0 Jan 14 18:45 bbb.txt
  • 削除処理を実行
[vagrant@localhost test]$ find memo/ -mtime -1 | xargs rm -rf
  • 削除結果
[vagrant@localhost test]$ ls -a memo/
.  ..

ここまでは想定通りの結果だったので問題なかったのですが、問題は次の処理になります。

[vagrant@localhost test]$ ls -a memo/
.  ..
[vagrant@localhost test]$ ll -a
total 12
drwxrwxr-x  3 vagrant vagrant 4096 Jan 14 19:05 .
drwx------. 5 vagrant vagrant 4096 Jan 14 18:50 ..
drwxrwxr-x  2 vagrant vagrant 4096 Feb  2  2002 memo
  • memoフォルダが空になっている状態で下記の処理を実行すると
[vagrant@localhost test]$ find memo/ -mtime -1 | xargs rm -rf
[vagrant@localhost test]$ ll -a
total 8
drwxrwxr-x  2 vagrant vagrant 4096 Jan 14 19:01 .
drwx------. 5 vagrant vagrant 4096 Jan 14 18:50 ..

なんと!!! memoフォルダまで消えてしまいました・・・・orz

補足

補足ですが上記のケースを回避するには

フォルダを指定するときに*を指定してやれば・・・

[vagrant@localhost test]$ find memo/* -mtime -1 | xargs rm -rf
find: `memo/*': No such file or directory
[vagrant@localhost test]$ ll -a
total 12
drwxrwxr-x  3 vagrant vagrant 4096 Jan 14 19:05 .
drwx------. 5 vagrant vagrant 4096 Jan 14 18:50 ..
drwxrwxr-x  2 vagrant vagrant 4096 Feb  2  2002 memo

この通りフォルダは削除されずに済みます!

いやー、知らない事がいっぱいあると再度実感したました。

resqueのworkerがoverviewで表示されるのにサーバ側ではプロセスが存在しないから調べてみた

resqueのoverviewでよく分からないworkerが存在していたので、killしようと奮闘していた話です。 ドキュメント残すついでに書いてみました。

発見時

f:id:yanterakun:20160710155256p:plain

サーバでプロセスを確認

ps aux | grep resque

f:id:yanterakun:20160710154420p:plain

おらんやん!!

なんやこのプロセス・・・・

調べてもよく分からなかったので、友人に相談・・・

「redisにkey残ってるだけじゃね?」と言われたので、

redisの中を見てみると・・・・!?

redis-cli
keys keys resque*

f:id:yanterakun:20160710162037p:plain

おったー!!!

結論

redisのkeyに残っており、それが表示されてたみたいです。

まだまだredisとresqueについての知識(ggr力も)がまだまだ足りてないなと反省しました。

教えてくれた友人に感謝してますmm

nginxのアップロードモジュールを使ってみた

大容量のファイルを扱うことがあったので、どうしようかなと調べているとnginxに便利なモジュールがあったので紹介します!!

入れてみて感じたメリット

細かいことはあまりわかっていませんが、1Gのメモリしか積んでいないマシンに1.5Gほどのファイルをアップロード出来たのでめっちゃ感動しました!!

インストール

mkdir /usr/local/src/nginx
mkdir /usr/local/src/nginx-upload-module/
git clone https://github.com/nginx/nginx.git usr/local/src/nginx
git clone -b 2.2 /usr/local/src/nginx-upload-module /usr/local/src/nginx-upload-module/
cd /usr/local/src/nginx
configure auto/configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf
make -j4
make install

大体こんな感じで導入できます(細かい設定は各々やってください(nginxのコマンドを作ったり等))

設定ファイル

location {{ item.path }} {
  upload_pass @rails;

  proxy_connect_timeout 500;
  proxy_send_timeout    500;
  proxy_read_timeout    500;

  client_max_body_size 2G;

  upload_pass_form_field ".*";
  upload_store /tmp/;
  upload_store_access user:rw group:rw all:rw;
  upload_resumable on;
  upload_set_form_field "$upload_field_name[filename]"   "$upload_file_name";
  upload_set_form_field "$upload_field_name[type]"       "$upload_content_type";
  upload_set_form_field "$upload_field_name[path]"   "$upload_tmp_path";
  upload_aggregate_form_field "$upload_field_name[md5]"  "$upload_file_md5";
  upload_aggregate_form_field "$upload_field_name[size]" "$upload_file_size";
  upload_max_file_size 2G;
}

導入時詰まったところ

アップロードモジュールのmasterは新しいnginxには対応してないみたいです。(全てのバージョンで確認はしていないので実際わかってないです。) 自分が入れたnginx/1.9.13では動かなかったです。しかしプルリクの2.2(アップロードモジュール)は動くみたいだったのでそれを使用すると上手く入れれました。

最後に

アップロードモジュールも結構古いので、将来的には動かなくなる可能性も高いので導入は自己責任でお願い致します。 個人的にはLuaとか使ってアップロードモジュールみたいなのを作るのが安定なのかなと思っています。(好みですが)

nginx実践入門 (WEB+DB PRESS plus)

nginx実践入門 (WEB+DB PRESS plus)