文字列を N 文字ごとに分割したい 他
文字列を N 文字ごとに分割したい

const splitNchars = (str, n) => str.split(new RegExp(`(.{${~~n}})`)).filter(e => e)

splitNchars("abcdefg", 2)
// ["ab", "cd", "ef", "g"]

文字列を N 文字ごとに改行したい

splitNchars("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890", 13).join("\n")
// abcdefghijklm
// nopqrstuvwxyz
// ABCDEFGHIJKLM
// NOPQRSTUVWXYZ
// 1234567890

文字列を N 個に分割したい

const splitNstrings = (str, n) => {
const arr = splitNchars(str, Math.ceil(str.length / n))
return [...arr, ...Array(n - arr.length).fill("")]
}

splitNstrings("abcdefg", 2)
// ["abcd", "efg"]
Nodist で yarn 使うときのパス
Windows に Nodist で Node.js を入れて yarn でパッケージをグローバルインストールすると自分でパスを通さないといけません
普通に Nodist をインストールすると 「C:\Program Files (x86)\Nodist」 にインストールされます
node.exe や npm.exe は 「C:\Program Files (x86)\Nodist\bin」 に保存されます
npm でグローバルにインストールしたパッケージのコマンドもここに配置されます
npm で yarn を入れたあとに確認してみると

user1@pc MINGW64 /c/Program Files (x86)/Nodist/bin
$ ls -1
bin/
etc/
node.exe*
node_modules/
nodist*
nodist.cmd
nodist.ps1
nodist.sh*
nodist_bash_profile_content.sh
npm.cmd
npm.exe*
yarn*
yarn.cmd
yarnpkg*

ここにはパスが通ってるので yarn コマンドは使えます
yarn でパッケージをグローバルインストールしたものはこのフォルダではなくそのさらに内側の bin フォルダにコマンドが配置されます
yarn で parcel をグローバルインストールしてみると

user1@pc MINGW64 /c/Program Files (x86)/Nodist/bin
$ ls bin -1
parcel*
parcel.cmd
parcel.cmd.ps1*
parcel.ps1*
parcel.ps1.cmd
parcel.ps1.ps1*

parcel はパスが通ってないのでそのままでは使えません
「C:\Program Files (x86)\Nodist\bin\bin」 にパスを通せばどこでも yarn でインストールしたツールが使えるようになります
Python のクラスの継承
クラス名のあとのカッコに親クラス名をいれる

class X:
def __init__(self):
self.a = 10

def method():
return 1

class Y(X):
def __init__(self):
self.b = 20

print(vars(Y()))
# {'b': 20}

print(Y().method())
# 1

それだけだと親クラスの初期化処理が行われなくて vars の結果に a が存在しない
初期化されてないだけで継承されてるので method メソッドは使える

他言語で言う super の実行が必要
なくてもエラーはないけど初期化されない

super() は親コンストラクタを表してるわけじゃないので super() で取得できるインスタンスの __init__ メソッド呼び出しが必要

class X:
def __init__(self):
self.a = 10

class Y(X):
def __init__(self):
super().__init__()
self.b = 20

print(vars(Y()))
# {'a': 10, 'b': 20}

子クラスの方で __init__ を書かなければ自動で親クラスが実行される
子クラスで __init__ を定義して初期化するなら 必要あるときだけ親クラスの初期化メソッドを実行できる
実行したくないならしないことができる

class X:
def __init__(self):
self.a = 10

class Y(X):
pass

print(vars(Y()))
# {'a': 10}

実行タイミングも自由に指定できる
self を使う前とか最初じゃなくていい

class X:
def __init__(self):
self.a = 10

class Y(X):
def __init__(self):
self.a = 100
super().__init__()
print(self.a)

Y()
# 10
Liri OS
なんとなく fedora の派生ディストリを眺めたら Hawaii OS というのを発見
なんでハワイ?
ハワイっぽいデザインなのかなと見てみたら

Hawaii is now Liri OS
Hawaii merged with Papyros and is now Liri OS.

http://hawaiios.org/

Liri OS にマージされたみたい
これもはじめて聞いたけど UI のデザインがよさそう
スクリーンショット一覧を見てみてもモダンな感じ
ロゴは折り紙でや名前もわりと好きでちょっと興味あり

Hawaii OS が fedora 派生だったんだからこれも fedora 派生?と思ったのに調べてみると Arch ベースらしい
fedora 以上に新しいのをすぐに取り込む分問題も多いらしいし迷うところ

UI を揃えるために独自にいろいろなソフトウェアも用意してるみたいでリポジトリがいっぱい
https://github.com/lirios
liri ブラウザなんてのもある
VS Code の Python 拡張がメモリ使いすぎ
VS Code の Python 拡張を使うとメモリが使用どんどん増えていく
制限なく増えて 10GB 超え
この辺からは物理メモリに乗らなくなってきて PC の動きが重くなってくるから強制的にプロセス落としてるけど自動で再起動するし しばらくしたらまたメモリが 10GB くらい使ってる
さすがに 10GB 使うのが正常とは思えないし 定義ジャンプ機能使ったらずっとロード中になってるしバグっぽい
バージョンは最新の (2019.1.0) だし しばらくは無効にして使うしかないかなぁ
バイナリファイル中の文字列が半角スペース区切りになってる理由
exe とかのバイナリファイル中でテキストを探すとよく目にするのが半角スペース区切りになってる文字列
"abcd" が "a b c d" という感じ

ビルドしたファイルにローカルのパスが入ってたりしないか探したりするのですが探しづらくて困ります

バイナリファイル中のテキストはそういうふうに入ってるものとなんとなく思ってましたがなんでこんな面倒なことしてるんだろう?
わざわざ検索対策にそんなことするというのは考えにくいです

考えていてひらめいたのが Unicode (UTF-16) だからというもの
バイナリファイル中に見つかる文字はアルファベットばかりで日本語はほぼ見つからないです
あってもちゃんとした意味のある文字列になってないです
UTF-16 ではアルファベットなどは sjis や utf-8 と同じ数値を 0 パディングしたものです
U+0061 が a で U+0041 が A です
1 バイトずつ保存したら 00 と 61 のようになるので エディタで見ると 00 の部分はスペースで 61 の部分が a と表示されて半角スペース区切りというふうに見えると考えられます

試しにエディタで開いてそれぞれの文字コードを見てみると半角スペースは普通の半角スペース (U+0020) ではなく U+0000 になってました
U+0000 は NUL であって半角スペース文字じゃないのでエディタによっては別表示かもしれません

日本語が表示されないのは「あ」は U+3042 ですが 30 と 42 は 0B になってしまうからです
エディタで UTF-16 として開くを実行すれば半角スペースなく表示されますし日本語も表示されます
これで検索しやすくなりました

一応最初にバイナリファイルをエディタで開いたときにエンコーディングをいろいろ試してはいたのですが UTF-16 にすると UTF-8 に比べて文字化けのような変な漢字が大量に出てきて これは違うなと思っていたのですが本当のバイナリデータの部分がそう見えるせいでテキスト部分はちゃんと表示されていました
Python で「,」で終わると
dictionary だったのを個別の変数にコードを修正したときに「,」を消し忘れてたのですが動いてました

こういうの⇩
a = 1,
b = "foo",

Python ってカンマあっても動くんだ
複文みたいな機能があって カンマのあと何もないから何も処理しないってことかな
JavaScript などで ; をいっぱい書いても動くのと同じようなものかな

と思ってたら あっても意味がないというのじゃなく別の意味になってました
カンマで終わるとタプルになります

a
// (1,)
b
// ('foo',)

という感じです
一時的に動かすだけのコードだったのであってもいいならそのままでのつもりだったのですが ちゃんと消さないとダメですね
product ジェネレータ
複数の配列の掛け算的な組み合わせを出力
2 つの配列で 2 重ループで回すようなやつ
任意個数の配列に対応してる
速度求めるなら N 重ループしたほうがいい

function* product(...args) {
if (args.some(e => !Array.isArray(e) || !e.length)) throw new Error("Each argument must be an array.")

function* sub(state, args) {
const [arr, ...subargs] = args

if (!Array.isArray(arr)) {
yield state
return
}

for (const item of arr) {
yield* sub([...state, item], subargs)
}
}
yield* sub([], args)
}

例)
[...product([1, 2], [3, 4], [4], [10, 20, 30])]

// (12) [Array(4), Array(4), Array(4), Array(4), Array(4), Array(4), Array(4), Array(4), Array(4), Array(4), Array(4), Array(4)]
// 0: (4) [1, 3, 4, 10]
// 1: (4) [1, 3, 4, 20]
// 2: (4) [1, 3, 4, 30]
// 3: (4) [1, 4, 4, 10]
// 4: (4) [1, 4, 4, 20]
// 5: (4) [1, 4, 4, 30]
// 6: (4) [2, 3, 4, 10]
// 7: (4) [2, 3, 4, 20]
// 8: (4) [2, 3, 4, 30]
// 9: (4) [2, 4, 4, 10]
// 10: (4) [2, 4, 4, 20]
// 11: (4) [2, 4, 4, 30]

for(const [a, b] of product([1, 2], [3, 4])){
console.log(`a = ${a}, b = ${b}`)
}
// a = 1, b = 3
// a = 1, b = 4
// a = 2, b = 3
// a = 2, b = 4
Shift+Enter
Chrome で Google の検索フォームなどのテキスト入力中に Shift-Enter を押すと新しいウィンドウで結果のページが開かれる
タブじゃなくてウィンドウ
URL バーのところでも同じ

Firefox だと URL バーだと新しいタブで開く
URL バーの右側の検索フォームや Google のページなどでは効果なし

Vivaldi だと URL バーの右側の検索フォームや Google のページでは新しいタブで開く
URL バーだと効果なし