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

VisualStudioCode でインストールしたい拡張機能3つ

最近がっつりプロダクト開発してないので、広くいろいろ試すときに便利な拡張機能について書きます。

Git Project Manager

VSCode から離れることなくリポジトリをスイッチできます。

f:id:khei-fuji:20170507164017g:plain

複数のリポジトリを行ったり来たりすることが多いので便利。
これを使う前はターミナルでディレクトリ開いて code . してました。

gitignore

環境に適した .gitignore を生成してくれます。

f:id:khei-fuji:20170507165148g:plain

これを使う前は毎回「xxx .gitignore」でググって github/gitignore からコピーしてました。

Git History

普段は SourceTree 使ってますが、VSCode から離れたくないときに使います。
これは本体が対応してくれてもいい気がします。

f:id:khei-fuji:20170507164604g:plain

そういえば Windows 版の SourceTree は UI 大きく変わりましたね。
www.publickey1.jp


おわりに

コードのシンタックス以外で使っている拡張機能はこれくらいでした。
オススメあったら教えてください。


この手のまとめ記事、10個や15個も読む気にならないし、仮にインストールしても大半は存在忘れて使わないので、本当にオススメしたいなら数を絞って期間を空けて紹介してほしいものです。


GitHub実践入門 ~Pull Requestによる開発の変革 (WEB+DB PRESS plus)

GitHub実践入門 ~Pull Requestによる開発の変革 (WEB+DB PRESS plus)

RaspberryPi3 買ったので初期設定した

RaspberryPi3 買った。

電源コードやSDカードを別で買うのが面倒だったので、全部入りを購入。

f:id:khei-fuji:20170505162927j:plain

はじめに

「RaspberryPi 初期設定」で検索すると見つかる記事が多いわりに、網羅的に書かれた記事にたどり着けなかった。
なのでハマったところに対してだけ重点的に書く。

参考にした記事

RaspberryPi2との違い

  • Wi-Fi がデフォルトでついている
  • 起動時のデフォルトが GUI ブート
  • 固定IPの設定は /etc/network/interfaces より /etc/dhcpcd.conf に書く
    これは Raspbian 8.0(jessie) によるものなので、RaspberryPi2 の時点でもそうだったのかも

f:id:khei-fuji:20170505165035j:plain

開封

f:id:khei-fuji:20170505164150j:plain

ヒートシンク貼る。

f:id:khei-fuji:20170505164352j:plain

初期設定

以下は GUI でも CUI でもおそらくつまづくことはないはず
デフォルトでは GUI になっていたが、Windowsのキーボードがあれば Windows と同じ操作感でどうにかなる。

ネットワーク設定

Wi-Fi 設定

アクセスできるようにする。
組み込みの Wi-Fi では 5GHz の SSID は接続できないので、2.4GHz 帯を使う。

$sudo sh -c 'wpa_passphrase <SSID> <PASSPHRASE> >> /etc/wpa_supplicant/wpa_supplicant.conf'

Wi-Fi インターフェースを再起動して疎通確認する。

sudo ifdown wlan0
sudo ifup wlan0
ping -c 3 www.google.co.jp

IPアドレスの固定

さきに書いたとおり、最新版では固定IPの設定は /etc/network/interfaces より /etc/dhcpcd.conf に書く。

/etc/network/interfaceswlan0 のところは特に固定するように記載しなくて問題ない。

iface wlan0 inet manual
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

/etc/dhcpcd.conf の設定。

interface wlan0
static ip_address=192.168.10.21/24
static routers=192.168.10.1
static domain_name_servers=192.168.10.1

再度 Wi-Fi インターフェースを再起動して疎通確認する。

sudo ifdown wlan0
sudo ifup wlan0
ping -c 3 www.google.co.jp

クライアントから接続確認

ssh pi@192.168.10.21

この後 SSH の設定などは変更する。


Raspberry Pi3 コンプリートスターターキット (Standard)

Raspberry Pi3 コンプリートスターターキット (Standard)

CentOS に ansible で mackerel-agent を雑にインストールする

先日 Raspberry Pi 2 に mackerel-agent をインストールしたので、ついでに CentOS 環境にもインストールした。

kheiakiyama.hateblo.jp

mackerel.io


CentOS

以下、プレイブック

---
- name: install mackerel-agent repo
  shell: |
    curl -fsSL https://mackerel.io/assets/files/scripts/setup-yum.sh | sh
  args:
    creates: /etc/mackerel-agent/mackerel-agent.conf

- name: install mackerel-agent
  yum: name=mackerel-agent state=latest

- name: mackerel-agent conf
  lineinfile: 
    dest=/etc/mackerel-agent/mackerel-agent.conf
    line='{{ item.line }}'
    regexp='{{ item.regexp }}'
  with_items:
    - { line: 'apikey="{{ mackerel_apikey }}"', regexp: '^apikey="{{ mackerel_apikey }}"' }
  notify: restart mackerel-agent

mackerel-agent の yum リポジトリの登録を /etc/mackerel-agent/mackerel-agent.conf でチェックするというのはいささか雑だが、雑にインストールする と断りを入れているのでよしとした。

Ansible徹底入門 クラウド時代の新しい構成管理の実現

Ansible徹底入門 クラウド時代の新しい構成管理の実現

RaspberryPi2 のセンサーで取得したメトリクスを Mackerel に出力する ansible プレイブック

はじめに

1月から東京に移住したが、実家においてきた RaspberryPi2 のメトリクスを見る手段がなかった。
メトリクスは RaspberryPi 内にしか蓄積しておらず、アラートだけ Slack & LINE で送っていた。

過去にやったことは以下の記事。


今回は東京からメトリクスを見れるようにするための取り組み。

最近 Mackerel Meetup #10 に参加した縁もあるので、Mackerel 使ってみましたよ、というだけの話。


実装

RaspberryPi2 いじるのは年に数回なので、構成を後から追えるようにするために、最初からではないのだが ansible でデプロイできるようにしている。
なので、以下プレイブックベースで書く。

ベースの処理

ここでは温度・湿度の記録部分しか書かないが、実際は見守りカメラの反応の有無も録っているため、 yml を分けてある。
role でディレクトリ管理してなくて雑な運用。

main.yml

- hosts: pi
  sudo: yes
  vars:
    colon: ':'
  tasks:
    - include: tasks/base.yml
    - include: tasks/temperature.yml
  handlers:
    - name: restart mackerel-agent
      service: name=mackerel-agent state=restarted

hosts

[pi]
xxx.xxx.xxx.xxx

[pi:vars]
ansible_connection=paramiko
ansible_ssh_user=pi
ansible_ssh_pass=xxxxxxx
ansible_sudo_pass=xxxxxxx
mackerel_apikey=xxxxxxxx

mackerel-agent のインストール

RaspberryPi2 では ARM 版のバイナリが必要なため、インストールした後にバイナリを上書きしている。
API Key も流し込む

tasks/base.yml

- name: install mackerel-agent
  shell: |
    curl -O https://mackerel.io/file/agent/deb/mackerel-agent_latest.all.deb
    dpkg -i mackerel-agent_latest.all.deb
    curl -LOk https://github.com/mackerelio/mackerel-agent/releases/download/v0.42.3/mackerel-agent_linux_arm.tar.gz
    tar zxf mackerel-agent_linux_arm.tar.gz
    cp mackerel-agent_linux_arm/mackerel-agent /usr/bin
  args:
    creates: /etc/mackerel-agent/mackerel-agent.conf

- name: mackerel-agent conf
  lineinfile: 
    dest=/etc/mackerel-agent/mackerel-agent.conf
    line='{{ item.line }}'
    regexp='{{ item.regexp }}'
  with_items:
    - { line: 'apikey="{{ mackerel_apikey }}"', regexp: '^apikey="{{ mackerel_apikey }}"' }
  notify: restart mackerel-agent

温度・湿度のメトリクス取得

公式ドキュメントを読めばわかるとおり、mackerel-agent.conf にコマンドを書いて、コマンド内でメトリクスを標準出力に出せば完了。

ホストのカスタムメトリックを投稿する - Mackerel ヘルプ

tasks/temperature.yml

- name: mackerel temperature plugin
  copy: 
    src=mackerel-temperature.sh
    dest=/home/pi/mackerel-temperature.sh
    mode=755

- name: mackerel humidity plugin
  copy: 
    src=mackerel-humidity.sh
    dest=/home/pi/mackerel-humidity.sh
    mode=755

- name: mackerel-agent conf
  lineinfile: 
    dest=/etc/mackerel-agent/mackerel-agent.conf
    line='{{ item.line }}'
    regexp='{{ item.regexp }}'
  with_items:
    - { line: '[plugin.metrics.temperature]', regexp: '^\[plugin.metrics.temperature\]' }
    - { line: 'command = "/home/pi/mackerel-temperature.sh"', regexp: '^command = "/home/pi/mackerel-temperature.sh"' }
    - { line: '[plugin.metrics.humidity]', regexp: '^\[plugin.metrics.humidity\]' }
    - { line: 'command = "/home/pi/mackerel-humidity.sh"', regexp: '^command = "/home/pi/mackerel-humidity.sh"' }
  notify: restart mackerel-agent

自分の場合は以下のサンプルコードをそのまま利用しているので、センサーからの取得処理は実装方法や RaspberryPi のピン番号によって異なる。

https://github.com/adafruit/Adafruit_Python_DHT

files/mackerel-humidity.sh

#!/bin/bash

name="humidity.raspberrypi"
humidity=`/home/pi/Adafruit_Python_DHT/examples/Adahumit.py 22 4`
date=`env TZ=JST date +%s`

echo -e "${name}\t${humidity}\t${date}"

files/mackerel-temperature.sh

#!/bin/bash

name="temperature.raspberrypi"
temperature=`/home/pi/Adafruit_Python_DHT/examples/Adatemp.py 22 4`
date=`env TZ=JST date +%s`

echo -e "${name}\t${temperature}\t${date}"

mackerel 画面

左から湿度、見守りカメラの反応、温度となっている。

f:id:khei-fuji:20170430145710p:plain

センサーの負荷の問題か、mackerel-agent のタイムアウトが短いためか、取得に失敗することがときどきあり、グラフがぶつ切りになってしまっている。
このあたりはもうちょっと時間があるときに調べたい。

感想

認証を考慮して情報を見える化する場として、Mackerel のような SaaS はありがたい。
(フリー版で事足りてしまうので、Mackerel のビジネス的には貢献できないが・・)

1年くらい運用していて Raspberry Pi の問題は無線LANの再接続くらいしか起きていなかったが、Mackerel によって RaspberryPi ホストも監視できるようになったので、より運用しやすい状況が作れたのでよかった。


Amazon のマーケットプレイスに不審なくらい価格を下げた出品者が続出している

今さらだけど PS4 の Horizon の評判がいいので、Amazon で価格を調べていたところ、タイトルの通りのことが起きていた。
他のサイトで見た感じ、新品では ¥5,000〜¥6,500 の価格設定がされていた。


[2017 4/22 20:48]
¥1,800 で出品する新規出品者


[2017 4/23 8:10]
直近のフィードバックでは送られてこないといったコメントがついていた出品者


[2017 4/23 12:27]
新品の出品
f:id:khei-fuji:20170423122955p:plain


[2017 4/23 12:27]
中古の出品
f:id:khei-fuji:20170423123000p:plain


だんだんリアルな出品者になってきてるが、直近のフィードバックが何年も前だったりで、安値をつけているアカウントは全て怪しく見える。
こういったことがここ数日の間に起きている模様。
PS4 の他のソフトでも起きている。
Amazonマーケットプレイス利用が若干怖くなった。


昨日(4/22) の時点で業者名で検索すると、以下のブログに行き着いた。
堂山后子 Kimiko Doyamaとは何者なのか? | ギリギリバサラ GIRIGIRI BASARA | ギリギリバサラ GIRIGIRI BASARA

最近始まった現象なのかもしれない。


ざっと以下のURLに目を通した限りでは、配送されない場合はまずは出品者に連絡してダメならAmazonに泣きつけば保証してくれるっぽい。(条件にもよる。あと手間がかかる)

Amazon.co.jp ヘルプ: Amazonマーケットプレイス保証


上に書いたように、まずは出品者に連絡したうえで Amazon に問い合わせることで、たぶん Amazon が問題を把握して対処してくれるはずなので、届かなかったというトラブルがあれば適切に問い合わせを行うのがよさそう。


あとは何年も前にマーケットプレイス出品者側で使っていた立場で書くと、自動で最安値に合わせる機能とかがあったので、おかしな安値の価格に合わせてしまう業者を誰かが狙っているという可能性もあるかもしれない。


もしこれがマーケットプレイスのアカウント乗っ取りによるものだとすると、しばらく使われていないマーケットプレイスアカウントのパスワードリセットや停止処置などが今後入ることになるかもしれない。


何にせよよくわからないことになっている。

謙遜は美徳だがチャンスは逃げる

なんかエモいことを書きたい気分なので。
タイトルで言いたいことは終わった。
以下、蛇足。


日本人は謙遜するのが美徳、みたいなところがある。
コミュニケーション上それはすごく共感する。


ただ、一方で、「こういう機会があるんだけど、どう?」みたいな誘いを誰かに言われたときにそれをやってしまうと、大きな機会損失になってしまう。


断り文句として使う場合は構わない。
スキル不足や遠慮で謙遜を使うと、それを乗り越えたときに得られたであろう経験がどれほど大きかったことか。


声を掛ける側はスキル不足かもしれないということは多少想定している。
なんだったら失敗して、それが糧になればいいくらいに思ってることもある。


迷ったらやってみる、というのを信条としたい。
ただ、時間は有限だ。


プレゼン資料ドリブン

先日、AzureMachineLearning のハンズオンイベントをスピーカーとして行った。

【Azure Machine Learning ハンズオン入門】実践からはじめる機械学習 - connpass

イベントについては会社のブログに書くとして、プレゼンの準備をどのようにしたかについて書く。

3/28 20:56 追記。
会社のブログに書きました。

blog.isao.co.jp

以下、前提

  • 準備はじめたのは3週間前
  • Azure はそれなりに知ってる
  • Azure Machine Learning について名前だけ知ってる状態からスタート
  • この手のイベントのスピーカー経験はなし
  • 社内でスピーカーやる経験は何度かある

docs.com

やったこと

プレゼン資料作成

早速ブログエントリのタイトル回収。
ここからはじめた。

以下のように大まかな格子を考えた。

  • アイスブレイクとしての自己紹介(40歳以上ではない)
  • 概要説明
  • ハンズオン
  • 多少の解説
  • まとめ

この時点で埋まったのは最初の自己紹介だけ。
「ゼロから学ぶ Deep Learning」でくじけた自分でも Azure Machine Learning は使えます、って流れで紹介することだけ決めた。


connpass のページを公開すると、その日のうちに定員20人に対して34人参加が入る。
この時期の機械学習系のイベントは集客力が恐ろしい。
まだ白紙のスライドなのに。

30周年セールで衝動買いした ファイナルファンタジー X/X-2 HD Remaster をやってる場合ではない。
ベベルで足止め。

情報収集

メインとなるハンズオン部分や関わる技術概要を埋めるための情報収集

  • 公式ドキュメントを漁る
  • 公式のチュートリアルを試す
  • Qiita や個人ブログを中心にやってみた系の記事をあさる

最初にググってまわるのは効率悪くて、公式から追うのがベター。
特に MS は翻訳はアレなことがあっても最近ドキュメントが読みやすくタメになる。
検索にヒットする記事は1年前の記事ですら陳腐化してる可能性があるし、そもそも質が低いものが多い。

10日前の時点で満足度6割の資料ができあがる。
最低限開催できるだろうというレベル。

これで七曜の武器集めが再開できる。

校生・ビルドアップ

試行錯誤で完成度を高めていくフェーズ。

  • 資料全体を見て整合性チェック
  • 自分でリハーサル
  • 社内リハーサル
  • 他のイベントに参加する

効果的なのは社内リハーサルと他のイベントに参加したことだった。
視点漏れが減るのと、コンテンツの不足が補われた。
協力いただいた方々、ありがとうございました。

この頃、とれとれチョコボで0秒切りを達成して、無事ティーダの武器が限界突破を果たす。
プレゼンで玉砕して死んでも後悔はない。

本番について

割愛

考察

プレゼン資料ドリブンは議事録ドリブンに似ていて、必要なアウトプットを最短経路で生み出してる感あってよかった。
機械学習は闇雲に調べるとキリがないジャンルなので、伝えたいこと言いたいことにフォーカスして下調べできたのが大きい。
ただ、早い段階で伝えたいことを確定させてしまうことで、結論ありきにならないようにしないといけないという点はある。
バランス感覚が必要。

スケジュール感としてはギリギリまで資料作ってる、という状態にならず、早い段階で開催できる状態が見えたのもよい。

ふと思い返せばブログ駆動開発することもたまにある。
最終的にこういうアウトプットを出すために今やっていっているのだ、という認識があるとモチベーションになってよい。

進捗

スフィア盤埋めとルールーの雷避けが残ってる。
前者は作業なのでやる気がない。

雷避けは2年前にバズった記事で機械学習で自動化してる方がいたことを思い出した。
FF10の雷除けを自動化した話 - panchiga's blog

たまたまとはいえ機械学習という話でつながってくるとは。。
投資がかさむので気が向いたらチャレンジしたい。