読みにくいサイト名
無理矢理全部小文字で入力してみたら、ひどく読みにくいサイト名になってしまいました。しかし、これはこれで特色があるような気もするので、しばらくはこの状態で様子を見てみようと思います。
時間が取れれば全体的なデザインも何とかしたいところなのですが、当面は無理そうなのでのんびりまったり続けて行こうと思います。
無理矢理全部小文字で入力してみたら、ひどく読みにくいサイト名になってしまいました。しかし、これはこれで特色があるような気もするので、しばらくはこの状態で様子を見てみようと思います。
時間が取れれば全体的なデザインも何とかしたいところなのですが、当面は無理そうなのでのんびりまったり続けて行こうと思います。
今更ながらにインストールしてみました。
もう話題になってから2年近くが経過しているソフトですが・・・
インストール時にVSTiを選択して選択したのにKore Player.dllが見つからなくて苦戦しました。結局どこにインストールされていたかというと、何とSSW8.0のVSTiフォルダ。SONARで使おうとしたのですが、最初にインストールしたSSWの方のVSTiフォルダが優先されてしまうのでしょうか。
とりあえず無事にDLLも発見できたので起動してみました。音は、思っていたよりもシンプルで使いやすそうな感じです。後からサウンドパックを追加できるようなので、こういったものを1つ持っていればどんな曲調にも対応できそうす。
久しぶりにMySQL鯖を構築したら、くだらないことで躓いたのでメモ。
MySQL鯖へ、別端末からTCP接続を行う場合には接続するユーザーに対して権限を与える事が必要。さすがにrootを外部に公開するのはみっともないので、適当にユーザーを作ってテーブル操作を行える権限を与えることにする。
まずは、DBアクセスユーザーの作成。
grant all privileges on dbname.* to username@hostname identified by 'password';
次に、作成したユーザーに権限を与える。
grant select,insert,delete,update,drop on dbname.* to username@hostname identified by 'password';
hostnameの部分はドメインでもいいし、端末のIPでもOK。
異なる複数の端末からアクセスが必要な場合はドメイン管理したほうが楽そうです。
我が家のサーバーにSubversionを入れようと思い、適当に検索してみたところVisualSVNなるアプリが存在していることを知りました。これまでノーマルのSubversionを入れてちまちま構築してきたのですが、こいつの便利さは半端ない!
ただ、ポチっとやってインストールするだけでWindowsマシンにSVNサーバーが構築できます。リポジトリ作成(branches、tags、trunkフォルダ込み)も一瞬で出来るし、以前はconfファイルをちまちま書いて管理していたユーザーマネジメントも、GUIですーいすい。あっという間に導入が完了しました。ついでに、TortoiseSVNも導入して準備万端。
少々躓いたのが、作成したリポジトリにソースを初回登録する場合の操作。
入れたいソースの入っているフォルダを開いて、そこで右クリックしてTortoiseSVNのメニューから「インポート」を選びます。そこでリポジトリのURLを記入するのですが、どうにもここで「そんなリポジトリは無いよ!」というエラーが発生する。
はて・・・と思ってSVNサーバーの設定を見てみたら、何と通信プロトコルがHTTPSではありませんか。ということで、リポジトリURLにhttps://server/svn/project/branchesというような感じでパスを打ち込んで目出度く完了しました。
アクセス統計を取ろうと思い立ったは良いが、ユーザーのUser-Agent文字列が実にフリーダムな書式で書かれていてブラウザとOSを取得するのにエラい苦労しました。
せっかくなので、その苦労の結果をPHPコードとして残して置こうと思います。
言語: PHP5
返却値: 配列 ([0]:ブラウザ名 [1]:ブラウザバージョン [2]:OS [3]:OSバージョン)
※まだまだ調整中なのでそのまま使うとバージョン情報が取れない事が多いかと。
function useragent_analyser() {
$ua_string = $_SERVER["HTTP_USER_AGENT"];
$bws = ""; // [0]
$bwsver = ""; // [1]
$os = ""; // [2]
$osver = ""; // [3]
// ブラウザ判定
if (preg_match("/Opera[\s\/]\d\.\d{1,2}/", $ua_string, $matches)) {
$bws = "Opera";
$bwsver = substr($matches[0], strlen($bws) + 1, 3);
} else if (preg_match("/MSIE[\s\/]\d\.\d{1,2}/", $ua_string, $matches)) {
$bws = "MSIE";
$bwsver = substr($matches[0], strlen($bws) + 1, 3);
} else if (preg_match("/Firefox[\s\/]\d\.\d/", $ua_string, $matches)) {
$bws = "Firefox";
$bwsver = substr($matches[0], strlen($bws) + 1, 3);
} else if (preg_match("/Chrome[\s\/]\d\.\d/", $ua_string, $matches)) {
$bws = "Chrome";
$bwsver = substr($matches[0], strlen($bws) + 1, 3);
} else if (preg_match("/Safari/", $ua_string, $matches)) {
$bws = "Safari";
if (preg_match("/Version[\s\/]\d\.\d/", $ua_string, $saf_matches)) {
$bwsver = substr($saf_matches[0], strlen("Version") + 1, 1);
} else if (preg_match("/AppleWebKit[\s\/]4\d{2}/", $ua_string, $saf_matches)) {
$bwsver = 2;
}
} else if (preg_match("/Sleipnir[\s\/]\d\.\d/", $ua_string, $matches)) {
$bws = "Sleipnir";
$bwsver = substr($matches[0], strlen($bws) + 1, 3);
} else if (preg_match("/Konqueror[\s\/]\d\.\d/", $ua_string, $matches)) {
$bws = "Konqueror";
$bwsver = substr($matches[0], strlen($bws) + 1, 3);
} else if (stristr($ua_string, "Netscape") !== false) {
$bws = "Netscape";
if (preg_match("/Netscape\d/", $ua_string, $matches)) {
$bwsver = substr($matches[0], strlen($bws), 1);
} else if (preg_match("/Netscape[\s\/]\d\.\d{1,2}/", $ua_string, $matches)) {
$bwsver = substr($matches[0], strlen($bws) + 1, 1);
}
} else if (preg_match("/DoCoMo[\s\/]\d\.\d/", $ua_string, $matches)) {
$bws = "DoCoMo";
$bwsver = substr($matches[0], strlen($bws) + 1, 3);
} else if (preg_match("/KDDI/", $ua_string, $matches)) {
$bws = "KDDI";
} else if (preg_match("/J-PHONE[\s\/]\d\.\d//", $ua_string, $matches)) {
$bws = "J-PHONE";
$bwsver = substr($matches[0], strlen($bws) + 1, 3);
} else if (preg_match("/SoftBank[\s\/]\d\.\d//", $ua_string, $matches)) {
$bws = "SoftBank";
$bwsver = substr($matches[0], strlen($bws) + 1, 3);
} else if (preg_match("/Mozilla[\s\/]\d\.\d/", $ua_string, $matches)) {
$bws = "Mozilla";
$bwsver = substr($matches[0], strlen($bws) + 1, 3);
}
// OS判定
if (stristr($ua_string, "Linux") !== false) {
$os = "Linux";
} else if (stristr($ua_string, "BSD") !== false) {
if (stristr($ua_string, "FreeBSD") !== false) {
$os = "FreeBSD";
} else {
$os = "BSD";
}
} else if (stristr($ua_string, "SunOS") !== false) {
$os = "SunOS";
if (preg_match("/SunOS[\s\/]\d\.\d/", $ua_string, $matches)) {
$osver = substr($matches[0], strlen($os) + 1, 3);
}
$os = "Solaris";
} else if (preg_match("/Win[dN9][oT58]/", $ua_string, $matches)) {
$os = "Windows";
if (stristr($ua_string, "Windows NT 5.0") !== false) {
$osver = "2000";
} else if (stristr($ua_string, "Windows 2000") !== false) {
$osver = "2000";
} else if (stristr($ua_string, "Windows NT 5.1") !== false) {
$osver = "XP";
} else if (stristr($ua_string, "Windows NT 5.2") !== false) {
$osver = "2003";
} else if (stristr($ua_string, "Windows XP") !== false) {
$osver = "XP";
} else if (stristr($ua_string, "Windows NT 6.0") !== false) {
$osver = "Vista";
} else if (stristr($ua_string, "Windows NT 6.1") !== false) {
$osver = "7";
} else if (stristr($ua_string, "Windows 98") !== false) {
$osver = "98";
} else if (stristr($ua_string, "Windows 95") !== false) {
$osver = "95";
} else if (stristr($ua_string, "Windows Me") !== false) {
$osver = "Me";
} else if (stristr($ua_string, "Windows NT") !== false) {
$osver = "NT";
} else if (stristr($ua_string, "Win95") !== false) {
$osver = "95";
} else if (stristr($ua_string, "Win98") !== false) {
$osver = "98";
} else if (stristr($ua_string, "WinNT") !== false) {
$osver = "NT";
}
} else if (stristr($ua_string, "Mac") !== false) {
if (stristr($ua_string, "iPod") !== false) {
$os = "iPod";
} else if (stristr($ua_string, "iPhone") !== false) {
$os = "iPhone";
} else if (stristr($ua_string, "iPad") !== false) {
$os = "iPad";
} else if (stristr($ua_string, "Mac OS X") !== false) {
$os = "MacOS";
$osver = "X";
} else {
$os = "MacOS";
}
} else if (stristr($ua_string, "Nintendo") !== false) {
$os = "Nintendo";
} else if (stristr($ua_string, "PlayStation") !== false) {
$os = "PlayStation";
} else if (stristr($ua_string, "DreamPassport") !== false) {
$os = "DreamPassport";
}
// 返却値
return array($bws, $bwsver, $os, $osver);
}
アクセス解析プログラムを設置する場合、Webアプリ内で同期的に処理を行うか、JavaScript等で非同期に行うかという点について考えてみました。
まず同期で行う場合のメリットはというと、確実に全てのアクセスを捕捉できるということ。Webサイトには、通常の客のほかにも検索エンジンのクローラや怪しげなボットツールなどが訪問しにくるので、そういったアクセスの全てを把握できます。逆に、それらの機械的なアクセスが多い大手サイトの場合は、客のアクセス以上にその手のアクセスの情報ばかりが蓄積されてしまい、SEO解析の役に立たないというのも事実。
非同期で行う場合、アクセスログ集計の発動タイミングは恐らくJavaScriptによるAjax的な何かになると思われます。ということは、必然的に集計対象はAjaxに対応しているブラウザでのアクセスに絞られます。つまりは、客がブラウザでやってきた場合のアクセス状況のみを捕捉することになります。そして、何よりもサイトの表示に掛かる時間が同期版よりも確実に短い。前述のクローラ等のアクセスは全て捕捉することができなくなるのでそれらの情報が必要な場合には不便ですが、単純に客の行動を調べたい場合には非同期のほうが良いようです。
さて、非同期でアクセスログを取る場合の処理はどうすべきか。多くの場合、imgタグに画像出力CGIを貼り付ける形式が採用されているようですが、どうにもコード的に美しくない。となると、やはりPageLoad時にJavaScriptでAjaxをキックさせるのがベストかな。