2016年1月2日土曜日

Railsでdecorate_columnsエラー

Rails(というかActiveRecord)では「type」というカラム名は予約語らしいです。

実際にtypeをカラム名に使ってみると、こんなエラーが出ます。

ActiveRecord::SubclassNotFound - The single-table inheritance mechanism failed to locate the subclass: 'hogehoge'. This error is raised because the column 'type' is reserved for storing the class in case of inheritance. Please rename this column if you didn't intend it to be used for storing the inheritance class or overwrite SolutionDimInfo.inheritance_column to use another column for that information.:
このエラー文なら「あ、予約語使っちゃてる」とわかると思います。

問題なのは、typeに存在するクラスを代入してしまっている時です。

seed-fuのデータが以下のように設定されているとします。
Hoge.seed do |hoge|
 hoge.type = "Float"
end
これを読みこんで、コントローラorモデルで使っているページにアクセスします。

すると、先ほどとは違ったエラーが出るのです!
NoMethodError - undefined method `decorate_columns' for Float:Class:
decorate_columnsでググっても原因がわからず、新年早々アホなエラーに時間をかけてしまいました。

2015年8月27日木曜日

PocketがFirefoxに組み込まれた結果,Pocketが使えなくなる矛盾


今更ですが,FirefoxにPocketが組み込まれた結果,かえってPocketが使いにくくなっています.
  • Debianでは,Firefoxの更新から少し遅れたバージョン
  • 古いバージョンなので,Pocketが組み込まれていない
  • でも,Firefoxのアドオンサイトでは,Pocketのアドオンが削除されている
  • Pocketアドオンが使えない! 
Bookmarkletを使ってしのいでいます…

2015年8月15日土曜日

FactoryGirlの初期化タイミング

Railsのプログラミングをしていて,詰まったことひとつ.

Fixtureの代わりにFactoryGirlを使っているのですが,データが設定されるタイミングで引っかかりました.

class Hoge < ActiveRecord::Base
  after_initialize do |sol|
    puts sol.to_s
    sol.hoge
  end

みたいなクラスのファクトリーを作り,テストを実行すると,各要素がセットされていない状態で出力されます.
なので,after_initialize中で要素を操作したりすると,上手く行かない事があるとようです.

自分もそれでしばらく悩んでいました.

2015年2月24日火曜日

ルワンダの善人(後)

ムバイェ大尉(BBC World Serviceから)



ムバイェ・ディアニュ大尉(Capt Mbaye Diagne)を知っていますか?たぶん知らないと思います.
ルワンダの善人(前) でルワンダの話をしたのは, BBCのニュースA good main in Rwandaを読み,ほとんど知られていない英雄を知ってもらいたいと思ったためです.
ケーブルやスカパーでも放送されてたようです(自分は見てない).


ムバイェ大尉はセネガル軍の士官で,国際連合ルワンダ支援団(UNAMIR)の派遣員として任務についていました.
UNAMIRは政府と,反政府軍(RPF) の間で結ばれた休戦協定を監視,治安の維持をするために派遣された平和維持軍です.
しかし,任務の割に不十分な装備,人員,政治的な束縛の結果,後の虐殺を防ぐことが出来ませんでした.

1994年4月のハビャリマナ大統領の暗殺が起こり,軍部とフツ過激派,フツ系の与党,大統領夫人のグループ,民兵集団などが権力を握る,混沌とした状況,そして虐殺が始まります.

多数派フツ族の穏健派であったウィリンジイマナ(Uwilingiyimana)首相も白昼堂々,暗殺されてしまいます.
UNAMIRは首相の家族を発見するのですが,家族を保護する”マンデート”※1の有無と,安全面の心配から,保護すべきか議論されました.

残していけば殺されるであろう家族を前にして,何を呑気なと思うかもしれませんが,首相の暗殺時にUNAMIRのベルギー兵士も悲惨な拷問の末※2に殺されており,他にも保護すべき人々がいる緊迫した状況だったことも考慮する必要があります.

ムバイェ大尉はこの時,非武装だったにもかかわらず,自分の車に家族を乗せ,避難所――ホテル・ルワンダの舞台,オテル・デ・ミル・コリン――まで無事に保護しました.
 

この他にも,100日間の虐殺の間に,ムバイェ大尉が救った命は400から1000人以上とも言われています.
ホテル・ルワンダのルセサバギナ氏と同じくらい沢山の人を助けたことになるのですが,大きな違いが一つ.
ルセサバギナ氏は生き残りましたが,ムバイェ大尉は任務の途中で砲撃により殉職してしまいました.
隣人同士が殺し合い,国際社会は知らんふりを決め込む,善や正義の存在を疑わざるを得ない状況下においても,ムバイェ大尉のような人物がいたことは,仄かな希望と言えるでしょう.



※1: 国連活動において,許されたor与えられた権限
※2: 性器を切断され,口に押し込められたとか

2015年2月16日月曜日

ルワンダの善人(前)




去年(2014年)はルワンダ虐殺から20年の年でした.
ホテル・ルワンダなどの映画や,なぜ、世界はルワンダを救えなかったのかなどの書籍になってます.

3か月の間に80~100万の人が殺され,200万の難民が生じた,悲惨とかの言葉では十分に表現出来ない出来事です.
命はそろばん勘定ではありませんが,比較のために大きな戦争,災害の死者数を示します.
  • 東日本大震災での死者・行方不明者,1万5千~2万人
  • 太平洋戦争での日本の戦没者,200~300万人
  • WW2通してのアメリカの戦没者,40万
ルワンダの人口が800万,日本は8000万であったこと,太平洋戦争の期間を考えると,虐殺の規模がわかります.

人数だけでも問題ですが,
  • 組織だった冷酷な集団ではなく,隣人同士が殺しあった内戦であること
  • 国際社会が虐殺を知りつつ,実質的に無視したこと
  • 展開していたPKOが不十分な権限,人員,装備しか与えられていなかった
など,多くの問題を我々に考えさせる出来事です.

特に最後の問題は,自衛隊の海外協力に関連した重要な問題です.
同じ日本人の自衛官と, 1万キロ離れた国に住む数十万の黒人の命を,天秤にかける必要があるからです.
人種や国籍で差別すべきではないとは思いますが,自分や友人,家族が死ぬのは嫌です.
答えはわからない,存在しないでしょうが,ジレンマが存在することさえ認めないのは卑怯なことです.

少し前のBBCの"A good man in Rwanda"が気になったので,後ほど紹介します.

2014年12月22日月曜日

善きサマリア人?

自殺したいと思ったことはありますか?
自殺しそうな親しい人はいますか?
だとしたらSamaritans Radarは有効なアプリかもしれません.

Samaritans RadarはTwitterを利用した自殺防止アプリです.
下図のような流れで,インストールしたユーザー(A)がフォローしている人(B)が,自殺しそうなキーワードのツィートを行うと,ユーザーに連絡が行くようになっています.

自殺を防ぐかもしれないサービスなので良さそうに見えるのですが,海外(イギリス?)だと物議を呼んでいるみたいで,BBCイギリス版WiredGigaOMなどの有名ドコロで記事になっています.日本だとあまり話題になっていない(ググっても1000件程度?)ようですが,AFP通信 には日本語の記事があります.



問題になっている原因は,ユーザーBの同意とプライバシーに関する認識の違いです.

普通のカウンセリングだとBの同意がありますが,Samaritans Radarだと勝手に自分のツィートが横流しされ,Bの精神状態に関する分析が勝手に行われるわけです.
当然,気持ち悪いとか信頼されていないとか思っちゃう人もいるわけです.

また,この問題の背景としてソーシャルメディアでの公共性,個人性などの認識の違いもあると考えられます.
いわゆるバカッター,そこからの個人特定などもそうなのですが,
自身がTwiitterやFacebookなどで情報を公開していたとして,それを勝手につなぎ合わせる事が許されるのか?
難しい問題だと思います.



なお,日本語には対応してないので,心配な人がいるならいのちの電話などに相談してみてください.


2014年12月1日月曜日

Rubyには,文字列を中身そのまま文字列に変換するメソッドがある

 言葉だと分かりにくいので動作例
irb(main):019:0> s = "abc"
=> "abc"
irb(main):020:0> s.to_s
=> "abc"
なんでこんなメソッドがあるか,リファレンスによると「統一的に処理する」ためだそうです.
実際,自分がこのメソッドに気づいたのもFloatとかIntegerとかの中にStringも入っているデータを文字列に変換しようとした途中でした.

2014年8月9日土曜日

Rubyでランダムな日付を作成


テストなどで,ランダムな日付を作る必要がある時もあると思います.
最初は
  • ランダムな年,ランダムな月…をrand関数で作る
  • それらを文字列化,適当に連結
  • Date.parseでDateオブジェクトに返還
で良いかなぁとも思ったのですが(例えば Rubyで「ランダムに日付取得」 ),.

例えば司馬遼太郎さんが生きている間(1923年8月7日 - 1996年2月12日)のランダムな日を選ぶ時には
require "date"
s1 = Date.parse("1923/08/07")
s2 = Date.parse("1996/02/12")
s = Random.rand(s1 .. s2)

得られたsはDateオブジェクトで,司馬遼太郎さんの過ごした人生の一日が入っているはずです.


割とどうでもいいですが,遠藤周作(1923年3月27日 - 1996年9月29日)と司馬遼太郎は生年・没年ともに同じなんですね.

都道府県名の一覧(カタカナ)

タイトルオンリー
漢字ひらがなもどうぞ

ホッカイドウ
アオモリ
アキタ
ミヤギ
ヤマガタ
フクシマ
イバラキ
トチギ
チバ
グンマ
サイタマ
トウキョウ
カナガワ
ヤマナシ
ニイガタ
ナガノ
トヤマ
イシカワ
ギフ
シズオカ
アイチ
フクイ
ギフ
シガ
キョウト
オオサカ
ナラ
ミエ
ワカヤマ
ヒョウゴ
トットリ
シマネ
オカヤマ
ヒロシマ
ヤマグチ
エヒメ
トクシマ
カガワ
コウチ
フクオカ
サガ
ナガサキ
オオイタ
クマモト
ミヤザキ
カゴシマ
オキナワ

都道府県名の一覧(ひらがな)

タイトルオンリー
カタカナ漢字もどうぞ

ほっかいどう
あおもり
あきた
みやぎ
やまがた
ふくしま
いばらき
とちぎ
ちば
ぐんま
さいたま
とうきょう
かながわ
やまなし
にいがた
ながの
とやま
いしかわ
ぎふ
しずおか
あいち
ふくい
ぎふ
しが
きょうと
おおさか
なら
みえ
わかやま
ひょうご
とっとり
しまね
おかやま
ひろしま
やまぐち
えひめ
とくしま
かがわ
こうち
ふくおか
さが
ながさき
おおいた
くまもと
みやざき
かごしま
おきなわ

都道府県名の一覧(漢字)

プログラムで必要だったのですが,意外と見つからなかったので.
カタカナひらがなもどうぞ

北海道
青森県
岩手県
宮城県
秋田県
山形県
福島県
茨城県
栃木県
群馬県
埼玉県
千葉県
東京都
神奈川県
新潟県
富山県
石川県
福井県
山梨県
長野県
岐阜県
静岡県
愛知県
三重県
滋賀県
京都府
大阪府
兵庫県
奈良県
和歌山県
鳥取県
島根県
岡山県
広島県
山口県
徳島県
香川県
愛媛県
高知県
福岡県
佐賀県
長崎県
熊本県
大分県
宮崎県
鹿児島県
沖縄県

2014年7月15日火曜日

Rubyのuptoに隠れたる罠


Rubyである範囲内で繰り返し処理をする時,uptoメソッドを使うと思います.
3.upto(12){ |i| puts i }  #例1

みたいに.
このuptoメソッドはIntegerクラスのメソッドですが,実はStringクラスにも同名のメソッドがあります.
このメソッドでは,文字列を順番に繰り返します.例えば,アルファベットの順番がわからなくなったら
"a".upto("z"){ |i| puts i } #例2
とすると,aからzまでの文字が表示されます.
数値の文字列にも対応しており,
 "3".upto("12"){ |i| puts i } #例3
で3から12までの数値の文字列が表示されます.
訓練されていないと,例1と例3の違いには気づかないかもしれませんが.

他所から引っ張ってきた「Stringクラスで表現された数値」を「Integerの数値」のつもりで,「なんでuptoが動いているのに,数値扱いされないんだ!」とハマる阿呆は僕だけで良いでしょう.

2014年7月10日木曜日

Ruby mysql2でLoad infile



MySQLにローカルファイルからデータを登録するにはLOAD DATA INFILEを使えば良いのですが,
RubyのMysql2ライブラリで使う際のメモ書き少々.

やる事は簡単でドキュメントの"Connection options"の項にチラッとある"local_infile"オプションを有効にすると良いです.例えば,
 con = Mysql2::Client.new(:host =>"host", :username => "hoge", :password =>"pw", :database => "db", :local_infile => true)
 みたいな感じです.

SQLでNULLのデータを数える


SQLでデータ数を数える時はCOUNT関数を使えばよいのですが,あるカラムがNULLのデータを数える時は注意が必要です.
例えば,hogeテーブルからCOLカラムがNULLの個数を数えようと

SELECT COUNT(COL) FROM hoge WHERE COL is NULL;
みたいにしてしまうと,結果は0になってしまいます.
これは,COUNT(COL)がCOLカラムのうちNULLでない個数を数えているためです.
NULLのデータの個数を数えるには,COUNT(*)とするか,COUNT(OTHER_COL)みたに別のカラムを引数にする必要がありますが,前者は遅いらしいので注意する必要があります.



2014年3月30日日曜日

漆黒の呪詛を聖なる白粉で


万年筆のインクが机について困っていたのですが, 777NEWSさんの記事にあるように歯磨き粉で落ちました.
ただそれだけです.つまらない話で ごめんなさいごめんなさいごめんなさい
使っているのはパイロットのセレモです.一番安いモデルで ごめんなさいごめんなさいごめんなさい
歯磨き粉はクリアクリーンです.誰得な話で ごめんなさいごめんなさいごめんなさい


VirtualBoxの共有フォルダでSubversionのチェックアウトが出来ない件

VirtualBoxの共有フォルダ上でSubversionの作業コピーを作ろうと
 svn checkout repository_dir shared_dir
ってやったんですよ.
 svn: '.svn/tmp/entries' から '.svn/entries' にファイル名を変更できません: 許可されていない操作です
権限の問題かと思い,質問サイトを参考に
mount -t vboxsf -o remount,gid=1000,uid=1000,rw drive shared_dir
みたいな感じで所有者を自分にしてもダメ.ディレクトリの移動・作成・変更なんかは出来るのに.
で,もう少し調べてみると同じ症状の方VirtualBoxのフォーラムにスレを発見.
フォーラムの方では「Subversionに場当たり的にハックして直したよ」的なレスがあり,
Subversionにもbug fixで提出してます(3856)
ただし,どうも取り込まれてはいないよなので,共有フォルダ以外でチェエクアウトして使ってます.

2014年3月9日日曜日

ウクライナと旗

ウクライナ問題がニュースとなっていますが,騒動で出てくる旗の説明がBBCであったので少し調べてみました.
Flag of The World英語版Wikipedia日本語版ウィキペディア,人文社 世界の国旗大百科などから.

国旗

ご存じロシア国旗と今度の騒乱で知られるようになった?ウクライナ国旗.
ロシアの方はメジャーな三色旗(トリコロール) ですが,ウクライナの方は割と珍しい黄色と水色の組み合わせ.

クリミア旗


左が独立orロシア併合を進めているクリミア自治共和国の旗.
ロシア国旗と色使いが同じですが,順番と比率(クリミアは1:2,ロシアは2:3)が違います.
右がクリミア少数民族,クリミア・タタール人の旗.左上の印は"tamga"と言うクリミア汗国やトルコ系民族のシンボルだとか.
配色はウクライナと同じですね.

旧ウクライナ国旗

現在のウクライナは冷戦後のソ連崩壊に伴い生まれた国ですが,戦間期やWWII後にもウクライナの国はありました.

左は「ウクライナ蜂起軍」というWWII中に独露双方と戦ったパルチザン組織の旗です.
右は「ドネツク=クリヴォーイ・ローク・ソビエト共和国」という 36日間だけウクライナ東部に存在したソビエト政権の旗です.

ロシア海軍旗


クリミア南部のセバストポリにはロシア海軍の基地があり,ロシアの介入する一つの理由です.海軍には国旗とは別の軍艦旗(日本なら旭日旗)が設定されている事があり,ロシア海軍の軍艦旗は左の聖アンドレイ十字です.


2014年2月25日火曜日

VirtualBox上でMySQLサーバ


サーバゲストOS(Debian)上のMySQLにホストOSないし,別のゲストOSからアクセスできるようにします.
ゲストVMの作成,OSやMySQLのインストールは済んでいるとして話しを進めます.




VMのネットワーク設定

VirtualBoxのVMの設定を変更し,ゲスト間,ホスト<->ゲスト通信をできるようにします.

仮想マシンの設定,ネットワークから「ホストオンリーアダプター」と「内部ネットワーク」を各VMに追加してください.



ゲスト<->ホスト間はそのままで良いのですが,ゲスト間通信はOS設定もする必要があります.
Going My Linux Wayさんを参考に,/et/network/interfacesの変更,再起動を行ってください.
上手く行っていれば,ifconfigコマンドを実行した際に下のようになっているはずです.


pingなんかでも確認してみてください.

MySQLの設定

内部ネットワーク,ホストネットワーク経由でサーバのMySQLにアクセスできるようにします.
まず普通にMySQLのユーザを作ります.
GRANT all privileges  on *.* to user IDENTIFIED by "password" WITH grant option;
DebianのデフォルトのMySQL設定ではbind-addressオプションが設定されており,ローカル以外からはアクセスできないようです.コメントアウトするか,アドレスを追加してください.

apt-getからphpmyadminをインストールする事で,Webブラウザからもアクセスできるようになります.
ホストからは192.168.56.101(eth1のアドレス)/phpmyadmimn,別のゲストからは192.168.7.12/phpmyadminです.
なお,DBOnlineさんのページではhttp://localhost/phpMyAdmin/index.phpと大文字になっていますが,Debianのデフォルト設定では小文字のアドレスのようです.




2014年2月22日土曜日

IIP特許データベースの導入

研究で特許のデータベースが欲しくなって調べてみると,知的財産研究所さんがIIPパテントデータベースなる物を公開してくれているのを発見.
Debian GNU/LinuxのMySQLに導入する話.

ファイルのダウンロード,解凍

知的財産研究所さんのサイトからダウンロードし,適当に解凍します.回線によっては結構時間がかかるかもしれません

文字コード

ダウンロードしたファイルはCSV形式なのですが,サイズがサイズなのでデータベースに取り込んだ方が良いと思います.
が,ファイルがShift-JISで何かと不都合が出てくるのでUTF-8に変更します.
文字コード変換ソフトnkfをインストールして,以下のスクリプトを実行します.

mkdir utf8/
for a in `ls *.csv`
do
    echo $a
    nkf -w $a > utf8/$a
done

MySQLの文字コードを(たぶん)調整する必要があるのですが,割と情報が錯綜してます.
/etc/mysql/my.cnfを
…略…
[mysqld]
character-set-server = utf8
collation-server = utf8_general_ci
init-coonect = SET NAMES utf
…略…
[mysql]
default-character-set = utf8
みたいな感じに修正してみてください.
忘れないように再起動
service mysql restart

データベースへの取り込み

MySQLにログインして,データベースの作成
CREATE DATABASE iip;
テーブルの作成
use iip;
source iipcreate.sql;
データ取り込み
LOAD DATA INFILE 'ap.csv' into table ap FIELDS terminated by ',' ENCLOSED by '"';
LOAD DATA INFILE 'applicant.csv' into table applicant FIELDS terminated by ',' ENCLOSED by '"';
以下同様
データの取り込みは結構時間が掛かりますので,スクリプトにでもした方が良いかも.

テスト

上手く取り込めたかテストテスト.MySQLにログインして
mysql> select * from reg limit 10;
mysql> select * from applicant where name llike "鳥取大学%"



上手くいってる?

2014年2月18日火曜日

シェルスクリプトでリダイレクト出来ない件について

このあいだ,シェルスクリプト書いたんですよ.シェルスクリプト
そしたらなんか表示がめちゃくちゃいっぱいでリダイレクトできないんです.
で,よくググったらなんか垂れ幕下がってて,標準エラー出力を使えって,書いてあるんです.
もうね,アホかと。馬鹿かと.
(中略)
 まあお前らど素人は,VBAでも使ってなさいってこった.

timeコマンドの出力は,標準出力ではなく標準エラー出力なので
bash hoge.sh > log
でなく
bash hoge.sh >& log
にする必要があるそうです.