weikum本に記載されている全定義の一覧リスト
現在5章を読む勉強会に参加していますが、 5章まで全部読めていません。最近読めていないところを見直すと、理解を曖昧にしていた用語の定義が前半の方に乗っていたので、この際全部調べて定義の掲載箇所を一覧できるものを作ってみました。
下表を参考におっ、こんな定義も乗ってたか!という感じで使ってもらえると嬉しいです。*1
DEFINITION | page |
---|---|
2.1 Partial Order | 46 |
2.2 Page Model Transaction | 46 |
2.3 Object Model Transaction | 51 |
3.1 Schedules and Histories | 66 |
3.2 Serial History | 67 |
3.3 Herbrand Semantics of Steps | 74 |
3.4 Herbrand Universe | 75 |
3.5 Schedule Semantics | 76 |
3.6 Final State Equivalence | 77 |
3.7 Reads-From Relation | 78 |
3.8 Final State Serializability | 82 |
3.9 View Equivalence | 83 |
3.10 View Serializability | 85 |
3.11 Monotone Classes of Histories | 92 |
3.12 Conflicts and Conflict Relations | 93 |
3.13 Conflict Equivalence | 93 |
3.14 Conflict Serializability | 94 |
3.15 Conflict Graph (Serialization Graph) | 96 |
3.16 Commutativity Based Equivalence | 99 |
3.17 Commutativity Based Reducibility | 100 |
3.18 Order Preservation | 102 |
3.19 Commit Order Preservation | 102 |
3.20 Closure Properties of Schedule Properties | 106 |
3.21 Commit Serializability | 107 |
3.22 Indivisible Units | 111 |
3.23 Dependence of Steps | 113 |
3.24 Relatively Serial Schedule | 113 |
3.25 Relative Serializability | 114 |
3.26 Push Forward and Pull Backward | 116 |
3.27 Relative Serialization Graph | 116 |
4.1 CSR Safety | 130 |
4.2 Two-Phase Locking (2PL) | 134 |
4.3 Conservative 2PL | 142 |
4.4 Strict 2PL | 143 |
4.5 Strong 2PL | 144 |
5.1 Version Function | 187 |
5.2 Multiversion Schedule | 188 |
5.3 Monoversion Schedule | 189 |
5.4 Reads-From Relation | 190 |
5.5 View Equivalence | 191 |
5.6 Multiversion View Serializability | 192 |
5.7 Version Order | 194 |
5.8 Multiversion Serialization Graph (MVSG) | 195 |
5.9 Multiversion Conflict | 197 |
5.10 Multiversion Reducibility | 198 |
5.11 Multiversion Conflict Serializability | 199 |
5.12 Multiversion Conflict Graph | 199 |
6.1 Object Model History | 218 |
6.2 Tree-Consistent Node Ordering | 219 |
6.3 Object Model Schedule | 219 |
6.4 Serial Object Model Schedule | 221 |
6.5 Isolated Subtree | 221 |
6.6 Layered History and Schedule | 222 |
6.7 Flat Object Schedule | 223 |
6.8 Commutative Operations | 224 |
6.9 Commutativity Based Reducibility | 226 |
6.10 Conflict Equivalence and Conflict Serializability | 227 |
6.11 Tree-Reducible History | 229 |
6.12 Level-to-Level Schedule | 234 |
6.13 Conflict Faithfulness | 238 |
6.14 State-Dependent Commutativity | 241 |
6.15 Return Value Commutativity | 242 |
8.1 IDM Transaction | 286 |
8.2 Transaction Equivalence | 287 |
8.3 Final State Serializability | 289 |
8.4 Conflict Serializability | 291 |
8.5 Conflict Graph | 291 |
8.6 Extended Conflict Graph and Serializability | 293 |
8.7 State Serializability | 296 |
8.8 Transaction Chopping | 302 |
8.9 Chopping Graph | 302 |
8.10 Correct Chopping | 304 |
10.1 Isolation Levels | 361 |
10.2 Multiversion Read Committed and Snapshot Isolation Levels | 362 |
10.3 Formal Definition of Snapshot Isolation | 363 |
10.4 Snapshot Isolation Serialization Graph | 363 |
11.1 Expansion of a Schedule | 384 |
11.2 Expanded Conflict Serializability | 385 |
11.3 Reducibility | 387 |
11.4 Prefix Reducibility | 389 |
11.5 Recoverability | 391 |
11.6 Avoiding Cascading Aborts | 392 |
11.7 Strictness | 393 |
11.8 Rigorousness | 394 |
11.9 Log Recoverability | 398 |
11.10 Inverse Operation | 408 |
11.11 Perfect Commutativity | 411 |
11.12 Perfect Closure | 413 |
11.13 Normal Commutativity Table | 414 |
11.14 Strictness | 415 |
11.15 Terminated Subtransactions | 416 |
11.16 Expanded Object Model Schedule | 417 |
11.17 Extended Tree Reducibility | 418 |
12.1 Extended History | 434 |
12.2 Stable Log | 435 |
12.3 Log Buffer | 435 |
12.4 Cached Database | 436 |
12.5 Stable Database | 437 |
12.6 Correct Crash Recovery | 437 |
12.7 Logging Rules: Redo Rule, Undo Rule, Garbage Collection Rule | 438 |
18.1 Global History | 677 |
18.2 Conflict Serializability | 678 |
18.3 Global History | 692 |
18.4 Direct and Indirect Conflict | 694 |
18.5 Global Conflict Graph | 695 |
18.6 Commit-Deferred Transaction | 699 |
18.7 Extended Commitment Ordering | 701 |
ちなみにですが同じものが複数回出てきているものがあるかもしれませんが、それぞれ文脈が違っています。 例えばConflict Serializabilityは3回でてきていますが、
- 3.14 Conflict Serializability
- 8.4 Conflict Serializability
- 18.2 Conflict Serializability
とそれぞれ内容が違っています。
ちなみにこの本の勉強会は明日もあります。オススメです。一緒に楽しくトランザクションを勉強しましょう。
- 作者: Gerhard Weikum,Gottfried Vossen
- 出版社/メーカー: Morgan Kaufmann
- 発売日: 2001/05/30
- メディア: Kindle版
- この商品を含むブログを見る
賀正新年2019年あけましておめでとうございます
まだセーフです。
2018年の振り返りでも書いてみます。
転職した
仕事内容は書かないけど、分野的には 地理情報 + (R)DB + 画像処理 + 性能測定/改善な感じ。 一部は殆ど経験がない要素もあるので勉強したことを少しづつこのブログなどに書いていこうと思います。
色々勉強会に出た
継続して出ているもの、スポットで出たもの等色々あるが、 スポットで出れそうなもので興味が会ったものがいくつか会ったが、
などは予定が合わなかったり、疲れていたりで行けなかった。
初めて発表した
20分なのでLTという割に長いが、そこまで大きな発表ではない。
色々な人に会った
名前出すと迷惑なので控えますが、主に勉強会を通して面白い人に沢山会った。 酒が飲めないなどが理由で宴会などは元々嫌いだったけど、 いろんな会社の人と話す機会だと思って、勉強会の打ち上げなどは積極的に参加した。
紅茶を飲み始めた
予約していた紅茶の福袋をゲットした pic.twitter.com/ztO66gcH1h
— yuYabu☕️ (@yuyabu2) January 6, 2019
私はハードコアなコーヒー党ですが、会社でコーヒーを入れるのは非常にめんどくさい。 というわけで色々模索した結果ティーバッグで紅茶を飲むのが良いのでは?という結論に至った。
Amazonとかコンビニで買ったやつはあまり美味しくないけど、ちゃんとした茶葉屋さんで買ったやつは美味しいと思う。
どうやら私はアッサムティーというやつが好きらしい。
初めて高度区分の試験に合格
まだまだ半人前の状態なので、これはなんで受かったのかよくわからない。
セキュリティはそこまで積極的に関わることにならなさそうだけど、今後もちょくちょく勉強して行きたいです。
15年ぶりに歯医者に行った
この件に関してはまだ治療中ですが、終わったらまとめて1つの投稿にしたいと思います。
2019年の意気込みとか
- ランニングで適当な結果を出したい
- ハーフマラソン、減量等
- 冬季はジムに通いたい
- 寒いとランニングはきつい(アップ、ダウン、呼吸等)
- 別に寒さに耐える苦行がやりたいわけではないので、運動習慣を途切れさせないためにも動きやすいジムなどにいくべきかなと思う。
- 英語の技術書を読めるようにする
- TOEICを毎月受ける
- 特にTOEIC用に勉強はしませんが、実力ベンチとして受けようかなーと思います。
- 発信する情報の質をあげる
- 色々話題になったサイトじゃないけど日本のweb上の技術情報群の質を下げてる自覚はあるので...
- テニスボールでリフティング1000回を達成する
- 100回は時々できるようになってきた
今年中にほしいもの
- Type-C 60WのPDができる4Kディスプレイ
- 100Mbps安定する回線
- iPad(バッテリーがそろそろ☠️)
という訳で今年もよろしくお願いいたします。
PCのセットアップに苦戦したがなんとかGRUBでWindows,Ubuntuのdual boot環境ができた(日記)
1つのSSD(500GB)上にwindows + ubuntuのdualboot環境を作った。
実施順は以下の通り
- 1.ssdをフォーマット(windowsのインストールディスクにあったメニューで実施)
- 2.Ubuntuをインストール(liveCDから)
- 3.ubuntuにwindowsのインストール先パーティションを作る
- ちなみにこれはインストールしたSSDからブートしたOSからはできなかったので態々LiveCDから行った
- 4.windowsをインストール
一応職場のPCのOSは自由だが、 Windowsを利用する可能性があるので完全消去はまずいかなと思いこのような構成にした。 linuxなんてVMでいいじゃんと思うかもしれませんが、 vmだとスペックが使いきれな買ったり、UIの描画に若干違和感がある等のデメリットがある。
デメリット
1つのディスクを複数パーティションに分けてOSを導入すると、バックアップ,リカバリなどがややこしいらしい。
起こったトラブルとか
GPTパーティション云々
https://www.cyberarchitect.net/blog/archives/1806
Windowsインストール時に 「このディスクにWindowsをインストールすることはできません。選択されたディスクはGPTのパーティションの形式ではありません。」 というエラーがよくでた。
https://freesoft.tvbok.com/tips/efi_installation/diskpart_gpt_mbr.html
インストールDVDをUEFIブートした場合のみ、Windowsは GPT形式でインストールされます。 DVDを旧BIOS互換ブートした場合、Windows は MBR形式でインストールされます。
上記ブログを参照した程度の知識しかなかったのでBIOS=MBR,UEFI=GPTくらいのゆるい認識なので、 レガシーモード(BIOS)でしかブートできないWindowsにGPT強制されても...という 感じだったが、ubuntuでパーティションをGPTで作り直したらWindows10がインストールできようになった。(なんだったんだあれ?)
GRUBメニューが表示されない
dual環境を整備した後、起動時にwindows or ubuntuを選択するgrubメニューが表示されないという トラブルがあった。ちなみにgrubメニューがなくてもBIOSのUEFIブートの設定画面でUbuntuとWindowsの優先順位を変更することができる。 だけど、毎度起動OSを切り替えるたびにBIOSのメニューをカチカチいじるのは面倒なのでなんとかしてgrubメニューを出したい。
これはwindowsインストール後にubuntuでgrubをアップデートすることで対処できた。
sudo update-grub
セットアップするディスク以外は取り外す
ubuntuではsda,sdbの呼び方windows上ではディスク0,1,2,3...BIOS上ではインターフェース名(SATA1,M2等)と 2次記憶装置の名前を統一感の無い名前で表記しあってるので非常に混乱する。 のでOSをインストールする時は インストール対象のHDD/SSDとインストーラーのイメージが入っている記憶装置(USBメモリ/CD)の接続のみにとどめて、 他のデバイス(back up用HDDとか)は全部切り離しておいたほうが無難でしょう。
さて次はバックアップをどうするかでしょう。
SQL上で2状態3記号チューリングマシンをエミュレーションする
SQLがチューリング完全かどうかは、意見が別れていると思いますが、
一般的にはwith recursive句が導入されたことによって再帰クエリが実行できるようになり、 チューリングマシンをSQLでシュミレートできるようになったので、 チューリング完全になったという風になっています。
で、今回実際にSQL上でチューリングマシンをエミュレートしてみようという挑戦になります。
こちらのエントリにチューリングマシンのテーブル定義がありますが、動かすためのチューリングマシンのデータ(状態、シンボル、遷移関数)が無かったので、現在発見されているもっとも単純な万能チューリングマシンであるWolfram's 2-state 3-symbol Turing machineを利用しました。
CREATE TABLE State( -- TM states sid INTEGER PRIMARY KEY, -- 0 is always the initial state isFinal BOOLEAN NOT NULL, sname TEXT UNIQUE NOT NULL -- just for show ); CREATE TABLE Symbol( -- TM symbols cid INTEGER PRIMARY KEY, -- 0 is always the blank symbol cname TEXT UNIQUE NOT NULL ); CREATE TABLE Transition( -- TM transition function sid INTEGER NOT NULL REFERENCES State, -- initial state symbol INTEGER NOT NULL REFERENCES Symbol, -- & symbol UNIQUE(sid, symbol), new_state INTEGER NOT NULL REFERENCES State, new_symbol INTEGER NOT NULL REFERENCES Symbol, move INTEGER NOT NULL CHECK(move=-1 OR move=1) ); CREATE TABLE Tape( -- TM initial tape contents tid INTEGER PRIMARY KEY, symbol INTEGER REFERENCES Symbol );
(2,3)TMは遷移関数は全部で6個
凡例:{state, color} -> {state, color, offset} {1, 2} -> {1, 1, -1}, {1, 1} -> {1, 2, -1}, {1, 0} -> {2, 1, 1 }, {2, 2} -> {1, 0, 1 }, {2, 1} -> {2, 2, 1 }, {2, 0} -> {1, 2, -1}
です。
データをいれます。適当に紙に起こして自分で考えながら書き起こしました。なお本データは(2,3)Turing machineのものですが、このブログ)にあるCTSでも可能かと思います。
INSERT INTO State VALUES(0,FALSE,1),(1,FALSE,2); INSERT INTO Symbol VALUES(0,'0'),(1,'1'),(2,'2') INSERT INTO Transition VALUES (0,2,0,1,-1), (0,1,0,2,-1), (0,0,1,1, 1), (1,2,0,0, 1), (1,1,2,2, 1), (1,0,0,2,-1) INSERT INTO Tape VALUES(0,0);
以下がチューリングマシンを動かすクエリです
WITH RECURSIVE running(rid, sid, tape, pos) AS ( -- first store initial tape contents SELECT 0, 0, ARRAY(SELECT symbol FROM Tape ORDER BY tid), 1 UNION -- then proceed to compute iterations SELECT p.rid+1, t.new_state, -- build updated tape as an array p.tape[1:p.pos-1] || -- prefix t.new_symbol || -- updated cell p.tape[p.pos+1:array_length(p.tape,1)], -- suffix -- move cursor position p.pos+t.move FROM running AS p -- get state details, to know whether to stop JOIN State AS s ON (p.sid=s.sid) -- get corresponding state transition JOIN Transition AS t ON (t.sid=p.sid AND -- coalesce defaults to blank t.symbol=COALESCE(p.tape[p.pos],0)) WHERE -- stop on a final state NOT p.rid = 100 ) -- just store the computed table INSERT INTO Run SELECT * FROM running;
(2,3)Turing machineは終了状態がないため、100回目の処理終了時でストップするように条件を書き換えています。
rid | sid | tape | pos -----+-----+-----------------------------+----- 0 | 0 | {0} | 1 1 | 1 | {1} | 2 2 | 0 | {1,2} | 1 3 | 0 | {2,2} | 0 4 | 1 | {1,2,2} | 1 5 | 1 | {2,2,2} | 2 6 | 0 | {2,0,2} | 3 7 | 0 | {2,0,1} | 2 8 | 1 | {2,1,1} | 3 9 | 1 | {2,1,2} | 4 10 | 0 | {2,1,2,2} | 3 11 | 0 | {2,1,1,2} | 2 12 | 0 | {2,2,1,2} | 1 ・・・・・・・・・・・・・・・・・・・・・・・・・・・ 90 | 0 | {2,1,1,1,2,2,2,1,2,2,1,2} | 1 91 | 0 | {1,1,1,1,2,2,2,1,2,2,1,2} | 0 92 | 1 | {1,1,1,1,1,2,2,2,1,2,2,1,2} | 1 93 | 1 | {2,1,1,1,1,2,2,2,1,2,2,1,2} | 2 94 | 1 | {2,2,1,1,1,2,2,2,1,2,2,1,2} | 3 95 | 1 | {2,2,2,1,1,2,2,2,1,2,2,1,2} | 4 96 | 1 | {2,2,2,2,1,2,2,2,1,2,2,1,2} | 5 97 | 1 | {2,2,2,2,2,2,2,2,1,2,2,1,2} | 6 98 | 0 | {2,2,2,2,2,0,2,2,1,2,2,1,2} | 7 99 | 0 | {2,2,2,2,2,0,1,2,1,2,2,1,2} | 6 100 | 1 | {2,2,2,2,2,1,1,2,1,2,2,1,2} | 7
これをビジュアライズしたい。とりあえず桁を揃えてごにょごにょした。
1,0,0,0,0,0,0,0,0,0,0,0,0 1,2,0,0,0,0,0,0,0,0,0,0,0 2,2,0,0,0,0,0,0,0,0,0,0,0 1,2,2,0,0,0,0,0,0,0,0,0,0 2,2,2,0,0,0,0,0,0,0,0,0,0 ・・・・・・・・・・・・・・・ 2,2,1,1,2,2,2,1,2,2,1,2,0 2,1,1,1,2,2,2,1,2,2,1,2,0 1,1,1,1,2,2,2,1,2,2,1,2,0 1,1,1,1,1,2,2,2,1,2,2,1,2 2,1,1,1,1,2,2,2,1,2,2,1,2 2,2,1,1,1,2,2,2,1,2,2,1,2 2,2,2,1,1,2,2,2,1,2,2,1,2 2,2,2,2,1,2,2,2,1,2,2,1,2 2,2,2,2,2,2,2,2,1,2,2,1,2 2,2,2,2,2,0,2,2,1,2,2,1,2 2,2,2,2,2,0,1,2,1,2,2,1,2 2,2,2,2,2,1,1,2,1,2,2,1,2
で結果できたのがこの画像。若干桁揃えのルールが違うため、同じ形状にならなかったが、wolframのサイトの画像とほぼ同一ものもが得られた。(チューリングマシンがエミュレートできた?)
うーんこれだけだとよくわからんということでチューリングマシンの原論文(Turing, A.M. (1936). "On Computable Numbers, with an Application to the Entscheidungsproblem")を読んだけどさらに意味わからなくなった。論文名でググったらどうも日本語の解説書籍があるらしいので買って読んでます。
チューリングを読む コンピュータサイエンスの金字塔を楽しもう
- 作者: チャールズ・ペゾルド,井田哲雄,鈴木大郎,奥居哲,浜名誠,山田俊行
- 出版社/メーカー: 日経BP社
- 発売日: 2012/06/11
- メディア: 単行本
- クリック: 34回
- この商品を含むブログ (9件) を見る
ポスタリゼーションとCannyのエッジ検出アルゴリズムの組み合わせでイラストから下絵の作成に挑戦
いらすとやの画像を借りて試してみました。
1.Gaussianオペレータを適用することによりエッジをぼかす
2.Sobelオペレータを適用し画像を微分する
3.微分画像を繊細化する
4.繊細化した結果の連結性を上げるために、2つの閾値を用いた2値化を行う
と複雑な手順が必要ですが、opencvなら関数一個で処理できます。
image = cv2.Canny(image,0,0,3)
Cannyアルゴリズムをそのままイラストに適応するとうまく行きませんでした。 これはイラストやのイラストは肌や副部分にフェルト生地のような質感を感じさせる着色がなされているためだと思います。 また、イラストやの画像は問題ありませんが、ネットで拾ってきた野良画像は結構ノイズが乗っていることが多いのでそちらの影響も受けてしまいます。
例えば私のアイコン画像でそのまま試すと以下のようになりました。
このフェルトのような質感をポスタリゼーションで均一化すればうまく行くのではないかと思い試してみました。
結果、posterlizationとdenoiseをCannyアルゴリズムの前に実施するとうまく行きました。
# denoiseのためのフォーマット変換 img_src = cv2.cvtColor(img_src,cv2.COLOR_GRAY2BGR) # denoise img_src = cv2.fastNlMeansDenoisingColored(img_src,None,10,10,7,21) # ルックアップテーブルの生成 look_up_table = np.ones((256, 1), dtype = 'uint8' ) * 0 for i in range(256): if i <= 0: look_up_table[i][0] = 0 elif i < 32: look_up_table[i][0] = 32 elif i < 64: look_up_table[i][0] = 64 elif i < 96: look_up_table[i][0] = 96 elif i < 128: look_up_table[i][0] = 128 elif i < 160: look_up_table[i][0] = 160 elif i < 192: look_up_table[i][0] = 192 elif i < 224: look_up_table[i][0] = 224 else: look_up_table[i][0] = 255 #postrization実行 img_src = cv2.LUT(img_src, look_up_table) #Canny img_dst = cv2.Canny(img_src,0,0,3) #bit反転 img_dst = cv2.bitwise_not(img_dst)
ですがこのプログラムは私のアイコン画像に対してはうまく動きませんでした。
なぜでしょうか。理由はポスタリゼーションで腕と背景の色が同一化されてしまったためです。 ポスタリゼーションの度合いを変えることで、こちらの画像もうまくエッジ検出できました。
ですがこのエッジ検出にはまだまだ課題があります。飛び出し坊やくんの
- 手と顔
- 手とズボン
の境界が検出できていません。この件に関しましてはまた後日描きたいと思います。
ちなみに今回のエントリのようなエッジ検出は画像の性質を見てうまく動くようなポスタリゼーションを実施する必要があります。
二次微分オペレータを用いたエッジ検出
隣接する画素の変化が激しい箇所をエッジとして検出するアルゴリズムです。 各セルの隣り合ったセルとの変化量を微分し、変化の大きい箇所を検出します。
飛び出し坊やくんのエッジ検出をして遊んでみます。
img_tmp = cv2.Sobel(img_src, cv2.CV_32F, 1, 0) img_dst = cv2.convertScaleAbs(img_tmp) img_dst = cv2.bitwise_not(img_dst);
※ネガポジ変換しています
エッジは期待したものが全て検出できましたが、 元画像と見比べると、明るい色→明るい色のエッジは薄い色に(例:ズボンと手の間)、明るい色→暗い色のエッジは濃い色に(例:髪の毛と顔の間)なってしまっています。
Canny法という性能が良いエッジ検出があるので次のエントリではそちらを紹介したいと思います。
平成30年度秋季の情報処理安全確保支援士に合格しました
IPAから試験合格者の皆さまへ、と書かれたメールを受け取りました。
情報処理安全確保支援士(以降セスペと表記)は落ちたと思っていたので試験結果は確認していませんでした。
(受かるとは言っていない)
— yuYabu☕️ (@yuyabu2) 2018年10月21日
試験直後のブログはこちら
急いで得点を確認したところ、点数は次のようになっていました。
日頃から色々勉強していた成果が出たのかな?と思います。
試験中は空席がとても気になっていましたが、
情報安全支援士の試験の出席率50%くらい。中には10人中1人しかいない席もあった。
— yuYabu☕️ (@yuyabu2) 2018年10月21日
今回の私のようにあまり試験の対策ができていなくても、たまたま受かるということも考えられますので、なるべく会場にきて最後まで粘って試験を受けた方がいいかもしれません。
※古い参考書に勉強不足に付いていいことが書いていたので追記予定
所感
とりあえず、前職の時は派遣とかSIとかを仕事にするなら資格はそこそこ重要なので、20代のうちに高度区分の資格でも取っておきたいなーと思っていたところ、合格したので嬉しいです。
ところで最近転職して資格のハロー効果が通用しないような世界に足を踏み入れてしまいましたが(涙) 今後もITの資格は半年に一度のお祭りだと思って受け続けようと思います。春はデータベーススペシャリスト目指して頑張ろうと思います。
あと、協会登録的な奴は多分やりません。3年で14万もかかる割に現職だと旨味がなさそうなので。
セキュリティに関して
もう受かってしまいましたが、セキュリティ関係で個人的にやり残したことは沢山あります。セキュリティ関係の積ん読。早めに読みましょう。
Hacking: 美しき策謀 第2版 ―脆弱性攻撃の理論と実際
- 作者: Jon Erickson,村上雅章
- 出版社/メーカー: オライリージャパン
- 発売日: 2011/10/22
- メディア: 単行本(ソフトカバー)
- 購入: 9人 クリック: 163回
- この商品を含むブログ (19件) を見る
- 作者: 結城浩
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2015/08/26
- メディア: 単行本
- この商品を含むブログ (19件) を見る
体系的に学ぶ 安全なWebアプリケーションの作り方 第2版 脆弱性が生まれる原理と対策の実践
- 作者: 徳丸浩
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2018/06/21
- メディア: 単行本
- この商品を含むブログを見る
- 作者: Igor Zhirkov,吉川邦夫
- 出版社/メーカー: 翔泳社
- 発売日: 2018/01/19
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (3件) を見る