アーカイブ

  • [PHP]サムネイル

    同僚のハリネズミに依頼されてたような気がするのでアップしてみた。
    >>ハリネズミ
    CFシリーズに入れたょ。

    #*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
    #  saveImageFile
    #   [説明]
    #     イメージファイルのローカル保存、もしくはイメージ出力
    #   [パラメータ]
    #     $pImageUri[I] string
    #     ⇒イメージファイルのURI(http://形式でも、物理パスでも可)
    #     $pSaveFileName[I] string
    #     ⇒保存ファイルのファイルパス
    #       ※pSaveFileがtrueの場合に有効
    #     $pMaxWidth[I] integer
    #     ⇒保存時の最大の横幅( 0を指定するとそのままで、1以上の正数値を指定するとサムネイル可します。)
    #     $pDegrees[I] integer
    #     ⇒回転角度。確か時計回りで何度回転するかを指定
    #     $pSaveFile[I] boolean
    #     ⇒ファイルを保存するか否か、falseを指定するとそのままレスポンスとしてイメージ出力します。
    #   [返り値] mixed
    #     ⇒TRUE:     処理成功
    #       TRUE以外: 処理失敗
    #*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
    function saveImageFile(
        $pImageUri
      , $pSaveFileName
      , $pMaxWidth      = 0
      , $pDegrees       = 0
      , $pSaveFile      = TRUE
    ){
      $returnValue  = FALSE;
      $rsImage      = FALSE;
      $rsRotate     = FALSE;
      $rsNewImage   = FALSE;
      if( !extension_loaded('gd') && !extension_loaded('gd2') ){
        # 拡張モジュールのロードに失敗
        return $returnValue;
      }
      # サイズ情報の取得
      list( $imageWidth, $imageHeight, $imageType ) = @getimagesize( $pImageUri );
    
      #-----------------------------------------------------------
      # イメージファイルの読み込み
      switch( $imageType ){
        case IMAGETYPE_GIF:
          $rsImage = @imagecreatefromgif( $pImageUri );
          break;
        case IMAGETYPE_JPEG:
          $rsImage = @imagecreatefromjpeg( $pImageUri );
          break;
        case IMAGETYPE_PNG:
          $rsImage = @imagecreatefrompng( $pImageUri );
          break;
      }
      #-----------------------------------------------------------
      # イメージの回転
      if( $rsImage !== FALSE ){
        $rsRotate = @imagerotate( $rsImage, 360-$pDegrees, 0) ;
      }
      #-----------------------------------------------------------
      # リサイズイメージの作成
      if( $rsRotate !== FALSE ){
        # 回転後のイメージサイズの取得
        $imageWidth   = ImageSX($rsRotate);
        $imageHeight  = ImageSY($rsRotate);
        # リサイズ後のサイズを算出
        if( $pMaxWidth == 0 or $imageWidth <= $pMaxWidth ){
          # そのまま
          $newWidth   = $imageWidth;
          $newHeight  = $imageHeight;
        }else{
          # 最大サイズより大きい場合 => 縮小
          $newHeight  = intval(( (float)$pMaxWidth / (float)$imageWidth ) * (float)$imageHeight);
          $newWidth   = $pMaxWidth;
        }
        # 空画像を作成
        if( function_exists("imagecreatetruecolor") ){
          $rsNewImage = @imagecreatetruecolor( $newWidth, $newHeight );
        }else{
          $rsNewImage = @imagecreate( $newWidth, $newHeight );
        }
        # サンプリングしなおす
        if( function_exists("imagecopyresampled") ){
          $returnValue = @imagecopyresampled( $rsNewImage, $rsRotate, 0, 0, 0, 0, $newWidth, $newHeight, $imageWidth, $imageHeight );
          if( $returnValue === FALSE ){
            $returnValue = @imagecopyresized( $rsNewImage, $rsRotate, 0, 0, 0, 0, $newWidth, $newHeight, $imageWidth, $imageHeight );
          }
        }else{
          $returnValue = @imagecopyresized( $rsNewImage, $rsRotate, 0, 0, 0, 0, $newWidth, $newHeight, $imageWidth, $imageHeight );
        }
      }
      if( $pSaveFile ){
        #-----------------------------------------------------------
        # イメージファイルの保存
        if( $returnValue !== FALSE && $rsNewImage !== FALSE ){
          switch( $imageType ){
            case IMAGETYPE_GIF:
              $returnValue = @imagegif( $rsNewImage, $pSaveFileName );
              break;
            case IMAGETYPE_JPEG:
              $returnValue = @imagejpeg( $rsNewImage, $pSaveFileName, 100 );
              break;
            case IMAGETYPE_PNG:
              $returnValue = @imagepng( $rsNewImage, $pSaveFileName );
              break;
          }
        }
      }else{
        #-----------------------------------------------------------
        # イメージファイルの表示
        if( $returnValue !== FALSE && $rsNewImage !== FALSE ){
          switch( $imageType ){
            case IMAGETYPE_GIF:
              header("Content-type: image/gif");
              $returnValue = @imagegif( $rsNewImage );
              break;
            case IMAGETYPE_JPEG:
              header("Content-type: image/jpeg");
              $returnValue = @imagejpeg( $rsNewImage, "", 100 );
              break;
            case IMAGETYPE_PNG:
              header("Content-type: image/png");
              $returnValue = @imagepng( $rsNewImage );
              break;
          }
        }
      }
      #-----------------------------------------------------------
      # リソースの解放
      @imagedestroy($rsImage);
      @imagedestroy($rsRotate);
      @imagedestroy($rsNewImage);
      return $returnValue;
    }
    
    2010年 2月 26日 | Filed under PHP
    タグ:
  • [PHP]file_get_contents で UserAgent を指定

    PHPのfile_get_contents()関数をそのまま使用すると、
    『PHP/x.x.x』という素直なユーザエージェントが相手に通知されます。

    それが気になる時もあって良いじゃないですか。

    ということで、ユーザエージェントを変更できるようにしてみた。
    (ついでにリファラーも。。。)
    stream_context_create()がポイントになるのだけど、考えてみたらPOST版もさっくり出来そうな気が・・・。
    それはさておき、今回はGET版でのテンプレートです。

    function _file_get_contents(
        $url
      , $referer    = ""
      , $useragent  = "Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7"
    ){
      # User-Agentを指定
      $header = "User-Agent: ".$useragent."\r\n";
      # Refererを指定
      if( strlen($referer) > 0 ){
        $header .= "Referer: ".$referer."\r\n";
      }
      $options = array(
                  "http"=> array(
                          "method" => "GET"
                        , "header" => $header
                      )
                  )
                  ;
      return @file_get_contents( $url, FALSE, stream_context_create($options) );
    }
    

    使い方はこんな感じ。

    echo _file_get_contents(
                "http://www.google.com/"
              , "http://jp.msn.com/"
              , "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"
            );
    

    ちなみに、POSTでのcontextの作成例はこんな感じ。

      $context = stream_context_create(array(
        'http' => array(
          'method'  => 'POST',
          'header'  => sprintf("Authorization: Basic %s\r\n", base64_encode($username.':'.$password)).
                       "Content-type: application/x-www-form-urlencoded\r\n",
          'timeout' => 5,
        ),
      ));
    

    当たり前といえばそうだけど、basic認証でも行けちゃうんですね♪
    すばらしい♪

    2010年 2月 26日 | Filed under PHP
    タグ:
  • [PHP]メール受信プログラムのサンプル

    だいぶ固まってきたので、テンプレート化してみた。
    メールの受信サーバーから、パイプライン処理等で、PHPプログラムを直接起動し、標準入力(STDIN)経由でメールデータを受信するサンプルです。
    細かい制御はしてませんが、ほぼこれでさっくり動くはず。

    require_once 'Mail.php';
    require_once 'Mail/mimeDecode.php';
    #--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--
    # 以下、サブ関数の定義
    #--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--
    # デコード済みMIMEヘッダーよりメールアドレスを抽出する。
    function _extractMailAddress(
        $pDecodedMimeHeader
    ){
      $returnValue = FALSE;
      if(
        eregi(
            "[-!#$%&\'*+\\.=/0-9A-Z^_`a-z{|}~]+@[-!#$%&\'*+\\/0-9=?A-Z^_`a-z{|}~]+\.[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+"
          , $pDecodedMimeHeader
          , $regs
          ) ){
        # 行頭・行末の空白削除
        $returnValue = mb_ereg_replace("^[  ]*(.*)[  ]*$", "\\1", $regs[0]);
      }
      return $returnValue;
    }
    # 受信メールをパースします。
    function _parseMail(
       &$pDecodedMimeStructure
     , &$pResultSet
    ){
      #--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--
      # message-idを取得する
      $pResultSet["message-id"] = $pDecodedMimeStructure->headers["message-id"];
      $pResultSet["message-id"] = mb_convert_encoding( $pResultSet["message-id"], mb_internal_encoding(), "auto" );
      $pResultSet["message-id"] = str_replace( array("<", ">"), "", $pResultSet["message-id"] );
      #--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--
      # fromを取得する
      $pResultSet["from"] = $pDecodedMimeStructure->headers["from"];
      $pResultSet["from"] = mb_decode_mimeheader( $pResultSet["from"] );
      $pResultSet["from"] = mb_convert_encoding( $pResultSet["from"], mb_internal_encoding(), "auto" );
      $pResultSet["from"] = _extractMailAddress( $pResultSet["from"] );
      #--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--
      # toを取得する
      $pResultSet["to"] = $pDecodedMimeStructure->headers["to"];
      $pResultSet["to"] = mb_decode_mimeheader( $pResultSet["to"] );
      $pResultSet["to"] = mb_convert_encoding( $pResultSet["to"], mb_internal_encoding(), "auto" );
      $pResultSet["to"] = _extractMailAddress( $pResultSet["to"] );
      #--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--
      # subjectを取得する
      $pResultSet["subject"] = $pDecodedMimeStructure->headers["subject"];
      $pResultSet["subject"] = mb_decode_mimeheader( $pResultSet["subject"] );
      $pResultSet["subject"] = mb_convert_encoding( $pResultSet["subject"], mb_internal_encoding(), "auto" );
      #--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--
      # 日付を取得する
      $pResultSet["date"] = strtotime($pDecodedMimeStructure->headers["date"]);
      #--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--
      # bodyと添付ファイルをパース
      $pResultSet["body"] = "";
      $pResultSet["attachments"] = array();
      switch(strtolower($pDecodedMimeStructure->ctype_primary)){
        # シングルパート(テキストのみ)
        case "text":
          $pResultSet["body"] = $pDecodedMimeStructure->body;
          $pResultSet["body"] = mb_convert_encoding( $pResultSet["body"], mb_internal_encoding(), "auto" );
          break;
        # マルチパート
        case "multipart":
          foreach($pDecodedMimeStructure->parts as $part){
            switch(strtolower($part->ctype_primary)){
              # テキスト
              case "text":
                $pResultSet["body"] = $part->body;
                $pResultSet["body"] = mb_convert_encoding( $pResultSet["body"], mb_internal_encoding(), "auto" );
                break;
              # 画像
              case "image":
                $attachment = array();
                $attachment["mime_type"]  = $part->ctype_primary."/".$part->ctype_secondary;
                $attachment["filename"]   = mb_convert_encoding( $part->ctype_parameters["name"], mb_internal_encoding(), "auto" );
                $attachment["binary"]     = $part->body;
                $pResultSet["attachments"][] = $attachment;
                break;
              # 其れ以外
              default:
                break;
            }
          }
          break;
        # 其れ以外
        default:
          break;
      }
      #--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--
      # bodyに含まれている改行コードの統一
      $pResultSet["body"] = mb_eregi_replace("(\r\n|\r)","\n",$pResultSet["body"]);
      #--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--
      # ここで処理終了
      return TRUE;
    }
    
    #--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--
    # 以下、メイン処理
    #--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--
    # 言語設定、内部エンコーディングを指定する
    mb_language("japanese");
    mb_internal_encoding("eucJP-win");
    mb_regex_encoding(mb_internal_encoding());
    #--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--
    # メールソースを読み込む
    $source = @file_get_contents("php://stdin");
    if( !empty($source) ){
      #--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--
      # メールをMIMEデコードする
      $decoder = new Mail_mimeDecode( $source );
      $params = array();
      $params["include_bodies"] = TRUE;               # ボディを解析する
      $params["decode_bodies"]  = TRUE;               # ボディをコード変換する
      $params["decode_headers"] = TRUE;               # ヘッダをコード変換する
      $structure = $decoder->decode( $params );
      #--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--
      # メールデータの解析
      $maildata = array();
      _parseMail( $structure, $maildata );
    
      print_r($maildata);
    }
    
    2010年 2月 22日 | Filed under PHP
  • [PostgreSQL]カーソル サンプル

    あまりにもよく使用するので、テンプレート化してみた。

    DECLARE
    --#-------------------------------------------------------------------
    --# 使用変数の定義
    --#-------------------------------------------------------------------
        -- アンバウンドカーソル
        cursor_mydata                       refcursor;
        -- フェッチした内容を格納する為のレコード
        rec_nowdata                         record;
    BEGIN
    
    --#-------------------------------------------------------------------
    --# カーソルオープン
    --#-------------------------------------------------------------------
      OPEN cursor_mydata FOR
      --#--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--
      --# 以下に、読み込み対象となるSELECT文を定義(ORDER BY句は必須)
      --# <Todo>
        SELECT
            table_dummy.pkey
        FROM
          table_dummy
        ORDER BY
            table_dummy.pkey
      --# </Todo>
      --#--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--
        ;
    
    --#-------------------------------------------------------------------
    --# 以下、カーソルフェッチループ
    --#-------------------------------------------------------------------
      LOOP
      --# 現在のカーソルを指定レコードに格納(フェッチする)
        FETCH cursor_mydata INTO rec_nowdata;
        IF NOT FOUND THEN
        --# 最後まで読み込み終わればループ終了
          EXIT;
        END IF;
      --#--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--
      --# 以下に、現在行データに対する処理を記述
      --# <Todo>
    
      -- ※ rec_nowdata.pkey という感じで、レコードのカラムを使用できます。
    
      --# </Todo>
      --#--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--
      END LOOP;
    
    --#-------------------------------------------------------------------
    --# カーソルクローズ
    --#-------------------------------------------------------------------
      CLOSE cursor_mydata;
    
    END
    
    2010年 2月 19日 | Filed under PostgreSQL
  • 婚約者の公式 – Fiancee Formula -

    (「絶対結婚したい年齢」-「結婚を現実的に考え始めた年齢」)* 0.368 +「結婚を現実的に考え始めた年齢」=プロポーズを始めるべき年齢

    オーストラリアの数学者トニー・ドゥーリー氏がプロポーズを始めるにふさわしい時期を計算する「Fiancee Formula(婚約者の公式)」を発表されたことを、TOKYO UNITED STAFF blogが伝えています。
    ロイターの記事によれば「当たる確率は37%で、気弱な男性が結婚の約束をすべきではない時期を知るためにも使える」ということで、これがバレンタインにふさわしい方程式としてあちこちで取り上げられている模様。

    この方程式でいくと、結婚を現実に考え始めた年から、あと何年で絶対結婚したいのか、その期間の約三分の一の節目にプロポーズしたらいいってことだよね。
    もう少し具体的に言えば、3年後には結婚したいと思えば、1年後にはプロポーズしときなさいってことですかね。

    おいらは急だったけど、
    結婚は勢いだ!というヒトは多いけど、
    実際、準備を考えればそのくらい用意周到な期間があったほうがほんとに良いと思う今日この頃。

    2010年 2月 19日 | Filed under 気になる時事ネタ
  • ウィルコム 会社更生法適用申請 負債総額は2060億円

    ウィルコムユーザですが、何か・・・。

    ショックすぎます。
    一時、学生の間で流行ってた気がしましたが、それでも無理だったんですね。

    経営再建中のPHS事業者、ウィルコム(本社・東京)は18日、自力再建を断念し、東京地裁に会社更生法の適用を申請した。負債総額は09年末時点で約2060億円。ウィルコムは同日、官民共同出資の企業再生支援機構に正式に支援要請し、来週中に支援が決まる見通しだ。ウィルコムは約430万人が利用するPHS事業を継続しながら早期の再建を目指す。
    民間信用調査会社によると、通信事業者の破綻(はたん)としては、05年の平成電電(負債総額1200億円)を上回り、過去最大規模となった。
    ウィルコムは、ソフトバンク、国内投資ファンドなどから出資を受ける方向で交渉を進めており、支援機構の支援を前提とした事前調整型の法的整理になる見通し。支援機構の支援は日本航空に続き2例目。
    ウィルコムは94年設立の旧DDIポケットが前身の国内唯一のPHS事業者。携帯電話通話料の低下で顧客離れが起き、07年末から加入者が減少していた。09年3月期連結決算は66億円の経常黒字を確保したものの、過去の設備投資などで同年3月末時点で1285億円の有利子負債を抱え、経営の重荷になっていた。
    同年9月には私的整理の一つである事業再生ADR(裁判外紛争解決手続き)を申請。取引銀行と再建策を協議してきたが、債権放棄の割合を巡って調整が難航したため、より透明性の高い法的整理で再建を図ることにした。ADR手続きは18日で打ち切られた。
    18日、都内で会見した久保田幸雄社長は「PHSが優位だった点が携帯電話でもカバーできるようになった」と、業績悪化の理由を説明した。さらに、破綻の責任を取って「全取締役が辞職願を提出した」と報告した。ただし久保田社長は管財人として会社に残り、更生計画の策定に関与する。
    Yahoo!ニュース
    2010年 2月 18日 | Filed under 気になる時事ネタ
  • 中山さん

    もうすぐ戌の日ということで、中山寺に行ってきました。
    梅田から阪急宝塚線で急行に乗って、約40分で中山駅に到着。
    駅から徒歩5分も掛からずに、中山寺はあります。

    妊婦さんに優しく、階段の横にエスカレータがついてて、他にもあるのだけど、ハイテクなお寺に少し吃驚。

    相方と子供の無事を祈り、参拝は終了。
    帰りに露店で売ってた、ちりめん山椒がうまかったです。
    小分けできるサイズで売ってたのも素敵だし。

    ほんと無事出産してくれたらいいな。


    ↑の写真は、Myマザーと相方の参拝様子。
    隠し撮りだったので、後姿ではございますが・・・(笑

    2010年 2月 15日 | Filed under 私事
Archive for 2010年 2月