2012-06-27

htmlとjQueryでwebにexcelチックな機能を実装できるHandsontableが便利そう

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
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-25

TONOシャツがキニナル

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
ポロシャツなのですが、胸の刺繍がPOLOでなくTONOなところがステキな殿シャツがキニナルのです。

特に以下の大殿シャツがステキでキニナルのです。
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を利用していることが前提ですが、以下のような感じで両方のイベントに対応できます。

$(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"
の部分に本来はチェックしたい処理を書いておきます。

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関数です。

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


お役にたれれば幸いです。



2012-06-12

藍と綿の種をもらったけど・・・

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
綿花の種をもらってみようと思ってみた
藍の種をもらってみようと思ってみた

ということで種をもらって蒔いてみたのですが・・・

綿は、適当な時期に蒔いてザブザブ水をあげすぎたせいか芽が出ず、
藍の方は、すごく順調に育っていると思っていたら、藍とは明らかに違う花が咲き、どうも雑草だったということに気づいた感じで共に失敗な気配です。

来年リベンジしようかなぁと思っています。


2012-06-11

railsでoracle9に接続する

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
railsでoracleに接続するには
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
を以下のようにします。
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のテストを書けばよいだけでした。
require 'spec_helper'

describe "layouts/application.html.erb" do
  it "levelが100以上だとすごい" do
    assign(:level, 100)
    render
    rendered.should =~ /すごい/
  end
end

ちなみにrails3でrspec2の場合の書き方です。