ブログトップ 記事一覧 ログイン 無料ブログ開設

それはそれ。これはこれ。 このページをアンテナに追加 RSSフィード

2003 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2004 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2005 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 03 | 04 | 05 | 06 | 07 | 09 | 10 | 11 | 12 |
2012 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 11 | 12 |
2013 | 01 | 02 | 04 | 05 | 07 | 08 | 10 | 11 | 12 |
2014 | 02 | 03 | 07 | 08 | 09 | 10 | 11 | 12 |
2015 | 01 | 02 | 03 | 05 | 06 | 07 | 11 |
2016 | 07 |
2017 | 01 | 03 | 06 | 07 | 11 |
2018 | 05 | 07 |

2011-11-07(月)

[] 続:Mechanize2.0 ではまる  続:Mechanize2.0 ではまるを含むブックマーク  続:Mechanize2.0 ではまるのブックマークコメント

今度は mixiログインできない。ログを見ると同じくCookieが送られていない。Mechanize 1.0.0 を使うと問題ない。今回はドメインの問題では無いので、また別の原因があると思われる。

Mechanize2ではCookie鬼門か?!


2011-11-12 追記

原因は判明。Set-Cookie で domain=.mixi.jpCookieが送られてくるが、これが、mixi.jp に対してのドメイン検査に引っかかって送られていない。これはバグだ。

class Mechanize::CookieJar
  (中略)
  def cookies(url)
      (中略)
      if cookie_domain.start_with?('.')
        url.host =~ /#{Regexp.escape cookie_domain}$/i
      else
        url.host =~ /^#{Regexp.escape cookie_domain}$/i
      end
      (後略)

これを、

class Mechanize::CookieJar
  (中略)
  def cookies(url)
      (中略)
      if cookie_domain.start_with?('.')
        "."+url.host =~ /#{Regexp.escape cookie_domain}$/i
      else
        url.host =~ /^#{Regexp.escape cookie_domain}$/i
      end
      (後略)

に少し修正すればOK。


キタモモンガさんのブログ*1にも、Cookieがおかしいという話が書いてあるが、これは、上記の話じゃ無くて「Mechanize2.0 ではまる」id:otn:20110924 の話だ。

passy_no_okanpassy_no_okan 2012/03/06 18:42 楽天、mixiってことはyahooもやっぱりおかしいんですかね
いくらやってもyahooにログインできないんですが・・・

早くMechanize対応してくれるといいな

otnotn 2012/03/06 20:19 トラックバック先の「Mechanize2.1リリース」に書いてありますが、Mechanizeはなおってますよ。

2011-11-06(日)

[]Excel列名変換問題 Excel列名変換問題を含むブックマーク Excel列名変換問題のブックマークコメント

id:JunichiIto:20111102:1320253815 の「Excel列名変換問題で第2回社内プログラミングコンテストを開催してみた(前編)」を見て、やってみた。

Rubyで書くことにしたが、Ruby固有の機能は使わずCでも簡単に書き直せる程度で。

Excelの列名は、A,B,…,Z,AA,AB,…AZ,BA,… のようになっているが、これと番号 1,2,…,26,27,28,…,52,53,… との相互変換を行う。

まず、文字から番号は簡単。

ARGV.each do |arg|
  case arg
  when /^[A-Z]+$/
    val = 0
    arg.each_char do |c|
      val = val*26+c.ord-"@".ord
    end
    puts val
  end
end

逆の変換は26で割っていくのだが、割る前に1始まりなので1を引く必要があるな。後で1足せば良いかということで、"@"の代わりに"A"を使う。

ARGV.each do |arg|
  case arg
  when /^[1-9][0-9]*$/
    val = arg.to_i-1
    ans = ""
    while val>0
      ans = (val%26+"A".ord).chr+ans
      val /= 26
    end
    puts ans
  end
end

しかし、1 が Aでなく空になって、2〜26 は B〜Zになるものの、27 は AA じゃなくて BA になってしまう。全然だめ。

しばし考えて修正*1

ARGV.each do |arg|
  case arg
  when /^[1-9][0-9]*$/
    val = arg.to_i
    ans = ""
    while val>0
      val -= 1
      ans = (val%26+"A".ord).chr+ans #Ruby1.9.3でString#prependが出来たのでそれで書き直せる
      val /= 26
    end
    puts ans
  end
end

これが落とし穴か。

まとめると、元の問題とは引数意味が少し違うがこんな所。

ARGV.each do |arg|
  case arg
  when /^[A-Z]+$/
    val = 0
    arg.each_char do |c|
      val = val*26+c.ord-"@".ord
    end
    puts val
  when /^[1-9][0-9]*$/
    val = arg.to_i
    ans = ""
    while val>0
      val -= 1
      ans = (val%26+"A".ord).chr+ans
      val /= 26
    end
    puts ans
  end
end

2011-11-19 追記

何となくループで書いたけど、この手の物は再帰で書くべきだったか。関数型言語風。

def etoi(x)
  if x.size == 1
    x.ord-"@".ord
  else
    etoi(x[0..-2])*26 + etoi(x[-1])
  end
end
def itoe(x)
  if x<=26
    (x+"@".ord).chr
  else
    itoe((x-1)/26) + itoe((x-1)%26+1)
  end
end

*1:2011-11-17修正

トラックバック - http://d.hatena.ne.jp/otn/20111106

2011-11-05(土)

[] UTF-8で処理するがファイルにはShift_JISで書く  UTF-8で処理するがファイルにはShift_JISで書くを含むブックマーク  UTF-8で処理するがファイルにはShift_JISで書くのブックマークコメント

メモ

文字コード変換に限らず、ファイル書き出しの直前に、処理を挟み込む場合。

# encoding: utf-8
require "nkf"

# 特異メソッドを定義する方法
open("output1.txt","w") do |f|
  def f.write(str)
    super(NKF.nkf("-W --windows",str))
  end
  f.puts "あいうえお"
end

# サブクラスを定義する方法
class MyFile < File
  def write(str)
    super(NKF.nkf("-W --windows",str))
  end
end

MyFile.open("output2.txt","w") do |f|
  f.puts "あいうえお"
end

Ruby1.9だとopenのオプションでエンコードを指定できるのでこういうのは不要。

トラックバック - http://d.hatena.ne.jp/otn/20111105