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); }
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。
さらに実現したいことが・・・
これで全て問題解決かというと、そううまくはいかなくて、さらに実現したいことがでてきた。
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を使わなくて済みますね。