ラベル ruby の投稿を表示しています。 すべての投稿を表示
ラベル ruby の投稿を表示しています。 すべての投稿を表示

11/17/2015

(番外)マイナンバーとチェックディジット

マイナンバーについての是非はともかく、マイナンバーが12桁の素数だったとか、完全数だったとかをネタにしたtweetが多い。




こう言う誤解もある。

でもここに上がっている12桁の数字は、全てマイナンバーとしては不正な番号。なぜならマイナンバーは11桁の番号部分と末尾1桁のチェックデジットで構成されているから、チェックディジットを計算するとあり得ない組み合わせになってしまうのだ。
チェックディジット(check digit、検査数字)とは、符号の入力誤りなどを検出するために、元の符号に付加される数字のこと
Wikipediaより


これも12個の数字を矢であてて任意に選んでしまうと、最後の数字がチェックディジットとして正しい数字が選ばれることもあれば、選ばれないこともあり得るので当選金が出ない場合がある。


では、マイナンバーのチェックディジットはどのようなロジックで計算されるのだろうか。それは法律で決まり、総務省が次の様な省令を出している。

行政手続における特定の個人を識別するための番号の利用等に関する法律の規定による通知カード及び個人番号カード並びに情報提供ネットワークシステムによる特定個人情報の提供等に関する省令(平成二十六年十一月二十日総務省令第八十五号)

この省令の第5条に計算方法が示されている。

(検査用数字を算出する算式)
第五条  令第八条の総務省令で定める算式は、次に掲げる算式とする。
算式
 11―((n=1(シグマ)11(Pn×Qn))を11で除した余り)
 ただし、(n=1(シグマ)11(Pn×Qn))を11で除した余り≦1の場合は、0とする。
算式の符号
 Pn 個人番号を構成する検査用数字以外の十一桁の番号の最下位の桁を1桁目としたときのn桁目の数字
 Qn 1≦n≦6のとき n+1 7≦n≦11のとき n―5


分かりにくいので式で表すと:
  • 検査用数字:

    
  但し、
    
  の場合は、0(ゼロ)とする。


  • PnQnの定義
   Pn:個人番号を構成する検査用数字以外の11桁の番号の最下位の桁
     を桁目としたときの n 桁目の数字
   Qn1 ≦ n ≦ 6のとき n+17 ≦ n ≦ 11 のとき n-5

これをRubyのスクリプトを(ファイル名:myNumber.rb)作ってみた。恥ずかしながら公開(あ〜汚いコードだ!)
#! /bin/sh
exec ruby -S -x "$0" "$@"
#! ruby

def imputError
  STDERR.puts "12桁の数字を入力!"
  exit 0
end

str = ARGV[0]
imputError if !(str =~ /[0-9]{12}/)
sum=0

for i in 0..10
  if i>=0 && i<=5
    then j=i+1
  else
    j=i-5
  end
  sum = sum + str[10-i].to_i * (j+1)
end

if (sum % 11) <= 1
  then checkDigit = 0
else
  checkDigit = 11 - (sum % 11)
end

if str[11].to_i == checkDigit
  then print "OK", "\n"
  else print "NG ", "チェックディジットは", checkDigit, "\n"
end
コマンドラインから実行すると次の通り。
>$ myNumber.rb 200560490131
>$ NG チェックディジットは4
>$
>$ myNumber.rb 200560490134
>$ OK
ちなみに政府広報に表示されているサンプルも不正なのだ!

>$ myNumber.rb 123456789012
>$ NG チェックディジットは8

11/09/2015

iPhoneでRubyを使って写真フィルターが書けるPictRuby

iPhoneでRubyを使って写真フィルターが書けるPictRubyをリリースしました - ブログのおんがえし

これはrubyの処理系をiOS上にrubyの処理系が乗っかっているのか?
Githubのソースを見ると"mruby"と言うフォルダーがある。mrubyが搭載されているようだ。面白そうだ。


アプリの説明はこちら。
↓ ↓ ↓
PictRuby - Photo editor that can write a filter in Ruby

Githubはこちら。
↓ ↓ ↓
ongaeshi/PictRuby



 

 




2/17/2014

MacBook AirのBatteryを長持ちさせる方法

Gunosyで「ACアダプターを接続しっぱなしでもMacBookのバッテリー充電率にあわせソフトウェア制御で充電をON・OFFできるアプリ「AutoChargeInhibit」がリリースされたので使ってみた。」を読んで、一旦は、AutoChargeInhibitをインストールしてみたが、MagsafeのLEDが点滅したり、常駐ソフトなのでオーバーヘッドが気になり、アンインストールしてしまった。

そんな中で発見した「MagSafeコネクタの中央ピンを絶縁して充電率固定で給電状態にしてみた」と言う記事を発見、早速試してみる。これがなかなか具合が良い。

バッテリーを長持ちさせるには常時充電せずに40%〜80%程度の充電率で繰り返すのがベストの様だ。一方で、Apple社のHP「Appleのノートブックコンピュータ」にもある通り、バッテリーを長期保管するには、50%程度充電の状態で保管するのがもっとも良いとのことなので、この状態で、充電では無く通電状態に出来ることが望ましいことになる。(あとは月に1度位、完全充放電をすると良いらしい)

やり方は、マスキングテープを1mm位の幅に切り、ちょうど真ん中のピンが当たる個所をマスク(絶縁状態に)するだけ。




これでMagSafeプラグを差すと、LEDランプは点灯せず、MBA側は「 通電状態」であることを示す表示になっている。


ただこれだとバッテリーの充電率が分からないので、具合が悪い。仕方が無いので、簡単なrubyのスクリプトを書いてみた。
result = `ioreg -c AppleSmartBattery | grep -i Capacity`
result =~ /MaxCapacity.+?([0-9]+)/
maxCapacity = $1.to_f
result =~ /CurrentCapacity.+?([0-9]+)/
currentCapacity = $1.to_f
battery = (currentCapacity / maxCapacity) * 100
printf("%.1f \%\n", battery)
 これをターミナルで走らせると、この様になる。(単にMagSafeプラグを抜けば良いだけの話なのだが..w)




念のために「システム情報」を見ると次の通り。
===
バッテリー情報:

充電量情報:
  残りの充電量(mAh):    2544
  充電完了:    いいえ
  充電中:    いいえ
  完全充電時の容量(mAh):    4213
  状態情報:
  充放電回数:    681
  状態:    正常
  バッテリー装着:    はい
  アンペア数(mA):    -151
  電圧数(mV):    7739


AC 充電器の情報:

  接続済み:    はい
  ID:    0x0000
  リビジョン:    0x0000
  ファミリー:    0x0000
  シリアル番号:    0x00000000
  充電中:    いいえ
===

ちなみにバッテリーの初期容量を調べる方法は、次の通り。「ターミナル」を使い、
$> ioreg -c AppleSmartBattery | grep -i Capacity
と入力すると、
    | |           "MaxCapacity" = 4181
    | |           "CurrentCapacity" = 2513
    | |           "LegacyBatteryInfo" = {"Amperage"=0,"Flags"=5,"Capacity"=4181,"Current"=2513,"Voltage"=7769,"Cycle Count"=681}
    | |           "DesignCapacity" = 4680
と言う結果が帰ってくる。このDesignCapacityと言うのが、初期容量と言うことになる。

11/03/2011

amazon/ecs rubyでISBNを検索する(改訂版)

以前のエントリ「 rubyでISBNを検索する (2009/10/17)」で作ったスクリプトが、昨日から動かなくなった。そう言えば、Amazonから何か連絡が来ていたような気がする。あわてて検索すると、確かに、
重要:アマゾンProduct Advertising APIの仕様変更について
(途中略)
全てのAPIへのリクエストにおいて、AssociateTagが必須パラメータとなり、リクエスト処理時の確認対象となります。
(以下略)
となっている。
仕方が無いので、リクエストにAssosicate Tagを追加して送るように書き換えてみたが、動かない。同時に、検索結果として戻って来るxml (WSDL)の体系も変更になったようだ。それも書き換えて、さあどうだ!と思ったが、今度は検索結果が文字化けしている。
(2012年6月29日追記:amazon/ecsの最新バージョン(2.2.4)では、文字化けは解消されている)

いろいろググったあげく、使っているモジュール(amazon/ecs)の一部を直に書き換えれば対応できることが分かった。(ここに辿り着くまで約1日)
備忘のために、手順を記しておく。

  1. githubからamazon/ecsのソース(ecs.rb)をダウンロードし、保存
  2.  ecs.rbの141行目を書き換え
    @doc = Nokogiri::XML(xml)
     ↓
    @doc = Nokogiri::XML(xml, nul, 'UTF-8')
  3. オリジナルのスクリプトに記載しているrequire文もそれに合わせ修正

(2011年11月13日追記)
予想外に何件かのアクセスがあったので、簡単なソースを紹介。スクリプト名は"test.rb"。

require 'rubygems'
require 'amazon/ecs'

# パラメータ設定( associate tag, access key, secret key)
Amazon::Ecs.options = {
 :associate_tag => '[your associate tag]',
 :AWS_access_key_id => '[your developer token]',       
 :AWS_secret_key => '[your secret access key]'
}

# amazon-ecsの呼び出し
# ruby スクリプト名 ISBNの形式で実行する
#(ARGV[0]にはISBNが入る)
res = Amazon::Ecs.item_search(
        ARGV[0],
        {:search_index => 'Books', 
         :response_group => 'Medium',
          :country => 'jp'})

#結果の表示(著者名等は適宜追加)
res.items.each do |item|
    print "ASIN= ", item.get('ASIN'), "\n"
    print "Title= ",   item.get('ItemAttributes/Title'), "\n"
end


結果:
$ ruby test.rb 9784101181066
ASIN= 4101181063
Title= マキアヴェッリ語録 (新潮文庫)

9/12/2011

pTerm

facebook, twitterの両方に、Macのターミナルからポストするrubyのスクリプト。

何しろ素人なので、コードを公開するのは、恥ずかしいが、そんなことを言っていると、語学と同じでいつまで経っても上達しないので..。

require 'rubygems'
require 'net/https'
require 'oauth'
require 'uri'
require 'yaml'

# Facebook
class Facebook
  attr_accessor :conf
  ACCESS_TOKEN= 'access_token'
  MESSAGE = 'message'

  def initialize (conf_from_yaml)
    @conf = conf_from_yaml ["facebook"]
  end

  def post ( message )
    https = Net::HTTP.new('graph.facebook.com', 443)
    https.use_ssl = true
    https.verify_mode = OpenSSL::SSL::VERIFY_NONE

    post_hash = { ACCESS_TOKEN => conf[ACCESS_TOKEN], MESSAGE => message }
    msg = post_hash.map { |key,value|
        "#{URI.encode(key)}=#{URI.encode(value)}"
        }.join("&")

    https.start{
      response = https.post('/me/feed', msg)
    puts response.body
    }
  end
end

#Twitter
class Twitter
  KEY          = 'consumer_key'
  SECRET       = 'consumer_secret'
  TOKEN        = 'access_token'
  TOKEN_SECRET = 'access_token_secret'
  UPDATE_URL   = 'https://api.twitter.com/1/statuses/update.xml'

  attr_accessor :config

  def initialize (conf_from_yaml)
    @config =conf_from_yaml ["twitter"]
  end

  def post (msg)
    consumer = OAuth::Consumer.new(config[KEY], 
      config[SECRET],
      :site => 'http://api.twitter.com')
    token_hash = {
      :oauth_token => config[TOKEN],
      :oauth_token_secret => config[TOKEN_SECRET]
    }
    access_token = OAuth::AccessToken.from_hash(consumer, token_hash)
    msg_hash = { :status => msg}
    response = access_token.post( UPDATE_URL, msg_hash )
  end
end

# YAMLファイル読み込み
class Config_setup
  attr_accessor :conf_pTerm

  def initialize
    @conf_pTerm = YAML.load_file("/Users/tom/pTerm_config.yaml")
  end
end

# argument解析
class Arguments
  attr_accessor :facebook, :twitter, :message, :msg_length, :url

  def initialize
    @facebook = true
    @twitter = true
    @message = ""
    @url = ""
    @msg_length = 0
  end

  def analyse (argv)
    argv.each { |arg|
    case arg
    when /-f/
      @facebook = false
    when /-t/
      @twitter = false
#    when /^http:\/\/.+?/i
#      @url = arg
    else
      @message = arg
      @msg_length = arg.split(//u).length
    end
    }
  end

  def display
    print "facebook= ", @facebook, ",   twitter= ", @twitter, "   文字数= ", @msg_length, " 文字", "\n"
    print "本文= ", @message, "\n"
  end
end

# main
conf = Config_setup.new
arg = Arguments.new
arg.analyse(ARGV)
arg.display

print "post ? (y/n):  "
if STDIN.getc == 121 then
  puts "posting..."

    # twitterにPOST
   if arg.twitter then
     tw =Twitter.new(conf.conf_pTerm)
     tw.post( arg.message )
     print "Twitter: posted !", "\n"
   end

   # facebookにPOST
   if arg.facebook then
     fb = Facebook.new(conf.conf_pTerm)
     response = fb.post( arg.message )
     print "Facebook posted !", "\n"
   end
  else 
    puts "not posted, nothing happened"
end

7/29/2011

twitterをブログに貼り付ける方法

twitterの投稿の一部を、このブログに取り込もうとしている。

方法論としては、いくつかあるのだが、どれも今一。
一昨日のエントリに、とりあえず使ってみたのは、twitter公認のBlackbird Pieと言うツール。


貼り付けたいtweetのurlを入れると、htmlを生成してくれるので、それをBloggerにコピペすることになる。

しかしながら、このBloggerのテンプレートが使っているCSSが画像に対しても効いてくるので、思い通りのレイアウトにならず、手作業でCSSを修正しておく必要がある。それにいちいち、画像が張り付くのも、ちょっとうざったく、たくさんの過去のtweetをインポートするには、適さない。

twtr2srcと言うツールも見つけた。過去のtweetを、htmlで落として呉れるし、見た目もうざったくない。
でも、これを一旦MT形式に直し、Bloggerにインポートと言う手順を踏む必要がある。

結局、自分でtwitterのAPIをたたき、データを取得、それを思い通りの形に整形するスクリプトを書いた方が良いな、と言う気になってきた。

ネットで調べると、Ruby Gemsに"Twitter"と言うパッケージがあるので、それを使ってみることにしよう。
require 'rubygems'
require 'twitter'

puts Twitter.status(96445584818442240).text
=> #iphone 5の発売は、9月第2週とのうわさ RT @appleinsider: 
  Rumor: Apple's iPhone 5 to launch during 2nd week of Sept.
  http://dlvr.it/crxXH

puts Twitter.status(96445584818442240).source
=> <a href="http://www.echofon.com/" rel="nofollow">Echofon</a>

puts Twitter.status(96445584818442240).created_at
=> Thu Jul 28 05:03:13 +0000 2011

詳細は、ここを参照。(twitter api)
こんな感じで、tweetを取得出来ることが分かった。

1/02/2010

mixiへのエントリ


公開範囲が「一部の友人まで」とした場合、日記本文が取得出来ないと言うレポートがあったので、『バグ報告』トピックに書き込み。

>361 2010年01月02日 14:28
公開範囲が「一部の友人まで」とした場合、日記本文が取得出来ない点についての回避方法が、分かりました。
Rubyのソース版をお使いであれば、mixi.rbの188行目あたり、

html.gsub! /(\<div class\=\"viewerFriendList\"\>).+?(\<\/div\>\<\/div\>)/, ''


を、一行まるごと削除するか、コメントアウトすると、日記本文が取得できるようになりました。ただし十分にテストしたわけではありませんので、保証の限りではありません。自己責任でお願いします。(Windows用のバイナリ版では、この回避方法はとれません。あしからず)
いずれにしても、1月6日にサイトデザインの変更があるので、その結果では、またまた大幅にbackup_mixiのソースを変更する必要が出そうですね。やれやれ。



11/01/2009

mixiへのエントリ


mixiのhtmlが変更になったことに伴って、日記とメッセージがセンタリングされてしまうと言う問題について解析の結果、当面の回避策を『使い方・ノウハウ』トピックにエントリ。

>76 2009年11月01日 21:47
根本的な解決ではありませんが、対症療法として、次のようにすると、左詰になります。
backup_mixi.rbを実行すると、「mixi_backup」フォルダが出来ている筈です。その下に、次のような階層構造で、ファイルが納められています。
 mixi_backupフォルダ
  ↓
 inbox, outboxフォルダ
  ↓
 それぞれのフォルダに「common.css」というファイルがある
このcommon.cssと言うファイルを、適当なエディタ(Windowsであればメモ帳?)で開き、17行目あたり、
 text-align:center;
  ↓
 text-align:left;
に訂正(inbox, outbox両方ともです)。
これで左詰になる筈です。
なお、common.cssを修正する時は、元のファイルを、必ずどこかにバックアップしておくことをお勧めします。また、上記の修正は、あくまでも自己責任でお願いします。問題が起きても、一切、責任を取ることは出来ませんので、あしからず。



10/17/2009

rubyでISBNを検索する

内容が古くなったので改訂版を投稿しました。

=====

読んだ本のリストを作っているが、ISBNから書名や、著者、出版社の情報を取りたい。AmazonのAWSに入っているので、rubyを使ってやってみようと思った。

一年程前に、一定のURLでリクエストすると、xmlで情報が帰って来たので、これでやろうと思った。でもどういう訳か出来ない! どうやら、APIの仕様が変わり、timestampやら電子署名を追加して送らなくてはならないようだ。Amazonの"Signed Requests Helper"と言うサイトがあって、Access KeyとSecret Keyを入れれば、URLを作ってくれるサイトはあるのだが、これでははかどらない。仕方がないので、ググった結果、ruby-awsを使うことにした。

まず、ruby-awsのインストール。普通は、gem install ruby-awsで出来るはずなのだが、どうしても私の環境ではうまくいかない。(Mac OSX Snow Leopard, ruby 1.8.7, gem 1.3.1)
やむを得ず、ruby-awsのサイトからダウンロードし、直接、インストールをしてみた。

ダウンロードして、解凍後、ruby-aws-0.7.0の中にある、setup.rbを実行する。(INSTALLファイルを参照)
$ ruby setup.rb config
$ ruby setup.rb setup
# ruby setup.rb install

("#"のところは、ルート権限が必要な場合、sudo ruby setup.rb install)
次に、configファイルを作成。ユーザーのhomeで、下記の内容のファイルを作り、名前を".amazonrc"として保存。
[global]
key_id        = 'アクセスキー'
secret_key_id = 'アクセスの秘密キー'
 associate     = 'アソシエートのコード'
locale        = jp
cache         = true
cache_dir     = .

rubyのスクリプト(amazon_isbn.rb)は、こんな感じ。(エラー発生時の処理は書いていない)
require 'amazon/aws'
require 'amazon/aws/search'

isbn = ARGV.shift   # 引数にISBNを入れる

# 設定ファイルのデフォルトは /etc/amazonrc か ~/.amazonrc
ENV['AMAZONRCDIR']  = '.' # 設定ファイルの位置を変えるときはこれ

begin

il = Amazon::AWS::ItemLookup.new('ISBN',{'ItemId' => isbn,'SearchIndex' => 'Books'})
rg = Amazon::AWS::ResponseGroup.new( 'Medium' )
req = Amazon::AWS::Search::Request.new()
page = req.search(il, rg)

print "ASIN = ",           page.item_lookup_response.items.item.asin ,"\n"
print "title = ",          page.item_lookup_response.items.item.item_attributes.title,"\n"
print "publisher = ",      page.item_lookup_response.items.item.item_attributes.publisher,"\n"
print "author = ",         page.item_lookup_response.items.item.item_attributes.author,"\n"

rescue SocketError => exp
# ソケットエラーが出た場合は10秒待ってから、beginより再実行
print exp.backtrace ,"\n  [", exp.message , "]\n"
sleep 10
retry
rescue => exp
print exp.backtrace ,"\n class=", exp.class , "\n  [", exp.message , "]\n"
end


これで、例えばISBNコードが"4766924584"の書名、出版社、著者を引きたい時は、

$ ruby amazon_isbn.rb 4766924584
=>
ASIN = 4766924584
title = やっぱり北海道だべさ!!—内地の人にはわかんないっしょ
publisher = 勁文社
author = 千石 涼太郎

と、結果が帰ってくる。
あとは、ISBNのリストを連続して、読み込み、テキストにはき出すところを書けば完成か。

次の二つのブログを参考にさせていただきました。ありがとうございます。

8/09/2009

mixiへのエントリ

MT形式で変換することが出来ない状態だったのを解析し、『バグ報告』トピックに書き込み
>353 2009年08月09日 10:33
とりあえず、7/8バージョンのソースを一部修正した結果、MT形式で変換することが出来るようになりました。
��7/8バージョンのbackup_mixi.rb 210行目あたり)
html.sub! /\<div id\=\"diary_body\"\>(.*?)\<\/div\>/, ''

これを、次のように修正します。
html.sub! /\<div id\=\"diary_body\" class=\"FANCYURL_EMBED\"\>(.*?)\<\/div\>/, ''

以前のhtmlがどうだったか分かりませんが、現在のバージョンには、div idのタグに「class=\"FANCYURL_EMBED」が追加されたようです。
修正は、あくまでも、自己責任で、よろしくお願いします。

追加コメント
>354 2009年08月09日 10:43
上記(353)は、1ユーザーが考えた、取りあえずの回避策です。
Windows版のexe形式への対応を含め、作者の正式リリースを、お待ちしたいと思います。
ひな。さんからのコメント
>355 2009年08月10日 19:05
お待たせしました。
��T及びはてな形式へ変換できない不具合を修正しました。
��はまちゃんさん有り難うございます!)

再コメント
>356 2009年08月11日 14:07
> ひな。さま
どういたしまして。
今後も、簡単な検証等であれば、お手伝い出来ると思います。
それにしても、日記やメッセージ取得のAPIを、mixiが提供してくれれば、いちいち、HTMLを解析しなくても良いのに、とずっと思ってます。

11/13/2008

mixiへのエントリ


『バグ報告』トピックに書き込み

> 290 2008年11月13日 22:26
> ひな。さん
いつも修正、ご苦労様です。
Mac OS 10.5.5での結果をご報告します。ちなみに、ハードは、MacBook 2 GhHz Intel Core 2Duoで、rubyは、 1.8.6 (2008-03-03 patchlevel 114) です。
11月13日バージョンで、問題なく、メッセージ、日記とも全件、ダウンロード出来ました。
メッセージが 217件、日記が 60件で、ダウンロードの時間は、約11分でした。ネットワーク環境もあり、時間的には何とも言えませんが、問題なく、ダウンロード出来てます。cssファイルは、いずれも4個でした。
日記は、表示上も、全く問題はありません。またMT形式のコメントも、ちゃんとダウンロードされています。
但し、メッセージは、りぞさん(287)のご報告と同じように、プロファイル、アイコン、本文は正常に表示されますが、日付、タイトル、名前が、右にずれて表示されます。(ブラウザは、Firefox3.0.3です)
メッセージの日付、タイトル等が右にずれてしまいますが、ブラウザの幅を小さくリサイズすると、それに伴い、左に移動します。やっぱりCSSの問題でしょうか? CSSは余り詳しくないのですが、分かる範囲で、ちょっと見てみます。
以上、ご報告まで。



9/24/2008

mixiへのエントリ


mixiの”backup-mixi”コミュニティに、書き込んだ。
『挨拶・雑談用』トピック

>149 2008年09月24日 23:22
初めまして。以前から、mixi_backを愛用させていただいています。有り難うございます。
私もmixi日記をコメントを含めてwordpressにバックアップを取ろうとして、試行錯誤していました。
昨日、"mixi export" (http://adiary.org/FrontPage)の存在を知り、これを使えば、コメントも含めてxmlが生成されるので、このxmlをMT形式もしくはwordpressのxmlにコンバートするコードを、自分で書こうかなと思ってた矢先です。
是非、mixi_backupから、直接、コメントを含めたMT形式への変換を、よろしくお願いします。



IZW@ねっき〜さんからのコメント

>150 2008年09月25日 00:05
��はまちゃんさん
どうも、はじめまして
いろいろと試行錯誤したんですが、以下の方法で移行できました。
・コメントつきでMT形式変換するようにプログラムを修正
・本文、コメント中の
は削除するようにプログラムを修正
・画像の格納場所を変更(MT形式ファイルを直接修正)
・MT形式ファイルのエンコードをUTF8に変更
backup_mixiさまさまです、もう逃れられませんw
後はここら辺の作業を自動化できないか検討中です。


再コメント

>151 2008年09月25日 07:27
> IZW@ねっき〜さま
そうですか。
ぜひ、私の方にもソースを送っていただければ、嬉しいです。