ChinoDuino(Chino × Arduino)

自発性のないプログラマーがArduinoと出会って悪戦苦闘する様を綴っていく⇒今はいろいろ(^^;

アジャイルマニフェストのモブリーディング、あるいはアジャイルな雑談(アジャイル・スクラムイベント準備会 #1)

4月17日(水)に3回目を開催しました!その開催報告ブログになりますー

13人も参加していただいたき、本当にありがとうございました!

今回は、公開イベント + はじめてBOB(bring your own beer)形式で行いました。
大勢の方のご参加と、みなさん思い思いの飲み物 + おつまみを持参していただきありがとうございました🙏
BOB形式は、参加料を徴収して準備するよりは、

  • 自分にあわせて買ってこれる
  • 飲む方、飲まれる方の差ができない
  • 飲み物、お菓子の残り物も少なくなる

など、はじめての経験だったのですが、よい面もあり今後も活用していきたい!
ちなみに、BOB形式にしたのは、

ストイックさよりも、楽しさとか当日集まったメンバーでの化学反応とか、そっちのほうがアジャイルの文脈でいうところの自己組織化を実感しやすいかなー、と思ってます by @shigeshibu44

あと、PCを使わず、机をプロジェクターの前に配置して開催しました。

f:id:chinoppy:20190417200139j:plain

今回のテーマはモブリーディング

@shigeshibu44が準備してくれた、以下のスライドをもとに「とにかくこの時間を楽しみましょう!」をもっとーに進みました!

speakerdeck.com

以降もこのスライドをもとに記載しますので、あわせてみていただくと幸いですー

スプリントゴール

  • 今日のスプリントゴール
    • チームメンバーを知る
    • モブリーディングでアジャイルに関する学びを持ち寄り、持ち帰る
    • チーム名(サークル名)を決める

自己紹介

このあと、1分ずつ自己紹介をしました。
お題は

  • お名前
  • やってる仕事
  • アジャイル経験
  • 直近の週末で買った一番高いもの

みなさん、結構、アジャイルの経験がありびっくりしました(^^
それと、買ったものについては、お父さんが多く、子供のためのものが多かったですねw親ばかw

本題!

  • モブリーディングフォーマット
    • 12個ある事柄の疑問や悩みがあるポイントを付箋に書き出す(5分間)
      • 12個の項目の詳細については、スライドを参照お願いします!
    • 付箋が最も多かった項目についてディスカッションを行う
    • ディスカッション開始後10分で、同じ項目で継続するかを確認

制限時間があり、この時間を大切にするところはアジャイルでは大事

お約束の「付箋の外し方」の話もあり、初めて知った人はなるほどとなっていました(^^

付箋書き出しの結果

f:id:chinoppy:20190417194958j:plain

f:id:chinoppy:20190417194949j:plain

丸数字が付箋の数(4については、ディスカッション後に写真をとったため、付箋がありません。。。以降ででてきます。)

一番多かったのは4

  • 4.ビジネス側の人と開発者は、プロジェクトを通して日々一緒に働かなければなりません。

参加者の大半は、開発者側でビジネス側との関わり方に苦戦しているところなどありそうでした。

  • 開発者側のことをわかってくれない
  • 立場などが違うから理想は一緒にいたほうがいいが難しそう
  • そもそもビジネス側とは?
  • などなど
まずは4についてディスカッション!

最初のディスカッション項目が決まりました。

この項目について、「じゃあどのようにすれば、うまくいくか」を全員で付箋に書き、グループ分けをしました。

結果(付箋紙の中に「4」とかいてあるのが最初にでた疑問・悩みです)

f:id:chinoppy:20190417194905j:plain

  • ビジネス側に開発者側の理解を深めてもらう
  • 一緒の時間をつくる
  • しくみ(契約など)の問題

など、それぞれの意見がでて、いろいろな考えがあるなと勉強になりました。

さらに4についてディスカッション

多数決の結果、4を継続することに決定

次は「一緒にいると何がよいか」を全員で付箋に書き出して、グループ化

結果

f:id:chinoppy:20190428181043j:plain

ざっくりとしてですが、こんな感じになりました。

  • お互いの情報、状況を共有ができる
  • 結果としてよいことがある
  • 交流ができる!

やはり、私としてもチームを育てるという意味で、情報を共有したり、交流することにより、相手がどのような考えをするかを知ることは重要かなと思います。

ちなみに、このグループ化は、いつも@shigeshibu44さんがしていましたが、今回からはチームメンバ同士で行いました。

f:id:chinoppy:20190417195351j:plain

自己組織化への第一歩!

次のディスカッションは5に決定

多数決の結果、4とは別のディスカッションをすることに決定

次は5です

  • 5.意欲に満ちた人々を集めてプロジェクトを構成します。環境と支援を与え仕事が無事終わるまで彼らを信頼します。

まずは、最初にでた5の疑問・悩みをグループ化

f:id:chinoppy:20190417200551j:plain

結果

f:id:chinoppy:20190428185924j:plain

疑問・悩みとして、そもそも意欲に満ちた人々を集められない、どうやって集めたら良いのかという疑問・悩みがあり、次に、「どのようにすれば、意欲のあるひとを集められるか、意欲にみちたひとにできるか」を全員で付箋に書き出し

  • こんなことを思い浮かべながら書き出し
    • どのように意欲のあるひとに育てるか
    • 自分がどうしてこの場にくるようになったか
    • などなど

f:id:chinoppy:20190417195033j:plain

そして、いつものようにグループ化
ここまでくると、みんな、グループ化をしながら、付箋を貼るようになってきました
自己組織化進行中!

結果

f:id:chinoppy:20190417201936j:plain

この結果も印象がありました。

  • 成果で盛り上げるひと(お金など)
  • 意欲のあるひとと組ませて盛り上げるひと
  • 目的を明確にするひと

ひとそれぞれ、違うんだなぁっと改めて感じました。

時間の関係もあり、今回のディスカッションはここまで。
意見がまとまらなかったり、参加人数が多い分、話題が2つに別れてしまったりありましたが、無事終了!

グループ化が意外に難しいなぁっと実感しました。。。(^^;
あと、人数が多い分、それぞれの意見が混ざり、どのようにまとめていけばよいか、難しいと感じた。。。

最後にチーム(サークル)名決め

@shigeshibu44さんが考えてきてくれた案 + 会場ででた案でどうするか考え中

f:id:chinoppy:20190417205524j:plain

そして、最後に多数決

Agile Nagano」に決定!

・・・ですが、「Nagano」だと長野市周辺のようなイメージもあり、今後、中信や東信や南信の方とも今後、絡めればよいと思いを込めて

Agile Shinano」になりました!

connpassグループも作ったので、ぜひ、Joinお願いします! 前回、参加者の方には、メールで連絡させてもらいました。あわせてご確認お願いします🙏

今後は、こちらのグループでイベント告知しますー

agile-shinano.connpass.com

最後にFun-Done-Learn

f:id:chinoppy:20190417211835j:plain

今回は、Fun + Learnと、真ん中も多く、開催してよかったなぁっと実感しました😭

その他、所感等

  • 付箋を書くときは、サインペンなどの少し太めのペンの方がよい
    • 細いとみんなで見るときに見辛く、目立たなくなってしまう
    • 今回、サインペンとボールペンの併用でした
  • 今回は、2チームにした方がよさそうだったが、コーチがいないため1チームでよかったと思う
  • お互いを知り、受け入れながら進んでいかないと、本当に収集がつかなくなってしまうなぁっと感じた
  • 最近、すごく思うのが、アジャイルの考え方は、そのチームにあったかたちで運用すれば、どこでも使えると感じています
  • なんでもお互いの意見を尊重し、受け入れながら進められたらよいなぁと思いました(「正解はない」)
  • 時間管理をしっかりしているので、短い時間でしたが、時間以上のディスカッションができたと思う!

今後について

ざっくりとですが、

  • 5月に「スクラムガイド」を使って簡単なゲーム的なもの
  • 5月開催時の最後に、本編でやりたいことを話す
  • 6月はその予習
  • 夏頃本編

今後ともよろしくお願いします!

pre-commit の Add trailing commas と isort の自動修正箇所が被りハマった話

pre-commitを使う機会があり、その中で、 Add trailing commasisort の自動修正が被り、commitできなかった話です。。。

書かないこと

  • pre-commitとはなにか
  • Add trailing commasとはなにか
  • isortとはなにか

などのどんなものかは書きません🙏

現象

・・・
# 自動修正される箇所
from .base import classA, classB, classC, classD, classE, classF
・・・
commit 実行
↓
まず、Add trailing commas側で以下のように自動修正
整形され、最後に「,」がつく
↓
・・・
from .base import (
    classA, classB, classC, classD, classE,
    classF,
)
・・・
↓
次に、isort側で以下のように自動修正
↓
・・・
from .base import (classA, classB, classC, classD,
                   classE, classF)
・・・

最後の「,」がなくなってしまうため、自動修正された変更をステージングにあげて、再commitしても、Add trailing commasでまた自動修正が発生、isortでも自動修正してしまい、commitができなくなってしまった。。。

対応内容

isortの設定ファイルを追加

isortリポジトリを確認したところ、設定ファイルを追加し、フォーマットをあわせることにより、解決できそうとわかりました

  • 設定ファイル「.isort.cfg」を追加
  • そこに以下を追加
    • 自動修正箇所のフォーマット をadd trailing commasと同じフォーマットにする設定を追加

.isort.cfg の内容

[settings]
multi_line_output=5

seed-isort-configライブラリを追加

しかし、「.isort.cfg」の格納場所が、 ホームディレクトリ or 環境変数に追加 する必要があるため、リポジトリ直下に配置が可能になるseed-isort-configを追加しました(ただし、ライブラリ本来の目的とは違うかもですが・・・)。

あと、.isort.cfgに include_trailing_comma : add trailing commasを使っているかの設定? を追加

# [seed-isort-config](https://github.com/asottile/seed-isort-config)をインストール
(env) $ pip install seed-isort-config

# リポジトリ直下に、.isort.cfgを配置
(env) $ cd <リポジトリルート>
(env) $ ls -la
・・・
-rw-r--r--   1 user  staff   135  4 27 22:52 .isort.cfg
・・・

.isort.cfg の内容

[settings]
multi_line_output=5
include_trailing_comma=True
known_third_party = xxx, yyy, zzz

これでいったん解決しました。

KPTをKPTで振り返る(アジャイル・スクラムイベント準備会 #0.5)

3/20(水)19:00〜ぎーらぼで、アジャイルスクラムイベント準備会 #0.5を開催しました。

0.5にしたのは、まだまだわからないことばかりなので、公開イベントではなく、社内を対象として開催したため。

次回からは、公開イベントにする予定です!

今回、学んだこと、感じたこと

  • やっぱり、KPTのことをちゃんと理解していなかった
    • 反省会になっていた・・・
  • たちどまってふりかえる
    • これは今回のKPTKPTで振り返るで実施
  • 部分最適から全体最適
    • ひとりひとりの改善ももちろん必要だが、チームとして、誰がかけても、同じアウトプットをだせるようにする
    • 自分のことばかり振り返っていた
    • チームとしてやメンバーのことを振り返っていなかった
  • 情報の鮮度が重要
    • 今は、月一のKPTだが、1ヶ月分すべてを振り返るのはちょっと難しい(覚えていない)
    • 日報を書くとか、感じたときに書き留めておくなどがよさそう
  • ひとつずつだす(Keep→Problem→Try)
    • KeepとProblemを一緒にだすとProblemしかでない(体験済み・・・)
    • すべて具体的な必要はない(KPTをたくさんだすためや、所感なども大事)
  • 問題をすべて解決する必要はない
    • マイナスをプラスにするにはすごく労力がかかる
    • よいものをもっと伸ばす
    • でたTryに優先順位をつけるのが重要

やったこと

  • ふりかえりとは
  • KPTKPTで振り返る
  • Fun-Done-Learn

ふりかえりとは

speakerdeck.com

こちらのスライドをもとに、ふりかえりについて、説明をもらいながら自分のことなどにもあてはめて、考えてみました。

スライドの内容のワークショップまではできませんでしたが、いろいろな手法など書いてあり、今後もリファレンス的な感じで使用させていただきます!

KPTKPTで振り返る

社内で行っていた直近のKPTをもとに以下を実施しました

  • 直近のKPTをみる
  • そのKPTのKeepを付箋に書く(3分)→ホワイトボードに貼る
  • 次にProblemを付箋に書く(3分)→ホワイトボードに貼る
  • ホワイトボードに貼ったKeep、Problemを、それぞれグループ分けする。今回は
    • Keep
    • 雰囲気
    • 具体性
    • プロセス
    • 関係
  • Problem
    • ネガティブすぎる
    • チーム意識が低い
    • 具体性の欠如
  • グループ分けしたものを見ながらTryを付箋に書く(3分)→ホワイトボードに貼る
  • 最後に、Keepにドット投票(ひとり2票ずつ)して次のTryを決める(優先づけ)
    • この結果
      • 感謝のKeep1万回
      • Tryを具体的に書く(5W1H的な)

f:id:chinoppy:20190320205411j:plain
KPTKPTで振り返った結果

これを実施してみて、自分のKPTは、本当に自分のことしか振り返ってないなぁっと実感。。。

Fun-Done-Learn

今回は、学びが多かったです

f:id:chinoppy:20190320210254j:plain
Fun-Done-Learn

次回の内容はまだ未定ですが、公開イベントとして準備会を開催しますので、興味ある方はぜひぜひ、ご参加お願いしますー

アジャイルなプロセスでアジャイルなイベントづくり(準備会をひらきました)

エンジニア組織論への招待を読んで、「アジャイル」を勘違いしていることに気がつきました。。。

ざっくりですが、、、

  • 読む前 :アジャイルという開発手法
  • 読んだ後:チーム全体に対してメンタリングを行い開発出力を向上させる方法論

よく、ウォーターフォールと対比?することがある印象だったけど、根本的に違うことだと知り、「チームを育てる」というところに、すごく感銘を受けました。

「プロダクト」と「プロジェクト」の違いも、意識したことがなく、そのあたりもアジャイルを採用するかなどの判断材料になるんだぁっとすごく勉強になりました。

準備会開催までのこと

そんななか、

と、長野市アジャイルスクラムイベント的なのを開催しようということで、今回、私を含め3人で準備会をしてみました。

ちなみに私は、スクラムで開発は未経験。。。

一応、イベントの流れとしてざっくりと

  • 最初に、スクラムとはのお話し
  • スクラムを体験するワークショップ的なこと
  • 可能であれば、イベント開催前に、少しずつでも体験したい

という感じで考えてました。

準備会を開催

@shigeshibu44さん主導のもと、まずは、目的から決めようということで、5W1Hで考えを抽出

最終的に、

  • 見込まれる参加者は、業務などで実践的に使用していない方が多い?と予想される
  • イベント開催して、スクラムマスターの方にお話ししてもらったとしても、ふーんで終わってしまいそう
  • それであれば、興味のある方たちと準備会みたいなものゆるーく開催して、今、会社などでこんな課題があるので、どうやったら解決してよいかなどを話し合って、聞きたいことをもっと具体的にした方がよくないか
  • アジャイル的な手法で、イベントの内容を決めていったらどうか

ということで、最初に当日、やる内容を決めず、まずは定期的に準備会をゆるーく開催して、私も含め周りを巻き込んで、理解を深めていった方がよいのではといこうとなりました!

@shigeshibu44さんが、アジャイルなプロセスでアジャイルなイベントづくりをしていけばというネ申発言をいただきました!

今後

  • 手探り感満載なので、まずは社内で「準備会 #0.5」を開催
    • 内容:社内で実施しているKPTKPTで振り返る(KPTをしてみてどうだったかなど)
  • その後「準備会 #1」として、公開イベントにする予定!

Fun-Done-Learn

最後はFun-Done-Learn

f:id:chinoppy:20190304203656j:plain

参加者それぞれが、5分間で、今日の「楽しかったこと」「決まったこと」「学んだこと」を付箋に書き、ホワイトボードに貼る。

結果、今回の準備会は、楽しく、学んだことが多い結果となり、開催してよかったと感じました。

ありがとうございました(TT)

実際に実践している、興味のある方、初心者の方(私もですがw)など、ぜひ、今後よろしくお願いします!

Notionを使ってみて

後輩ちゃんから、Notionというオンラインノートサービスを教えてもらい、さっそく使い始めたので、直近の感想などを書きます

www.notion.so

使い始めるきっかけになれば、うれしいです!

参考

こちら、参考にさせていただきました!ありがとうござます。

note.mu

note.mu

lapis-zero09.hatenablog.com

背景

TrelloNozbeAsanaを使ってきて、まだこれだ!というサービスがありませんでした。。。

Notionは、まだ完全に移行していないけど、気にいってます!

第一印象

  • 文字の横に絵文字があり、わかりやすい
  • Templateをみて、パーツが豊富で、すごくひきつけられた

Template 例

Team

f:id:chinoppy:20190219002811g:plain
Team

Personal

f:id:chinoppy:20190219003711g:plain

今まで使っていたサービスは、リストが主=文字ばかりで、グループ分けしても、直感的にわかりづらかった・・・

わたしの使い方

「Team Home」「Personal Home」「Lightweight To-do's」のテンプレートをもとにカスタマイズして使用中

Team Home

f:id:chinoppy:20190219011646p:plain

  • Office, Health・・・/Office Calendarは未使用
Repeat

週次・月次作業の覚書

f:id:chinoppy:20190219011950p:plain

Team NoteBook

今後やりたいことや、覚書

f:id:chinoppy:20190219012202p:plain

Personal Home

f:id:chinoppy:20190219013753p:plain

TODO

Pageでグループわけをして使用中

f:id:chinoppy:20190219020938g:plain

Travel

どこか行きたいリストみたいなものも書いていただけど、テーブルでかけたり、↓の感じで自分でFilterを設定できて便利(「Done」のFilterを設定してます)

f:id:chinoppy:20190219201920g:plain

Movie List

「Web Bookmark」を利用して、URLを入力するとサムネイルみたいな感じになって、わかりやすい! (今までは、URLのみでパット見よくわからなかったです・・・)

f:id:chinoppy:20190219210407g:plain

Book List

これも、TODOと同じように、Pageを使って種類別にわけてます

f:id:chinoppy:20190219231122g:plain

NoteBook

こちらは、Team Homeと同じように、今後やりたいこととか、覚書という感じ

f:id:chinoppy:20190219231714p:plain

その他

簡単なTODOは「Lightweight To-do's」というテンプレートを使いました

f:id:chinoppy:20190219232040p:plain

気に入っているところ
  • テンプレートが豊富(使用時の参考にもなる)
  • パーツが、かなり自由に配置できる
  • アイコンをつけることでビジュアル的に見分けられる
対応してほしいなぁというところ

わたしが使っている範囲ですが、、、

  • ショートカットキーでコピペできるようにしてほしい。。。
  • Googleカレンダーと連携できてほしい

あと、他ユーザとの共有設定などもあるようなので、みせあいっこしたりするのも、刺激になったりしてよさそうですね!

今後も使っていきたいです

Google Cloud IoT Coreの環境構築ではまったところ(デバイス側)

この記事は、Google Cloud IoT Coreを試そうと思い、Raspberry Pi 1 Model Bに環境構築したときに、はまったことの備忘録

【目次】

試したこと

こちらの記事を参考に、サンプルソースを使用してMQTTでPublishする!

qiita.com

サンプルソースはこちら

github.com

環境

$ cat /proc/cpuinfo
processor   : 0
model name  : ARMv6-compatible processor rev 7 (v6l)
BogoMIPS    : 697.95
Features    : half thumb fastmult vfp edsp java tls
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part    : 0xb76
CPU revision    : 7

Hardware    : BCM2835
Revision    : 000e
Serial      : 00000000ad5e97c1
  • OS:Raspbian Stretch Lite
$ cat /etc/debian_version
9.6
$ uname -a
Linux modelb1 4.14.79+ #1159 Sun Nov 4 17:28:08 GMT 2018 armv6l GNU/Linux
  • Python3.5

はまったこと

grpcioライブラリのインストールが終わらない・・・

pip install 後、grpcioライブラリのインストールが完了しない

事象

以下のmqtt_example内にある「requirements.txt」をダウンロード

github.com

Pythonの仮想環境を作成して、pip installしたところ発生

# 仮想環境作成
$ python3 -m venv venv
# activate
$ source venv/bin/activate
(venv) $ pip install -r requirements.txt
・・・
・・・
Building wheels for collected packages: grpcio
  Running setup.py bdist_wheel for grpcio ... \
解決

ネ申issuesがあり解決

github.com

ソースからビルドする必要があり、非常に時間がかかるとのこと。このため、プラットフォームごと、バイナリファイルを以下のURLにアップロードしてくれてあった!

バイナリファイル

ダウンロードして解決!本当に助かりました。あざます(>_<)

# whlファイルをダウンロード
$ wget https://www.piwheels.hostedpi.com/simple/grpcio/grpcio-1.16.1-cp35-cp35m-linux_armv6l.whl#sha256=fdf4f70b0328309bc0d5c8fd5e4485ef7344ced0a1def8ffa0638e58dcb269f3
# 事前にインストール→解決!
$ pip install grpcio-1.16.1-cp35-cp35m-linux_armv6l.whl
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Processing ./grpcio-1.16.1-cp35-cp35m-linux_armv6l.whl
Collecting six>=1.5.2 (from grpcio==1.16.1)
  Using cached https://files.pythonhosted.org/packages/73/fb/00a976f728d0d1fecfe898238ce23f502a721c0ac0ecfedb80e0d88c64e9/six-1.12.0-py2.py3-none-any.whl
Installing collected packages: six, grpcio
Successfully installed grpcio-1.16.1 six-1.12.0

TypeError: unsupported operand type(s) for -=: 'Retry' and 'int'

上記のgrpcioライブラリのインストール成功後に、pip installしたところエラーが発生・・・

事象
(venv) $ pip install -r requirements.txt
・・・
・・・
Exception:
Traceback (most recent call last):
  File "/home/pi/google_cloud_iot_core/venv/share/python-wheels/urllib3-1.19.1-py2.py3-none-any.whl/urllib3/connectionpool.py", line 594, in urlopen
    chunked=chunked)
  File "/home/pi/google_cloud_iot_core/venv/share/python-wheels/urllib3-1.19.1-py2.py3-none-any.whl/urllib3/connectionpool.py", line 391, in _make_request
    six.raise_from(e, None)
  File "<string>", line 2, in raise_from
  File "/home/pi/google_cloud_iot_core/venv/share/python-wheels/urllib3-1.19.1-py2.py3-none-any.whl/urllib3/connectionpool.py", line 387, in _make_request
    httplib_response = conn.getresponse()
  File "/usr/lib/python3.5/http/client.py", line 1198, in getresponse
    response.begin()
  File "/usr/lib/python3.5/http/client.py", line 297, in begin
    version, status, reason = self._read_status()
  File "/usr/lib/python3.5/http/client.py", line 266, in _read_status
    raise RemoteDisconnected("Remote end closed connection without"
http.client.RemoteDisconnected: Remote end closed connection without response

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/pi/google_cloud_iot_core/venv/lib/python3.5/site-packages/pip/basecommand.py", line 215, in main
    status = self.run(options, args)
  File "/home/pi/google_cloud_iot_core/venv/lib/python3.5/site-packages/pip/commands/install.py", line 353, in run
    wb.build(autobuilding=True)
  File "/home/pi/google_cloud_iot_core/venv/lib/python3.5/site-packages/pip/wheel.py", line 749, in build
    self.requirement_set.prepare_files(self.finder)
  File "/home/pi/google_cloud_iot_core/venv/lib/python3.5/site-packages/pip/req/req_set.py", line 380, in prepare_files
    ignore_dependencies=self.ignore_dependencies))
  File "/home/pi/google_cloud_iot_core/venv/lib/python3.5/site-packages/pip/req/req_set.py", line 620, in _prepare_file
    session=self.session, hashes=hashes)
  File "/home/pi/google_cloud_iot_core/venv/lib/python3.5/site-packages/pip/download.py", line 821, in unpack_url
    hashes=hashes
  File "/home/pi/google_cloud_iot_core/venv/lib/python3.5/site-packages/pip/download.py", line 659, in unpack_http_url
    hashes)
  File "/home/pi/google_cloud_iot_core/venv/lib/python3.5/site-packages/pip/download.py", line 853, in _download_http_url
    stream=True,
  File "/home/pi/google_cloud_iot_core/venv/share/python-wheels/requests-2.12.4-py2.py3-none-any.whl/requests/sessions.py", line 501, in get
    return self.request('GET', url, **kwargs)
  File "/home/pi/google_cloud_iot_core/venv/lib/python3.5/site-packages/pip/download.py", line 386, in request
    return super(PipSession, self).request(method, url, *args, **kwargs)
  File "/home/pi/google_cloud_iot_core/venv/share/python-wheels/requests-2.12.4-py2.py3-none-any.whl/requests/sessions.py", line 488, in request
    resp = self.send(prep, **send_kwargs)
  File "/home/pi/google_cloud_iot_core/venv/share/python-wheels/requests-2.12.4-py2.py3-none-any.whl/requests/sessions.py", line 609, in send
    r = adapter.send(request, **kwargs)
  File "/home/pi/google_cloud_iot_core/venv/share/python-wheels/CacheControl-0.11.7-py2.py3-none-any.whl/cachecontrol/adapter.py", line 47, in send
    resp = super(CacheControlAdapter, self).send(request, **kw)
  File "/home/pi/google_cloud_iot_core/venv/share/python-wheels/requests-2.12.4-py2.py3-none-any.whl/requests/adapters.py", line 423, in send
    timeout=timeout
  File "/home/pi/google_cloud_iot_core/venv/share/python-wheels/urllib3-1.19.1-py2.py3-none-any.whl/urllib3/connectionpool.py", line 643, in urlopen
    _stacktrace=sys.exc_info()[2])
  File "/home/pi/google_cloud_iot_core/venv/share/python-wheels/urllib3-1.19.1-py2.py3-none-any.whl/urllib3/util/retry.py", line 315, in increment
    total -= 1
TypeError: unsupported operand type(s) for -=: 'Retry' and 'int'
解決

こちらを参考に、パッケージの更新、pipの再インストール、virtualenvで仮想環境を作成するようにしたところ解決

Python 開発環境のセットアップ  |  Python  |  Google Cloud

パッケージの更新等
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt install python python-dev python3 python3-dev
pipの再インストール

ディストリビューションpython-pipをインストール済みだったが、「pip を自分でインストールして、最新バージョンを入手することをおすすめします。」と記載があり実施

# ディストリビューションのアンインストール
$ sudo apt-get remove python-pip python3-pip
# pipをインストール
$ wget https://bootstrap.pypa.io/get-pip.py
$ sudo python get-pip.py
$ sudo python3 get-pip.py
virtualenvで仮想環境を作成
# virtualenvをインストール
$ sudo pip install --upgrade virtualenv
# 仮想環境作成(python3で作成)
$ virtualenv -p python3 env
# activate
$ source env/bin/activate
# 事前にgrpcioライブラリをインストール(仮想環境を作成しなおしたので再インストール)
$ pip install grpcio-1.16.1-cp35-cp35m-linux_armv6l.whl
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Processing ./grpcio-1.16.1-cp35-cp35m-linux_armv6l.whl
Collecting six>=1.5.2 (from grpcio==1.16.1)
  Using cached https://files.pythonhosted.org/packages/73/fb/00a976f728d0d1fecfe898238ce23f502a721c0ac0ecfedb80e0d88c64e9/six-1.12.0-py2.py3-none-any.whl
Installing collected packages: six, grpcio
Successfully installed grpcio-1.16.1 six-1.12.0
# ライブラリのインストール
(env) $ pip install -r requirements.txt

Publish成功!

無事インストール完了し、以下を実行したところ、publishに成功!

(env) $ python cloudiot_mqtt_example.py --registry_id=CloudIoTCoreTest --project_id=secret-footing-227506 --device_id=modelb1 --algorithm=RS256 --private_key_file=./rsa_private.pem --cloud_region=asia-east1
Creating JWT using RS256 from private key file ./rsa_private.pem
Subscribing to /devices/modelb1/commands/#
Publishing message 1/100: 'CloudIoTCoreTest/modelb1-payload-1'
on_connect Connection Accepted.
Publishing message 2/100: 'CloudIoTCoreTest/modelb1-payload-2'
Publishing message 3/100: 'CloudIoTCoreTest/modelb1-payload-3'
Received message 'b''' on topic '/devices/modelb1/config' with Qos 1
Received message 'b''' on topic '/devices/modelb1/config' with Qos 1
on_publish
Publishing message 4/100: 'CloudIoTCoreTest/modelb1-payload-4'
on_publish
on_publish
on_publish
Publishing message 5/100: 'CloudIoTCoreTest/modelb1-payload-5'
on_publish
Publishing message 6/100: 'CloudIoTCoreTest/modelb1-payload-6'
・・・・

参考

他、参考にしたページなど

github.com

Alfred3のWorkflowsでブラウザに複数サイトを一発でひらいちゃおう

これは、JSL (日本システム技研) Advent Calendar 2018 18日目の記事です!

関わっているプロジェクトごと、Chromeのウィンドウをひとつ開いて、そのタブにWebサイトをブックマークからひらく・・・。

これを毎日、繰り返しいるのはつらいと思い、Alfred3もインストールしていたので、Workflowsを使ってコマンド一発でひらくようにしてみたおはなし。

【目次】

めざすもの

ランチャーにキーワードを入力して一発でブラウザ+複数サイトをタブに表示する!


hatena alfred 完成

前提

  • Alfred3はインストール済み
  • Alfred PowerPack購入済

Workflowsをつくってみる

Blank Workflowを追加

  • Workflowsを選択
  • 画面下の「+」→「Blank Workflow」を選択

f:id:chinoppy:20181218004625p:plain
Blank Workflowを追加

  • Nameを適当な名前にする
  • 右下の「Create」をクリック

f:id:chinoppy:20181218004824p:plain
Blank WorkflowのName等

ランチャーで開けるようにKeywordを指定

  • 黒い部分で右クリックして「Inputs→Keyword」を選択

f:id:chinoppy:20181218005851p:plain
Keyword

  • ランチャーで開くときのKeyword(今回は「hatena」)を入力
  • 右下の「Save」をクリック

f:id:chinoppy:20181218010040p:plain
Keyword

新しいウィンドウを開く

プロジェクトごと別ウィンドウにしたいので「Run NSAppleScript」で新しいウィンドウを開く

  • 黒い部分で右クリックして「Actions→Run NSAppleScripts」を選択

f:id:chinoppy:20181218010710p:plain
Run NSAppleScript

  • AppleScript部分に以下を記入
  • Cache compiled AppleScriptをチェック
  • 右下の「Save」をクリック
on alfred_script(q)
    tell application "Google Chrome"
        make new window
        activate
    end tell
end alfred_script

f:id:chinoppy:20181218010829p:plain
Scriptを記載

Open URLでサイトを開く

  • 黒い部分を右クリックして「Actions→Open URL」を選択

f:id:chinoppy:20181218011106p:plain
Open URL

  • URLに開きたいサイトのURLを記入
  • BrowserをChromeにする
  • 右下の「Save」をクリック

f:id:chinoppy:20181218011245p:plain
Open URLでサイトとBrowserを指定

開きたいサイト分、この「Open URLでサイトを開く」を繰り返す

最後に線で繋げば完成!


hatena alfred

最後に

ちょっとちからずくなところもありますが、、、これで一秒でも速く仕事を始められる!w