| 次のページ >>

Ruby: scrobbler の文字化けにモンキーパッチングで対処してみた

A monkey patching for scrobbler mojibake.

以前適当に書いたのを掘り出してあまり見直さずに貼ってみます。

このコードに続けて scrobbler を使った処理を書くか、 別ファイルに分けて require して使います。

require "rubygems"
require "scrobbler"
require "cgi"

module Scrobbler
  module REST
    class Connection
      MULTIBYTE_CHAR = true

      def request(resource, method = "get", args = nil)
        url = URI.join(@base_url, resource)
        temp_url = url.request_uri
        temp_query = ""

        if args
          temp_query = args.map { |k,v| 
            if MULTIBYTE_CHAR
              "%s=%s" % [k.to_s, CGI.escape(v.to_s)]
            else
              "%s=%s" % [escape(k.to_s), escape(v.to_s)]
            end
          }.join("&")
          url.query = temp_query if MULTIBYTE_CHAR
        end

        req = case method
              when "get"
                if MULTIBYTE_CHAR
                  Net::HTTP::Get.new(temp_url)
                else
                  Net::HTTP::Get.new(url.request_uri)
                end
              when "post"
                if MULTIBYTE_CHAR
                  Net::HTTP::Post.new(temp_url)
                else
                  Net::HTTP::Post.new(url.request_uri)
                end
              end
        
        if @username and @password
          req.basic_auth(@username, @password)
        end

        http = Net::HTTP.new(url.host, url.port)
        http.use_ssl = (url.port == 443)

        res = if MULTIBYTE_CHAR
                http.post(temp_url, temp_query)
              else
                http.start() { |conn| conn.request(req) }
              end
        res.body
      end
      
      private
      def escape(str)
        URI.escape(str, Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))
      end
    end
  end
end

Emacs: shell-mode で日本語が文字化けする場合の対処法

自分の場合、Windows + NTEmacs では:
M-x set-buffer-process-coding-system RET sjis RET sjis RET
または
C-x RET p sjis RET sjis RET

.emacs に書く場合

(add-hook
 'shell-mode-hook
 '(lambda ()
    (set-buffer-process-coding-system 'sjis 'sjis)))

関連

指定できる coding-system の一覧を表示:
M-x list-coding-systems

zipruby: zipファイルのルートがディレクトリのみかどうか調べる

展開したときに、ポンとディレクトリが 1つだけ出てくるか、 それとも複数のファイルがばらっと出てくるか判別する。

require "zipruby"

def filelist_in_zip(zip_path)
  result = []
  Zip::Archive.open(zip_path) do |ar|
    n = ar.num_files
    
    n.times do |i|
      result << ar.get_name(i)
    end
  end

  result
end

def zip_root_dir(zip_path)
  entries = filelist_in_zip(zip_path).map do |path|
    path.sub(/^(.+?)\/.*$/, '\1')
  end
  
  !(entries.size != 1) && entries.all?{ |x| entries.first == x }
end

(solved) Ruby/Tk / Ubuntu 9.04: TkPackage can't find package img::png

環境

Ubuntu Linux 9.04 / ruby 1.8.7 (2008-08-11 patchlevel 72) [i486-linux] / Tk::TK_PATCHLEVEL' #=> "8.4.19"

現象

逆引きRuby/Tk の PNG 画像表示のサンプルコードを実行すると次のエラーが出て動かない。

/usr/lib/ruby/1.8/tk/package.rb:86:in `require': TkPackage can't find package img::png (RuntimeError)

locate tkextlib/tkimg すると
/usr/lib/ruby/1.8/tkextlib/tkimg/png.rb
などが見つかるので、Ruby/Tk 側のライブラリ自体はインストールされている。

解決法

sudo apt-get install libtk-img

その他

JPEG もこれで解決する。

Lisp/Scheme のコメント・文字列・括弧に色を付ける簡易ツール(Javascirpt)

  • ブログなどに貼った Lisp/Scheme 系のソースコードを google-code-prettify のように強調表示(ハイライト)するツールを探してみたのですが、ちょうどいいのが見つけられず……というわけで簡単なのを作ってみました。
  • キーワードや関数名、シンボルなどには色は付きません。 Lisp/Scheme っぽいものにそのまま使いまわせるようにしたかったのと、 なるべく処理が重くならないようにしたかったので、あまり複雑にならないようにしました。
  • Common Lisp とかはよく知らないのでとりあえず Emacs Lisp を想定してます……

ダウンロード

gist: 228735 - GitHub からどうぞ。

サンプル

こんな感じで色が付きます。

(defun factorial (x)
  "Calculate factorial." ; 関数の説明
  (if (= x 1)
      1
    (* x (factorial (- x 1))))) ; 再帰呼び出し

動作チェック

;; ダブルクォート文字列
aa "bb" cc
aa "b\"b" cc ; バックスラッシュでエスケープ
aa "b\\b" cc
aa "b;b" cc  ; セミコロン
aa "b(b" cc  ; 括弧
aa "b)b" cc

;; 一行コメント
aa ; bb
; aa"bb ; ダブルクォート
; aa\bb ; バックスラッシュ
; aa)bb ; 括弧
; aa(bb

;; 括弧
aa(bb)cc

;; 記号
(1 . 2)
'()

;; HTMLの文字参照
a < b
a > b
a & b

;; 最後のダブルクォートが不整合
"aa

参考(外部リンク)



** ホームに戻る

| 次のページ >>