2011年12月19日月曜日

とあるディレクトリ以下のファイルのURLをすべて取得する 最終夜

とあるディレクトリ以下のファイルのURLをすべて取得する


シリーズ最終夜です。




結果として、scan_image以外は検出した個数に変化は無く、599個配列に収まりました。
何が違うのかというと、ディレクトリもそのまま配列に入っているから,,,なのか?
scan_imageはディレクトリであれば配列に収めないという処理をしていますので、
その違いかと思われます。

実行速度については下記を参照してください。

スクリプト名 実行速度 配列カウント 
get_files 0.0091230869293213秒 599ファイル個数 
scan_image 0.0050339698791504秒 500ファイル個数
getFileList($dir_path) 0.00760817527771秒 599ファイル個数
getFileList($dir) 0.0069351196289062秒 599ファイル個数
glob3 0.0072281360626221秒 599ファイル個数
Linux find . 「-type f」有り 0.035500049591064秒 599ファイル個数
Linux find . 「-type f」無し 0.035002946853638秒 635ファイル個数


Linuxコマンド直打ちだけにいっちばん早いんじゃ?!なんて息巻いて実行。
あえなく玉砕。ダントツで遅かったです。


厳密にファイルパスだけ欲しい場合は、scan_imageがいいね!



あるディレクトリ以下のファイルのURLをすべて取得する

第一夜
http://sharzaqslab.blogspot.com/2011/12/url.html

第二夜
http://sharzaqslab.blogspot.com/2011/12/url2.html

第三夜
http://sharzaqslab.blogspot.com/2011/12/url3.html



とあるディレクトリ以下のファイルのURLをすべて取得する 第三夜


(とあるディレクトリ以下のファイルのURLをすべて取得する 2)からの続きです。

PHPには関数としてそのようなものは見つけられませんでした。
いろいろ検索をしていると、皆さんさまざまにアプローチしてらっしゃるのがわかります。

大まかに手法を分けると以下の2通りのようです。

scandir関数を使う
opendir関数を使う

scandir関数はPHP5から搭載された便利な関数ですね。
基本的にやってることはどれもほとんど代わりがないです。
実行速度の違いがあるのか幾つかの手法をテストしてみました。

検索対象の内容として、全文検索システム Namazu http://www.namazu.org/index.html.ja
ファイル群が対象です。



それと自作の関数とか他のテクニックも試してみたので、ご参考までに。
試したのは以下の通りです。


■get_files
PHP でサブディレクトリ内のファイル名をすべて取得 ≪ メモとか
http://wokamoto.wordpress.com/2011/09/22/get-all-files-name/


■scan_image
PHP ディレクトリ以下のファイルを再帰的に取得 - 130単位
http://d.hatena.ne.jp/deeeki/20100602/get_files_recursive
→画像だけでなくすべてのファイルを取得するように変更

■getFileList($dir)
指定したディレクトリ以下のファイルを取得(サブフォルダ内も) - pirokyunの日記
http://d.hatena.ne.jp/pirokyun/20080118/1200631677


■getFileList($dir_path)
ファイル名を再帰的に取得する関数 - handlename::blog
http://d.hatena.ne.jp/handlename/20101006/1286355256


■sharzaqオリジナル
・glob3(http://sharzaqslab.blogspot.com/2011/12/url.html
・cmd_find(http://sharzaqslab.blogspot.com/2011/12/url2.html


比較の結果は次の記事で!

とあるディレクトリ以下のファイルのURLをすべて取得する 第二夜

前の記事(あるディレクトリ以下のファイルのURLをすべて取得する 1)の続きです。




sharzaq謹製というにはおこがましいコードをご覧ください。





function cmd_find($file='.'){
$o = shell_exec('find ' . $file . ' -type f');
return $o;
}

こちらは配列では帰ってきません。ただの文字列が固まりで帰ってきます。


echo $oするとこんな感じ。
















preタグで囲むとこんな感じ。










使い勝手はよろしくないでしょう。この後、\n|\n|\r\n なんかで区切って配列に入れれば何とか。


次の記事では、さらに皆さんのアイデアを比較してみます。

とあるディレクトリ以下のファイルのURLをすべて取得する 第一夜

とあるディレクトリ以下のファイルのURLをすべて取得する。
こんな場面、あると思います。

PHP4もPHP5も共通で使えて、簡単で、早くてっていうコードを探しておりました。
自分でもいろいろ試行錯誤して作ってみたので晒します。

といってもたいしたこと無いですが、一つはPHPに搭載のglob関数を使うもの、もう一つはLinuxコマンドを実行する方法です。


2011年11月29日火曜日

[PHP]とあるファイルの文字コードを判定する

PHPで文字コードの判定を行う際、mb_detect_encodingをよく使います。
ベンリなんですが、いまいち判定の精度がよくありません。


それで、PHPに頼るのはやめて、linuxコマンド直打ちを利用します。


利用するコマンドは、「nkf」です。


以下のページを参照しました。
テキストファイルの文字コードを調べるには(nkf編) - @IT http://www.atmarkit.co.jp/flinux/rensai/linuxtips/980nkfguess.html
以下のように、nkfコマンドに--guessオプションを指定すれば文字コードを調べられる。
$ nkf --guess /media/winxp/test.txt
ISO-2022-JP
$ nkf --guess /media/winxp/test2.txt
Shift_JIS
$ nkf --guess ~/test3.txt
UTF-8
これを流用します。

$file に調べたいファイルのパスが入っているとして、
$enc = shell_exec('nkf --guess ' . $file);
とすれば、$encにそのファイルの文字コードが入ってやってきます。

いままで、ファイルを全部読み込んでmb_detect_encodingしてとか、
ファイルの扱いに関しちゃPerlがいいでって思い、perlスクリプトをどうやって使おうか迷ってました。
とても楽チンに解決できてとても、いいわぁ,,,

2011年8月16日火曜日

タイムゾーン変換プログラム

これいいです。
PHPでデスクトップアプリを作成できるツールを発見しましたので、テストを兼ねてサクッと作りました。
ちっさなオレオレツールを作るのには激しく便利な予感,,,

プログラムはexeを実行すればわかるでしょう。
テストなので対象のタイムゾーンは少なめです。
起動すると上のテキストボックスに、現在の時刻が表示されます。
変換対象の時刻(海外の時刻)を入力し、タイムゾーンを選び変換。
下に日本時刻に変換して表示されます。


ダウンロードする!

exeとdll両方ダウンロードして適当なフォルダに保存してください!


便利なツールを公開してくださっているヒラタさんに感謝。
ヒラタクリエイト - Hirata-Create
http://hirata-create.lar.jp/



2011年7月18日月曜日

[GAS] dailySummary関数について説明 ~今日の予定をGoogleカレンダーから取得しメールする~

メインのコードになります。


CalendarApp.getAllOwnedCalendars()で、所有するすべてのカレンダーを取得します。
getData()にカレンダー名を渡し、その日の予定をゲッツ。
MailApp.sendEmailで、全部のまとめをメール送信する。 


じつはこのスクリプトを使わなくても、その日の予定をメールしてくれる機能は、デフォルトで存在します。しかもグラフィカルでわかりやすい,,,


ただ、通知する時間を変更したり、送信先を変えたり柔軟に対応できるので公開しました。いやぁ、プログラムってほんっとにいいもんですね。


function dailySummary(){
    var r = CalendarApp.getAllOwnedCalendars();
    var num = r.length; 
    var allText = "";

    for(var i = 0; i< num ; i++){
        var g = r[i].getName();
        allText = allText + getData(g);
    }

    //メール送信部分
    var to = "(任意のメールアドレスを入れてください)";
    var subject = "[dairy]本日の予定";
    allText = "★本日の予定一覧です。\r\n" + allText;
  
    MailApp.sendEmail(to, subject, allText);
}

2011年7月13日水曜日

[携帯] 各社間SMS開通!

友人(ソフトバンク)からCメールが届き初めてそんなことになっていると気づきました。
料金はどうなっているのか、簡単にまとめましたので、備忘録的に晒し。
イーモバイル以外は送信3.15円、受信無料が多いですねぇ。

DOCOMO
http://www.nttdocomo.co.jp/service/communication/sms/charge/index.html
送信:1回あたり3.15円(送達通知の有無に関わらず)
受信:ショートメッセージの受信は無料です。

au
http://www.au.kddi.com/cmail/index.html
送信料:3.15円/回 (税込)
Cメール受信:0円

softbank(ホワイトプラン)
http://mb.softbank.jp/mb/price_plan/3G/white_plan/#price-system
ソフトバンク同士(送受信無料)
それ以外
送信:3.15円/通
受信:無料

イーモバイル
http://emobile.jp/charge/smartplan.html
送受信:SMS 2.1円/通

無料通話分が適用されるキャリアもあるのでご参考までに。

2011年7月9日土曜日

[GAS] getData関数について説明 ~今日の予定をGoogleカレンダーから取得しメールする~

2.それぞれのカレンダーで登録された予定を取得

マイカレンダーを3つ作成しています。

1.デフォルト
2.2番目作成
3.3番目作成

わかりやすい名前で作っています。
このうちのどれかのカレンダーの名前を渡されたときに
そのカレンダーの今日の予定を取得し、まとめてリターンをします。



まずはコード掲載


function getData(name){
    //開始時間を設定
    var d1 = new Date();
        d1.setHours(0);
        d1.setMinutes(0);
        d1.setSeconds(0);

    //終了時間を設定
    var d2 = new Date();
        d2.setHours(23);
        d2.setMinutes(59);
        d2.setSeconds(59);
 
    if (name != "" & name != "cancel"){
        var cal = CalendarApp.openByName(name);
        var data = cal.getEvents(d1,d2);
        var num = data.length;

        var allText = "";   //すべてのテキスト
        var s = "";  //開始時間
        var e = "";  //終了時間
        var t = "";  //予定のタイトル
        var d = "";  //予定の説明
        var i = 0;

        allText = "■" + name + "\r\n\r\n";

        for(i = 0; i< num ; i++){
            if (data[i]) {
                s = "・" + t2c(data[i].getStartTime()) + "~";
                e = t2c(data[i].getEndTime()) + "\r\n";
                t = "  " + data[i].getSummary() + "\r\n";
                d = data[i].getDescription();

                if(d){
                    d = "  " + d + "\r\n";
                }
                allText =  allText + s + e + t + d + "\r\n";
            }
        }
        return allText;
    }
}

~コード解説~

予定を取得するのは、「getEvents(d1,d2)」になります。
d1からd2までの時間の予定を取得します。
今日すべての予定なので、開始時間は0:00、終了時間は23:59にしています。

getEventsで取得したイベントのデータオブジェクトから、各種のデータを取得します。
イベントの各種データは以下のメソッドで取得できます。

開始時間→getStartTime()
終了時間→getEndTime()
タイトル→getSummary()
説明→getDescription()

時間に関しては前回説明した、t2c関数で任意のフォーマットに変換しています。

allTextにデータを追加していき、そのカレンダーから今日の予定をすべて取得したらリターンするようになっています。予定がなくても「予定なし」の意味を込めてカレンダー名のみリターンされます。

[GAS] t2c関数について説明 ~今日の予定をGoogleカレンダーから取得しメールする~

3.時間をフォーマットに沿って表示

いきなり順番無視ですが、簡単なところから解説します。
といってもこの部分はそのままですが、取得した日付データを
任意のフォーマットに変えてリターンします。

function t2c($t){
    return Utilities.formatDate(new Date($t),"JST","HH:mm");
}

Utilities.formatDateの解説

以下の引数を設定します。

 Utilities.formatDate(
     日付の元データ,
     タイムゾーン,
     フォーマット
 );

上記の例であれば以下の内容となります。

日付のデータとして→Fri Jul 08 19:00:00 PDT 2011 (←引数で与えられた日時)
タイムゾーン(日本時間を指定)→JST
時間表示→HH:mm

リターン(日本時間 24時間表記)→11:00

カレンダーから取得した日付データを、任意の形式で表示する時に利用します。

[GAS] 関数説明 ~今日の予定をGoogleカレンダーから取得しメールする~

 まずは全スクリプトを掲載します。解説は次回から!

function dailySummary(){
    var r = CalendarApp.getAllOwnedCalendars();
    var num = r.length; 
    var allText = "";

    for(var i = 0; i< num ; i++){
        var g = r[i].getName();
        allText = allText + getData(g);
    }

    //メール送信部分
    var to = "(任意のメールアドレスを入れてください)";
    var subject = "[dairy]本日の予定";
    allText = "★本日の予定一覧です。\r\n" + allText;
  
    MailApp.sendEmail(to, subject, allText);
}


function getData(name){
    //開始時間を設定
    var d1 = new Date();
        d1.setHours(0);
        d1.setMinutes(0);
        d1.setSeconds(0);

    //終了時間を設定
    var d2 = new Date();
        d2.setHours(23);
        d2.setMinutes(59);
        d2.setSeconds(59);
 
    if (name != "" & name != "cancel"){
        var cal = CalendarApp.openByName(name);
        var data = cal.getEvents(d1,d2);
        var num = data.length;

        var allText = "";   //すべてのテキスト
        var s = "";  //開始時間
        var e = "";  //終了時間
        var t = "";  //予定のタイトル
        var d = "";  //予定の説明
        var i = 0;

        allText = "■" + name + "\r\n\r\n";

        for(i = 0; i< num ; i++){
            if (data[i]) {
                s = "・" + t2c(data[i].getStartTime()) + "~";
                e = t2c(data[i].getEndTime()) + "\r\n";
                t = "  " + data[i].getSummary() + "\r\n";
                d = data[i].getDescription();

                if(d){
                    d = "  " + d + "\r\n";
                }
                allText =  allText + s + e + t + d + "\r\n";
            }
        }
        return allText;
    }
}


function t2c($t){
  // time2convert
    return Utilities.formatDate(new Date($t),"JST","HH:mm");
}

2011年7月7日木曜日

[GAS]dailySummary ~今日の予定をGoogleカレンダーから取得しメールする~

手始めに作ったのは「Googleカレンダーに登録したすべてのカレンダーからその日の予定をメールする」というものです。スクリプト名は「dailySummary」

このスクリプトは3つの関数に分けて作られました。
  1. すべてのカレンダーを取得
  2. それぞれのカレンダーで登録された予定を取得
  3. 時間をフォーマットに沿って表示 
とくに分ける必要もありませんでしたが、コードの見易さ重視で分けました。
肝心のコード類は次回以降掲載します。

Google Apps Script

・・・ Google Apps Script ・・・
Microsoft Officeに搭載されているVBAのごとく、Googleのサービスに自分でいろいろな機能をつけたり自動化したりできるサービスです。ちょっと試しにスクリプトを作りましたので、拙作ながらご紹介いたします。

ザ・シークレットサービス

大層ななまえですが、選択した文字列をシークレットウインドウ内で、 Google検索するというものです。 https://docs.google.com/open?id=0B58uK3aQr15IM0ItWk1WVnFUWnVleXJVWEhqUktCdw 1...