htmlとjQueryでwebにexcelチックな機能をHandsontableというのが紹介されていました。
http://www.ideaxidea.com/archives/2012/06/handsontable.html
どっかにこの手のがあるだろうなぁと一度検索したけど、うまく見つからなかったことがあったのでメモ的エントリです。
変更されたカラムデータを取得したりすることもできるようです。
http://warpech.github.com/jquery-handsontable/index.html#example6
使い方は、以下を参照です。
https://github.com/warpech/jquery-handsontable
2012-06-27
2012-06-25
TONOシャツがキニナル
ポロシャツなのですが、胸の刺繍がPOLOでなくTONOなところがステキな殿シャツがキニナルのです。
特に以下の大殿シャツがステキでキニナルのです。
http://tonotown.jp/products/detail.php?product_id=31
特に以下の大殿シャツがステキでキニナルのです。
http://tonotown.jp/products/detail.php?product_id=31
2012-06-16
javascriptで郵便番号から住所に変換するにはajaxzip3が便利
javascriptで郵便番号から住所に変換するには、ajaxzip3が便利です。
郵便番号から住所に変換するときに面倒なのが郵便番号情報のメンテナンスなのですが、
これをおまかせしておくことができるのがステキなのです。
詳しくは以下を見てください。
https://github.com/ajaxzip3/ajaxzip3.github.io
実装のサンプルも以下にあります。
https://ajaxzip3.github.io/sample-page/
こちらのサンプルのように、郵便番号欄を以下のように書くことだけで実装できるのです。
<input type="text" name="zip01" onkeyup="AjaxZip3.zip2addr(this,'','pref01','addr01');">
これだけでとても簡単です。
上記の例だと郵便番号欄に郵便番号を入れたら住所に反映されます。
しかし、郵便番号をコピーしておいて、マウスで右クリックで貼り付けた場合、keyupのイベントが発生しないので変換されないのです。これを貼り付けでも動作させるには、単純にイベントを変えればOKです。
<input type="text" name="zip01" onchange="AjaxZip3.zip2addr(this,'','pref01','addr01');">
この場合は、フォーカスが他に移れば変換が行われます。
ただしキーボードで入力したとたん変換されなくてフォーカス移動が必要です。
というわけで、両方のイベントに対応する方法です。
jQueryを利用していることが前提ですが、以下のような感じで両方のイベントに対応できます。
追記:
今は、Yubinbangoというのもあるらしいです。
詳細は、以下で
https://github.com/yubinbango/yubinbango
郵便番号から住所に変換するときに面倒なのが郵便番号情報のメンテナンスなのですが、
これをおまかせしておくことができるのがステキなのです。
詳しくは以下を見てください。
https://github.com/ajaxzip3/ajaxzip3.github.io
実装のサンプルも以下にあります。
https://ajaxzip3.github.io/sample-page/
こちらのサンプルのように、郵便番号欄を以下のように書くことだけで実装できるのです。
<input type="text" name="zip01" onkeyup="AjaxZip3.zip2addr(this,'','pref01','addr01');">
これだけでとても簡単です。
上記の例だと郵便番号欄に郵便番号を入れたら住所に反映されます。
しかし、郵便番号をコピーしておいて、マウスで右クリックで貼り付けた場合、keyupのイベントが発生しないので変換されないのです。これを貼り付けでも動作させるには、単純にイベントを変えればOKです。
<input type="text" name="zip01" onchange="AjaxZip3.zip2addr(this,'','pref01','addr01');">
この場合は、フォーカスが他に移れば変換が行われます。
ただしキーボードで入力したとたん変換されなくてフォーカス移動が必要です。
というわけで、両方のイベントに対応する方法です。
jQueryを利用していることが前提ですが、以下のような感じで両方のイベントに対応できます。
$(function() {
var addr_handler = function(){
AjaxZip3.zip2addr('zip01', '', 'pref01', 'addr01');
};
$("#zip01").change(addr_handler).keyup(addr_handler);
});
追記:
今は、Yubinbangoというのもあるらしいです。
詳細は、以下で
https://github.com/yubinbango/yubinbango
2012-06-15
rspecで標準出力に出力した内容をチェックする
rspecで標準出力に出力した内容が予定通りかを確認するspecを書く方法です。
以下のような感じです。
p "hello"
の部分に本来はチェックしたい処理を書いておきます。
以下を参考にさせていただきました。
http://d.hatena.ne.jp/POCHI_BLACK/20100324
以下のような感じです。
p "hello"
の部分に本来はチェックしたい処理を書いておきます。
describe "aaa" do
it "helloと出力" do
$stdout = StringIO.new
p "hello"
out = $stdout.string
$stdout = STDOUT
out.should == "hello\n"
end
end
以下を参考にさせていただきました。
http://d.hatena.ne.jp/POCHI_BLACK/20100324
2012-06-14
rubyでexcelのrate関数的なもの
excelにRATE関数というのがあります。
毎月支払額と支払い回数と元本から利率を計算してくれます。詳しくは以下を見てください。
http://excel.onushi.com/function/rate.htm
これをrubyで実装してみようと思ったわけです。
http://code.google.com/p/rinvestment/
を利用させていただきます。
適当な場所に
svn export http://rinvestment.googlecode.com/svn/trunk/ rinvestment
で取得します。
rinvestment/irr.rb
に
p RInvestment.irr([-50000, 35000, 35000, 35000], 0.1, 20)
と書かれているので削除しておきます。
rinvestmentをrequireできるところにおいておいて、以下のようなファイルを作成します。
excelのRATE関数は引数を最大5個取れますが、その先頭3つまでにしか対応してないrate関数です。
これを実行すると
0.00115572436341284
と出力され、以下のようにexcelのRATE関数と同じ結果を得ることができます。
毎月支払額と支払い回数と元本から利率を計算してくれます。詳しくは以下を見てください。
http://excel.onushi.com/function/rate.htm
これをrubyで実装してみようと思ったわけです。
http://code.google.com/p/rinvestment/
を利用させていただきます。
適当な場所に
svn export http://rinvestment.googlecode.com/svn/trunk/ rinvestment
で取得します。
rinvestment/irr.rb
に
p RInvestment.irr([-50000, 35000, 35000, 35000], 0.1, 20)
と書かれているので削除しておきます。
rinvestmentをrequireできるところにおいておいて、以下のようなファイルを作成します。
excelのRATE関数は引数を最大5個取れますが、その先頭3つまでにしか対応してないrate関数です。
require "rinvestment"
def rate(t,p,pv)
a = [pv]
t.times { a.push(p) }
ret = RInvestment.irr(a)
end
p rate(48,-15000,700000)
これを実行すると
0.00115572436341284
と出力され、以下のようにexcelのRATE関数と同じ結果を得ることができます。
2012-06-13
railsで社内システムを作るときに知っていると便利そうなこと
私は小規模ですがrailsで社内システムをいくつか作っています。
そこでrailsで社内システムを作るときに便利かもしれない、このブログのエントリをまとめてみました。
少々古い情報もありますが・・・
・Oracle、SQL Serverへの接続
社内には既存システムとしてOracleやSQL Serverがあると思います。
新しくrailsで作成するシステムのメインのDBはmysqlでもよいと思うのですが、既存システムのデータ参照などをすることも多いと思います。
OracleやSQL Serverが動いているマシンは、結構ゴージャスだったりバックアップが行き届いていたりということも多いと思うので、いっそ新しく作るシステムのメインのDBも既存の環境に同居するのもよいかもしれません。
関連するエントリは以下のとおりです。
RailsでSQL Serverに接続する
railsでOracleに接続できるようにする
railsでoracle9に接続する
・csv,tsv,excel,pdfを出力する
社内の他のシステムとデータ連携したり、帳票を生成したりする機会が多いと思うので、これらのデータを生成する方法は知っておくと便利そうです。
ちなみにPDF出力には、ThinReportsがオススメです。
関連するエントリは以下のとおりです。
rubyでcsvを作る時にカラムをダブルクォートでくくったり、くくらなかったり
railsのrespond_toでcsv
rubyで装飾されたExcelファイルを作成する
rubyで帳票
rubyで帳票を作るのに便利そうなThinReportsがバージョンアップしていた
rubyでpdf出力したときのspec
・認証連携
社内にはActiveDirectoryなど、なにかしらアカウントとパスワードを保持しているものがあると思います。
シングルサインオンできれば、それにこしたことないですが、新しく作成するシステムで独自にパスワード管理はやらないで、認証はオマカセして新規システムは認可だけするようにしたいものです。
railsで直接連携するのもよいとは思うのですが、こういう認証の連携はapacheの方がこなれているような気がするので認証はapacheにまかせてその結果で認可するというのもよいと思います。
関連するエントリは以下のとおりです。
ActvieDirectoryでケルベロス認証して、その結果をrailsで使ってみる
・お手軽にデータメンテナンス画面作成
社内システムではデータのCRUD操作と検索がとても多いと思います。なのでScaffoldを多用するのもよいですが、せっかくなので強化されたScaffoldを使うとより便利だと思います。
私はActiveScaffoldをよく使っています。
関連するエントリは以下のとおりです。
ActiveScaffoldの小ネタのまとめ
・その他
以下のことも知っていると便利そうな気がします。
関連するエントリは以下のとおりです。
railsでconfirm画面を表示する
大量のデータをActiveRecordで処理するとき
rubyで和暦を使いたいとき
Windows環境で作成したShift-JISのタブ区切りファイルをUTF-8でlinux上のrubyで扱う
rubyとは関係ないですが、以下も便利そうな気がします。
mysqlで4月始まりの年度情報などを得るためのsql
お役にたれれば幸いです。
そこでrailsで社内システムを作るときに便利かもしれない、このブログのエントリをまとめてみました。
少々古い情報もありますが・・・
・Oracle、SQL Serverへの接続
社内には既存システムとしてOracleやSQL Serverがあると思います。
新しくrailsで作成するシステムのメインのDBはmysqlでもよいと思うのですが、既存システムのデータ参照などをすることも多いと思います。
OracleやSQL Serverが動いているマシンは、結構ゴージャスだったりバックアップが行き届いていたりということも多いと思うので、いっそ新しく作るシステムのメインのDBも既存の環境に同居するのもよいかもしれません。
関連するエントリは以下のとおりです。
RailsでSQL Serverに接続する
railsでOracleに接続できるようにする
railsでoracle9に接続する
・csv,tsv,excel,pdfを出力する
社内の他のシステムとデータ連携したり、帳票を生成したりする機会が多いと思うので、これらのデータを生成する方法は知っておくと便利そうです。
ちなみにPDF出力には、ThinReportsがオススメです。
関連するエントリは以下のとおりです。
rubyでcsvを作る時にカラムをダブルクォートでくくったり、くくらなかったり
railsのrespond_toでcsv
rubyで装飾されたExcelファイルを作成する
rubyで帳票
rubyで帳票を作るのに便利そうなThinReportsがバージョンアップしていた
rubyでpdf出力したときのspec
・認証連携
社内にはActiveDirectoryなど、なにかしらアカウントとパスワードを保持しているものがあると思います。
シングルサインオンできれば、それにこしたことないですが、新しく作成するシステムで独自にパスワード管理はやらないで、認証はオマカセして新規システムは認可だけするようにしたいものです。
railsで直接連携するのもよいとは思うのですが、こういう認証の連携はapacheの方がこなれているような気がするので認証はapacheにまかせてその結果で認可するというのもよいと思います。
関連するエントリは以下のとおりです。
ActvieDirectoryでケルベロス認証して、その結果をrailsで使ってみる
・お手軽にデータメンテナンス画面作成
社内システムではデータのCRUD操作と検索がとても多いと思います。なのでScaffoldを多用するのもよいですが、せっかくなので強化されたScaffoldを使うとより便利だと思います。
私はActiveScaffoldをよく使っています。
関連するエントリは以下のとおりです。
ActiveScaffoldの小ネタのまとめ
・その他
以下のことも知っていると便利そうな気がします。
関連するエントリは以下のとおりです。
railsでconfirm画面を表示する
大量のデータをActiveRecordで処理するとき
rubyで和暦を使いたいとき
Windows環境で作成したShift-JISのタブ区切りファイルをUTF-8でlinux上のrubyで扱う
rubyとは関係ないですが、以下も便利そうな気がします。
mysqlで4月始まりの年度情報などを得るためのsql
お役にたれれば幸いです。
2012-06-12
藍と綿の種をもらったけど・・・
綿花の種をもらってみようと思ってみた
藍の種をもらってみようと思ってみた
ということで種をもらって蒔いてみたのですが・・・
綿は、適当な時期に蒔いてザブザブ水をあげすぎたせいか芽が出ず、
藍の方は、すごく順調に育っていると思っていたら、藍とは明らかに違う花が咲き、どうも雑草だったということに気づいた感じで共に失敗な気配です。
来年リベンジしようかなぁと思っています。
藍の種をもらってみようと思ってみた
ということで種をもらって蒔いてみたのですが・・・
綿は、適当な時期に蒔いてザブザブ水をあげすぎたせいか芽が出ず、
藍の方は、すごく順調に育っていると思っていたら、藍とは明らかに違う花が咲き、どうも雑草だったということに気づいた感じで共に失敗な気配です。
来年リベンジしようかなぁと思っています。
2012-06-11
railsでoracle9に接続する
railsでoracleに接続するには
activerecord-oracle_enhanced-adapter
ruby-oci8
を利用するわけです。
ですが、oracle9に接続しようとすると
とかエラーが出て接続できないことがあります。
これは、config/database.yamlを以下のような感じにnls_timestamp_formatを指定すると回避できます。
activerecord-oracle_enhanced-adapterで接続する際にalter sessionを発行しているのですが、
どうもnls_timestamp_formatを指定する際にYYYY-MM-DD HH24:MI:SS:FF6を指定していて
oracle9では、FF6という記述をサポートしていないためエラーが出ているようです。
ちなみにactiverecord-oracle_enhanced-adapterの1.3.1までは、このエラーはでないようです。
1.3.2以降で出るみたいです。
activerecord-oracle_enhanced-adapter
ruby-oci8
を利用するわけです。
ですが、oracle9に接続しようとすると
OCIError: ORA-01821: 日付書式コードが無効です from stmt.c:235:in oci8lib.so
とかエラーが出て接続できないことがあります。
これは、config/database.yamlを以下のような感じにnls_timestamp_formatを指定すると回避できます。
develop: adapter: oracle_enhanced database: ora username: user password: pass nls_timestamp_format: "YYYY-MM-DD HH24:MI:SS"
activerecord-oracle_enhanced-adapterで接続する際にalter sessionを発行しているのですが、
どうもnls_timestamp_formatを指定する際にYYYY-MM-DD HH24:MI:SS:FF6を指定していて
oracle9では、FF6という記述をサポートしていないためエラーが出ているようです。
ちなみにactiverecord-oracle_enhanced-adapterの1.3.1までは、このエラーはでないようです。
1.3.2以降で出るみたいです。
2012-06-08
railsでgoogleさんのopenidを利用する
rails 3.2 + ruby 1.9.3で認証としてgoogleさんのopenidを利用させてもらう例です。
http://yorunocafe.blogspot.jp/2012/02/rails-omniauth.html
を参考にさせていただきました。
omniauthを利用します。
とりあえず最低限の動作をするためのものを作る手順です。
まずはプロジェクトを作成
-Oをつけるとデータベースを使わないプロジェクトを作成できます。
rails new rails_google_openid_sample -O
cd rails_google_openid_sample
public/index.htmlを削除しておきます。
まずは
Gemfile
を以下のようにします。
bundle install
を実行します。
以下のような
config/initializers/omniauth.rb
を作成します。
とりあえずcontrollerを作成します。
rails g controller welcome index
作成された
app/views/welcome/index.html.erb
を以下のようにします。
上記で利用しているcurrent_userを処理するため
app/controllers/application_controller.rb
も以下のように変更します。
openidで受け取った情報を処理するためのcontrollerを作成します。
rails g controller sessions
作成された
app/controllers/sessions_controller.rb
を以下のようにします。
本来ならば、ここのcreateメソッドでユーザを新規登録したり、登録済みユーザを検索したりします。
routeの設定をします。
config/routes.rb
これでOKです、
rails s
で
http://localhost:3000
に接続して試してみてください。
この手順で作成したものを以下においておきました。
https://github.com/vivahiraj/rails_google_openid_sample
http://yorunocafe.blogspot.jp/2012/02/rails-omniauth.html
を参考にさせていただきました。
omniauthを利用します。
とりあえず最低限の動作をするためのものを作る手順です。
まずはプロジェクトを作成
-Oをつけるとデータベースを使わないプロジェクトを作成できます。
rails new rails_google_openid_sample -O
cd rails_google_openid_sample
public/index.htmlを削除しておきます。
まずは
Gemfile
を以下のようにします。
source 'https://rubygems.org' gem 'rails', '3.2.3' gem 'omniauth' gem 'omniauth-openid' group :assets do gem 'sass-rails', '~> 3.2.3' gem 'coffee-rails', '~> 3.2.1' gem 'uglifier', '>= 1.0.3' end gem 'jquery-rails'
bundle install
を実行します。
以下のような
config/initializers/omniauth.rb
を作成します。
require 'omniauth-openid'
require 'openid/store/filesystem'
Rails.application.config.middleware.use OmniAuth::Builder do
provider :open_id, :store => OpenID::Store::Filesystem.new(Rails.root.join('tmp','openid'))
provider :open_id, :name => 'google', :identifier => 'https://www.google.com/accounts/o8/id'
end
とりあえずcontrollerを作成します。
rails g controller welcome index
作成された
app/views/welcome/index.html.erb
を以下のようにします。
<h1>Welcome#index</h1>
<p>Find me in app/views/welcome/index.html.erb</p>
<dif><%= flash.notice %></div>
<div id="user_nav">
<% if current_user %>
User Info,
<pre>
<%= current_user %>
</pre>
<%= link_to "Sign Out", signout_path %>
<% else %>
<%= link_to "Sign in with Google", "/auth/open_id?openid_url=https://www.google.com/accounts/o8/id" %>
<% end %>
</div>
上記で利用しているcurrent_userを処理するため
app/controllers/application_controller.rb
も以下のように変更します。
class ApplicationController < ActionController::Base
protect_from_forgery
helper_method :current_user
private
def current_user
@current_user ||= session[:user_info] if session[:user_info]
end
end
openidで受け取った情報を処理するためのcontrollerを作成します。
rails g controller sessions
作成された
app/controllers/sessions_controller.rb
を以下のようにします。
本来ならば、ここのcreateメソッドでユーザを新規登録したり、登録済みユーザを検索したりします。
class SessionsController < ApplicationController
def create
auth = request.env["omniauth.auth"]
session[:user_info] = auth["info"]
redirect_to root_url, :notice => "Signed in!"
end
def destroy
session[:user_info] = nil
redirect_to root_url, :notice => "Signed out!"
end
end
routeの設定をします。
config/routes.rb
RailsGoogleOpenidSample::Application.routes.draw do get "welcome/index" root :to => 'welcome#index' match "/auth/:provider/callback" => "sessions#create" match "/signout" => "sessions#destroy", :as => :signout end
これでOKです、
rails s
で
http://localhost:3000
に接続して試してみてください。
この手順で作成したものを以下においておきました。
https://github.com/vivahiraj/rails_google_openid_sample
2012-06-07
railsでlayouts/application.html.erbのspecをつくる
railsでlayouts/application.html.erbのspecってどう書くんだっけ?
とふと悩んでみました?
なんかlayoutを利用するviewのspecの方に混ぜる方法があるのか?
controllerのspec側でなんかできるのか?
インテグレーションテストで確認するしかないのか?
とか考えていたら単純に
spec/views/layouts/application.html.erb_spec.rb
に以下のように普通にviewのテストを書けばよいだけでした。
ちなみにrails3でrspec2の場合の書き方です。
とふと悩んでみました?
なんかlayoutを利用するviewのspecの方に混ぜる方法があるのか?
controllerのspec側でなんかできるのか?
インテグレーションテストで確認するしかないのか?
とか考えていたら単純に
spec/views/layouts/application.html.erb_spec.rb
に以下のように普通にviewのテストを書けばよいだけでした。
require 'spec_helper'
describe "layouts/application.html.erb" do
it "levelが100以上だとすごい" do
assign(:level, 100)
render
rendered.should =~ /すごい/
end
end
ちなみにrails3でrspec2の場合の書き方です。
