TypeScriptでHTMLファイルを読み込んで画像URLをすべて取り出す

最近おかしくなってきてなんの言語で適当な雑務を行うか悩む所です。

今回はHTMLの中から画像URLだけを取り出すって感じです。ブラウザ上に表示されている単一のページであればimg要素を単に取り出せば終了ですが、今回は無限なるHTMLファイルから画像URLを取り出すってことでして、TypeScriptでやってみよう。

yarn add fs-extra @types/fs-extra

httpとかhttpsとか//とかいろんなパスで始まるっぽいけどhttpsに統一せねばならんというルール。

import * as fs from 'fs';

fs.readFileSync('./hoge.txt', 'utf-8')
  .match(/((https?:)?\/\/example.com[^"']+(png|jpe?g|gif|svg))/gi)
  .map(url => url.replace(/^http:/, 'https:'))
  .map(url => (/^\/\//.test(url)) ? "https:" + url : url)
  .filter((x, i, self) => self.indexOf(x) === i)
  .forEach(url => console.log(url));

これで終わりンゴ。 ts-node で実行すると標準出力されるので煮るなり焼くなり。

Ubuntuにluarocksを入れて5.3で動かす

Lua書くの久しぶり。最後に書いたのは4年前。それはApple信者時代だった。今はUbuntuユーザーです。

Ubuntuでは下記のようにしてLuaとluarocksがインストールしました。

5.3を入れるなら

sudo apt install luarocks-5.3

5.1を入れるなら

sudo apt install luarocks-5.1

luarocksはこれで入れられる。

sudo apt install luarocks

で、luarocks-5.3以上が必要な環境があってHomebrewで入れた時は luarocks-5.3 というコマンドがあったのでそれを使えば良かったが、Ubuntuでは環境に入れているluaのバージョンに左右されるみたいで、5.1が入っているとluarocksは5.1で動いていた。

sudo apt remove lua-5.1

と古いバージョンを除去することでluarocksのバージョンがあがった。aptでなんとかしようとした場合はこれなので、他の方法がありそうだね。

Google Cloud SQLにmysqlコマンドで接続する

接続する方法はたくさんあるが、まずは最も簡単なmysqlクライアントで接続したい。

SSLを使用せずに接続する

方法は簡単で

  1. パブリック IP アドレスを取得する
  2. 公開インスタンスにネットワークを追加で接続元IPを追加

とした後下記のようにして接続できる

mysql -h ip -u root -p'pass'

SSLを使用して接続する

デフォルトではSSL経由でなくても接続できてしまうので、SSL経由のみのアクセスにして、SSL証明書を作成、クライアント証明書をダウンロードして、下記のようにして接続します。

mysql -h ip -u root -p'pass' \
  --ssl-ca=server-ca.pem \
  --ssl-cert=client-cert.pem \
  --ssl-key=client-key.pem

おわり

意固地になって自分でDBサーバー運用してたけど負けてCloud化。もう自分でメンテする必要もないし、必要に応じてスケールアップ、スケールダウンができるので忙しいサラリーマンには嬉しいものですな。

参考

https://cloud.google.com/sql/docs/mysql/connect-admin-ip?hl=ja

RustでタプルのイテレータをHashMapにする

use std::collections::HashMap;

let map: HashMap<usize, usize> = [1, 2, 3]
    .into_iter()
    .map(|value| (value.to_owned(), value.to_owned() * 2))
    .collect();

let mut a: HashMap<usize, usize> = HashMap::new();
a.insert(1, 2);
a.insert(2, 4);
a.insert(3, 6);

assert_eq!(a, map);

Rustのloopのbreakで値を返す

ループ処理の中で成功した値だけを取り出したい。whileでは返せないし、std::iter::findではいけるだろうが、Futureを処理する必要がある場合は活用できない(findで処理させる場合中でawaitを使えない。処理する場合はStreamにしてFutureをすべて解決にしてから回すことになるから)の時に困るわけですが、loopbreak fooとして値を返せるようだ。

let mut i = 0;

assert_eq!(
    loop {
        i += 1;
        if i == 10 {
            break i;
        }
    },
    10
);

コーヒーを直火で再加熱できるシングルチタンマグが気に入っている

最近このシングルチタンマグにハマっています。普通にコップを電子レンジで加熱すればいいとは思うんですけど、それだとこたつから出なければいけない。

このコップならカセットコンロとかで加熱できるので、こたつから出ることなく再加熱とかできるのが便利。災害時にも飲み物を温めたりが容易にできます。

最近はスープもこれで作って飲んでます。一人分のスープを作るのに巨大な鍋だと難しいんですが、このコップでそれができるようになりましたよ。

IH対応の加熱できるコップとかもありそうですね。