-
概要 最近、CircleCI2.0ではtoriggerという機能でスケジュール実行ができるということを知った。 CircleCI公式ドキュメント まんまこちらの方の記事の通り。 Circle-CI 2.0のcron triggerを使って、定期実行をする 私が実現したかったのは、個人のアプリケーションでサーバーでcronで定期実行させてSlackに通知させているやつを、このtorrigerで実現できないかなと思ったことだった。 今までだとherokuとかのPaaSを使ったり、AWS Lambda、Google App Scriptとかを使うのがよくある方法だと思うのだけど、簡易的なバッチならCircleCIのみでいけないかな?と思い、やってみることにした。 CicleCIへのプロジェクト追加 まず、いつもどおりにCircleCIにログインして、「Add Project」からプロジェクトを追加する。※今回はすでに追加済みだが、tw4-html-parserというリポジトリを例にあげる。 次に「start building」しておく。 このままではCIはなにも実行されずにエラーになるので、下記をリポジトリに追加する。 追加先は、リポジトリ直下に .circleci/config.yml というのを作成して、runの部分に実行させたいコマンドを記載する。 --- version: 2 jobs: build: docker: - image: ruby:2.4 working_directory: ~/repo steps: - checkout - run: bundle install - run: bundle exec ruby htmlparser.rb workflows: version: 2 normal_workflow: jobs: - build schedule_workflow: triggers: - schedule: cron: "1 11 * * *" # UTCで記述。-9 filters: branches: only: - master jobs: - build ポイントはworkflowという箇所。
-
前回開発環境を作ってから、ちまちまといくつかのモジュールを試していた。 その中でも面白いのが静電容量式タッチセンサー。 指で触れるとセンサーが反応して、その出力でONOFFスイッチになるやつ。 今回は、タッチしたら青色LEDが光るシンプルなものを作った。 コードはこちら。 #!mruby led = 0 touch = 1 pinMode(led, 1) pinMode(touch, 0) loop do if digitalRead(1) == 1 digitalWrite(led, 0) delay(10) digitalWrite(led, 1) end end とってもシンプルになってる。 pinModeでピンアサインをLEDとタッチセンサーで決めて、digitalReadの値が1だったらdigitalWriteで青色LEDを光らせるというもの。 こんな感じで光る。 <p style=" margin:8px 0 0 0; padding:0 4px;"> <a href="https://www.instagram.com/p/BkAi6A_BWu0/" style=" color:#000; font-family:Arial,sans-serif; font-size:14px; font-style:normal; font-weight:normal; line-height:17px; text-decoration:none; word-wrap:break-word;" target="_blank">今日の進捗です。 静電容量式タッチセンサーと青色LED.</a> </p> <p style=" color:#c9c8cd; font-family:Arial,sans-serif; font-size:14px; line-height:17px; margin-bottom:0; margin-top:8px; overflow:hidden; padding:8px 0 7px; text-align:center; text-overflow:ellipsis; white-space:nowrap;"> <a href="https://www.GR-CITRUS Created
14 Jun 2018 -
みなさんはメールの送受信ってどうやってますか? 普通MacだったらMailなり、ThunderbirdなりのGUIアプリケーションを使用するかと思います。 しかし、インフラをやっているエンジニアだと、telnetなどでメールサーバーにつないで、接続確認を取ることがままあります。 しかし、メールサーバーへ接続するのにtelnetでつなぐと、認証情報をbase64エンコードしたりする場面が出てきます。 これが結構面倒だし、それに加えて手動だとコマンドミスなのかサーバー側の問題かを切り分けしやすいようスクリプト化したいなぁと思ってました。 シェルスクリプトで愚直にexpectも考えましたが、もう少しスマートでメンテナンスしやすいようにできないか調べてたところRubyのmailというgemが簡単そうということを知り、メールの送受信ができるようなスクリプトを作ってみました。 参考にしたサイト 参考にしたはのはこちらのサイトです。 メソッドの使い方などがどのサイトよりも丁寧に書かれていたので、このサイトに書いてあることを参考に下記スクリプトを書きました。 mailscript.rbファイル require 'yaml' require 'mail' require 'date' require 'socket' require 'thor' class EmailScript < Thor desc 'smtp','[Usage] ruby emailscript.rb smtp SMTPPORT MAILADDRESS ENVIRONMENT' def smtp(port, mailaddress, mailenv) pwinfo = YAML.load_file("mailenv.yaml") Mail.defaults do delivery_method :smtp, :address => pwinfo["#{mailenv}"]['hostaddress'], :domain => pwinfo["#{mailenv}"]['hostaddress'], :port => "#{port}", :authentication => :login, :user_name => pwinfo["#{mailenv}"]['user_name'], :password => pwinfo["#{mailenv}"]['password'] end todaydate = Time.now svrhostaddress = pwinfo["#{mailenv}"]['hostaddress'] begin Mail.deliver do from pwinfo["Created
15 Feb 2017 -
弊社のmatsumotoryさんが作られたツールrconを試してみました。 http://hb.matsumoto-r.jp/entry/2015/12/02/133448 cgroupを利用したワンバイナリのツールで、IOやCPU、メモリーなどのリソースを制限できます。 cgroupは過去に検証したことがあったのですが、便利だけど、やはり手間がかかるイメージでした。 しかしrconはLinuxコマンドのように扱えるので、便利そうだと思い試してみました。 試した環境 CentOS6.7 Vagrant Ruby2.2.3 事前に入れておくと良いパッケージ 私の環境はCentOSのminimal isoを利用したイメージだったので、色々パッケージが不足してました。最低限下記は必要かと思われます。 $ yum install libcgroup gcc zlib zlib-devel bison autoconf aclocal automake c++ gcc-c++ flex pam pam-devel 導入 導入については、README.mdを見ればすぐに分かるのですが、rakeを使ってビルドすれば、OKです。 README通りにやってみた $ yes > /dev/null yesコマンドを実行すると、そのままCPUが100%食われてしまいます。 rconを使って、実行してみます。 $ rcon --user inamuu --command "yes > /dev/null" --cpu 10 結果 CPU使用率が10%まで抑えられていました。明確に数字にあらわれるので感動します。 また、下記のように既に実行されているプロセスに対しても制限をかけることができました。 $ yes > /dev/null & $ rcon --pids "`pgrep yes`" --cpu 10 今回はテストしませんでしたが、ディスクの読み書きもサイズで制限できるため、あきらかに負荷のかかる作業(ファイルを大量に削除するなど)を実施する場合は、大変便利なツールです。Created
27 Sep 2016 -
Ocotkit使うにあたって、アクセストークンを直書きしてテストしていたのだけど、例えば複数人が使うのであればそれダメじゃんってなった。 調べてみたらnetrcというのが使えるらしくて、試してみた。 ついでにgistの一覧取得するみたいなのもやった。 .netrcファイルの書き方 [code] $ vim .netrc machine api.github.com login Githubのユーザー名 password ‘取得したアクセストークンをここに書く’ [/code] 認証の書き方 アクセストークン直書き [code] Octokit::Client.new access_token: ‘ここにアクセストークン直書き’ [/code] netrc使うパターン [code] Octokit::Client.new netrc: true [/code] これで良かった。 おまけ:gistの一覧取得 [code] require ‘octokit’ client = Octokit::Client.new netrc: true list = client.gists puts list [/code] おまけ:一番最新のgistのURLを取得 [code] require ‘octokit’ client = Octokit::Client.new netrc: true htmlurl = client.gists[0][:html_url] puts htmlurl [/code] これで、昨日ブログに書いた感じでgist作って、それを↑のような感じでURL取得するみたいなのが一連の流れでできそう。 昨日のブログ [blogcard url=http://inamuu.com/octokit%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6%e3%81%bf%e3%81%9f/]Created
22 Sep 2016 -
会社の人にoctokit使うとGHEにログインしなくても色々できるよと教えてもらったので、試してみることにした。 octokitのインストール [code] $ gem install octokit $ gem list octokit *\* LOCAL GEMS ** octokit (4.3.0) [/code] Gistを作成するテスト アクセストークンをGithubで作成して、いい感じに権限を付与してあげる。gistの作成だけだったら、gistにチェックを入れるだけ。 下記がテストしたコード。 [code] require ‘octokit’ client = Octokit::Client.new access_token: ‘Githubの自分のsettings作ったアクセストークン’ client.create_gist({:files => {‘test.md’ => {:content => ‘octokitのテストだよ’}}}) [/code] これで実行してみたらこんな感じでgistが作られてた。これ確かに便利だ〜。 これ使えばチームで使ってるあのツールのあの部分に適用できそう感があるなぁ〜なんて妄想できたのが良かった。 あとでやってみよ。Created
21 Sep 2016 -
先日、下記OSSにプルリクエストを出して、マージしていただいた。 [blogcard url=https://github.com/Tomohiro/puppet-mackerel_agent/] Mackerelはファイルシステムの容量監視が行えるのだけど、暫くは特定のファイルシステムを除外することができなかった。 Makcerelの仕様上、複数のファイルシステムがあった場合、最も使用率が高いシステムがアラートの対象となる。※設定画面で特定のファイルシステムのみを容量監視設定することなどは出来ない。 このため、なにかしらの理由で特定のファイルシステムが使用率100%だと、Mackerelで容量監視を設定した直後にすぐにアラートがあがってしまう。 これを回避するには、なにかしら別のスクリプトを用意するしかなかった。 ところが、今年の2/5に特定のファイルシステムを除外するパラメータが追加された。 [blogcard url=https://mackerel.io/ja/blog/entry/2016/02/05/094759] このパラメータでは、例えばramディスクを追加して使用しているような場合やシステムで自動的にマウントされてしまって使用率が100%になってしまっているファイルシステムがあっても、除外することが出来る。 前述のpuppet-mackerel_agentはhieradataでパラメータが管理できるので大変便利で使わせていただいてたのだけど、このファイルシステムを除外するパラメータが含まれていなかった。 そこで折角なのでパラメータを追加するPRを出してみたら、マージしていただけたのだ。 これでこのmanifestを使うことで、除外したいファイルシステムもhieraで管理でき、別途プラグインをインストールすること無く一括で容量監視が出来るようになる。 いやー社外の人にPRをマージしてもらえるってすごい嬉しい。 メンテナーみたいなことが出来るようになるときっと楽しいだろうなと思うので、また色々PRチャンスがあれば出していきたい。Created
19 Aug 2016 -
以前シェルでSlack通知のスクリプトを書いていたのだけど、この間書いたRubyプログラムの、 [blogcard url=http://inamuu.com/nokogiri%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B/] これでSlack通知させたくて、Rubyでも書いてみた。 [code] require ‘dotenv’ require ‘slack/incoming/webhooks’ Dotenv.load slack = Slack::Incoming::Webhooks.new ENV[“APIKEY”] attachments = [{ color: “#483D8B”, fields: [ { title: “今日の書籍一覧”, value: “#{str}”, } ], }] slack.post “”, attachments: attachments [/code] APIKEYをGithubで管理しないために、dotenvで.envに書いたAPIKEYを読むようにした。 しかし、他の方々はどうしてるのだろう? ちなみにシェルスクリプトはこれ。 [blogcard url=http://wiki.inamuu.com/index.php?cmd=read&page=%E3%82%B7%E3%82%A7%E3%83%AB%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%EF%BC%9ASlack%E3%81%B8%E3%81%AE%E9%80%9A%E7%9F%A5&word=slack] [code] #!/bin/bash if [ -n $? ];then echo “Usage: ./slack.sh IPaddress” exit 1; fi url=’webhookのAPIで取得したURLをここに記載する。’ username=’ユーザー名として名乗る名称を記載する。なんでもOK’ to="#チャンネル名を記載する" subject="`hostname` : $1" emoji=’:bell:’ <-絵文字。なんでもOK #message="${subject}" message2="$2" payload=“payload={ "channel": "${to}", "username": "${username}", "text": "${subject}",Created
28 Jul 2016 -
あるサイトでは、電子書籍で発売した漫画の一覧を観ることができる。 そのサイトを見るのが日課だったのだけど、正直毎日確認するのが面倒くさいと思ってた。 そこで、いい感じに一覧を取得できないか調べたところ、いわゆるスクレイピングなどでよく使われるNokogiriを使ってみることにした。 実際に書いたコードはこちら。 [code lang=”ruby”] require ‘yaml’ require ‘open-uri’ require ‘nokogiri’ list = YAML.load_file(“list.yaml”) list[‘siteurl’].each do | url | doc = Nokogiri::HTML(open(url).read) puts “=== Info === " p doc.title doc.xpath(‘//h2[@class=“entry-title”]’).each do | node | puts node.text end end [/code] 見て分かるように大変シンプルなコードで簡単に取得できた。 取得できた情報はこんな感じ。 === Info === 絢爛たるグランドセーヌ 第01-06巻 [Kenrantaru Grande Seene vol 01-06] Ultraman 第01-08巻 ディメンションW 第01-10巻 [Dimension W vol 01-10] ねじ巻き精霊戦記 天鏡のアルデラミン 第01巻 [Nejimaki Seirei Senki – Tenkyou no Alderamin vol 01]Created
23 Jul 2016 -
いつもやってるatcoderの問題シリーズ。 今回は最新のabc041を解いてきた。 問題はこちら。 [blogcard url=http://abc041.contest.atcoder.jp/assignments] A問題の回答 [code] s, i = STDIN.read.split(?\n) i = i.to_i – 1 puts s[i] [/code] 改行コード区切りで縦に並んだ文字列をそれぞれ変数に入れる。 iという数字を整数の型にセットして、1引く。 文字列sのi番目を表示させる。 B問題の回答 [code] A, B, C = STDIN.gets.split(" “).map(&:to_i) X = A * B * C Y = (10**9) + 7 puts X % Y [/code] スペース区切りで変数にセットし、整数の型にセットする。 AとBとCを積算する。 Yは指定された数字10の9乗足す7を計算している。 そして最後にX割るYの余りを出している。 C問題の回答 [code] N = STDIN.read.split("\n”).map(&:to_s) hash = {} i = 1.to_i N[1].split(/ /).each do | val | hash[i] = val.atcoder Created
12 Jul 2016