Road To Nowhere

主にWebまわりのエンジニア的なお仕事に関するようなことのあれこれ。

SHOW VARIABLESにはGLOBALとSESSIONがある

おそらくMySQL使いの人にとっては常識だと思うけど、ちょいはまったのでメモ。


MySQLの設定値(変数)を見るときに使うSHOW VARIABLESにはSESSIONとGLOBALの2種類がある。
そんでもって、SESSIONもGLOBALも指定しない場合はSESSIONから値をとってくるとのこと。
http://ftp.ku.ac.th/pub/mirror/mysql/doc/refman/5.1/ja/using-system-variables.html


さて何にはまったかというと、MySQLコマンドラインからSET GLOBALで設定値を変更後、
SHOW VARIABLESで設定値を確認すると値が変わってないわけです。
なんじゃろということで、数分あたふたして同僚に泣きつくと「変わってるよ」と。
気を取り直して、MySQLコマンドラインに入り直してSHOW VARIABLESすると確かに変わってる。


そこでgoogle先生に聞くとSHOW VARIABLESにはSESSIONとGLOBALがあると。
SHOW GLOBAL VARIABLESでSET GLOBAL直後でも変更を確認できるわけだ。

以下、参考までに。

 mysql> show variables like 'long_query_time';
 +-----------------+-------+
 | Variable_name   | Value |
 +-----------------+-------+
 | long_query_time | 5     | 
 +-----------------+-------+
 1 row in set (0.00 sec)

 mysql> set global long_query_time=2;
 Query OK, 0 rows affected (0.00 sec)

 mysql> show variables like 'long_query_time';
 +-----------------+-------+
 | Variable_name   | Value |
 +-----------------+-------+
 | long_query_time | 5     | 
 +-----------------+-------+
 1 row in set (0.00 sec)

 mysql> show global variables like 'long_query_time';
 +-----------------+-------+
 | Variable_name   | Value |
 +-----------------+-------+
 | long_query_time | 2     | 
 +-----------------+-------+
 1 row in set (0.00 sec)

 mysql> 

4travel検索のブックマークレットを作ってみた

恥ずかしながら初めてブックマークレットを作ってみた。
テキストを選択して使用すると4travelの検索結果ページへ遷移するという単純なもの。


こちらのページにある「4tsearch」というリンクをお気に入りに追加して使用できます。
http://kzmr.net/bm/
(はてダはjavascriptの制御してるようで、エントリー上で直にブックマークレットの公開はできないみたい。。。)


ニュースなどを見ていて、知らない国名やエリア名があったときに使ってみると、何か分かるかもしれません。
その他、旅行関係のコンテンツ(旅行記、クチコミ、画像)が豊富なので、なんでも検索してみると楽しいと思います。


なお、こちらのページを参考にさせていただきました。
ブックマークレット/Bookmarkletの作り方 - catch.jp-wiki
Katteyomi.info


作ってみた印象は、意外と簡単にできるんだなと。
外部jsに処理を書けるってのはやりやすいなぁ。
けっこう複雑な処理とかもできちゃうかも。


今回はページ遷移させたけど、APIとか使って、
検索結果を現在のページにcssでかぶせて表示するとか。
また気が向いたらなんか作ってみよ。

twitterのbotを作ってみた

みんながすなるbotといふものをぼくもしてみようと思って作ってみた。
http://twitter.com/4travetter


機能は、@4travetterをつけてどこか行きたいエリアや国名をtwitterにpostすると、
4travelからマッチした旅行記を返すというもの。


今さらだけど、もしかしたら誰かの何かの役に立つかもしれないのでプログラムを公開しておく。
こいつをcron等で5分おきとかに定期的に動かせばOK。
エラー判定とかしていないけど、とりあえず思った通り動くのは確認済み。


twitterアカウントは変えてあります。
mysqlアカウントは環境に合わせてください。

<?php
//twitterアカウント
$username = "user";
$password = "pass";

//mysqlアカウント
$mysql_user = "user";
$mysql_pass = "pass";

require_once("DB.php");
$dsn = 'mysqli://'. $mysql_user .':'. $mysql_pass .'@localhost/4travetter';
$db = DB::connect($dsn);

$sql = "SELECT post_id FROM post ORDER BY post_id DESC LIMIT 1";
$res =& $db->query($sql);
$row =& $res->fetchRow(DB_FETCHMODE_ASSOC);

$since = "";
if($row){
    $since = "?since_id=".$row['post_id'];
}

//mentions取得
$contents = file_get_contents( "http://". $username .":". $password ."@twitter.com/statuses/mentions.xml".$since );
$xml = simplexml_load_string( $contents );


$sql = "INSERT INTO post 
(post_id, post_text, user_id, user_name, user_screen_name, user_location, user_description, user_profile_image_url, post_datetime) 
VALUES 
(?, ?, ?, ?, ?, ?, ?, ?, now())";
$stmt = $db->prepare($sql);

//取得したmentionの数だけloop
$count = count($xml->status);
for($i=0;$i<$count;$i++){
    
    $data = array(
    strval($xml->status[$i]->id[0]), 
    $xml->status[$i]->text,
    $xml->status[$i]->user->id,
    $xml->status[$i]->user->name,
    $xml->status[$i]->user->screen_name,
    $xml->status[$i]->user->location,
    $xml->status[$i]->user->description,
    $xml->status[$i]->user->profile_image_url,
    );
    
    $ret = $db->execute($stmt, $data);
    if (PEAR::isError($ret)) {
        echo "error ".$ret->getMessage();
    }
    
    //旅行記取得
    $keyword = trim(str_replace("@4travetter","",$xml->status[$i]->text));
    $res = getTravelogue($keyword);
    
    $message = "@".$xml->status[$i]->user->screen_name ." ";
    if($res){
    	$message .= $res['title']." ".$res['url'];
    }
    else{
    	$message .= "". $keyword ."」の旅行記が見つかりませんでした。";
    }
    
    //リプライをpost
    postTwitter($message, $username, $password);
    
}

function getTravelogue( $keyword ){
    $contents = file_get_contents( "http://api.4travel.jp/Ver1/SearchAlbum.php?ic=utf8&max=1&keyword=".urlencode($keyword) );
    $xml = simplexml_load_string( $contents );
    
    if($xml->numofresult=="0"){
    	return null;
    }
    
    $ret = array(
    	"title" => $xml->travelogue->item[0]->albumtitle,
    	"url" => $xml->travelogue->item[0]->albumurl,
    );
    return $ret;
}

function postTwitter( $message, $username, $password ){
	$url = "http://twitter.com/statuses/update.xml?";
	$params = "status=". rawurlencode($message);
	
	$result = file_get_contents($url.$params , false, stream_context_create(array(
		"http" => array(
		"method" => "POST",
		"header" => "Authorization: Basic ". base64_encode($username. ":". $password)
		)
	)));
}

?>


リプライを保存しておくテーブルの構造もコピペ。
本当はpost_idだけあればいいんだけど、ついでなのでそれ以外の情報も取得してみる。

CREATE TABLE post (
  post_id varchar(10) NOT NULL,
  post_text text NOT NULL,
  user_id int(10) NOT NULL,
  user_name varchar(100) NOT NULL default '',
  user_screen_name varchar(100) NOT NULL default '',
  user_location varchar(50) default NULL,
  user_description varchar(200) default NULL,
  user_profile_image_url varchar(200) default NULL,
  post_datetime datetime NOT NULL,
  PRIMARY KEY  (post_id)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

「MySQLハッキングの手引き」を聞いてきた

GREEさん主催のオープンソーステクノロジー勉強会「MySQLハッキングの手引き」にいってきた。
http://labs.gree.jp/Top/Study/20090807/Report.html
今回は定員60名のところ応募者多数で抽選だったんだけど、運よく当選。
しかしまぁMySQLをハックしたいという人がそんなにいるものなのかと驚いた。

以下、全体的なところでの感想。

  • デモが多かったので、難しい内容にも関わらず、何をしたいのか何をやっているのかというのは理解できた。
  • プラグインやUDF(ユーザ定義関数)くらいならちょっと触れるかも!触ってみよう!なんて気になった。
  • 参加者にビッグな方orツワモノぞろいだった。

以下自分用メモ。
詳しい内容は資料が公開されるとのことなのでそちらを参照してください。

Javascriptで選択文字列の取得

選択した(ハイライト表示させた)文字列をjsで取得しようとして、ちょっとだけはまったのでメモ。
まずは最終的なコード。

function getText() {
    IE='\v'=='v';
    var SelectedText;
    if(IE){
        SelectedText = document.selection.createRange().text;
    }
    else{
        SelectedText = window.getSelection().toString();
    }
    alert(SelectedText);
}

ポイントは、firefoxIE以外のブラウザ)のときの

SelectedText = window.getSelection().toString();

これ。

実は

alert(window.getSelection());

これで表示できてしまう。
window.getSelection()の返り値が文字列に見えてしまうんだけど実はオブジェクトで、
alertやdocument.writeのときは自動的に変換されているとのこと。
詳しくはこちら。
window.getSelection - Web API インターフェイス | MDN

window.getSelection()を使用するときは注意!
というよりも、勝手に変換してしまうときがあるってことに驚いた。

WordPressで異なるブックマークサービス間のブクマの共有を試みたときのメモ

異なるブックマークサービス間でもブクマを共有したい

ブクマサービスって世の中には多々あって、友人がbuzzurl使ってたり、delicious使ってたり、そんでもって自分ははてぶだったりしませんか?
みんな同一サービスであれば、buzzurlやはてぶのお気に入りだったり、deliciousのNetworkといった機能で互いのブクマを共有してコメントしたりできるんだけど、異なるサービス間で共有する手段はまだ世の中にないんじゃないかと。
どうにかしてそれらのブクマを共有したいねと友人たちと話していて、なんとかできないもんかなぁと試していることのメモ。

Yahoo Pipesでフィードを合体

まず僕は何も考えずにフィードを合体させればいいのではと考えて、Yahoo Pipesで友人と僕のフィードを合体させた。
それがこちら。
http://pipes.yahoo.com/pipes/pipe.info?_id=b130ef681a7d33ca4df1cae84e2d7366
各自みんなに共有したいと思うブクマだけに絞り込みたかったので、各サービスで「nanameue」のタグが付けられたものだけをフィルターするようにした。
ちなみにnanameueというのは僕らのコードネームみたいなもの。

このフィードを購読すればいいと思ったけど・・・

あとは各自のRSSリーダーに登録して購読すればいいと思ったんだけど、以下の点で物足りなかった。

  • ブクマ時にコメントを残せないので、どういう意図でブクマしたのか伝わらない。
  • 誰かのブクマに対してコメントできないので、盛り上がらない。
  • そもそも誰のブクマか分からない。

というわけで、この件、しばしの沈黙期間へ。

FeedWordPress発見

そんなときFeedWordPressというWordPressプラグインがあるのをたまたま発見した。
これは恐るべきプラグインで、フィードを登録しておけば、自動でWordPressにPOSTしてくれるというもの。
早速自宅サーバーに新しくWordPressをインストールして、プラグインをインストール。
Yahoo Pipesで作ったフィードからのPOSTもバッチリ。こちら。
これなら一つ一つのブクマに対してコメントも残せるし、このWordPressのフィードを購読すればOK。

さらに実現したいことが・・・

これで全て問題解決かというと、そううまくはいかなくて、さらに実現したいことがでてきた。

  • 現状のFeedWordPressの機能ではWordPress投稿時にカテゴリやタグが一つしか設定できない。ブクマ時のタグがそのまま生きればいいのに。
  • ブクマしてからWordPressに反映されるまでに数時間かかる。Yahoo Pipes経由なのが問題か。
  • デザイン工夫しないと見づらい。ちょうどいいテーマあるだろうか。

今後やること

まずはFeedWordPress自体を改造して、ブクマ時のタグをそのままWordPressのタグとして投稿できるようにしようかと。
それと「nanameue」タグによる絞込みはFeedWordPressでやるようにすれば、Yahoo Pipesを経由しなくて済むので、リアルタイム性もあがるかな。
見やすいテーマだったりデザインにするのはすごく重要な気がするけど・・・まぁ時間のあるときに。。
あとは、誰でも使えるようなサービスにしたいってのがあるけど、それはまだまだ先の話。

追伸

FeedWordPress使うとスパムブログ作り放題なんじゃ。。。
ニュースやブログの特定のキーワードの検索結果のフィードとか、アダルト動画の特定の個人名やジャンルでの検索結果のフィードとかで。
さすがに自宅サーバーではやりたくないので、ロリポップあたりで試してみようかなぁ。

Blackbirdを試してみた

簡単に説明すると、Javascript開発のときにこれを組み込むことで、コンソールが起動されてデバッグログをはくので、alert()はもう使わなくていいですよ、というもの。
詳しくはこちら。
gscottolson.com is coming soon


サンプル

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>Blackbird demo</title>
<script type="text/javascript" src="/blackbird/blackbird.js"></script>
<link type="text/css" rel="Stylesheet" href="/blackbird/blackbird.css" />
<script type="text/javascript">
function bbtest(){
  log.debug( 'this is a debug message' );
  log.info( 'this is an info message' );
  log.warn( 'this is a warning message' );
  log.error( 'this is an error message' );
}
</script>
</head>
<body>
<h1>Blackbird Test</h1>
<p>ログコンソールが表示されない場合はF2を押してください。</p>
<input type="button" value="push me!!" onclick="bbtest();">
</body>
</html>


DEMO
http://kzmr.net/blackbird/blackbirdjs.html


こちらのページに詳しく書いてありますが、ショートカットキーでコンソール表示・非表示の切り替えやリサイズができるのはうれしい。
また処理時間をはかるためのメソッドもあるので、これも使えそう。


もちろんFirebugの地位は揺るがないけど、併用することでjsの開発効率をアップできるかも。
それから、Firefox以外のブラウザでの挙動を見るときもalertを使わなくて済みますね。