setcookie($name, $value); はそのスクリプト内では反映されない.

$_COOKIE[] = ''; の場合

$_COOKIE に値は保存されるが,ブラウザのクッキーに値は保存されない.

<?php

print_r($_COOKIE);
$_COOKIE['name'] = 'taro';
print_r($_COOKIE);

結果:1回目

Array
(
)
Array
(
    [name] => taro
)

結果:2回目(再読み込み)

Array
(
        # <- 値が保持されてない
)
Array
(
    [name] => taro
)

setcookie(); の場合

setcookie() を実行しても,そのスクリプト内では $_COOKIE[] に値は代入されない.

<?php

print_r($_COOKIE);
setcookie('name', 'taro');
print_r($_COOKIE);

結果:1回目

Array
(

)
Array
(
         # <- そのスクリプト内で $_COOKIE に値は保存されない
)

結果:2回目(再読み込み)

Array
(
    [name] => taro    # <- このときには保存されている。
)
Array
(
    [name] => taro
)


マニュアルにも書いてあった.
http://php.net/manual/ja/function.setcookie.php

Terminal.app 上の emacs に色付け(ruby-mode)

色とかインデントとかが何故か上手くいってなかった。
ruby-mode.el が読み込まれていないようだったので,~/site-lisp/ に ruby-mode.el を配置。
~/.emacs.el に以下を書き込んだ。

(load "~/site-lisp/ruby-mode.el")
(autoload 'ruby-mode "ruby" "Ruby mode" nil t)
(setq auto-mode-alist (cons '("\\.rb$" . ruby-mode) auto-mode-alist))

Ruby ちょこっとメモ

if true then
  def hello_true
    print "HELLO!\n"
  end
end

if false then
  def hello_false
    print "HELLO!\n"
  end
end

hello_true  # HELLO!
hello_false # エラー
def hello_true
    print "HELLO!\n"
end if true

def hello_false
    print "HELLO!\n"
end if false

hello_true  # HELLO!
hello_false # エラー

OS自作(1日目)〜30日で作っちゃうアレ〜

はじめに

開発環境は Mac です。
仮想環境は QEMU がなぜか動いてくれないので,VirtualBoxでやります。
VirtualBox日本オラクル | Integrated Cloud Applications and Platform Servicesからダウンロード&インストール。

hello world!

起動すると hello world が表示されるだけのを作ってみる。


まずはディスクイメージの作成から。
はじめに 0 埋めのディスクイメージ(FDサイズ)を作成する。

dd bs=1k if=/dev/zero of=./test.img count=1440

bs(ブロックサイズ) * count = size って計算(なはず).
詳しくはhttp://www.linux.or.jp/JM/html/GNU_fileutils/man1/dd.1.html


このファイルにバイナリエディタを用いて,本の 14 〜 16 ページのようにゴリゴリと書いていきます。
バイナリエディタは [:title] を使用。

バイナリエディタで編集するときに,

  • 入力した文字がカーソル位置のデータを「上書き」する
  • 入力した文字がその位置に「挿入」され,カーソル位置以降のデータが後ろにずれていく

かどうかに気をつけないと,入力ミスに気づかなかったり,ディスクイメージがずれたりと困るので注意。


次に実際にVirtualBox から起動する。

(メイン画面)
新規

(新規仮想マシンの作成)
[ようこそ新規仮想マシン作成ウィザードへ!]
次へ

[仮想マシン名とOSタイプ]
名前は好きなものを入力(今回は yurios で!)。
タイプはどれでもいい(が,Other , Other/Unknown が無難かと思う)。
次へ

[メモリ]
初期の 64MB でいいかと。後で変更できるので。
次へ

[仮想ハードディスク]
常に FD から起動するので,起動ディスク(プライマリーマスター)のチェックはずす
次へ(アラート出る「続ける」)

[概要]
完了


これで仮想マシンの作成は完了。


次に FD 起動のための設定をする。
メイン画面

さきほど作った仮想マシンを選択

メニュー「設定」

ストレージ

フロッピー

「フロッピードライブのマウント」にチェック。

「イメージファイル」を選択。先ほど作ったディスクイメージを選択。

OK


これで準備万端。
メイン画面より仮想マシンを起動。
(もしかしたら初回起動ウィザードなるものがでてくるかもしれませんが,多分無視して大丈夫)

起動後,「hello world」が表示されればOK!
終了するときは「×ボタン→仮想マシンの電源オフ」で大丈夫(だと思う)。

やったこと

FD サイズ(1474560バイト)のファイルを作成

そのファイルにバイナリエディタでゴリゴリと書き込む

そのファイルを FDイメージと見立てて,VirtualBox で起動。

hello world

SQLいろいろ

簡単なO/Rマッパーを作りたいので,SQL 文について自分なりにまとめてみる。

SQL には,

  1. データ定義言語(CREATE, DELETE, ALTER)
  2. データ操作言語(SELECT, INSERT, UPDATE, DELETE)
  3. データ制御言語(GRANT, REVOKE, etc...)

と3つの種類に分けられるらしい。

データ定義,データ操作のみ実装すればとりあえずよさそう。

文法

いろいろ省いてます。

CREATE DATABASE
CREATE DATABASE db_name
DROP DATABASE
DROP DATABASE db_name
CREATE TABLE
CREATE TABLE table_name (
  column_name data_type
    [ ( NULL | NOT NULL ) ]
    [ UNIQUE ]
    [ DEFAULT default_value ]
    [ AUTO_INCREMENT ]
    [ [PRIMARY] KEY ]
  {, ... }
);

data_type:
  INTEGER[(length)] [UNSIGNED] [ZEROFILL]
| VARCHAR[(length)]
| TEXT
| TIMESTAMP
| BOOL
DROP TABLE
DROP TABLE table_name {, table_name }
ALTER

SELECT
SELECT column_name {, column_name } FROM table_name {, table_name }
[ WHERE where_condition ]
[ LIMIT limit [, OFFSET offset] ]
[ GROUP BY column_name {, column_name } ]
[ ORDER BY column_name [ ASC | DESC ] {, column_name [ ASC | DESC ] } ]

GROUP BY ワカンネ。

INSERT
INSERT INTO table_name
[ (column_name { ,column_name } ) ]
VALUES ( VALUE_A1 {, VALUE_A2 } ) {, ( VALUE_B1 {, VALUE_B2 } ) } ;
UPDATE
UPDATE table_name SET column_name = value {, ... } [ WHERE condition ];
DELETE
DELETE FROM table_name { WHERE condition }

URLルーティング

PHP でつくってみた。
フレームワーク風です。

.htaccess

アクセスをすべて index.php に。

Options +FollowSymLinks
IndexIgnore */*
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php

common.php

共通部分。いろんな関数を呼びやすくしただけ。

<?php

function redirect($url)
{
  header('Location: '. $url);
  exit;
}

function r($url)
{
  return redirect($url);
}

function h($str)
{
  return htmlspecialchars($str, ENT_QUOTES);
}

function p($str)
{
  print($str);
}

function ph($srt)
{
  p(h($str));
}

function pr($ary)
{
  print_r($ary);
}

function hr()
{
  echo "<hr>";
}

index.php

設定部。

<?php
require "lilium.php";

dispatch("/", "index");
dispatch("/index", "index");
function index()
{
  echo "Hello!";
}

dispatch("/search/:keyword", "search");
function search($args)
{
  echo "SEARCH(". $args['keyword'] .")";
}

run();

lilium.php(本体)

本体。多分バグだらけ。
やらなきゃならないこと多し。

<?php

require 'common.php';

function maps()
{
  static $maps = array();
  if (func_num_args() === 3) {
    list ($uri, $function, $request_method) = func_get_args();
    $pattern = explode('/', trim($uri, "/"));
    $maps[] = array('pattern' => $pattern,
		    'function' => $function,
		    'request_method' => $request_method);
  }
  return $maps;
}

function get_request_pattern()
{
  $req = explode('/', trim($_SERVER['REQUEST_URI'], "/"));
  $scr = explode('/', trim($_SERVER['SCRIPT_NAME'], "/"));
  for ($i = 0; $i < count($req); $i++) {
    if ($req[$i] === $scr[$i]) {
      unset($req[$i]);
    }
  }
  if (count($req) === 0) {
    $req[0] = "";
  }
  return array_values($req);
}

function search_map($pattern)
{
  $maps = maps();
  foreach ($maps as $map) {
    if (match_map($map, $pattern)) {
      return $map;
    }
  }
  return null;
}

function match_map($map, $pattern)
{
  for ($i = 0; $i < count($map); $i++) {
    if (substr($map["pattern"][$i], 0, 1) === ":") {
      continue;
    }
    if ($map["pattern"][$i] !== $pattern[$i]) {
      return false;
    }
  }
  return true;
}

function get_args($map, $pattern)
{
  $args = array();
  for ($i = 0; $i < count($pattern); $i++) {
    if (substr($map["pattern"][$i], 0, 1) === ":") {
      $key = substr($map["pattern"][$i], 1);
      $args[$key] = $pattern[$i];
      #$args["args"][$key] = $pattern[$i];
    } else {
      #$args["args"][$map[$i]] = $pattern[$i];
    }
  }
  return $args;
}

function dispatch($uri, $function, $request_method = 'GET')
{
  maps($uri, $function, $request_method);
}

function run()
{
  $pattern = get_request_pattern();
  $map = search_map($pattern);
  $args = get_args($map, $pattern);
  execute($map["function"], $args);
}

function execute($function, $args)
{
  if (function_exists($function)) {
    $function($args);
  } else {
    not_found();
  }
}

function not_found()
{
  echo "404";
}