お知らせ

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

以下のようなコードを書いたときにmockFnにイベント引数が渡らないが、これをどうにかして取る方法。結論から言うとまともに取れないが、試行錯誤した時のログとして残しておく

const mockFn = jest.fn();
render(<input onChange={mockFn} />);
fireEvent.change(inputElement, { target: { value: 'aaa' } });

確認環境

Env Ver
@swc/core 1.3.66
@swc/jest 0.2.26
@testing-library/jest-dom 5.16.5
@testing-library/react 14.0.0
jest 29.5.0
react 18.2.0

サンプルコード

これは以下のように書くとfireEventの第二引数で指定したtarget.valueの部分だけは一応取れる。

理由としてはfireEventelement.dispatchEventを読んでいると思われるためだ。余り深くは追っていないが、react-testing-libraryの実装上は多分そうなっていると思われる。

import { fireEvent, render } from '@testing-library/react';

it('test', () => {
  const mockFn = jest.fn((ev) => {
    console.log(ev);
  });
  const { container } = render(<input id="hoge" onChange={mockFn} value={'a'} />);
  const element = container.querySelector('input');
  if (element === null) throw new Error();
  element.dispatchEvent = jest.fn();
  fireEvent.change(element, {
    target: {
      value: 'bbb'
    }
  });

  expect(element.dispatchEvent.mock.instances[0].value).toBe('bbb');
});
投稿日:
言語::Perl

確認環境

Env Ver
Perl 5.34.0

コード例

キャプチャ変数をifのスコープに封じ込める必要がある

my $text = <<EOF;
  ```unya
  hoge
    piyo
      fuga
  hpf
  ```
EOF

my @lines = split(/\n/, $text);

foreach my $line (@lines){
  if ($line =~ /^(?<indent> *)(?<bquote>```)(?<lang>[a-z]*)$/) {
    print "SYMBOL: '$+{indent}', '$+{bquote}', '$+{lang}'\n";
  } else {
    print "$line\n";
  }
}

上手くいかないコードの例

その1

$+変数はマッチするまで中身が消えないので、このプログラムは予期した動きにならない

my $text = <<EOF;
  ```unya
  hoge
    piyo
      fuga
  hpf
  ```
EOF

my @lines = split(/\n/, $text);

foreach my $line (@lines){
  $line =~ /^(?<indent> *)(?<bquote>```)(?<lang>[a-z]*)$/;
  print "$+{indent}, $+{bquote}, $+{lang}\n";
}

その2

my $text = <<EOF;
  ```unya
  hoge
    piyo
      fuga
  hpf
  ```
EOF

my @lines = split(/\n/, $text);

foreach my $line (@lines){
  $line =~ /^(?<indent> *)(?<bquote>```)(?<lang>[a-z]*)$/;
  if (defined $+) {
    print "$line: ";
    print "$+{indent}, $+{bquote}, $+{lang}\n";
    # この変数はundef出来ない
    undef $+;
  } else {
    print "$line\n";
  }
}
投稿日:
技術::DNS技術::メール技術::セキュリティ

ここ最近なりすましメールが目立つのでなりすましメール防御対策を取りましょうという話。

なりすましメールが増えている一例

ここ数日の間にイラストレーターのIxy先生やMastodonインスタンス管理人のにょき氏といった一定の知名度を持つ人物を中心になりすましメールの被害にあっているようだ。

ここまで目立つのは余り見聞きしなかったので恐らくここ昨今のGMailとかの騒動を見たところで、なりすましメールを作れることに気づいた人物が愉快犯的に行為をしているのだろう。

取りうる防御策

個人レベルでできる対策としてはDNSレコードやメールサーバーの設定にSPF, DKIM, DMARCを設定することだ。これらの内容についてはGoogleによるDMARC を使用してなりすましと迷惑メールを防止するが詳しい。

さくらのレンタルサーバーを利用している場合は以下が参考になる。

さくらのレンタルサーバーを利用して外部DNSを利用している場合は、私が以前書いたValue-DomainのドメインをさくらのレンタルサーバーのメールでSPF, DKIM, DMARC対応させるが参考になるだろう。

SPD, DKIM, DMARCの三点を設定することで相手のメールサーバーがこれらに対応している場合になりすましメールを迷惑メールとして分類したり、メールの受信を拒否できるとされているため、設定することでなりすましメールを防御できる可能性が高まる。

メール送信に使っていないドメインに関しても以下のようなDMARCを設定しておくことで、悪意のある第三者によるなりすましを防げるだろう。

txt _dmarc v=DMARC1; p=reject; aspf=r; adkim=r

またメールサーバーを運用されている各位におかれては、SPD, DKIM, DMARCの三点を識別し、適切に受信メールをフィルタリングできる仕組みを導入して頂けると犯罪予告や迷惑メールによる被害を減らせる可能性があるので、是非とも導入を検討いただきたい。

投稿日:
言語::Perl

Perlで配列を初期化するときにいろいろ試したので、そのログ

確認環境

Env Ver
Perl 5.34.0

初期化方法

配列変数を配列で初期化

@始まりの変数に()で配列リストを作成して初期化する。

my @hoge = (1, 2, 3);
# 3<>1 2 3
print @hoge."<>@hoge\n";

配列変数をそのまま呼び出した場合は配列の長さが、文字列にするとスペース区切りになったものが出てくる。

配列変数を配列以外で初期化

@始まりの変数に配列以外を入れて初期化する。

my @hoge = 3;
# 1<>3<>3
print @hoge."<>@hoge<>$hoge[0]\n";

この場合は暗黙的に配列が作成され、ゼロ番目の要素にその値が入る。

配列変数を無名配列で初期化

前項の応用。参考までに無名配列で初期化した場合、[0]に無名配列が入り、二重配列になる。

my @hoge = [1, 2, 3];
# 1<>ARRAY(0x55e45749d860)<>ARRAY(0x55e45749d860)<>1<>2<>3
print @hoge."<>@hoge<>$hoge[0]<>$hoge[0][0]<>$hoge[0][1]<>$hoge[0][2]\n";

スカラ変数を配列で初期化

スカラ値にキャストされ、配列長が入る。これは配列変数をそのまま使った場合同様の振る舞い。

my $hoge = (1, 2, 3);
# 3
print $hoge."\n";

スカラ変数を無名配列で初期化

そのままでは配列として扱うことができず、配列として扱うためには@{ $var }形式にする必要がある。

my $hoge = [1, 2, 3];
# ARRAY(0x5596ea845de0)<>ARRAY(0x5596ea845de0)<>3<>1 2 3
print $hoge."<>$hoge<>".@{ $hoge }."<>@{ $hoge }\n";

またハッシュを配列として扱う場合は、この形式になり@{ $hash->{hoge} }のようにして扱う。

ハッシュ初期化時にキーを配列で初期化

配列が分解されてハッシュになるため、意図した値が入らない

my $hash = { hoge => (1, 2, 3) };
# 1<>1
print $hash->{hoge}."<>$hash->{hoge}\n";

実際にできる構造

$VAR1 = {
  'hoge' => 1,
  '2' => 3
}

ハッシュ初期化時にキーを無名配列で初期化

基本的にはこれで初期化するといい。使い方は「スカラ変数を無名配列で初期化」と同様

my $hash = { hoge => [1, 2, 3] };
# ARRAY(0x55599ba8dd08)<>3<>1 2 3
print $hash->{hoge}."<>".@{ $hash->{hoge} }."<>@{ $hash->{hoge} }\n";

ハッシュのキーに配列を代入

@{ $var }構文でやると上手く入る。普通に代入するとスカラ値になるので配列長が入る

my $hash = { hoge => undef };
@{ $hash->{hoge} } = (1, 2, 3);
# ARRAY(0x564efec0e4e8)<>3<>1 2 3
print $hash->{hoge}."<>".@{ $hash->{hoge} }."<>@{ $hash->{hoge} }\n";

ハッシュのキーに無名配列を代入

my $hash = { hoge => undef };
$hash->{hoge} = [1, 2, 3];
# ARRAY(0x55844312a4e8)<>3<>1 2 3
print $hash->{hoge}."<>".@{ $hash->{hoge} }."<>@{ $hash->{hoge} }\n";

備考

配列と無名配列の違いについて

配列は配列の実体そのもので、無名配列は参照らしい。

恐らくスカラ変数に無名配列を入れた場合、変数そのものには配列への参照が入るので、ARRAY(0x5596ea845de0)的な値が出てくるが、@{ $var }とすると参照先の実体が見れるので、配列として扱うことができるようになるのだと思う。

反対に配列変数の場合は、基本的に配列の実体を見るようになっていて、文字列化するときのみ参照が取れるようになっているように見える。

詳しくは以下の資料を参照するとわかる気がするので、また暇なときにでも見てみようと思う。

最近は値と参照の境界が分かりづらくなっている気もするので、Perlのこう言った書き口は少し面白いなと思った。要するにポインタを明示的に扱える訳だ。

そういやSSI使ったことなかったなと思ったので。

やり方

  1. .shtmlを作る
  2. CGI・PHP・SSI を利用したい | さくらのサポート情報の書式を見てコードを書く

任意の処理結果を出させる例

現在の年を出す場合のやり方

  1. 以下の内容でhoge.plを作成

    #!/usr/local/bin/perl
    
     print qx(date "+%Y");
    
  2. chmod 705 hoge.pl
  3. 以下の内容でpiyo.shtmlを作成
    <!--#exec cmd="./hoge.pl"-->
    

注意点

同一パスにあるコマンドしか実行できないため、以下のような内容は動かない

グローバルなコマンドは動かない

<!--#exec cmd="date +%Y"-->

こんなことをしても動かない

<!--#echo VAR="date +%Y"-->

サブシェルを書いても動かない

<!--#echo VAR="$(date +%Y)"-->

参考