よたらぼ
自分の興味の赴くままにIT技術系のネタを取りとめもなくメモっています。
Ruby言語やLinuxのネタが多いです。

October 19, 2004

[Ruby] pseudoiconv.rb

WindowsのOne-Click Installer等の一部の環境ってiconvが入ってなかったりする。

#最新版ならば入ってるかも。

そんな環境でもRuby/GLib2をインストールできる環境(つまりはWin32の環境なんだけどさ)用にpseudoiconv.rbというGLib.convertを使ってIconv.iconvをシミュレートするスクリプトを書いてみた。

エラーは全部Iconv::IllegalSequenceになっちゃうんだけどね。

begin
  require 'iconv'
rescue LoadError
  begin
    require 'glib2'
                                                                                  
    module Iconv
      class IllegalSequence < ArgumentError; end
      module_function
      def iconv(to, from, str)
        begin
          GLib.convert(str, to, from).split(//)
        rescue
          raise IllegalSequence.new(str)
        end
      end
    end
  rescue LoadError
    module Iconv
      module_function
      def iconv(to, from, str)
        warn "Iconv was not found." if $DEBUG
        str.split(//)
      end
    end
  end
end

ちなみに次期リリース版のRuby/GLib2では以下のようにもうちょっとだけエラー処理をIconvに近づけることができる予定。

begin
  require 'iconv'
rescue LoadError
  begin
    require 'glib2'
    module Iconv
      class InvalidEncoding < ArgumentError; end
      class IllegalSequence < ArgumentError; end
      class InvalidCharacter < ArgumentError; end
      module_function
      def iconv(to, from, str)
        begin
          GLib.convert(str, to, from).split(//)
        rescue GLib::ConvertError => e
          case e.code
          when GLib::ConvertError::NO_CONVERSION
            raise InvalidEncoding.new(str)
          when GLib::ConvertError::ILLEGAL_SEQUENCE
            raise IllegalSequence.new(str)
          else
            raise InvalidCharacter.new(str)
          end
        end
      end
    end
  rescue LoadError
    module Iconv
      module_function
      def iconv(to, from, str)
        warn "Iconv was not found." if $DEBUG
        str.split(//)
      end
    end
  end
end

require 'iconv'しているアプリは、iconvの代わりにこれを使っておけば、もしかしたらちょっとだけアプリケーションの適用プラットフォームが広がるかもしれない。

さらにnkfやuconv等を試すようなコードにすれば日本語関連では結構なところまでいけそうな気がする。uconvはともかくnkfはRubyに標準添付されてるしね。

次のRuby-GetText-Packageはこの仕組みを利用しようかと考え中。

本日のツッコミ(全2件) [ツッコミを入れる]

なかだ [Iconvのエラーは、一括して捕まえられるようにIconv::Failureをincludeしてます。]

むとぽん [なるほど。includeしてるかどうかまでは意識してませんでした。情報ありがとうございます。]


October 19, 2005

[Misc] Understanding and Customizing the Apache HTTP SELinux Policy (Beta Document)

昨日の続きでちょっと調べてみたところ、Fedoraのサイトに上記のナイスなドキュメントを見つけた。

Using Other Types To Lock Down CGI Scriptsを読んで試したところ、昨日のDir.globの件は、httpd_sys_script_exec_tの代わりにhttpd_sys_script_ro_tと設定しても良いことがわかった。なるほど。

[Misc] SELinux上のApacheをPort 8088でListenさせたい

httpd.confにListen 8088を追加するだけではダメなのね....。httpdが起動しやしない(-_-;)。

/etc/selinux/targeted/src/policy/net_contextsというファイルを編集して、「portcon tcp 8088 system_u:object_r:http_port_t」という行を追加、そのディレクトリ内でmake loadとしてhttpdを再起動したらようやくアクセスできるようになった。これで良いのかな?

$ su -
Password:
# cd /etc/selinux/targeted/src/policy/
# vi net_contexts (編集)
# make load
# /etc/init.d/httpd restart

一つのターゲットを設定する際に、SELinuxの設定とApacheの設定をそれぞれ別々にしなければいけないってのは結構苦痛だな....。

それがセキュア、ってことなのかな。

[Ruby-GNOME2] GnomeFiles

GnomeFilesのRuby-GNOME2エントリがアップデートされました。voteよろしく!もちろんratingは10で!

[Ruby] open-uri, Easy-to-Use and Extensible Virtual File System

方々で話題になっている田中哲さんのRubyConf2005プレゼン資料。とても感銘を受けた。

この文章を今のRuby-GetText-Packageに当てはめて考えるといろいろと考えることも多そうだ。特に、毎回include GetTextするのってどうよ、とか。いっそ、Kernelレベルにメソッド追加しちゃおうかな。そっちの方が圧倒的に使い勝手良いしね。

でも、一方で短すぎる名前は良くない、とも。よく使われてるなら良いよ、ということなら、GetTextのメソッド名はRuby以外でも使われているという意味では「よく使われてる」って言っちゃっても良いかな。

うーん、悩ましいなぁ。


更新 設定