2014年06月09日

gntp-sendにsticky送信オプション追加

最近、Windows版のGrowlを知ってGrowlでの通知が自分の中で大ブレイク中です。

で、下記のサイト参考にGreasemonkey経由でブラウザの表示内容を元に更新を通知させてみたりと色々遊んでいました。


そのうち欲がでて中継用のNode.jsサーバをローカルではなくLinux上に設けて、そこから一斉通知とか試そうかと思ったら、node.js用のGrowlのnpmってLinux上で動かすとGrowlじゃなくてnotify-send使うじゃないですか。
  • Ubuntu (Linux):

    Install notify-send through the libnotify-bin package:


ただ、growl.js自体は弄りやすい量なので修正しようと思ったら、今度はLinux上で使えるgrowlnotify.exeが見つからず。

まぁ、モジュールがあるRubyなりPerlなりで書くという手もあるのですが、通知毎の実行コストが重そうだったので他の実装を探していたところC言語で書かれたgntp-sendを発見。

ただ、Sticky機能がなかったのと、オプション体系をもう少しシンプルにしたかったのでフォークして機能追加してみました。

続きを読む...

Posted by Takuchan at 23:41 | コメント (0) | トラックバック(0)

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
続きを読む...

Posted by Takuchan at 21:46 | コメント (0) | トラックバック(0)

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の流儀ではないと思い、色々調べた結果下記のように対応することにしました。

続きを読む...

Posted by Takuchan at 01:21 | コメント (0) | トラックバック(0)

2006年12月31日

cvsadmin以外の権限制御

cvsadmin以外のユーザのadminコマンドの権限制御についてのエントリです。
----
cvsでは「cvs admin」コマンドでリビジョンの削除を含むかなり危険な操作が多数できてしまいます。

ただ、このコマンドはその危険性もあり、簡単に使用禁止にできます。

手順は

  • cvs の構築時に決定されるグループ名 (既定では cvsadmin) が存在する場合、そのグループの一員だけが cvs admin を利用できます。その名前で無人のグループを作成すれば、 cvs admin の使用を全面的に禁止できます。
にもあるとおりで、デフォルトではシステムに「cvsadmin」というグループがあれば、そこに所属しているユーザ以外はcvs adminコマンドを使用できなくなります。

ただ、そうするとコミットログを変更する「cvs admin -m」や擬似ロック制御で用いる「-l」や「-u」、ディレクトリごとのキーワード置換モードを設定する「-k」まで使用できなくなります。

特にコミットログの付け直しは「動作版」と銘打ってコミットしたのに、動かなかったけど、バージョンとしては重要な場合などに良く付け直すのでツブしたくないコマンドだと思います。

そう言う要望が全世界的にも多かったのかどうか知りませんが、最近のCVSではCVSROOT/configに記載する「UserAdminOptions」というオプションが増えています。

このオプションはcvsadminグループが存在しているときに、cvsadminに所属していないユーザが「cvs admin」コマンドのどのオプションを実行できるかと言うことを指定するためのオプションで

UserAdminOptions=klum
などと指定することによって上記の問題を回避できます。

詳細は

に書いてありますので、こちらを参照してください(英文ですが(^^;)

Posted by Takuchan at 20:52 | コメント (0) | トラックバック(0)

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されるというのはどうにも気持ち悪いですが、そう言う挙動を期待して他がいろいろとできあがっていたので、それを直すのに比べればと言うことで、仕方が無くガマンすることにしました。

続きを読む...

Posted by Takuchan at 23:58 | コメント (0) | トラックバック(0)

2005年07月23日

Perl!?なSleep2.0

Javaにはどうにも縁がないんですが

これなら使えるかなということでちょっと使ってみました。

まず公式サイトは

で、ダウンロードはで、tgzはSleep自体のソースなんで、使うだけならとりあえずjarをダウンロードすればOKです。
(むろんJava自体はインストールされていないといけませんが(笑))

で、リファレンスを眺めながら簡単なコードをかいてみる

$a=3;
$b=4;
println($a + $b);
で、aaa.slという名前でとりあえず、保存して実行っと
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
うわ〜演算子の前後に半角スペース無いと動きませんか?(苦笑)

てか、シェルスクリプトかよ(爆)

こんなの使えたモノじゃないので当分無かったことにしようと思います(笑)
(せめて上記の問題が解決するまではさわってみる気も起こりません(;´д`)ノ)

Posted by Takuchan at 00:35 | コメント (0) | トラックバック(0)

2005年05月07日

MySQLで全文検索

MySQLにて運用中のDBで、数万件入って居るテーブルにて全文検索をするために

TextMsg like '%$search%'
なんていう風にして検索していたんですが、どうも最近1回の検索に数秒かかるようになってしまったため、なんとか高速化できないものかと調べてみました。

まず、出てきた答えの一つが

MATCH (列名) AGAINST ('検索文字');
を使う方法。

これにはFULLTEXTインデックスという大きめのインデックスが必要になりますがその分高速化できるようです。

しかし

と言うことで日本語はデフォルト使用できないようで、無理矢理使う場合は
  • ちなみに、↑の'a5aea5b6a5aea5b6'というのは、「ギザギザ」を16進数で表記したもの。こうやらないとMySQLが検索してくれないため。当然、事前に対象となるフィールドのデータを16進数にしたものを格納している。
う〜わ面倒(笑)

正直、今更数万件のDBの16進をいちいち求めて別テーブルに入れたり、データ登録ツールの自作なんてしたくないですよ(;´д`)ノ

と言うか、そもそも現状のホストマシン自体更新予定で、しかもDBエンジン自体の変更も視野に入れて検討中なんでもう少し現状で様子を見てみようと思います。

続きを読む...

Posted by Takuchan at 07:25 | コメント (2) | トラックバック(0)

2004年06月11日

RPGツクールXP

コピーとして「Windows版RPGツクールの究極進化系」と書いて居ますが、これに関してはまさにその通りだと思います。

その理由は

  • ■新機能『RGSS』

    『RPGツクールXP』で使用する、キャラクターのパラメータや戦闘システムなど、様々な機能はすべて『スクリプト』と呼ばれるプログラムで構成されています。
    『RPGツクールXP』では、『Ruby』というプログラミング言語を『RPGツクール』専用にカスタマイズ
    した言語『Ruby Game Scripting System(以下、『RGSS』)』が採用されており、その中のスクリプトを編集することで、ツクールの機能を自由に変更・追加することができるのです。/div>

Rubyでゲーム作れちゃうですか( ̄○ ̄;)!

これまでのシリーズでは、やっぱりある程度決まった型の中でゲームを構築していたようですが、Rubyでイベント処理書けるのなら自分が思い描くとおりのゲームが作れるんじゃ無いかと思います。

というか遊びながらゲームの勉強が出来るとは、理想のプログラムの勉強手段なのでは無いのでしょうか?

時間がないので私自身は買わないと思いますが、学生時代に出ていれば買っていろいろがんばっていただろうなぁと思います(^^;

続きを読む...

Posted by Takuchan at 12:25 | コメント (0) | トラックバック(0)

2004年03月01日

IEのJavaScriptのエラー表示

管理しているWEBサイトにJavaScriptでちょっと機能追加しようとしたら次のようなエラーがでました。

ランタイムエラーが発生しました。
デバッグしますか?

行:30
エラー: オブジェクトがありません。

30行ね、と思ってソース見直して格闘を始めるも、いくら修正してもエラーで通らない。
そこで思い切って30行目をコメントアウトしてみたら、まだ同じエラーがでる_| ̄|○

あり得ないのでちょっとぐぐって見たところ

  • その行番号+1行目が怪しいポイントです。
    なぜ+1なのかは、IEのバグです。
うぉい(;´д`)ノ

あわてて次の行を見てみると、まだその段階では定義されてないオブジェクトを使用しておりました(笑)

にしても、エラーの行ぐらいちゃんと出して欲しいモノです。

Posted by Takuchan at 15:19 | コメント (0) | トラックバック(1)

2004年02月22日

SecurityError

Rubyってほとんど触ったこと無いんですが、今回ちょっといろいろいじらないといけないことになって作業してたら次のようなエラーに遭遇

protocol.rb:83:in `initialize': Insecure operation - initialize (SecurityError)
なんだこれ?

調べてみると外部から渡される引数の汚染除去が終わってないときに出るエラーらしいですが、自分的に引数には結構縛り掛けてあっただけにちょっとショック(笑)

本当はちゃんと汚染除去を考えてプログラムを書き直さないといけないんですが、そんなにたいした用途に使う訳じゃないものなんで裏技で逃れることにしました。

方法はuntaintを使うだけ。
使い方は以下のような感じです。

aaa = 外部からのデータ
*func(aa.untaint) #←SecurityErrorを出す関数
まぁ、汚染されてないと思いこませるだけの裏技なんで、公開するようなサービスなんかではこういう解決方法はやめましょう(^^;

Posted by Takuchan at 00:35 | コメント (0) | トラックバック(0)

その他のエントリ
JSで操作できないオブジェクト 2003年11月05日 09:11

JavaScriptを使っていて<input type=text name=123>といった数字で始まるオブジェクト名を持つ要素をいじろうと思ったんですが、いざ使ってみるとエラーになります。 まぁ、アルファベットで始めるように変更すればちゃんと動くんで良いんですが、実際どの文字を使って良いのかと調べてみたところBasic HTML data ty

Eclipse(1) 2003年09月03日 15:35

フリーのIDEらしい「Eclipse」を入れてみました。 eclipse - FrontPageとりあえず上記サイトを参考にインストールさせて頂いたのでこちらに書いてあること以外はわからなかったりしますが、よさげだなと思った点は次の通りプラグインを入れればいろいろな言語の開発が行えるcvsサーバとの親和性が高い<これ重要JAVAなので