2010年12月24日金曜日

phpでmemcachedを使う

環境はCentOS5.5です。

インストール
$ sudo yum -y install emcached
$ sudo pecl install memcache
Build process completed successfully
Installing '/usr/lib64/php/modules/memcache.so'
install ok: channel://pecl.php.net/memcache-2.2.6
configuration option "php_ini" is not set to php.ini location
You should add "extension=memcache.so" to php.ini


iniファイル作成
$ sudo vim /etc/php.d/memcache.ini
extension=memcache.so


立ち上げる
$ memcached -d -m 64 -p 11211

これで立ち上げます。

オプションの意味はこんな感じです。
-d :  デーモンモード
-m 64 : 64MBのメモリをストレージとして使用する
-p 11211 : 11211番ポートで待ち受ける


もしローカル環境からのアクセスのみ許可する場合はこう。
$ memcached -d -m 64 -p 11211 -l 127.0.0.1


とりあえず使ってみる。

<?php
$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die ("Can't connect");

// 'key' = "1" で保存。圧縮はなし。期限は30秒。
$memcache->set('key', "hogehoge", false, 30);
print($memcache->get('key'));  //  hogehoge
?>


ついでに、サービス起動されるように設定します。
$ sudo chkconfig memcached on

これで再起動してもmemcacheが自動的に起動されます。


参考
memcachedをインストールしphpから使用する - 適当な日々

PHPとMecab関連のリンクメモ

個人的なメモ。

MeCab の辞書構造と汎用テキスト変換ツールとしての利用
MeCab: 単語の追加方法

文章の中のはてなキーワードをハイライトさせる(1/7):CodeZine

ubuntu 7.10にmecab 0.97をインストール - たまに書くメモ
PHPからMecabを利用する拡張モジュール | Weboo! Returns.

FreeBSD(とLinux)雑記:明日のためにmecabをいれてみたw - livedoor Blog(ブログ)
2007-10-25 - やぎLabs

MeCab を使って文章の形態素解析をする PHP 用の拡張モジュールです。

CentOS 5.5 に形態素解析ライブラリMeCab 0.98を入れてみる - イノベートな非日常

PHP: プログラミング関係ごちゃごちゃメモ

PHPで都道府県、市区町村、町域名以降の住所分割を高速に行う方法 - 理想未来はどうなった?
IRCボットコンテストエントリ その一 ~めかぶで夏を乗り切ろう
MeCab PHP extension moduleを使ってみた
MeCabで形態素解析してみた【PHP】 - Programming Magic

2010年12月9日木曜日

「PHPとMecabでキーワード自動リンクを実装する」をCentOS 5.5上でやってみた。その2

前回の続きで
続いて、独自の辞書ファイルを作る

辞書に必要なファイル群を作成していく。

まずurlのリストファイル。

url.csv
Google,0,0,-5878,http://www.google.com/
Yahoo,0,0,-4472,http://www.yahoo.com/
ChaSen,0,0,-5878,http://chasen.org/
京都,0,0,-3200,http://www.city.kyoto.jp/

その他のファイルの中身は下記のように。
これらのファイルは末尾に改行があるとエラーになるので、入れないように。

matrix.def
1 1
0 0 0

char.def
-----------
DEFAULT 1 0 0
SPACE   0 1 0
0x0020 SPACE

unk.def
DEFAULT,0,0,0,*
SPACE,0,0,0,*

dicrc
cost-factor = 800
bos-feature = BOS/EOS
output-format-type=autolink

node-format-autolink = <a href="%H">%M</a>
unk-format-autolink = %M
eos-format-autolink = \n

ここまでできたら辞書をコンパイル。

$ /usr/libexec/mecab/mecab-dict-index -f utf-8 -c utf-8
./pos-id.def is not found. minimum setting is used
reading ./unk.def ... 2
emitting double-array: 100% |###########################################| 
./pos-id.def is not found. minimum setting is used
reading ./url.csv ... 4
emitting double-array: 100% |###########################################| 
reading ./matrix.def ... 1x1

done!

これで辞書ファイルができたので、コマンドラインから使ってみる。

$ mecab -d .
京都に行った
<a href="http://www.city.kyoto.jp/">京都</a>に行った

OK

つづいて、php_mecabから使ってみる。
sample.php
<?php
$options = array('-d', '上記辞書ファイルを作成したディレクトリへのパス');

$t = new MeCab_Tagger($options);
$str = '京都についてGoogleとYahooで検索した。';

print $t->parse($str);
?>

実行
$ php sample.php
<a href="http://www.city.kyoto.jp/">京都</a>について<a href="http://www.google.com/">Google</a>と<a href="http://www.yahoo.com/">Yahoo</a>で検索した。

OK

※追記
url.csvのスコアを求めるサンプル
<?php
$text = 'Yahoo';
$cost = (int)max(-36000, -400 * (pow(mb_strlen($text, 'UTF-8'), 1.5)));
print($cost);
?>
こんな感じで。

「PHPとMecabでキーワード自動リンクを実装する」をCentOS 5.5上でやってみた

phpでキーワードを自動リンクする必要がでてきた。

なので、

ウノウラボ Unoh Labs: PHPとMecabでキーワード自動リンクを実装する

こちらのエントリを参考にphpとMecabで実装してみる。

使用OSとバージョンは、CentOS 5.5


まずMecabを入れる


yumでためしにインストールしようとすると、
$ yum install mecab mecab-ipadic mecab-devel
....
Setting up Install Process
No package mecab available.
No package mecab-ipadic available.
No package mecab-devel available.
Nothing to do
となり、CentOS にはない。

なのでこのあたりの記事を参考に、ソースからビルドする。

文章の中のはてなキーワードをハイライトさせる(1/7):CodeZine
CentOSにmecabとphp_mecabをインストールする


$ tar xvzf mecab-0.98.tar.gz
$ cd mecab-0.98
$ ./configure --with-charset=utf8
$ make
$ sudo make install


なお、次のmecab-ipadicを入れるときに、こんなメッセージが出ちゃう。
error while loading shared libraries: libmecab.so.1: cannot open shared object file: No such file or directory

.soが読み込めてない。なので、

$ sudo vi /etc/ld.so.conf
--------------
/usr/local/lib # この一行を追加
--------------

$ sudo ldconfig

として、読み込み先を追加しておく。

で、mecab-ipadicを入れる。

$ tar xvzf mecab-ipadic-2.7.0-20070801.tar.gz
$ cd mecab-ipadic-2.7.0-20070801
$ ./configure --with-charset=utf-8
$ make
$ sudo make install

入ったら動作テスト

$ mecab
MeCabのインストール [Enter]
MeCab   名詞,固有名詞,組織,*,*,*,*
の      助詞,連体化,*,*,*,*,の,ノ,ノ
インストール    名詞,一般,*,*,*,*,インストール,インストール,インストール

ちゃんとうごいてる。

php_mecabをいれる

$ wget http://page2.xrea.jp/pub/php_mecab-0.2.0.tgz
$ tar xvzf php_mecab-0.2.0.tgz
$ cd php_mecab-0.2.0
$ phpize
$ ./configure --with-mecab=/usr/bin/mecab-config
$ make
$ sudo make install
Installing shared extensions:     /usr/lib64/php/modules/

.soを読み込ませる

$ sudo vim /etc/php.d/mecab.ini
--------------
extension=mecab.so       <---- 一行を追加して保存
--------------

apacheを再起動

$ sudo /etc/init.d/httpd restart

ロードされてるか確認

$ php -m | grep mecab
mecab

OK。続いて、独自の辞書ファイルを作る。長くなりそうなので。

2010年11月26日金曜日

PHPerなら知っておいて損はない10の関数 : アシアルブログ

PHPerなら知っておいて損はない10の関数 : アシアルブログ
さんの記事より。


PHPerなら知っておきたい10の関数が紹介されていました。メモ。


改行を<br />に変換

文字を丸める

数値をフォーマット

配列からクエリ文字列を生成

クエリ文字列から配列を生成
配列をフィルタリング

文字列の先頭を大文字に変換

変数に関する情報をダンプ

メモリのピーク値を返却

PHPのクレジットを出力


phpcreditsは初めて知った。
色々な関数があるなぁ。

2010年11月24日水曜日

macでpdfファイルを「プレビュー」で開きたい

pdfを見るアプリケーションといったらAdobe Readerが有名ですが、
正直起動が若干遅い。

macには「プレビュー」という使えるアプリが元からついていて、
プレビューは起動がすごく早い。
なのでpdfファイルを開くときはデフォルトでプレビューを使いたい。

■やり方

・そのデータのアイコンを選択
・Command+iで、インフォメーションを表示
・インフォメーションの「このアプリケーションで開く」を選択し、プレビューを指定
・で、その下の「すべてを変更ボタン」をクリックする。これでその他のpdfについてもプレビューで開くようになる

2010年11月22日月曜日

jQueryで画面のスクロールに合わせて画像を読み込む「Lazy Load Plugin for jQuery」


Lazy Load Plugin for jQuery

このjQueryプラグインを使えば、
ディスプレイで表示されている分だけ画像を読み込める。

スクロールにあわせて画像をそのつど読み込むので、
ムダな画像読み込みがへる。

なので、そのぶんページ表示速度が上がると!

これから導入する。

2010年9月28日火曜日

zendのgetParam()はデフォルト値を取れる

使い始めのころは知らなかった。
いちいち空チェックをやってた。

たとえばページ番号なんかをpageパラメータから取得するときに
$page = $this->getRequest()->getParam('page', 1);
とかやれば、pageパラメータにデフォルトで1が入る。


まぁ普通にソース見てもいいし、ドキュメントにも書いてあるので、
とりあえず、API Documentationは一通り見ようと思った。

Zend Framework API Documentation

Zend FrameworkのMimeType Validatorがうまく動かない。

Zendを使っていて、
Zend_File_Transfer_Adapter_Httpでファイルをアップロードするとき、
$adapter->addValidator('MimeType', false, array('image/gif', 'image/png', 'image/jpg', 'image/jpeg', 'image/pjpeg', 'image/x-png')); // jpg, png, gif
こんなんとか、
$adapter->addValidator('IsImage', false);
こんなんとかを使ってMimeTypeのチェックをしようと思ったが、なぜかうまくいかない。

見ると、
Zend_Validate_File_IsImage::NOT_DETECTED
のエラーを吐いてる。

どうやらmimetypeが取得できないみたい。

コードに問題はなさそうだし、なんか挙動がよくわからないので、Zend/Validate/File/MimeType.php の中身を見る。

追っていくと、途中の

} else if (!(class_exists('finfo', false))) {

に引っかかって Exceptionが飛んでる。

どうやらfinfoがないみたい。
調べると pecl経由でfileinfoを入れればよさそう。
(自分の環境はCentOS 5.5)

一応チェック
$ php -i | grep fileinfo
(何も出ない)

なので、やっぱり入ってないみたい。
うーむ、しかし内部的に finfo_open()を使ってるんだなー。。。

というわけで、fileinfoをインストール。

peclでphpizeを使うため、手始めにphp-develをインストール。
$ sudo yum install php-devel

.....

Installed:
  php-devel.x86_64 0:5.2.10-1.el5.centos

Complete!

続いて、peclコマンドでfileinfoをインストール。
$ sudo pecl install fileinfo

.....

Build process completed successfully
Installing '/usr/lib64/php/modules/fileinfo.so'
install ok: channel://pear.php.net/Fileinfo-1.0.4

これでOK。
あとは設定ファイルに書いてモジュールをロードする。

$ sudo vim /etc/php.d/fileinfo.ini

extension=fileinfo.so

で再起動。

$ sudo /etc/init.d/httpd restart
httpd を停止中: [ OK ]
httpd を起動中: [ OK ]

$ php -i | grep fileinfo
/etc/php.d/fileinfo.ini,
fileinfo
fileinfo support => enabled

enabledになってればOK


これでMimeTypeのチェックがちゃんと動いた。

2010年9月21日火曜日

jqueryでエンターを押したときにsubmitさせる

formなどで、enterを押した段階でsubmitさせたい時がある。
それをjqueryで。
$('#password').keypress(function (e) {
    if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) {
        // sumit action
    }
});


参考
- Default html button submit on enter with JQuery - GreatWebGuy

phpでHTMLをパースする

前まではtidyを使ってたのだけど少々めんどかった印象があるので他のパーサライブラリを使ってみる。

かるく調べたところこのあたりが有名なのかな。
- Snoopy
- htmlSQL
- PHP Simple HTML DOM Parser
- Zend_Dom_Query

ひととおり全部使ってみた印象では(どれも一長一短あるけど)PHP Simple HTML DOM Parserが楽そう。

「タイトルだけ抜き出す」、「リンクだけ抜き出す」とかは大体どれも使い勝手は変わらないけど、もうちょっと凝ったことをやろうとするとどれもなかなか難しい部分がある。

というわけでもうちょっと使ってみる。

参考
- PHP×Snoopy×スクレイピング - 生涯未熟
- Webスクレイピングを可能にするPHPライブラリ・htmlSQL - かちびと.net
- ITキヲスク | htmlSQLよりアツい!?jQueryみたいにセレクタでHTMLをparse(解析)する「PHP Simple HTML DOM Parser」
- PHPアプリからCSSセレクタでHTML/XML文書を解析する - Zend_Dom -(1/4):CodeZine
- Zend_Dom_Query - noopな日々

javascriptでphpのisset()的な振る舞い

var hash = {a:'hoge', b:'piyo', c:'huga'}
if (hash[a]) {
    //exsist a
}
これだけでいいらしい。

PHPからTwitter APIのOAuthを使って投稿

OAuthを使ってtwitterで投稿するためには、consumer_key、consumer_secret、auth_token、token_secretの4つが必要になる。


consumer_key、consumer_secretを取得

これは、twitterのアプリを登録してkeyをもらう感じ。

Twitter / アプリケーション
にアクセスして、アプリケーションを登録。

登録すると、登録したアプリ用の「consumer_key」と「consumer_secret」が表示されるのでそれをメモっておく。


auth_token、token_secretを取得

上のアプリを使うアカウントのkeyを取得する感じ。

2010-01-24 - hirokan55の日記のサイトを参考に、
Downloads for abraham's twitteroauth - GitHubからabraham-twitteroauth-XXXXX.zipを落としてきて、
どこか自分のサーバにファイル群を置き、
config.phpのCONSUMER_KEY、CONSUMER_SECRETを上のアプリのkeyに、OAUTH_CALLBACKをおいたcallback.phpのURLとして修正する。

そのあと、index.phpにアクセスし、twitter側に認可を求めて、OAuth tokenとOAuth token secretを発行してもらう。

で、表示されたOAuth tokenとOAuth token secretをメモっておく。


ここまでで、consumer_key、consumer_secret、auth_token、token_secretの4つがわかったので、あとはこれを使って投稿するだけ。


投稿のやり方はたくさんあるけど、今回はpearのservices_twitterとHTTP_OAuthを使った。


まずインストール

services_twitterを入れる
$ sudo pear install --force services_twitter
.....
Starting to download Net_URL2-0.3.1.tgz (8,488 bytes)
...done: 8,488 bytes
install ok: channel://pear.php.net/Net_URL2-0.3.1
install ok: channel://pear.php.net/HTTP_Request2-0.5.2
install ok: channel://pear.php.net/Services_Twitter-0.6.2

HTTP_OAuthを入れる(stableがないので今回は0.1.18のバージョン指定で入れる)
$ sudo pear install HTTP_OAuth-0.1.18
.....
downloading HTTP_OAuth-0.1.18.tgz ...
Starting to download HTTP_OAuth-0.1.18.tgz (51,237 bytes)
.............done: 51,237 bytes
install ok: channel://pear.php.net/HTTP_OAuth-0.1.18


サンプルコード
require_once 'Services/Twitter.php';
require_once 'HTTP/OAuth/Consumer.php';

try {
    $twitter = new Services_Twitter();
    $oauth   = new HTTP_OAuth_Consumer(
       'メモったconsumer_key',
       'メモったconsumer_secret',
       'メモったauth_token',
       'メモったtoken_secret'
    );
    $twitter->setOAuth($oauth);
    $msg = $twitter->statuses->update("OAuth経由でTwitterに投稿するよ。");
} catch (Services_Twitter_Exception $e) {
    echo $e->getMessage();
}


参考
- 2010-01-24 - hirokan55の日記
- PHPでTwitter APIのOAuthを使う方法 - memo.xight.org

2010年9月9日木曜日

Setup Time Capsule

・Time CapsuleとモデムをLANでつなぐ
・Time CapsuleとMacをLANでつなぐ
・Macの中でTime Capsuleの設定画面が出る
・あとはTime Capsule内部の設定(ネットへの接続設定など)をするだけ
・WindowsからつなぐときはIP \\***.***.***.***\で


- Mac OS X(Leopard) + Time -Capsule + rsyncによる遠隔地ミラーバックアップ(コロケーション)環境の構築 - Object Design Blog
- 構想雑文 : TimeCapsuleで自宅サーバを行う場合の設定 - livedoor Blog(ブログ)
- Time CapsuleでMobileMeを利用する設定 | appling weblog
- Time Capsuleの設定と使い方 - [Mac OSの使い方] All About
- Time Capsuleに外出先からアクセス出来るんですか? | OKWave
- iTunesのデータをTime Capsuleに保存 « Fukigen blog
- おかゆ MacBook  Time Capsule 上のiTunesライブラリをFront Rowで読む方法
- iPhotoの写真やiTunesのライブラリをNAS上に置いて共有する - shygirlsの日記
- 1TBのNASを買ってiTunesの曲とか移動させてみた - 使いやすさとバイオリン

Zend_Logを使ってファイルにログを吐く

Zend_Logを使ってファイルにログを吐くときの個人的な定型
require_once("Zend/Log.php");
require_once("Zend/Log/Writer/Stream.php");
require_once("Zend/Log/Filter/Priority.php");
require_once("Zend/Log/Formatter/Simple.php");

// output format
$time = date('Y/m/d H:i:s');
$format = "{$time} %priorityName% (%priority%): %message%" . PHP_EOL;
$formatter = new Zend_Log_Formatter_Simple($format);
$writer = new Zend_Log_Writer_Stream('/****/****/****/logs/error_log'); // set log file path
$writer->setFormatter($formatter);

// setting log level
$filter = new Zend_Log_Filter_Priority(Zend_Log::DEBUG);
$log = new Zend_Log();
$log->addWriter($writer);
$log->addFilter($filter);

// write log
$log->debug('hogehoge');

PHP Fatal error: Class 'DOMDocument' not found

こんなんでた
PHP Fatal error:  Class 'DOMDocument' not found in /****/app/zf/library/Zend/Gdata/App/Base.php on line 210

これをいれる
$ sudo yum install php-xml

- Fatal error: Class ‘DOMDocument’ not foundと出たら: PHPの種 ブログ

2010年8月18日水曜日

peclのgeoipを使う

PECL::Package::geoipを使いたい。
で、peclでinstallコマンド叩いてみたけどgeoipがはいらない。(環境はCentOS 5.5です)

$ sudo pecl install geoip
downloading geoip-1.0.7.tgz ...Starting to download geoip-1.0.7.tgz (9,416 bytes).....done: 9,416 bytes
....
checking for geoip files in default path... not found
configure: error: Please reinstall the geoip distribution
ERROR: `/var/tmp/geoip/configure' failed

調べた。
- Problems installin GeoIP - PHP

geoip-develを入れてみるといいらしい。

$ yum install geoip
$ yum install geoip-devel

geoip-devel入れてもう一度。
$ sudo pecl install geoip
..........
Build process completed successfully
Installing '/usr/lib/php/modules/geoip.so'
install ok: channel://pecl.php.net/geoip-1.0.7
configuration option "php_ini" is not set to php.ini location
You should add "extension=geoip.so" to php.ini

入った。

php.iniに追記
; Enable geoip extension module (added by kasahi 2010/08/17)
extension=geoip.so

geoip.phpを作ってたたいてみる。
<?php
$host = 'www.yahoo.co.jp';
var_dump(geoip_country_code_by_name($host));
?>
$ php geoip.php
string(2) "JP"
www.yahoo.co.jpは日本にあるそうです。

2010年7月30日金曜日

.html内部でもphpを実行させる

なんだかよく忘れる。

httpd.conf の中に、
AddType application/x-httpd-php .php .html
って感じでAddTypeに.htmlの拡張子を追加

2010年7月29日木曜日

MacのTerminalにkeepAliveを設定

macのterminalで作業してて、すこし放っておくとsshの接続が切れちゃう。
そんなとき、putty使ってた時代はkeepAliveを設定してたなぁと思い返してmacのterminalでもできないものかと調べてみた。

~/.ssh/configの中に、ServerAliveIntervalの値を設定するだけでいいみたい。

$ vi ~/.ssh/config
Host *
ServerAliveInterval 120

これで120秒ごとに通信してsshを維持してくれる。

参考
Mac OS XのterminalでkeepAliveを設定する - Dive into the Tech World!
[を] Mac OS X から ssh 接続してもすぐ切れちゃう問題に対処

Mac OS XでDNSキャッシュをクリア

macbookでブラウジングしてて、たまにあるDNSが引けない時があって、でも一定時間経つと直ったりして地味に困ってた。

なので次回からそうなった場合はDNSキャッシュをクリアして対応することにした。

$ sudo dscacheutil -flushcache

これでOK。

参考
dscacheutil(1) Mac OS X Manual Page

Flickrの画像を一括でダウンロードする

Flickrの画像を一気にダウンロードしたい。
それもオリジナルサイズで。

以下3つのツールを使う。

まず、firefoxのアドオンである、DownThemAll!Greasemonkeyを入れる。

そのあと、
DownThemAllと併用してflickrのセットの一括ダウンロードを可能にするグリースモンキー「Link Original Image」
のGreasemonkey scriptを使う。

これでOK。


参考
Flickrにアップロードしたオリジナル画像を、一括再ダウンロードする方法。 | kimihiko Tech

mysqlのrootのパスワードを忘れたときどうするか

まずconf編集
/etc/my.cnf
の、
[mysqld]の下に
skip-grant-tables
を追加

mysql起動
$ sudo /etc/init.d/mysqld start
$ mysql -uroot mysql

パスワードを更新
mysql> UPDATE user SET Password=PASSWORD('hogehogehoge') WHERE User='root';
mysql> FLUSH PRIVILEGES;

そして、my.cnfの
skip-grant-tables
をコメントアウト

で、再起動
$ sudo /etc/init.d/mysqld restart

これでoK。

2010年7月27日火曜日

Bloggerでソースコードをハイライトする「Code Prettify」をブックマークレット化

Bloggerでソースコードをハイライトする「Code Prettify」を導入したのはいいけど、ちょっと変換作業が大変だったのでブックマークレット化してみた。自分用。

■ブックマークレット
Code Prettify Bookmarklet for Blogger
※ブックマークレットの追加は上記リンクを右クリック→追加、かブックマークツールバー欄にドラック&ドロップで。


ソースの中身
javascript:

function getSelectedTextAndReplace() {
    IE='\v'=='v';
    var SelectedText;
    if(IE) {
        var objSelectedText = document.selection;
        var objTextRange = objSelectedText.createRange();

        if (document.selection.createRange().text.length == 0) {
            return;
        }
        try {
                SelectedText = objTextRange.text;
                objTextRange.text = strToBloggerCodeTag(SelectedText);
        } catch (e){
        }
    } else {
        SelectedText = window.getSelection().toString();

        var obj = document.getElementById("postingHtmlBox");
        var ns = obj.selectionStart;
        var ne = obj.selectionEnd;
        var nl;
        if ( ns != ne ) {
            var txt = strToBloggerCodeTag(SelectedText);
            txt = obj.value.substring(0, ns) + txt + obj.value.substring(ne,obj.value.length);
            obj.value = txt;
            obj.setSelectionRange(ns,ns+nl);
        }
    }
}

function strToBloggerCodeTag(str) {
  return "<pre class=\"prettyprint\">\n" + escapeHTML(str) + "\n</pre>";
}

function escapeHTML(strTarget){
    var div = document.createElement('div');
    var text =  document.createTextNode('');
    div.appendChild(text);
    text.data = strTarget;
    return div.innerHTML;
}

getSelectedTextAndReplace();

void(0);

たぶんfirefoxとchromeでしか使わないけど、IEでも一応動いた。
名前とかいまいちだしコードツギハギだけど、とりあえず自分用なのでOK!

またリファクタリングしたい。

あとblogger編集画面textareaのidであるpostingHtmlBoxの中身をみてるので、
id名が変わったら書き換えが必要になりそう。

参考
bookmarkletで選択文字列を取得することを考える - 徒書
JS : テキストエリア内の選択文字列の置き換え :logical error

選択文字列をBloggerコード貼りつけ用文字列に変換したい その2

前のものはHTMLのエスケープが少々やっかいだったので、少し改良。

javascript:

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

function strToBloggerCodeTag(str) {
  return "<pre class=\"prettyprint\">\n" + escapeHTML(str) + "\n</pre>";
}

function escapeHTML(strTarget){
    var div = document.createElement('div');
    var text =  document.createTextNode('');
    div.appendChild(text);
    text.data = strTarget;
    return div.innerHTML;
}

getSelectedTextAndReplace();

void(0);

参考
Javascript/HTML特殊文字のエスケープ - 俺の基地

選択文字列をBloggerコード貼りつけ用文字列に変換したい その1

とりあえず色々やっつけで、alert()するところまで。
このあとブックマークレット化したい。

改良版へ

javascript:

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

function strToBloggerCodeTag(str) {
  str = replaceAll(str, "<", "&lt;");
  str = replaceAll(str, ">", "&gt;");
  str = replaceAll(str, "&lt", "&amp;lt;");
  str = replaceAll(str, "&gt", "&amp;gt;");
  return "<pre class=\"prettyprint\">\n" + str + "\n</pre>";
}

function replaceAll(expression, org, dest){
    return expression.split(org).join(dest);
}

getSelectedTextAndReplace();

void(0);


参考
Javascriptで選択文字列の取得 - Road To Nowhere

2010年7月23日金曜日

サイトを移転したので.htaccessにリダイレクト設定を書いた

完全移行なのでこんなかんじ。

.htaccess
Redirect permanent  /  "http://hogehoge.com"

2010年7月9日金曜日

Google AJAX Libraries API

Google AJAX Libraries API - Google Code


<script src="http://www.google.com/jsapi"></script>
<script>
  // Load prototype 1.6
  google.load("prototype", "1.6");

  google.setOnLoadCallback(function(){
      // ここにページロード時の処理を書く
  });
</script>


各ライブラリに取り組んでいる主要な関係者と直接連携をとっていて、
リリースごとに最新の安定したバージョンを受け取っているらしい。

setOnLoadCallbackはonload()を拡張しているみたいな感じ
ちゃんとDOMの構築が終わってから呼び出してくれる。

2010年7月5日月曜日

お名前.comのVPSサーバを使うときのメモ

レンタルサーバを探していて、相乗りのレンタルサーバよりVPSのほうがいいので探した。
で、結局
HDD120GB・メモリ1GB・root付【お名前.com VPS】月額2,475円〜★
を借りました。
最近よくキャンペーンしていて、初期費用の5250円が0円+月額2940円が3ヶ月無料と、値段的にも良心的ないい感じ。

スペックも
OS : CentOS 5
メモリ: 1GB
HD : 120GB
となかなか。

セットアップなど使うまでにいくつかメモ。

■SSHするためにポート22をあける
コントロールパネルの「システム設定」→「ファイアーウォール」からSSHを許可する

■yumを使えるようにする
セキュリティアップデートをなしにすると自動的にyumが入るので、
コントロールパネルの「システム設定」→「セキュリティ」→「アップデート」をなしにする。

一応、
※変更後は、自動・手動アップデートに戻すことはできません。また、すべてのコントロールパネル操作に関してサポート対象外となります。以後の運用について、ご自身で解決が可能なお客様のみご選択ください。
なので、これは覚悟の上。

まぁ普段サーバに入ってコマンドラインでパッケージ管理してる人は特に問題ないと思う。

■ユーザの追加
$ su -
$ /usr/sbin/useradd kasahi
$ passwd kasahi
$ /usr/sbin/visudo -> rootに追加
---------------
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
kasahi  ALL=(ALL)       ALL
---------------

■sudoをつかえるようにする
しかし、追加したユーザでsudo を使うと、、
$ sudo ls
audit_log_user_command(): 接続を拒否されました

と出るのでsudoのバージョンを上げる
$ su -
$ mkdir pkg
$ cd pkg
$ wget http://www.sudo.ws/sudo/dist/sudo-1.6.9p20.tar.gz
$ tar xvf sudo-1.6.9p20.tar.gz
$ cd sudo-1.6.9p20
$ ./configure
$ cp /etc/pam.d/sudo ~/sudo_bak   (※一応バックアップ)
$ cp sample.pam /etc/pam.d/sudo
cp: `/etc/pam.d/sudo' を上書きしてもよろしいですか(yes/no)? yes
$ make
$ make install

これでsudoが使えるようになった。

■sudoとyumが使えるようになったら
とりあえずパッケージをアップデート
$ sudo yum update


■yumで個人的に入れるもの
ここは随時追記していこう
$ sudo yum install zsh


おすすめレンタルサーバーはこちら

2010年7月2日金曜日

Mysqlのデータをmysqldumpでダンプして定期的にバックアップをとる

{$db_name}, {$password}, {$host_ip}, {$backup_dir}は各自の環境にて読み替えで。

いちおう元に戻すコマンドもメモ。

-mysql database dump command
$ mysqldump {$db_name} -u{$user_name} -p{$password} -h{$host_ip} --opt > db_`date +%Y%m%d%H%M%S`.dump

-mysql database restore command
$ mysql -u{$user_name} -p{$password} -h{$host_ip} {$to_insert_db_name} < db_**********.dump


これをcronに書いて定期的にbackupを取る。
あと定期的にダンプしたデータも消す。

# Backup DB
0 5 * * * /usr/bin/mysqldump {$db_name} -u{$user_name} -p{$password} -h {$host_ip} --opt > {$backup_dir}/db_`date +\%Y\%m\%d\%H\%M\%S`.dump
0 6 * * * /usr/bin/find {$backup_dir} -maxdepth 1 -type f -mtime +7 | /usr/bin/xargs /bin/rm


あとcronをチェックするときはログを見るとよい。
$ tail -f /var/log/cron

2010年6月30日水曜日

javascriptの文字列をactionscriptに渡す

- html
<param name="flashvars" value="param1=value1¶m2=value2">
- javascript
<script type="text/javascript">
//<![CDATA[
var flashvars = {
    'param1': 'value1',
    'param2': 'value2',
};
var params = {};
swfobject.embedSWF("./hoge.swf", "mainEmbeded", "576", "324", "9.0.0", "", flashvars, params);
//]]>
</script>
htmlやjsでこんな感じに書いて、

-actionscript
var flashvars:Object;
var param1:String;
var param2:String;
flashvars = LoaderInfo(loaderInfo).parameters;
param1 = flashvars["param1"];
param2 = flashvars["param2"];
こう呼び出すのでもいいのだけど、

もう一つの方法として、下の方法もありかなと思った。(お手軽という意味で)
いいか悪いかは疑問だけど。

- javascript
<script type="text/javascript">
//<![CDATA[
var nickname = 'kasahi';
//]]>
</script>
- actionscript
// var from javascript code
var id:String = ExternalInterface.call("nickname.toString");

actionscriptでURLのディレクトリパスのはじめを抜き出したい

例えばこんなURLがあったとして、
http://www.nikkei.co.jp/category/offtime/

URLから、「category」を抜き出したい。

正規表現でもいいと思うけど、
actionscriptでやるときは/でsplitするのが楽そうだった。

vat url:String = "http://www.nikkei.co.jp/category/offtime/";
var firstDirPath:String = url.split("/")[3];
// ["http:", "", "www.nikkei.co.jp", "category", "offtime"]

これで「category」が取れた。

2010年6月23日水曜日

Bloggerでソースコードをハイライトする「Code Prettify」を導入

ソースを貼り付けることが多いのでコードをハイライトするウィジェットを導入しました。

下記クリボウさんのエントリから。
- クリボウの Blogger Tips: コードをハイライトする「Code Prettify」ウィジェット

ハイライトするときは下記のように書く
<pre class="prettyprint">
(コード)
</pre>

導入もワンクリックで大変便利です。
ありがとうございます。


※ブックマークレット化してみました。
kasahi memo: Bloggerでソースコードをハイライトする「Code Prettify」をブックマークレット化

Tracのソースコードブラウザの表示の文字コードをUTF-8に変更する

メモ。
Tracのリポジトリブラウザのソース表示の文字コードをUTF-8に変更しました。

設定ファイルの、default_charsetを変えるだけ。
(※confの場所はプロジェクトの置き場によって違うと思います)
$ vim /home/trac/projects/conf/trac.ini
;default_charset = iso-8859-15 # modified by kasahi 20100624
default_charset = utf-8

これでソースコードブラウザもutf-8になった。

Tracを0.11系から0.12系にアップグレードする

Tracを0.11系から0.12にアップグレードしました。
2年くらい前はTracの導入が手間だったこともありハマることは覚悟していたのですが、結果的にはコマンドを5つくらい実行するだけで終わりました。あっさり。


流れは公式の手順に沿っただけです。
- TracUpgrade – The Trac Project
easy_install経由でアップグレードしてあとはtrac-adminの操作でOKでした。

以下、個人メモ用ログ

- Tracのアップグレード
$ sudo easy_install --upgrade Trac
Searching for Trac
Reading http://pypi.python.org/simple/Trac/
Reading http://trac.edgewall.org/
Reading http://trac.edgewall.org/wiki/TracDownload
Reading http://trac.edgewall.com/
Reading http://projects.edgewall.com/trac
Reading http://projects.edgewall.com/trac/wiki/TracDownload
Best match: Trac 0.12
Downloading ftp://ftp.edgewall.com/pub/trac/Trac-0.12.zip
Processing Trac-0.12.zip
Running Trac-0.12/setup.py -q bdist_egg --dist-dir /tmp/easy_install-K8q9TB/Trac-0.12/egg-dist-tmp-CwXvao
catalog 'trac/locale/vi/LC_MESSAGES/messages.po' is marked as fuzzy, skipping
catalog 'trac/locale/fa/LC_MESSAGES/messages.po' is marked as fuzzy, skipping
catalog 'trac/locale/el/LC_MESSAGES/messages.po' is marked as fuzzy, skipping
Removing Trac 0.11.2 from easy-install.pth file
Adding Trac 0.12 to easy-install.pth file
Installing trac-admin script to /usr/bin
Installing tracd script to /usr/bin

Installed /usr/lib/python2.5/site-packages/Trac-0.12-py2.5.egg
Processing dependencies for Trac
Searching for Genshi>=0.6
Reading http://pypi.python.org/simple/Genshi/
Reading http://genshi.edgewall.org/
Reading http://genshi.edgewall.org/wiki/Download
Best match: Genshi 0.6
Downloading http://ftp.edgewall.com/pub/genshi/Genshi-0.6-py2.5.egg
Processing Genshi-0.6-py2.5.egg
Moving Genshi-0.6-py2.5.egg to /usr/lib/python2.5/site-packages
Removing Genshi 0.5.1 from easy-install.pth file
Adding Genshi 0.6 to easy-install.pth file

Installed /usr/lib/python2.5/site-packages/Genshi-0.6-py2.5.egg
Finished processing dependencies for Trac

- Tracプロジェクトのアップデート
$ sudo /usr/bin/trac-admin /home/trac/projects upgrade
$ sudo /usr/bin/trac-admin /home/trac/projects wiki upgrade
$ sudo /usr/bin/trac-admin /home/trac/projects repository resync '*'
$ sudo /usr/bin/trac-admin /home/trac/projects deploy /home/trac/projects
これで終わり。
最後のdeployはちょっと自信なし。

あとはapache再起動すればOKです。
$ sudo apachectl -k restart

2010年6月7日月曜日

macにImageMagickを入れて画像の一括リサイズ

たつをさんの記事を参考に。
[を] Mac に ImageMagick を入れた

macports を使ってインストール。
$ sudo port install ImageMagick


画像の一括リサイズ例。

$ foreach i (*JPG)    
convert -geometry 160x120! $i $i.m.jpg
end

(↑ P0001.JPG が P0001.JPG.m.jpg に。)

$ foreach i (*JPG)    
convert -geometry 160x120! $i $(echo $i | perl -pe 's/jpg//i')m.jpg
end

(↑ P0001.JPG が P0001.m.jpg に。)


最大幅、高さを480でリサイズ
foreach i (*JPG)
convert -geometry 480x480 $i $(echo $i | perl -pe 's/JPG//i')jpg
end


拡張子を.JPGから.jpgに変換
foreach i (*JPG)
mv $i `echo $i | sed -e "s/\.JPG/.jpg/"`
end

2010年6月3日木曜日

macのターミナルからカレントディレクトリを Finder で開く

macのターミナル上で

$ open .

と打つ。

これでFinderが開く。
便利!

2010年5月26日水曜日

PHP タグの短縮型 (<? ?>) を使用不可能にする

色々あって、

<?xml version="1.0" encoding="UTF-8"?>
<items>
<item>
<?php
foreach($itemArray as $item) {
.....
みたいなテンプレートをいじる機会があった。

このとき、<?以降がphpとして認識されてしまい、今回においては不都合があった。

なので、
・PHP: コア php.ini ディレクティブに関する説明 - Manual
http://php.net/manual/ja/ini.core.php

を参考に、short_open_tagディレクティブをoff。

・short_open_tag boolean
 PHP タグの短縮型 (<? ?>) を使用 可能にするかどうかを設定します。PHPをXMLと組み合わせて用いる 場合は、<?xml ?>をファイル中で用 いるためにこのオプションをオフにする必要があります。オンにし た場合にPHPでXMLを出力するには、例えば、次のようにします。 <?php echo '<?xml version="1.0"?>'; ?> これをオフにした場合、長い方の形式のタグ (<?php ?>) を使用する必要があります。


ということで、php.iniの中に、
short_open_tag = off
を追記しました。

DELLの27インチディスプレイU2711が欲しい

とりあえず吟味。

現状のアイテムと候補のスペック表メモ。

2007EP(1600×1200) 1920000
2007EP(3200×1200) 3840000
S2409W(1920×1080) 2073600 19,800円
U2410 (1920×1200) 2304000 39,800円
U2711 (2560×1440) 3686400 57,900円
mac (1280× 800) 1024000

2010年5月24日月曜日

CentOSでSELinuxを無効化

■SELinuxとは
http://www.selinux.gr.jp/whatis.html
--------------
$ getenforce ← SELinux状態確認
Enforcing ← SELinux有効

$ setenforce 0 ← SELinux無効化

$ getenforce ← SELinux状態確認
Permissive ← SELinux無効

$ vi /etc/sysconfig/selinux ← SELinux設定ファイル編集
SELINUX=enforcing

SELINUX=disabled  ← システム起動時にSELinuxを無効化
--------------

なお、SELinuxを無効にしていなかったために、
以下の設定などでハマった。

・DocumentRoot以下のシンボリックリンクが効かない
[error] [client 192.168.10.86] Symbolic link not allowed or link target not accessible: /var/www/html/kasahi

httpd.confの
Options FollowSymLinks
の指定も効かず、、


・rsyncでファイルが特定のディレクトリにしか送れない
$ tail -f /var/log/rsync.log
rsync: chroot /home/kasahi failed: Permission denied (13)

などとエラーがでてrsyncできなかった。

/etc/rsyncd.confの
use chroot = no
の指定も効かず、、

・VirtualHostの指定が上手くいかない
VirtualHost内のDocumentRootの指定などがうまくいかなかった気がします。



原因がわかってよかった。
とりあえずセットアップしたばかりのLinuxの設定でハマったときは
SELinuxを疑うようにしよう。

2010年5月12日水曜日

Aptanaをセットアップ

今のところ、Aptanaの最新版は2.0.4 (2010/05/12現在)
http://www.aptana.org/

日本語化するには、Pleiadesを落としてきて中身のpluginをコピーする
Pleiadesの最新安定版は1.3.1でした。
http://mergedoc.sourceforge.jp/

日本語化(windowsの場合とmacの場合を書きます)

落としたPleiadesの中にある
pluginsフォルダのjp.sourceforge.mergedoc.pleiadesを、

・windowsの場合
C:\Program Files\Aptana\Aptana Studio 2.0\plugins
・macの場合
/Applications/Aptana Studio 2.0/plugins

にコピー

そして、

・windowsの場合
Aptana Studio 2.0\AptanaStudio.ini
・macの場合
/Applications/Aptana Studio 2.0/AptanaStudio.app/Contents/MacOS/aptanastudio.ini

の最後に下記1行を追加して落としてきたpluginを読み込む。

・windowsの場合
-javaagent:plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar=
・macの場合
-javaagent:/Applications/Aptana Studio 2.0/plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar

これで日本語化完了

2010年5月11日火曜日

ActionScript3.0のtraceをFirebug のconsoleに表示

この一行でいける

ExternalInterface.call("console.log", hogehoge);

※importは
import flash.external.ExternalInterface;
で。

その他
* mm.cfgを書いてどこかにlogを出してそれを見る
* ライブラリを入れてconsoleに出す
** log.asを使ってFirebugのコンソールにデータを出力! _level0.KAYAC

2010年4月30日金曜日

googleのjavascript tool「Google Closure Tools」

Closure Tools - Google Code

とりあえず落としてくる

$ svn checkout http://closure-library.googlecode.com/svn/trunk/ closure-library-read-only


下記参考
* 早速Closure Toolsをあれこれみてきた - 三等兵
* グーグルのJavaScriptツール集大成「Google Closure Tools」 - そこが知りたい! 注目のツール:ITpro

jQueryとprototype.jsを共存させるには

jQueryのnoConflict()を使う。

すると、$はprototype用になり、
jQueryは$の代わりに「jQuery」という宣言を利用できるようになる。

jQuery.noConflict() [jquery/prototype.js]|Ajax入門|Ajaxの基礎と応用の学習|StudyNet
jQueryとprototype.jsを同時に使うには | btmup Blog

2010年2月22日月曜日

Windows VistaからMacの共有フォルダにアクセスする

初期設定の状態だと認証の段階で拒否されてしまうので、認証レベルを変更。

Windows Vista Businessの場合
コントロールパネル>「管理ツール」>「ローカルセキュリティポリシー」>「ローカルポリシー」>「セキュリティオプション」>「ネットワーク セキュリティ: LAN Manager 認証レベル」を「NTLM応答のみ送信する」に変更する

Windows Vista Homeの場合
1.スタートメニューの検索ウィンドウに「REGEDIT」と入力し、レジストリエディタを起動。
2.HKEY_LOCAL_MACHINE>SYSTEM>CurrentControlSet>Control>LsaのLmCompatibilityLevelの値を0に変更。

Thinkpad X40+windows XPで無線LANが使えなくなった

Thinkpad X40+windows XPで無線LAN(WPA)でつなごうとすると、つながらない。

よくわからないけど、windowsアップデートでSP3したときに何かなったらしい。
調べてみると結構引っかかる。

どうやら、もともとThinkpad X40にはいってた、Access Connetionsが不具合を起こしている模様。

対処法
Lenovo ThinkVantage Access Connections プラス ワイヤレスLANドライバー・パック - Japan
を落としてきて、インストールして再起動。

これで無線LAN(WPA)が使えるようになりました。