16-08-31

本日のコード(1)

フィボナッチ数(列)を求めるコードをjsで書いてみた。

function Fib() {
  this.memo = [0, 1, 1];
  this.calcCount = 0;
  this.mCount = 0;
}

/* メモ化無し */
Fib.prototype.calc = function (n) {
  this.calcCount++;
  if (n === 0) return 0;
  if (n < 3) return 1;
  else return this.calc(n - 1) + this.calc(n - 2);
};

/* メモ化あり */
Fib.prototype.m = function (n) {
  this.mCount++;
  var fn = this.memo[n];
  if (typeof fn !== "number") {
    this.memo[n] = this.m(n - 2) + this._m(n - 1);
  }
  return this.memo[n];
};

var f = new Fib();

f.calc(30);    //832040
f.calcCount;    //1664079

f.m(30);    //832040
f.mCount;    //57

と書いてみた。他に、

/* 
m(30)なら単純にm(28)、m(29)までメモを書き上げる
もはや再帰ではないが実質的に行っていることは同じ
*/
Fib.prototype.m = function (n) {
  var i;
  this.memoCounter = 0;    /* 厳密には基準が異なるが.. */
  for (i = 1; i <= n; i++) {
    if (n > 2) {
      if (typeof this.memo[n] !== "number") {
        this.memoCounter++;
        
        /* メモに新しい値を登録した回数 */
        this.memo[i] = this.memo[i - 2] + this.memo[i - 1];
      }
    }
  }
  return this.memo[n];
};

f.m(30);    //832040
f.memoCounter;    //28

単にさかのぼる方向(m(30)→29→28.. or ..28→29→..)が異なるだけ。
わざわざ再帰で関数を深堀りするなら、単純に
小さい数字からフィボナッチ数を求めていってメモに残していけばいいんじゃないかと思ったことによる。
this.memoが配列であるにもかかわらず、
this.memo[i]に値を追加しているところは失敗だった。
this.memoをハッシュにするとキーを文字列にするあたりで
また面倒な(?)ことにはなる。

本日のコード(2)

Rubyの日付フォーマットを意味とセットで覚えようとした。
他言語の経験があると最も混乱する分野だと思っている(自論)。

t = Time.local(2016, 9, 1, 19, 25, 03)

# %Aがなぜ曜日なのか分からないが覚える
puts t.strftime "%A(%a)"    # Thursday(Thu)

# %Bが月。海外では曜日→月の順に
# 表記するので順番にA→B?
puts t.strftime "%B(%b)"    # September(Sep)

# CはCentury
# ただし小文字はおそらくc(lock)?
puts t.strftime "%C世紀少年"    #20世紀少年
puts t.strftime "%c"    # Thu Sep 1 19:25:03

# 一年て過ぎるの早いjjj(じぇじぇじぇ)
puts t.strftime "%j"    # 245(年始からの通算日)

# 根拠なしだがUnit?(日のまとまり=週?)
puts t.strftime "%U"    # 35週目(年始から)

# 日付は確定しているがXデー(根拠無し)
puts t.strftime "%x"    # 09/01/16
puts t.strftime "%X"    # 19:25:03

下半分はこじつけとなった。

Write-upを読んだ

IceCTF-chainedin-75

MongoDBはNoSQL(リレーショナルでない)データベースであり、
そのカテゴリに特有の脆弱性が存在する。

(以下趣旨がそれる)

参考URL:
MongoDB 3.0.6(Windows版)をインストールして起動するまでの手順 - Qiita
通称(?) - 薄い本 -
http://www.cuspy.org/diary/2012-04-17/the-little-mongodb-book-ja.pdf

初めて触るので上記の「薄い本」に従ってインストールした。
configファイルを自分で書いて、mongodコマンド実行時に
指定する必要がある(起動用バッチファイルを書いておく)。
シェルではJavaScriptが打ち込めるらしい。

要はMongoDBをPHPから使おうとする際、
(クエリ情報をSQL文ではなくパラメータを格納したオブジェクトを通じて扱うために)
演算子正規表現を意図的に注入できてしまう点が脆弱性につながっているらしい(通常のSQL文なら文法エラー等になり、
文の組み立てを制限することができる)。

認証失敗時と成功時のレスポンスのメッセージの違いから
パスワードであるフラグを割り出していく、という流れ。

NoSQLの類のものは初めてで、個人的に面白そうだったので
キチンと使えるようになりたい。