F#+Fableでsource-mapがうまく読み込まれない
問題
F#+Fableで書かれたアプリケーションをデバッグしたい。 しかし、source-mapがうまく読み込まれないか、マッピングはされるもののブラウザのデバッガにコンパイルされたJavascriptが元ソースであるF#の代わりに表示されてしまう。
解決策
webpack
の設定で、source-map-loader
を使用するように変更する1。指定していなければ、devtool
オプションもeval-source-map
なりsource-map
なり指定すること。
... devtool: "eval-source-map", module: { rules: [ + { + test: /\.js$/, + enforce: "pre", + use: ["source-map-loader"], + }, ... ], }, ...
-
Felizのテンプレートでは
source-map-loader
がしっかりdependecyに記述されている。だが、なぜか使われていない。↩
Firestoreのセキュリティルールのユニットテストでハマったこと
Firestoreのセキュリティルールのテストを書こうとしたらいろいろハマったので殴り書き。
環境
Typescript
+Jest
+@firebase/rules-unit-testing
テストフレームワークとしてFirebaseのドキュメントで使われているmocha
の代わりにJest
を使っているが、今回の話には全く関係ない。
ハマりポイント
@firebase/rules-unit-testing
のインポートにはワイルドカードを使う
正:
import * as firebase from "@firebase/rules-unit-testing";
誤:
import firebase from "@firebase/rules-unit-testing";
誤っているほうだと、app()
やloadFirestoreRules()
などテストに必要不可欠なメソッドが呼べない。
しかも型エラーが出ないのでたちが悪い。
アサーションにはawait
が必要
正:
it("some test", async () => { /* ... */ await firebase.assertSucceeds(/* ... */); });
誤:
it("some test", () => { /* ... */ firebase.assertSucceeds(/* ... */); });
誤っているほうだと常にテストがPASSしてしまう。
開長方形はR^2の開集合であることの証明
Mathpediaの位相空間論0 命題 0.7で述べられている「境界を含まない長方形」 がR2の開集合であることを証明する
証明
$U$を
と定める。
ここで、
を示す。
任意に$x=(x',y') \in U$と定める。ここで$r$を
とおく。
これを不等式で表すと、
となる。変形して、
また、$p = (x_p,y_p) \in B(x,r)$をとると定義から
となり、成分ごとに書くと
となる。
これを解くと、
$(1)$から、
よって
したがって、$p \in U$から$B(x,r) \subset U$
開球体を用いた連続性の言い換えを確認する
Mathpedia 位相空間論0の命題 0.5 (開球体を用いた連続性の言い換え) を確認する。
使う定義や命題の確認
<1> 部分集合の定義
$\forall a\in A \Big[ a\in B \Big]$であるとき$A \subset B$と書き、$A$は$B$の部分集合という。
<2> 開球体の定義(定義 0.4)
$x \in \R^n$と$r>0$に対し$\R^n$の部分集合$B(x,r)$を
と定める。$B(x,r)$を$x$を中心とした半径$r$の開球体と呼ぶ。
<3> 連続の定義(定義 0.4中で述べられているもの)
写像$f: \R^n \to \R^m $が点$a \in \R^n$において連続であるとは
を満たすことである。 ここで任意の点$a \in \R^n$においてこれを満たすとき、写像$f: \R^n \to \R^m $は連続であると呼ぶ
<4> 開球体を用いた連続性の言い換え(命題 0.5)
写像$f: \R^n \to \R^m $が点$a \in \R^n$において連続であるとは
を満たすことである。
実際に確認する
- <3>$ \implies $<4>
$ f(b) \in f(B_{\R^n}(a, \delta)) $をとる。 $B_{\R^n}(a, \delta)$の定義から$b$は
を満たす。また、<3>から
である。
したがって$B_{\R^m}(f(a), \varepsilon)$の定義から$f(b) \in B_{\R^m}(f(a), \varepsilon)$が導かれ、
となる。
- <4>$ \implies $<3>
$ f(b) \in f(B_{\R^n}(a, \delta)) $をとる。 <4>から、$f(b) \in B_{\R^m}(f(a), \varepsilon)$である。
$B_{\R^m}(f(a), \varepsilon)$の定義から、
Isabelle prog-proveのExercise 2.4の解答
ハマったのでメモ
問題
Exercise 2.4
Define a recursive function snoc :: 'a list => 'a => 'a list
that appends an element to the end of a list. With the help of snoc
define a recursive function reverse :: 'a list => 'a list
that reverses a list. Prove reverse (reverse xs) = xs
reverse
関数をappend
無しで定義しよう、という問題。
snocの定義
ハマりどころその1。snoc xs a
をx1 # x2 # ... # xn # [a]
に展開していくイメージで書く。
fun snoc :: "'a list => 'a => 'a list" where "snoc [] a = [a]" | "snoc (x # xs) a = x # (snoc xs a)"
reverseの定義
こちらは簡単。
fun reverse :: "'a list => 'a list" where "reverse [] = []" | "reverse (x # xs) = snoc (reverse xs) x"
reverse (reverse xs) = xs
の証明
2つ目のハマりどころにして一番難しいところ。素直にinduction
からのauto
のコンボを使ってみる:
theorem rev_rev: "reverse (reverse xs) = xs" apply(induction xs) apply(auto) done
これは数学的帰納法の2つ目の証明が失敗してしまう。 という訳でここに補題を付け加えるわけだが、それを見つけるのが難しい。
以下のような補題を上の証明の前に入れる:
lemma snoc_rev_sim [simp]: "reverse (snoc xs x) = x # (reverse xs)" apply(induction xs) apply(auto) done
この命題はCons
とsnoc
の対称性を表している。
Cons
を#
、snoc
を*
と書いてみると分かりやすい:
reverse (x # xs) = (reverse xs) * x (reverseの定義) reverse (xs * x) = x # (reverse xs) (さっき証明した補題)
こうしてみるとCons
とsnoc
は項の順番を置き換えることで交換できることがわかる。
SQLインジェクション: Natas 14 Writeup
リンク: OverTheWire Natas14
TL;DR
- 簡単なSQLインジェクションの問題
問題の確認
OverTheWireのWeb系問題集であるNatasの第14問。phpで記述されていて、下のView Sourceというリンクからphpのソースコードを見ることができる。
IDとパスワードのテキストボックスが並ぶ典型的なログイン画面。入力後にボタンを押すとログイン可否が表示される。
Exploit
ソースコードからこの問題を解くにあたって大事なところを抜粋する:
$query = "SELECT * from users where username=\"".$_REQUEST["username"]."\" and password=\"".$_REQUEST["password"]."\"";
このコードから、ユーザーの認証に使うクエリを文字列の結合で生成していることがわかる。よって、SQLインジェクションを使うことができる。
例えば、IDに以下の通り書けばよい(パスワードは適当でOK)。
" OR 1=1;#
このように書くと、生成されるクエリは以下のようになる。
SELECT * from users where username="" OR 1=1;# and password="pass";
1=1
は常に成立するため、このクエリはすべてのアカウントにひっかかる。1つでもクエリからアカウントが出た場合ログインできる仕様のため、これでめでたくログインしflagを獲得できる。