genzai0の日記

にっき

pnpmのセキュリティ機能で詰まったこと

WSL2で以下を実施時にエラー。

やりたかったこととして、supabaseの型定義を自動でインポートする作業で実施した。

pnpm supabase login

pnpmのセキュリティ機能のignored-buildでパッケージに含まれるスクリプトを実行しない。(らしい)

以下を実施。失敗。

# ビルドスクリプト実行を許可する
pnpm config set only-allow-trusted-dependencies false

# その後、もう一度インストールし直して実行ファイルを生成させる
pnpm install

パーミッション関係がだめっぽい。

手動で解決する。

pnpx supabase login

CLIで出てきたURLをたたき、画面の先で表示されたコードをCLI側に打ち直す。

 pnpx supabase gen types typescript --project-id {ここにsupabaseのURL} > src/types/database.types.ts

これでコマンドから一応取り込みができる。

やってみてあれだが、supabase dashboardからExport TypeScript typesもできるので、そっちの方が早いかも。

行列探索のメモ

いつも忘れるのでメモ。

二次元の行列の探索をするときに、上下左右方向に移動する操作をしたい。

考え方として、ターゲット(中心)の(xy座標)に隣接する4マスから、 行きたい方向にインデックスをずらす。

この移動方向だけをまず、二次元の一つのリストとして作成する。

d = [(-1, 0),(1, 0), (0, -1),(0, 1)]

これを単純なforで回し、ターゲットのマスの座標を足し合わせすることで、 一個ずらした座標を得る。

for dr, dc in d:
    nr, nc = y + dr, x + dc

あとは範囲内かどうかだけ判定を忘れずに。

Pythonのショートサーキット

短絡処理(ショートサーキット)でいいなと思ったメモ。

a,b = 1,2
if a == 1 or b[1] == "2":
    print("ok")

pythonの条件文は短絡なので、例のbの評価が発生する前にa==1でTrueが返る。 結果的にb[1]の参照エラーは起きない。

以下のような文字列の行列を探索する時に使えるパターンがある。

723
468
809

文字列中の左側が偶数であることを判定したい。ただし左端の場合は偶数と判定としてよい場合、 コードの例が以下になる。

c = ["723", "468", "809"]
# 縦方向
for i in range(3):
    # 横方向
    for j in range(3):
        # ここの判定はショートサーキットで一行で書ける。
        if j == 0 or int(c[i][j-1])%2 == 0:
            print(f"{i} {j}")```

行いたい、「判定」というニュアンスで一行にまとめるのは邪悪じゃない気がするので、割といいなと思った。

いもす法についてのノート

いもす法

累積和のアルゴリズム

想定される使用方法としては「任意の配列オブジェクトの幅指定を何度も受け取る」ものに対して用いる。 これで生成されるのは「受け取った際の合計の配列」である。

ここでは1次元0次について解説する。

参考。

imoz.jp

アルゴリズムについて

幅指定の入力において重複が多かったindexの最大値を求める問題を想定する。

幅指定

まず「幅指定で受け取る」というものを説明する。

例として長さ10で幅指定を受け取るとする。

index:

0,1,2,3,4,5,6,7,8,9

value:

0,0,0,1,1,1,1,1,1,0(*)

0,1,1,1,0,0,0,0,0,0

これを幅指定で受け取ると、

1つ目:index(3~8) だから、3,8

2つ目:index(1~3) だから、1,8

となる。

したがって0,9とすれば1で埋められた入力を受け取ることになる。

(*)再度参照

計算

「重複の数」を計算する。

これは単純に各valueの合計を取ればよいだけなので、例の合計は

index:

0,1,2,3,4,5,6,7,8,9

value:

0,1,1,2,1,1,1,1,1,0

したがってindex:3の2が最大値となる。

いもす法の実践

幅指定での計算を累積和的に工夫する。

幅指定に対して「帯」をイメージし、指定indexの終端まで伸びているとする。

ここで、指定indexの終端+1のindexのvalueを-1とする。

この配列を1つ目(3,8)で考えると、

index:

0,1,2,3,4,5,6,7,8, 9

value:

0,0,0,1,0,0,0,0,0,-1

index:3が1でindex:9が-1となっている。

これを累積和で考えると、index:3からindex:8までが1で埋められ、index:9において-1されることによりその地点が0となる。これで整合性がとれることが理解される。

すなわち、一番最初のvalueの例(*)と同じ情報を持っている。

また、1つ目と2つ目の幅指定を受け取った後のいもすのvalue

0,1,0,1,-1,0,0,0,0,-1

となる。

計算量削減のイメージ

普通、一つ一つ要素を改めなければならないので((指定回数+1)*配列の長さ)分の計算が必要だが、いもす法だと(指定回数*2+配列の長さ)となる。

配列要素の変更がindex指定の二回分しか行われないので、非常に計算が軽くなる。

感想

天才の発想。一生思いつかんわ…

Fedora30さんの初期設定のメモ

ことのはじめ

先日、実験機で使っていた環境が汚くなり吹き飛ばしてLinux mintの方から鞍替えをしてみようと思い、今に至ります。Fedora30での日本語化設定について自分用にメモを残します。

要約

この記事の要素です。

Fedora30での日本語設定
  • キーボード入力の設定
  • OSでの表示言語設定
  • terminalのショートカットの設定
  • 入力ソースの説明
  • ibusでのmozc
  • ibus-mozcの導入

日本語の入力と設定について

僕はterminalでの設定ができないので、GUI設定で進めます。 また、僕のキーボードはjis配列なのでjis配列を標準で書きますがus配列についても少し言及します。

左上[アクティビティ]から左側のダッシュエリアの最下部[アプリケーションの表示]で歯車マークの[設定]を開きます。

設定中の[地域と言語]から言語[日本語]、フォーマット[日本]になっていることを確認します。(変えたい場合は変えてください)

入力ソースで任意の入力ソースを選択し、必要以外のものを[x]ボタンで消します。日本語(かな漢字)があれば、これを設定してください。*これについてはあとで詳解します。

次にキーボードショートカットの設定です。Linux mintUbuntuではterminalの立ち上げはデフォルトで[Ctrl Alt T](shiftキー入力なし)で割り当てられているのですが、Fedora30ではその割り当てがないので、自前で設定します。

先程の作業と同様に[設定]から[デバイス]の[キーボード]を開き、最下端の[+]ボタンから独自のショートカットの登録をします。 名前は[terminal]もしくは[ターミナル]と自由に設定してください。コマンドは[gnome-shell]で変更不可です。最後にショートカットの設定ですが、[ショートカットの設定…]ボタンから実際にタイプして設定します。[Ctrl Alt T]の順で一つ一つ指を離さずにタイプしてください。タイプが終わると、画面が一つ戻るので自分の設定したキーと同様であるか、確認をしてください。

また、キーボードショートカットを新しく追加する場合は同様の手順で行いますがコマンドについては必ず有効なものを調べて登録し、またショートカットキーは他のショートカットと被っていないか確認してください。

登録が完了したら先程登録した[Ctrl Alt T]で実際にterminalを立ち上がるか確認してください。

入力方式と入力ソースについて

*詳解

はじめに入力方式と入力ソースについて説明します。

  • 入力方式…入力するモード。ローマ字入力orかな入力のこと
  • 入力ソース…キーボード入力のキー割当を司るもの。us配列とjis配列の切り替えに当たる

先程行ったキーボードショートカットですが、タイピングの欄が途中にあったと思われます。これは入力ソースを切り替えるもので、今回の設定では日本語(かな漢字)に絞ったのでショートカットキーが効きませんが例えば入力ソースが日本語と日本語(かな)の2つが登録されていた場合、[Super Space](Windowsキー+Space)でこの2つのソースが入れ替わります。

しかし、全角半角は日本語(かな漢字)の中で切り替えが可能なためわざわざ日本語と日本語(かな漢字)をまたぎ入力方式を切り替える必要はありません。標準的には一つの入力ソースの中でモードを切り返るべきと私は考えます。

したがって、タイピングの入力ソースの切り替えのショートカットは全角半角キー(Zenkaku_Hankaku)に割り当てないほうが好ましいと思われます。

余談ですが、入力ソースの切り替えのショートカット[Super Space]を[Zenkaku_Hankaku]に割り当てて使用すると約1~2秒のラグがあります。デフォルトであれば即時に切り替えられるのですが、不便利でありおすすめしません。

US配列について

ここではjis配列を標準に設定を示しましたが、us配列ではこれは当てはまりません。

us配列では入力ソースの切り替えを行うことによってローマ字入力とかな入力の切り替えをするのが一般的です。これは日本語jis/usの記号キーの配列の違いによるものです。

(試しに、入力ソースに英語(米国)から英語(US)を追加し、目のアイコンでキーボード配列の一覧を確認するとわかりやすいかもしれません)

したがって、us配列キーボードを使用する際は上記のように一つの入力ソースを使用するのではなく「日本語を打つための入力ソース」と「ローマ字と記号を打つための入力ソース」を行き来する設定が好ましいと思われます。(半角全角キーに関しては未検証なので入力ソースの切り替えの速度は使用感に応じて設定してください)

おすすめの入力ソース

デフォルトというか、私の周りでデファクトスタンダードな入力ソースのmozc紹介です。

以下、mozcのインストールの方法です。

(ここではibusでのインストールをしていますが、fcitxもありますので気になったらそちらも参考にしてください。Ubuntu17.10日本語Remix(?)のデフォルトではfcitxらしいです) 参照:

kledgeb.blogspot.com

[Ctrl Alt T]でterminalを開き、

sudo dnf update
sudo dnf install ibus-mozc

を実行します。管理者権限とパスワードについては各々でよろしくお願いします。

これで、先程の入力ソースに日本語(Mozc)が追加されたはずです。

日本語(かな漢字)と日本語(Mozc)の違いは日本語入力をした際の変換の辞書の違いです。また、かな漢字の場合は変換が小出しに出ますが、Mozcは逐一変換の予測を表示してくれるので使用感が違います。

ここは好みですので、好きに設定してください。

お疲れ様でした。