サブルーチンの確認

2024/10/7 [09:36:50] (月) 天気

perlで自作したおひとり様ActivityPubサーバーはその後も増築改築をちまちま続けていて、例によってその場での思いつき、やっつけ仕事の現物合わせ仕様で、わけわかめ状態となっている。


Activityを約束事どおりに対応するモジュール(pmファイル)で、いったい何をしてるのか。

もうすでに忘れてる自分がいるので、サブルーチンの洗い出し用にテキトーなスクリプトをでっちあげた。という覚え書きが今回のエントリ。


#!/usr/bin/perl
use strict;
use utf8;
use Encode;
my $f = shift(@ARGV);
if(! -e $f ){
    printf qq{Not Found pm %s\n}, $f;
    exit;
}
open(IN, $f) || die;
my $name; my @buf=<IN>; close(IN);
foreach (@buf){
    if( m!^sub (.+) *\{! ){
        $name->{$1}++;
    }
}
printf qq{sum : %s\n}, scalar( keys %{$name} );
foreach my $sub (sort keys %{$name}){
    my $pm = join(’’, @buf);
    my $cnt = $pm =~ s!$sub!!g; 
    printf qq{%s :\n}, $sub;
    my @called; my $zzz;
    if( $cnt > 1 ){
        my $subname;
        foreach (@buf){
            if(m!^sub (.+) *\{!){
                $subname = $1;
                next;
            }
            if( m!\$self\-\>$sub! && !$zzz->{$subname}++ ){
                push(@called, $subname);
            }
        }
    }
    printf qq{\t%s\n}, join("\t", sort @called);
}

・サブルーチンの総数

・サブルーチンの名前

・サブルーチンを呼び出しているサブルーチン

ぐらい見えれば、そこそこ役に立つかなあ、と。


文字列検索でひっかけてるだけで、signなんかはサブルーチン呼び出しじゃない部分にもヒットする。本当は動かしながらcaller()でチェックするのが確実…だけど、ざっくり見るだけのためにあちこちにcaller()を仕込むのはうっとーしいんで却下。


使い捨てのつもりで書いたスクリプトだけど、思ったよりちゃんと見えるようにしてくれたので自画自賛&エントリとして書き起こし



10/4、ポケモンGOの対人戦GBLでACEに到達。

初期レートが1984で、ACE到達時のレートは2007。GBLで遊んでいて、ずっと継続してACEにたどり着いてたんだけど、前期初めてACEに到達できず、今期もやべえかなあ、と思ってたので、ほっとひと息。

image

まる6年続いているゲームで、まだ全然飽きないのがすげーす。

ファイル同期のためのrsyncで使うオプション

2024/9/18 [23:46:22] (水) 天気

仕事で使っているchromebook2台でスクリプトファイル類を同期しておきたい。

そのためにメイン機から更新のあった(タイムスタンプが新しい)ものだけをコピーしたい。


てな時にlinuxだとrsyncが便利。

scpやsftpもあるけどscpもsftpもタイムスタンプを比較できないっぽいので、今回のような場合はrsync一択。

unix系ツールの例に漏れず、rsyncもオプションが豊富ですぐにわけわからなくなってるんで、自分の使う範囲のオプションをメモ。


rsync --include="*.pl" --include="*.pm" --exclude="*" -auv -e "ssh -p 10022" [ローカルディレクトリ] ユーザー名@192.168.0.NN:[リモートディレクトリ]

--incluce="*.pl"

--incluce="*.pm"

同期したい対象ファイルは拡張子が「pl」か「pm」

--exclude="*"

includeしたもの以外は同期対象外

↑これがわかりにくくて、includeとexcludeの順番がだいじ。

まず、対象を指定して、最後にそれ以外全部除外という命令になっている、らしい。


-a

以下全部をまとめて指定

・ディレクトリを再帰的に処理する

・シンボリックリンクをシンボリックリンクのままコピーする

・パーミッションを保持する

・タイムスタンプを保持する

・所有グループをそのまま保持する

・所有者をそのまま保持する(自分以外の所有者を保持するにはroot権限が必要)

・デバイスファイルや特殊ファイルを保持する(「--devices --specials」相当


-u

・更新のあったものだけをコピーする


-v

・転送状況を表示する


-e "ssh -p 10022"

・sshで接続する。ポート番号指定つき


わたしの場合は、以上で意図通りに同期される。実際にrsyncを走らせる前に

-n--dry-run

↑このふたつは、どちらもrsyncを走らせるけど、実際はコピーをしない。コマンドが意図したものになっているか確認するために使うオプション。


--delete

↑コピー元になくて、コピー先だけあるファイルを削除するオプション。deleteから始まるオプションはあぶないのでよっぽどのことがない限り使わない。


rsyncコマンドはコピー元、リモートのコピー先、両方に必要。

(リモートにインストールしてなくて、コマンドが見つかりませんとハマったのは内緒)


ローカルにあるディレクトリごと、USBメモリなんかに同期させるだけなら


from=/mnt/chromeos/removable/USBDrive/_works
to=/mnt/chromeos/removable/_TMP/_works
if [ -d $from ] && [ -d $to ]; then
   rsync -anu --delete --log-file=$to/rsync2usb-works.log $from/ $to/
fi

バックアップというより、持ち出して作業する一時的な扱いなので、こういうのは「--delete」をつけて、ローカルにないファイル・ディレクトリはUSBから削除してくれるので便利…でも、くれぐれも「delete」は要注意


[09/19 00:26:35]追記

ディレクトリ指定に注意が必要だった。

ローカルdir1/ リモートdir1

「/」がついてると、ローカルdir1に配置されているファイルがリモートdir1のファイルと同期される。

ローカルdir1 リモートdir1

「/」がついてないと、「リモートdir1/ローカルdir1」とローカルdir1がディレクトリごとリモートdir1の下にコピーされる。

chromebookでssh

2024/9/16 [09:47:02] (月) 天気

chromebook同士でファイル共有する方法としてニアバイシェアというのがあるけど、なんか思ってたのと違う。なので、sshで繋いでファイルのやりとりを直接やってしまおう、のメモ。


chromebookを2台使っていて、メインとサブという役割分担。

メインで使っていて作業した内容をサブ機にsshで転送・バックアップしておきたい。


まずはchromebookの設定。メイン機のLinux環境からサブ機のLinux環境に繋ぐためにポート転送を設定する。道路を繋ぐための作業、みたいなもの。


サブ機側のポート転送を設定。

「ChromeOSについて→Linux開発環境→ポート転送」


ポート番号はすでに使われている番号以外ならなんでもOK

sudo less /etc/service

↑これで確認できる。とりあえず10001〜10080のあたりが空いてるので「10022」とした

image

ポート転送を設定することで

1)サブ機のローカルIPアドレス192.168.0.NNにSSHでポート番号を指定してアクセスする

2)サブ機側がポート転送してくれて、サブ機のLinux環境にログインできる


サブ機のLinux環境でsshdサービスを立ち上げる

(サブ機をsshdサーバーにする)


sshdサービスがどうなってるのか確認。

sudo systemctl status sshd.service

この時点では「Active: inactive (dead)」という表示が出ている。ssdは立ち上がっていないので、sshdを立ち上げるために以下の作業。

(sudo、root権限で/etc/以下のファイルを編集することになるので、念のためバックアップを取っておくのが安心安全)


「/etc/ssh/sshd_not_to_be_run」というファイルがあるとsshdが立ち上がらないらしいので削除

sudo rm /etc/ssh/sshd_not_to_be_run


「/etc/ssh/sshd_config」というのがsshdの設定ファイル。

Port 10022
PubkeyAuthentication yes
PasswordAuthentication no
ChallengeResponseAuthentication no
PermitRootLogin no
UsePAM no
AcceptEnv LANG LC_*

chromebookのポート転送で指定したポート番号を記載。それ以外は呪文でOK(ルートでアクセス許可するかとか)で、上記以外はデフォルトのままでOK.


設定ファイルを編集したらsshdサービスを立ち上げる

sudo systemctl restart sshd.service

立ち上がってるか確認

sudo systemctl status sshd.service

「Active: active (running)」という表示が見えたら無事sshdのサービスは立ち上がっている。


サブ機のLinux環境のHOMEディレクトリに「.ssh」というディレクトリを作成。

chmod 700 .ssh

として、権限をオーナー限定にしておく。


メイン機でsshの秘密鍵と公開鍵を作る

ホームディレクトリで

ssh-keygen

途中パスフレーズ聞かれて、入力すると「id_rsa」(秘密鍵)「id_rsa.pub」(公開鍵)がHOMEディレクトリの「.ssh」ディレクトリに作られる。公開鍵以外の権限はオーナー限定(0600)


メイン機で作った公開鍵をサブ機のHOMEディレクトリの.sshディレクトリにコピー

scp -P 10022 id_rsa.pub ユーザー名@192.168.0.NN:~/.ssh/.

メイン機で作った公開鍵をサブ機にコピーしたら、サブ機で作業


cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

サブ機の.sshディレクトリの「authorized_keys」というファイルに公開鍵を登録(追記コピーしてるだけ)


以上でsshは繋がる。

ssh -p 10022 -i id_rsa.pub ユーザ名@192.168.0.NN

とか

ssh -p 10022 -l ユーザー名 192.168.0.NN

メイン機からサブ機にログインしてごそごそいじったり


scp -P 10022 -r work ユーザ名@192.168.0.NN:work

などとメイン機からサブ機にファイルコピーしたり


sftp ユーザー名@192.168.0.NN:DIR

とか、sftpでログインしてアップしたいディレクトリに移動してから

put -r DIR/

などとメイン機からサブ機にディレクトリごとアップしたり、


ファイル操作がらくちんになった。

とはいえ、コマンドラインなので、上書き事故には気をつけないといけない、よなあ。


ちなみに注意するところがあって。

linux開発環境も、ポート転送も手動。chromebookを立ち上げたり、再起動したら

・Linux開発環境を立ち上げる

・ポート転送をONにする

…というのもあって、どうせ確認するわけだし、IPアドレスも自動割り当てのままにした。


以下のサイトを参考にさせていただきました(多謝

【Chromebook】SSHサーバの設定

ChromebookのLinuxコンテナにSSHでログインする


最近のネタ切れの時の弁当は2色、3色弁当。

image

なんかこういう手抜きの方が美味しかったりするから、ちょっと悔しい。

ActivityPubの投稿公開範囲

2024/9/4 [08:03:28] (水) 天気

あれ、どうするんだっけ?と忘れがちでしょっちゅう検索してしまう投稿の公開範囲をメモしておこう(間違ってるかもしれない…気がついたら修正)


ActivityPubで、Fediverseに投げ込んだNoteの公開範囲を選べる。


・全公開

 誰でも見ることができる。

 投稿が流れるタイムライン

 →連合、ローカル、ホーム

・未収載

 誰でも見ることができる。

 投稿が流れるタイムライン

 →ホーム

・フォロワー限定

 フォロワーだけが見ることができる

 投稿が流れるタイムライン

 →ホーム

・ダイレクト(DM)

 指定したお相手だけが見ることができる

 タイムラインには流れない

※「ホーム」というのは、自分・フォロワーの「ホームタイムライン」


「未収載」と「フォロワー限定」がわかりにくいのでメモ


・未収載は

フォロワーのホームに投稿が流れる。自分をフォローしていないユーザーが、フォロワーのホームに流れている自分の投稿を見ることができる。

・フォロワー限定は

フォロワーのホームに投稿が流れる。自分をフォローしていないユーザーが、フォロワーのホームを見ても、自分の投稿は見えない。


投稿の公開範囲と宛先の組み合わせ

(Activityの指定)

公開/宛先tocc
全公開Publicfollowers
未収載followersPublic
フォロワー限定followersなし
ダイレクトお相手のinbox指定なし


ActivityPubの約束事として公開範囲については上記で全部。

このほかに、もっと細かく公開範囲を指定できるサーバーもあって。


「Fedibrid」https://fedibird.com

「公開/未収載/フォロワー限定/相互フォロー限定(対応サーバーのみ)/サークル/DM/自分限定」

↑こちらは、今日時点で投稿の公開範囲は7種類から選べる。


公開範囲は意識しておきたいところだけど、うっかりやらかしてしまうので、自戒を込めてのエントリ。


ウチのおひとり様ActivityPubサーバーは。


設定ファイルのpublic_levelで公開か未収載を選択する。

・現在のデフォルトは公開

 「to」がPublic、「cc」がわたしのfollowers

・Mentionとダイレクトは「to」がお相手のinbox

・Mentionの「cc」はわたしのfollowers

・ダイレクトの「cc」はなし



image

神田明神の妖怪展。有名なガシャドクロを始め、規模こそ小さかったけど、面白かった。

常設展もかなり面白かった。オススメ。

小ネタ:pdftotextで文字データを抽出

2024/8/28 [15:40:57] (水) 天気

元データがPDFで、圏点(傍点)やダッシュをPDFから検出する必要にせまられた。

目視確認などありえないんで、テキストデータとして取り出して検索しよう、というのが今回のエントリ…というかエントリにするまでもない内容なんだけど、たぶんそのうち忘れるんで、メモ。


PDFから文字情報だけをひっぱりだすのに定番の「pdftotext」というツールを使う。

perlだけでもできそうなんだけど(PDF::API2あたり)ちょっと時間も押してるんで、外部ツールを間に挟むことにした。


まずは肝腎のpdftotextのインストール。これがpoppler-utilsというパッケージだなんて検索しないとわからなかった(pdftotextというパッケージがあるもんだと思ってた)


以下のコマンドラインでインストール


sudo apt-get install poppler-utils


unix系のツールの例に漏れず、これもいろんなオプションが用意されてるけど、今回必要なのは文字情報だけ。レイアウトデザイン情報やなんかは不要。

rawオプションをつけて利用する。

image

たとえば「kappa.pdf」の文字情報を抜き出すのは


pdftotext -raw kappa.pdf


こうすると「kappa.txt」に文字情報を吐き出す。ただ、これだとひと文字ずつだあーっと出力されるので、ここからがテキストデータを扱わせたら最強のperlの出番。

image

pdftotextの出力には改ページがつくので、そこで改行すれば「それっぽい段落」ごとに見えるひとに優しいテキストファイルとなる。


open(P, ’-|’, ’pdftotext -raw kappa.pdf - ’ ) || die;
binmode STDOUT => ":utf8";
open(OUT, ’>’ , ’kappa.txt’) || die;
binmode OUT => ":utf8";
while(<P>){
    my $line = Encode::decode(’utf8’, $_);
    $line =~ s!\r?\n!!;
    $line =~ s!\x{C}!\n!;
    print OUT $line;
}
close(OUT);
close(P);

特筆すべきようなスクリプトじゃないんだけど。

perlは外部コマンドの「標準出力」をパイプで受け取って加工整形できる。


open(P, ’-|’, ’pdftotext -raw kappa.pdf - ’ )


openの

・第2引数で、標準出力を受け取りますよ、という指定

・第3引数はpdftotextの結果を標準出力に出すからね、という指定

これだけでそれっぽい段落にわけたテキストファイルを作ってくれる。


そうしたら、あとは出力されたテキストファイルからダッシュや圏点(傍点)っぽいものをperlで検知するだけ。

image
これはワードで作ったPDFで「、」が圏点となっている。inDesignで作られたデータだと「0」(ゴマ)「4」(ドット)となる。


直接触ってもいいんだけど、一度テキストファイルに吐き出したほうがなにかわからないことが起こった時に便利なので、こういう仕様、段取り。


このスクリプトのおかげで抜け漏れは捕捉できるんでずいぶんラクになった。


以前、目視確認とか無駄なだけだし、んなもんツール作ってやればいいじゃん、とか言ったら、そしたら仕事がなくなる、目視確認手作業修正は必須だ、と言われて心底、呆れた。

カネをもらった上で、人間の作業=ミスが入り込む原因になる工程を入れるって、いろいろ悪質すぎる。

ITといってもピンキリで、こんなのが入り込んでるから要注意。

そもそも、その程度の仕事なんて、なくなっても問題ないし、特に困らない。

<<2026/2>>
       
1234567
891011121314
15161718192021
22232425262728
検索:

【最近の20件】