2018年7月27日金曜日

gemを作って公開する

若干古い記事、かつbundleを使うような記事しか見当たらなかったので、もう少し簡単にできる方法を書く。

といっても、公式の以下のページをなぞるだけ。
https://guides.rubygems.org/make-your-own-gem/

まずはクラス化するなりモジュール化するなり、ライブラリとして使えそうな状態のツールを作成する。
拙作だが、以下のようなイメージ。
https://github.com/syamoji/getInstagram
この中のgetInstagramDataWithTag.rbをリネームしてgem化する。
今回は、 instagram-tag-searchとした。 

ツールができたら、gem化する作業に入る。
ライブラリ名としたいディレクトリを作り、その中に
  • ライブラリ名.gemspec 
  • libフォルダ
    • ライブラリ名.rb
とする。
ライブラリ名は、他のgemとバッティングしていないか、予め検索しておくこと。

プロジェクトフォルダのイメージ
 


gemspecファイルを以下のように編集する。

Gem::Specification.new do |s| s.name = 'ライブラリ名' s.version = '0.0.1' s.date = '2018-07-24' s.summary = "gemの要約" s.description = "gemの説明" s.authors = ["作者の名前"] s.email = 'メールアドレス' s.files = ["lib/ライブラリ名.rb"] s.homepage = 'Webページのアドレス。githubページなどにしても良い。' s.license = 'MIT' s.add_runtime_dependency '依存ライブラリ', '~> 1.5', '>= 1.5.6' # バージョンは依存ライブラリのものに合わせること end


準備はできたので、gemファイルを作る。
$ gem build ライブラリ名.gemspec
  Successfully built RubyGem
  Name: ライブラリ名
  Version: 0.0.1
  File: ライブラリ名-0.0.1.gem
gemファイルができたので、試しにローカルでインストールする。  
環境によってはsudoが必要かもしれない。
$ gem install ./ライブラリ名-0.0.1.gem
Successfully installed ライブラリ名-0.0.1
Parsing documentation for ライブラリ名-0.0.1
Done installing documentation for ライブラリ名 after 0 seconds
1 gem installed
 ローカルでインストールできたかは、irbなどで試すと良い。
$ irb
> require 'ライブラリ名'
=> true
gem公開の準備は以上。
次はrubygem上の準備を行う。

https://rubygems.org/ こちらで登録を済ませておく。
認証メールが届くので、リンクをクリックしたら登録完了。

サインイン後のページで、右上のユーザ名とアイコンが有るエリアをクリックする。




 
遷移後のページで、Edit Profileをクリックする。 
ページの真ん中あたりに API ACCESS の項目があるので、そこの curl コマンドをコピーし、ターミナルで実行する。


rubygemのパスワードが求められるので入力すると、
以下のような表示が出て、終了する。

Enter host password for user 'syamoji':
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    56    0    56    0     0    115      0 --:--:-- --:--:-- --:--:--   115

先程ローカルで作ったgemがアップロードできるようになるので、アップロードする。

$ gem push ライブラリ名-0.0.1.gem
  Pushing gem to https://rubygems.org...
  Successfully registered gem: ライブラリ名 (0.0.1)

rubygemsのプロファイルページにgemが増えていると思うが、コマンドでも確認する。
プロファイルページの表示例。


$ gem list -r instagram-tag(ライブラリ名の一部)

*** REMOTE GEMS ***

instagram-tag-search (0.0.1)

検索可能なことを確認できたら、実際にインストールしてみる。
ローカルからインストールしたものがまだ残っているかもしれないので、念の為uninstallしておくこと。

$ gem uninstall ライブラリ名

通常のgemと同じくインストールする。

$ gem install instagram-tag-search
Fetching: mini_portile2-2.3.0.gem (100%)
Successfully installed mini_portile2-2.3.0
Fetching: nokogiri-1.8.4.gem (100%)Fetching: nokogiri-1.8.4.gem
Building native extensions.  This could take a while...
Successfully installed nokogiri-1.8.4
Fetching: instagram-tag-search-0.0.1.gem (100%)
Successfully installed instagram-tag-search-0.0.1
3 gems installed
自作gemが公開できた。

当然本来はテストコードなどを書くべき(公式でも In short: TEST YOUR GEM! Please! と悲痛な叫びが書かれている)だが、 最もお手軽にする方法は以上。

2018年5月14日月曜日

位置情報を共有するサイトを作る

GoogleMapの「現在地の共有」がよくわからない挙動をするので、自分で作った。

動作している図



IBM CloudのNode-RED上に構築することで、無料枠で運用できる。

構成図




ソースはgithubに。
config部分にあるfirebase情報を更新して利用してください。
Node-REDで構築したので、JavaScriptとCSSもHTMLファイル内に書いている。
デフォルトだと、3秒に1度、firebaseに位置情報をアップロードする。

せっかくfirebaseを使っているので、双方向の通信をしたり、いろんなユーザの情報を一箇所で見たりしたい。

2018年1月22日月曜日

Mattermost の Docker 版で日本語検索をなんとかする方法

職場で「Slack使ってみたいね〜」という声が聞こえてきたので、年末に記事で見かけたオープンソースのMattermostをインストールして使ってみた。


Mattermost

GIGAZINEの記事中には言及されていないが、Docker版ができていて、コマンド一発でお試しできる。
docker run --name mattermost-preview -d --publish 8065:8065 mattermost/mattermost-preview

Docker版で立ち上げると、面倒な設定なく始められる。

ただ、記事後半の日本語検索については同様の問題が発生する。
記事中にもあるようにこちらのサイトの通り設定していくが、少し手順が異なる。

まず、コンテナに接続する。
docker exec -it mattermost-preview /bin/bash
記事のように/etc/my.cnfを編集して…とやりたいが、Dockerイメージにはviすら入っていない。
面倒なので、追記モードで書き込む。
echo "[mysql]" >> /etc/my.cnf
echo "default-character-set = utf8mb4" >> /etc/my.cnf
echo "" >> /etc/my.cnf
echo "[mysqld]" >> /etc/my.cnf
echo "character-set-server = utf8mb4" >> /etc/my.cnf
echo "innodb_large_prefix = ON" >> /etc/my.cnf
echo "innodb_file_format = Barracuda" >> /etc/my.cnf
echo "innodb_file_format_max = Barracuda" >> /etc/my.cnf
 
ファイルを編集したら、 sudo systemctl restart mysql としたいが、Docker版はdebianベースなので、コマンドが違う。

以下のように読み替える。
sudo service mysql restart
sudo systemctl status mysql このコマンドも同様
sudo service mysql status
mysqlコマンドも mysql mattermost -u mmuser -p ではなく、
mysql mattermost_test -u mmuser -p
と入力し、パスワード入力画面で
mostest
と入力する。

これらの情報は、Dockerfileに環境変数として設定されている。
https://hub.docker.com/r/mattermost/mattermost-preview/~/dockerfile/




mysql内のコマンドは記事中にある通り、変更せずに入力できる。



2017年5月22日月曜日

IBMのWatson IoT PlatformでMQTTブローカを設定する方法

  • IoT Platformの作成
  • 必要情報の設定(1/2)
  • 必要情報の設定(2/2)
  • コマンドによる確認
の大きく分けて4段階で設定する。

IoT Platformの作成


IoT Bluemixのカタログから、
Internet of Things Platformを選択


遷移先のページでLiteを選択し、Create


Liteプランでは 500デバイス上限で、200MBまでの通信が使える。


遷移先のページでLaunch



デバイスタイプの設定


左のメニューからDEVICESを選択。



 Add Deviceを選択。


Create device type



もう一度Create device type


デバイスタイプの名前を設定


ここで設定した名前が「デバイスタイプ」となる。
他の人が使っていない名前にする必要がある。

入力したらnextを押して進む。


次にテンプレートを選ぶ画面になるが、選択しなくてOK。


そのままNext。


最後に確認画面が出るので、Next。


メタデータの設定も空欄でOK。
今までNextと書かれていた部分がCreateになるので、クリック。





すると最初の画面に戻り、先程設定した値が選択されていることを確認してNext。


Device IDを設定する。
入力したらNext。


またメタデータの入力画面になるので、空欄でOK。



次の画面で2通りの選択肢が与えられるが、自分は入力欄にトークンを入力した。


入力したら確認画面になるので、Addを押して作成。


作成したら、Organization IDをメモっておく。(URLにも入っている)


ここまでで、
  • デバイスタイプ 
  • デバイスID
  • トークン
  • Organization ID
が揃った。
あとはAPI Keyを設定する。



API Keyの設定

上記の流れで来ると、まだデバイスタイプのウィンドウが開いていると思うので、×ボタンで閉じる。


メニューのAPPSを選択。


Generate API Keyをクリック。


API KeyとAuthentication Tokenをメモして、Generateをクリック。
特に、Authentication Tokenは再確認しづらい(できない?)ので、確実に保存しておく。


mosquittoによる確認

mosquittoのコマンドで確認
-uオプションや-Pオプションはシングルクォーテーションでくくっておかないと、文字列とターミナルソフトによっては変数展開されてしまう。

サブスクライブ(Subscribe)コマンド(【パラメータ】を上記で取得したものに置き換え)

mosquitto_sub -i a:【Organization ID】:【App ID(任意の文字列)】 -h 【Organization ID】.messaging.internetofthings.ibmcloud.com -u '【API Key】' -P '【Authentication Token】'  -t "iot-2/type/【デバイスタイプ】/id/【デバイスID】/evt/【トピック】/fmt/json" -d 
 上記コマンドを実行し、
Subscribed (mid: 1): 0
このようなステータスで止まっていればサブスクライブ中。


サブスクライブとは別のターミナルで以下のパブリッシュ側コマンドを実行。

パブリッシュ(Publish)コマンド(【パラメータ】を上記で取得したものに置き換え)

mosquitto_pub -i d:【Organization ID】:【デバイスタイプ】:【デバイスID】 -h 【Organization ID】.messaging.internetofthings.ibmcloud.com -u "use-token-auth" -P '【トークン】' -t "iot-2/evt/【トピック】/fmt/json" -m '{"d":{"q":"適当なJSONメッセージ。dやqも変えて良い"}}' -d
上記コマンドを実行すると、サブスクライブ側で
{"d":{"q":"適当なJSONメッセージ。dやqも変えて良い"}}
のようにパブリッシュしたjsonメッセージが受信できているはず。


これで無料でMQTTブローカーが手に入る。

2017年3月26日日曜日

Kindle版が存在するかチェックするスクリプト

スクレイピングの練習でAmazonの書籍ページにKindle版があるか確認するスクリプトを書いた。

https://github.com/syamoji/kindleCheck

エラー処理は引数チェック以外何もしていない…。

2017年1月10日火曜日

Jupyter Notebook にPython3カーネルを追加する

このPython 3を追加する方法。

確かJupyter自体はpipか何かで入れた。

環境
macOS 10.12.2
python --version
Python 2.7.9
which python
/usr/local/bin/python

http://qiita.com/sasaki77/items/bfa53828c973ba46e34d
こちらに記載の
python3 -m IPython kernelspec install-self
python2 -m IPython kernelspec install-self 
という方法では自分の環境ではモジュールが見つからずエラーになった。
下記の方法で解決。

python3 -m pip install ipykernel
python3 -m ipykernel install
参考:http://stackoverflow.com/questions/28831854/how-do-i-add-python3-kernel-to-jupyter-ipython

2016年10月9日日曜日

電子ペーパーモジュール Y-Con P020を使う

http://www.yslab.co.jp/ycon_20.html?menu_id=EPD&sub_menu_id=4
この電子ペーパーモジュールを買ったまま動かしてなかったので動かした。

ページにある通り、 共立のこのモジュールを使ってWindowsから画像送信した。

共立のページにリンクがあるドライバをインストールして、あとはTeratermから画像を送信すれば良い。

ただMacでは1bitのBMP画像が作りづらかった。

まず何とかしてBMP画像を作る。自分はPixelmatorで作った。
サイズはモジュールの都合上、200x96にしておく。

 ImageMagickをインストールしていればconvertコマンドが使えるので、これを使う。

convert 作ったBMPファイル.bmp -colors 2 +dither -type bilevel 出力するBMPファイル.bmp

 出力結果はアンチエイリアスなどが省かれるため、ちょっとギザギザに見える。

Before


After


Macで見ると赤背景に緑文字で見えたりするけど、問題ない。

あとはTeratermとかで転送すれば映るはず。



白背景に黒文字でやったはずだけど、反転した。
そういうものかもしれない。

電源がなくても最後の状態が保持できるので何かに使えそう。
Raspberry Piとかに繋いで状態表示するのも良さそう。
そのためにはBMP画像を自動で作らないといけないけど。