2014年6月30日月曜日

お引っ越し

移動しました。


http://tomofumi.blog.jp/

移動の理由ですが、bloggerは使いづらいです。

2014年5月9日金曜日

node.jsでExpressコマンドが通らない

日本のサイトで検索したけど、解決には至らず。。。

海外のサイト見たらちゃんと解決方法あった。

StackOverflow

sudo npm install -g express-generator

やり方が悪いのかと途中SSD消去して再度OS入れなおして~などやってしまった。。

1回のコンパイルに4時間かかるので、ここで2日かけてしまった。勿体ない。

2014年5月8日木曜日

Raspberry PI+Node.js 備忘録

自宅にRaspberry PI TypeBが届いた。
Debian系ディストリビューションのRaspbianをヨドバシで買ったSDカードに焼いて起動までは問題なく完了

その後、

# sudo apt-get update
# sudo apt-get upgrade
# sudo apt-get install vim


で、Node.js

こちらのブログを参考に最新バージョンのインスコに挑戦してみる。

# wget http://nodejs.org/dist/v0.11.13/node-v0.11.13.tar.gz
# tar -zxf node-v0.11.13.tar.gz
# cd node-v0.11.13
# ./configure

で、ここで妙なエラー

gyp: name 'arm_version' is not defined while evaluating condition 'arm_version==7' in /home/pi/node-v0.11.13/deps/v8/tools/gyp/v8.gyp while loading dependencies of /home/pi/node-v0.11.13/node.gyp while trying to load /home/pi/node-v0.11.13/node.gyp

エラー文言をグーグル先生で調べてみたらStackOverflowに同じ現象に対する質問と解答があった。
解答にしたがってcommon.gypiの14行目に下記パラメータを追記


'arm_version%' : '1',



今度はうまくいった。
それにしてもmakeの時間かかりすぎ。
4時間とか・・・。

2013年6月12日水曜日

[PHP] ディレクトリ内のファイル一覧を取得する

良くある事なので調べる人も多いこのタイトル

例えば、こんなディレクトリに対してファイル一覧を取得する場合
/tmp
├ sample.txt
└ sample2.txt

調べるとこんなソースがヒットする。
<?php $dir = opendir( '/tmp' ); while( ( $file = readdir( $dir ) ) !== FALSE ){     echo '/tmp/'.$file."\n"; } closedir( $dir ); ?>
# 結果は以下のようになる
. .. sample.txt sample2.txt
参考:http://cos31.hatenablog.jp/entry/20071112/1194898338 こっちの場合、カレント(.)と相対パス(..)が取得されてしまうので、正規表現などでフィルタリングする必要がある。 今日、会社の同僚からもうちょいスッキリかける方法を教えてもらったのでメモ
<?php foreach( glob('/tmp/*') AS $file ){     echo $file."\n"; } ?>
# 結果は以下のようになる。
/tmp/sample.txt /tmp/sample2.txt
こんな便利な関数があるとは思わなかった。 簡単なパターンマッチにも対応しているので、/tmp/*.txt みたいな抽出も可能。 こちらは絶対パスで返ってくるのでファイル名だけを取得したいのであればbasenameを噛ませる必要があるけど。。。 どっちが使いやすいかは人それぞれだと思う。

2013年4月4日木曜日

数字⇒漢字変換

やってみたら意外とむずい。
それより、ブログサイトのAdsence通らないのでへこみ中。
他のブログサイトにしようかな。。

2013年2月18日月曜日

Application Cache用のサンプルソース

Application Cacheに関してはあまり纏まった記事が無い。
色々調べながら作成したソースを書いてみた。

JavaScriptアップデートチェッカー
 //var ua = navigator.userAgent;  
 //if(!/iPad/.test(ua) && !/OS 4/.test(ua)){  
 // applicationCache未実装のIE9以下やオフライン時は無視する。  
 if( window.applicationCache && navigator.onLine) {  
 var div;  
 var making = true;  
 var cacheStatusValues = [];  
 cacheStatusValues[0] = 'uncached_リソースをキャッシュしていない状態である';  
 cacheStatusValues[1] = 'idle_必要な処理は無く、待機状態である';  
 cacheStatusValues[2] = 'checking_更新データが存在するかチェック中である';  
 cacheStatusValues[3] = 'downloading_更新を検出したので更新データをダウンロード中である';  
 cacheStatusValues[4] = 'updateready_更新データをダウンロード済みであり、キャッシュの更新が可能である';  
 cacheStatusValues[5] = 'obsolete_マニフェストファイルへのアクセスに失敗したので、アプリケーションキャッシュを削除した状態である';  
 var cache = window.applicationCache;  
 cache.addEventListener('cached', logEvent, false);  
 cache.addEventListener('checking', logEvent, false);  
 cache.addEventListener('downloading', logEvent, false);  
 cache.addEventListener('error', logEvent, false);  
 cache.addEventListener('noupdate', logEvent, false);  
 cache.addEventListener('obsolete', logEvent, false);  
 cache.addEventListener('progress', logEvent, false);  
 cache.addEventListener('updateready', logEvent, false);  
 function logEvent(e) {  
   var message;  
   message = 'applicationCacheイベント: ' + e.type;  
   message+= ', ステータス: ' + cacheStatusValues[cache.status];  
   if (e.type == 'error') {  
     message+= ' (マニフェストファイルに、おそらく構文エラーがあります)';  
   }  
   console.log(message);  
      console.log(e.type+'' == 'progress');  
      if( e.type+'' == 'progress' && making ){  
           making = false;  
           div = document.createElement('div');  
           style = 'position:absolute;top:0px;left:0px;width:'+ screen.width + 'px;height:'+screen.height + 'px;background-color:#000;';  
           div.setAttribute('style', style );  
           div.setAttribute('id'  ,'loader');  
           document.getElementById('wrap').appendChild(div);  
      }  
      if( e.type+'' == 'noupdate' && making == false ){  
           document.removechild(document.getelementbyid('loader'));  
           making = true;  
      }  
 //*/  
 }  
 cache.addEventListener('updateready',function(){  
 if(confirm("このサイトの最新バージョンが利用可能です。アップデートしますか?")){  
                     cache.swapCache();  
                     // 既にOffline Cacheがあるので、リロードは高速  
                     window.location.reload();  
 }  
 },false);  
 setInterval(function(){cache.update()}, 10000);  
 }  
 //}  

manifestファイルについて
色々なサイトで共通しているのは拡張子をmanifestにしてhtaccessをうんたらって書いてあるけど、実際は拡張は何でも良い模様
事実、こんなコードでも普通にmanifestとして動作した。
manifest.php
 <?php  
 header('Content-Type: text/cache-manifest; charset=utf-8');  
 echo <<< EOF  
 CACHE MANIFEST  
 # version 20121121aaaaaaaaaaaa  
 CACHE:  
 #キャッシュするリソース  
 $dirlist = array(  
      'img',  
      'css',  
      'js',  
      'xml'  
 );  
 foreach( $dirlist as $value ){  
   $dir = opendir( realpath( dirname(__FILE__) . "/{$value}" ) );  
   while( $file = readdir( $dir ) ){  
     if( !preg_match('/^\..*/', $file ) ){  
       echo "./{$value}/{$file}\n";  
     }  
   }  
   closedir($dir);  
 }  
 ?>  
 NETWORK:  
 #キャッシュしないリソース  
 #外部ドメインのリソースはすべて記述する(すべての場合は、ワイルドカード *)  
 FALLBACK:  
 #代替リソース  

html側

<!DOCTYPE html>
<html manifest="manifest.php">
.....

JavaScriptで月末日を求める関数

昔、OKWaveにいたbabuさんのサイトで一緒に作ったコード
「ゴミ箱」という名前のサイトに置かれているのがちょっと悲しい。
function getMatubi(y, m) {
    return (m^m>7|30)+(m==2)*~(y%(y%100>0?4:400)>0);  
 }  
JavaScriptだと自動キャストするのでそれをうまく使ってショートコーディングしたコードだけど、これよりも短いコードは僕の頭だと考え付かないです。
昔の頭の柔らかさが懐かしい。。