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

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

タグ:download

日本時間の 2016 年 4 月 1 日に、レッドハット社から驚きの発表がありました:
No-Cost RHEL Developer Subscription now available

2016040101



開発(者)向け、という条件は付きますが、RHEL(RedHat Enterprise Linux) を含む Devloper Suite が無料でダウンロード可能になった、というものです。マジか!?これはタチの悪いエイプリルフールだろ?と思ったのですが、このニュースは米国時間の 3 月 31 日にリリースされており、エイプリルフールではなさそうです。。

自分はこれまで RHEL のコミュニティ版ともいえる CentOS ばかり使っていましたが、ついにこの領域にレッドハット社が脚を踏み入れることになるとは。。 色々な事情や背景も考えられますが、なにはともあれ使えるものなら使ってみたいわけです(笑)。試してみました。


まずは RHEL のダウンロードサイトへ行ってみると、既にこの発表を反映した内容になっています:
http://developers.redhat.com/products/rhel/download/

2016040102


このサイトから RHEL 7 がダウンロードできるようになっている模様です。リンクをクリックすると、アカウントログインが求められます。RedHat Developer アカウントを持っている場合は入力、持っていない場合は新規に作成してログインします。各種SNSの情報に紐付けたサインインもできるようです:
2016040103


そしてアカウントプロファイル作成後にログインすると、その場から RHEL サーバーの ISO イメージのダウンロードが開始されました(バージョン 7.2 の 64bit 版でした。そういや 7.x って 32bit 版ないんだっけ)。インストールなど、ダウンロード後の作業手順についてもここから参照できるようです:
2016040104


といっても特別な手順が必要なわけではなく、普通に ISO(DVD) からブートできます:
2016040105


インストーラーも普通でした。最初に日本語選んでおけばインストール作業から日本語GUIで行えます:
2016040106


インストールが完了してリブートした直後の画面がこちらです。"LICENSE INFORMATION" に警告マークがついているので、ここをクリックします:
2016040107


ライセンス条項を読み、確認して、同意にチェックを入れ、左上の「完了」ボタンで戻ります:
2016040108


画面が戻ると先程の警告マークが消えているはずです。右下のボタンで設定を完了します:
2016040109


「ようこそ」画面が出るので更に進めていきます。すると・・・:
2016040110


じゃーん!
2016040101


個人的には見る機会の少ない RedHat Enterprise Linux のデスクトップ画面が表示されました。7.x になってからは本当に初めてかもしれない。。 ともあれ、無料のアカウント登録だけで本当に使えてしまいました。

動いてしまえば、後は慣れた CentOS の感覚(?)で使えるようになります:
2014040101






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


 

このページのトップヘ