投稿者「f_yamaki」のアーカイブ

2038年問題

SoftwareDesign2025年8月号でも取り上げられていたが、2025年になってもまだ2038年問題なのである。
実務上最大の問題はMySQLでのtimestamp型が32bitであることか。だがこれは多くの場合DateTime型へ移行することで問題のないものとなる。
C上での問題も素直にtime_t型を使用していれば通常の問題はないし、strftime()を使っての書式化であれば全く問題など出ない。
世の中の技術者を大いに困らせているのは、time_tをlongでキャストしているバカタレの尻拭いであり、こいつらは意気揚々と「シリアル値の演算で通算秒の差をとれる」とか言いながらせっかくのtime_tをlongでキャストしやがるのです。
そもそもお前はlongがどういうものなのかわかっているのかと小一時間問い詰めたいと20年以上前に語った記憶があるのでまぁそれは置いておいて。

型が時代とともに変化し、同一ソースでは想定外の挙動を起こすことはlongに限らず良くあることではあり、じゃぁどうするのが一番良いのかと人間はいつも考え続けるわけで。
特にC/C++に於いては速度やサイズが重要である場面が多く、型のbit数を把握した上でのコーディングも少なくない。(だからbit演算とかがゴリゴリ出てくる)
とはいえこれらもsizeofやlimits.hやstdint.hあたりをきちんと使えばマジックナンバーを埋め込まずともコーディングは可能なのだから、そうすれば良いだけの話。

で何が言いたかったのかというと、
日時演算は専用関数作って使え
ってことで。問題あってもそこだけ直せば良いのだから。
long32にしたところで、(cur_dt + target_dt) / 2 とかやった時点で2038年を待たずにアウツなんだから、後続のために最低限日時演算処理は別ファイル別関数にしとけ。

ChatGPTで画像

無料のChatGPT(GPT-3.5)を使っているのだが、無料なのに画像が作れるっぽい。
ChatGPTに聞いてみると、

おそらく、OpenAIが一部の無料ユーザーに対して以下の限定的な機能提供を行っているためです

ということらしい。つまり「いつまで使えるかわからんよ」という。

ってことで、普段使っているこのアイコン画像をレタッチしてみることにした。
これは随分前にWindowsのペイントでマウスを使ってちゃちゃっと描いたもの。

これを「ちょっと線を太くしてなめらかに」でできたのが

目が一つしかなくなったので、「目を二つ並べて」というと

あぁ、そうなるよね、って感じw

しょうがないので自分で目を増やして、しばらくこれを使おうかなぁ、とか。

2025/07/31追記
この絵柄の出典は、「がんばれ!!タブチくん!!」の作者いしいひさいち先生の「最低人」です。
たぶん「がんばれ!!タブチくん!!」の単行本巻末に載ってた4コマだと思うのですが記憶に頼ってのペイントでのなぐり書きだったのであちこち違ってるような。
本物はこちら

kindle paperwhite 第5世代

第5世代というとアレだけれど、日本仕様での発売初版で、2012年11月ポチったもの。
10年以上経つのにまだまだ現役で動作に不満も特に無い。

だがしかし、購入時より随分と文字が大きくなっているのはまぁそういうことで。

 

購入時価格は7,980円+レザーカバーが4,500円。新しいのが欲しいけれど最新第12世代は27,980円だからなぁ・・・

コーヒーミル

たまたまスタバの豆をもらったのだけれどミルが見つからない。

安いのでいいんだけどなーと探したらニトリにちょうどいい具合なのが。

1490-也。

まー軽いし洗いやすいし、ハンドルも楽々で。豆が無くなればまたしばらく使わないのだけれど。

PHPでSlackへメッセージ送信

PHPでSlackへメッセージ送信するサンプル。

Slackの該当チャンネルで、チャンネル詳細〜インテグレーション〜アプリを追加する、でIncomming Webhookを追加。
その際に、チャンネルを指定(ここで新規作成も可)&投稿者名を設定し、Webhook URLを拾う。
あとはChatWorkとほぼ一緒。(要php-curl)

<?php

class SlackComponent
{
    /**
     * Slackへメッセージ送信
     * @param $url : Incomming WebhookのWebhook URL
     * @param $channel : #チャンネル名
     * @param $bodyText : 内容
     * @return  string | false
     *      error : ?
     *      success: "ok"
     */
    public static function send(string $url, string $channel, string $bodyText) : string | false
    {
        $ch = curl_init();
        $options = [
            CURLOPT_URL => $url,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_SSL_VERIFYPEER => false,
            CURLOPT_POST => true,
            CURLOPT_POSTFIELDS => http_build_query([
                'payload' => json_encode([
                    'channel' => $channel, // #チャンネル名
                    'text' => $bodyText, //本文
                ]),
            ])
        ];
        curl_setopt_array($ch, $options);
        $res = curl_exec($ch);
        curl_close($ch);

        if ($res === false) {
            return false;
        }
        return $res;
    }
}

呼び出し側は、

$url = 'https://hooks.slack.com/services/XXXXXXXXX/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
$channel = '#test';

$res = SlackComponent::send($url, $channel, 'this is test');
if ($res !== 'ok') {
    //fail
}
else {
    //success
}

こんな感じでするっと’ok’が返ってくる。

PHPでChatWorkへメッセージ送信

Line-Notifyが2025年3月末で終了するとのことで、代替を探してみたがどれもパッとせず。

LINE Official AccountでのメッセージAPIも200通/月以上は有料(5,000円/月)となるので小規模では使えず。

とりあえずの用途として顧客へ通知するわけではなく、申込みフォームからの申込みを管理者側へ通知できれば良いので、SlackかChatWorkへの投稿ができればスマホにアプリ入れれば通知くるのでまぁいいかと。

で、ChatWorkへのPOSTをPHPで簡単に。(要php-curl : >sudo apt install php-curl)

<?php

class ChatWorkComponent
{
    public static function send(string $roomId, string $token, string $bodyText) : array | false
    {
        $options = array(
            CURLOPT_URL => 'https://api.chatwork.com/v2/rooms/'.$roomId.'/messages',
            CURLOPT_HTTPHEADER => [
                'X-ChatWorkToken: '. $token,
                'Content-Type: application/x-www-form-urlencoded'
            ],
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_SSL_VERIFYPEER => true,
            CURLOPT_POST => true,
            CURLOPT_POSTFIELDS =>
                http_build_query(['body' => $bodyText, 'self_unread=0'])
        );

        $ch = curl_init();
        curl_setopt_array($ch, $options);
        $res = curl_exec($ch);
        curl_close($ch);

        if ($res === false) {
            return false;
        }
        return json_decode($res, true);
    }
}

こんな感じのを

$roomId = 'XXXXXXXXX';
$token = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';

$res = ChatworkComponent::send($roomId, $token, 'this is test');
if ($res !== false) {
    if (array_key_exists('message_id', $res)) {
        //success
    }
    else {
        //fail
    }
}
else {
    //fail
}

こんな感じで呼び出してやる。

マルチ電圧アダプタ

ちと必要で、マルチ電圧アダプタを購入。

1つ目は手動切り替えタイプ。
3/4.5/6/7.5/9/12 Vの切り替えダイヤルで、変換プラグ6種類付き、正負極性変換可能なやつ。
家庭用で12Vまでなのだけれど、まぁ大抵のものには間に合う。1.78Kyen。
アダプタの刺す向きで極性を変える。

2つ目は、スイッチ切り替えの、
5/6/7/8/9/10/11/12/13/14/15/16/17/18/19/20 V対応の、変換プラグ6種類+USB-Cとか3つ付きで、同じく正負極性変換可能なもの。

ボタン長押しして電圧切り替えて使用するタイプ。極性リバース用のケーブルが別途ついてる。2.5Kyen。

まぁどちらも恒久的に使うものではないのだけれど、後者はノートパソコン用電源にも使えるので便利。

TESMEN TM-510

古いテスターがめっからないのでデジタルのやっすいやつをポチ。

https://tesmen.com/products/digital-multimeter-4000-counts-ncv-test-ac-dc-voltage-resistance-continuity

ちゃちいカバーが着いた全オートで家の中で使う分には導通/直流電圧/交流電圧が測れれば良いので十分なもの。

単4電池ってのもまぁポイント高く。(006Pのやつが多いんだよねぇ)

ケースも着いて目立たずコンパクトで、しばらく持ってくれればいいな。

(今更)double braceでのCollection初期化

以前より取り沙汰されてはいる、Java-Collectionのdouble-braceによる初期化について。

Map<String, String> mp = new HashMap<String, String>() {{
    put("abc", "ABC");
    put("def", "DEF");
   put("ghi", "GHI");
}};

のようにインスタンス生成と初期化を行うコードはJava8以前にはちょいちょい見られ。
今もまぁちょいちょい使うのだけれど。
このdouble-braceによる初期化当初よりメモリリークが指摘され、注意が必要とされている。
匿名内部クラス(annonymous inner class)が生成され”強い外部参照”が作成されるためガーベージコレクションされることなく残り続けるというもので、繰り返し処理されるロジックでは避けるべきとされている。
(https://blog.p-y.wtf/avoid-java-double-brace-initialization で詳しく解説されている)

でもって、じゃぁ、というのはJava9以降なら簡単で、

Map<String, String> mp = Map.of("abc", "ABC", "def", "DEF", "ghi", "GHI"};

とするだけ。もちろんMap.ofの場合はImmutable Collection(不変コレクション)を返すので、putなどの編集・追加・削除操作はできないが、ごそっと初期化したい時ってぇのはImmutableで構わないケースがほとんどなので問題はないだろう。

ただ”ガーベージコレクションされない”が致命的でない場合は、double-braceも便利な書き方ではあるので、例えば単発Java Applicationのループ外での初期設定とかでは十分有効だといえる。

つーか、コレクションの初期化は面倒なのはわかるのだけれど他の言語では割と簡単にできるものであるし、ささっと初期化できないってのはなんだかなーとは思うわけだがまぁそういうものだししょうがない。