「 ↑ こういう Excel みたいなスプレッドシートを作っているわけだぜ☆ Webで☆」
「 仕事をしているふり ばっかりしていては ダメなのよ。
コンピューター将棋を作りなさい?」
「 ↑ フィルターに何か入れれば、それだけ取れるとしようぜ☆?」
「 ↑ じゃあ 百歩譲って (空欄を選ぶ)
を選べたとしよう☆」
「 ↑ (空欄を選ぶ)
を選びたいときは どうすればいいんだぜ☆?」
「 フィルタリングに使われない文字を 空欄を選ぶ符牒にしたらいいんじゃないの? 罅
とか」
''
「 ↑ pgAdmin4 では ''
が空文字になる☆ 何も入っていないときはヌル☆」
''''
「 ↑ こんなファミマガ裏技大技林みたいなルール、誰が気づくんだぜ☆?」
「 ↑ じゃあ 十歩譲って (空欄を選ぶ)
は ポップアップメニューが出てきて、そこから選べたとしよう☆」
「 多分それで だいたいの場合はうまくいくぜ☆
ナンセンス をありにするか、 一貫性を通すか の話題だぜ☆」
「 ↑ ブラウザーには、アドレス・バーがあるだろ☆
フィルターが 13 のときは 13 と入れればいいな☆」
「 空欄を選択したいときは どう アドレス・バーに入れるか……☆」
「 それは あり ではあるが、習慣として 一般的かどうか……☆」
「 アドレス欄に記号を入れるなら、URLデコードしたいぜ☆」
「 ↑ これなら 空欄をフィルタリングするという意志を感じるか……☆」
「 フィルター欄を空にすれば フィルタリングしない☆
フィルター欄に ''
を入れれば 空欄を選択する☆
'
をフィルタリングしたいときは ''
にする、あれっ☆?」
「 '
をフィルタリングしたいときは、両端を '
で挟めだぜ☆」
「 エラーだが、くそめんどくさいんで、余分な '
は無視するか、 ''
扱いでいいんじゃないか……☆?」
「 '
をエスケープシーケンスと考えれば、エスケープが不成立なら、そのまま '
として表示するのが正しいよな☆」
「 シングル・クォーテーション ('
) を2倍に増やすプログラムなんか書けんの?」
「 例えば疑似コードで text.replace("'", "''")
みたいに書けばいいんだぜ☆」
「 まず 両端が '
かを確認する☆ そうであった場合のみ 両端の '
をトリムし、
残った文字列を text.replace("''", "'")
する☆」
「 それなら、ボッチの '
はそのまま表示するルールとも合うな☆」
「 ↑ 編集モードのとき、ヌルって どうやって入れるんだぜ☆?」
「 変更していないとか、空欄にしておいたとかではなく、
ここに欄は存在しない、という意味だぜ☆」
「 欄を破壊してしまったら、また何か中身を入れたくなったときに方法が無いだろ☆」
「 空欄にすると ヌル、 空文字列にしたければ ''
、 ''
にしたければ ''''
だぜ☆」
「 ↑ 空文字が入っていることを示すために ''
なんか表示して すっきりできたものかだぜ☆?」
「 ''
が入っているときだけ グレー表示できないのか☆?」
「 ↑ イベントハンドラを使えば やって できなくもないかもしれないが、頭がおかしな人だと思われて デザインの修正を求められるかもしれないな☆」
「 そこは いつも通り あんたは 頭がおかしく在ればいいのよ。
なんで 頭が正常な人のふりをするのよ」
「 頭がおかしく在ればいいとか 聞いたことのない日本語だぜ……☆」
「 だいたい データベースで 空文字とヌルは どういう違いがあるんだぜ☆?」
『NULL』『ブランク』の違いを解説 『スペース』『空文字』との違いも
「 空文字にしたいときに ''
なんか打ち込みたくないだろ☆
だいたい、オペレーターのおばちゃんに 空文字と ヌル の違いを区別させることに意味があるのか☆?」
「 2つのテーブルを マージ したときに 空文字ではなく、欄が存在しないという意味の ヌル になることがある☆」
「 ヌルさん問題が起こりそう……☆
わたしは死んだことになっている、みたいな☆」
「 これも ナンセンスをありにするか、一貫性を取るかの問題だよな☆
テーブルの欄をヌルにしたいことがあるのか☆ ナンセンスなのか☆? 積極的透明問題だぜ☆」
「 空欄の状態で Alt キーを押しながら Delete で ヌルにできるとか できないの?」
「 キータイピングの操作系から外れてやるわけかだぜ☆ やってみる価値はあるな……☆
Ctrl + Alt + Delete 2回で間違えて再起動してしまうかもしれないが……☆」
「 Excel と違って リレーショナル・データベースには ヌルが存在するからな……☆
しかし ほとんどのヌルは 自然なヌルで、
たまに 人の誤入力でヌルになってるのを 修正したいぐらいかな……☆」
「 そんなのは データベースを直接いじって 修正する 運用 にすればよくない?」
「 じゃあ Webページでは ヌルに変更することはできないが、元からヌルのものはヌル表示される ということにするかだぜ☆
あるいは 欄が無いとか☆」
「 つまり Webページでは 積極的透明 は入力できない、ということにするんだぜ☆
積極的透明は pgAdmin4 や SSMSデータベースを使って 直接いじるんだぜ☆」
「 それを 問題を解決していない という☆
けっこうあるんだぜ、空文字列ではなく ヌルが入っている 文字列のカラム☆」
「 ↑ じゃあ こうだぜ☆
ヌルに 文字を入れることはできる☆ でも ヌルに戻すことは できない☆
あるいは Alt + Delete でヌルにできる☆」
「 ↑ しかし ここに戻ってくる☆
GET送信にしろ POST送信にしろ、 ヌルと、ヌルさん の違いを どうやって付けるんだぜ☆?」
「 Excel をパクるなら null
と 'null
だが……☆
アドレス・バーに %27null
と入るのも 目が耐えられないしな……☆」
「 欄1つごとに 隠しチェックボックスを付けて、フィールド名の末尾の方にアンダースコアを付けて column_=null
とか別要素として送信すればいいのよ」
value = None
value = 'None'
「 ↑ Jinja2 などを使った HTML生成では、 None と 'None' は簡単に区別がつくからいいだろう☆」
「 問題となるのは GET 引数とか、 POST 引数だぜ☆ つまるところ……☆、」
name="Apple"
value="Banana"
「 そこで、値をエスケープするのではなく、名前をエスケープしようというのが夢美の案だぜ☆」
「 そんなことが成立するのか、シミュレーションしてみる必要があるぜ☆」
<input name="age" value="null">
<input name="age" value=null>
<input name="" value="">
「 ↑ いっそ 欄がなくなってしまうのも いいかもしれないが……☆」
<input name="age_" value="null">
「 ↑ もう少し緩やかなのは、名前の末尾に _
が付いていれば特別な意味を持たせるということだが、
一般に浸透している習慣からはかけ離れているぜ☆」
<input name="age_escaped" value="null">
<input name="age_esc" value="null">
<input name="age" value="">
<input name="age_esc" value="null">
「 ↑ これで、空文字と ヌルを見分けるということな☆
つまり 積極的透明のヌルは 空文字列より8バイト多い☆」
「 ヌルにされたくないところで ヌルにされてもいいのか☆?」
age.nullability == 'WillBeBlank' # null から空文字にしてよいが、空文字から null にすることはできない。
age.nullability == 'WillBeNull' # null から空文字にできない、空文字から null にすることはできる。
age.nullability == 'Mutable' # null から空文字にすることも、空文字から null にすることも、どちらもできる。
age.nullability == 'Immutable' # null から空文字にすることも、空文字から null にすることも、どちらもできない。
「 データベースで ブランクにするの めんどくさいんだぜ☆ ヌルにしてしまう☆
しかし ゼロを消せば 空文字列ではなく ヌル になるのだから、ヌルがデフォルトと考えたいのは分かるが……☆」
「 数の欄で テキストボックスが空なら 問答無用で ヌルと考えればいいんだぜ☆」
「 だとすると 文字列の欄だって テキストボックスを空にすれば ヌル と考えるのが自然だよな……☆
空文字の方が 異常なのか……☆?」
「 空文字の方が ヌルチェックが要らなくて プログラミングが楽になるなんていうのは、プログラマーの一方的な都合なんじゃないの?」
「 Null は視覚的には 欄が無い ということで統一しろだぜ☆」
「 ↑ じゃあ 今度は 数の欄に ブランク ができてしまわないかだぜ☆?」
「 数か テキストかで ブランクの表示が変わるのか……☆ 大変だな☆」
「 placeholder
属性を指定するだけで 勝手にやってくれない?」
「 だが ここまで作り込めば シングル・クォーテーションのエスケープとか 打鍵しなくてよくなるので
オペレーターの おばちゃん にも説明不要になるだろう……☆」
### Format
<input name="row_{{ Id }}_name" value="{{ Name }}">
### Example
<input name="row_4_name" value="Diana">
「 ↑ input 要素のキーも 無理なく作れるだろう……☆」
「 ↑ 10年1サイクルで 学生証番号を使い回しているなら、 主キー列は Year と Student の2つになるだろう☆」
### Format
<input name="row_{{ Year }}x{{ Student }}_name" value="{{ Name }}">
### Example
<input name="row_2019x9001_name" value="Charey">
「 ↑ x
でつなげておけば、あとで x
で分けることができるので数は簡単だぜ☆」
「 しかし x なんかでつなぐと 主キー が アルファベット だったとき混ざるぜ☆」
「 ↑ BASE32 でエンコードしたらどうだぜ☆?
区切り文字に 0 と 1 などが余っているので 使えるぜ☆ データの長さは 160% ぐらいになるけど☆」
### Source
豆腐
### Destination
5CYYN2EFSA======
### Source
豆
### Destination
5CYYMCQ=
### Source
腐
### Destination
5CCZACQ=
「 ↑ 多分、1文字は、最長8文字の BASE32 になるのかもしれない☆
だとしたら、 パディングの =
は、隙間を埋めてるだけだぜ☆」
「 この =
は 省いていい☆ ただし BASE32 どうしは くっつけてはいけないぜ☆ 離せ☆」
「 じゃあ 数 は そのまま、テキストやタイムスタンプは BASE32エンコード すれば ID に使えるわね」
### Source
2020-03-14 10:59:13'217
### Destination
GIYDEMBNGAZS2MJUEAYTAORVHE5DCMZHGIYTOCQ=
### Source
GIYDEMBNGAZS2MJUEAYTAORVHE5DCMZHGIYTOCQ=
### Destination
2020-03-14 10:59:13'217
「 ↑ BASE32 を使えば、エンティティID は作れるな☆」
「 HTML の inputタグの name に使える文字数はいくつだぜ☆?」
「 サーバー側で設定してある POST送信データの最大長がリミットだぜ☆ name ごとにリミットは仕様になってないと思うぜ、意味ないから☆」
### Source
0
### Destination
GA======
### Source
1
### Destination
GE======
「 ↑ じゃあ数も BASE32 に揃えた方が アルゴリズムがシンプルになるな☆」
GAxGIYDEMBNGAZS2MJUEAYTAORVHE5DCMZHGIYTOCQ
ga0giydembngazs2mjueaytaorvhe5dcmzhgiytocq
「 ↑ 全部小文字にして、セパレーターは BASE32 で使われていない 0 にしましょうよ」
<おわり>
Crieitは個人で開発中です。
興味がある方は是非記事の投稿をお願いします! どんな軽い内容でも嬉しいです。
なぜCrieitを作ろうと思ったか
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください!