2012年1月13日金曜日

再帰的ディレクトリ配下のファイル一覧をリストアップ

再帰的ディレクトリ配下のファイル一覧をリストアップ、サブフォルダも含むが、出力はフラットのファイル一覧のハッシュ配列
キーはファイルの最後更新時間、値はファイル名。
注意、更新時間全く一緒のファイルが存在したら、
ファイル名は常に上書きされて、最後のファイルのみ残す形になる!

$dir = "/test";  
$fs = lastestFiles($dir, true);
print_r($fs);

function lastestFiles($dir,$init = false)
{
    $root = scandir($dir);
    static $result = array(); //staticで宣言すること
    if($init){
      $result = array(); //外部から呼ばれた時はstatic変数を初期化する
    }
    foreach($root as $value)
    {
        if($value === '.' || $value === '..') //これはスキップ
        {
          continue;
        }
        if(is_file("$dir/$value")) //ファイルならstaticハッシュに入れる
        {
          $result[filemtime("$dir/$value")]=$value;
          continue;
        }
        lastestFiles("$dir/$value"); //サブフォルダなら再帰する
    }   
    return $result;   
}

再帰的ディレクトリ配下すべてのファイル一覧、サブフォルダーの中身も含む、構造のまま取得

$dir = "/mp3";
$fs = listFiles($dir);
p($fs);


function listFiles($dir) 
{ 
    $root = scandir($dir); 
    foreach($root as $value) 
    { 
        if($value === '.' || $value === '..') {continue;} 
        if(is_file("$dir/$value")) {$result[]="$dir/$value";continue;} 
        if(is_dir("$dir/$value")) {$result[] = listFiles("$dir/$value");continue;} 
    } 
    return $result; 
} 

function p($v){
  print "
";
  print_r($v);
  print "
"; }

2012年1月12日木曜日

Excel97ではUnprotectがエラーでる

Office2007で開発したVBAをOffice97にも動くようにして欲しい....といわれて、仕方なくexcel97を借りてテストする(今時97を手に入れられるだけでもすごいよね)
見事エラーがでした!
"Run-time error '1004': Method 'Unprotect' of object '_worksheet' failed"
単純にworksheet.Unprotectのところからエラーが発生してびっくりしました。オブジェクトブラウザーで調査したらちゃんとworksheetオブジェクトはUnprotectメッソドあります、何か悪かったか全く検討もつかない。

早速G先生に聞くことにした、英語圏で同じ悩みを抱えている人を見つけた。
http://www.xtremevbtalk.com/showthread.php?t=98712

解決策は(汚いけど)これ:
  myWorkSheet.Range("A1").Activate  '←これを追加、任意のセルを選択してからunprotectを実行
  myWorkSheet.Unprotect  '本来ならここでエラーがでる
以上


2012年1月10日火曜日

Google Docsを同期できるソフトの紹介

便利なツールの紹介です。

ツール名:
syncdocs

効果:
・Google Appsのドキュメントをローカルで同期することによって、本来ブラウザーでしかアクセスできないDocsをローカルディレクトリのよ
うに簡単にアクセスできる。
・Google Docsとローカルミラーディレクトリ双方に加えた変更(追加・編集・削除)はすべて同期されるので、とても便利
・削除は気をつけてください。誤削除されでもDocsのゴミ箱から復旧できる。
・無料版は上限10,000ファイルの制限があるそうです。⇒十分足りると思います。

インストルとセットアップは簡単、アカウントとパスワードを入れるだけ。
デフォルトのローカルミラーディレクトリは「\My Documents\My Google Docs」です。

Google製のアプリではなく3rd party製ですが、PCWolderなどに紹介されたので個人的におすすめしたいです。

ここからダウンロード:
http://www.syncdocs.com/download-syncdocs/
残念ですが、まだ日本語化されたない

追伸:
ここで日本語版ダウンロードできるだそうです、検証はしていない。
http://sourceforge.jp/projects/sfnet_syncdocs/

2012年1月3日火曜日

PHPのif分岐のもう一種書き方、よくHTMLで利用する

PHPのif分岐のもう一種書き方。"{"じゃなく":"
<?php if($hi=="hello"): ?>
Hello
<?php elseif($hi=="good morning"): ?>
I say: <?php echo $hi; ?>
<?php else: ?>
Good Night
<?php endif; ?>

2011年12月30日金曜日

前回(サーバからcsvを複数取得する)の続きに、取得したcsvをDBにinsertする

app/libの下にprice_importer.rbを作成し、app/で実行する

$ ruby script/runner PriceImporter.execute

以下の内容
require 'csv'
class PriceImporter
  class << self
    def execute()
      begin
          result = system("/path/to/script/getfile.sh")  #←<a href="http://kagen88.blogspot.com/2011/12/shelllftp.html">前回作成したshellスクリプト</a>
          print result
          Dir::glob("/path/to/data/*.csv").each {|f|  #←取得したcsvファイルを保存する場所の(すべての?)csvをループ
            puts "#{f}: #{File::stat(f).size} bytes"  #←サイズを表示してみる
            cf=File.open(f,"r")  #←開く
            buf=cf.read()  #←読む
            @parsed_file = CSV::Reader.parse(convertSjis2UTF8(buf))  #←CSVハッシュに格納、その前にsjisをutf8に
            @parsed_file.shift  #←最初のタイトル行をスキップ
            @parsed_file.each  do |row|
              pd = Product.find_by_code(row[0])  #←既存のテーブルモデルを使って、コードの有無を確認
              if pd
                Price.delete_all "pd_id = " + pd.id.to_s + " AND base_date_on = '" + row[4] + "'"  #←上書きしたいので、一致したレコードを削除
                p = Price.new
                p.pd_id = pd.id
                p.base_date_on = row[4]
                p.price = row[5]
                p.save  #←インサート
              else
                RAILS_DEFAULT_LOGGER.debug("コード(" + row[0] + ")がproductsテーブルに存在しない。ご確認ください。")
                puts "コード(" + row[0] + ")がproductsテーブルに存在しない。ご確認ください。"
              end
            end
          }
      rescue => e
        RAILS_DEFAULT_LOGGER.debug(e)
        raise
      end
    end
    def convertSjis2UTF8(val)←utf8変換
      val.kconv(Kconv::UTF8, Kconv::SJIS) unless val.blank?
    end
  end
end
以上

パスワードを埋め込みのshellスクリプト。lftpで複数ファイルをダウンロード

パスワードを埋め込みのshellスクリプト。lftpで複数ファイルをダウンロード。
sftpは必要(通常ある)、lftpがなければyumでインストル

$ yum install lftp

ダウンロードするファイル名はyyyymmddのワイルドカードですが,日付の正確性はチェックしない。
以下スクリプトの内容:

#!/bin/bash
#ローカル保存フォルダー
SAVE_FILE_DIR="~/downloaded"

#今日の日付のyyyymmddファイル、不採用なのではコメントアウト
#TARGET_FILE="DATA_$(date "+%Y%m%d").csv"

#ファイル名がDATA_yyyymmdd.csvのファイルをすべて
TARGET_FILE="DATA_[1-2][0-9][0-9][0-9][0-1][0-9][0-3][0-9].csv"

HOST=myhost
ACCOUNT=user
PASSWORD=pass

#まず既に存在していたら削除する
rm -f ${SAVE_FILE_DIR}/${TARGET_FILE}

#sftからダンロード
lftp -u ${ACCOUNT},${PASSWORD} sftp://${HOST} <<__LUCEN
lcd ${SAVE_FILE_DIR}
mget ${TARGET_FILE}
quit
__LUCEN