Make Local Happiness

自分の幸せは自分で作る!!!

RaspberryPiでUSB接続でTM-30mプリンターを使う際に管理者権限以外で実行したい場合の対処

サーマルプリンターをUSB接続で使う際に、 node-thermal-printer を使用したのですが、普通に実行すると処理が終了しません。

これは権限の問題で、sudoを付けて実行すると実行できます。 ですが通常はsudo無しで実行したいので、 USBの権限を変更する方法について記載します。

USB権限の設定

USBデバイスのidVendorとidProductの確認

USBの権限を変更するためのruleファイルを作成するためには、 対象のUSBデバイスのidVendorとidProductの値が必要となります。

$ dmesg | grep usb

[    2.320512] usb 1-1.5: new full-speed USB device number 4 using dwc_otg
[    2.462682] usb 1-1.5: New USB device found, idVendor=04b8, idProduct=0e20
[    2.465600] usb 1-1.5: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[    2.468465] usb 1-1.5: Product: TM-m30 Bluetooth
[    2.471268] usb 1-1.5: Manufacturer: EPSON

ruleファイルを作成

$ sudo vim /etc/udev/rules.d/99-tm-m30.rules
SUBSYSTEMS=="usb", ATTRS{idVendor}=="04b8", ATTRS{idProduct}=="0e20", GROUP="dialout", MODE="0660"

再起動して試す

設定が反映されるよう一度再起動します。

$ sudo reboot

印刷用のプログラム作成

$ npm install node-thermal-printer 
$ vim printer.js

const printer = require("node-thermal-printer");
printer.init({
  type: 'epson',
  interface: '/dev/usb/lp0'
});
printer.alignCenter();
printer.println("Hello world");
printer.printQR("https://github.com/Klemen1337/node-thermal-printer");
printer.cut();
printer.execute((err) => {
  if (err) {
    console.error("Print failed", err);
  } else {
    console.log("Print done");
  }
});

印刷実行

$ node printer.js
> Print done

参考

http://thinkami.hatenablog.com/entry/2015/06/25/064658

「なぞときBINGO」という新しいBINGOを作ったよ

f:id:iwate_takayu:20170819110621p:plain

実は最近結婚式をやりました(祝)
私は謎解き(リアル脱出ゲーム)にハマっており、 2次会では何か謎解き関連のことがやりたいと思ってました。

そこで思いついたのが、ビンゴゲームです。
結婚式の2次会で誰もがやる定番中の定番なゲームだと思います。
そんなビンゴゲームと「謎解き」をかけ合わせたら面白いと思って作ったのが、
「なぞときBINGO」だったのです。

なぞときBINGOとは?

通常のビンゴゲームでは、数字はガラガラさせて数字の書いてある玉を出すビンゴマシーンで数字を出して、 1列すべてが空いたらビンゴで運要素しかないゲームです。 運要素の強いビンゴゲームを「なぞときBINGO」では少し実力主義型のゲームに変えました。

「なぞときBINGO」ではビンゴマシーンは使わず、 ビンゴカードと謎(パズルのようなもの)が書かれた紙を数枚使ってゲームを進めます。 参加者が謎を解くと答えで数字が出てくるので、その数字をビンゴカードから開けてゲームを進めます。

謎をすべて解いた後ですが、 実は「電話番号」が出てきます。 その電話番号に電話すると抽選に参加できる仕組みになっています。

なんで電話をかけるんだと思った方がいるかと思うのですが、
これは、電話を使って抽選するためです。

通常のビンゴゲームではビンゴになると、ビンゴー!と高らかに言って、
会場の前の方に行くかと思います。

この「なぞときBINGO」では、抽選は電話で行います。

f:id:iwate_takayu:20170819112943p:plain

WEBのツールを用意しており、電話をかけた方の番号の下4桁が一覧で表示され、
当選人数を指定し抽選ボタンを押すと、当選した番号が決定し、
電話に着信が入るのです。

f:id:iwate_takayu:20170819112844p:plain

どうやって作ったのか?

f:id:iwate_takayu:20170510221936j:plain

実はこのビンゴカード自作なんです。
これは特注しているわけではなく、レーザーカッターで自分で切って作っています。
レーザーカッターは使い方がわからなくても、渋谷のFabcafeでハンズオンをやっていたり、
AKIBA.DMMやTechShopでも教えてくれる人がいるので案外なんとかなりました。

電話のシステムはTwilioを使って作っています。

これ非常に便利です。 自動音声応答(IVR)や着信をトリガーに処理を投げることができたりと、
電話を使った仕組みは一通り作れるのではないでしょうか?

WEBツールは裏側はFirebaseで作っています。
Firebase FunctionsでAPIは作成しており、APIからTwilioを呼び出しています。
サーバーを保持していないため、 コストが安く、メンテナンスなしで動作する構成で作っています。

まとめ

もともとは自分の結婚式のために作ったものですが、 意外と評判がよかったため、現在販売も開始しました!(是非友達に進めてください)
結婚式の2次会で普通のビンゴでは満足できない方にはオススメの商品になったと思います。
意外にも電話で抽選がくるのは面白かったです。

もともとTwilioのサイトに抽選用のデモアプリがあったので、
システム的にはそれをFirebase用に書き換えた感じです。

体験レポートなんかも今後書いていきたいので、もし写真付きで書いてもいいよという方は、
info@nazoneko.comまでメール頂ければ無料で謎解きビンゴをプレゼントします。

▼購入はこちらから

peraichi.com

▼体験版の申し込みはこちらから

docs.google.com

raspberryPiの初期セットアップ

f:id:iwate_takayu:20170408172520j:plain

必要なもの

SDカードにRaspbian(OS)を焼く

こちらはMacでの作業になります

raspbianをMacにダウンロード

以下のページからダウンロードできます

https://www.raspberrypi.org/downloads/raspbian/

1.SDカードのディスクを確認します

$ diskutil list
/dev/disk2 (internal, physical):
  #:                       TYPE NAME                    SIZE       IDENTIFIER
  0:     FDisk_partition_scheme                        *15.9 GB    disk2
  1:             Windows_FAT_32 boot                    66.1 MB    disk2s1
  2:                      Linux                         4.3 GB     disk2s2

2.先程ダウンロードした.imgのファイルを指定してSDカードに書き込みます

$ sudo dd bs=1m if=2017-03-02-raspbian-jessie.img of=/dev/disk2


4190+0 records in
4190+0 records out
4393533440 bytes transferred in 3563.665218 secs (1232869 bytes/sec)

3.sdカードを取り出します

sudo diskutil eject /dev/disk2

WIFI設定

SSID, PASSWORDは適宜変更する

sudo sh -c 'wpa_passphrase SSID PASSWORD >> /etc/wpa_supplicant/wpa_supplicant.conf'

Wifiのパスワードが残っているので消す

sudo vi /etc/wpa_supplicant/wpa_supplicant.conf

network={
        ssid=SSID
        #psk=PASS # 生パスワードなんで消しておく
        psk=01b...
}

SSIDが表示されれば成功

$ iwconfig wlan0

IPを固定にする

現在のIPを確認する

$ ifconfig wlan0
wlan0     Link encap:Ethernet  HWaddr b8:27:eb:46:79:7d  
          inet addr:192.168.0.205  Bcast:192.168.0.255  Mask:255.255.255.0

ゲートウェイのアドレスを確認する

$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.0.1     0.0.0.0         UG    303    0        0 wlan0
192.168.0.0     0.0.0.0         255.255.255.0   U     303    0        0 wlan0

DNSサーバを確認する

$cat /etc/resolv.conf 
# Generated by resolvconf
nameserver 8.8.8.8

先程確認したIPを記載する

sudo vi /etc/dhcpcd.conf

interface wlan0
inform 192.168.0.205
static routers=192.168.0.1
static domain_name_servers=8.8.8.8

$ sudo /etc/init.d/dhcpcd reload

各種インストー

アップデート

$ sudo apt-get update
$ sudo apt-get upgrade

$ sudo apt-get install -y git
$ sudo apt-get install -y vim

鍵設定

githubに公開鍵を置く

githubに鍵を予め登録しておく 共通鍵は以下のURLで確認できる

https://github.com/[username].keys

公開鍵を登録する

cd 
mkdir .ssh
cd .ssh 
wget -O authorized_keys https://github.com/ganezasan.keys 
cd ..

sudo chmod 700 .ssh
sudo chmod 600 .ssh/authorized_keys

sshの設定

$sudo vim /etc/ssh/sshd_config

...
PermitRootLogin no # root不可
...
PasswordAuthentication no # パスワード認証を無効に
...
AuthorizedKeysFile     %h/.ssh/authorized_keys #コメントインする

$ sudo /etc/init.d/ssh restart

sshを有効にする

sudo raspi-config

Interfacing options > ssh > Enable or disable ssh server

ディスプレイを上下逆にする

$ sudo vim /boot/config.txt      
$ lcd_rotate=2

Arduinoをはじめようを読んでみたメモ

本の半分がArduino言語のリファレンスなので、 実際作るときに辞書としては使えそう。 前半は簡単なセンサーのプログラムと回路のサンプルについての説明が書いてあった。

以下メモです。

ティルトスイッチ(傾斜スイッチ) パルス幅変調(PWM)

抵抗器とコンデンサの値の読み方

抵抗器とは?

0
1
2
オレンジ 3
4
5
6
7
8
9
10%
5%

金と銀は精度を表す色 茶、黒、オレンジ、金という並びだったら、 103±5%とよめます。でもこれだと意味がわかりませんね。 実は3本目がゼロの数を表しています。 なので103ならば、10の後ろにゼロが3つあるので、「10000Ω±5%」の抵抗器ということになります。10kとも表せます。

コンデンサとは?

コンデンサは電気を蓄えたり放出したりする電子部品です。 直流を通さないで絶縁するはたらきもあります。

http://www.murata.com/ja-jp/campaign/ads/japan/elekids/compo/capacitor

コンデンサキャパシタ)の値の読み方はもう少し簡単です。 電解コンデンサのような樽型の部品は、値がそのまま印刷されています。 コンデンサの値の谷はファラド(F)で、あなたよく使う込んで差はマイクロファラド(μF)単位で図れるものでしょう。

セラミックコンデンサのような円盤形のコンデンサの場合は、μのような単位の記号は印刷されていません。かわりにピコファラド(pF)単位の値が3桁の数字で示されます。

1,000,000pF = 1μF

この3桁の数字の読み方は抵抗に似ていて、3桁目の数字が1〜2桁目の数字の後ろに並ぶゼロの数を表しています。ただし、ゼロの数をそのまま表すのは3桁目が0〜5のときだけで、8の場合は最初の2桁を0.01倍、9の場合は0.1倍にします。6と7は使われません。 例を挙げましょう。104と印刷されていたら100,000pF、つまり0.1μFです。

229ならば2.2μFとなります。

Prototyping Labを読んでArduinoを触ってみた

今回始めてArduinoに触り、電子工作というか回路とかも結構怪しい状態なので、 書籍に書いてることをメモしている感じです。 この本を読みました。

作品紹介

Arduinoで作られたプロトタイプの作品も結構多かった。 どれもプロトタイプからガッツリ工場での量産を意識しているわけではなく、 途中で品質や金額などを考慮して、品質をなんとか担保しつつ量産できるようにする工程があった。

電子回路の基礎知識

電気の流れは水の流れに例えられ、電位の高いところから低いところに向けて電流は流れる。地点の高さ(海抜)の高さは電気ではグラウンド(GND)を基準として比較します。

オームの法則

オームの法則は「電位差が電流に比例し、その比例定数を抵抗という」 2点間の電位差をE、電流をI、比例定数をである抵抗をRで表すと、 E=I×R

R=(電源電位 - LEDの順電圧)/ LEDに流したい電流

LEDの順電圧が1.8V(赤の場合にはこのくらいが多い)、電流が10mAの場合320Ωが適切であることがわかる

R = (5 - 1.8) / 0.01 = 3.2/0.01 = 320

Arudino基礎知識

PWM(Pulse Width Modulation)

オンの区間とオフの区間の割合を変えることで連続的に出力をコントロールすること

analogWrightは限られたデジタルピンでしか使えない

D3,D5,D6,D9,D10,D11の6つのみ

センサ

フォトインタラプタ

ある位置に物体があるかどうかを検知できる。 フォトインタラプタには透過型と反射型があります。 - 透過型: 発光素子と受光素子が対抗にセットされ、間を何かが遮ったかどうかを検出することができます。 - 反射型: 発光素子と受光素子が並行にセットされ、一定の距離に反射する物体があるか否か、また、反射率はどの程度かを検出することができます。

まとめ

センサー試すにはいい感じの本でした。 回路とセンサーの部品、サンプルコードなど丁寧に書かれていたので、始めの1冊としてはいいかもしれないです。 Lチカもやっぱり動くと楽しい!

f:id:iwate_takayu:20170202121939j:plain

ServerlessフレームワークでDynamoDBのテーブルを10個以上作る

Subscriber limit exceeded: Only 10 tables can be created, updated, or deleted simultaneously.

CloudFormationからDynamoDB作ると、こんなエラーがでるんですよね。 しかも結構いい加減で、私の環境では14個までは作成できました。

AWSのサポートに連絡すれば、 上限を緩和することとかできるかな〜と思ったのですが、 DynamoDBのAPIで制限されており、今のところは上限緩和できません。

Limits in DynamoDB - Amazon DynamoDB http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Limits.html

In general, you can have up to 10 CreateTable, UpdateTable, and DeleteTable requests running simultaneously (in any combination). In other words, the total number of tables in the CREATING, UPDATING or DELETING state cannot exceed 10.

解決策

Serverlessを使ってDynamoDBを作成していたのですが、 解決策は2つあって、

  1. Serverlessのプロジェクトを2つ以上に分ける
  2. DependsOn属性を使いテーブルに依存関係を付ける

今回はマスタとなるテーブルが10個以内だったので、 2のDependsOn属性で解決しました。

DependsOn属性を使いテーブルに依存関係を付ける

詳しくは以下のドキュメントをご参照ください。

DependsOn 属性 - AWS CloudFormation

http://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-attribute-dependson.html

DependsOn 属性を含む DynamoDB テーブル

http://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-table.html#cfn-dynamodb-table-examples-dependson

Resources:
  myFirstTable:
    Type: AWS::DynamoDB::Table
    Properties:
      ...
  mySecondTable:
    Type: AWS::DynamoDB::Table
    DependsOn: myFirstTable
    Properties:
      ...

上記例では、必ず myFirstTable の作成が完了した後に mySecondTable の作成が開始されます。

そのため11個目以降のテーブルに DependsOn 属性をつけることで、 DynamoDB テーブルの同時作成数を 10 個に抑えつつ CloudFormation スタックの作成が可能になります。

Terraformで既存のDynamoDBの設定を取得する

f:id:iwate_takayu:20170112190156p:plain

Terraformのページは本当にわかりにくいので、メモ。 AWSマネジメントコンソールから手動でDynamoDBなどを作り、設定をコード化したい場合に便利です。

Terraform install

バイナリーをダウンロードし、パスが通っているディレクトリに設置します。
こちらのページにリンクがあります。 www.terraform.io

$ curl -LO 'https://releases.hashicorp.com/terraform/0.8.4/terraform_0.8.4_darwin_amd64.zip'
$ unzip terraform_0.8.4_darwin_amd64.zip
Archive:  terraform_0.8.4_darwin_amd64.zip
  inflating: terraform               

$ mv terraform /usr/local/bin/terraform
$ terraform --version
Terraform v0.8.4

AWSの設定

aws.tfファイルを作成し、普段使っているProfileなどを選択します。 defaultを使っている方は、この設定は不要です。

provider "aws" {
  region                   = "ap-northeast-1"
  shared_credentials_file  = "/Users/xxxxxx/.aws/credentials"
  profile                  = "test"
}

DynamoDBをインポート

<table_name>を任意のテーブル名にすれば完了です。 コマンド実行後terraform.tfstateが作成されています。

$ terraform import aws_dynamodb_table.basic-dynamodb-table <table_name>