趣味と学びの雑記帳

プログラミング学習や開発、農業の仕事のことなど。思考の整理と備忘録です。

技術ライティング講座 第2回「Twitterの活用」まとめと演習

ノンプロ研で開催されている「技術ライティング講座 第5期」にホストとして参戦中。

tonari-it.com

5/18(水)、2回目の講座が開催されました。
今回もまとめと演習に取り組んでいきます。

講座内容まとめ

2回目のテーマはTwitterの活用」です。
なぜTwitterが良いのかというところから、効果的な運用方法や発信のやり方を課題を通じて1から実践するような内容でした。

togetter

当日の受講生たちのツイートまとめです。
このようにノンプロ研では受講中Twitterでのアウトプットを推奨しており、毎回講師の方がまとめを作ってくれています。

togetter.com

講座のアジェンダ

  1. Twitterとそのはじめかた】
  2. Twitterの活用】

内容

ひとつめの【Twitterとそのはじめかた】では、Twitterの特徴と最初にやることを学びました。
Twitterを始めて最初にやることとして、以下の5つが挙げられます。

  1. テーマ決め
  2. プロフィール設定
  3. ツイート固定
  4. フォロー
  5. リスト作成

まず、自分がどんな人なのかを知ってもらうために「テーマ決め」「プロフィール」「ツイート固定」で発信する内容を固めます
その次に、気になる情報を集められるように「フォロー」「リスト」を運用するようにします。

ふたつめの【Twitterの活用】では、Twitterでやることとおすすめツールについて学びました。

Twitterでやることは、整理すると以下のように基礎編、発信編、事後編の3種類あります。

中でも発信編の「引用リツイート」「ツイート」を増やすことで書く練習になるので、特に意識して使うようにすると良さそうです。
また、その際には学習しながら呟く積極的ツイートがおすすめ。これからやること・調べたこと・気付きや質問・まとめ・備忘など…学習しながら呟くと、学習効果も高く質問に対しての反応もあったりすることも。

Twitterの手軽さを利用して、小さいところから文章を書く練習をしていきましょう。

演習

さて、今回も講座内で出てくる演習に取り組んでみました。
現時点でできていないものもあり、継続課題が多くなってしまいました。

◯ -> 質問(講座中にチャットで回答)
★ -> 宿題

◯演習2-1

みなさんはTwitterを使ってますか?
使っているとしたらどんな用途で使っていますか?

👉
コミュニティ活動、ブログ発信、自分の思考のメモに活用しています。

◯演習2-6

みなさんはTwitterはどのデバイス・どんなクライアントで使っていますか? (Twitter公式スマホアプリ、PC Chromeブラウザなど)

👉

ちなみにノンプロ研の講座中は、ブラウザでTweetDeckを開いて、その中で「#ノンプロ研」「#ライティング講座」といったハッシュタグを並列で開きながら、自分自身のツイートへ返信(スレッド機能)する形でツイートしています。講師のタカハシさんも見せてくれましたね。
このツールを使うと、発信と他の人のツイート確認が同時にできてとても便利です。 https://tweetdeck.twitter.com/

◯演習2-7

みなさんは、いつ・どんなときにTwitterを使ってますか?

👉

  • 仕事中にふと空いたとき
  • 何かメモとして残したいとき
  • オンラインイベント参加時

イベント中は、関連ワードやハッシュタグで検索かけて、同じイベントに参加している人を探してみたり。

◯演習2-7

Twitterでトラブルに巻き込まれた、トラブルを見かけたということはありますか? それはどんなトラブルでしたか?

👉
今のところないと思う。
炎上してるなーと思っても近寄ってないだけかも。平和が一番。

★演習2-2:プロフィールの見直し

Twitterのプロフィールとユーザー名の設定を見直してみましょう。 自身のプロフィールページへのリンクと、変更したポイントについて教えてください。

👉
前回の技術ライティング講座の時に固めたものから少し追加&修正。

おおさき🥔小さなIT活用で快適な農場づくりを! (@massa_potato) | Twitter

意識している点はこんなところかなー。

  • 自分は何者か(畑作農家、プログラミング等学んでいること)
  • わかりやすいキャッチフレーズ(『小さなIT活用で快適な農場づくりを!』)
  • 興味のあること、やっていること(ノンプロ研のこと、プログラミング言語やノーコード、IoT)
  • 自身の宣伝(noteやstoresへのリンク)

★演習2-3:ツイート固定

これぞ!というツイートを固定しましょう。 そして、そのURLリンクを教えてください。

👉
新たに自己PRツイートを投稿して固定しました。
勢いで「気になるツール等あればご連絡下さい!」と書いてしまったけど、仮に「使いたい!」という連絡が来た場合に、スムーズに共有できる自信もスキルもないですね。笑
なんとかなるんじゃないかな…。その時考えよう。

★演習2-4:100アカウントフォロー

Twitterで新たに100アカウントをフォローしてみましょう。

👉
2022/05/17時点で、968フォロー中。(そして649フォロワー)
これは講座期間中にどれだけ増えたか計測してみます。
キーワードは「農家、農業経営」「農業IoT」「ものづくり、個人開発」みたいなので攻めてみようかなー。

噂の宿題。

この課題の「100アカウント」というのがすごく絶妙で、だんだんキツくなるけどコツコツ取り組めば達成できる筋トレのような課題だなと感じます。(フォロワーを増やす…だと無理ですけど、ここではフォローを増やせば良いのです)

手当たり次第誰でも増やせば良いと言うわけでもありませんが、誰をフォローするかという自分なりの判断基準を養うのも、一度色んな人をフォローしてみないとわからないんですよね。
普段何となくTwitterを眺めちゃうときに、ちょっとだけ意識して気になるキーワードやハッシュタグで検索かけて増やしていくのが良いのかなーと思います。

★演習2-5:リストの運用

いくつかのリストを作成して、アカウントを追加してみましょう。どんなリストを作ったか教えてください。 すでに複数のリストをお持ちであれば、必要に応じて見直してみましょう。

👉
すでにリストを作っていたので、見直して以下のリストに分けました。

  • tw_メイン:追っかけたいアカウント
  • tw_農業:農業関係のアカウント
  • co_ノンプロ研
  • co_soracom関連
  • co_やってみる部
  • co_北海道IT関連
  • ev_技術ライティング005

これまでどうにもリスト運用が面倒くさくなってしまい、うまく運用できていませんでした。
なぜうまくいかないのか考えてみると、以下のような原因に思い至りました。

  • 気になるジャンルでリストを細分化しようとしていた
  • フォローしている人を必ずどれかのリストに入れようとしていた

例えば僕は、これまで「農業」「プログラミング」「ノーコード」「IoT」みたいにジャンルごとに分けてしまい、リストを細分化しすぎていました。
これだと見ないリストも増えてしまうし、どこに分類すれば良いか悩んでしまうアカウントもあったりして迷います。
結果、リスト運用が面倒くさくなる。綺麗なリストを作ろうとして活用できないのは本末転倒です。

なので実際にリストを活用するケースを考えて、以下のような基準を作って「コト」よりも「ヒト」に着目してリストを分けることにしました。

  • tw 常時見たい=情報を入れたいアカウント(数を絞る)
  • co コミュニティで繋がったアカウント(都度)
  • ev イベントの際にチェックしたいアカウント(都度)

大変失礼ではありますが、参加したコミュニティやイベントでせっかく繋がっても、僕の処理能力だとどの方だなのかわからなくなってしまうことが多いです…。
コミュニティやイベントごとのリストがあると後から思い返すこともできそうですし、イベント参加前にそのリストをチェックしてから望むのも、学習効果が高そうです。

★演習2-8:1日5回以上のアウトプット

1日5回以上のツイート・引用リツイートを目指して運用してみましょう。 しばらく運用したのち、反応が良かったツイートのリンクと、どうして反応が良かったのかの考察を共有してください。

👉
継続課題。
もともと呟く癖がないので、かなり意識しないと1日5回って難しいですね。

★演習2-9:スレッドで学習したことを発信

今週、何らかの学習の時間を確保し、スレッドを使ってそのやること、気づき、質問、ぼやき、まとめの一連をまとめてみましょう。 そして、その最初のツイートのリンクを共有してください。

👉
こちらも、継続課題。
僕は勉強したり本を読んだりするときは、愛用のマークダウンエディタにメモなどを残しておくようにしています。なのでそれを整理してツイートするように心がけてみようと思います。

おわりに

かなり重めな宿題が並んでいますが、全てをやるとなんと、Twitterアカウントの土台が完成するんです。すごいカリキュラムですよね。
継続して取り組んでいきたいなと思います。

技術ライティング講座 第1回「技術ライティングの概要」まとめと演習

ノンプロ研で開催されている「技術ライティング講座 第5期」にホストとして参戦中。

tonari-it.com

5/11(水)、1回目の講義が開催されました。
僕も受講生の皆さんと一緒に、こちらのブログで演習に取り組んでいきます。

講座内容まとめ

初回のテーマは「技術ライティングの概要」です。
ライティング講座受講の心構えや習慣の見直し、自身のテーマについて考えるという内容でした。

togetter

当日の受講生たちのツイートまとめです。
このようにノンプロ研では受講中Twitterでのアウトプットを推奨しており、毎回講師の方がまとめを作ってくれています。

togetter.com

講座のアジェンダ

  1. 【書くことの意義】
  2. 【書くのがしんどい理由】
  3. 【何をどこに書くのか】

内容

まず【書くことの意義】としては、「学習効果」と「価値提供」が挙げられます。
インプットよりもアウトプット重視の学習の方が学習効果が高く、また一度書いたものはあちこちで価値を提供してくれて信頼やチャンスを生み出します。

次に【書くのがしんどい理由】として、「習慣の問題」「メンタルの問題」「技術の問題」が挙げられます。
この中で特に改善すべきこととして「習慣の問題」にフォーカス。やる気に頼らずに自分の時間を先にロックしたり、宣言・記録することが習慣化には重要です。

最後に【何をどこに書くのか】については、同じことをtwitterやブログ・技術書にまとめるなど色んなところに書くのが効果的なことと、書く内容のテーマの選び方について学びました。

演習

講座内で出てくる演習です。
自分の回答を書いてみます。

◯ -> 質問(講座中にチャットで回答)
★ -> 宿題

◯演習1-1:文章を書く機会

みなさんの生活の中に「文章を書く」機会はありますか? あるとしたら、それは何ですか?


👉
作業の記録・マニュアル的なものやチャット、ブログなど。

仕事柄、意識しないと文章を書く機会がありません。
ですがたまに、補助金の申請をする際に作文が必要なことがあり、作文の出来で申請が通ったり通らなかったりはします。

◯演習1-2:アウトプット比率

みなさんが学習するとき、インプットとアウトプットの比率はどれくらいですか?

👉
ここ最近は、アウトプット3割くらい?

学習内容はもっぱら読書か動画か音声です。
あまり発信はできてないけど、読書では章ごとに軽くテキストでまとめたりしながら読むようにしています。
「自分用メモにまとめるのもアウトプットに入る」とお墨付きをいただいたので、これを堂々とアウトプットに入れることにします。

ちなみに、学習における理想のアウトプット比率は「初心者6割、熟練者7割」とのこと。

読書や動画なら、自分用まとめを作りつつ、Twitterで呟く。あと、「これぞ」という学びは1つだけ決めて即実践するようにする。
ツール制作なら、コード書いてそれをGitHubで公開して、わからないことは言語化して質問して、作ったものをブログに書く。

…こんな感じで学習をすれば、7割は行くかなあ。

◯演習1-3:書くのがしんどい理由

あなたは「書くのがしんどい」ですか? その理由はなぜですか?

👉
以前はしんどかったです。
文章を書くときにすごく肩の力が入ってしまっていて、ブログを1つ書き終えるのに時間がかかり燃え尽きていました。
ブログだけでなく、ちょっとしたチャットやメールでもその傾向があります(これは今でも)。

そこで一時期、ライティングに関する書籍を多読し、テーマを決めず誰にも見せない裏noteを作って毎日更新を練習してみたら、そのしんどさは消えました。メンタルの問題はこれでクリア。
今は「しんどい」よりも「面倒くさい」になってしまっています。習慣化の問題ですね。

◯演習1-6:文章を書く場所

あなたは、どこに書くことを想定して、技術ライティング講座を受講されていますか?

👉
主にブログ。そして目標は技術同人誌。

★演習1-4:時間のロック

習慣的にロックできる時間帯があるか検討して、その結果を教えてください。 もし、問題や悩みがあれば、Slackで相談してみましょう。

👉
夜の時間、8:00になったらライティングの時間にします。
でも日常生活もあるし本も読みたいし飲酒したいし色々課題あり。ちょっと今は無理なので6月からを想定します。

習慣化ができない時は、なぜできないかを考えるのが良さそうです。

本業の時間の使い方も見直したいところ。
農作業は時期によって使える時間も変わってきます。6月からは思い切って昼休憩3時間(11:00〜15:00)とかにして、2時間をプログラミング・ライティングに当てるようにしてみようかな。そんなうまくいかないと思うけど…。

★演習1-5:習慣化のテクニック

あなたにとってどんな習慣化のテクニックが効果ありそうか教えてください。 また、すでに実施している習慣化のテクニックがあれば、教えてください。

👉
やったことを記録するのが自分に合っています。
事前に宣言してやるやり方は、あまり向いてないと思いました。なんだか「宣言するぞ!」っていう時って変な力が入ってるので、無理な宣言をしがちかなと思います。
でも、twitterにやることメモとして残しておくぐらいだと効果がありそうです。

★演習1-7:書きたいテーマ

例にならって、みなさんのテーマを挙げた上で、3〜4個に絞ってみましょう。 また、それらを残した理由も教えてください。

👉
まず学びたいテーマを色々上げたあと、仲間同士でグルーピング。

  1. 農業生産
    減肥・緑肥活用・有機資材活用・土壌分析・作業省力化・機械設備修繕・電気工事
  2. 農業経営
    投資計画・管理会計・生産費分析・節税対策・ひとり農業
  3. IT活用
    作業日誌・作業マニュアル・在庫管理・デジタル化・測量・GPS自動操舵・気象データ
  4. ITものづくり
    アート思考→課題設定・プロトタイピング・IoT・ネットワーク・Web・ノーコード・GAS・Python
  5. 数学
    数字リテラシー・数学アート

さらに絞る。

  • 農業生産と農業経営のグループをまとめる
  • 仕事にすぐに取り入れられる(=アウトプット)環境があるものは外す
  • 小項目の中でも細かすぎるものはまとめる
  • 数学のグループが浮いている感じがするので、他のグループの項目を入れ替えたりグループ名を具体化したりする

というわけで、最終的に残ったテーマ。
カッコ書きは、今のタイミングじゃないかなと思うものです。


1. 農業経営
作業省力化・土壌改善・生産費分析(・管理会計)(・数字リテラシー

2. IT活用
作業記録・デジタル化・GPS自動操舵(・気象データ活用)

3. ITものづくり
プロトタイピング・ノーコード・GAS(・Python)(・IoT)

4. 思考力・発想力
アート思考(・数学アート)


おわりに

テーマ設定は、ライティング講座通しての演習の中でもかなり重たい課題です。
最初はいっぺんに考えるのが難しいので、1年おきとか半年おきとか定期的に見直してアップデートしていくと、色々見えてくるものがあるのかなと思います。

電気工事士になろう☆ 第二種電気工事士の概要と戦略

なんか唐突にDIYをこじらせて、「第二種電気工事士」の資格を取ることにした。
3月中旬ごろから学習中。

農場の配線を自分で直したりできるようになるのが目標。
電子工作のために回路図を読めるようになりたいという動機もあった。

2022年度 上期の試験日は、

  • 筆記試験が5/29
  • 技能試験が7月23 or 24日

とりあえず資格についてやここまでの独学でのやり方まとめ。

第二種電気工事士について

公式はこちら。
www.shiken.or.jp

資格について

第二種電気工事士」は国家資格。

基本的に、家庭や農場などの電気配線をいじったり工事するのは無資格では法律で禁止されている(簡単な工事ならできるけど)。
そこで「電気工事士」の資格を取れば、堂々とコンセントを付け替えたり照明を増やしたりできるようになる。

電気工事士の資格には規模によって「第一種」と「第二種」に分けられていて、一般住宅や個人商店、小規模工場などの電気工事を行うことができるのは第二種にあたる。
第一種になると、もっと大規模な工場やビル、商業施設、集合住宅の電気工事までできる資格。DIYではここまでいらん。
(第一種は免状を取得するには実務経験も必要っぽい。第二種は試験のみで取得可能。)

試験について

第二種電気工事士の試験は、4択で知識を問われる「筆記試験」と、与えられた課題と同じように実際に配線を組み立てる「技能試験」の二本立てになっている。

また「筆記試験免除」という制度もあって、筆記に合格すれば仮に技能で落ちたとしても、次回再受験する際に一度だけ、筆記が免除になる。うれしい。

筆記の合格基準は6割以上とのこと。
全50問のうち、30問以上取れればOK。暗記だけでだいぶ乗り切れそうだし、学生時代に物理が好きだった人はその貯金を使って結構いける。

実技の合格基準は、与えられた課題を時間内に完成させて、さらに「欠陥」が無ければ合格になる。
時間がかなりシビアで、40分以内に完成させなきゃいけない。
またこの「欠陥」が曲者で、器具ごとに注意ポイントがあって結構細かいので、とにかく慣れが必要だ。
(自動車免許試験の一発アウトの基準みたいなのが色んなところに潜んでいる感じ。)

独学での勉強の進め方

まだ道中だけど、一旦ここまでの戦略とスケジュール感についてまとめておく。

期日について

2022年度 上期の試験日

  • 筆記試験が5/29
  • 技能試験が7月23 or 24日

ただし僕の環境として、技能試験のある7月下旬は畑作物の収穫時期が重なり、受けられない可能性が高いと思っている。
なので先述した「筆記試験免除」の制度を使って、実技のみ下期での受験も想定している。

2022年度 下期の試験日

  • 筆記試験が10/30
  • 技能試験が12/24 or 25

戦略

知らない分野の勉強をするときは、まずは細部を気にせずに範囲全体を眺めるようにすると良い。そうすると、

  1. 汎用的に必要な知識・考え方
  2. 個別の細かい知識

が見えてくる。

理解が進まなくてモチベーションが下がっているときは、
これらの「1. 汎用的に必要な知識・考え方」が整理できていない か、重要度の低い「2. 個別の細かい知識」にとらわれちゃっている ことが多い。

人間は忘れる生き物。早いうちから細かい知識を覚えても、だんだんと忘れてしまう。
でも汎用的な知識・考え方は学習の中で何度も出てくるので、整理しておくことで理解が進みやすくなるし、忘れづらい。

なのでまずは細かい部分は気にしないで、汎用的な知識(いろんな問題に使われる知識)を優先して整理しながら進めるように心がける。
そして、早いうちに過去問を時間を測りながら実際の環境に近づけて解いてみて、敵がどんなものかを知るようにする。
最後に、試験直前に心を無にして細かい知識を暗記する。

学習のスケジュール感

●3月中旬ごろ(2週間ほど)

筆記試験のテキストを問題を解きながら一周した。 結構ガッツリのインプット期間。10分くらいの空き時間があればテキストをどんどん読み進めた。
章ごとに過去問がついているテキストを選んだので、そこでよく出てくる内容が「汎用的に必要な知識・考え方」になる。
そういうのを見極めて、章ごとにノート1ページに整理するようにする。
(1ページというのも大事で、取捨選択してコンパクトにまとめようとするのが大事。)

テキストはこちら。 item.rakuten.co.jp

①細かさよりわかりやすさ重視、②試験の重要度が分かり易い、③各章に問題がついている、という基準で他の書籍と比較して選んだ。

●3月下旬〜4月上旬(2週間ほど)

インプットを抑えて、テキストについている過去問を2つ、時間を測って解いてみた。ギリギリ合格点はいけそうな感じ。
過去問は取り組むと時間がかかるし数回分だけ。点数に一喜一憂せずに敵を知るのが目的。
あとはあんまり根を詰めず、暇な時にネットで器具についてまとまってる情報を探したり、よくわからない理論(三相交流とかインピーダンスとか)を本やyoutubeを読んだりして理解する期間にした。

●4月中下旬(2週間ほど)

だいぶ気が早いけど、実技試験の練習に取り組んでみた。
筆記試験が終わってから実技対策をやるのがセオリーらしいけど、実技では実際に器具やケーブルを触るので、筆記の学びも定着しやすいだろうなと思って先にトライすることにした。

Youtubeをベースに、一緒に真似しながら手を動かしてみる。動画だけだと後から要点を見返しづらいので、テキストを副教材にして進める。
全然時間通りに作れない。むずい。でも楽しい。
ケーブル切断時に傷つくし、リングスリーブも間違えるし、ランプレセクタプルの輪作りができないし、欠陥だらけ。

Youtubeはこちらの「日本エネルギー管理センター事務局」さんの動画。 www.youtube.com

動画はいくつか見てみて、自分の肌感に合うのを選んだ。

テキストはこちら。

以下、今後の予定。

●5月1〜21(3週間)

もうちょっと実技の練習やる。現時点で苦手な作業を何個か潰しておこう。

●5月22〜28(1週間)

筆記試験1週間前、詰め込み。ネットで公開されている過去問とテキストを使おう。

www.tac-school.co.jp

●6月〜7月(8週間).

実技の練習。まだ計画立ててない。

おわりに

独学とはいえ、実技で工具を揃えたり練習用の電線・器具を揃えたりすると、思った以上に費用がかかってしまった。
費用についてもまとめておきたい。

農家コミュニティを面白くするためにチャットツール導入を考える

農業経営の学習グループに、チャットツールの導入ができないか(勝手に)検討している。

個人的には僕が慣れ親しんでいるSlackが理想。
だけどちょっと文化が合うのかどうかわからないので、どのツールがマッチするのかを調査しているところ。

ただ、ツールの前にそもそもグループの目的や課題について整理しておく必要があるなと思ったので整理した。

グループについての現状

主要メンバー7人程度(幽霊部員たぶん多数)でオフラインベースで活動している、農業経営の学習のためのグループ。

公的機関が主体となって毎年開催されている1年がかりの講座(無料)を受講した人たちが、最終的に希望すると加入できる(=入口がちゃんとある)。
とはいえこの講座の受講生に限らず、意欲があれば参加OKでもある。

一度消滅しかかっていたのだけど、リーダーの声かけで3年越しくらいに復活したような感じ。

現在残っている主要メンバーに共通の想いとしては

  • それぞれの経営上の悩みを相談したり、持っている情報を共有できる場にしよう
  • 自主的に活動するというのをモットーにしよう

というのが共通にあるように思う。
(僕が出席できなかった1回目に、ある程度意識のすり合わせをしていた様子)

現状の活動は、情報交換会と称して会議室に集まり、2時間、特にテーマを決めずに気になることを話すという感じ。
漠然と「人数を増やしていきたい」「盛り上げていきたい」という気持ちはあるけど、具体的なアクションは見えていないし、なかなか情報交換会の中でその重たいテーマの話ができそうもない。

メンバーはそれぞれ経営に対して熱意があるし、いろんなバックグラウンドを持っていて、情報交換会では面白い話も聞くことができる。
なんだかもうちょっと発展させられそうだなあと僕が勝手に思っている。

そんな感じ。

グループの課題

僕目線で見えている課題としては

  • 活動内容が不明確
  • コミュニケーションの機会が少ない

というところが大きいのかなと思っている。

まず、活動内容。
活動内容があまり明確でないと、新しい人が来たとしても定着が難しいだろうなーと思う。
わざわざ仕事を中断して来てテーマを決めずお話をするだけだったら、「なんだ仲良しグループかー」と思ってあまり参加するメリットを感じないんじゃないかな。
まあ、定期的に雑談するだけでもある程度の需要はありそうなのだけど。よくある農業グループの形でもある。

次に、コミュニケーションの機会。
オフラインベースだと、多く見積もっても交流できるのは年にせいぜい6回程度だと思う。
それぞれ住んでいる場所もバラバラで、車で1時間の距離のところから集まる人もいる。繁忙期もそれぞれ違うため日程調整も難しい。
今のメンバーは個人同士でfacebookInstagramで繋がっているので個のコミュニケーションは取れるんだけど、グループとしてのコミュニケーションが難しい。

コミュニケーションが少ないと、活動も生まれにくい。
ということで、コミュニケーションを密にできる手段がまずは必要じゃないかなーと考えている。

チャットツール導入の目的

グループ自体の活動は、おそらく悩みを共有する「情報交換会」がベースになるのかなと思う。
ただそれがオフラインだけだと難しいので、オンラインでのコミュニケーションもできたら良いのではないのかな、と思う。

具体的には、

  • メンバーが「販売について悩んでいる」「チーム作りに悩んでいる」とか情報交換会のネタを事前に共有できる
  • また「こういうアイデアあるんだけど誰か一緒にどう?」とか「この記事面白いのでオススメ」みたいなアイデアを投げられる
  • 僕が今書いているような「グループをこうしたいんだけどどう?」という提案を投げられる

みたいなのが僕の描いているところ。

悩み共有で終わりじゃなくて、何かそれぞれ持ち帰って面白い活動ができるグループになると良いな。

まとめ

なんとなく目的を整理できたところで、チャットツール導入作戦としては

  • 次回の情報交換会のテーマとして、チャットツール(SNSなども含む)についてをトークテーマに提示
  • Slack, ChatWorkといった新しいチャットツールの事例を調べておいてプレゼンする
  • チャットツール導入後の運用方法を考える

という流れで進めてみたい。

みんなが使ってるツール、使いやすいツールについてまずは次回聞いてみよ。
あとは最終的にはツールよりも結局、運用方法とかマネジメントが大事なんだろうな。

【Python】月毎のフォルダとその中身のフォルダをまとめて生成する

ローカルにフォルダをまとめて作りたくて、Pythonでサクッと書いてみた。

パスの扱いと、フォルダの作成について簡単にまとめ。

やりたいこと

こんな風に一年分の月ごとのフォルダ群を作りたい。

指定した親フォルダの直下に

  • まず2022.01〜2022.12と年月の数字が入ったフォルダがあり
  • その各フォルダに「請求書」「売上精算書」「領収書」…などといった空のフォルダがある

というもの。

年月のフォルダを一つ作ってコピーして名前を変えていけば作れるけど、地味にめんどい。

スクリプト

スクリプト全体はこちら。

import os
from pathlib import Path 

"""パラメータ"""
TARGET_DIR_PATH = Path('<パス文字列>') # フォルダ群を作成したい親フォルダ
YEAR = 2022 # 年
CATEGORIES = ('領収書', '請求書', '売上精算書') # 作成するフォルダ名

def create_folders():
    """
    TARGET_DIR_PATHで指定した親フォルダの中に「2022.01」のような月毎のフォルダを一年分生成し、
    さらにその中にCATEGORIESで指定したフォルダ群を作成する
    """
    for i in range(1, 13):
        year_month = f'{str(YEAR)}.{str(i).zfill(2)}' # ピリオド区切り・月はゼロ埋め。例)2022.01
        for category in CATEGORIES:
            new_path = TARGET_DIR_PATH / year_month / category
            os.makedirs(new_path)

if __name__ == '__main__':
    create_folders()

解説

ユーザーが指定するパラメータ

スクリプトの中のパラメータの部分を、自身の環境と作成したいフォルダに合わせて書き換えて使う。

"""パラメータ"""
TARGET_DIR_PATH = Path('<パス文字列>') # フォルダ群を作成したい親フォルダ
YEAR = 2022 # 年
CATEGORIES = ('領収書', '請求書', '売上精算書') # 作成するフォルダ名

このTARGET_DIR_PATHに指定するフォルダパスは絶対パスにしておくと、Pythonスクリプトを実行した時のフォルダが違っても毎回同じ場所に作成されるので、個人的にはおすすめ。

ファイル・フォルダのパスを扱う

パスを扱うにはpathlibモジュールのPathクラスを使うと便利。
Path('<パスを表す文字列>')でPathオブジェクトを作成すると、パスオブジェクトとファイル名文字列を/で連結できてスッキリする。

from pathlib import Path 
(略)

TARGET_DIR_PATH = Path('test') 
(略)
new_path = TARGET_DIR_PATH / year_month / category

フォルダを再帰的に作成する

フォルダを作成するにはosモジュールのos.makedirs(<フォルダパス>)を使うと、引数に指定したフォルダパスを深い階層まで一気に作成することができる。
(これを「再帰的」というらしい)

この時、引数に指定するパスが存在しなくても自動で生成してくれる。
しかしパスが既に存在する場合はフォルダ自体が上書きされてしまうので、中に重要なデータが入っていないことを確認して実行するようにしよう。

import os
(略)

new_path = TARGET_DIR_PATH / year_month / category
os.makedirs(new_path)

似たようなフォルダを作成する関数にos.mkdir()があるが、こちらは引数として存在しているフォルダを指定しないとエラーになってしまう。なので今回のような使い方ができない。

note.nkmk.me

まとめ

パスの扱いと、フォルダの作成について簡単にまとめた。

ローカルのファイル、フォルダをいじるときにPythonはすごく便利。

【M5Stack】基本のスケッチ例「Button」を読み解く

M5Stack開発について理解を深めたくて、Arduino IDEで見られるスケッチ例を読解していく。

今回は、スケッチ例「Button」を読解して、M5Stackのボタン操作について見ていく。

Arduinoスケッチの基本構造や、M5Stackで画面に文字表示する基本のやり方については、以前「Hello World」のスケッチ例を題材に整理しているのでそちらをご参照ください。

nouka-it.hatenablog.com

スケッチ例「Button」

Arduino IDEのメニューから [ファイル] > [スケッチ例] > [M5Stack] > [Basics] > [Button] を選択。

f:id:massa_potato:20220301124908p:plain

M5Stackに書き込んでみる。

すると、最初にディスプレイ上に黄色の文字でこのように表示される。

f:id:massa_potato:20220301181515p:plain

この状態で下の3つのボタンをどれか押すと、押したボタンに対応してA〜Cの文字がディスプレイ上にタイプされる。
また、ボタンを長押しすることで一定間隔で同じ文字が連続タイプされる。PCのキーボードを長押ししている時と同じような挙動。

f:id:massa_potato:20220301193106p:plain

そして真ん中のBボタンを長押し(700ミリ秒≒1秒弱)押すと、画面がリセットされて真っ白になる。

f:id:massa_potato:20220301181839p:plain

この白い画面の時にも、押したボタンを表示したり、再度Bボタン長押しで画面リセットをすることができる。

……というのが、ボタン制御のサンプル。

スケッチを読む

コメントなどは省略している。

▼スケッチ例「Button」

#include <M5Stack.h>

void setup() {
  M5.begin();
  M5.Power.begin();
  M5.Lcd.setTextColor(YELLOW);
  M5.Lcd.setTextSize(2);
  M5.Lcd.setCursor(65, 10);
  M5.Lcd.println("Button example");
  M5.Lcd.setCursor(3, 35);
  M5.Lcd.println("Press button B for 700ms");
  M5.Lcd.println("to clear screen.");
  M5.Lcd.setTextColor(RED);
}

void loop() {
  M5.update();
  if (M5.BtnA.wasReleased() || M5.BtnA.pressedFor(1000, 200)) {
    M5.Lcd.print('A');
  } else if (M5.BtnB.wasReleased() || M5.BtnB.pressedFor(1000, 200)) {
    M5.Lcd.print('B');
  } else if (M5.BtnC.wasReleased() || M5.BtnC.pressedFor(1000, 200)) {
    M5.Lcd.print('C');
  } else if (M5.BtnB.wasReleasefor(700)) {
    M5.Lcd.clear(WHITE);
    M5.Lcd.setCursor(0, 0);
  }
}

setup()関数内では、M5の初期化やディスプレイへの文字表示などを行なっている。ここは今回は省略する。

loop()関数内でボタン操作周りを行なっているので、ポイントを整理していく。

M5Stackのボタン制御の基本

まず前提として、M5Stack本体のディスプレイの下部には3つのボタンがついていて、左から「A, B, C」と名前がついている。

そしてM5ライブラリには各ボタンに対応したBtnA, BtnB, BtnCクラスがあり、それぞれM5.BtnA, M5.BtnB, M5.BtnCのように呼び出して使う。

ではloop()関数の中を見ていく。

ボタンの状態のアップデート

M5.update()
ボタンの読み取り状態を更新する関数。

github.com

ボタンを扱うには、基本的にはこれをloop()関数の先頭(もしくは末尾)に書く必要がある。

試しに実際にM5.update()の一文をloop()関数内に記述せずに書き込むと、ボタンを押してもどれも反応しない状態になった。

ボタンの状態によって条件分岐を行う

loop関数内では、ボタンの状態によって条件分岐が行われている。

  if (M5.BtnA.wasReleased() || M5.BtnA.pressedFor(1000, 200)) {
    M5.Lcd.print('A');
  } else if (M5.BtnB.wasReleased() || M5.BtnB.pressedFor(1000, 200)) {
    M5.Lcd.print('B');
  } else if (M5.BtnC.wasReleased() || M5.BtnC.pressedFor(1000, 200)) {
    M5.Lcd.print('C');
  } else if (M5.BtnB.wasReleasefor(700)) {
    M5.Lcd.clear(WHITE);
    M5.Lcd.setCursor(0, 0);
  }

これは、

  • ボタンAが押されたら、画面上に「A」の文字をタイプする
  • ボタンBが押されたら、画面上に「B」の文字をタイプする
  • ボタンCが押されたら、画面上に「C」の文字をタイプする
  • ボタンBが700秒長押しされたら、画面をクリアして白一色にする(再度画面左上から印字をスタートする)

というような処理が行われている。
M5.Lcd.print()関数は、前回のprintの続きから行われるので、キーボードでタイプしてPCに出てくる時のような表示になる。)

ボタンの状態は条件分岐で判定しているのだけど、ちょっとどう使われているのかわかりづらいので、関数を一つずつ見てみることにする。

シンプルに、ボタンAだけを見ていこうと思う。

ボタンの押下を感知するだけなら

M5.BtnA.wasReleased()
ボタンAが(押された状態から)離した瞬間に一度だけ1を返す関数。

日本語のドキュメントにはwasReleasedがなかった。なぜだろう……。
以下英語のドキュメント。

github.com

例えば、シンプルにボタンAを押したかどうかを判定したいだけなら、loop関数はこのようなスケッチで良い。

void loop() {
  M5.update();
  if (M5.BtnA.wasReleased()) {
    M5.Lcd.print('A');
  } 
}

書き込んで試してみると、ボタンAを押すと文字Aがタイプされる。
ただこれだと長押しに対応していない。ボタンを話した瞬間に1回だけ、文字Aが表示される。

今回のスケッチ例には出てこないけど、こちらのwasPressed()関数も使える。
wasReleased()との違いは、ボタンを押した時に検知するか、押したボタンを離した時に検知するかということ。

M5.BtnA.wasPressed()
ボタンAが押される度に一度だけ1を返す関数。

github.com

ボタンが長押しされたことを検知するなら

M5.BtnA.pressedFor(長押し時間)
M5.BtnA.pressedFor(長押し時間, ディレイ時間)
ボタンAが引数で指定した時間以上ボタンが押し続けられたら1を返す関数。
引数には、長押し時間をミリ秒で指定する。
また第2引数にはディレイ時間を指定することができるみたい。
(ドキュメントには見当たらなかった)

github.com

先ほど試したloop関数のif条件式をこのようにしてみる。

void loop() {
  M5.update();
  if (M5.BtnA.pressedFor(1000)) { // 引数に長押し時間
    M5.Lcd.print('A');
  } 
}

ボタンAを1秒以上押すと、文字Aがタイプされるスケッチができた。
ただこれを書き込んで試してみると、ボタンAを長押しした瞬間に「AAAAA……」と一気に画面いっぱいに文字がタイプされてしまう。

これを防ぐために第2引数のディレイ時間を指定することで、長押ししている間は一定間隔で文字Aがタイプされるようになる。

void loop() {
  M5.update();
  if (M5.BtnA.pressedFor(1000, 200)) { // 第2引数にディレイ時間
    M5.Lcd.print('A');
  } 
}

長押しに関しては、こちらのwasReleaseFor()関数も使える。
pressedFor()とは、長押ししている途中に検知されるか、長押しから離した瞬間に検知されるか、というちょうど対になっているものかな?

M5.BtnA.wasReleaseFor(長押し時間)
ボタンAを引数で指定した時間以上押された状態から離した時に1を返す関数。

github.com

PCのキーボードのような挙動を作るには

これまでの内容を組み合わせると、スケッチ例のようにPCのキーボードのような挙動を作ることができる。

void loop() {
  M5.update();
  if (M5.BtnA.wasReleased() || M5.BtnA.pressedFor(1000, 200)) { //  ボタンAを離した時 or 1秒以上押し続けた時
    M5.Lcd.print('A');
  } 
}

まとめ

ボタンの制御もなかなか複雑だった。
ドキュメントが揃ってなかったりして、うまく整理できなかったかも。

【GAS】スプレッドシートのレイアウト調整あれこれ(行の高さ・列の幅、表示形式、折り返し、交互の背景色)

毎月やる作業の効率化のために、GAS(Google Apps Script)でプログラムを書いている。

csvファイルをスプレッドシート化して、フィルタをかけて複数シートを作り印刷できたら便利だなと思って制作した。
シートのレイアウトをGASで自動調整するようにしたので、そこで使ったメソッドをまとめた。

スプレッドシートのレイアウトを調整する

以下の操作をGASで行なった。

  1. 行の高さ・列の幅を調整する
  2. テキスト折り返し指定する
  3. 表示形式を数値フォーマットに変更する
  4. 交互の背景色を適用する

それぞれメソッドを使うときに、扱うのがSheetクラスのオブジェクトなのか、Rangeクラスのオブジェクトなのかを注意する。

(1)行の高さ・列の幅を調整する

sh.setRowHeights()
sh.setColumnWidths()
行の高さを変更するときはsetRowHeights(), 列の幅を変更するときはsetColumnWidths()を、Sheetオブジェクトに対して使う。

スクリプト

const sh = SpreadsheetApp.getActiveSheet();

// A. データの入ってる範囲まとめて変更する
sh.setRowHeights(1, sh.getLastRow(), 34);   // 行の高さを「34」に指定
sh.setColumnWidths(1, sh.getLastColumn(), 100);   // 列の幅を「100」に指定

// B. 1行・1列だけを変更する
sh.setRowHeights(5, 34);   // 5行目の高さを「34」に指定
sh.setColumnWidths(5, 100);   // E列(=5列目)の高さを「100」に指定

複数行・列をまとめて調整したいときは、例Aのように第二引数に行数・列数を指定すれば良い。
ちなみに今回使わなかったけど、セルの中身に合わせた自動の高さ・幅調整は、同じくSheetクラスの autoResizeColumns(), autoResizeRows()メソッドが使える。

developers.google.com

(2)テキスト折り返し指定する

range.setWrapStrategy()
テキスト折り返しを指定したい時は、Rangeオブジェクトに対してsetWrapStrategy()を使う。
引数には、SpreadsheetApp.WrapStrategy.WRAPを指定すると、テキスト折り返しになる。

ちなみにスプレッドシートメニューのこれ。

f:id:massa_potato:20220301120117p:plain

スクリプト

const sh = SpreadsheetApp.getActiveSheet();
const range = sh.getRange('A:A')

range.setWrapStrategy(SpreadsheetApp.WrapStrategy.WRAP); // A列をテキスト折り返しに指定

WRAPの部分は、それぞれ以下に変えると他の方式も選べる。

  • はみ出す: OVERFLOW
  • 折り返す: WRAP
  • 切り詰める:CLIP

developers.google.com

(3)表示形式を数値フォーマットに変更する

range.setNumberFormat()
Rangeオブジェクトに対してsetNumberFormat()を使うと、そのセル範囲のフォーマットを指定できる。
引数には、フォーマットの文字列を指定する。日付・時間、金額など指定できる。

おそらく、日付・時間はGASのUtilities.formatDateの指定文字と同じで、他の数字はスプレッドシートの指定文字と同じっぽい?

スプレッドシートのメニューのこれ。 f:id:massa_potato:20220301121708p:plain

スクリプト

const sh = SpreadsheetApp.getActiveSheet();
const range1 = sh.getRange('A:A'); // A列のRange
const range2 = sh.getRange('B:B'); // B列のRange

range1.setNumberFormat('MM/dd'); // A列を日付フォーマット「MM/dd」に指定
range2.setNumberFormat('#,##0'); // B列をカンマ区切りの金額フォーマットに指定

developers.google.com

(4)交互の背景色を適用する

applyRowBanding()
指定範囲に交互の背景色を指定したい場合は、Rangeオブジェクトに対してapplyRowBanding()を使う。
引数にテーマカラーやヘッダー・フッターをつけるかどうかも指定できる。引数なしでデフォルト(グレー・ヘッダーのみ)。

スクリプト

const sh = SpreadsheetApp.getActiveSheet();
const range = sh.getDataRange();  // データの入っている全範囲

sh.getRange(1, 1, sh.getLastRow(), sh.getLastColumn()).applyRowBanding(); // 交互の背景色を指定

[https://developers.google.com/apps-script/reference/spreadsheet/range#applyRowBanding(BandingTheme):embed:cite]

まとめ

スプレッドシートにデータが入っている状態から、新たにデータを整理したシート生成→フォーマット指定まで自動化ができた。

次は印刷用に複数シートをまとめて1つのpdf化をしたい。