kiyo_hikoのブログ

メモ+日記?

VimScript:プログラムソースコードから関数名一覧を配列に取り出す

というものを書いた 。 条件を変えれば色々に使いそうな予感。

考え方

① バッファの全行をリストにする
② 特定パターンでfilterする
③ 文字列置換で関数名だけ取り出してmapする

簡単!

現実に作ったもの

function FunctionList()
  let l:funs=getline(1, '$')->filter({ _,s -> s =~ '^[ \t]*function\W' })
  let l:result = []
  for l:fun in l:funs
    let l:fun = substitute(l:fun, '.*function[ \t]*', '', '')
    let l:fun = substitute(l:fun, '\W*$', '', '')
    call add(l:result, l:fun)
  endfor
  return l:result
endfunction

自分の目標は果たしたので一旦終わり。

消化できてない疑問(放置)

  • mapにlambdaを適用する方法が調べきれなかった。
    • 日和って別配列にaddするコードになった。
  • substituteが破壊的に文字列置換するのか副作用無しで結果を返すのかがよくわからない。
    • 日和って代入した。

PC-9821プチ改造メモ:V233のサイドファン交換

久々のPC-98ネタ。
自宅にあるPC-9821V233の機体側面にあるケースファン(サイドファン)が大変うるさくて不満があり、 2台あるV233のうちの2号機を使って静音化を試し、とても静かになったという話。
技術的には小二レベルの話だが自分用にメモしとく。

  • サイドファンがあるPC-9821VシリーズはV233M7V(E2/F2)のみなので、他の機種はこの改造対象外。
  • Vシリーズ以外だとPC-9821RsII、RvIIはサイドファンがあるのを確認した。面倒なので最近開けてないが、それらには同じ静音化ができるかもしれない。

サイドファンとは

ごく一部のフラッグシップ(多分…)なPC-98に装備された筐体吸気用のケースファン。写真の赤丸部分。 RsIIの取説で「サイドファン」と書かれていたのでNEC公式の呼称もサイドファンでよさそう。 大多数のミニタワーPC-98はサイドファンを持っていないが、DVD再生やサーバマシンなど発熱が危惧される機種では写真の位置にサイドファンが付く。 このタイプのPC-98は筐体カバーの向かって右側面上部に吸気スリットがある。 サイドファンがない大多数のミニタワーPC-98は向かって左側面下部に吸気スリットがあるので、筐体の外観でファンの有無を見分けられる。(早口)

V233の1号機のサイドファン(赤丸内の黒いファン)

サイドファン仕様と交換ファン選定

純正ファンの型番・特徴:

  • NMBの3110KL-04W-B10(12V/0.1A)、80mm x 80mm x 25mmが使われている。
  • 電源はペリフェラル4pinで取っている。

できるだけ静かな製品で置き換える。以下を使った。

ちなみにV233の特定機種にだけサイドファンがあるのはPCIスロットを埋めているDVDデコードボードを少しは冷やすためっぽい。 DVDデコードとかしないので外してしまった。ぶっちゃけファン自体外しちゃっていい気がしなくもないが…。

ファン交換してみた

写真で。

V233斜め前。側面上部が取り替えたいサイドファン。とてもうるさい。

ファンは台座に乗っている。台座は2か所のねじ止めがあってスライド式で固定されている。ねじ外す。

置き換えに使うSAN ACEファン。

ファン2pin → ペリフェラル変換コネクタが付いていて、別途変換を買う必要はない。

V233から取り外した純正ファン。画像上が筐体でも上側。

長いねじとスペーサー4セットで留まっているので全部台座から外す

台座がヤニ臭いのでいったん洗浄。中古で取得したので以前のオーナに喫煙者がいたのかな。

台座に元のねじ+スペーサーを使ってSAN ACEファンを取り付けたところ。画像上が筐体でも上側。

組み込んだ新しいSAN ACEのサイドファン。電源もペリフェラルに繋ぐ。

純正ファンはSAN ACEファンのパッケで保蔵。戻せる改造は戻せるようにしときたいので。左はペリフェラル→ファン電源変換ケーブルだがSAN ACEファンに同梱されているものがあり、買わなくてもよかった。

以上で完了。 ものすごく静かになってストレスが減りとても気分がいい。 この調子なら拙宅にある他の機体(V233の1号機やRsII)もこの改造やっていいな。

ファン交換後のV233の様子

外装の改造じゃないので見た目は改造前と違いない。

拙宅PC-9821V233の2号機

近日中に気力があればDVDドライブや5インチフロッピードライブの漂白してきれいにしたい。

週末の自転車乗り(2023.7.2)

以下のお題で、自転車で片道15km弱の船橋にある県民の森へ

以下に県民森往路写真、県民森写真、県民森感想

写真

夕方前ぐらい

移動中

愛車

県民森

逃がしたら昼なのに木に登って行ってしまった

県民森感想

県民森はごちゃついた船橋にこんな空間があるのすごいが
肝心の野生のクワガタを見なかった、ヒラタは影も形も無い

代わりにオサムシ課の黒くしなやかですばしこい幼虫と
ウンコを食べて紫色に輝く宝石のようなコガネムシを見た

  • 蚊のような羽虫がウザか纏わりついてきてウザかった
  • 営巣性の蜘蛛が居なかったので巣に引っ掛からなかったのはよかった

子供の頃と違ってワクワクしなくなってしまった自然に対して
とりあえずコクワガタを無事逃がす使命を果たしたのでさっさと帰宅した

居候をお迎え

一年ぶりぐらいに家の灯りに誘われてコクワガタが飛んできた

立派な大歯形のオス

スーパーで安いバナナを買って与え、湿らせたペーパータオルの上で飼っている

うちはすごい田舎でもないし周りは舗装道路と軽量鉄骨の集合住宅だらけである…
にもかかわらず年に1、2回クワガタを見る。どこから来るんだこの人達

週末あたりに近所でクワガタが居る森林を見繕って自転車で乗り付け放してくる予定

AIブックマーカー一番星はてのさんのファンアート描きました

あらすじ

こういう事があって。

なので多分俺がファンアートの言い出しっぺなのではないかと思いますがファンアート描いてなかったので描きました。

できました

世間で流行のAIイラストではなく全部手描きです。

はてのさんいいですね
開発者さんも応援してます。

追記

  • 2023/3/29 貼った後で納得いかない所があったのでわずかに修正。

制作過程のGIFです。

  • 描き始めてから構図とかその場の思い付きで変えることが多いです。
  • 見た目もコロコロ調整します。
  • 途中トランプのクイーンみたいな演出にしようかと思った後があります。
    • 何持たせるか悩んで結局やめました。

ツイートに名前を付けて保存するために「ツイートID@ユーザーID」の文字列を一発で作る

標題の事がやりたくてPowerShellのミクロなアプリ作って実現したので以下にまとめます。
この記事の流れは次のようになります。(目次って貼れるのかな)

  • 背景・概要
  • 導入手順
  • 使い方
  • 注意点
  • 改良したいこと

背景・概要

ツイートをブラウザーから「HTML、完全」で保存しようとしたが、保存しようとすると以下のような超絶長いファイル名が表示されて凹んでます。

名無しさんはTwitterを使っています 「ころたんイェイ~ #咲-Saki- #天江衣 https___t.co_xxxx https___t.co_xxxx」 _ Twitter

画像とか単発のファイルなら後からリネームすればよいのだけども、HTML、完全はフォルダーまでくっついてくるので取り回しが悪すぎる。
ここでツイートのURLを見ると、以下のようになっています。

http://twitter.com/ユーザーID/status/ツイートID

ということは、記事タイトルのような ツイートID@ユーザーID の文字列を作って改めてWebページ、完全で保存すれば ファイル名すっきりだし、絶対に一意であるし、URLも復元できるしハッピーなんじゃなかろうかと思いました。

そのような文字列をクリップボードに用意する、小さなPowerShellアプリを作ります。
作成後は、以下の手順でクリップボードに文字列が貼り付けられます。

  • ブラウザーでツイートを開く → URLをコピーする → タスクバーのアプリをクリック

ブラウザー拡張機能で作った方がより楽できるかもですが、勉強めんどくさいので…。

導入手順

大雑把には、以下の3ステップで進めます。

  1. 文字列変換を担うPowerShellスクリプトを用意する。
  2. 実行するためのショートカットを作成する。
  3. タスクバーにピン留めする。

では以下、詳細。

PowerShellスクリプトを用意する

書いたものを置いときます。
コピペしてメモ帳なり、PowerShell ISEなり使って、とにかくテキストで拡張子を「.ps1」にして保存すればOKです。
ファイル名は、この記事の手順としては以下にしました。

twitter-make-id.ps1

間違って消さないように、デスクトップやドキュメントではなく、 MyPowerShell とか何でも、まあそれなりのフォルダーを切って保存した方が良いです。

# Twitter URLから、名前を付けて保存用に「ツイートID @ ユーザーID」形式の文字列を作る
# http://*.twitter.com/ユーザーID/status/ツイートID の形式に対応
# 使い方
# 1.保存したいTweetのURLをブラウザーからコピー
# 2.このスクリプトを実行
# 3.文字列はクリップボードに上書きされるので、好きな用途に使う
# 作成:2021. 5. 4

$orig = Get-Clipboard
$orig -replace "^`r?`n", ""
$orig -replace "`r?`n$", ""
$orig -match "/([^/]+)/status/([^/]+)"
$matches[2] + "@" + $matches[1] | Clip

このスクリプト内の個別のコマンドの操作については以下のサイトを参考にさせてもらいました。

実行するためのショートカットを作成する

前手順で作ったps1スクリプトと同じフォルダーにショートカットを作ります。
(やり方:ps1スクリプトを右クリック→ ショートカットの作成(S)

作ったら今度はショートカットの方を右クリックして プロパティ(R) を表示し、 リンク先(T)実行時の大きさ(R) を編集します。
それ以外はデフォルトでOKです。

  • リンク先:ps1のフルパスが表示されていると思いますが、その文字列の前に、次の文字列を貼り付ける
    • powershell -ExecutionPolicy RemoteSigned -File
    • ※最後の -File の後とps1フルパスの間に半角スペースを置いてください。
  • 実行時の大きさ:必須ではないが、そのままだと実行するたびに一瞬コンソールウィンドウが表示されてウザいので、最小化状態で実行するようにします。

画像の2要素。リンク先、ps1が見えてて貼り付ける文字列が見えてないですが…。

f:id:kiyo_hiko:20210504070803j:plain
自作twitter-make-idスクリプトのショートカット

以下のサイトを参考にさせてもらいました。

qiita.com

タスクバーにピン留めする

前手順で作ったショートカットを右クリックし、 タスクバーにピン留めする(K) を選ぶと、タスクバーにアイコンが貼られます。

f:id:kiyo_hiko:20210504071134j:plain
タスクバーにPowerShellショートカットをピン留め

実行時はこれをクリックします。
導入手順は以上です。

使い方

  1. ブラウザーで表示しているツイートのURLをクリップボードにコピーします。
    • Alt-DCtrl-C とかが早いかな?
  2. タスクバーのtwitter-make-idのアイコンをクリックします。
  3. クリップボードツイートID@ユーザーID 文字列がコピーされるので、保存ファイル名にペーストするなど、自由に使います。

注意点

クリップボードを操作するので、ぶっ壊れては困るデータを保持しているときにクリックしないよう気を付けてください。
想定外でクリックしても大した害はないと思いますが、利用は自己責任で。

改良したいこと

アイコンがPowerShellのデフォルトになってしまうので、わかりやすいアイコンがあった方がいいかも知れないです。
その場合、タスクバーからいったん外してから、ショートカットのプロパティでアイコンを変更し、改めてタスクバーにピン留めしてください。

Perl: Net::FTP使ったコードをデバッグしたくて引数全部printするラッパ書いた

PerlのNet::FTPモジュールをラップして、メソッドを呼ぶごとに引数をプリントアウトするクラス書きました。

  • デバッグによいかも。
  • 別にFTPに限る必要はなくて、少し直せば他でもバンバン使えるはず。

あとAUTOLOADを少し勉強しました。

コード

{ package FtpDebug;
    use Net::FTP qw//;
    sub new {
        my $this = shift;
        bless { me => Net::FTP->new(@_) }, $this;
    }
    sub AUTOLOAD {
        my $this = shift;
        our $AUTOLOAD;
        my $method = (split /::/, $AUTOLOAD)[-1];
        # 次の行はお好みでファイルに出すとかカスタマイズ
        print "Calling method $method (", join(', ', @_) . ")\n";
        $this->{me}->$method(@_);
    }
    sub DESTROY {}
}

使い方

  1. クラスを読める位置にコピペするか、useできる場所にpm切ります。
  2. Net::FTPを使ったコードでnew Net::FTPまたはNet::FTP->newしているところをFtpDebug->newで置き換えます。
  3. 置き換えたコードでFTPのメソッドを呼ぶたびに引数がプリントアウトされます。

AUTOLOAD要点

  • Perlで未定義のメソッド呼ぶとこれが呼ばれるらしい?
  • sub AUTOLOADで書いて中にグローバル変数our $AUTOLOAD書くとFQNでメソッド名が得られる。
    • 上記コードでは、FQNそのまま呼ぶとDeep Recursionになってよくないのでsplitして最終要素取っている。
  • そのままではDESTROYというメソッドもこれに捕まってしまうので、空メソッドとして定義する必要がある。
    • なおDESTROYはPerlシステムの処理なので通常深入りしない
      • (参照カウンタが0になってオブジェクトが消滅するときに自動で呼ばれる処理)

なぜ作ったか、あるいはタダの愚痴

クソ長いメソッド書いたPerlで、$workFileだのftpDataDirだの妙に抽象的な変数名使ってるわ、 逆に処理手順はファイルをカウントアップとかやたら具体的で全体で何をするかという抽象が書かれてない。 そんなクソコードとの出会いがあり、怒りに震えてました。

  • 変数名は具体的に、処理は抽象的なのが俺が思うよいコードです。これでは俺の理想と真逆です。

で突然「あれ?コードがわかんなきゃとにかく全部プリントアウトすりゃいいんじゃね?」という発想が浮かんで作った。
クソコードとの出会いは案外多いから会っても泣かないために、これからもクソコードを力で殴るコード書きたいです。