雑多なブログ

音楽や語学、プログラム関連の話題について書いています

mac - ファイルのmd5ハッシュ値を確認する

macでファイルのmd5ハッシュ値を確認する場合は、
md5 コマンドが標準で使える。

コマンド

md5 sample_file.txt

実行結果

MD5 (sample_file.txt) = d41d8cd98f00b204e9800998ecf8427e

-q オプションを付けると、ハッシュ値だけ出力する。

コマンド

md5 -q sample_file.txt

実行結果

d41d8cd98f00b204e9800998ecf8427e

ちなみにlinuxでは、md5sum というコマンドが使える。

ChatGPTを試した。

最近SNSで注目されているChatGPTを試してみた。

例えば、「年月日を引数に取り、曜日を返すpythonの関数を作って」とAIに問いかけると、レスポンスとして、そのものずばりpythonの関数の定義が返ってきてびっくり。

また、別の例では文章を要約して、と問いかけると指定した文章を要約してくれたり。なかなかすごい。

ちょっとした案内はこれである程度カバーできそうな気がする・・・ 例えば、歩くペッパーくん+AIチャットを組みわせると、施設の案内とかできそう。

chat.openai.com

PHP: コンストラクタのプロモーション

PHP8.0以降コンストラクターの引数を、オブジェクトのプロパティに設定することができるようになった。

例えば、$valueというプロパティにコンストラクタで値を代入する場面を考えてみる。

class Hoge {
    public string $vlaue;
    public int $num;

    public function __construct(string $value, int $num) {
        $this->value = $value;
        $this->num = $num;
    }
}

var_dump(new Hoge('Hello', 1));

実行結果

object(Hoge)#1 (2) {
  ["vlaue"]=>
  uninitialized(string)
  ["num"]=>
  int(1)
  ["value"]=>
  string(5) "Hello"
}

これと同じ事を、下記のようにコンストラクタの宣言だけで実現できる。

class Hoge {
    public function __construct(public string $value, public int $num) {
    }
}

var_dump(new Hoge('Hello!', 2));

実行結果

object(Hoge)#1 (2) {
  ["value"]=>
  string(6) "Hello!"
  ["num"]=>
  int(2)
}

ちなみに、普通の引数と混在させることができる。

class Hoge {
    public int $num;

    public function __construct(public string $value, int $num, public bool $flg) {
        $this->num = $num;
    }
}

var_dump(new Hoge('Hello!', 3, false));

実行結果

object(Hoge)#1 (3) {
  ["num"]=>
  int(3)
  ["value"]=>
  string(6) "Hello!"
  ["flg"]=>
  bool(false)
}

通常の引数と、プロパティになる引数が混在するのは可読性が損なわれるように思うので、どちらか一方で統一した方が良いと思う。
バリューオブジェクトのコンストラクタに適用すると良さそう。

https://www.php.net/manual/ja/language.oop5.decon.php#language.oop5.decon.constructor.promotion

PHP - テキストに数行おきに空行を挿入する

テキストに数行おきに改行を挿入する方法を調べた。
処理のイメージは次の通り。

入力テキスト

あああああああああああ
いいいいいいいいいいいいい
うううううううううううう
ええええええええええええ
おおおおおおおおお
かかかかかかかかか

出力テキスト

あああああああああああ
いいいいいいいいいいいいい

うううううううううううう
ええええええええええええ

おおおおおおおおお
かかかかかかかかか

実装例は下記の通り。

<?php

$text=<<<EOS
あああああああああああ
いいいいいいいいいいいいい
うううううううううううう
ええええええええええええ
おおおおおおおおお
かかかかかかかかか
EOS;

echo preg_replace('/(.*\n){2}/', "$0\n", $text), PHP_EOL;

改行コードで終わる任意の文字列の2個目の末尾に改行を挿入している。

twitterの広告を消すブックマークレット

広告部分のhtmlには data-testid="placementTracking" という属性が設定されているので、その属性を持つDOM要素を非表示にすれば広告を消せる。

javascript:(() => {
    const e = document.createElement('style');
    e.innerText = '[data-testid="placementTracking"]{display:none;}';
    document.head.appendChild(e);
})();

スタイルタグを動的に生成して、そこに以下のCSSを書き込む。

[data-testid="placementTracking"]{display:none;}

で、そのCSSを書き込んだスタイルタグをheadタグ内に追記する。そうすると、タイムライン上の広告部分が非表示となる、仕組み。

xpathの記述方法を調べる(途中)

記述 内容
.. コンテキストノードの親を選択する
. コンテキストノードを選択する
* コンテキストノードの全ての子要素を選択する
/ ルートノードを選択する。
//hoge ルートノードの子孫全体から、要素 hoge を全て選択する。
hoge 要素 hoge を選択する
hoge[fuge] 要素 hoge のうち、子要素 fuge を1つ以上持つ要素を選択する。
hoge[fuge="moge"] 要素 hoge のうち、子要素 fuge の文字列が moge である要素を選択する。
hoge[@attr] 要素 hoge のうち、属性 attr を持つものを選択する。

html - datalistでお手軽コンボボックス

webでコンボボックスを実装するのは面倒だけれども、 実はhtmlには <datalist> というタグがあって、これを使うと手軽にコンボボックスを実現できる。

コード例)

<input list="languages">
<datalist id="languages">
    <option value="COBOL">
    <option value="Go">
    <option value="Haskell">
    <option value="Java">
    <option value="JavaScript">
    <option value="Kotlin">
    <option value="Perl">
    <option value="Python">
    <option value="PHP">
    <option value="Ruby">
    <option value="Rust">
    <option value="Swift">
</datalist>

上記のhtmlを記述するだけで次のようなコンボボックスが実現できる。

IEは非対応だがEdge以降は対応しているので、これからどんどん使っていきたい。