ちょこっとプログラミング

仕事(や趣味)をしていると、しばしば、ちょこっとした短いプログラムを書かなくてはならなくなる。 ほとんどが「使い捨て」だけれども、何かの折に役に立つかもしれないと思ったものを、ここにまとめておくことにしました。

日本語のファイル名(ディレクトリ名)をローマ字に変更するRubyスクリプト

日本語のファイル名は何かと厄介なことが多いので、KAKASI を使い、まとめてローマ字に変換するRubyのスクリプトです。再帰を使って「深い」ところから順に名前を変えています。

日本語の曲名表示に対応していないような安いカーステレオで、日本語ファイル名のMP3を再生したい場合などに使えると思います。

convert-file-name.rb
#!/usr/bin/ruby
# coding: utf-8

require 'kakasi'
require 'nkf'

def search_and_rename(path) 
    Dir::foreach(path) { |file|
       next if file =~ /^\./
       if path =~ /\/$/ then
          file = path + file
       else
          file = path + "/" + file
       end
       if File::ftype(file) == "directory" then
            search_and_rename(file)
       end
       rename_to_ascii(file)
    }
end

def rename_to_ascii(file) 
  path,name1 = File::split(file)
  eucname = NKF.nkf('-We',name1)
  begin
     name2 = Kakasi.kakasi('-Ja -Ha -Ka -Ea -U', eucname)
   rescue Encoding::UndefinedConversionError
     name2 = name1
   end
   if name1 != name2 then
     File.rename(file,path+'/'+name2)
   end  
  printf("%s/%s -> %s\n",path, name1,name2)
end

filelist = Array.new
if ARGV.length == 0 then
   filelist.push(".")
else
   filelist.concat(ARGV)
end

filelist.each{|path| 
   search_and_rename(path) 
}

GPX形式のファイルを数値の並びに変換するRubyスクリプト

GPSロガーの出力をgnuplotでプロットしたり他のプログラムで処理したりする際に書いたもの。時、分、秒、UNIX時間、経度、緯度の順にファイルに出力。

gpx2txt.rb
#!/usr/bin/ruby
# coding: utf-8
 
require "rexml/document"
require "time"
require "parsedate"

gpxfile_name = ARGV[0]

txtfile_name = File.basename(gpxfile_name,".*") + ".txt"

print "converting ",gpxfile_name," to ",txtfile_name,"\n"
 
doc = nil
File.open(gpxfile_name) {|xmlfile|
  doc = REXML::Document.new(xmlfile)
}
 
txtfile= File.open(txtfile_name,"w")
trkseg = doc.elements["/gpx/trk/trkseg"]

trkseg.elements.each("trkpt"){|trkpt|
  longtitude = trkpt.attributes.get_attribute("lon")
  latitude = trkpt.attributes.get_attribute("lat")
  time = trkpt.elements["time"].text
  year,month,day,hour,min,sec,zone,dow = ParseDate.parsedate(time)
  unixtime = Time.parse(time).to_i
  txtfile.puts "#{hour} #{min} #{sec} #{unixtime} #{longtitude} #{latitude}"
}

UTF-8データのコードポイントをダンプするCプログラム

標準入力から読み込んで、16進数で標準出力に書き出すだけのプログラムです。

dump-utf8.c

#include <stdio.h>
#include <stdlib.h>
#define CHECK_BIT_PATTERN(x,y) (((x)&(y))==(y))

int GET_CHAR_FROM_FILE(FILE *fp)
{
  int c0,c1,c2,c3 ;
  c0 = fgetc(fp) ;
  if (c0 == EOF) return EOF ;
  if (CHECK_BIT_PATTERN(c0,0xf0)) {
    c1 = fgetc(fp) ; if (c1 == EOF) return EOF ;
    c2 = fgetc(fp) ; if (c2 == EOF) return EOF ;
    c3 = fgetc(fp) ; if (c3 == EOF) return EOF ;
    return ((c0 & 0x07)<<18) + ((c1 & 0x3f)<<12) + ((c2 & 0x3f)<<6) + (c3 & 0x3f) ;
  } else if (CHECK_BIT_PATTERN(c0,0xe0)) {
    c1 = fgetc(fp) ; if (c1 == EOF) return EOF ;
    c2 = fgetc(fp) ; if (c2 == EOF) return EOF ;
    return ((c0 & 0x0f)<<12) + ((c1 & 0x3f)<<6) + (c2 & 0x3f) ;
  } else if (CHECK_BIT_PATTERN(c0,0xc0)) {
    c1 = fgetc(fp) ; if (c1 == EOF) return EOF ;
    return ((c0 & 0x1f)<<6) + (c1 & 0x3f) ;
  } else {
    return c0 ;
  }
}

main()
{
  int c ;
  while ((c = GET_CHAR_FROM_FILE(stdin)) != EOF) {
    printf("0x%04x\n",c) ;
  }
}