chakokuのブログ(rev4)

テック・コミック・DTM・・・ごくまれにチャリ

お越しいただきありがとうございます。

このブログでは主に以下の内容を記載しています(自分の記録用)。

  • 何か作った話(自分は何かを作るために生きている..できたらクスっと笑えるものや、アートと絡みたい)(何かに手を出しても続かず、飽きるのが問題)
  • 音楽(AerophoneやDTM(FL-Studio))を勉強しようと思ったが、音楽はレッスンが続けられないので、、絵に転向しようとしたが、DTMに戻った(が、悶々とするだけで何も作っていない)
  • 趣味のロードバイク(坂道をひーこら走ると結構大変な人生(笑)と重なる。。その後、定年・再雇用で仕事のストレスが軽いのでほとんど走っていない。。いかん)

記事が渾然一体となってカオス状態ですが、マイコンのプログラムも、ちゃりで走るのも、料理するのも、自分の中ではそれぞれが繋がっているので、カオスな日常をそのまま反映させています。リンクや引用はご自由にどうぞ。質問等ありましたらコメントに書いてください。微力ながら自分の分かる範囲で回答します。
とにかく、、人に「あほやなぁ」と言われる事に精進するのが我が人生。へこんでも創造の力で進みたい
■2023年修正
当初は「あほ道」を進む予定だったが、「あほ道」は情熱と強い信念がないと進めない。自分は歳と共に情熱が落ちてきた。残りの人生は「ワクワク」や「面白い」ものを追いかけたい。ワクワク+面白体験に人生残りの時間とお金をかける*1
定年再雇用後はこれまでの仕事を少し減らして、プログラミング学習の支援活動を行う予定(愛想悪くて生徒様からチェンジ要望が出されるかもしれないが)

*1:ちなみに7月で定年・再雇用

Windows11 なぜかローカルPCのhome配下がOneDriveに引っ越し

OSのアップデートが走って、「DocumentsをOneDriveにバックアップしましょう」的なメニューが出てバックアップか、、まぁお願いしておこうと有効にしたら、そのうち、home配下がすべてOneDriveに行ってしまって、ファイルエクスプローラーから見えるhomeがOneDriveに向くようになってしまった。なんと。。cygwinから自分のhome_directoryに入ると空になっている。
OneDriveはバックアップにありがたいが、ローカルのファイル一式を勝手にクラウドに持っていかれるのはどうかと思うが・・*1
Windows11はおせっかいな仕様がクセ強で困る。もっとシンプルでいいのだけど。
自分の不勉強もあるが、Windows11は慣れないせいか何をしでかすか予想がつかない。

*1:正確には、c:\\Users\\OneDrive\配下にユーザディレクトリの内容を全部移して、このディレクトリ配下のファイル一式をクラウドど同期をかけている??

owonのオシロを買い替え

10年以上owonのオシロを使っていたが液晶がまともに表示されなくなった。趣味のマイコン+センサの試作では、このオシロには大いに助けられた*1。もう少しマイコン+センサの試作は続くので、後継機を買う必要ありと判断。会社のオシロはアジレントとかだけど、趣味で使うのにそんなのは高すぎるので、、前回同様owonにした。新しいオシロは3万円ちょっとで4ch。液晶も見やすくなって、デバッグがサクサク進むと期待したい。

■参考URL
このオシロは、2009年9月に買ったようだ。
PSoCを使って簡易MIDI楽器 - chakokuのブログ(rev4)

*1:PC同様お疲れ様でした!

Let's Noteの交代、お疲れ様+ようこそ

背景:10年以上前のLet's Noteを使っている*1。夏場はCPUの冷却が間に合わずサーマルスロットリングが発生して、ブラウジングもままならない状況になった*2
課題:ノートを買い替えたい。が、、金がない
取り組み:最初は中古(CF-FZ6)を考えたが、やはりB5ノートはキーボードのピッチが狭くてストレスになる。CF-F10と同じように、10年以上使うつもりでA4ノートを新品を買う。Let's Noteは個人使用の観点ではコスパ成立していない商品なので、ヨメさんともかなりもめたが最終的には決済取れた

発注して届いた。ようこそ新LetsNote(CF-FV)。。10年以上使ったらまたサーマルスロットリングするのだろうか。。

CF-F10を振り返る

CF-F10:
発売日:2011年2月10日
14.1型ワイド(16:10) WXGA+ (1440 x 900ドット)
インテル Core i5-580M vPro(2.66GHz) (ターボ・ブースト利用時最大3.33GHz)
RAM: 4GB (最大6GB) / HDD: 500GB
約1.62kg/約9時間駆動
キーボード全面防滴

変更したこと、手入れしたこと

  • RAMを増設、4GB->6GB
  • 内蔵HDDをSSDに変更
  • 空冷ファン掃除、マザーからヒートシンクをはずしてグリスを塗り直し

CF-F10の現在

  • キーボードは打ちやすくて全く問題ない(キーボードの底板の剛性感がいい感じ)
  • ゲームやバイナリのビルドには全く性能が足りないが、WSLでUbuntuが走るし、スクリプト系の開発であれば全く問題ない(サーマルスロットリングしない間は)
  • ブラウザでJSをガンガン走らせると、過熱して仕事しなくなる
  • Word/PPT程度であれば負荷かからないので全くストレスなく使える
  • Windows11には上げられない

というわけで、、用途を絞って、スロットリングさえ発生しなければ、このメモリサイズとCPU性能で全く問題ないのでした。最終的には冷却性能がボトルネックになっている。。10年以上前の製品ですけど。 筐体の作りはまったく問題なし!

■備考
Windows11でセットアップしているが、Windows11はアカウント周りが癖強すぎて、自分の普段使っているIDが使えない。セキュリティさえ対応してもらえればWindows10で問題ないのだが。。あぁ面倒。。

■追記
やはりシステムが勝手につけたIDでは気持ち悪い(慣れないし・・)ので、先人が解説してくれているように、いったんローカルアカウントで環境を仕上げたのち、ローカルアカウントをMicroSoftアカウントと紐づけして権限を付与してもらう流れで対応した。
細かい部分がまだちょっとおかしいが。。
自分で好きなIDを使いたい場合は、最初からローカルアカウントを使ってインストールを進めるのがよいのでは?と思った(MicroSoftに紐づかないIDでOSの初期設定が可能なのかどうか、もう一度インストールをやりなおさないとわからないが・・)

*1:新品ではなくて再生品のCF-F10を長男用に買って、長男から買い戻して使っていた

*2:こうなると、冷凍室の保冷剤の上にノートPCを置いて作業することになる。結露してPCにはまずい状況だけど。。

応援したいコミック; 春あかね高校定時制夜間部

今朝の新聞の書評欄に紹介されていて試し読みしたらタッチもストーリーも良かったので買ってしまった。

定時制高校に通う生徒さんを一話単位で取り上げて、それぞれの人生が描かれています。みんな何かしらの問題を抱えているのだけど、優しい絵のタッチと軽い笑いで包まれています。まだ最後まで読んでいませんが、生徒の皆さんもコミックも応援したいという気持ちになります。このコミックの作家さんは、「heisoku」さんで、他の作品としては、「ご飯は私を裏切らない」があるようです。

■追記
8年前にもKindleで読んでるコミックの記事を書いていたようだ。ここに挙げた作品は今も好きなのは変わらない・・
Kindleコミック覚書 - chakokuのブログ(rev4)
一日のうち、かなりの時間をコミックを読んで溶かしている・・

Vueを学ぶ

背景:改めてJSを勉強して、超絶進化していることを知った。いつ使うのか知らなないが、Vueも使えるようになりたい
課題:Vueの仕様を理解する。できたら最新バージョンを理解
取り組み:Vue3.2の解説本を読んでプログラムを写経する

自分のPCのCygwin環境ではnode/npm/yarnがまともに動かないので、WSL環境のUbuntu でnode/npmを最新にする。先人の記事を参考に以下で最新化(toyonobu 様Zennの記事 感謝)

sudo apt update
sudo apt --yes upgrade
sudo apt --yes install nodejs npm
sudo npm -g install n
sudo n stable
sudo apt purge nodejs npm
sudo apt autoremove
sudo npm -g install yarn

上記操作の結果、一応以下のバージョンまで上がった

$ node -v
v18.17.1
$ npm -v
9.6.7
$ yarn -v
1.22.19

vue解説本に従い、素のvueを動かしてみる

cd lang/js/vue/
yarn create vite my-vite-todo --template vue
cd my-vite-todo/
yarn
yarn dev

上記で素のvueが構築され、 http://localhost:5173/で稼働中と表示されたので、ブラウザでアクセス

とりあえず、、コンポーネント間の連携、サーバとブラウザ間の連携ぐらいは実装できるようになりたい。

解説本に従ってコードを打ち込んで、ToDoListが登録できるところまでは進んだ。

■ご参考URL
UbuntuへのNode.jsのインストール

参考にしている本 (Kindle Unlimitedを契約していたら0円)

サンプルコードはシンプルで、Vue3.2で書かれているので、最初に読むのに適していると思います。

■補足
Vue3.2で書くとコンパクトに実装できますが、Vue一命令の裏では展開された複数のJSソースコードが動いているので、Vueの動きを完全に理解するには、どんなJSに変換されるのかまで理解する必要があると思います。そこまで時間をかけてVueを勉強するか、あるいは、細かい挙動が分からないけど、だいたい使えたらいいで留めておくか・・・Vueで商用コードを書くわけではないから、、何となく理解したレベルで留めておこう。

試作:Amazon RekognisionのComparing facesを使ってみる

(別の課題もあって)いつまでもこれにかかっているワケにはいかないのだが、気になる(+結果が分かりやすい)ので引き続きCompare facesを調査
AWSが提供しているサンプルコードは以下。めちゃくちゃシンプル。S3上ではなく、ローカルに存在するイメージファイルを2つ指定して画像間の一致を計算するサンプルと理解。

# Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved.
# PDX-License-Identifier: MIT-0 (For details, see https://github.com/awsdocs/amazon-rekognition-developer-guide/blob/master/LICENSE-SAMPLECODE.)

import boto3
def compare_faces(sourceFile, targetFile):

    session = boto3.Session(profile_name='profile-name')
    client = session.client('rekognition')
    imageSource = open(sourceFile, 'rb')
    imageTarget = open(targetFile, 'rb')
    response = client.compare_faces(SimilarityThreshold=80,
                                    SourceImage={'Bytes': imageSource.read()},
                                    TargetImage={'Bytes': imageTarget.read()})

    for faceMatch in response['FaceMatches']:
        position = faceMatch['Face']['BoundingBox']
        similarity = str(faceMatch['Similarity'])
        print('The face at ' +
              str(position['Left']) + ' ' +
              str(position['Top']) +
              ' matches with ' + similarity + '% confidence')

    imageSource.close()
    imageTarget.close()
    return len(response['FaceMatches'])

def main():
    source_file = 'source-file-name'
    target_file = 'target-file-name'
    face_matches = compare_faces(source_file, target_file)
    print("Face matches: " + str(face_matches))

if __name__ == "__main__":
    main()

Boto3の仕様書によると、対象ファイルはローカルに置かれている場合、S3に置かれている場合の両方が可能。教材としては、まずS3に画像をアップしてから、S3上のSourceとTargetを比較する方法で実装する方針
JSのサンプルは以下。前回作成した、Face Detectとほぼ同じ手順で実行できるので、ファイルを2つにして、API名を変えるだけでNodeを流用できそうだ

// Load the SDK
var AWS = require('aws-sdk');
const bucket = 'bucket-name' // the bucketname without s3://
const photo_source  = 'photo-source-name' // the name of file
const photo_target = 'photo-target-name'

var credentials = new AWS.SharedIniFileCredentials({profile: 'profile-name'});
AWS.config.credentials = credentials;
AWS.config.update({region:'region-name'});

const client = new AWS.Rekognition();
   const params = {
     SourceImage: {
       S3Object: {
         Bucket: bucket,
         Name: photo_source
       },
     },
     TargetImage: {
       S3Object: {
         Bucket: bucket,
         Name: photo_target
       },
     },
     SimilarityThreshold: 70
   }
   client.compareFaces(params, function(err, response) {
     if (err) {
       console.log(err, err.stack); // an error occurred
     } else {
       response.FaceMatches.forEach(data => {
         let position   = data.Face.BoundingBox
         let similarity = data.Similarity
         console.log(`The face at: ${position.Left}, ${position.Top} matches with ${similarity} % confidence`)
       }) // for response.faceDetails
     } // if
   });

Node-REDのオリジナルNodeのソースは以下

module.exports = (RED) => {
    function compareFacesNode(config) {
        RED.nodes.createNode(this,config);
        var node = this;
        node.on('input', function(msg) {
            cmpFaces(node, msg);
        });
    }
    RED.nodes.registerType("compareFaces", compareFacesNode);
}

function cmpFaces(node, msg) {

   const AWS = require('aws-sdk');

   const REGION = 'us-east-1';
   const BUCKET =   <bucket_name>;   // e.g  'rekognition-bucket'
   const PHOTO_SRC =  <src_photo_path_filename>;  //  e.g.  'face001.jpg'
   const PHOTO_TGT =  <src_photo_path_filename>;  //  e.g.  'face002.jpg'
   const PROFILENAME = 'default';

   const credentials = new AWS.SharedIniFileCredentials({profile: PROFILENAME});
   AWS.config.credentials = credentials;
   AWS.config.update({region:REGION});

   const client = new AWS.Rekognition();
   const params = {
     SourceImage: {
       S3Object: { Bucket: BUCKET, Name: PHOTO_SRC},
     },
     TargetImage: {
       S3Object: { Bucket: BUCKET, Name: PHOTO_TGT},
     },
     SimilarityThreshold: 70
   }
   console.log("i'll call AWS Recognition (comparing faces)");

   client.compareFaces(params, (err, response) => {
        if (err) {
           console.log(err, err.stack); // an error occurred
           msg.payload = "Error at AWS Rekognition (comparing faces)";
           msg.payload = err;
           node.send(msg);
        } else {
           console.log(`comparing faces with: ${PHOTO_SRC}/${PHOTO_TGT}`);
           msg.payload = response.FaceMatches[0];  // care...  take first object without check
           node.send(msg);
       }
   });
   return (true);            // no need return value
}

上記オリジナルNodeをNode-REDに登録して、2枚の写真をS3にアップして比較してみた。適当に自分の顔を撮影した2枚の写真ですが、類似度は99.996と判定された。上記JSソースは、一致度配列の要素が1以上を前提に組んでしまっているので、一致しないケースを想定して、sizeチェックしてから、先頭要素を取り出すべし

残作業

  1. ソースの仕上げ(要素数確認、エラー処理等)
  2. S3アップロードNodeにおいて、ファイルが固定なので、上流Nodeでファイル名指定できるように改良
  3. 全体を1フローにまとめた場合に正常に動作するのかを確認
  4. compareFacesでは、ループで連続的に一致判断できるかを確認

おまけ
この4日間は、JS三昧であった(Pythonをほとんど使っていない)


■参考URL
イメージ間の顔の比較 - Amazon Rekognition
compare_faces - Boto3 1.28.35 documentation
Amazon Rekognition(高精度の画像・動画分析サービス)| AWS