お知らせ

現在サイトのリニューアル作業中のため、全体的にページの表示が乱れています。
投稿日:
言語::Perl

PerlのクラスはPythonみを感じる奥ゆかしい作りになっている。

ファクトリ関数でオブジェクトを生成して、そのオブジェクトの参照を引き回すことで実現してる感じ。

確認環境

Env Ver
Perl 5.34.0

基本

ファイル拡張子は.pmが一般的だと思われる。ファイル名とクラス名がリンクしているためPath/To/UpperCamel.pmが多分いい

ハッシュに突っ込んでいく方式

# これがクラス名になる。PATH::TO::NAME構文で書く
package Example;

use strict;

# コンストラクタ
# 第一引数にはpackageのフルパスが入り、第二引数以降に通常引数が入る
sub new {
  # 祝福することでインスタンスオブジェクトを生成できる
  my $self = bless({}, shift);
  # フィールドに値を突っ込む。これがプロパティになる。アクセサはない
  $self->{hoge} = shift;
  $self->{piyo} = shift;

  # インスタンスを返す
  return $self;
}

# メソッド
# 第一引数にはインスタンスオブジェクトが入る。アクセサはない
sub get_hoge {
  my $self = shift;
  return $self->{hoge};
}

1;

オブジェクト生成時にアサインする方式

package Example;

use strict;

sub new {
  my ($class, @args) = @_;
  my $self = bless({
    hoge => shift @args,
    piyo => shift @args
  }, $class);

  return $self;
}

sub get_hoge {
  my $self = shift;
  return $self->{hoge};
}

1;

クラスインスタンスの生成

ディレクトリ構成

├─library
│  └─Example.pm
└─main.pl

コード

クラスのコードは前述の内容

use strict;
# useするモジュールのパスを指定するおまじない
# パスにはクラスファイルを格納している根本のパスを指定する
# 標準モジュールは区別されるようで、この行の下にuse IPC::Open2;とか書いても、ちゃんと本来のモジュールが読み込まれる
use lib './library';

use Example;

# コンストラクタ呼び出しは()で囲まないとエラーになる
my $ex = Example->new("aaaa", 123);
print $ex->{hoge}."\n";
print $ex->{piyo}."\n";
print $ex->get_hoge."\n";

継承

基底クラス

package Example;

use strict;

sub new {
  my $self = bless({}, shift);
  $self->{hoge} = shift;
  $self->{piyo} = shift;

  return $self;
}

sub get_hoge {
  my $self = shift;
  return $self->{hoge};
}

1;

子クラス

package ExampleChild;

use strict;
use parent 'Example';

sub new {
  my ($class, @args) = @_;

  my $self = $class->SUPER::new(shift @args, shift @args);
  $self->{fuga} = shift @args;
  return $self;
}

1;

あとがき

仮引数を名前付きで取るかshiftで取るかは微妙に悩む。shiftの方がPerlらしい気もするし、変数名を変更するときの手間を考えると楽ではある。しかしshiftは読みづらいし、名前付き変数を列挙したほうが読みやすい気もする。

今回Perlをある程度書いてみた感じ、Perlはかなり書き方が自由に感じたし、そこはかなり楽しかったが、コーディング規約という面で見ると自由すぎると困る部分もあるし、判り易いほうがいいのでshiftは避けたほうがよさそうだ。

しかし普段JSを書いたりしている中で、クラスとは新しいオブジェクトを返す関数なのでは?と思っていたので、その辺りの解像度が上がったのは良かった。

参考

ぶっちゃけまともにPerlを書くのはこれが初めてなので、クラスとは直接関係ないサイトもある。

perldoc.jpは公式ドキュメントの日本語訳らしい。今も更新されている。

投稿日:
OS::Linux::Ubuntuソフトウェア::その他

確認環境

Env Ver
Ubuntu 22.04.3 LTS

やり方

# sambaの導入
sudo apt install -y samba

# sambaユーザーの作成
export $NEW_USER=hoge
sudo useradd -s /usr/bin/zsh $NEW_USER
sudo passwd $NEW_USER
sudo mkdir /home/$NEW_USER
sudo smbpasswd -a $NEW_USER

# 必要最低限の設定を突っ込んでおく
sudo cp ~/.nanorc /home/$NEW_USER
sudo cp ~/.zshrc /home/$NEW_USER
sudo cp -R ~/.zsh /home/$NEW_USER
sudo chown -R $NEW_USER:$NEW_USER

# 元の設定退避
sudo cp smb.conf smb.conf.default
# 設定追加
cat <<EOF | sudo tee -a /etc/samba/smb.conf
[$NEW_USER]
path = /home/$NEW_USER/
browsable = yes
writable = yes
guest ok = no
read only = no
create mask = 0644
directory mask = 0755

vfs objects = recycle
recycle:repository = /home/$NEW_USER/.recycle
recycle:keeptree = yes
recycle:versions = yes
recycle:touch = no
recycle:maxsize = 0
recycle:exclude_dir = .recycle
EOF

トラブルシュート

同一IPのsambaに異なるユーザーでアクセスできない

例えば\192.168.1.10\hogeにhogeユーザー、\192.168.1.10\piyoにpiyoユーザーでアクセスしようとすると上手くいかない。これはWindowsの資格情報がホスト単位であるためと思われる。hostsにドメインを切るなどし、ホスト部を別個にすると上手くいくようになる。

この場合、hoge.localpiyo.local192.168.1.10に向け、それぞれにhogeユーザーとpiyoユーザーの認証情報を持たせることで両立できる。

因みに\192.168.1.10\hogeにhogeユーザー、\192.168.1.10\piyoにもhogeユーザーでログインすることはできるが、基本的に権限周りで問題が起きると思う。無難なのは何かしらグループを作っておき、そのグループであれば自由に読み書きできるフォルダをsambaの共有フォルダに設定することだろう。

投稿日:
Node.js

標準入力から読み込みたい時に

確認環境

Env Ver
Node.js 20.11.0

サンプルコード

/dev/stdinが存在するPOSIX系のシステム限定だと思われる。UbuntuとFreeBSDでは動いた。

const { readFileSync } = require('node:fs');

const stdIn = readFileSync('/dev/stdin', 'utf8');
console.log(stdIn);

おまけ

Markdownテキストを標準入力から取得して、生成したHTMLを標準出力に吐くやつ

投稿日:
言語::Perl

base64みたいなコマンドを使いたい時に

確認環境

Env Ver
Perl 5.34 .0

サンプルコード

バッククォートでコマンドを括り、後はシェルスクリプト度同じ理論で書くと行ける

# base64エンコードされた文字列
my $input = 'Kipib2xkKioKKml0YWxpYyoKfn5zdHJpa2V+fgotIGxpCiAgLSBzdAp8VEF8QkxFfAp8LS18LS0tfAp8YWF8YmJifAp8Y2N8ZGRkfAo=';
# 変数を標準出力に展開し、base64の標準入力として使い、base64コマンドの標準出力を戻り値の変数に格納している
my $output = `echo $input | base64 -d`;

print $output;

出力

**bold**
*italic*
~~strike~~
- li
  - st
|TA|BLE|
|--|---|
|aa|bbb|
|cc|ddd|

ダメだったコード

その1

# 標準ライブラリからopen2を取得
use IPC::Open2 qw/open2/;

my $pid = open2 *READ, *WRITE, 'base64 -d';
# base64エンコードされた文字列
print WRITE 'Kipib2xkKioKKml0YWxpYyoKfn5zdHJpa2V+fgotIGxpCiAgLSBzdAp8VEF8QkxFfAp8LS18LS0tfAp8YWF8YmJifAp8Y2N8ZGRkfAo=';
close WRITE;
my $output = <READ>;
close $READ;
waitpid $pid, 0;
print $output;

出力

何故か一行目しか出ない

**bold**

その2

# 標準ライブラリからopen2を取得
use IPC::Open2 qw/open2/;

my $pid = open2 my $reader, my $writer, 'base64 -d';
# base64エンコードされた文字列
print $writer 'Kipib2xkKioKKml0YWxpYyoKfn5zdHJpa2V+fgotIGxpCiAgLSBzdAp8VEF8QkxFfAp8LS18LS0tfAp8YWF8YmJifAp8Y2N8ZGRkfAo=';
close $writer;
my $output = <$reader>;
close $reader;
waitpid $pid, 0;
print $output;

出力

何故か一行目しか出ない

**bold**

参考

投稿日:
ソフトウェア::VSCode

Nanoで{Ctrl}+{Q}を終了に割り当ててたらVSCodeで終了できなくなったので、それを解消した話

確認環境

Env Ver
Visual Studio Code 1.85.2

方法

基本は"terminal.integrated.allowChords": falseで防げるが、それでも出てくるものについてはキーボードショートカットの設定から{Ctrl}+{Q}などで検索し、該当するコマンドを調べ"terminal.integrated.commandsToSkipShell": []に、頭に-を付加した、"-command"形式で記載すると出てこなくなる。

{
    "terminal.integrated.allowChords": false,
    "terminal.integrated.commandsToSkipShell": [
        "-workbench.action.quickOpenView",
    ],
}