Archive for 4月, 2009
RubyonRailsでファイルI/Oを走らせずにCSVを作成、圧縮してダウンロードさせる方法
長いタイトルですな。
つまり、サーバ上でファイルを作って圧縮、ダウンロードは結構簡単にできるんです。ただ、ファイル生成しちゃうとファイル名をユニークにしなきゃいけなかったり、ファイルのダウンロードが終わったら削除しなきゃいけなかったり、気分的に手間なんですよね。タイミングによってはダウンロードが開始される前に削除されちゃったりして、びっくりでした。
で、オンメモリでCSVファイル作って圧縮、ダウンロードまでしてみました。まぁメモリが安くなったからこそできる技ですよね。CSVが小さければいいけど、昔はこんなこと怖くてできなかった。
require ‘rubygems’
require ‘zipruby’data = “a,b,c\r\nA,B,C”
Zip::Archive.open_buffer(buffer, Zip::CREATE) do |arc|
arc.add_buffer(“download.csv”,data)
endsend_data(buffer , :type=>’application/zip’, :filename => “download.zip”, :disposition=>’attached’)
オンメモリでCSVちゅーのはどうでもよくて、ポイントはZip::Archiveのadd_bufferでしょう。ziprubyのバージョンにもよりけりなのかもしれません。今回利用したのは0.2.9です。あとはsend_fileじゃなくてsend_dataを使うあたりですかね。
PHPで複数ページのPDFを分割して1ページごとの複数ファイルにする
FPDIを利用します。「フリーで使っていいよ」と書いてあるのにPayPalのボタンが置いてあるのは、寄付はしてねっていうことですよね。会社のプロジェクトで利用することになったら経費で寄付してみようかと。
require ‘../var/fpdf/fpdi.php’;
$temp_pdf= new FPDI();
$_page = $temp_pdf->setSourceFile(‘../var/hoge.pdf’);
unset($temp_pdf);for($i=1;$i<=$_page;$i++)
{
$_write_pdf = new FPDI();
$_write_pdf->setSourceFile(‘../var/hoge.pdf’);
$_tmp_info = $_write_pdf->importPage($i);
$_write_pdf->addPage();
$_write_pdf->useTemplate($_tmp_info);
$_write_pdf->Output(“hoge_”.$i.”.pdf”,”F”);
unset ($_write_pdf);
}
unsetにはあまり意味はない、というかムダかもしれません。closeやdisposeが見当たらなかったので微妙に気持ち悪かったから入れただけです。解放してくれているのかなぁ。
ページ数の取得のために一度テンプレートとして読み込み、それからページ数分でループしてます。ループ処理の中で「テンプレートファイルのiページ目だけ読み込んでファイル書き出し」を繰り返しています。
これでやりたいことはできたのですが、なんかメソッド一発で分割してくれるのがありそうで怖い。あったらどなたか教えてください。
FPDIは1.2、FPDFは1.53、PHPは5.2、WindowsXP上のApache2.0で動作確認しました。
FlexでHTTPServiceを使ってWebサーバ上のXMLを取得、利用する方法
HTTPServiceであればそのままバインドしてしまうのが一番簡単なのですが、Flex側で加工して使いたいときもあります。そういうときはハセテツはArrayCollectionに格納してから加工して使います。FlexBuilder3.0、MacOSX、Safari3.2で動作確認しました。
<?xml version=”1.0″ encoding=”utf-8″?>
<response>
<item>
<id>1</id>
<name>hoge1</name>
</item>
<item>
<id>2</id>
<name>hoge2</name>
</item>
<item>
<id>3</id>
<name>hoge3</name>
</item>
<item>
<id>4</id>
<name>hoge4</name>
</item>
</response>
上記がサンプルのXML、これがhttp://localhost.hoge.xmlだとします。
private var list_connect:HTTPService = new HTTPService();
private function init():void
{
list_connect.url = “http://localhost/hoge.xml”;
list_connect.addEventListener(ResultEvent.RESULT,load_data);
list_connect.send();
}
private function load_data(event:ResultEvent):void
{
var modelData:ArrayCollection = new ArrayCollection();
itemData = event.result.response.item as ArrayCollection;
for each(var item:Object in itemData)
{
trace(item.id + ” / ” + item.name);
}
}
見たまんま、HTTPServiceの結果をArrayCollectionに入れてるだけです。簡単なんですけど、意外と手間取ったんですよね。。。
FlexでAccordionの内容を動的に追加/削除する
といっても、addChild/removeChildを使うだけなんですけどね。
複数のパーツを含んだコンテンツを追加する場合、addChildだとコンポーネントにしておかないとめんどくさいです。ので、ハセテツは先にすべてのコンテンツを作成しておいて、必要に応じてremoveChildというやり方です。
var obj:DisplayObject = this.accordion1.getChildByName(“hoge”);
this.accordion1.removeChild(obj);
accordion1にある「hoge」というコンテンツを削除します。
Visibleとかで切り替えられるのかと思っていたら、そう簡単にはいきませんでした。