URLを自動でリンクにする(smartyプラグイン)

11月 27th, 2007 admin

掲示板などでURLを書き込むと自動でリンクになるような仕組みです。
[PHP-users 20308]自動リンク」にあったものをそのまま使っております。

smartyのプライグイン形式なのでSmarty/pluginsの中にmodifier.url2link.phpって名前で保存すれば
{$body|url2link}
ってな感じで使えます。

function smarty_modifier_url2link($string)
{
    return ereg_replace("(https?|ftp)(://[[:alnum:]\+\$\;\?\.%,!#~*/:@&=_-]+)", "<a href=\"\\1\\2\" target=\"_blank\">\\1\\2</a>" , $string);
}

単純挿入ソート(2分挿入ソート)

11月 27th, 2007 admin

今日は単純挿入ソートです。
前から順にひとつずつ値をチェックしていき、自分より前方に自分より大きな値があればそこに値を挿入するというもの。
直感的にも明らかに遅い感じだし、実際に計算量オーダはO(N^2)なのですが、ほとんど整列が終わっているデータに対しては大変効率がよいということです。

#単純挿入ソート
require 'pp'
before = Time.now
t = Time.now
srand(t.sec ^ t.usec ^ Process.pid)

#ソートする要素数
Num = 10000

def simpleSort(sort)
	(Num-1).times{|sorted|
		#ソート済みでない値を取り出す
		insert = sort[sorted+1];
		#挿入する場所を見つける
		for i in 0..sorted
			if sort[i] > insert then
				break
			end
		end

		if i == sorted then
			next
		end

		#ソート済み領域直後の値を挿入する
		while i <= (sorted + 1)
			temp = sort[i]
			sort[i] = insert
			insert = temp
			i+=1
		end
		}

	return sort
end

#ランダムな値の入った配列を作成
sort = Array.new
Num.times{
	sort.push rand(Num)
}

#ソート前の出力
pp sort

sort = simpleSort(sort);

#ソート後の出力
pp sort

#処理時間
p Time.now - before

Num=10000で実行してみると僕の環境では70秒程度かかる。バブルソートよりは早いということですかね。

2分挿入ソート

単純挿入ソートの改良版で2分挿入ソートというのがあるそうです。上記の「挿入する場所を見つける」という部分をバイナリサーチというのを使って改良したものだということです。バイナリサーチについては第2章で取り扱うということなのでとりあえず省略します。

※このシリーズは私がRubyでアルゴリズムとデータ構造を基礎から学ぶ記録です。全体の目次はこちらへ。

debian etch subversionインストールメモ

11月 14th, 2007 admin

はじめに

subversion(サブバージョン)とはファイルのバージョン管理システムです。
何度も更新があるファイルを作るとき
index.html.2007111401
index.html.2007111402
みたいなファイルを作って管理していませんか?
バージョン管理システムを使うとそれとさよならできます。

また、Web制作の際にサーバ上のファイルを最新に保つために
毎回毎回すべてのファイルをダウンロードしてから作業していませんか?
これもやっぱりバージョン管理システムが解決してくれます

今回はlinux上で動くsubversionをインストールしたのですが、windows上で動くTortoiseSVNというのもある。ファイルを更新するすべての人に使ってもらいたいなと思います。

参考サイト

Subversion によるバージョン管理
http://subversion.bluegate.org/doc/book.html

Subversionでサイト管理(1/3) – Linux Home Server Memo – 自宅サーバ
http://asshole.dip.jp/subversion.php

Debian 設定メモ – Subversion
http://wiki.fdiary.net/debianmemo/?Subversion

インストールメモ

subversionをインストール

aptitude update
aptitude install subversion

svn用のユーザを作りパスワードを設定する

# useradd svn
# passwd svn

/etc/inetd.conf
svn stream tcp nowait svn /usr/sbin/tcpd /usr/bin/svnserve -i

# mkdir /var/svn
# svnadmin create /var/svn

/var/svn/conf/svnserve.confの編集

[general]
anon-access = none
auth-access = write
password-db = passwd #ユーザのリストを書くところ

/var/svn/conf/passwdの編集

[users]
svn = さっき設定したパスワード

svnフォルダのパーミッションを変更

# chown -R svn:svn /var/svn
# chmod -R og+w /var/svn

initdを再起動

/etc/init.d/openbsd-inetd restart

dokuwikiでsessionエラー

11月 13th, 2007 admin

dokuwikiでエラーがでるようになった。

Fatal error: session_start(): Failed to initialize storage module: user (path: /var/lib/php/session) in /var/www/www.notakt.com/www/wiki/inc/init.php on line 89

セッションが書き込めないらしい。

http://wiki.splitbrain.org/wiki:ja:faq#session_start_%E3%81%AE%E3%82%A8%E3%83%A9%E3%83%BC

php.iniのsession.save_pathを正しく書き換えたら直りました。

2007/12/10 追記
どこのURLだったか忘れてしまったのですが、session_nameはPHPSESSIDにしておけって書いてあったので
/inc/init.phpの86行目あたりを

  // init session
  if (!headers_sent() && !defined('NOSESSION')){
    session_name("PHPSESSID");
    session_start();
  }

としたら完全に直った模様です。

PHPでアドレスが変わったことを検索エンジンに知らせる

11月 11th, 2007 admin

あるサイトをmod_rewriteを使ってパーマリンク化している。
せっかく検索エンジンに数百ページインデックスしてもらっているのにすべてが無駄になるのはもったいないし
少なからずアクセスしてくれている人にも申し訳ない。
そこで旧アドレスにアクセスしてきた人には301を返してリダイレクトするようにした。

<?php
  $url = $_SERVER['REQUEST_URI'];
  if(preg_match("/.*pref_id=([0-9]+)/",$url,$regs)){
    header( "HTTP/1.1 301 Moved Permanently" );
    header( "Location: http://".$_SERVER['HTTP_HOST']."/city/summary/".$regs[1] );
    exit;
  }
?>

.htaccessのほうでやればいいんだけど、なぜか出来なかったのでPHPでやったという例

追記:
どうもphpがCGIモードだったようで正しく301リダイレクトされていなかった。はてなで聞いたらエスパー的な人が教えてくれた

<?php
header('Status: 301 Moved Permanently');
header('Location: http://example.com');
exit;
?>