Pythonのデバッグにつかえるもの

pdb

gdbみたいなもの

import pdb; pdb.set_trace()

あとはドキュメントを適宜見る.

numpyのarrayの出力が全部みたいとき

numpyの出力が…で省略される場合があるので以下のようにするといい.

np.set_printoptions(threshold=np.nan)

他のオプションはドキュメントをみる.

VSCodeスニペットに登録する

以下のように登録すると便利.

{
    "debugger": {
        "prefix": "debugger",
        "body": [
            "import pdb; pdb.set_trace()"
        ],
        "description": "debugger"
    },
    "npprint": {
        "prefix": "npprint",
        "body": [
            "np.set_printoptions(threshold=np.nan)"
        ],
        "description": "npprint"
    }
}

JSON Schemaの仕様を読んだ

自分でまとめると理解が進むと誰かが言っていたので自分なりにまとめる. 読んだのはJSON Scheme Coreの部分.

Instance

JSON SchemaではデータモデルをInstanceと呼ばれるもので表す.Instanceには以下の6つの基本型を持つ.

  • null
  • boolean
  • object
  • array
  • number
  • string

基本的にはJSと同じ.データの型という理解で問題ない気がする.

root schemaとsubschemas

名前から想像できる通り,root schemaはトップレベルのschema,subschemasはroot schemaにネストされたschemaである.

JSON Schemaの拡張

新たにmeta-schemasを作って拡張したいときは"$schema"キーワードを使う.

“$schema"キーワード

“$schema"の値にはJSON schemaのどのバージョンを使うかを示す正規化したURIを記述する. ”$schema"はroot schemaに記述する.

“$ref"キーワード

“$ref"キーワードはschemaの参照に使われる. また,自身を参照することで再帰的な構造を記述することも可能.(ただし,無限ループを作ってはならない) オブジェクトのプロパティに”$ref"がある場合は"$ref"の参照であると解釈する. このときの"$ref"の値はURIである. 以下は理解できなかったのでそのまま持ってきた.

All other properties in a “$ref” object MUST be ignored.

“$id"キーワード

schemaのURIを定義するもの. root schemaに"$id"プロパティを入れるのが行儀がいい.このときの値は一意に定まるようなもの( e.g. "http://example.com/root.json")にする. subschemasには相対的に定まるもの(e.g. #fooと指定した時はhttp://example.com/root.json#fooと解決される.)を"$id"プロパティの値に入れる. 他の例はJSON Schema: A Media Type for Describing JSON Documentsを見て.

内部参照

“$id"キーワードと”$ref"キーワードを使うことで内部参照ができる.例は JSON Schema: A Media Type for Describing JSON Documents を見て.

JSON schemaで使えるキーワード

以下をみればよい.

Firebaseでハマったこと

注意

ベータ版の機能を使っている部分があるので機能が変わっていることもある.

CloudFunctionsとHostingを一緒に使うときのURLの管理

通常,CloudFunctionsのFunctionをデプロイした時にアクセスするURLはhttps://us-central1-<your-project-id>.cloudfunctions.net. HostingでデプロイしたコンテンツにアクセスするときのURLはhttps://<your-project-id>.firebaseapp.comとなっている. 例えば,hogeというFunctionを定義した場合はhttps://us-central1-<your-project-id>.cloudfunctions.net/hogeにアクセスすることで実行できるが, https://<your-project-id>.firebaseapp.com/hogeにアクセスして実行できる方が便利である. そのためにはfirebase.jsonを以下のように書けばよい.

// firebase.json
{
  "hosting": {
    "public": "public", // ホストするディレクトリ
    "rewrites": [ {
      "source": "/hoge",  // https://<your-project-id>.firebaseapp.com/hoge
      "function": "hoge" // https://us-central1-<your-project-id>.cloudfunctions.net/hoge
    } ]
  }
}

詳しいことは Serve Dynamic Content with Cloud Functions  |  Firebase を参考.

CloudFunctionsでAPIキーを使いたいとき

APIキーなどの外部に漏らしてはいけない情報を扱うときにハードコーディングすることはなるべく避けたい(GitHubなどでソースコードをPublicに管理している場合は絶対にやってはいけない). CloudFunctionsには環境変数を設定する機能が用意されており,CLIfirebase functions:config:set someservice.key="THE API KEY" someservice.id="THE CLIENT ID" というようにして設定できる. この設定はFunction側からはfunctions.config().someservice.keyfunctions.config().someservice.idという形でアクセスできる. また,現在の環境変数の取得はCLIfirebase functions:config:getと実行することでJSON形式で受け取れる.

詳しいことは Environment Configuration  |  Firebase を参考.

ファイルの文字コードの確認と変換

いつもやり方を忘れて調べるのが面倒なのでメモ

nkfのインストー

Homebrewとかで

文字コードの確認

file -I ./*

or

nkf -g ./*

文字コードの変換

文字コードUTF-8,改行モードをLFに変換.

nkf --overwrite -wLu ./*

ブラウザでES Modulesを使う

前置き

いくつかのブラウザで使えるようになっているっぽいので少し書いてみます. 詳しいことは書きません.使い方は間違っている可能性があります.使えた〜というだけなので情報量はほぼないです.

本題

HTMLに次のように書きます.type="module"がないと動きません.

<script type="module" src="./main.js"></script>

次のようにmain.jshello.jsを定義します.

// main.js
import hello from './hello.js'

hello('ESM')
// hello.js
const hello = (name) => {
  const box = document.getElementById('box')
  box.textContent = `Hello ${name}!`
}

export default hello

↓で動作確認できます.
https://nimiusrd.github.io/ESM/

ソース github.com

まとめ?

Safariは何も設定しなくても動いたのが驚き(?) 使い始めるのはいつからがいいんですかね?

ref

Can I use... Support tables for HTML5, CSS3, etc

Native ECMAScript modules - the first overview

jsarticleのsectionで改ページしたくなった

まず、jsarticleに関するドキュメントを見ると\section

\if@twocolumn
  \newcommand{\section}{%
    \@startsection{section}{1}{\z@}%
    {0.6\Cvs}{0.4\Cvs}%
    {\normalfont\large\headfont\raggedright}}
\else
  \newcommand{\section}{%
    \if@slide\clearpage\fi
    \@startsection{section}{1}{\z@}%
    {\Cvs \@plus.5\Cdp \@minus.2\Cdp}% $BA0%"%-(B
    {.5\Cvs \@plus.3\Cdp}% $B8e%"%-(B
    {\normalfont\Large\headfont\raggedright}}
\fi

と定義されています。 改ページするには直前に\clearpageを挿入すればいいのですが、オプションをいじるだけではできません。

なので、\sectionを再定義します。 プリアンブルに以下のものを追加します。

¥makeatletter
¥renewcommand{¥section}{%
    ¥clearpage
    ¥@startsection{section}{1}{¥z@}
    {¥Cvs ¥@plus.5¥Cdp ¥@minus.2¥Cdp}
    {.5¥Cvs ¥@plus.3¥Cdp}
    {¥normalfont¥Large¥headfont¥raggedright}}
¥makeatother

今回はtwocolumnオプションは使わないので省きました。

ref

scanfで苦戦した

まえおき

C言語の話。
コンパイラgcc
scanfを複数回実行すると入力バッファに改行文字が残って意図しない動作をすることがある。
その回避策として以下の2つがあった。

  • 代入抑止文字を使う方法
scanf("%c%*c",&c);
  • 空白文字を使う方法
scanf(" %c",&c);

ほんだい

目的

上記の方法を使って以下のようなことを実現する。

  • 入力されたもののうち先頭にある文字だけを読み取る。
  • どんな入力に対しても対処できるようにする。

実装

  • 代入抑止文字を使う方法
scanf("%c%*[^\n]%*c", &ch);

先頭の文字を読み取り、入力バッファに残ってるものを読み捨てる。

#include <stdio.h>

int main(void) {
  char ch;
  while (1) {
    scanf("%c%*[^\n]%*c", &ch);
    printf("ch:%c;%d\n", ch, ch);
    printf("--------------------\n");
  }
  return 0;
}

実行結果

q
ch:q;113
strchr(str, ch):;4196100
--------------------
w
ch:
;10
strchr(str, ch):;0
--------------------
e
ch:e;101
strchr(str, ch):;4196102
--------------------
rty
ch:
;10
strchr(str, ch):;0
--------------------

うまくいかない。

  • 空白文字を使う方法
scanf(" %c%*[^\n]", &ch);

先頭の空白文字と改行を読み捨ててから、先頭の文字を読み取り、入力バッファに残っている改行文字までを読み捨てる。

#include <stdio.h>

int main(void) {
  char ch;
  while (1) {
    scanf(" %c%*[^\n]", &ch);
    printf("ch:%c;%d\n", ch, ch);
    printf("--------------------\n");
  }
  return 0;
}

実行結果

q
ch:q;113
strchr(str, ch):;4196100
--------------------
w
ch:w;119
strchr(str, ch):;4196101
--------------------
e
ch:e;101
strchr(str, ch):;4196102
--------------------
rty
ch:r;114
strchr(str, ch):;4196103
--------------------

よさそう。

まとめ

scanfはなるべく使いたくない