2011-03-08

rubyでipアドレスやらサブネットマスクやらの書式チェックをする

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
rubyでipアドレスやサブネットマスクの書式をチェックをするならば正規表現を使うのが普通な気配なのですが、なんとなくめんどっちい感じの正規表現になるようです。

なので以下のような手段でチェックしてみました。

https://github.com/bluemonk/ipaddress
のipaddressというのを利用します。

インストールは
gem install ipaddress
でOKです。

以下のような感じでチェックして見ました。
require 'ipaddress'

#IPアドレスチェック
def check_ip
  begin
    IPAddress::IPv4.new ip
  rescue
    return false
  end
  true
end

#サブネットマスクチェック
def check_mask
  begin
    IPAddress::IPv4.new "10.0.0.1/#{mask}"
  rescue
    return false
  end
  true
end

#MACアドレスチェック
#これは正規表現を使っています
def check_mac
  if /^([0-9A-F]{2}:){5}[0-9A-F]{2}$/ =~ mac.upcase
    true
  else
    false
  end
end

#ブロードキャストアドレス取得
def get_broadcast(ip,mask)
  ipa = IPAddress::IPv4.new "#{ip}/#{mask}"
  ipa.broadcast.address
end

ブロードキャストアドレス取得以外は、rubyで普通に使えるipaddrでも似たようなことはできるような木はします。

2011-03-07

ActiveScaffoldで独自のリンク

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
RailsのScaffoldをステキにするActiveScaffoldでは、データの追加、変更、削除の他に独自のリンクを作成できます。

リンクを追加するには、action_linksをいろいろいじります。

こんな感じでリンクを追加します。
config.action_links.add 'info', :label => '特別情報表示'
これでコントローラのinfoアクションが呼ばれることになります。
表示場所は、検索や新規追加などと同じ場所に埋め込まれる形で表示されます。

ページの頭ではなく、各レコード毎に表示したい場合は、
config.action_links.add 'info', :label => '特別情報表示', :type => :record
のように
:type => :record
を指定します。

ActiveScaffoldに埋め込まれる形でなく、新規にページを遷移させたい場合は、
config.action_links.add 'info', :label => '特別情報表示', :page => true
のように
:page => true
を指定します。

リンク先をActiveScaffoldを使っているコントローラとは別のコントローラのアクションにしたい場合は、
config.action_links.add 'info', :label => '特別情報表示', :page => true, :controller => 'info', :action => 'index'
のように
:controller => 'info',:action => 'index'
を指定します。

いろいろ便利なActiveScaffoldなのでした。

rubyでping

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
rubyからpingをうって、相手が生きているかどうか確認したいなぁとか思ってみました。

調べてみると
Ping.pingecho
というものがひっかかるのですが、どうも1.9で削除されている模様です。

なので以下のような感じで確認してみることにしました。
def ping
  ret = `ping -c 1 #{ip}`
  if ret =~ /1 received/
    true
  else
    false
  end
end

とりあえず確認できたのでよしとします。

2011-03-04

ブログのタイトルを変えてみた

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
ブログのタイトルを
「SOBARCO」と「ソコニイク」と「図書ぶら」の開発メモ
から
コチョナナバ
に変えてみました。これからもよろしくお願いします。

twitterのアカウントもなんとなく変えたくなってきたりしているのですが、どうしようか悩み中です。

2011-03-03

railsのlink_toでページの途中にリンクさせたいとき

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
railsで都合によりあるページの頭ではなく、途中にリンクさせたいことがありました。

http://aaa/bbb/ccc#ddd

みたいな感じのリンクを作りたいと思ったわけです。

<%= link_to '途中', :controller => :bbb, :action => :ccc, :anchor => 'ddd' %>

こんな感じでanchorを入れればよいようです。

subversionでファイル一覧やら変更履歴やらを出す

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
いまどきはgitなのだと思うのですがsubversionを使っています。

でたまに管理しているファイル一覧やら変更履歴やらが欲しくなります。

ファイル一覧では、ファイルごとの最終変更日時なりがわかるとうれしかったりします。
変更履歴では、リビジョンごとのメッセージだけでなく、そのとき変更されたファイルなども一緒にわかったりするとうれしかったりします。

これらをわかるような資料を作るためには、
TortoiseSVN
を使うとステキです。

それぞれ以下のような感じです。

・ファイル一覧
一覧を出力したトップのところで右クリック
TortoiseSVN-Check for modifications
を選択して、出てきた画面上で
Show ignored file以外にチェックを入れる
そしてファイル一覧が出てくるので全選択して右クリック
Copy all infomation to clipboard
してコピーしておきます。
そして、エクセルに貼り付けて不要カラム除去などを行っていい感じの資料にします。

・変更記録
一覧を出力したトップのところで右クリック
TortoiseSVN-Show log
revisionの最初と最後をシフトを押しながら全選択して右クリック
Copy to clipboard
してコピーしておきます。
エクセルになりなんなりに貼り付けます。

こんな感じです。


2011-02-25

ActiveScaffoldでsum

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
RailsのScaffoldをステキにするActiveScaffoldで特定のカラムの合計値を表示したいなぁと思ったわけです。

以下のようなテーブルがあるとします。
users
id
name

orders
id
user_id
amount

このようなテーブルがあっとしてuser毎のorderのamount合計を表示したいと思ったわけです。

とりあえず二つ方法がある感じです。

(1)userコントローラからorderコントローラをネスト表示してorderコントローラのリストに合計値を表示。
以下のような感じでコントローラーを準備します。
class UsersController < ApplicationController
  active_scaffold :users do |config|
    config.nested.add_link("オーダー", [:orders])
  end
end

class OrdersController < ApplicationController
  active_scaffold :orders do |config|
    config.columns[:amount].calculate = :sum
  end
end
これでhttp://budanters.blogspot.com/2009/10/adding-multiple-column-calculations-to.htmlにあるような感じでリストの下に合計値が表示されます。
合計値意外に、calculateが対応しているものとして:avgがあるようです。

この方法で表示すると合計値がSumと表示されるので、これを日本語にするには
vendor/plugins/active_scaffold/frontends/default/views/_list_calculations.html.erb
を対象のviewにコピーしていじってやればOKです。
この場合だと
app/view/order
の下にコピーとなります。

これでもよいっちゃぁよいのですが、できるならばuserコントローラに表示したいです。
というわけで、もう一つの方法です。
(2)モデルに合計値を定義しておいて表示する
まずはuserモデルに合計値を定義します。
class User < ActiveRecord::Base
  has_many :orders

  def order_total
    self.orders.sum(:amount)
  end
end
で、以下のようにuserコントローラを準備します。
class UsersController < ApplicationController
  active_scaffold :users do |config|
    config.list.columns << :order_total
  end
end

これでuserのリストのユーザ毎の合計値が表示されます。

なかなか便利なActiveScaffoldです。

2011-02-21

pythonでISBN、JANコードの有効性をチェックする

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
ISBNやJANコードの最後の一桁がチェックデジットになっているので、適当に与えられたものでないかどうかをチェックする関数をpythonで作ってみました。

ちなみにJANコードは、8桁13桁が有効として
ISBNは古い体系の10桁のものをチェックしています。
ISBNの新しい体系の13桁のものはJANコードと同じなのでJANコードの関数の方でチェックできます。

まずはJANコードの版はこんな感じです。
def check_jan_code(code):
    if code.isdigit() == False :
        return False
    if len(code) == 8 or len(code) == 13 :
        pass
    else :
        return False
        
    cd = code[-1]
    data = code[0:-1]
    total = 0
    for i in range(0,len(data)):
        if i%2 ==0 :
            total = total + int(data[i])
        else:
            total = total + int(data[i]) * 3
    dig = total % 10
    dig = 10 - dig
    if dig == 10 :
        dig = 0
    if dig == int(cd) :
        return True
    else :
        return False

そしてISBNはこんな感じです。
def check_isbn(code):
    pattern = "^[0-9]{9}[0-9X]{1}$"
    if re.match(pattern,code) :
        pass
    else :
        return False
        
    cd = code[-1]
    data = code[0:-1]
    total = 0
    w = 10
    for i in range(0,len(data)):
        total = total + int(data[i]) * w
        w = w - 1
    dig = total % 11
    dig = 11 - dig
    if dig == 10 :
        dig = "X"
    if str(dig) == cd :
        return True
    else :
        return False

ちなみに、うまい棒チョコレート味のJANコードは49480764です。



※JANコードチェックでCDが0の時の処理が間違っていたので修正しました(2011/9/16)

2011-02-18

jQuery BlockUI Pluginで確認ダイアログ

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
ちょっと長い処理を実行するときに、時間がかかるから実行中ということがわかる状態にするとあわせて、
他のボタンとかをさわっちゃイヤんなことがあると思います。

そんな時に便利なのが
jQuery BlockUI Plugin
です。

これを使うと、ボタンを押したら画面全体を使えなくしたり、画面の一部だけを使えなくしたりすることができます。

demoがあるので、こちらを見るとどういうものかすぐわかります。

画面を触れないようにできるのは、よいのですが
長い処理をするので、うっかりクリックなどをして後悔しないように
実行するかどうかの確認ダイアログを出したいなぁとか思ってみたのですが、
ちゃんと、確認ダイアログ的なメッセージを出すこともできるようです。

ちゃんとサンプルもあります。

とてもステキなjQuery BlockUI Pluginを確認ダイアログを出す形で使ってみたのですが、私の利用したいケースでサンプルとまったく同じ使い方だとどうもキャンセルしてもsubmitしてしまっているような感じでした。

なので、ちょろっと以下のように変えてみました。

<script type="text/javascript"> 
    $(document).ready(function() { 
 
        $('#test').click(function() { 
            $.blockUI({ message: $('#question'), css: { width: '275px' } }); 
        }); 
 
        $('#yes').click(function() { 
            // update the block message 
            $.blockUI({ message: "<h1>Remote call in progress...</h1>" }); 
            $('#go_go').submit();
        }); 
 
        $('#no').click(function() { 
            $.unblockUI(); 
            return false; 
        }); 
 
    }); 
</script> 
 
... 
<form action="go" id="go_go" > 
<input id="test" type="button" value="Go Go Go" /> 
</form> 
 
... 
 
<div id="question" style="display:none; cursor: default"> 
        <h1>Would you like to contine?.</h1> 
        <input type="button" id="yes" value="Yes" /> 
        <input type="button" id="no" value="No" /> 
</div>


2011-02-03

rake db:migrateは成功しているのにindexが作られない

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
DBがmysqlで以下のような感じのmigrationを作りました。
create_table :hogehoge_mogemoges do |t|
  t.column :ahaha_id, :integer
  t.column :ihihi_id, :integer
  t.column :uhuhu_id, :integer
  t.column :ehehe_id, :integer
  t.column :ohoho_id, :integer
  t.column :valval,   :string
end
add_index :hogehoge_mogemoges,[:ahaha_id,:uhuhu_id,:ohoho_id],:unique => true

rake db:migrate
は普通に成功したのですが、indexが作成されていませんでした。

indexが作成されない理由は、作成されるindex名に原因があります。
この場合は、
index_hogehoge_mogemmoges_on_ahaha_id_and_ihihi_id_and_uhuhu_id_and_ehehe_id_and_ohoho_id
という名前のインデックスを作成をすることになります。

mysqlに直接、このインデックスを作成しようとすると

ERROR 1059 (42000): Identifier name 'index_hogehoge_mogemmoges_on_ahaha_id_and_ihihi_id_and_uhuhu_id_and_ehehe_id_and_ohoho_id' is too long
とエラーが出てて作れません。

たしかにtoo longです。
mysqlでは、インデックスに使えるのは最大64文字のようです。

でこれを解決するには、以下のようにadd_indexで名前を渡せばよいだけです。
add_index :hogehoge_mogemoges,[:ahaha_id,:uhuhu_id,:ohoho_id],{:unique => true, :name =>
"ind_hogemoge_aiueo"}