テクノロイド

コンピュータやゲーム他、色々日々思ったことをつづっていきます。

WindowsでRuby/Gtk2

2014-10-25 00:30:00 | Ruby, Rails,プログラミング
UbuntuでRuby/Gtk2を使ってスレッドとソケットを使って送受信しているプログラムをスマホかタブレットで使おうと思った。
最近はWindows8.1タブレットも安くなっているんで良さそう。AndroidはRuby/Gtk2ないから移植が必要だし、Windowsならあるし、最悪VirtualBoxでLinux入れて動かそうかなと。

Miix2 8買って思ったのは電源がUSB経由だと他のUSB機器が使えない。なのでACアダプタが別途差せる端子がある方がいいかなと。そしてマウスコンピューターの8インチタブレットがそうなのがわかった。割と安いのはいいのだがメモリが1GBしかない。これではいざという時のVirtualBoxはキツイ。他にないんだろうか?lenovoのyogaタブのWindows版が出たんでチェックしたら端子はないようだ。立てられるから給電したままに出来たら最高なんだが残念。
と思ってる時にケーズのチラシに前世代のCloverTrailなIconia W3が限定台数でチラシに載っていたので見に行ってデモ機みたらなんとACアダプタの丸い端子がささってるではないか。短いプログラムなんでCPUは最新じゃなくていいし。ということで決定。

Windows8なのでさっそく8.1へ。しかし失敗する。何度かやってたら成功したけどなんだったんだろう。充電してたから本体が熱くなってたからとか?謎。
VirtualBoxさえ動けば心配ないだろうとインストール。KonaLinux Lightをインストールして動かすかとインストールしたんだが妙に起動が遅い。Miixの半分の速度だとしても遅過ぎ。BayTrailと違ってVT対応してないからだろうか、起動が遅くて使えない。これは予想外だった。

というわけでWindows版Ruby1.9をインストール。これ自体は問題なかった。UbuntuでRuby1.8を使ってるんでなんとなく2.0より前のに。しかしgem install gtk2でインストできたかと思ったがエラーで使えず。Ruby/Gtk2のページをよく見るとWindows版は2.0移行と書かれていた。orz.
1.9をアンインストールして今度は2.1をインストール。しかしまたgemでエラー。ググるとここと同じエラーっぽい。1年半も前に解決してるんじゃなかったのか?と思いつつ、そこに書かれてるgem update --systemを実行してからgem install gtk2でうまく行って無事ウィンドウが表示された。

あ~ビックリした。改めてUbuntuの良さを再確認。

追記)
どうもWindowを表示するとTCPServer(のaccept辺り)が停止してしまう。Linuxだと動いてるんだが、rubyのバージョンの問題かなんだか分からない。他のバージョンも試したいがruby/Qt4を試すことにする。こないだKDEが気に入ったし。

と思ってたけど、WindowsのインストーラーにTkサポートとあったんでそちらで確認したらうまくいきそうなので、今回は割と使い方の似たTkに移植することにした。

入力した日付の年を1年間違えてたのを修正

2014-02-20 21:32:58 | Ruby, Rails,プログラミング
どうも年をとってくると1年があっという間に過ぎてしまい、今何年かよく分からなくなってくる。特に西暦と平成でかなりごっちゃになって間違うんだよな。

というわけで全データの年月日を1つ前の年で入力してしまったので、画面からいちいち修正するのはメンドイ。
なのでrails consoleを使ってやる。

onedata.ymdが年月日とする。翌年にするにはnext_yearメソッドなのでonedata.ymd.next_yearでいい。
これをupdate_attributeで変更出来るかな?とやってみたら出来た。

$ rails c
irb(main):001:0> onedata=AllData.first ←最初のデータ
irb(main):002:0> onedata.ymd
=> Sat, 27 Dec 2013
irb(main):003:0> onedata.update_attributes(ymd: onedata.ymd.next_year)
irb(main):004:0> onedata.ymd
=> Sat, 27 Dec 2014

railsってホント便利だわ。
で、全データの日付を翌年に更新するには

AllData.all.each {|d|
d.update_attributes(ymd: d.ymd.next_year)
}

自分で作ったプログラムって融通が聞くからいいな。

訂正)翌年をlast_yearとか記述しちゃってたけど、それは前年。

Rails4で和暦表示したいのだが

2014-02-19 16:25:54 | Ruby, Rails,プログラミング
Rails4で和暦表示したいのだが、なかなかいいあんばいのものが見つからない。
サクッとGemfileに記述してinstall出来ないものかと思ったのだが。
とりあえず、era_jaというのを見つけてGemfileに記述してbundle install。

$ rails c
Loading development environment (Rails 4.0.2)
irb(main):001:0> Date.today.to_era
NoMethodError: undefined method `to_era' for Wed, 19 Feb 2014:Date
(略)
irb(main):002:0> require 'era_ja/date'
=> true
irb(main):003:0> Date.new(2012,4,29).to_era
=> "H24.04.29"
irb(main):004:0> Date.today.to_era
=> "H26.02.19"

えーと、requireしないといけないんだけど、どこに記述すればいいんだろう?
ビューで使いたいので、app/views/layouts/application.html.erbの<%= yield %>の上に<% require 'era_ja/date' %>と記述したが駄目なんだけど。

と思ったら、またまたサーバーの再起動をし忘れたからだった。う~ん・・・

追記)
うまく行ってたのに、パソコンを再起動してサーバーを起動したらto_eraでエラーが出る。
仕方ないので素直にコントローラーの最初に記述した。

Rails4でpagination

2014-02-18 11:16:23 | Ruby, Rails,プログラミング
index画面の一番下に新規追加フォームを表示してあると、表示データが多いとスクロールしなきゃいけなくなるのでpaginationする必要が生じる。
というわけで追加する。
チュートリアルだとwill_paginationを使ってたが、最近はkaminariというのが使われているようなのでそれにする。

Gemfileにgem 'kaminari'を追加して、bundle installを実行。
コントローラーでNumber.order("tukihi,junjo")と記述していたのをNumber.page(params[:page]).per(25).order("tukihi,junjo")に変更。per(25)は1頁に25行。
ビューに<%= paginate(@numbers) %>を追加。

これだけ。

のはずが、うまく行かない。
何かモデルに記述が必要なのか?と考えてみたが、単にサーバーの再起動をしてなかっただけだった。
あやうくハマりかけたが、簡単で良かった。

見栄えをよくしたり出来るんだが、自分使い用だからそのままで。

Railsで開発中でのDBのバックアップ

2014-02-14 13:15:54 | Ruby, Rails,プログラミング
railsでデータベースの操作をするには rails db なんだが、sqlite3のクライアントを入れてなかったらしく、使えない。
データベースの中身を見たい場合はrails consoleで何とかなるんだが、ちょっと念の為バックアップが取りたいと思ったのでどうしようかと。

ただ、sqliteのデータベースは1つのファイルらしい。
開発中の場合はdb/development.sqlite3がそのようだ。
つまりサーバーが起動してない時にこれをコピーするだけでいいと思う。
が、まあアプリケーション自体もほぼテキストなんで、アプリケーションのフォルダ自体をtarでまとめりゃいいかと思う。

tar zcf applidevbak.tgz appli_name/

みたいな感じで。
念の為railsやってるLXCの仮想環境自体も同じようにバックアップしてるんだけど。

RailsでCSV帳票出力

2014-02-13 14:38:44 | Ruby, Rails,プログラミング
一覧をCSVファイル出力する。

index.htm.erbに
<%= link_to 'CSV出力', numbers_path(format: 'csv') %>
を記述

コントローラーのindexの所に
    respond_to do |format|
      format.html # index.html.erb
      format.csv { csv_export }
    end

を追記(@numbersは既に記述済)

privateの中にでも

def csv_export
require 'csv'
data = CSV.generate do |csv|
csv << ['項目1','項目2'] # ※注
@numbers.each do |number|
csv << number.hoge
end
end
send_data(data, type: 'text/csv', filename: "番号一覧#{Time.now.strftime('%Y_%m_%d_%H_%M_%S')}.csv")
</pre>
のように記述

たったこれだけ。

※注:Ruby1.9だとコントローラーファイルの先頭に# -*- encoding: utf-8 -*- を記述する必要があった。Ruby2からは必要ないらしい。
(追記)偶然見つけたが、# encoding: utf-8 でいいらしい。

やっぱりroutesにハマる

2014-02-13 12:29:52 | Ruby, Rails,プログラミング
Railsの鬼門だと思われる config/routes.rb へのパスのルートへの記述でハマった。
CSVファイル出力をするメソッドを記述してリンクを張るために、
resources :numbers
get 'numbers/csv_export', to: 'numbers#csv_export'
と記述するんだが、エラー出まくり。

ググったり、あれこれ試行錯誤するんだが、全然駄目だから途方に暮れてたんだが、結局記述の順番を間違えてたのが失敗だった。
resourcesの後に記述するとRESTfulの一部と認識されてしまうのかな。
なので get を先に書くのが正解だった。

get 'numbers/csv_export', to: 'numbers#csv_export'
resources :numbers

これだけのために時間が浪費されていく・・・
なさけない・・・

そして上手く行ったと思ったが、URLにnumbers/csv_exportと表示され、他の画面に移った後にBackで戻るといちいちCSV出力されそうになるんで塩梅が悪い。
なのでredirect_toさせようとしたらDoubleRenderErrorとなる。どうやらsend_dataがレンダリングしているらしいのでにっちもさっちもいかない。

なので、先日紹介したThinReportsはどうやってんだろ?と調べたら、formatをpdfと指定してindexを呼んでいる。というわけでcsvも出来るのかと調べたら出来るようだ。

結局、routes.rbの指定は要らなくなった。時間返せ・・・

railsでPDF帳票出力

2014-02-10 14:59:53 | Ruby, Rails,プログラミング
Ruby&Rails帳票ソリューションThinReportsが良さげ
Rails3で帳票印刷を試す」がお試しインストールの参考になった。
ただ、64bit板Ubuntuで帳票エディタが動かなかった。
WineでWindows板を動かせばいいだろうか・・・
追記)よく考えたら一度Ubuntuを上書き再インストールしてから32bit板のライブラリをインストールしてないからかもしれない。

railsで携帯の番号管理やってみる(4)

2014-02-07 23:34:54 | Ruby, Rails,プログラミング
トップページは回線番号の一覧なのだが、その番号に対する最新の契約状況も合わせて表示したい。
というわけで、最新のcontractを(文字列で)取得するlast_contractメソッドをphonenums_helper.rbに記述。
  def last_contract(phonenum)
    c=phonenum.contracts.order("changedate").last
    if c.nil?
      ""
    else
      c.changedate.to_s+","+c.owner・・・(←略)
    end
  end

簡単に書いてるが、これが分かるのに苦労した。

とまあちょっと端折ってるが、希望通りのが「ようやく」完成。
思ったよりつまづいてるけど、なんとなくRails4が分かったかな。
次に作るのはすんなりいければいいけれど。Railsなら簡単に出来ると思って勉強したわけだし。
rails consoleが地味に便利なんだよなー。色々試せるから。

追記)
キャリアを選ぶのに、3~5キャリアしかないのでselectionで選べるようにした。formに以下記述。
<%= f.select :carrier, %w{ docomo au softbank emobile wilcom MVNO } %>
配列のところを定数にしたいと思ったんだが、どこに記述していいか分からなかった。かなり行き届いたrailsなのに、こんなことがあるなんて。
とりあえず、config/initializers/constants.rb作ってCARRIERS=%w{ docomo au softbank emobile wilcom MVNO }って書いたけど、なんかすっきりしないな。サーバの再起動が必要だったし。

いろいろと参考になるサイト。
Railsドキュメント
[初心者向け] RubyやRailsでリファクタリングに使えそうなイディオムとか便利メソッドとか

railsで携帯の番号管理やってみる(3)

2014-02-06 22:26:20 | Ruby, Rails,プログラミング
ここを参考に作業した。
オリジナルは英語のここなので、見比べながら。

"changed is defined by Active Record"というエラーが出て何のことやらわからず悩んでいたんだが、contractsテーブルのカラム名に"changed"って使ってたからだった。どんなカラム名付けたかすっかり忘れてたのでハマった。
というわけでカラム名の変更。
$ rails g migration rename_changed_to_contracts
命令は自分で記述する必要があるようだ。
rename_column :contracts, :changed, :changedate

そうこうしてたら、あちゃー、referenceの張り方間違えてるショック!
number:references(カラム名)じゃなくてphonenum:references(テーブル名)にしなきゃいけなかった。
結局rake db:rollback STEP=3でPhonenumだけの状態にして、contractsのmigrationファイルを書き換えるハメに。
rails g scaffold Contract phonenum:references owner:string model:string carrier:string changedate:date comment:text
ふう、やっと表示が上手く行った。
いやあ~Railsって後戻りも楽チンだからうれしい。

実際に登録をやってみるが、contractコントローラーのcreateメソッドのとこで
@contract = @phonenum.contracts.create(params[:contract])
とやるとアクセスエラー。
Rails4のStrongParameterに引っかかった。
@contract = @phonenum.contracts.create(params[:contract].permit(:carrier,~))
みたいにpermitしなければならなかった。
これはcarrierカラムを後付けで作ったからだった。privateのとこにcontract_paramsメソッドが記述されてるので、そこに追加してそれを呼ぶように修正。
@contract = @phonenum.contracts.create(contract_params)
それと@contract = Contract.find(params[:id])もprivateメソッドが定義されてて、before_actionで呼び出されてるのでdeleteのところ等で記述する必要はなかった。
あと、親がdeleteされた時の為にmodelのhas_manyのところにdependent: :destroyも入れとくの忘れないように。

やっとひととおりの流れは完成。