まだプログラマーですが何か?

プログラマーネタとアスリートネタ中心。たまに作成したウェブサービス関連の話も http://twitter.com/dotnsf

この「まだプログラマーですが何か?」というブログを始めて1年ちょっとになります。

以前は半分業務半分趣味みたいな感じで、会社内の外部向けシステムのブログアプリを使っていたのですが、転職を機に100%趣味で作りなおしました。 で、その際にちょうど「ブログに好きな URL を付けることができる」というキャンペーンをやっていたライブドアブログを選びました(なお、選んだ URL は dotnsf.blog.jp です)。

内容は技術紹介だったり、備忘録だったり、マンホールだったり(?)好き勝手に書いています。でもここ最近になってアクセス数も上がっていて、また色々な所からリンクされていることも分かっています。そういうリンク元を辿るのも最近の楽しみの1つになっています(笑)。


ところで、ライブドアのブログにはアクセス数に応じた5段階の「レベル」制度があります。レベルが高いほどアクセス数が多いグループとなり、同じレベルグループの中でランキングを競ったりしています:
ライブドアブログ レベル別ランキング


 始めた当初はレベル1からスタートしましたが、つい先日「レベル4」にまで到達できました:
 2014103001

おー、ここまで来たか。ここまで来るとやはりレベル5を目指したい所ではありますが、レベル5くらいになると、一度は耳にしたことのあるまとめサイトなども含まれているレベルです。さすがにかなり高い壁だよなあ・・・ でもまあ目指す分にはいい目標になります。

そして、ここまでこのブログが成長できたのも、ひとえに見て&アクセス数増加に貢献いただいている皆様のおかげでございます。見てくださっているだけでも嬉しいのですが、このブログが少しでもお役に立っているのであれば、エンジニア冥利に尽きる、というものです。

というわけで、これからもよろしくお願いします。

MVC 型の PHP アプリケーション開発フレームワークである cakePHP を使ってます。単なるテンプレートエンジンである以上に、日本に利用者が多い(つまり日本語の情報を見つけやすい)こともあって、とても便利です。
cake-logo


そんな cakePHP を使って作っているアプリケーションで、「TSV(CSV) ファイルをダウンロードさせたい」という機能を実装する方法を紹介します。なまじ View/Controller の組み合わせに慣れてしまうと、TSV(CSV) のような View を無視する機能を cakePHP でどう実装するか、という点に迷いますよね。TSV ファイルを作成する前提で調査結果をまとめました。

結論として View(***.ctp) は用意しません。そして Controller 側に以下のような記述を行います:
function download(){
  $this->autoRender = false; //. Viewを使わない
  Configure::write('debug', 0); //. debugコードを出さない

  //. HTTP ヘッダを TSV 用に変更
  header ("Content-disposition: attachment; filename=test.tsv");
  header ("Content-type: application/octet-stream; name=test.tsv");

  //. TSV 本体を生成する部分
  $tsv = "";
  $items = $this->Item->find('all');
  foreach( $items as $item ){
    //. 日本語部分をシフトJISに変換しながら TSV の一行を作成
    $line = $item['Item']['id'] 
      . "\t" . mb_convert_encoding( $item['Item']['name'], "SJIS" )
      . "\t" . mb_convert_encoding( $item['Item']['body'], "SJIS" )
      . "\n";
    $tsv .= $line;
  }

  print($tsv); //. 生成した TSV を出力
  return;
}

肝として、まず View を使わずに処理を終えたいので、autoRender プロパティを false に変更します。また出力結果に debug コードを出したくないこともあるので、debug レベルを 0 に設定しておきます。 更に TSV ファイルをそのまま(選択肢なしで)ダウンロードさせたいので、HTTP ヘッダをダウンロード用のものに変更しています。

TSV 本体部分のコーディングは出力したい内容によって異なりますが、普通に出力したい内容をタブ("\t")区切りにして1行ずつ生成します。これだけでもいいのですが、もし出力した TSV をそのままエクセルで読み込みたい場合などは、文字コードをシフト JIS にしておく必要がある点に注意が必要です。

生成した TSV を最後に出力して処理終了、です。


cakePHP はとても便利なフレームワークですが、今回のような(ビューを使わない)特殊な処理を行う場合は少し特殊な手順が必要になる、というサンプルです。


 

今年も11月2日(イイフタの日)が近づいてきました。「マンホールの蓋好きが集まってキャッキャッする魅惑のイベントマンホールナイトの季節です!


マンホールナイトは今回で6回目を迎えました。今回も「聖地」東京都北区JR王子駅前の「北とぴあ」で、11月2日午後6時半開場です。

第1回目の頃のマンホールナイトは「普通に引く」マニアイベントだったのですが、ここ数年は異文化交流的な内容も加わり、また女性発表者も増えたことで、老若男女誰でも楽しめる集まりになりつつあります、たぶん。


このマンホールナイト、実は第1回目からずっと発表者として参加させていただいております(正確には第1回目は飛び入り)。しかも第2回から第4回まではずっと最終発表者というか、時間調整係というか・・・で参加させていただいてます。ちなみに昨年の5回目はオープニング発表者でした。

第6回目の今回もトリを任され、全力で時間を調整下水道展への出展報告とマンホールマップの便利な使い方の紹介をさせていただく予定です。


なお、今年も同イベント内で写真コンテストが開催されます:
http://manholenight.info/?p=1099

「これぞ!」というマンホール(に関係ありそうな)写真を応募ください。当日の投票でレア中のレアな賞品が当たるかもしれません。なお締切は10月31日です。


当日のプログラムは公式サイトを参照ください(最終発表者が僕です)。まだ若干の空きがあるようなので、11月2日ヒマで、たまには濃い話を聞いてみたいという方がいらっしゃいましたら是非どうぞ:
マンホールナイト6 今年もイイフタの日に開催決定!




 

このページのトップヘ