Skip to content
自分が自分のために自分で作るプログラムほど、面白いパズルはない(3)
note記述記事
2024-01-02

#年末の過ごし方
#note書き初め  なぜか年末企画タグにならないので追加。。
前回の続き

https://note.com/marble_walkers/n/n45cc36af05aa

いくつかのとっつきやすいテーマ案/ツール

いくつかはじめやすい案を並べます。自分の知識だとわりと古めのツールになってしまいますが、ネットを調べて自分に合う最新のツールを探してみるとよいでしょう。古めのツールといってもその分問題は枯れているので安心して使えます。

シェルスクリプトで一括操作バッチを作る

自分のPCを立ち上げた後、いつも使うアイコンを毎日選んでませんか?
普通ならWebブラウザは立ち上げてしまうかと思いますが人によってはSNSアプリやメールソフトを立ち上げたり、ゲームソフトを立ち上げたり。
そのあたりをバッチコマンドを使ってまとめて立ち上げるなどいかがですか。
毎日使うソフトはうまく出来れば便利です。
まとめて立ち上げるだけならスタートアップ登録すればよいですし、この手のソフトはアプリ自身にスタートアップ起動が入っている場合が多いです。でもコマンドから立ち上げると単なるスタートアップより細かい操作が可能です。
使う開発言語はcmd,powershell(Windows系),zsh(Mac系),bash(linux系)など。
powershellは各環境版もあります。

https://github.com/PowerShell/PowerShell/releases

bashは互換環境などでサポートされていることもあります。私は個人環境は Macもlinuxも書けるようにpowershellを使うことが多いです(以下例はwindowsが多いです)

start-process chrome

これだけでchromeを起動出来ます。
引数をいろいろ設定すれば 開くURLも指定出来ますし、プロファイルの選択もできます。

シェルからの起動であれば、起動後のウィンドウの配置やサイズなども操作できたりします。 https://github.com/MScholtes/VirtualDesktop

シェルから REST APIを直接叩いて別システムと連動とかもできます。

# 別途音声サーバーに直接指示する例
Invoke-RestMethod  -Method Post -Uri 'http://xxxx/talk-direct' -Body @{ text='おかえりなさい'}

実際にはどんどん機能を追加していけばいくらでも複雑になっていきます。
でも元々がシンプルなのでいくらでも応用や拡張を考えていけると思います。最初から複雑なことを考えすぎてモチベーションが0になるときに何も出来ていないということを避けるためにも最初は単機能から考えていくのがよいでしょう。

同じことはRPAでも出来ます。RPAを使うのもよい選択肢と思います。音声合成アプリを自動操作するのにRPAを使っていたときもあります。
https://www.microsoft.com/ja-jp/power-platform/products/power-automate 
https://www.uipath.com/ja/rpa/robotic-process-automation

作業の自動化は、効果としててきめんに実感出来るので、ホビープログラミングとしてとっつきやすいテーマです。
一点重要な注意として、この手のシェルスクリプトは**「PCを破壊するようなスクリプトやHDDを抹消するようなスクリプトが簡単に書けてしまう」**ので、その手の危ないコマンドは使わないほうが無難です。
十分に注意して楽しみましょう(ちなみに私は毎週開発PCのフルバックアップを行います)

ScratchやNode-Redで家電を操作する

休みに英字テキストを考えるのはきついという方は、グラフィカルプログラミングツールを使うのも手です。昔はグラフィカルプログラミングツールというと「重い、思った処理が書けない、外部と連動できない」などおもちゃ状態だった頃もありますが、最近のツールだとずいぶん使いやすくなりました。

https://scratch.mit.edu/

Scratchは教育用に作られたグラフィカルプログラミングツールです。

https://ja.wikipedia.org/wiki/Scratch_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E)

最近は日本の学校のプログラミング教育にもよく使われているらしいです。
ですので非プログラマな方にもとっつきやすく、また理解学習のためのコンテンツが多数あります。ソースは今風にGitHubで公開されてます。Ver.1の頃はSmallTalkで改造もかなり厳しいものがあったのですが、現在はJavaScriptで書かれているので中の作りを読み込むことも可能です。

教育用で多用されているため、教育用ロボット(ラジコンプラモみたいなロボット)もScratchでの操作をサポートしているものが多く、プログラムを組みながらロボット操作みたいな遊び方もできます。ただ汎用のREST APIを呼ぶには少し組み込みがいるらしい(あまりきちんと調べてない)
お子さんのいる方なら、お子さんと一緒に遊ぶのもよいかもですね。

https://nodered.jp/

もう少しゴリゴリ書きたいとなるとNode-Redが便利です。中はそのままJavaScriptですし、直にJavaScriptを書くこともできます。パッケージ部品もnpmなどで高度な部品が多数存在しますし、node-red専用でなく通常のnpmパッケージも使えます。 
私の開発環境も日常のルーチンワークにはNode-Redで書いている部分もあります。

mi-serverの日常タイマーの一部

主に時報的な動作を入れたり、複数サーバーとボイスサーバー間の受け渡しなどちょっと視覚的に処理したいものを処理しています。

最近の家電にはREST APIで操作できるものもありますが、あまりAPI仕様を公開しているものは少ないです。SwitchbotなどではAPIを明確に公開しているので、node-redなどから家電を自動操作するのもよいかもです。

https://github.com/OpenWonderLabs/SwitchBotAPI 
SwitchBotの公開API

セキュリティの問題もあるのかもしれませんがもっと家電APIは公開されて欲しいものです。
ただ自動操作をしたいだけならメーカー公式でスマホアプリがあることが多いですし、 IFTTTとかを使うほうがよいです。またGPTsがzapierとコラボするらしいのでGPTsでもそのうちやれるかもしれません。
でも楽しみながらプログラミングをするテーマとしては、実際に外部で動く機器があると作るモチベーションも上がります。

GPTsで「相談事をするツール」など

以前(2)で示したようにGPTsを使って何かを作るのも面白いと思います。テーマとして「なんでも褒めてくれるツール」とかよいかもです。
OpenAIのGPTsは最新のAI技術でありながら、基本的なテキスト会話だけならプログラミング的な知識なしにかなりいろいろな情報出力が出来ます。
GPTsに手順(Instructions)を示すことは通常のプログラミングと比較すると
**「中途半端に書いても動くプログラム」**という特筆すべき特性があります。
多少言っていることをまちがえても、多少言い足りなくても、なんとなくこちらが望む出力が出てきます。
「プログラムは全部が正しく作られてないと動かない。故にトランプタワーを作るかのような神経をすり減らす面がある」というのが今までのプログラミングの暗黙の約束です。通常の開発言語なら1バイト間違えただけ、1文字間違えただけでまったくプログラムは動かなくなります。誤字(typo)だけでプログラム全体が全滅します。
近年の言語は改行くらいは自由に許してくれるようになりましたし、開発環境は誤字も指摘するようになってずいぶん楽にはなりました。
でもGPTsのようなAIへのInstructionの場合は誤字脱字、指示漏れさえ、平気で処理することがあります。
これはホビープログラミングについても「神経をすり減らす」ようなモチベーションを下げる特性を緩和してくれます。
まだ外部との相互運用は若干弱い面はありますが、外部のAPIも一つは許してくれているし、OpenAIも改良はしてくるでしょう。

ゲームエンジンはあまりお勧めしない

ホビーとしてのプログラミングのとき「ゲームを作ろう!」というのはすぐに思いつくところです。
有名どころでUnity3DとかUnreal Engineとかありますし、入門情報も結構多量に出ています。
私がホビーとしてのプログラミングにあまりこれらのエンジンをお勧めしないです。
趣味として短時間にプログラムを楽しむとしては「現実に引きずられて複雑すぎる」というものです。

これらは初心者にも使いやすくまとめてられているといいつつも、現実的にはプロ向けツールでありリソースがチープなゲームコンソール機器の開発にも使えるように作られています。
ホビーとしてのプログラミングは、モチベーションがすべてであり面倒なことは極力しないというのが原則ですが、リソースがチープだと同じことをするにも面倒なことをしなければならないものです。
メモリが少なければ、理屈では1回の処理で済むことをメモリに入る量に合わせて複数回実行しなければならないことが多々あります。開発ツールのほうはその複数回の面倒さを減らすためにいろいろ工夫していますが、その結果として「わかりにくい約束事」が付いてきます。
開発環境でもクロスビルドなど面倒なデプロイ過程が入ってきます。エミュレート出来るとしても現実にはエミュレータと実機では挙動が違うなど常に面倒な問題があります。それらを個性の違うすべてのデバイスで「似た書き方で書けます」というツールだと結局重い約束事がついてまわることがほとんどです。

もちろんセミプロまたはスタートアップとしてビジネス的にやりたいという考えがあれば別ですが、趣味のプログラミングとして楽しむためのツールとしては少し重すぎるというのが自分の考えです。
もしゲームがぜひやりたいということであれば、WebアプリとしてJavaScriptベースのツールのほうがまだよいです。ゲームロジックを固めてからゲームエンジンへの適用を考えるという手もあります。

とりあえず思いついたことで、趣味としてのプログラミングについて書きましたが、趣味としてやるのならとにかくは無理せず楽しい部分だけやるのが長続きするコツだと思っています。

(初出 note https://note.com/marble_walkers/n/n63cd8660b013 )