人生リアルタイムアタック

当面はPython学習帳

Raspberry Pi3 に mackerel をインストールする

ダウンロードと配置

Releases · mackerelio/mackerel-agent · GitHub からARM用のソースコードをダウンロードする

$ wget https://github.com/mackerelio/mackerel-agent/releases/download/v0.47.1/mackerel-agent_linux_arm.tar.gz
$ tar xvzf ./mackerel-agent_linux_arm.tar.gz

任意の場所に配置して実行すると、 open /etc/mackerel-agent/mackerel-agent.conf: no such file or directory と怒られるので /etc/mackerel-agent に配置する。

$ sudo mv mackerel-agent_linux_arm /etc/mackerel-agent

# API キーの登録
$ sudo /etc/mackerel-agent/mackerel-agent init -apikey="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

systemctl への登録

手動だと辛いので、 systemctl に登録する。

[Unit]
Description=mackerel-agent

[Service]
Type=simple
WorkingDirectory=/etc/mackerel-agent
ExecStart=/etc/mackerel-agent/mackerel-agent --conf=/etc/mackerel-agent/mackerel-agent.conf
TimeoutStopSec=5
StandardOutput=null
User=root
Group=root

[Install]
WantedBy = multi-user.target
# 有効化
$ sudo systemctl enable mackerel-agent

# 起動
$ sudo systemctl start mackerel-agent

数分して mackerel にデータが流れていればOK.

f:id:ShineSpark:20171116210504p:plain

参考

DB接続を伴わないRailsのヘルスチェックを実装する

あらすじ

Rails でDBがコケていたとしても、単体では動作していることをヘルスチェックで確認したかった。

Controller での実装の場合

こんなコントローラを書いたとする。

class HealthcheckController < ApplicationController  
  def index
    User.first
    render plain: 'Still Alive'
  rescue => e
    render plain: 'Not Still Alive', status: :internal_server_error
  end
end  

が、DBに接続できない時には、これ以前のMySQL serverへの接続の所でコケる(DBがMySQLの場合)。

f:id:ShineSpark:20170822003416p:plain

Action Dispatcherのミドルウェアスタック

Rails では Action Dispatcher を通して middleware の仕組みがある。

Rails on Rack — Ruby on Rails Guides

その為、MySQLに接続の前の middleware にヘルスチェックをする為のロジックを挿入すればよい。 ちなみに今呼ばれている middleware の一覧は、rails console から以下のコマンドで確認できる。

$ rails middleware
use Rack::Sendfile
use ActionDispatch::Static
use ActionDispatch::Executor
use ActiveSupport::Cache::Strategy::LocalCache::Middleware
use Rack::Runtime
use Rack::MethodOverride
use ActionDispatch::RequestId
use Sprockets::Rails::QuietAssets
use Rails::Rack::Logger
use ActionDispatch::ShowExceptions
use WebConsole::Middleware
use ActionDispatch::DebugExceptions
use ActionDispatch::RemoteIp
use ActionDispatch::Reloader
use ActionDispatch::Callbacks
use ActiveRecord::Migration::CheckPending
use ActionDispatch::Cookies
use ActionDispatch::Session::CookieStore
use ActionDispatch::Flash
use Rack::Head
use Rack::ConditionalGet
use Rack::ETag
use Warden::Manager
run <Railsプロジェクト名>::Application.routes

または 

irb(main):010:0> <Railsプロジェクト名>::Application.config.middleware
=> #<ActionDispatch::MiddlewareStack:0x00563448c71938 @middlewares=[Rack::Sendfile, ActionDispatch::Static, ActionDispatch::Executor, ActiveSupport::Cache::Strategy::LocalCache::Middleware, Rack::Runtime, Rack::MethodOverride, ActionDispatch::RequestId, Sprockets::Rails::QuietAssets, Rails::Rack::Logger, ActionDispatch::ShowExceptions, WebConsole::Middleware, ActionDispatch::DebugExceptions, ActionDispatch::RemoteIp, ActionDispatch::Reloader, ActionDispatch::Callbacks, ActiveRecord::Migration::CheckPending, ActionDispatch::Cookies, ActionDispatch::Session::CookieStore, ActionDispatch::Flash, Rack::Head, Rack::ConditionalGet, Rack::ETag, Warden::Manager]>

Action Dispatcherのミドルウェアスタックを利用したヘルスチェックの実装

コントローラーを特に書かずに、 app/middleware/healthcheck.rb を作成し、以下のように記述する

class Healthcheck  
  OK_RESPONSE = [ 200, { 'Content-Type' => 'text/plain' }, "Still Alive" ]

  def initialize(app)
    @app = app
  end

  def call(env)
    if env['PATH_INFO'] == '/health'
      return OK_RESPONSE
    else
      @app.call(env)
    end
  end
end  

config/application.rb に以下を追記する。

    config.middleware.insert_before 'ActionDispatch::ShowExceptions', 'Healthcheck'

ここでは、例外を発生させる ActionDispatch:ShowExceptions より前にこの middleware を追加している。 middleware の中では、 /health パスの時に限り、以降の処理を行わず Still Alive を返し、他にパスの時には通常通り処理を継続するようにする。
routes.rb に /health を書く必要はないが、何らかコメントして置いた方が他の人がハマりにくいと思う。

確認

Rails 再起動してDBだけ停止させた上で localhost/health にアクセスしてみる。

f:id:ShineSpark:20170822010607p:plain

OK。

参考

React Native の iOS Simulator を iPhone 6以外で起動する。

$ react-native run-ios コマンドを叩くとデフォルトで iPhone 6 のシミュレータが立ち上がるのだが、自分が所有しているのは iPhone 6s だし、世は iPhone 7 ということで、iPhone 6 のシミュレータを削除したらコマンドから立ち上がらなくなってしまった。

$ react-native run-ios
Scanning 708 folders for symlinks in /Users/user_name/git/react-native-project/node_modules (13ms)
Found Xcode workspace LawchanReactNative.xcworkspace

Could not find iPhone 6 simulator

解決方法

`–simulator=“iPhone 6s” を付けるとよい。

$ react-native run-ios --simulator="iPhone 6s"

# 略

** BUILD SUCCEEDED **


Installing build/Build/Products/Debug-iphonesimulator/ReactNativeProject.app

補足

xcrun simctl list devices を叩くと利用可能なシミュレータデバイス一覧が取得できるのでこれも利用すると良い。

$ xcrun simctl list devices

== Devices ==
-- iOS 10.1 --
-- iOS 10.3 --
    iPhone 6s 
    iPhone 6s Plus 
    iPhone 7 
    iPhone 7 Plus 
    iPhone SE 
    iPad Air 2 
    iPad 
    iPad Pro 
    iPad Pro 
    iPad Pro 
    iPad Pro 
-- tvOS 10.2 --
-- watchOS 3.2 --
    Apple Watch - 38mm 
    Apple Watch - 42mm 
    Apple Watch Series 2 - 38mm 
    Apple Watch Series 2 - 42mm 
-- Unavailable: com.apple.CoreSimulator.SimRuntime.iOS-10-2 --
    iPhone 5 
    iPhone 5s 
    iPhone 6 
    iPhone 6 Plus 
    iPhone 6s 
    iPhone 6s Plus 
    iPhone 7 
    iPhone 7 Plus 
    iPhone SE 
    iPad Retina 
    iPad Air 
    iPad Air 2 
    iPad Pro 
    iPad Pro 
-- Unavailable: com.apple.CoreSimulator.SimRuntime.watchOS-3-1 --
    Apple Watch - 38mm 
    Apple Watch - 42mm 
    Apple Watch Series 2 - 38mm 
    Apple Watch Series 2 - 42mm 

参考

Atom の vim-mode-plus で shift-Y でヤンクした時に、行ヤンクでなく現在のカーソル位置から行末までのヤンクにする

追記 2017-08-30

v0.99.0 から設定画面から設定可能になりました。

f:id:ShineSpark:20170830130809p:plain

以下元の投稿。

最近Atomを使い始めてVimとの齟齬を少しずつ解消している。 AtomでのVim再現にはatom-vim-mode-plusを使っているのだが、 Y が行ヤンクだったのをカーソル位置から行末までのヤンクに変える方法を調べたのでその記録。

github.com

そもそも VimY が行ヤンクであることに納得が行かない理由

通常、小文字で2回連続オペレーターコマンドを叩いた場合にはカーソル位置に関わらず一行に作用する。
また、大文字でオペレーターコマンドを叩いた場合には、カーソル位置から行末まで作用する。

コマンド 挙動
dd 一行削除
D カーソル位置から行末まで削除
cc 一行削除してインサートモードへ
C カーソル位置から行末まで削除してインサートモードへ
yy 一行ヤンク
Y 一行ヤンク

しかし、ヤンクの場合に限り yyY の挙動に差異がない。 その為 .vimrc に

" yank to end of a line.
nnoremap Y y$

と書いて Y をカーソル位置から行末までのヤンクに書き換える手法がある。 一定の法則に則った挙動なのでこのヤンクに慣れると Y で一行ヤンクされると違和感がある。

Atom でもその挙動を実現する。

実はコマンドは https://github.com/t9md/atom-vim-mode-plus/blob/eeb88cfc9b0aedb2c7d07363fd2023c75c18bc18/lib/command-table.coffee#L72-L75 に実装されていた。

YankToLastCharacterOfLine:
  file: "./operator"
  commandName: "vim-mode-plus:yank-to-last-character-of-line"
  commandScope: "atom-text-editor"

その為、 keymap.cson に以下を追加するだけで利用可能になる。

'atom-text-editor.vim-mode-plus:not(.insert-mode)':
  'shift-y': 'vim-mode-plus:yank-to-last-character-of-line'

参考

Docker for Mac が落ちる不具合を回避する

Docker for Mac Version 17.06.0-ce-mac18 (18433) から、気が付いたらDockerが落ちているケースに多く遭遇した。

調べてみたところ、GitHubのIssueに同様の報告と解決方法が提示されていた。

Containers fail to keep running since latest Docker update · Issue #1809 · docker/for-mac · GitHub

HTTP proxies are configured by modifying the environment variables inside the VM, which requires a VM restart whenever the variables change. In this case perhaps it’s unnecessary to reboot when the exclude changes, when there is no actual proxy set.

とのことで、Docker for Mac の設定 > プロキシ > プロキシを設定しない 設定にすることで解決する模様。

f:id:ShineSpark:20170713005151p:plain

やったね。

ダライアスバースト オリジナルサウンドトラック

ダライアスバースト オリジナルサウンドトラック

Rubyで固定長のCP932(Shift_JIS)ファイルを扱う

哀しいことにCSVなどでなく固定文字列長のCP932ファイルからインポートを行わないといけなくなったのでその対処方法。
ruby 2.3.3p222 (2016-11-21 revision 56859) [x86_64-darwin15]

データのイメージ

123456abcdef池袋                                          イケブクロ                                           10
123456abcdef目白                                          メジロ                                             10
123456abcdef高田馬場                                       タカダノババ                                        10

全角=2バイト, 半角1バイトという前提でデータファイルが設計されているが、Ruby 2.x で文字列として全角半角問わず1文字は1文字としてカウントされる為、文字数がズレることがある。

対処

byteslice を使い特定バイト位置をスライスする。

irb(main):023:0> File.foreach('test.txt') { |line| p line.byteslice(12...58); p line.byteslice(58...107) }
"\x92r\x91\xDC                                          "
"\xB2\xB9\xCC\u07B8\xDB                                           "
"\x96ڔ\x92                                          "
"Ҽ\xDE\xDB                                             "
"\x8D\x82\x93c\x94n\x8F\xEA                                      "
"\xC0\xB6\xC0\xDE\xC9\xCA\xDE\xCA\xDE                                        "

utf-8に変換する

irb(main):022:0> File.foreach('test.txt') { |line| p line.byteslice(12...58).encode('utf-8', 'cp932'); p line.byteslice(58...107).encode('utf-8', 'cp932') }
"池袋                                          "
"イケブクロ                                            "
"目白                                          "
"メジロ                                              "
"高田馬場                                      "
"タカダノババ                                           "

必要に応じてstripする

irb(main):021:0> File.foreach('test.txt') { |line| p line.byteslice(12...58).encode('utf-8', 'cp932').strip; p line.byteslice(58...107).encode('utf-8', 'cp932').strip }
"池袋"
"イケブクロ"
"目白"
"メジロ"
"高田馬場"
"タカダノババ"

ルビィのぼうけん こんにちは!  プログラミング

ルビィのぼうけん こんにちは! プログラミング

Windows 7でキーリピート速度を変更する

Amazon WorkSpaces 上で Windows 7 を使うようになったが、キーリピート速度の設定方法を忘れてしまったのでメモ。

f:id:ShineSpark:20161106214852p:plain

HKEY_CURRENT_USER > Control Panel > Accessibility > Keyboard Response にて、以下を変更する。

レジストリ 説明 個人的推奨値(単位: ms)
AutoRepeatDelay キーリピート開始ウェイト 250
AutoRepeatRate キーリピート間隔 25

他のサイトでは他の値変更も記載されているが、根拠が不明なので一旦はこれで。