honeylab's blog

各種ハードウェアの改造、主にファミコンミニなどをやってます(ました)

アルバイト未経験エンジニア43歳、タイミーさんになる①~タイミーアプリの正しい使い方~

 私43歳のおじさん、経歴としては高校卒業後AO入試筑波大学に入ったものの、いろんなことをやりすぎて9年ほど在学し、在学中にITベンチャー「ニューフォレスター」の立ち上げメンバーとして参加し、その後「ソフトイーサ」で2年ほど穀潰しをするなどベンチャーを転々とし、現在もシステムエンジニアのようなことをしています。そんなこともあって、なんとワタクシ、今年までまともに「アルバイト」をしたことが無かったのです。(就活もしたことないですが)
(コマゴマとした業務委託はあったんですが)

 で、ちょっといろんなことがあってどうにか収入を増やしたかったので、

在宅でできるフリーランス的な奴に登録したり、副業を探そうとしてみたんですが、
この年だとそれなりにプロマネ的な経験や、それをできるような人材じゃないとやっていけない界隈で、経歴がこんなんなんではまともに職務経歴書を埋めることもできず、結局何もできないまま時間だけが過ぎていました。


 ああ、これじゃぁ収入を増やすことはできない。
昼間は本職をして、子供たちが寝た後にコンビニバイトでもするしかないのか、はたまた新聞配達か、団信死亡保険って何年経過からいけるんだっけ?などどうなだれていたそんな時に、ふと天啓が下りてきたのです。

タイミー

timee.co.jp

(実は、メルカリはやっていたのでメルカリハロは見ていたのですが、あんまりできるような仕事も出てなかったのでタイミーもそんなもんだろうと思っていたのです)

それだ。タイミーを使えば一日数時間のスキマ時間で働く大人のキッザニアみたいなことをしながらお金がもらえるといううわさを聞いたことがあるぞ。

とりあえず、タイミーのアプリを見てみました。

美容師と介護とサーティワンの経験者募集しか出てないやんけ。

ダメじゃん

 

さて、こんな感じで、このブログをお読みの方の中にも、大人のキッザニアとも呼ばれるタイミーアプリを入れてみたものの、全然できそうな仕事が無いからダメじゃん、と思って撤収された方、結構いると思います。

しかしそれは、そもそもアプリの使い方を間違えている可能性があります。

(※現在、これは首都圏エリア及び大都市周辺に限った状況です※)


標準でリストに表示されている仕事、これは、求人を発行したものの、
「まだ取られていない、全然人気のない、残った仕事」なのです。

 

せっかくなので、何かあったときのためにここでタイミーアプリの使い方を見ていってください。
タイミーから金はもらっていません。

(いや、金もらってるじゃん、という突っ込みが予想されますが、タイミーは、あくまで「仲介」であり、給与は雇用者から払われているのです。このため、各種法令の制限が一般的な日雇い派遣とは変わってくるというカラクリもあります、という大変深い意味がこの一文に込められています)

yamamoto-syaroshi.com

~タイミーアプリの正しい使い方~

アルバイトするにあたって、やはり仕事内容は大事ですよね。

人気のある仕事、自分のやりたい仕事は何だろうか。
検索してみよう、と思いますよね。

えーと検索ボタン。。。。無いです。

ITとかに触れてきた人なら驚くかと思いますが、
タイミーのアプリには仕事をキーワードで検索するという機能はありません。

社名や案件名、いずれも、キーワードで検索することは不可能なのです。

じゃぁ、どうやって仕事を探すのか。正しいやり方はこうです。

1.働く日を決める

タイミーさんに仕事キーワードでの検索なんて権利は与えられていません。
与えられている権利は、働く日時を決めることだけです。
キッザニアと同じです。まず行ける日を決めて、それからだよね。


 働ける日を決めてその日のカレンダーをタップし、案件を表示します。
すると、全然やりたくないような仕事がずらっと並んでいます。

ほら言ったじゃん。全然ないじゃん。と思うでしょう。

 

そこでアプリを閉じてはいけません。働ける日の通知をONにします。

2.たくさん通知が来ます

数時間放っておくと、さっきまで、一覧では全く見つからなかったような仕事で通知欄が埋まりますw(来なかった場合、残念ですがスキマタイミー不適地です。ヤマトの短時間仕分けが出るのを待ちましょう。。。)

3.お気に入りに入れる

 通知欄から、興味のある仕事をタップして内容を確認し、気になったなら「お気に入り」ボタンを押します。また、その会社の仕事をほかにも見たいなら、会社の名前をタップし、一覧から案件を見るか、その会社を「お気に入り」に入れます。

また、その仕事の下に、関係しそうな仕事が3つ出てくるので、その中からやれそうなものを「お気に入り」に入れます。

 

 

4.これを繰り返していく

 自分のタイミーアプリのお気に入り欄が充実してきます。お気に入りに入れた会社が別の案件を出した場合、通知が来ます。
また、案件には「案件ID」のようなものが設定されているらしく、そのIDをもとに作成した案件は別の日時でも「同じ仕事」として認識され、「お気に入りの仕事」として通知が来ます。

  

 

 ここで注意ですが、タイミーの掟、「仕事は検索できない」に加えて、アプリには「一度表示した仕事のリスト」や履歴もありません。つまり、通知から表示させた仕事をお気に入りに入れず、トップのカレンダー画面などに戻ってしまった場合、その仕事画面に戻ることはできません。記憶を頼りにカレンダー画面などからたどり着く必要があります。運悪くその仕事がすでに誰かに応募され、雇用者から募集停止フラグが建てられた場合、その案件はあなたのタイミーアプリからは直接たどり着けなくなります

仕方ないよね、お気に入りに入れなかったんだもの。
通知が表示されていても、募集が終わっていたらタップしてもそのページが出ないことさえあります。面白い仕事を取るためには通知をこまめにチェックする必要があります。

本家キッザニアも人気のある仕事を取るのは大変なんですよ?

5.この中から応募するだけ。

 最初の画面には全く表示されていなかったやりたい仕事に応募できる状態になったはずです。あとは応募するだけ。注意事項はちゃんと画面に表示されます。
タイミー上で本人確認を登録さえしていれば、履歴書も面接もいりません。

あとは忘れずに出勤するだけです。通知が無効になっていなければ、少なくとも前日に「明日の仕事の準備」が表示される親切設計なので、うっかり忘れもほとんどありません。これで出勤できないレベルの方は、ちょっとほかのことを考えたほうがいいと思います。

タイミー鉄の掟

タイミーには、やるまではわからなかったいくつかの掟があります。
その中でも重要なのは以下のものです

① 案件は一日一つしか取れない

 タイミーでは、法定労働時間を超えるリスクを下げるために絶対に一日一案件しか応募できません。「朝の短い仕事の後、夕方取る」ようなことは、やりたいけどできません。ほかのアプリ、シェアフルなどを併用すれば可能ですが、現状そのような短い仕事はタイミー一強なので、現実的には不可能な状態です

 

② キャンセルするとペナルティポイントが付く

 応募した後にどうしてもキャンセルしたい場合は、次に述べる無断欠勤にならないように、最低でも「仕事の開始時間前」に、ユーザーキャンセルすれば一発BANは回避できます。ただし、時間に応じてペナルティポイントが付き、「直前キャンセル率」に反映されます。ただし、24時間より前であればペナルティポイントが加算されませんが「キャンセル率」として記録されます。ペナルティポイントは1つ仕事を完了すると、1ずつ減らすことができます。

 

③ 無断欠勤は(原則)一発BAN

 タイミーにとって大事なのは、約束した時間に労働者をそこに届けること。それが出来ないのは何よりも重大な問題です。そのため、応募した仕事に無断欠勤をしてしまった場合、あなたはもうタイミーとして働くことはできません。そこの会社だけとかではなく、タイミーから追放されます。電話番号を変えても、本人確認書類で照合されて拒否されます。ただし、少し前までは、一発BAN、かつ無期限使用停止という大変重いペナルティが課されていました。現在では、その欠勤に後からでも正当な理由が証明できれば、ペナルティポイントを背負った状態から少なくとも1度は利用を再開させてもらえる、「有期BAN」の可能性がある、という規約が付いたらしいです。

note.com

 

さて、こんな感じでタイミーアプリを使いこなすことで、かなり有意義にスキマバイトを行うことができるようになりましたが、私がスキマタイミーをできる、かなり特殊な環境であることが幸いしています。

 実は私はシステムエンジニアのようなものとして働いていますが、現在の就職先は社長一人、社員一人の極小リベラル環境で、ほとんどの仕事は在宅で行っています。
その理由として、妻が現在↓こんな状態↓で自立した生活は難しく、


小学2年生の息子は支援級に通っていて、自分から進んで学校に行こうとしないので、朝は基本的に車に押し込んで登校し、教室まで送り届け、そのあととんぼ返りして下の娘を保育園に送り、前日の夜に処方外の眠剤を用法・用量を超えて飲んでいる妻を起こして一緒に朝ご飯を食べ、必要があれば昼ご飯を食べ、15時には息子がようやく帰りぐらいはひとりで歩いて帰ってきてくれるようにはなったのでだいぶ楽にはなったけど、妻一人で子供の面倒を全部見るには力不足で、17時には娘を保育園に迎えに行き、夕食を食べて、親戚から

1か月ぐらい頼むと預かったものの、不幸にももう2年近く家で面倒を見ているかわいそうな大型犬

の散歩をし、子供を風呂に入れ、妻と子供を寝室に横にして寝るまで隣の部屋で在宅で仕事をしている、というちょっと特殊な仕事スタイルをしているのです。ちょっと大変そうでしょ。

 少し前までは息子も車で学校に迎えに行ったりしていたのですが、一人で帰ってこれるようになったり、妻を一人で家に置いておいても大量に薬を飲んだりすることが少なくなってきたので(というか、これまでちょっとの時間用事で会社に行く間も難しかったところから、少しずつバイトに行く時間を延ばしていって、適応をうまくできるように調整した結果でもある)、子供たちが学校や保育園に行っている間の
昼間にスキマタイミーをし
それ以外の時間と夜間に本業の仕事をする

というスケジューリングに成功したのです。そのため、タイミーの取れる時間は朝食後の10:00から、娘を17時に保育園に迎えに行けるよう16:00の間。土日は在宅で仕事をする、というスタイルを確立しました。

この間だけで働ける案件、シェアフルや他のアプリには出てないです。
タイミーしかなかったんだよ。

そんなこんなでタイミーを初めて4か月。その成果はこんな感じ。

    

 

いや、なかなかやってるね。

しかもこれ、先述した非常に限られた副業時間の「スキマバイト」を、ここに書いたやり方でガシガシ拾っていった結果です。
勤務時間77hを回数35で割るとなんと一回平均2.2時間。普通にタイミーしてる人をツイッターなんかで検索すると、こんな短時間になってる人は少ない方です。

11月、本職が忙しくて少しタイミーを減らさざるを得なかったので収入がへこんでます。現状月平均4万円程度は副収入として確保できたことになります。そのため確定申告が必要です。給与明細はアプリからダウンロードできるので結構楽そうです。
あと、源泉徴収されていないので、確定申告時に所得税が増えることになりますが、
現在住宅ローン減税と定額減税が効いていて、所得税から引ききれていない状態なので、実質加算税額は今のところありません。

また、近年話題のAIプログラミング、「CursorAI」を会社の経費で契約してもらったため、ほぼすべてのソフトウェア開発業務をCursorAIが肩代わりしてくれているおかげで、脳みそから開発業務を追い出し、それに付帯する頭脳・肉体の疲れは80%以上不要になりました。そもそもこれが無かったら早々と業務だけでパンクするような状態でしたが。

 

CursorAIでプログラミングどころかリバースエンジニアリングもしてもらった記事

honeylab.hatenablog.jp

 

 あと、前に書いたように本職のスキマなので、どうしても出なきゃいけない打ち合わせとか出張が入ったときや、うっかり子供の行事、参観、また祝日などを見落としてタイミー枠を取ってしまったことがあり、これをキャンセルしたことがあるため、一般の優秀なタイミーさんと比べ、「キャンセル率」が少々高めになってしまっています。。。

 GOOD率、キャンセル率、直前キャンセル率は、30回の仕事に対する割合のFIFOになっているため、30回シフトすると0まで消えます。このパーセンテージは、雇用側から確認できるため案件によっては、「直前キャンセル率」ゼロを要求してくる会社も多くあります。この場合、条件不一致で先方から解除されることもあります。直前でない「キャンセル率」については、見てくるところとそうでないところがあります。

そんな特殊な環境で取った上記の仕事、43歳のおっさんが初めてやるアルバイトでもこなして行ける面白案件の詳細を次の記事で書きたいと思います。
また、現状本職があるので、丸っと時間をかけて安い時給で働くような仕事は取ってないです。基本的に以下の種類の案件しか取ってないです

・デバンニング(コンテナからの荷下ろし):一回2時間

・強制退去後の残置物片づけ(遺品整理ともいう):一回2時間
  →記事を書きました
  スキマタイミーまとめログ① 残置物片づけ案件 おすすめ度 ★★★ - honeylab's blog

・単身引っ越しの補助:一回2時間

・超絶レア案件、古物商オークション会場の裏方(これだけ半日)

本職に加えてスキマタイミー始めようと思う人には必見の内容になると思うよ
特に、残置物片づけは募集している時間働くということはほとんどなく、
早上がりで日当が保証されるので、時給効率としてはバカ高いです。
これを取る連中、みんな似たようなことやってるので、全然関係ない案件なのにそこそこ顔見知りばっかり、なんてこともよくあります。
あと、この方法で出てきても、飲食未経験者は特に、経験者でも飲食のバイトは止めたほうがいいです。短時間でかつ即戦力を求められ、ちょっと使えないとBADレビューを送ってこられてGOOD率が下がる、という噂をたくさん聞いています。
その辺のことまでここに書こうと思ったけど、ちょっと長くなりすぎたわ。

(※ただ、首都圏・大都市特有の案件が多いのでそこはごめんね)

 

来年になれば下の子が小学校に上がり、朝の時間が少し増えるので、今は10時からしか取れなかったものが9時からの開始のが取れるようになるので、もう少し仕事のバリエーションが増やせると思います。

ただ、夏苦手なんだよなぁ。。。外仕事は無理だよなぁ。。どうにかなるかなぁ。。。

 

つづき

honeylab.hatenablog.jp

honeylab's blogの主は日常的にお仕事を探しております

なんだか好き勝手やっているように見えますが、一応正社員としてやっていますが
何せお仕事はいくらあってもいいものだと思います。

どうにかもう少し将来に向けてマネタイズの方法を考えたりしてはいるんですが、
どうにもヘタクソでうまくいきません。ちょっとかわいそうな気がしませんか私。

正社員ですが、特に副業を禁止されているわけでもなく、自分の分野にあった業務であれば、積極的に収入につなげていきたいと思っています

というわけで、一応それなりのプラットフォームに登録してみたりはするんですが、
なかなか今の生活の形との兼ね合いもあり、困ったことに、
まともな会社?でまともな就職をした経歴もなく、まともなスキルセットもないので、そこから特につながったことはまだありません。

 

【中小企業向け】IoTデバイスのプロトタイプ開発を支援します|プログラミング・システム開発(その他)の外注・代行|ランサーズ

 

ATOMCamの改造を通じて一件、結構お仕事を頂いたことはあったのですが、ビッグサクセスとまでは行かず、受託開発の部分のみでクローズしてしまった感じでした。

このブログには、電子工作、分解、ソフトウェア解析、セキュリティ関係、アングラ、等の技術情報がいくつか書いてあります。

・ATOMCam(WiFi Webカメラ)のカスタムファームウェアを勝手に作ったり

・呼び込み君を分解して解析して、勝手にカードを書き換えられるようにしたり

・普段の業務では、遠隔地に自律電源で動作する、環境情報を取得するような機器をゼロから作ったり

第二種電気工事士

普通自動車運転免許(MT、3.5t限定)

・電子部品のデータシートから回路設計、マイコンファームウェア開発まで

・でかいLinuxサーバ運用よりは組み込みLinuxの方が得意です

ラジオライフ記事掲載あり、技術系同人誌複数]

    同人誌の取り扱いはこちら:https://honeylab.booth.pm/

・一応SwiftUI、VisualC,C++,.NETでのアプリは普通に書けます。

・業務でESP32を使用したハードウェアをちょいちょい作っています

この分野で何かの業務に関するご相談、受託開発のお問合せ、コンサルティング等、
業務としてお受けすることが可能なことがありましたら、是非メールやそのほかSNSからご連絡いただきたいと思います。

hiromitu2120@gmail.com

x.com


まぁ、このブログの主だと考えたら、真面目な大きな会社の方は引いちゃうやつだとも思うんですけどね。

とりあえず、現時点で技術的な内容での副業は全く受注できていないため、これから本業の仕事の合間にマジでタイミーやメルカリハロで小遣いを稼ぎに行くぐらいの状態なので、その時間を何かしらの技術開発に使ってみたいと思われた方、是非ご連絡いただきたく思います。

後、このスキルセットで営業をかけるのに便利そうなプラットフォームがありましたら教えてください。

EPEverのチャージコントローラーからmodbusでデータを取ろうとしてハマった記録

弊社、離島なんかに太陽光パネルで自律動作する農業用モニタリングポストなんかを設置しているんですが、中に使っているチャージコントローラから電圧や電流なんかをモニタリングしたいんですよ。

http://www.vill.minamidaito.okinawa.jp/pdf/youran-pdf/14_industry.pdf

 

www.youtube.com

お、件の農業用ポストもチラ見できる、プロジェクトのYoutubeチャンネルなんてあるんだ。

動画1本、チャンネル登録者8人。これはひどい。(自画自賛

 

で、最近のそういうのはWindowsスマホからデータを取得するアプリがついているんですが、そういうアプリでは不便なので、modbus経由で取得できるようになっています。(できた順序はたぶん逆なんだけど、一般ユーザはmodbusなんかは触らんのでな)



で、今使ってるEPEEVERのTracer 2610っていうやつ生えてるmodbusポート用の接続ケーブルを買ってあったんですが、

https://www.epever.com/product/rs485-4llt-accessories-communication-cable/

Windowsからはデータが取得できるんですが、モニタリングポストに入ってるのはラズパイなので、そのままでは使用できないんですよね。

 

(いま気づいたんだけど、このWindowsアプリ .netで書かれてるので、実はmonoで動いたりしないかなw)

というわけで、このケーブルを使って生でmodbusを触ってデータを取ろうとしたんですが、全然取れない。
EPEVERのチャージコントローラは多数あって、いずれも同じプロトコルで取れるはずで、実際に汎用の485トランシーバーを使って取得している例は多数あります

www.youtube.com

ほかのTracerのモデルだと、modbusポートが端子台だったり、RJ-45だったりするので、そういうことをやる人は大体直接ケーブルを突っ込んで、自分のトランシーバでやってるんですよね。

 

https://community.blynk.cc/t/epsolar-tracer-2210a-charge-controller-blynk-epic-solar-monitor/10596

 

でも、なぜかいま手元にあるモデルは、変な4ピンの防水ケーブルがついてて、それとUSBを変換する純正のケーブルなので、これを加工するのは一寸めんどくさい。なので、できればこのケーブルのまま取りたかったんですよ。

 

このUSBケーブルの中に入っているチップは、XR21V1414というやつで、RasPiの標準ドライバに入ってたり入ってなかったりみたいで、どうもドライバをビルドしたりしないといけなかったり、はたまた標準のUSB-CDCドライバと喧嘩したりして、なんか動作が安定しませんw

www.maxlinear.com

どうにかドライバが入ったので、pyserialやpymodbusを使って、modbusデータの送受信を試しますが、どうしても応答が帰ってこない。

modbusで使われるRS-485は、送信時にデータイネーブルするとバスをつかみ、データ送信が終わったら、バスを開放してデータを待つ、という半二重プロトコルです。

近年のパソコンのI/Fで、こういうタイミング重視の通信を直接することはないので、USBからの変換の場合、RTSを使ったハンドシェイクでバス開放を行うか、データの送信バッファがない状態ではタイミングを見計らって自動でバスを解放してくれるような仕組みになっているものが多いです。

 

別の485受信機やオシロスコープををパラレルにつなぎ、信号をモニタリングしてみたんですが、どうやらマスタからコマンドを送った後、バスの開放が全然起きません。
これが原因だと考えてあちこち調べてみたところ、XR21V1414もどうやらRTSによる自動開放を行ってくれる、というところまではたどり着きました。Windowsのアプリでは、これを利用してmodbusコマンドがきちんと送受信されている模様。

では、Linuxでもうまくいくはず、と同じようにやってみたつもりなんですが、最初にCursorに書かせたpyserialとpymodbusを使ったプログラムがどうしてもちゃんと動かない。バスが解放されない。


なんでや、と探したところ、同じようにpythonで書かれた、まさに同じことをしているライブラリを見つけたので動かしてみたところ、やっぱり動かないw

github.com

「純正ケーブルはWindowsでならちゃっちゃと動くけどRasPiはめんどいよ。カスタムでケーブル作れよ」なんて書いてあります。おお、やっぱりそこでハマってるんだ。

同じコードでWindows、しかもPython上ではさっと動く、のにLinuxでは動かないらしい。これは今のところ仮説と誰かがどっかでつぶやいていたんですが、pyserialとpymodbusでRTSを使って送受信を切り替えようとすると、それがめっちゃ遅い、可能性がある、というところのようです。ハードウェアハンドシェイクにしたらそんなことはないだろ、と思ってちょっと試してみたんですが(やり方があってるのかはわからんのですが)やっぱり動かない。マジかよ。しゃぁないやってみるか、と生のCを使って例によってハードウェアRTSを指定してmodbusコマンドを投げたところ...サクッと動いた。。。まじか。


int configure_serial_port(int fd, int baudrate) {
    struct termios tty;
   
    if (tcgetattr(fd, &tty) != 0) {
        perror("tcgetattr");
        return -1;
    }
   
    // ボーレート設定
    cfsetospeed(&tty, baudrate);
    cfsetispeed(&tty, baudrate);
   
    // 8N1設定
    tty.c_cflag &= ~PARENB;        // パリティなし
    tty.c_cflag &= ~CSTOPB;        // 1ストップビット
    tty.c_cflag &= ~CSIZE;         // データビットサイズをクリア
    tty.c_cflag |= CS8;            // 8ビット
    tty.c_cflag |= CRTSCTS;        // RTS/CTSハードウェアフロー制御を有効化
    tty.c_cflag |= CREAD | CLOCAL; // 受信有効、モデム制御無効
   
    // ローカルモード
    tty.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
   
    // 生入力モード
    tty.c_iflag &= ~(IXON | IXOFF | IXANY);
    tty.c_iflag &= ~(ICRNL | INLCR | IGNCR);
   
    // 生出力モード
    tty.c_oflag &= ~OPOST;
   
    // タイムアウト設定
    tty.c_cc[VMIN] = 0;            // 最小文字数
    tty.c_cc[VTIME] = 1;           // タイムアウト(0.1秒)
   
    if (tcsetattr(fd, TCSANOW, &tty) != 0) {
        perror("tcsetattr");
        return -1;
    }
   
    return 0;
}

 

もしかすると、XR21V1414のRTSは、汎用GPIOを使って制御しているらしいので、ここの実装がタコなのかも???

 

というわけで、pyserialとpymodbusを使って、得体の知れない、メジャーではないRS-485変換器を使ってmodbusデータをRasPiで取ろうとすると、変にハマることがある、というお知らせでした。

 

んんーーーーー、これだけやって、純正ケーブルで取れるようにしたが、これはダメな気がする!!ケーブルぶった切ってもうちょっとましな485トランシーバ、もしくはGPIOから直接変換したほうがましな気がするぞ!!!

っていうか、このポートに挿せるBLEやWiFiの変換器が出てるらしいので、たぶんこっちを使ってほしいんだろうな。。

 

CursorAIでリバースエンジニアリング(AIプログラミング)

長らくリバースエンジニアリングで遊んでいますが、特にリバエンだと、何か気が付いたことがあったときにそれを迅速に確認したり、仮説をもとにいろいろな実装を組んでみたり、などのエンジニアリング作業が発生することが多いです
しかし、それを実装しようとしても実装に時間がかかったり、試しているうちにやっぱり違った、となったり、うまくいかない理由が実装のミスだったりして、なかなかエネルギーがけずられることになることが多いです。

しかし、最近導入したCursorを使えば、仮説をもとにプログラムを実装してもらったり、ちょっと実装を変えてもらったり、という人に頼んだらブチ切れそうなこまごまとしたプログラミングのトライアンドエラーをいくらでも試すことができます。
これはとてもリバエンと相性がいいと思います。(データ解析とかもそうかもね)

 

というわけで、今回は部屋に転がっていた2000年ぐらいのカラオケマシーンの外付け機器である、CD-ROMチェンジャーの中に入っていたカラオケデータCDを解析してみることにしました。

 

対象機器はBMBのBeMAX’ sというとうの昔にサービスが終了したマシンです。
通信カラオケは回線経由でデータが送られてくるため、CD-ROMがなぜ必要なの?と今の間隔だと思いますが、黎明期にはまだHDDが高価で容量も小さかったため、それを補うためにリリース済みの曲は外付けCD-ROMなどに収納し、差分だけが回線経由でダウンロードされるという方法だった時期があります。
この機器には4枚のCD-ROMが入っていたため、これだけで約2GバイトのHDD容量が抑えられた、ということになりますね。

 

以前動画CDだと書かれていたJOYSOUNDのCD-ROMは、ダンプすることはできましたが、ディスク全体に何らかの暗号化がかかっていて解析することができませんでした。

 

しかし、このCDは普通のISO9600フォーマットで、容易にファイルが取得できることがわかりました。

 

曲データと思われるファイルは拡張子PCTがついています

中身を見てみると。。。。-lh0-という文字列。。。。
ええええ?LHA形式のアーカイブ?????

ということで、lha x してみると中にファイルが入っていました。
以前誰かがTwitterのリプで何かの機種のデータがLHAだった、って言ってる人がいて、またまたー、とか思ってましたが、本当にあったのか・・・・

解凍してみると、拡張子dat,tmz,pcdのファイルが出てきました。

 

datは曲メタデータpcdは空に近いものが多いですが、もしかすると画像でも入ってそうな気がしました。

で、tmzのファイルはさらにlh5のヘッダ。解凍してみると。。。tmpという拡張子のファイルが出てきます。

なんかそれっぽいデータが出てきました

それっぽいデータ、というのはF0~F7のSysExや、0x9nのノートオンイベントなどです。

バイナリエディタで眺めてみると、これ以上暗号化されている気配はないです。

また、明らかにMIDIイベントのようなデータがたくさん見えてきました。
このままエクスポートできる気がしますが、よくよく見ると、タイムコードがありません。

 

ChatGPTにhexdumpを食わせてみると、大変寄り添ってくれました。


MIDIイベントの塊の前には、明らかにインデックスっぽいものが入っています。

ChatGPTも私と同じ意見です

このままではChatGPTに勝手にプログラミングを始められてしまうので、ここはCursorにやってもらうことにします。


これがいるのかどうかわからないですが、まず、これからやることを宣言します

MIDIデータを含むバイナリファイルからSMFファイルを出力する フォーマットは道なのでこれから解析していく

「未知」を道とtypoしましたが、わかってくれたようで、なんかいきなりやる気を出して、SMFファイルを書き出すpythonスクリプトをいきなり書きやがりました。すげぇ。

先走りしているCursorをなだめながら、わかっていることを叩き込んでいきます

・フォルダ内にある拡張子tmpのファイルが解析対象になる このファイルは先頭部分に一定サイズのヘッダがあり、続いてMIDIイベントタイムスタンプまたはデルタタイムを含むインデックスエリア、そのあとにタイムスタンプの無いMIDIイベントの羅列が含まれる タイムスタンプデータをもとに、適切な数のMIDIイベントを拾い上げて、タイムスタンプ付きのMIDIデータに再構成する必要がある

・仮の構造として、0x78バイトまでは未解析のヘッダとして取り扱う タイムスタンプブロックが始まり、「8バイトのイベントサイズ構造体(先頭4バイトは未解析のビッグエンディアンのDWORD値、2バイトでイベントのバイトサイズ、2バイトは未定義)、続いて8バイトのタイムコード(先頭2バイトは未解析、2バイトのイベントコードA、2バイトのデルタタイム、2バイトのイベントコードB)」の16バイトセットが続く イベントコードBが0003になったところでタイムスタンプは終わる

頼んでもいないのに、ログレベル可変のlogging機能まで実装してくれていますので、注文を追加します。

・TImestamp blockのlogのINFOで、何バイト目を処理中なのかを表示して また、仮に10ブロック読んだところでいったん強制終了して

書いてもらった仮コードをもとに、何回か実行してフォーマット仮説をアップデートしていきます

・タイムスタンプブロックに割り当てられるイベントサイズはMIDIイベントの個数ではなく、イベントを構成するバイト数のこと

・イベントブロック一つに対して、既定のバイト数読み込んだらMIDIデータのカーソルはそのバイト分進めて、次のイベントブロックを処理し、そこに割り当てる いまの動作は違う気がする

MIDIデータにランニングステータスが使用されているように見える そのためUnknownと表示されているようだ ランニングステータスを解釈できるようにしつつ、MIDIイベントとして破綻したデータが発見されたら直ちにそのバイト位置を​表示して異常終了して

・デルタタイムの処理を明確にする タイムスタンプブロックに入っているデルタタイムは、そのブロック処理後に現在再生Tickに追加される これをもとに、MIDIイベントの再生ポジションを設定し、表示して この時点で処理可能ならSMFのためのストリームに設定してエクスポートしてみて

・SMF出力時の時間分解能の値を48に

・absolute tickのカウントアップは、次のTimeBlockを読み込んだ時で、同じTimeBlock内にあるMIDIイベントは同一absolute timeに

・0x48から始まる2バイト、BEがSMFの分解能になる

・4バイトだと思っていたが、1バイト目はどうやらフラグの可能性がある 下位3バイトだけをテンポとし、1バイト目はフラグとして扱ってみて また、フラグがあったブロックはそれもプロパティとして

 

細かい注文を付けていきます。これ、興味がない他人にやらせたらブチ切れると思います。

っていうか、何でこの注文を理解して、応答が生成されるのか、マジでもうAI意味わかんないです。

 

あれやこれややった結果、高々数時間でカラオケ用のデータからSMFファイルをエクスポートすることができました。
AIすごい。
ある程度のリバエンの知識があれば、このような推測をもとに未知のファイルフォーマットから必要なデータを取り出すようなプログラムができてしまいました。

 

 


今回マジで一行もコード書いてません。っていうか、私Pythonのコード書けないです。

ソースコードはこちら

https://gist.github.com/bakueikozo/e41a7a788fe19335b5a1ebc7248c4ca5#file-tmp_midi_extractor-py

とはいえ、これは1990年代に作られたようなシステムのデータであり、暗号化や復号化のレベルはたかが知れています。
最近のシステムや、もっとがっちりしたプロテクトがかかっているものの解析を、放り込んだだけでできるようなものにはまだまだならない気がします。

ただ、こういった古い機器に埋まっている貴重なデータの解析、今まで自力でコードを書かないといけなかった部分をAIにチャチャっと、マジでチャチャっとやらせることができるため、人生においてリバエンに使うことができる時間を増やし、より多くの収穫を得ることができるようになったと思います。

 

さらに多くの収穫を得るため、CD-ROMの内容をいったんハードディスクにコピーし、
この中身を再帰的に解凍し、メタデータとともにファイル名を付ける上位スクリプトを作成してもらいます。

 

できちゃった。すげぇ。
手元にある4枚のCD-ROMのタイムスタンプを見るに、どうやら2000年ぐらいまでのデータが入っているっぽいです。

これはとっても大事なコレクションができました。わいわい。

 

令和カラオケ羅生門まとめ

ジャパニーズ文化代表のカラオケ

テープ、8トラから始まり、LDをとともに日本のカラオケ文化を牽引した通信カラオケ

この通信カラオケの技術の礎となったのは、DTMでよく使われるMIDI音源

MT-32やSC-55、88、XG音源など、パソコンやゲームの界隈では一般的な外付けモジュールとして目にする機会は多かったものの、通信カラオケでそれがユーザーの目に触れる機会は多くありませんでした。

なぜなら相手は業務用機器。カラオケコマンダは定価では数百万円する上、一般流通にはあまり出てきません。しかしいまはヤフオクで過去のカラオケ機材が数千円で手に入ってしまうため、マニアの格好のオモチャとなりつつあります。

 

私が以前分解して同人誌にあれこれまとめたDAMのカラオケ

honeylab.booth.pm

DAMシリーズは、YAMAHAと共同開発が行われているため、基本的にXG互換のMIDIデータ、音源が使用されていますが、特定の型番はいまだに明らかになっておらず、珍しくこちらのYoutube動画でその姿を見ることができます。

https://www.youtube.com/watch?v=ArYog2T7fRM

このモジュール、実機の音源基板がそのまま収められていると思われ、また、XG1000の本体ソフトウェアの解析結果から、単体でもおそらく鳴らすことができるはず、ということを前々からみんなで言ってはいたのですが、なかなか実現までやってみるか、という人が現れずにいました。そんな中、XG1000の遠い先祖である、DAM-6400に内蔵されている音源を単体再生できたという知らせが。

上記のように、音源基板を取り出して適切にMIDI信号を突っ込んでやると、見事に音が鳴ったとのことです。

ちなみに、XG1000ぐらいの世代のカラオケ機では、本体がLinuxで動作しており、USBデバイスとしてFPGAで構成されたマルチポートMIDIバイスが存在し、その先では普通に312500kbpsのMIDI信号が流れている、という構造になっています。
音源チップからでる信号ははデジタル(I2Sみたいなの)なので、そのデコーダがボードに載っていない場合はDACを外付けしないと音が鳴りません。

 

続いて、DAMシリーズの中で大変異色な機種「G70」というのがありまして、こいつ、シリーズの中でなぜか、本当になぜか内蔵基板がRolandになっているのです。


そして、過去に分解された情報から、SC-88Pro相当のものが入っている、という噂がありました。

 

それを元に分解アタックされた結果、見事にその通りで、やはり単体音源として再利用可能だったようです。

 

 

特にSC-88Proは音源セットなどの関係で需要があるようで、ヤフオクで今まで1円でも売れなかったようなG70のガラクタがなぜか突然売れ始める、という現象が起きているとのことです。

ってハチプロ高!!

この辺も、実際カラオケはハチプロの音がするよなー、でもほんとかなー、って思っていた人たちが、中身をちゃんと見てやっと本当にハチプロだった!ってってるのがおもろいよね。

 

そんな感じで盛り上がっていたので、せっかくなので私ももっと古いやつから音源ボードを剥いで動かしてみました。

ターゲットはVictorの孫悟空Rolandと書かれたMIDI音源ボードが刺さっていました。

 

 

ピンを適当に当たったり、Rolandの他の音源のサービスマニュアル・回路図などを参照すると、どうやら簡単にMIDI音源化できそうです。

 

 

DACを持っていなかったので、同じVictorに載っていたやつを剥がして繋いだのですがなぜか音がしない・・・


仕方ないので、別の古い機体、JOYSUNDのMJ-10にもRolandの音源が載っていたので、それの先につながっていたDACを繋いでみたところ

 

見事再生成功。

 

音源に対して音色セットの要求をしてみたところ、SC-88無印相当までの音色が入っていたので、これは88相当の音源なんだと思います

 

ところで、、、載っている「RA09-002」というチップは「XP6」という名前で各種Rolandの音源や楽器に使用されています。この型番で調べていたところ、こんなものを見つけました。

www.vogons.org

なんと、このカラオケ音源内蔵モジュールを引っこ抜いて、DACをつけ、USBMIDIとセットで製品として中国で売られていたというのです!

https://www.vogons.org/download/file.php?id=193135&mode=view

すげぇぇwwwさすがすぎるwww

いや、先にやられてたのちょっとショックだわ。っていうか、インターネットとかでこういうふうに情報が出てくるよりももっと前に、これをできる、って作っている人たちはいたんですねぇ。すごいすごい。

この変な製品に入っている基板には「02ーSC-NK」と書かれています。ほぼ同じ部品が使われたバージョン違いの「01-SC-VI」を私は持っていました。SCはきっと「SoundCanvas」のことおそらくNKはカラオケ「BeMax」をリリースしていた「日光堂」、そして「VI」はこの「孫悟空」をリリースしていた「Victor」の略だと思われます。基板自体も本体の他の基盤とはプロセスで作られているように見えますので、Rolandは業務用としてたくさん音源モジュールをOEM製造していたんですね。おもろいおもろい。

 

さて、こんなふうに過去のカラオケ基板の生きているかもしれない体から音源ボードだけモイで遊んでいる姿を見ていて、ふと老婆の声が聞こえてきませんか。

 

「この板を抜いてな、この板を抜いてな、音源ボードにしょうと思うたのじゃ。」

iOS+SwiftUIでBLEアプリとESP32でBLEペリフェラルを作っていてハマったところ

 

仕事でBLEペリフェラルバイスと、それに繋げるアプリを作っていて、
自分で作ったBLEデバイスに絞ってパッと一覧を出したかったので、

https://zenn.dev/tomo_devl/articles/d58abecf10c599

に書いてある

scanForPeripherals(withServices:options:) を使用するとペリフェラルを検索でき、stopScan() を使用するとペリフェラル検索を停止させることができます。
サンプルでは接続されているかどうか確認し、されていなければペリフェラルを検索しています。
scanForPeripherals の withServices にUUIDを指定してあげれば特定のペリフェラルに絞ることができ、nil を指定してしてあげればすべてのペリフェラルを検索することができます。

を実装したところ、全く思った通りに動かなかったので仕方なく名前とかの検索で進めてたんだけど、流石に不便で、接続してサービスを取得する、を繰り返す、しかないのか???と思ってたんだけど、デバイスペリフェラル)側のサービス一覧に載せるだけではなくて、
アドバタイズパケットの提供サービスのところに記述を追加しないとセントラル側からはサービスがあるかないか、接続しない限りはわからないのだった。

今はBLEのパケットについて一通りわかったのでそうわかれば納得だが、始めた頃に手探りで実装していたので全然気づかなかった。

このへんの流れを書いてある系の記事を何個か見たけど、そこまで書いてあるところには辿り着いてなかった。大体はすでにできてるデバイスのわかってるアドバタイズを拾えば十分だからだろう。

 

記述例(ESP32 Arduino

// Create the BLE Service
// このサービスは接続してからしか取得できない
BLEService *pService = pServer->createService(BLEUUID(SERVICE_UUID_XXXXX),32);

// Create a BLE Characteristic
pTxCharacteristic = pService->createCharacteristic(CHARACTERISTIC_UUID_TX,
BLECharacteristic::PROPERTY_NOTIFY);
// pTxCharacteristic->addDescriptor(new BLE2902());

BLECharacteristic * pRxCharacteristic = pService->createCharacteristic(
  CHARACTERISTIC_UUID_RX, BLECharacteristic::PROPERTY_WRITE );

pRxCharacteristic->setCallbacks(new MyCallbacks());
InitBLEParams(pService,new MyCallbacks());
 
pService->start();
// Start advertising
pServer->getAdvertising()->addServiceUUID(SERVICE_UUID_XXXXX); // アドバタイズパケットに載せる
pServer->getAdvertising()->start();

 

iOSアプリ側

centralManager.scanForPeripherals( withServices: [serviceUUID], options:  nil)

ESP32側でaddServiceUUIDをしておかないと、withServicesをnilにしないと検索されない

 

ーーーーーーーーーーーーーーーーーーーーーー

珍しくプログラムのこと書いてるけど、まぁ、そういうのも書いといた方がアクセスあるかもだし、と思ってこういうこともこれから書くことにしてみる。
毎日分解ばっかりはしてられないらしい。

SHEINで子供用カメラを買ったら爆発寸前だった話

あえてタイトルにこう書いてますが、まぁSHEINに関わらず国内外どこで買ってもついて回る問題ではあるんですよね。

嫁が子供用にSHEINで発注してくれていたんですが

(ウチの兄妹になんか買う時には必ず二つ買っとかないと大喧嘩するので水色とピンクの2つ)、

渡す前に電源はなんだっけ?と確認したら充電式のよう。ではチェックしてみるか、と開封してみたところなんとよりによって兄の分の水色のやつ、電源が入らないことに気づきました

 

Image Image

 

こういうもの、子供に渡す前に一旦チェックしておかないと大変めんどくさいことになるんですよね。

たとえばこんなのとか

ピンク色の方は電源も入るし、USBコネクタを刺すと充電されていました。

しかし、水色の方は電源が入らず、USBコネクタを挿しても赤ランプが点灯し、充電アニメーションが起きません。

内蔵バッテリーが劣化しているか、断線などが起きていて充電されないのでは、という野生のジャンカーの勘が働き、SHEINで不良申告したところで次いつ来るかもわからんし、とりあえず開けてみるか、と精密ドライバーでネジネジImage

ぱっかーん

 

あああああああw電池パンパンwwwww

過充電か過放電、もしくは初期不良により妊娠状態です。これは危ない

慎重にバッテリーを両面テープから外して配線を切断し、たまたま庭に掘っていた穴に埋葬します。こうしておけば自然に大地によって放電され、危険のない状態になる気がします。

 

手持ちの在庫を調べたところ、たしかDAISOのBluetoothスピーカーに入っていたような気がするLiPoがあったのでこれと交換することにします。入るぐらいの大きさってことは、充電回路も大差がないはずですImage

交換して充電したところ

復活!

Image

 

SDカードを入れなくても内蔵領域で多少撮れるれるようです。

 

で、SDカード入れて撮影解像度を1080pにするとこんな感じ

1080pとは!!!!(左下のタイムスタンプを見ると画像がちゃんと1080なのわかるね!!)

 

ところで、USBケーブルで繋いだときにどうやらPCカメラとして認識してくれることが発見されましたがImage

残念ながらそういうふうには動いてくれないようでした。ざんねん!

Imageいやぁ、爆発しなくてよかったねぇ。