web制作

  • さくらインターネットで突然svn (subversion) が使えなくなった時の対処

    さくらインターネットのスタンダートプランを契約しているのですが、
    突然 subversion が使えなくなりました。
    クライアントの問題かなぁと思って svn コマンドで直接やってみたけどダメ。
    他のクライアントで試してもダメ。
    他の人に試してもらってもダメ。

    こんなエラーがでていました。


    To better debug SSH connection problems, remove the -q option from ssh in the [tunnels] section of your Subversion configuration file.

    このエラー読んで自分のクライアントが悪いのかなぁと思って原因を探っていましたが、結局サーバのアップデートが原因でした。

    http://support.sakura.ad.jp/mainte/mainteentry.php?id=11385

    ちゃんと予告されてたのに全く見てなかった・・・。
    以前設定したのが2009年だったのでそりゃ4年も経てば使えなくもなりますね。

    ちなみにサーバーからsvnコマンドを打つとこんなエラー

    $ ~/local/bin/svn --version
    /usr/local/lib/libexpat.so.6: unsupported file layout

    というわけで
    以前参考にしたサイトを見なおしてmakeしなおしたら無事使えるようになりました。

    $cd ~/local/src/subversion-1.5.7/
    $make distclean
    $./configure --prefix=$HOME/local
    $gmake
    $gmake install

    パスは元から通ってるのでちゃんと通ってるか確認だけして終了。

    他にもいろいろ(apacheとか)アップデートしたようなのでおいおい確認していきます。

  • グルーポンのメルマガの解除方法がわからない・・

    グルーポンのメルマガの解除をしようとしているんだけど、ちょっと日本語の意味がわからない。

    関西エリアの解除をしたいので、チェックを”入れて”購読解除を使用とした結果が上の画面。
    「解除したいエリアのチェックを外してください」

    ふむ。チェックを”外している”エリアのメルマガを解除できるのか。
    と解釈したので(というかチェックを”入れた”ままだと進まないので)今度はチェックを”外して”購読解除をする。
    で、その結果画面が下。

    「ご指定のエリアのメールマガジンを解除しました」
    え?何も指定してないんですけど・・・。
    これで解除できたのかとても不安。
    ・・・というかメルマガ解除できてないっぽい。
    ので問い合わせ中。

    解除できてました。わーい。(2012.03.28追記)

    ユーザを混乱させる日本語は使わないほうがいいですね。

    よくあるダイアログボックスで
    「キャンセルしますか? OK/キャンセル」
    みたいなのもありますね。

  • webminを更新したら日本語表示できなくなったという場合の対処方法

    webmin を yum でアップデートしたら日本語表示できなくなって、しばらく困っていました。
    表示言語を日本語にしてるのに日本語にならなくて、なんでだろうと思ってたら、設定方法がわかったのでメモ。
    今のバージョンは1.580だけど、たしか 1.570くらいから日本語表示できなくなってた気がする。

    1.左メニューの「Webmin Configuration」→「Language」へ

    Webmin Configurationを選択

    Languageを選択

    2. Use language specified by browser? で No にチェックを入れる

    No にチェックを入れる。(Display Languageももちろん日本語に。)

    チェックを入れたら Change Languageボタンを押せば完了。

  • MACのXAMPPでApacheを複数ポートで立ち上げるとエラーの対処

    WindowsからMACに開発環境を移行中。
    ちょっとつまづいたのでメモ。
    XAMPP for MacOS X の Apache で複数ポート使おうとするとエラーが出る場合の対処方法。

    ポートを分けてバーチャルホストを作りたかったので、httpd.confに

    Listen 8200

    と追加。

    すると以下のエラーが出てくる

    [Thu Sep 01 17:57:00 2011] [emerg] (13)Permission denied: couldn’t grab the accept mutex

    どうやら既知のバグだったみたい。
    http://bugs.xampp.org/view.php?id=110

    対処方法は、httpd.confに以下を記載。

    AcceptMutex flock

    これで無事、ポート番号で分けてバーチャルホスト立ち上げられる。
    バーチャルホストの設定は以下の記事とかを参考に。
    Apacheにバーチャルホスト利用で複数サイトのテスト環境を作成する方法

  • Image_Graph の 色指定

    PearのImage_Graph調べた。
    どこを見ても red だのgreen だのでしか書いてなかったので、RGBで指定できないのかと思ってたけどそんなことはない。
    以下いずれも可能。

    $obj =& Image_Graph::factory(‘Image_Graph_Fill_Array’);
    $obj->addColor(‘red’);
    $obj->addColor(‘red@0.3’);
    $obj->addColor(‘#00ff33);

    @はアルファ値と言って透明度を調整するらしい。(明るくなる)

  • iepngfix.htcのIE判定

    IE5.5やIE6でも透過PNGを表示できるようにしてくれるIE PNG Fixをとてもありがたく使わせてもらっているんだけど、IEのバージョン判定が甘い気がする。

    問題の箇所はipengfix.htcの74行目付近。

    	if (
    		!/MSIE (5\.5|6)/.test(navigator.userAgent) ||
    		typeof elm.filters == 'unknown'
    	) {
    		return;
    	}
    

    これだと透過PNGが使えるIE7やIE8でも適用されてしまう。
    ・・・というかこのプログラムはそういう仕様なのかも。
    「IE5.5+ PNG Alpha Fix v2.0 Alpha」って書いてあるし。
    IE5.5以上で透過PNG使えるようにするみたい。

  • google スプレッドシートのフォーム機能の「必須」を「required」にする

    googleドキュメントでフォームを作ったんだけど、「必須」のところを英語で「required」って表示させたい。フランス語なら「Obligatoire」
    海外の人にもアンケートに答えて欲しい。そんなときのtips。

    googleドキュメントの仕様(予想)

    googleにログインしている人
     →その人のgoogle docsの設定に依存
    googleにログインしていない人
     →spread sheetを作った人のgoogle docsの設定に依存
     →言語が指定されていればその指定に従う

    で、言語の指定方法はアドレスにhl=enをつけてあげる(英語の場合)だけ。

    http://spreadsheets.google.com/viewform?hl=en&formkey=…

    hl=frだとフランス語
    hl=koだと韓国語
    hl=itだとイタリア語
    hl=deだとドイツ語
    hl=deだとドイツ語
    hl=spだとスペイン語
    のようです。

  • im.kayac.comでiPhoneにtwitterをプッシュ通知するphpソースコードサンプル

    特定のユーザのtwitterの投稿をiPhoneにプッシュ通知してくれるアプリが欲しい。
    そういうアプリはなさそうなので、本当はそういうアプリを作りたかったのだけれど、大変そうなのでim.kayac.comとphpとcronで実現してみた。
    im.kayac.com(App Store)
    このiPhoneアプリはいろいろ便利。プログラムかければいろんなのをプッシュ通知できる。

    以下サンプルソース。変なところがあったら教えて欲しい。
    これをcronで5分毎に実行する。
    (cronで実行するときは、1行目に#!/usr/local/bin/phpって書く)

    created_at);
    	$content = date("Y/m/d H:i",$timestamp)."@";
    	// 名前
    	$content .= $message->user->name.">>";
    	// 内容
    	$content .= $message->text."";
    
    	// imkayacを使ってプッシュ
    	imkayac($content);
    	return;
    }
    
    // http://project-p.jp/halt/anubis/blog_show/1269をほぼそのまんま
    // cURLでできるんじゃなかろうか。
    function imkayac($message){
    
    	$data = array(
    	    "message" => $message,
    	    "password" => K_PASS,
    	);
    
    	$data['sig'] = sha1($data['message'] . K_SIG);
    	unset($data['password']);
    
    	$data = http_build_query($data, "", "&");
    
    	//header
    	$header = array(
    	    "Content-Type: application/x-www-form-urlencoded",
    	    "Content-Length: ".strlen($data)
    	);
    
    	$context = array(
    	    "http" => array(
    	        "method"  => "POST",
    	        "header"  => implode("\r\n", $header),
    	        "content" => $data
    	    )
    	);
    
    	$url = "http://im.kayac.com/api/post/".K_NAME;
    	file_get_contents($url, false, stream_context_create($context));
    	return;
    }
    
    
    // ログ取得(重複tweet読込回避)
    function getLog(){
    	$retval = array();
    	if( ($fp = fopen(LOG_FILE_NAME,"r+") ) ){
    		while (! feof($fp)) {
    			$line = fgets ($fp, 4096);
    			$data = explode(",", trim($line));
    			$retval[$data[0]] = $data[1];
    		}
    		fclose($fp);
    	}
    	return $retval;
    }
    
    // ログ保存(重複tweet読込回避)
    function saveLog($datas){
    	$log = '';
    	if(!empty($datas) && is_array($datas)){
    		foreach($datas as $name => $id){
    			if(!empty($name) && $id){
    				$log .= $name.",".$id."\n";
    			}
    		}
    	}
    	$fp = fopen(LOG_FILE_NAME,"w+");
    	flock($fp, LOCK_EX);
    	fputs($fp, $log);
    	flock($fp, LOCK_UN);
    	fclose($fp);
    	return;
    }
    
    // エラーログ保存(念のため)
    function saveErrLog($message){
    	$fp = fopen(ERRLOG_FILE_NAME,"a+");
    	$date = date('Y/m/d h:i:s');
    	$logmessage = $date." ".$message."\n";
    	flock($fp, LOCK_EX);
    	fputs($fp, $logmessage);
    	flock($fp, LOCK_UN);
    	fclose($fp);
    	return;
    }
    
    // 重複取得回避用
    $logs = getLog();
    
    foreach($tnames as $tname){
    	// 重複取得回避用
    	if(!empty($logs[$tname])){
    		$since_id = "?since_id=".$logs[$tname];
    	} else {
    		$since_id = "";
    	}
    
    	// 特定のユーザーのタイムライン取得用API
    	$apiURL = "http://api.twitter.com/1/statuses/user_timeline/".$tname.".xml".$since_id;
    
    	// cURLを使ってXML取得
    	$ch = curl_init(); 
    	curl_setopt($ch, CURLOPT_URL, $apiURL);
    	curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 2);
    	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    	$retXML = curl_exec($ch); 
    	curl_close($ch);
    
    	// 取得したXMLを解析
    	if(!empty($retXML) && ereg("^<\?xml", $retXML) && 
    	   $xml = simplexml_load_string($retXML)
    	){
    		if($xml->status){
    			foreach($xml->status as $message){
    				// 重複取得回避用
    				if($logs[$tname] <= $message->id){
    					$logs[$tname] = $message->id;
    				}
    				// 取得したTLを出力
    				outMessage($message);
    			}
    		}
    	} else {
    		// 一応エラーログ記録
    		saveErrLog("xml取得失敗");
    	}
    }
    
    // 重複取得回避用
    saveLog($logs);
    ?>
    

    twiiterAPIと通信する部分をいろいろ変えればReplyとかmentionとかだけ取得することも可能。
    そんときはログインも必要になるので、「phpでTwitterをハンドリングするサンプル」を参考に変えたらいいと思う。
    他に欲しい情報とかあったら、Twitter API Wikiのサイトをみればだいたい分かる。
    英語読めなくても結構わかる。

    ※参考サイト

  • Artisteer – WordPressナビゲーションメニューの調整

    aritsteer使ってる人ってあまりいないのだろうか。日本語の情報が少ない。

    artisteerの作ったテーマを適用した場合、静的ページを作成したらそれがナビゲーションにメニューに自動的に表示されてとても便利。
    でもメニューが増えてくると邪魔。
    なのでそういうときは、テーマを編集する。
    functions.php内に、art_menu_items()という関数があるのでそのwp_list_pagesのパラメータを以下のように編集。

    変更前。

    wp_list_pages(‘title_li=&sort_column=menu_order);

    変更後。

    wp_list_pages(‘title_li=&sort_column=menu_order&include=9,26,43,50,53’);

    includeの後に表示させたいページIDをカンマ区切りで入れていけばOK。
    ページIDは、管理画面の「ページ」から編集したい画面を選択するとURLがpost=xxとなってるのでその番号を記載する。
    表示させたくないページだけ表示させないようにする場合はinclude→excludeにしてIDを指定する。
    こんな感じ。

    wp_list_pages(‘title_li=&sort_column=menu_order&exclude=3,4’);

    参考サイト

  • WindowsでTortoiseSVNを使う

    さくらにSubversionをインストールの続きの記事。
    さくらインターネットのレンタルサーバ(スタンダードプラン)にsubversionをインストールしてある前提で話を進めます。
    WindowsのバージョンはXP SP3です。

    Windowに以下をインストールして設定。

    • puttyごった煮版
    • TortoiseSVN

    鍵認証でssh接続するので鍵の生成と管理用にputtyもインストールします。
    私の場合は複数の接続先(さくらのスタンダードプランを2つ契約してる)でSVNを使ってるので、鍵を使いわけるためputtyごった煮版を使用してます。
    なのでToroiseSVNのsshクライアントの設定とレポジトリのURLが他のサイトと少し違うかも。

    • sshクライアントの設定
    • “C:\Program Files\TortoiseSVN\bin\TortoisePlink.exe” -l XXXXX -i “C:\Program Files\TortoiseSVN\bin\id_rsa.ppk”
      [sshクライアント] -l [ユーザID] -i [秘密鍵]

    • レポジトリのURL
    • svn+ssh://XXXXX.sakura.ne.jp/home/XXXXX/repo/test
      svn+ssh://[アドレス]/[リポジトリがあるディレクトリのパス]

    となっているところが

    • sshクライアントの設定
    • “C:\Program Files\Putty\Plinkw.exe”
      [sshクライアント]

    • レポジトリのURL
    • svn+ssh://XXXXX@XXXXX.sakura.ne.jp/home/XXXXX/repo/test
      svn+ssh://[ユーザID]@[アドレス]/[リポジトリがあるディレクトリのパス]

    になります。

    以下詳細を説明していきます。

    puttyごった煮版をインストール

    http://yebisuya.dip.jp/Software/PuTTY/
    からインストール版をダウンロードしてインストールします。
    手順は省略(^^;)

    TortoiseSVNをインストール

    インストール方法はhttp://www.gside.org/Gentoo/subversion/subversion_client.htmlに載ってるのでそちらをみてください(^^;)
    わかりやすいです。

    ssh接続のための設定

    svn+sshで接続するので、その設定を書いておきます。

    鍵の生成

    PuTTYgenを起動します。
    場所は「すべてのプログラム」→「PuTTYごった煮版」→「PuTTYgen」。

    鍵の生成
    鍵の生成

    「生成」ボタンを押して鍵生成。
    マウスを適当に動かしてるとゲージが動いて鍵が生成される。

    公開鍵の保存
    公開鍵の保存

    公開鍵の部分をコピーしてメモ帳などのエディタを開いてペースト。
    「authorized_keys」という名前で保存。
    これをサーバの /home/xxxxx/.ssh ディレクトリの中にアップロード。
    もちろんxxxxxは自分のIDに置き換えてください。

    秘密鍵の保存
    秘密鍵の保存

    「秘密鍵の保存」をクリックすると警告が出るけど、「はい」を押して適当な名前(とりあえず「id_rsa.ppk」で)をつけて保存。
    場所は自分でわかりやすい場所で。
    秘密鍵は厳重に管理してください。最悪の場合サイトがのっとられてしまいます。
    本来なら秘密鍵にはパスワードをかけるべきです。
    パスワードをかけておけば万が一秘密鍵がとられてしまった場合でも”少し”安心です。
    心配な方はパスワードをかけてください。
    パスワードを設定する場合は、「鍵のパスフレーズ」にパスワードを入力すれば設定できます。
    ただしパスワードを設定すると毎回接続するときにパスワードを入力しないといけなくなります。
    この辺は自己責任で。

    次にPageantを起動。
    場所は、「すべてのプログラム」→「PuTTYごった煮版」→「Pageant」。
    ※Pageantを起動して鍵を設定する操作はPC立ち上げ後、TortoiseSVNを使う前に毎回行わないとだめ。
    面倒だからなんとかならないかな。

    pageantの起動
    pageantの起動

    PCに斜め線が入ったアイコンをクリックor右クリックして「鍵の追加」をします。

    pageant鍵の追加
    pageant鍵の追加

    で先ほど生成した秘密鍵「id_rsa.ppk」を追加。

    TortoiseSVNの設定

    適当なフォルダ(なんでもOK)で右クリック。

    Tortoiseの設定
    Tortoiseの設定

    「TortoiseSVN」→「設定」を選択。

    sshクライアント設定
    sshクライアント設定

    「ネットワーク」のsshクライアント設定の項目に「”C:\Program Files\Putty\Plinkw.exe”」と記入して「OK」をクリック。

    TortoiseSVNを使ってチェックアウトとかコミットとか

    TortoiseSVNを使ってバージョン管理するときの基本的な手順は以下。

    1. リポジトリを作ってサーバにアップロード
    2. リポジトリからチェックアウト
    3. ファイル(.phpとか.cとか)を作成してコミット
    4. ファイル(.phpとか.cとか)を変更・作成してコミット
    5. ファイル(.phpとか.cとか)を・・・以下ずっと続く

    最初の2つをちょっとだけ詳しく書きます。

    TortoiseSVNリポジトリの作成
    TortoiseSVNリポジトリの作成

    中身が空っぽのフォルダを作って、そのフォルダを右クリック。
    「TortoiseSVN」→「リポジトリ作成」でリポジトリを作る。
    リポジトリの種類は「Native filesystem(FSFS)」を選択。
    フォルダ内にいくつかファイルが出来てるので全て /home/xxxxx/repo/test ディレクトリに入れる。(mkdirコマンドでディレクトリを作っておく)
    xxxxxは自分のIDに置き換えてください。

    これでリポジトリは作れたので次はチェックアウト。

    SVNチェックアウト
    SVNチェックアウト

    これからプロジェクトで使うフォルダを右クリックして「SVNチェックアウト」をクリック。

    SVNチェックアウト設定
    SVNチェックアウト設定

    リポジトリのURLに「svn+ssh://XXXXX@XXXXX.sakura.ne.jp/home/XXXXX/repo/test」と入力。
    xxxxxは自分のIDに置き換えてください。

    参考サイト

    1. putty→http://yebisuya.dip.jp/Software/PuTTY/
    2. TortoiseSVN→http://www.gside.org/Gentoo/subversion/subversion_client.html
    3. Totoise複数の鍵の使い分け→http://sfi.hamazo.tv/e1317475.html