2009年10月29日
RailsでReadonlyなmodel
Railsで更新は別のアプリが担当しているなどの理由で、読み取り専用でテーブルにアクセスしたい時がありますが、残念ながらRails自体には読み取り専用のモデルを作成する手段は無いようです。 と言うわけで、代替手段を探していたのですが、どうもスマートな手段が無く結局、readonly?メソッドを上書きして常にtrueを返すようにして、凌ぐようにしました。 ただ、それだけだと削除などが有効なため、結局以下のように一部メソッドでは直接ActiveRecord::ReadOnlyRecordをraiseしています。 以下、サンプルコードです1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | class Hoge < ActiveRecord::Base # 全レコードをReadOnlyということにしてCreate、Update系を阻害 def readonly? return true end # テーブル自体の破壊を例外を返して阻止 def before_destroy raise ActiveRecord::ReadOnlyRecord end # レコードの削除の際はreadonly?を確認しないようなので例外を返して阻止 def self.delete(id) raise ActiveRecord::ReadOnlyRecord end def self.delete_all(conditions) raise ActiveRecord::ReadOnlyRecord end def self.delete_all!(conditions) raise ActiveRecord::ReadOnlyRecord end end |
2009年05月29日
Railsでtimestamp with time zone
最近Ruby on Railsの勉強中なのですが、Railsの流儀に逆らわないようにするのは大変ですね。 さて、そんなRailsでPostgreSQLのtimestamp with time zone型を取り扱おうと思ったのですが、どうも意図したとおり動いてくれません。 timestamp with time zone型はDB内部ではグリニッジ標準時(GMT)で値を持っていてクライアントで指定したタイムゾーンで変換して時間を返してしてくれるのですが、config/environment.rbでconfig.time_zone = 'UTC'を指定していても、Railsの動作マシンのローカルタイムゾーンでDBから時刻を取得してくれます。 もちろん、
config.time_zone = 'Tokyo'なんか指定した日にはDBが9時間加算してくれた時間をさらに9時間加算してくれて酷いことになります。 まぁ、config.time_zone自体をコメントアウトすれば、Rails 2.1未満のようにタイムゾーン無しで動いてくれるらしいのですが、昔の仕様に戻して動かすのはRailsの流儀ではないと思い、色々調べた結果下記のように対応することにしました。 続きを読む...
2006年12月31日
cvsadmin以外の権限制御
cvsadmin以外のユーザのadminコマンドの権限制御についてのエントリです。
----
cvsでは「cvs admin」コマンドでリビジョンの削除を含むかなり危険な操作が多数できてしまいます。
ただ、このコマンドはその危険性もあり、簡単に使用禁止にできます。
手順は
cvs の構築時に決定されるグループ名 (既定では cvsadmin) が存在する場合、そのグループの一員だけが cvs admin を利用できます。その名前で無人のグループを作成すれば、 cvs admin の使用を全面的に禁止できます。
ただ、そうするとコミットログを変更する「cvs admin -m」や擬似ロック制御で用いる「-l」や「-u」、ディレクトリごとのキーワード置換モードを設定する「-k」まで使用できなくなります。
特にコミットログの付け直しは「動作版」と銘打ってコミットしたのに、動かなかったけど、バージョンとしては重要な場合などに良く付け直すのでツブしたくないコマンドだと思います。
そう言う要望が全世界的にも多かったのかどうか知りませんが、最近のCVSではCVSROOT/configに記載する「UserAdminOptions」というオプションが増えています。
このオプションはcvsadminグループが存在しているときに、cvsadminに所属していないユーザが「cvs admin」コマンドのどのオプションを実行できるかと言うことを指定するためのオプションで
UserAdminOptions=klumなどと指定することによって上記の問題を回避できます。
詳細は
2006年11月06日
MySQL+utf8+ひらがなでソート
タイトルの条件であいうえお順でソートさせるにはどうやるのが一番良いんでしょうかねぇ・・・
そもそもそんな単純なことで悩まないといけない最大の原因は、MySQLのutf8のバイナリ照合指定で「utf8_japanese_ci」が存在しないため。
デフォルトではおそらくutf8_general_ciになっていますが、これが指定されている列にひらがなを格納してOrder byしても予定の結果は帰りません。
また、そもそもバイナリで普通にソートしてくれれば並ぶという話しも有るので、試しにutf8_binなどを指定して見ましたが、これも変な順序でしか並びません。
無論、utf8_unicode_ciなんかも試してみましたが、これもダメ。
で、いろいろと試行錯誤して結局次のようなOrder by指定で落ち着きました。
SELECT hoge FROM foo ORDER BY CAST(ひらがなを格納した列 AS CHAR)毎回CASTされるというのはどうにも気持ち悪いですが、そう言う挙動を期待して他がいろいろとできあがっていたので、それを直すのに比べればと言うことで、仕方が無くガマンすることにしました。 続きを読む...
2005年07月23日
Perl!?なSleep2.0
Javaにはどうにも縁がないんですが
まず公式サイトは
(むろんJava自体はインストールされていないといけませんが(笑))
で、リファレンスを眺めながら簡単なコードをかいてみる
$a=3;で、aaa.slという名前でとりあえず、保存して実行っと
$b=4;
println($a + $b);
C:\> java -jar sleep.jar aaa.sl_| ̄|○Error: Syntax error at line 1
$a=3
なんでやねん(;´д`)ノ
もしやと思って
$a = 3;っていうぐあいに「「=」の前後にスペースを入れてみると
$b = 4;
println($a + $b);
C:\> java -jar sleep.jar aaa.slうわ〜演算子の前後に半角スペース無いと動きませんか?(苦笑)
7
てか、シェルスクリプトかよ(爆)
こんなの使えたモノじゃないので当分無かったことにしようと思います(笑)
(せめて上記の問題が解決するまではさわってみる気も起こりません(;´д`)ノ)
2005年05月07日
MySQLで全文検索
MySQLにて運用中のDBで、数万件入って居るテーブルにて全文検索をするために
TextMsg like '%$search%'なんていう風にして検索していたんですが、どうも最近1回の検索に数秒かかるようになってしまったため、なんとか高速化できないものかと調べてみました。
まず、出てきた答えの一つが
MATCH (列名) AGAINST ('検索文字');を使う方法。
これにはFULLTEXTインデックスという大きめのインデックスが必要になりますがその分高速化できるようです。
しかし
便利そうな全文検索ですが、日本語のデータですぐに利用できるかというと、簡単ではありません。
ちなみに、↑の'a5aea5b6a5aea5b6'というのは、「ギザギザ」を16進数で表記したもの。こうやらないとMySQLが検索してくれないため。当然、事前に対象となるフィールドのデータを16進数にしたものを格納している。
正直、今更数万件のDBの16進をいちいち求めて別テーブルに入れたり、データ登録ツールの自作なんてしたくないですよ(;´д`)ノ
と言うか、そもそも現状のホストマシン自体更新予定で、しかもDBエンジン自体の変更も視野に入れて検討中なんでもう少し現状で様子を見てみようと思います。
続きを読む...2004年06月11日
RPGツクールXP
その理由は
■新機能『RGSS』『RPGツクールXP』で使用する、キャラクターのパラメータや戦闘システムなど、様々な機能はすべて『スクリプト』と呼ばれるプログラムで構成されています。
『RPGツクールXP』では、『Ruby』というプログラミング言語を『RPGツクール』専用にカスタマイズ
した言語『Ruby Game Scripting System(以下、『RGSS』)』が採用されており、その中のスクリプトを編集することで、ツクールの機能を自由に変更・追加することができるのです。/div>Rubyでゲーム作れちゃうですか( ̄○ ̄;)!これまでのシリーズでは、やっぱりある程度決まった型の中でゲームを構築していたようですが、Rubyでイベント処理書けるのなら自分が思い描くとおりのゲームが作れるんじゃ無いかと思います。
というか遊びながらゲームの勉強が出来るとは、理想のプログラムの勉強手段なのでは無いのでしょうか?
時間がないので私自身は買わないと思いますが、学生時代に出ていれば買っていろいろがんばっていただろうなぁと思います(^^;
続きを読む...
2004年03月01日
IEのJavaScriptのエラー表示
管理しているWEBサイトにJavaScriptでちょっと機能追加しようとしたら次のようなエラーがでました。
ランタイムエラーが発生しました。30行ね、と思ってソース見直して格闘を始めるも、いくら修正してもエラーで通らない。
デバッグしますか?行:30
エラー: オブジェクトがありません。
そこで思い切って30行目をコメントアウトしてみたら、まだ同じエラーがでる_| ̄|○あり得ないのでちょっとぐぐって見たところ
うぉい(;´д`)ノ
その行番号+1行目が怪しいポイントです。
なぜ+1なのかは、IEのバグです。あわてて次の行を見てみると、まだその段階では定義されてないオブジェクトを使用しておりました(笑)
にしても、エラーの行ぐらいちゃんと出して欲しいモノです。
2004年02月22日
SecurityError
Rubyってほとんど触ったこと無いんですが、今回ちょっといろいろいじらないといけないことになって作業してたら次のようなエラーに遭遇
protocol.rb:83:in `initialize': Insecure operation - initialize (SecurityError)なんだこれ?調べてみると外部から渡される引数の汚染除去が終わってないときに出るエラーらしいですが、自分的に引数には結構縛り掛けてあっただけにちょっとショック(笑)
本当はちゃんと汚染除去を考えてプログラムを書き直さないといけないんですが、そんなにたいした用途に使う訳じゃないものなんで裏技で逃れることにしました。
方法はuntaintを使うだけ。
使い方は以下のような感じです。aaa = 外部からのデータまぁ、汚染されてないと思いこませるだけの裏技なんで、公開するようなサービスなんかではこういう解決方法はやめましょう(^^;
*func(aa.untaint) #←SecurityErrorを出す関数2003年11月05日
JSで操作できないオブジェクト
JavaScriptを使っていて
<input type=text name=123>といった数字で始まるオブジェクト名を持つ要素をいじろうと思ったんですが、いざ使ってみるとエラーになります。まぁ、アルファベットで始めるように変更すればちゃんと動くんで良いんですが、実際どの文字を使って良いのかと調べてみたところ
・・・びみょ〜
IDやNAMEトークン字句は、文字([A-Za-z])とそれに続くdigits ([0-9])・hyphens ("-")・underscores ("_")・colons (":")・periods (".")で始まらなければなりません。
それは数字を使って良いの悪いの?(;´д`)ノなんで、原文の方を見てみる
どうも使っちゃダメのようです。
ID and NAME tokens must begin with a letter ([A-Za-z]) and may be followed by any number of letters, digits ([0-9]), hyphens ("-"), underscores ("_"), colons (":"), and periods (".").まぁ、それじゃ仕方ありませんね・・・
というか、結構これまで違反していた予感(^^;;;
(特にページ内にアンカー作るときに<a name="20031101">とか平気でやってたからなぁ・・・)
その他のエントリEclipse(1) 2003年09月03日 15:35
フリーのIDEらしい「Eclipse」を入れてみました。 eclipse - FrontPageとりあえず上記サイトを参考にインストールさせて頂いたのでこちらに書いてあること以外はわからなかったりしますが、よさげだなと思った点は次の通りプラグインを入れればいろいろな言語の開発が行えるcvsサーバとの親和性が高い<これ重要JAVAなので