Home

うのらぼ。

【PHP】ディレクトリを削除しようとしたらはまった

ファイルを書き出すスクリプトを作ってる際、 既に書き出し用のフォルダが存在していたらそのディレクトリを削除する っていう関数を作ろうと思ったらまんまとはまったのでメモ。

まずはここを参考にディレクトリ削除の関数を作ってみる。

PHP:ディレクトリを削除する|STUDIO WING .lib

  function delDir($path){
    if($handle = opendir($path)){
      while($item = readdir($handle)){
        if($item != '.' && $item != '..'){
          if(is_dir("$path/$item")){
            delDir("$path/$item"); //再帰
          }else{
            unlink("$path/$item");
            echo "...";
          }
        }
      }
      echo "<br/>";
    }
    closedir($handle);
    rmdir($path);
  }

とりあえずこれで特に問題なく動くかと思われたものの、 数字のみ(0~の連番)のディレクトリだけ何故か削除されない模様。 色々調べてるうちに下記のエントリに行き着いた。

ディレクトリ内のファイル一覧を取得する|Affirmative Way

正しくは以下のように取得してやる PHP: readdir – Manualより引用 警告 この関数は論理値 FALSE を返す可能性がありますが、FALSE として評価される 0 や “” といった値を返す可能性もあります。詳細については 論理値のセクションを参照してください。この関数の返り値を調べるには ===演算子 を使用してください。

ということなので下記のように書き換え。

  function delDir($path){
    if($handle = opendir($path)){
      while(false !== ($item = readdir($handle))){ //!== ってしないとディレクトリ名が"false"になることもある
        if($item != '.' && $item != '..'){
          if(is_dir("$path/$item")){
            delDir("$path/$item"); //再帰
          }else{
            unlink("$path/$item");
            echo "...";
          }
        }
      }
      echo "<br/>";
    }
    closedir($handle);
    rmdir($path);
  }

これで無事削除完了。 文字列 ”0” も “==” だと false なのよね。。

というわけで2011年初エントリ。

【Design】Photoshopで書き出した後サイズが増える(初歩的)

自分用メモ

Photoshop で Web用に保存をしたとき、 Photoshop 上で「このサイズで書き出すよ!」って言ってるファイルサイズと 実際に書き出されるファイルサイズにあまりにも違いがある場合、 「Web およびデバイス用に保存」ウィンドウの中の 「メタデータ」の部分をなしにする。

書き出す際に著作権情報等を付加してしまうため、ファイルサイズが増えてしまう、というわけ。

ASSHUKUセヨ!!

【PHP】ファイルをダウンロードするときに確認ダイアログを表示する

JPEGとかPNGとかの画像をダウンロードさせるページを作っていたのですが、 aタグのhrefに画像のパスを書いても、対象の画像に遷移して困ってしまいました。 ZIP等をダウンロードするときみたいに確認ダイアログを出したかったので、 色々調べてみました。

perlやPHPでファイルのダウンロード確認ダイアログを表示させる方法 | perl/CGI | 阿部辰也のブログ――人生はひまつぶし。

ここのPHPのソースを一部改変してJSからドーンします。

&lt;?
$files = $_GET;
$src = &quot;./hoge/{$files['filename']}&quot;;</p>

<h1>HTTPヘッダを送信</h1>

<p>if(file_exists($src)){
header(&quot;Content-type: application/octet-stream&quot;);
header(&quot;Content-Disposition: attachment; filename=\&quot;{$files['filename']}\&quot;&quot;);</p>

<h1>出力</h1>

<p>readfile($src);
}else{
  header(&quot;Location: ./fuga.html&quot;);
}
?&gt;

header(“Content-Disposition: attachment; filename=\”{$files['filename']}\”"); ここの記述でダイアログを表示させる(ついでにファイル名を決めることができる)ようですが、 セキュリティ的に問題もある模様。 [Studying HTTP] HTTP Header Fields

あと、ファイルによってMIMEタイプ(Content-Type)が異なるので、それもなんとかしなければならず。 PHP の mime_content_type() を使おうとするも非推奨とのことで断念。 とりあえず application/octet-stream とすることで回避(と言えるのかわかりませんが)しました。

で、このPHPをJSから叩く

    $('a.download').click(function(e){
      e.preventDefault();
      var filename = ($(this).attr('href')).split('/');
      filename = filename[filename.length-1];
      location.href = './fuga.php?filename='+filename;
    });
firebug とかで href 書き換えられて押されたりすると怖いので、 ファイル名の部分だけを切り取って送るようにしました。

ここまでできたので、今度は欲しい画像を選んでZIPに圧縮してダウンロード、とか作りたいのですが。 さぁ、時間が無い。

■おまけ application/octet-stream とはなんぞ web用語辞典 – application/octet-stream

なんだかわからないけど何かのファイル っていう意味っぽいです。

【Design】Photoshopで和風の扇子を作る【チュートリアル】

最近あんまりコード書く練習とかできなかったので、 デザインのほうのチュートリアルとかやってみた。

Create an Illustrated, Japanese Style Hand Fan in Photoshop | Psdtuts+

仕事で扇子描いたりとかしても意外とバランス良く作れなかったり。

扇子

【ActionScript】XMLに書いてある順番に画像を配置する

XMLを読み込んでステージ上に画像を配置するためにこんなコードを書きました。 かなりの割合ではしょってるけども。

for(var i:int = 0; i&lt;xml.@maxnum; i++){
  //Panel を用意する
  panelInit(i);</p>

<p>//画像を読み込む
  img.load(reqImage);
  img.contentLoaderInfo.addEventListener(Event.COMPLETE, attachImage(i));</p>

<p>if(i == xml.@maxnum-1){
    Tweener.addCaller(this, {
      onUpdate : function(){
        sortPanel();
        loading.visible = false;
        showControler();
        panels.forEach(function(_this:Panel, i:int, ary:Array){
          _this.visible = true;
          _this.oldY = _this.y;
          _this.y = stageH+_this.height;
        });
      },
      onComplete : function(){
        panels.forEach(function(_this:Panel, i:int, ary:Array){
          Tweener.addTween(_this,{
            y : _this.oldY,
            visible : true,
            time : 2.5,
            onComplete : function(){
              if(i==ary.length-1){
                timer.start();
              }
            }
          });
        });
      },
      delay : 1,
      time : 1,
      count : 1
    });
  }
}</p>

<p>function attachImage(_id:int):Function{
    return function(event:Event):void{
        var img:MovieClip = new MovieClip();
        img.addChild(event.target.content);
        img.x = -img.width/2;
        img.y = -img.height/2;
        img.alpha = 1;
        panels[_id].addChild(img);
        panels[_id].href = xmlObj.href[_id];
        panels[_id].target = xmlObj.target[_id];
        panels[_id].addEventListener(MouseEvent.CLICK,clickImg);
    };
}

panelInit() はPanelクラスを呼び出して配置する関数。 でもこの書き方だと、 Panelを一個配置する→画像を読み込む→読み込まれたらPanelに貼り付ける っていう処理になってるので、どうやら画像が読み込まれた順(?)に配置されてる模様。

これじゃいけないので、 Panelをとりあえず配置する→とりあえず画像を読み込んでおく→順番にPanelに貼り付けていく っていう処理に変えたいと思います。

まず先にPanelを全部配置したいので、

for(var i=0; i<xml.@maxnum; i++){
  panelInit(i);
}
panelInit() だけ別のfor文で処理しておきます。

次に画像を順番に並べてどっかに置いておきたいので、

var imgAry:Array = new Array(); //画像を置いておく配列を用意する
for(var i:int = 0; i&lt;xml.@maxnum; i++){</p>

<p>//中略</p>

<p>//画像が読み込まれたら実行でなく、画像を読み込む準備ができたら実行するようにする
  img.contentLoaderInfo.addEventListener(Event.INIT, attachImage(i));</p>

<p>//中略</p>

<p>function attachImage(_id:int):Function{
    return function(event:Event):void{
        var img:MovieClip = new MovieClip();
        img.addChild(event.target.content);
        img.x = -img.width/2;
        img.y = -img.height/2;
        img.alpha = 1;
         //Panelに設定していた諸々はここではやらないようにする
                //ただただ画像をおいとくだけにする
        imgAry.push(img);
    };
}

で、最後にパネルの配列と画像の配列を対応させます。

//略
  if(i == xml.@maxnum-1){
    Tweener.addCaller(this, {
      onUpdate : function(){
        sortPanel();
        loading.visible = false;
        showControler();
        panels.forEach(function(_this:Panel, i:int, ary:Array){
          //ここで各Panelにプロパティを指定する
          _this.href = xmlObj.href[i];
          _this.target = xmlObj.target[i];
          _this.addEventListener(MouseEvent.CLICK,clickImg);
          _this.visible = true;
          _this.oldY = _this.y;
          _this.y = stageH+_this.height;
          //いろいろやったら最後にPanelに画像を貼り付ける
          _this.addChild(imgAry[i]);
        });
      },
//略

こんな感じで無事XMLに書いた順番に配置してくれるようになりました。

でももっとうまくやる方法がある気がするんだぜ。

【JavaScript】Twitterの名前部分をGoogleFontAPIで洒落たフォントにするブックマークレット


追記 Hatena::Letに投稿してみました。

http://let.hatelabo.jp/cancer6/let/gYC-ypbCp6mDIQ

Google Font API なるものが公開されていたのでちょっと遊んでみた。 下記の一文を”Twitterのページを開いている状態”でロケーションバーにはりつけてエンターキーどーん。

javascript:(function(s){s.src="http://unolabo.boo.jp/misc/googleapi/google_fonts.js";document.body.appendChild(s)})(document.createElement('script'));

JSについては下記。

Continue reading

【XAMPP】XAMPPでSSIを拡張子.htmlでも有効にする

参考:http://dev-man.seesaa.net/article/56353764.html

httpd.conf内 最下部 バーチャルホスト追加部分

<VirtualHost *:9999>
DocumentRoot D:/studies/
<Directory "D:/studies/">
Options Indexes FollowSymLinks MultiViews Includes ExecCGI
AddType text/html .shtml
AddHandler server-parsed .html  ←ここを追加
AddHandler server-parsed .shtml
AddHandler cgi-script .cgi .pl
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</VirtualHost>

とのこと。めもめも。

【PHP】Imagick を使ったら Apache ごと落ちたので色々がんばってみた

  • 2010-04-21 (水)
  • PHP

自分用メモ

XAMPPでPHPが入るけど自分で入れなおしたほうがいいよ! インストーラーじゃなくてZIPから!

$file_name =’a.jpg’; $ext = “jpg”; $image = new Imagick($file_name); header(‘Content-type: image/’.$ext); echo $image; 矩形を描画したりとかは出来たけどファイルを読みこんでどうこうができない。 なのでさらに調べることに。 (もともとMikko’s blogはVC6じゃなくてVC9にしろよってかいてあったきがする。) ちなみに動かなかったときのphpinfoは Compiler MSVC9 (Visual C++ 2008) って書いてあった。 結果的には XAMPPのバージョンによってはphpinfoで見たときにCompilerの項目がMSVC6になっているのでMSVC9にすることが必要。 * 1.PHPを入れなおす(スレッドセーフ版) * 2.ImageMagickのバージョンは最新に。 * 3.php_imagick_ts.dll(スレッドセーフ版)を入れる * 4.php.iniからエラーが出る項目をコメントアウトする という流れになると思います。

【PHP】Imagemagicをインストールしたけどエラー|</gecko>:げことじ。2010-04-21 (水) 14:16

転載乙!

起こったこと。 ・PHPでImagickが使えない → php_imagick.dll の最新版を持ってくる(TS/NoTS、VC6/VC9に注意。phpinfo()で確認) ・Imagickを使うとApacheごと落ちる → VC6だったから。VC9じゃないとだめ。 ・Imagickがphpinfo()に表示されない → htdocsのphp.iniのパスとか、php.iniでextension=php_imagick.dllやってるか確認 ・それでもやっぱり表示されない → DLLファイルを書き換えるの忘れてた。TS/VC6をTS/VC9に変更。自分の環境次第。

【Ruby】Rubyはじめました

Rubyはじめました。 これがなかなかむずかしい…。

とりあえずソースはりつけてみる。

numに指定した数字で”あ~ん”までの平仮名を返すRuby  ex.) num=1 #=> あ num=2 #=> い num=51 #=> ん

</p>

<h1>!/usr/local/bin/ruby -K</h1>

<p>$KCODE = &quot;Shift-JIS&quot;
print &quot;Content-Type: text/html\n\n&quot;</p>

<p>require 'stringio'
require 'jcode'</p>

<h1>開始</h1>

<p>begin</p>

<p>num = 1</p>

<p>def call_aiueo(num=0)
  mbStr = &quot;あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもなにぬねのやゆよらりるれろわをん&quot;
  mbArys = mbStr.split(//)
  if num != -1 &amp;&amp; num &lt; 52 then
    print String(num) + ' 番目の文字は ' + mbArys[num-1] + 'です'
  else
    print '数が正しくありません'
  end
end</p>

<p>call_aiueo(num)</p>

<h1>以下エラー表示用</h1>

<p>rescue Exception =&gt; e
print &quot;&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&quot;
print &quot;&lt;br /&gt;&quot;
print &quot;*** ERROR ***&lt;br /&gt;&quot;
print &quot;error : &quot;
print e
print &quot;&lt;br /&gt; backtrace: &quot;
print e.backtrace
print &quot;&lt;/body&gt;&lt;/html&gt;&quot;
end</p>

<h1>終了</h1>

<p>exit

【JavaScript】IE6のwindow.parent

—————-【追記(2010/03/26 19:07)】—————- 下記の方法でやっていたところ、再度エラーが出る(例によって表示はされないけど)ので、 結局 window.parent.fn() で取りました。

エラーがでたりでなかったりなんなんだよもう。。

昨日のiframeの続きで、 iframe の中の子ページから親の関数を呼び出したかったので、 とりあえず window.parent.fn() で取ってみました。

すると、IE6で動かない。 きっとスコープ的な何かがおかしいんだろうなぁと思い、 window.parent.document.fn() とか色々試しつつ調べつつ。 そうこうしているうちにこんな記事を発見。

parent – hoshikuzu | star_dust の書斎

これによると、IEの場合 document.parentWindow なるものが存在するらしい。 へーなんかきもい。

それでもとりあえず6以外ではちゃんと動いてたので、6だけに適用。なんか怖いし。 document.parentWindow.fn() で無事取得できました。

こんな感じ

if(undefined !== window.ActiveXObject && $.browser.version.indexOf('6.') != -1){
  document.parentWindow.fn();
}else{
  window.parent.fn();
}

Home

Search
Feeds
Meta

Return to page top