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の特定機種にだけサイドファンがあるのはPCIスロットを埋めているDVDデコードボードを少しは冷やすためっぽい。 DVDデコードとかしないので外してしまった。ぶっちゃけファン自体外しちゃっていい気がしなくもないが…。
ファン交換してみた
写真で。
以上で完了。 ものすごく静かになってストレスが減りとても気分がいい。 この調子なら拙宅にある他の機体(V233の1号機やRsII)もこの改造やっていいな。
ファン交換後のV233の様子
外装の改造じゃないので見た目は改造前と違いない。
近日中に気力があればDVDドライブや5インチフロッピードライブの漂白してきれいにしたい。
週末の自転車乗り(2023.7.2)
AIブックマーカー一番星はてのさんのファンアート描きました
あらすじ
こういう事があって。
なので多分俺がファンアートの言い出しっぺなのではないかと思いますがファンアート描いてなかったので描きました。
できました
世間で流行のAIイラストではなく全部手描きです。
- 制作時間 = 12時間ぐらい
- 道具 = Clip Studio Paint EX と Cintiq Pro 16 と Dynabook VZ/HR、その他
はてのさんいいですね
開発者さんも応援してます。
追記
- 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ステップで進めます。
- 文字列変換を担うPowerShellスクリプトを用意する。
- 実行するためのショートカットを作成する。
- タスクバーにピン留めする。
では以下、詳細。
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が見えてて貼り付ける文字列が見えてないですが…。
以下のサイトを参考にさせてもらいました。
タスクバーにピン留めする
前手順で作ったショートカットを右クリックし、 タスクバーにピン留めする(K)
を選ぶと、タスクバーにアイコンが貼られます。
実行時はこれをクリックします。
導入手順は以上です。
使い方
- ブラウザーで表示しているツイートのURLをクリップボードにコピーします。
Alt-D
→Ctrl-C
とかが早いかな?
- タスクバーのtwitter-make-idのアイコンをクリックします。
- クリップボードに
ツイートID@ユーザーID
文字列がコピーされるので、保存ファイル名にペーストするなど、自由に使います。
注意点
クリップボードを操作するので、ぶっ壊れては困るデータを保持しているときにクリックしないよう気を付けてください。
想定外でクリックしても大した害はないと思いますが、利用は自己責任で。
改良したいこと
アイコンがPowerShellのデフォルトになってしまうので、わかりやすいアイコンがあった方がいいかも知れないです。
その場合、タスクバーからいったん外してから、ショートカットのプロパティでアイコンを変更し、改めてタスクバーにピン留めしてください。
Perl: Net::FTP使ったコードをデバッグしたくて引数全部printするラッパ書いた
PerlのNet::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 {} }
使い方
- クラスを読める位置にコピペするか、useできる場所にpm切ります。
- Net::FTPを使ったコードで
new Net::FTP
またはNet::FTP->new
しているところをFtpDebug->new
で置き換えます。 - 置き換えたコードでFTPのメソッドを呼ぶたびに引数がプリントアウトされます。
AUTOLOAD要点
- Perlで未定義のメソッド呼ぶとこれが呼ばれるらしい?
sub AUTOLOAD
で書いて中にグローバル変数our $AUTOLOAD
書くとFQNでメソッド名が得られる。- 上記コードでは、FQNそのまま呼ぶとDeep Recursionになってよくないのでsplitして最終要素取っている。
- そのままではDESTROYというメソッドもこれに捕まってしまうので、空メソッドとして定義する必要がある。
- なおDESTROYはPerlシステムの処理なので通常深入りしない
- (参照カウンタが0になってオブジェクトが消滅するときに自動で呼ばれる処理)
- なおDESTROYはPerlシステムの処理なので通常深入りしない
なぜ作ったか、あるいはタダの愚痴
クソ長いメソッド書いたPerlで、$workFile
だのftpDataDir
だの妙に抽象的な変数名使ってるわ、
逆に処理手順はファイルをカウントアップとかやたら具体的で全体で何をするかという抽象が書かれてない。
そんなクソコードとの出会いがあり、怒りに震えてました。
- 変数名は具体的に、処理は抽象的なのが俺が思うよいコードです。これでは俺の理想と真逆です。
で突然「あれ?コードがわかんなきゃとにかく全部プリントアウトすりゃいいんじゃね?」という発想が浮かんで作った。
クソコードとの出会いは案外多いから会っても泣かないために、これからもクソコードを力で殴るコード書きたいです。