スレッド ID (掲示板)
2ch のスレッド ID はタイムスタンプっぽいけど,同時投稿のときはどうするんだろう.
単純にずらせばいいだけなのかな.
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
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 には,
- データ定義言語(CREATE, DELETE, ALTER)
- データ操作言語(SELECT, INSERT, UPDATE, DELETE)
- データ制御言語(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ルーティング
.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"; }