お知らせ

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

あると何かと便利だよねというので。

確認環境

Env Ver
PHP 8.0.29

サンプルコード

取り敢えずファイルをアップロードするだけのコード

<?php
if ($_FILES['image']) {
    move_uploaded_file($_FILES['image']['tmp_name'], 'files/'. $_FILES['image']['name']);
} else {
?>
<html>
<body>
<form action="upload.php" enctype="multipart/form-data" method="POST">
    <input type="file" name="image">
    <button>upload</button>
</form>
</body>
</html>
<?php
}

ブラウザのタブがバックグラウンド状態になっているとJSの実行が止まることがあり、そうするとsetInterval()が死ぬので、これを回避する技。

結論としてはWeb Worker APIのWorkerインターフェースを使うことで解決できる。

確認環境

Env ver
Microsoft Edge 126.0.2592.87

サンプルコード

/**
 * @param {() => void} cb 実行するコールバック
 * @param {number} interval 実行間隔
 * @returns 停止用の関数
 * */
const createWorkerInterval = (cb, interval) => {
  const src = "self.addEventListener('message', (msg) => { setInterval(() => self.postMessage(null), msg.data) })";
  const wk = new Worker(`data:text/javascript;base64,${btoa(src)}`);

  wk.onmessage = () => cb();
  wk.postMessage(interval);

  return wk.terminate;
}
投稿日:
Node.js::その他サービス::GitHub::GitHub Actions

Node.jsのスクリプトを適当に書き次のようなWorkflowsを記述することで実行できる。勿論Dockerイメージを作ってそこから立ち上げることもできるので好みの問題。直に呼べる分、取り回しは楽だと思う

name: hoge
description: hoge
inputs:
  GITHUB_TOKEN:
    description: 'Workflowsを実行するリポジトリのGITHUB_TOKEN'
    required: true
on:
  workflow_call:
runs:
  using: node20
  main: dist/index.js

inputs:outputs:を記述すれば入出力の引数も定義できる。

inputs.GITHUB_TOKENについて

これを書いておくとoctokitを使ってGitHubのAPIを叩けるようになる。普通は何かAPIを叩くはずなので書いておいた方が良い。

以下は一例。

const github = require('@actions/github');
const core = require('@actions/core');

async function run() {
    const token = core.getInput('GITHUB_TOKEN');
    const octokit = github.getOctokit(token);

    const { data: pullRequest } = await octokit.rest.pulls.get({
        owner: 'octokit',
        repo: 'rest.js',
        pull_number: 123,
        mediaType: {
          format: 'diff'
        }
    });

    console.log(pullRequest);
}

参考

投稿日:
言語::PHPミドルウェア::RDBMS::SQLite

"hoge", "piyo", "fuga"のように綺麗なCSVであるという前提。CSVファイルが巨大なので行読み込みする。

<?php

$db = new PDO('sqlite:./hoge.db');

$db->beginTransaction();
$fp = fopen("hoge.csv", "r");
$idx = 0;

if($fp){
  while ($line = fgets($fp)) {
    $row = createRow($line);
    $db->exec(
      'INSERT INTO hogehoge (`foo`, `bar`, `baz`)'
      . ' VALUES '
      .'(' . '"' . $row['foo'] .'", ' . '"' . $row['bar'] .'", ' . '"' . $row['baz'] .'"' . ')'
    );
    $idx++;
    echo $idx . "\n";
  }
}

fclose($fp);
$db->commit();

function createRow($text) {
  $r1 = preg_replace('/"/', '', $text);
  $row = explode(',', $r1);

  return [
    'foo' => $row[0],
    'bar' => $row[1],
    'baz' => $row[2],
  ];
}

トランザクションを張りっぱなしだが、exec毎にトランザクションを張りなおすと劇的に遅くなるのでやめたほうがいい(恐らく毎回同期処理でWriteが走っているのだと思う)

投稿日:
ジャンル::雑記

普段書籍はKindleで読んでいるのだが、今回本棚を買った。

実は以前は本棚を持っており、100冊程度を蔵書していた。中学生のころから買ったコミックや文庫、CD、同人誌やグッズなどを収めていた。しかし、その当時は部屋の収納容量が限界に達していた。衣類を置く場所がほとんどなかったのだ。

正直今でも私は服を持っていないほうで、衣装ケースも多くはもっていないが、当時は一個しかもっていなかった。それでも何とかなっていたのだが、もう少し環境を良くしたいと思っていた。その時に障害となったのが本棚の存在だった。

7年ほど前だろうか、ミニマリストを目指していた私は、この時に本棚を撤去する決断をした。持っていた本やグッズ、CDを全て手放し、生活を優先する判断をしたのだ。そして持っていた本などは電子化という手段で解決した。

しかし、去る6月21日、これを変える出来事があった。私はその日、クラユカバとクラメルカガリを鑑賞するために淡路島は洲本市にある洲本オリオンに訪れていた。そして鑑賞を終え、売店を眺めていると一冊の本が目に入った。「R15+じゃダメですか?」という本だ。

20240714_075433.jpg

私は映画に関係ないグッズがあるのは珍しいと思い、この本を買うことにした。物理本を手放し、本棚を処分した今、本を置く場所などないのにである。

そして私は「R15+じゃダメですか?」を読み、続編を全て紙の本で買うことにした。理由としてはここ数年、紙の本を大切にしたいと思っていたからだ。電子書籍はいつか見れなくなる可能性がある。それに私はGAFAが好きではない。デジタル赤字や、GAFAによる支配、表現規制、日本の独立性のことを考えると紙で本を買ったほうが良いというのが個人的な結論だった。

勿論それだけではない。紙の本はモノによっては特殊印刷が施してあり、凝った装丁のものがあるし、何より希少性があるからだ。紙の本はいつか絶版になり、そうなると手に入らなくなる。そうなれば潰えた歴史というか、時代を自分の手で持っておくことができるというステータスみたいなものが手に入る。

他にも紙の本は読んでいて手触りが心地よいとか、いろいろなところがある。

しかしでは本棚をどうやって部屋に置くかだが、答えは単純だった。私は7年前に住んでいた狭い部屋を引き払い、今はそれより広い部屋に住んでいる。使いもしないギターを置いているスペースを空ければ本棚程度は置ける。その考えは「R15+じゃダメですか?」を手に取った瞬間に電光石火のごとく頭にひらめいた。

それにトラペジウムグッズを無駄に買いすぎてしまった結果、置き場に困っていたグッズの収納先として棚が欲しかったのもあり、このアイデアはまさにジャストマッチだった。

そして私は早速、900冊程度入ると謳う、山善の本棚を注文した。まさか宅配ボックスには入るまいと思っていたのだが、困ったことに宅配ボックスに入っていたので部屋まで運ぶのが大変だった。以下の写真を見るとわかるのだが、中々デカいし、普通に重い。30kgくらいはある。

20240712_223405.jpg
20240712_224133.jpg

昨日これを頑張って組み立てて、物理本置き場を作ることにやっと成功した。以下は本棚を組み上げ、本が入っていく様子である。そもそも蔵書がないので現状は置き場所に困っていた適当なものを突っ込んでいる。

20240713_140219.jpg
20240713_143528.jpg
20240714_003223.jpg

しかし、この状態でも本棚に本が収まっている光景はいいものだ。これまで本屋に行っても本を買えないでいたもどかしさも解消される。

というので今後は物理本を買い集めていこうと思う。手放してしまった本も可能な範囲で取り戻していきたいところだが、残念ながらほとんど絶版だと思うので、中古に頼ることになるだろう。キノの旅まで絶版になっているのは正直驚いた。

因みに当時本棚にあったものでも、まだ手放していないものはわずかにあり、水月と月箱だけは残してある。この二つだけはどうしても手放したくなかったからだ。

20240714_090615.jpg

恐らく水月については、私の部屋にあるもので、最も古い存在だ。水月は非常に大切なので水月だけは死ぬまで持っておくと思う。という意味では、かつて保有していたオフィシャルファンブックも残しておくべきだったが、あれは大きかったので致し方ないか…。