2009年2月6日金曜日

[symfony 1.0.18]symfonyでファイルアップ&ダウンロード

ちょっと興味本位でファイルのアップロード・ダウンロードができるアプリを作ってみた。
後悔はしていない。

ジェネレーターで作ったので所々はしょってますが、ちょー簡単な作りです。

まずファイルアップロード
自分は、DBにはファイル名と拡張子とサイズしか入れませんでした。
中身はuploadsに直接保存しています。

まずテンプレート内で

を組み込む。これだけでファイル選択のボタンが作成されます。

次にアクション内で
普通にDBに保存する値をセットしていき、
$this->getRequest()->moveFile('file',
sfConfig::get('sf_upload_dir').'ファイルへのパス);

を組み込む。moveFile()の第2引数には保存するパスを指定しています。
saveされたらuploadsの下を見てみましょう。
アップロードについては他のブログでも紹介されてるけど、
意外とダウンロードは難しいらしくあまり紹介されてない。

てことでダウンロードを実装します。
まず自分はファイルの一覧を作りました。
data/listSuccess.php みたいな。
そこにファイル名の横にダウンロードのリンクを作成し、
飛んだ先のアクションで直にダウンロードが始まるようにしました。
まずアクション
 public function executeDownload() {
  $data = DataPeer::retrieveByPk($this->getRequestParameter('id'));
  $file_path = sfConfig::get('sf_upload_dir').'ファイルへのパス';
  $file_name = 'ファイル名';
  $this->getResponse()->addHttpMeta('Content-Type',
'application/octet-stream; name='.$file_name);
  $this->getResponse()->addHttpMeta('Content-Disposition',
'attachment; filename='.$file_name);
  $this->getResponse()->addHttpMeta('Content-Length', ファイルサイズ);
  $this->send_data = fread(fopen($file_path, 'rb'), ファイルサイズ);
 }

まず、日本語で書いてある所は人によって入るものが違います。
最後の$this->send_data には実際のファイルデータが入っていて、テンプレートに渡しています。

そしてテンプレート
data/downloadSuccess.php
<?php echo $send_data ?>


これだけでアップロード・ダウンロードができるようになりました☆
気をつけなければならないのは、最後のdownloadSuccess.phpのlayout.phpを外す事です。
HTML要素が入っているとファイルの中身が壊れてしまうので注意です。

ジェネレーター最高^p^

2008年11月27日木曜日

[symfony 1.0.18]はうとぅーゆーずdoSelectRS

久々の更新でテンション上がってきました。
開発しつつちょっと詰まったのでメモメモ。。

仕事で使ってるDBのテーブルがなかなかでかくて、
使いたいカラムは1つか2つなのにdoSelectで全部持ってくるのはナンセンスだ!
ってことでaddSelectColumnを使ってみました。
カラムを指定してオブジェクトを取り出す時は
doSelectRSを使うって決まりがあるらしいけど、
そうすると$user->getName()とかいう風に取り出せない。
なんでかなーと調べるうちに見つけたのがFetchMode。
細かい説明はいまいち把握してないのでできないですが、
以下にソースを記述しておきます。
$oCriteria = new Criteria;
$oCriteria->addSelectColumn(UserPeer::NAME);
$oCriteria->add(UserPeer::ID, $this->getRequestParameter('id'), Criteria::EQUAL);
$result = UserPeer::doSelectRS($oCriteria);
$result->setFetchMode(ResultSet::FETCHMODE_ASSOC);
while ($result->next()) {
 $this->user_name = $oResult->getString('NAME');
}


これでテンプレートの方で$user_nameを呼び出すと中身が取り出せました^-^

[symfony 1.0.18]今更ながら

先月から新しい職場で開発してるのですが、
自分が使ってるsymfonyのバージョンは
1.0.18
です。
えへへ

2008年10月28日火曜日

[symfony]リレーション組んでいるDBへのフィクスチャデータ投入

ちょと詰まったのでメモ。

リレーションシップを組んでいるDBへフィクスチャデータを投入する際に
Railsの仕様ではモデルに対して1つのフィクスチャファイルを作成していたので
symfonyでもそうなのかなーと思い、同様にしてみた。
するとエラーが帰ってくる

"The object "hogehoge" from class "Hoge" is not defined in your data file."

ちゃんとテーブルは作られてるから問題はないはず。。。
困った時は黒猫たん。

黒<ファイル名じゃね?
俺<テーブル名+import.ymlだおー
俺<!!!!!

結論:
フィクスチャデータのファイルに連番を振るべし。

2008年10月25日土曜日

[symfony]xampp環境でVirtualHost

結構詰まったのでメモ。

ローカルで開発してると複数プロジェクトをやる機会があると思います。
そこでローカルでもVirtualHostで複数動作できるようにする方法を探しました。

環境は
WindowXP
xampp2.5
symfony 1.0.6 (今回は関係ないけど一応

まずhttpd.confを少し修正
LoadModule vhost_alias_module modules/mod_vhost_alias.so
↑ この行をコメントされてたら外す
httpd.confは以上。

次にhttpd.confと同じフォルダにあるextraフォルダに移動
extra/httpd-vhosts.confにVirtualHostの設定を追記
例)
## MyVirtualHost ##
NameVirtualHost *:80
<VirtualHost *:80>
 DocumentRoot "C:\sample/web"
 ServerName localhost
 <Directory "C:\sample/web">
  AllowOverride All
  Allow from all
 </Directory>
 Alias /sf C:\xampp/php/data/symfony/web/sf
 <Directory "C:\xampp/php/data/symfony/web/sf">
  AllowOverride All
  Allow from All
 </Directory>
</VirtualHost>

<VirtualHost *:80>
 DocumentRoot "C:\testproject/web"
 ServerName testproject
 <Directory "C:\testproject/web">
  AllowOverride All
  Allow from all
 </Directory>
 Alias /sf C:\xampp/php/data/symfony/web/sf
 <Directory "C:\xampp/php/data/symfony/web/sf">
  AllowOverride All
  Allow from All
 </Directory>
</VirtualHost>

自分はこれにOptionsFollowSymLinksを指定してた為におかしくなってた模様
とりあえずhttpd-vhosts.confは以上

最後にWindowsのHostファイルを修正します。
C:\WINDOWS/system32/drivers/etc/hosts
にあると思います。無ければ検索してください。
ここに
127.0.0.1 localhost
というのが設定されていると思います。
今回はNameVirtualHostにしましたので
127.0.0.1 testproject
を追記します。

127.0.0.1 localhost
127.0.0.1 testproject

こんな感じになると思います。
あとは再起動したらバッチリ!
クソハマリすると何もかも嫌いになりそうです^-^

[symfony]始めました。

Railsは少しお休みします。

2008年10月1日水曜日

[戯言]最近の出来事

Arua装備消滅から一気に意気消沈してもうどのぐらい経ったのか・・・
Aruaはもう引退ですね。なんかもう間違いない。
時間あればINして引退の意向をクラメンに伝えないと・・・
そもそもクラメンもINしてるかどうかwww

最近はLHを始めました。
意外とクソゲーってはまるよね。うん
でも何日か前UPDATEの際にドロップテーブルの値を変えちゃったのか
祭り状態になって、これMMOとしてどうなんだろってなりましたwww
NPCに1個2000弱で売れるアイテムが30万個以上ドロップて
そりゃ終わるあwww
でもゲームシステムはおもしろいから続けるんだろな・・・
彼女も気に入ってるし^-^

会社もうまく動いてないし、いろいろ疲れるなぁ
やっぱり社長がズボラ&無知なのが一番の原因だと思う。
それに輪をかけてコミュニケーション不足。
給料は払われてるけど明細の提示を怠るってもうダメだ。
誰かの下で働くってことはその人を慕ってる事が前提だと思うけど、
もう今は嫌悪しかない。
でもこれをネガティブに受け止めても仕方ないからポジティブに持っていかないとね。
反面教師としてこうなっちゃダメだと勉強になりました。
経営を夢見る自分にとっては有意義な1年だったのかと思います。

2008年9月11日木曜日

[Rails2.0.2]携帯用Plugin

前からMobile on Rails使ってたんだけど、
最近Jpmobileにしてみようかと思ってる。
次何かするときは試してみようかなー
セッションどうなってるんだろ。。

2008年9月4日木曜日

[Arua](´・ω・`)ショボーン

\(^o^)/装備消えた\(^o^)/





Xtrm2Matt氏ね

2008年8月19日火曜日

[Rails2.0.2]NGワードの検証

Railsの話は久しぶりですね。
さて、タイトルの通りNGワードの検証ですが
あまり使う機会がないかもしれないですね。。
しかし、投稿サイト等構築する際には必須なのかもしれません
変な事件も多いですからね

ということで今回はNGワードの検証をチャチャっとやってしまいましょう^-^

まず、NGワードをtxtファイルに書き出していきます。
この時既に正規表現として書いていきます。
例:
○○|○○○|○○○○

これをどこでもいいですがRAILS_ROOT内にng.txtとして保存します。
自分はdocに置いておくことにします。

次にモデルにvalidateを書いていきます。
投稿サイトを意識してArticleクラスとしましょう。

class Article < ActiveRecord::Base
  @@ng = Regexp.new(open("#{RAILS_ROOT}/doc/ng.txt").read)
  #ここに定数として正規表現(NGワード)を予め入れておきます。

  validates_each :title, :body do |record, attr, value|
    if value =~ @@ng
      record.errors.add attr, 'がNGワードを含んでいます。'
    end
  end
end

これで、題名や本文にNGワードが入ってるとエラーを返すようになります。
しゅんさつですねー^-^

[戯言]俺は午後ティー信者

だけど、
リプトンのティーオレってのがうますぎるw
な ん だ こ れ

2008年8月12日火曜日

[戯言]別にミクが好きってわけじゃ・・・

ないけど、これは受けたwwww
早速設定してみたよwwww

2008年8月11日月曜日

2008年7月29日火曜日

[Rails2.0.2]画像アップロード機能のテスト

最近テストばかりしてます・・・
テストしたい内容は分かるのにどうやって書けばいいのか分からない時ほど
もどかしいものはないですね;-;
今日は画像アップロード機能のテストのメモ。

class UserTest < ActiveSupport::TestCase
   
#画像アップロード機能のテスト(異常テスト)
  def test_image_upload
    user = User.new
    image = ActionController::TestUploadedFile.new(
      "#{RAILS_ROOT}/test/testdata_sizeover.jpg", 'image/jpg'
    )
    image.binmode #この記述がないと画像ファイルの読み込みがおかしくなる為注意※Windows環境のみ
    user.uploaded_image = image
    assert !user.valid?
    assert user.errors.on(:uploaded_image)
    assert_equal 'のサイズが大き過ぎます(最大64KB)。',
      user.errors.on(:uploaded_image)

  
end
end

※Userモデル、DBに画像保存する場合の記述です。

2008年7月17日木曜日

[Rails2.0.2]携帯電話から画像のアップロード・・・の後

これはもうメールから添付ファイルで送信してもらって、
それを読み込んで保存するって流れしかないらしいですが。
そこらへん説明すると長いんでまた後日^-^

で、アップロードした画像を僕はDBに保存して
imageアクションとかでリサイズしてsend_dataしてたわけなんですが
なんか携帯から画像が見れない現象が起きたんですよ。
PCからは見れるのにー;-;
何でかなーと画像のプロパティ見るとtext/html とかなってる・・・
ああーーー
Mobile on Rails 使ってるからですねwww
このプラグインはページの文字コードを変換するafter_filter が働いてるわけで、
画像も変換されてます^-^

もう!と思いながら
imageアクションはそのafter_filter を無効にしちゃいます。

class UsersController < ApplicationController
  skip_after_filter :after_filter_for_mobile, :only => [:image]

  def image
    画像リサイズ処理
    send_data処理
  end

end

これで幸せになれました^-^

[戯言]最近忙しい・・・

特にAruaですがwっうぇww
いや、仕事ももちろん忙しいっす。
ブログで書きたい事もあるけど、
書き出すと1時間ぐらいかかっちゃうんだよね・・・
そろそろ次のネタにいきますかね。

2008年7月8日火曜日

[Rails2.0.2]外部DB接続

みなさまお久しぶりです。
多少忙しいのもあり更新遅くなりますた。(Aruaがほとんどうぇw
今日は外部DB接続というのをしませう。
あんまり使い道はないけど、アクセスログなんかを外部でやって
バックアップ取りたいとか、そんな感じの時にでもいいんじゃないかな。うん

まず、scaffoldでアクセスログコントローラ作る。DBは外部で作る予定だからいらない
>ruby script/generate scaffold access_log --skip-migration

次にDB作成
>mysql

mysql> create database access_log character set utf8;

mysql> create table access_logs (id int auto_increment PRIMARY KEY, user_id int, created_at datetime, updated_at datetime);

これで環境はできました。

次にアプリ内設定

#database.yml 下部に以下追加

access_log:
adapter: mysql
encoding: utf8
database: access_log
username: root
password:
host: localhost

これで接続できる状態になりました。

次にModel

#access_log.rb
class AccessLog < ActiveRecord::Base
  establish_connection(:access_log)
end

以上で外部DB接続できるようになりました。
上記は全て妄想ですので、できるかどうかは保障できませn(ry
でも、簡単にできるはずです^-^

2008年6月29日日曜日

[Arua]サブキャラ成長記

緑色の服を着せるのが目的で作ったサブキャラgreeeenが145まで上がりますたw
145装備の海賊の服を着せてみたらちょwwかわいいwwなった^-^





やべぇwwwうさたんwww似合いすぎwwww

2008年6月27日金曜日

[Rails2.0.2]携帯でのセッションについて

会社の開発に携帯ページを作ったりするんですが、
Rails2.0からセッションをCookie_storeをデフォルトで使ってるんですね。
へたれな自分はmobile on rails 使わせてもらってるんですが、
どうもうまくいかない。mobile on railsもjpmobileも2.0に対応させるのが大変(どこの記事みても大変そう;-;
そんな中試行錯誤しながらinitializersいじったりしてできたんですよ!
うほーちゃんとURLにセッションついてるし!
自分の携帯と隣の友の携帯見て喜んでたら!!
UwwwwHAwwwwDoCo○owwww

AUとSoftbankの最近の携帯はCookie使えるんですね;-;
むしろDoCo○oがんばれお・・・
もうとりあえずセッション全消しだし
Active_record_storeに変えたwww
なんか遅いらしいけど
大丈夫っしょ^-^
って訳で変えました。orz

config/environment.rb
60行目あたり
 config.action_controller.session_store = :active_record_store
ここのコメントアウト外す
その上になにやらメモが書いてある・・・
(create the session table with 'rake db:sessions:create')
セッションテーブル作るなら
>rake db:sessions:createしろと。おk
あとはマイグレート
>rake db:migrate

なんとかできた。;-;
携帯ページも作るって最初から分かってるなら、
別アプリとして立ち上げた方がよさげ。
DBは同一の使えばいいし。

2008年6月26日木曜日

[Arua]アップデート

かなり大幅なアップデートがあったらしい
某掲示板からの引用

・43種のローディングスクリーンの追加

・新たな禁止語句の追加

・140から200レベルまでの青色(冠詞)武器、防具の追加

・新たな魔法盾の追加
└Mystic Shell

・新たなアイテムの追加
└Red Box

・新たなスーパーボス(:通常のボスを倒したときに稀に出現する)
├スーパーシククブッチャー(Super Sikuku Slaughterer)
├スーパー呪われた彷徨のエント(Super Ant Vagabond)
├スーパーイカネスヘビーギア(Super Ikaness Heavygear)
└スーパーモスゴルーム(Super Moss Golem)

・迷いの森にシルバータイガーとゴールドタイガー、シルバーライオン、ゴールドライオンの追加
(これらはシルバーイエティ、ゴールドイエティと似たような働きです)

・カプセルモンスター(Summoning Stone)に新しいモンスター追加

・新しいボスをシータの避難所に追加
└シククキング(Sikuku King)

・初めて多数のアルアポイントクエストを追加
├我々は以後も段階的に追加して行く予定です。
│まず第一弾はジュノン星に基本クエストを、第二弾はルナー星、などなど
└これらのクエストは「~をせよ」という基本的なものです。
  上位クエスト(Advanced quests)は後のアップデートで追加する予定です。
  そして最上位クエスト(Top Quest)のアイデアを以下のスレッド
  http://forum.aruarose.com/index.php?showtopic=39006
  から選ぶ予定です。アイデア採用者達には非公開の量のアルアポイントを与えます。

・アルアロトリー(アルア宝くじ)の追加
├アルアロトリーは簡単にアルアポイントを入手できる楽しい手段です。
│チケットの値段は25,000ジュリーで、[イベント担当]フェリスからいくらでも購入可能です。
├購入の証明としてゲーム内では何も受け取りませんが、各購入で固有のIDが表示されます。
├商品の内訳
│ ・一等:200アルアポイント
│ ・二等:100アルアポイント
│ ・三等:50アルアポイント
├抽選は毎週金曜に行われます。3つのランダムな数字が生成され、
│その数字と同じIDを持つプレイヤーが当選者です。例えば、
│ ・ID番号 - アカウント
│ ・1 - マット 
│ ・2 - マット 
│ ・3 - ジョン 
│ ・4 - ジョー 
│ ・5 - フレッド
├この場合ランダム数字は1(通常は最も小さいID番号)から
│5(5枚のチケットしか存在しない場合は5、5が最も大きいID番号)の中から選ばれます。
├もし2が選び出された場合、マットが1等の当選者です(彼がそのIDを持っているため)。
│次にもし4が選ばれたならジョーが2等の当選者です。
│最後に5が選ばれたならフレッドが3等の当選者です。
└チケットは最後の抽選のあと消去されます。

・一日に2回のユニオン戦の実施(数日前にすでに実装していますが、
新パッチスレッド内でアナウンス不足だったため掲載)。受付開始時間は以下の通り
├2:30PM (グリニッジ時): 10:30PM(日本時)
└3:30AM (グリニッジ時): 11:30AM(日本時)

・亡者の砂漠への入り口ゲート前に新たなNPCの追加。そのNPCで可能なこと
├売買
├修理
├精錬
└倉庫

・ビジターは新たに誕生の島を出るときにスクロール(ザント村)を受け取れるようになりました。
(lv10になっていることが条件です)

・悪用防止(例えばPvP時にスタンになったときに使用する)のため、
クランビーチ(ジュノンCP?)でのスクロール使用不能

・回線切断防止のためシータの避難所スクロールの移動地点を編集

・以下ボスの出現AIを修正
現在はボスを出現させるために、そのエリアのモンスターを倒さなければならなくなり、
ボスもかなり早く出現するようになりました
├シククブッチャー
├呪われた彷徨のエント
├イカネスヘビーギア
└モスゴルーム

・クランビーチ(ジュノンCP?)での召喚について編集
├召喚コスト(1体につき50,000ジュリー)の追加
└1、5、10または25体目モンスターに新しいオプション?

・一部のマイレージアイテム、寄付アイテムのカートアイテムをトレード可能に修正

・オパールのグレード4、5のアイコンを修正

・以下のボスの2番目の出現場所を移動
├シククブッチャー
├呪われた彷徨のエント
├イカネスヘビーギア
└モスゴルーム

Arua始まった!!!1111
試しにエリートシククブッチャー行ってみたら、
山に囲まれてるとこで外人イパーイ発見
四角いエリアのとこは誰もいなかった
山に囲まれたとこでエリートシククブッチャー狩ってみた。
外人多いせいか、ポップ早すぎワロスwwww
スーパーエリートシククブッチャー時間沸きかは確認してないけど
同じとこでポップした。
感想はかなりウマーウマー200装備と冠詞装備両方同じとこでドロップはやばい

Arua 始 ま っ た