英語キーボードで半角/全角キーを変更 [windows] [tips]

英語キーボードで日本語入力するときいちいち

左Alt + ~ (チルダ)

とかめんどくさいので、変更した。(AXキーボードのドライバを使うパターンで)

  • (会社のPCの設定をそのままもってきた。Webで調べたらみんなそうしてるみたい。)

regedit

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt\Parameters 
LayerDriver JPN : REG_SZ : kbdax2.dll
OverrideKeyboardIdentifier: REG_SZ : AX_105KEY
OverrideKeyboardSubtype: REG_DWORD : 0x00000001 (1)
OverrideKeyboardType: REG_DWORD : 0x00000007 (7)

あと、CAPS -> Ctrlへの変換も忘れないように書いておく

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Keyboard Layout
Scancode Map : REG_BINARY
0000  00 00 00 00 00 00 00 00
0008  02 00 00 00 1D 00 3A 00
0010  00 00 00 00 

今のCtrlはCtrlのまま変更しない

PC買ったら必ずやる。

バッチファイルのショートカットアイコン設定 [dos] [tips]

バッチファイルのアイコンとか、.jarのアイコンとかを変更する方法。(かなり前のメモ)

Javaのアプリケーションで利用される".jar"ファイルは、Windowsではファイルの関連付けの機能でjavawに関連付けされ、全て同一のアイコンに設定されています。

バッチファイルも、同様に変な歯車のアイコンに設定されています。

これでは、アイコンがどのアプリケーションでも同じになってしまい、プロフェッショナルな感じがしません。

そこで、JScript (JavaScriptに似て非なるWindowsのスクリプト)を用いてアイコン付きのショートカットを作成する方法で解決します。

用意するもの。

  • アプリケーションを起動するためのバッチファイル。(.batファイル)
  • アイコンファイル(.ico)(フリーウェアなどで作成)
  • JScriptファイル(以下に記述)

上記を同一フォルダにおいてJScriptをダブルクリックで実行する形になります。

JScriptファイル内容(makeShortcut.js):

hello.batをhello.lnk/hello.icoと関連付けてデスクトップに作成する場合

Shell = new ActiveXObject("WScript.Shell");
DesktopPath = Shell.SpecialFolders("Desktop"); //デスクトップにショートカット作成
link = Shell.CreateShortcut(DesktopPath + "\\hello.lnk");
link.Arguments = ""; // .batファイルに引数を渡す場合ここに記述
link.Description = "hello.bat shortcut";
link.HotKey = "";
link.IconLocation = Shell.CurrentDirectory + "\\hello.ico";
link.TargetPath = Shell.CurrentDirectory + "\\hello.bat";
link.WindowStyle = 3;
link.WorkingDirectory = Shell.CurrentDirectory;
link.Save();

multipartメールのbase64の解凍方法 [perl] [tips]

multipart/mixedのメールが複数分割されて送られてきました。メール本文は空っぽで、全て添付ファイルになっていました。

どうやら、outlook expressで送信した場合に起こる現象のようですが、こちらで読めないので困ってしまいます。

中身を見ると、テキストの本文に続き、

Content-Type: application/octet-stream;
Content-Transfer-Encoding: base64

となっていて、この部分以降に怪しげな文字列が延々と続いています。

この部分以降は、base64でエンコードされたバイナリ添付ファイルなわけです。

この部分を取り出してエンコードを解けば(デコードすれば)、添付されていたファイルを復活できるはずです。

で、perlの出番です。

Step1:base64部分だけのファイルを作る

> ls
xxx[1_3].dat
xxx[2_3].dat
xxx[3_3].dat
> cat *.dat > abc.dat
> vim abc.dat
#ここで、必要な部分(怪しげな文字列の部分)以外を削除

Step2: perlでデコード

Perlのソース

#!/usr/bin/perl -w
use MIME::Base64;
binmode STDOUT,'raw';
binmode STDIN,'raw'; 
while(<>){
  print decode_base64($_);
}

楽勝だね。

Railsテスト時に日付を固定にする方法 (for Test::Unit) [ruby] [rails] [TDD]

Railsで試験をする時に、日付に依存する機能(次の誕生日までの日数を求めるとか。。)がある時、今までならfixtureに

date: <%= Date.today().to_s %>

とか、動的にfixtureを定義していたのですが、いろいろロジックが複雑になりだしたので、発想を逆にすることにしました。

つまり、テストの日付を固定するという方法です。

基本的に、Date.today()や、Time.now()を上書きしてやるのですが、他のテストに影響を与えないようにやる必要があります。

そこで、Test::Unit::TestCaseのsetup/teardown内で、関数の再定義、もとの定義への戻しをやってやります。

hoge_controller_test.rb

:
#このテストは2008年9月で試験
class Date
  def self.fixed_today
    return Date.new(2008,9,1)
  end
end

class HogeControllerTest < Test::Unit::TestCase 
  def setup
    Date.instance_eval do
      alias :orig_today :today
      alias :today :fixed_today
    end
  end
  def teardown
    Date.instance_eval do
      alias :fixed_today :today
      alias :today :orig_today
    end
  end
:
end

特異メソッドのaliasを作成するので、instance_evalを利用してaliasによる関数の入れ替えをしています。

CGIでリファラ(HTTP_REFERER)を取る方法 [perl] [javascript] [tips]

あいかわらず、初歩的なところにいます。。。(-_-;)

perlのCGIでアクセス解析のためにリファラ(訪れた人が前に見ていたページ)を取ろうとしてたのですが、検索サイトによって文字が化けたりしてたので、utf8に統一してみようということで、以下のようにしました。

  • ページに埋め込むjavascript
<script language="JavaScript">
  <!--
    document.write('<img src="http://hoge.fuga.funya/access.cgi?rr=' + escape(document.referrer) + '" />');
  // -->
</script>

imgタグ内でアクセス解析用のcgiを呼んでいます。cgi側でHTTP_REFERERを取ると、このスクリプトを入れたページ自身になるので、パラメータとしてrrにリファラを入れています。

  • cgi側(perl)
#!/usr/bin/perl -w
use strict;
use CGI;
use Encode;
use Encode::Guess qw/euc-jp shiftjis 7bit-jis/;
use utf8; 

my $file="access.log";

my $q=new CGI;
my $ref = url_decode($q->param('rr')); #前のページ
my $referer = url_decode($q->referer()); #見られてるページ

my $result="\"$ref\",\"$referer\"\n";

open(FILE,">>:encoding(utf8)", $file) or error($q, "can't open");
print(FILE $result);
close(FILE); 

&printimg;
exit;
 
sub url_decode{
  my $str = shift;
  return 'hoge' unless $str;
  $str =~ tr/+/ /;
  $str =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg;
  my $decoder = Encode::Guess->guess($str);
  return $decoder->decode($str) if(ref($decoder));
  return decode("utf8",$str);
}
sub printimg{
  open(COUNTERIMG, "./counter.gif") or error($q, "can't open");
  binmode(COUNTERIMG);
  print "Content-type: image/gif\n\n";
  print <COUNTERIMG>;
  close(COUNTERIMG);
}

urlエンコードされた文字を一旦もどしてからEncode::Guessでデコードしてファイルに書き込んでいます。

これにより、文字コードが統一されます。

urlエンコードをデコードするときにpackを利用しているのでutf8フラグ関係が心配なので、utf8フラグをつける前にurlデコードしています。

最後にimgを転送して終了。

なんか美しくないけど、動く。

ノートPCのリカバリ(EISA)領域を消す方法 [vista]

さて、我が愛機のVaioですが、リカバリソフトが入っている領域として「EISA」というのがあるのですが、これを消すことができなくて困ってました。

リカバリディスクを作成した後は不要となるのですが、これを消すには作成したディスクからOSの再インストールというのが常套手段のようでした。

僕は、そういうことを知らずに山ほどソフトを入れたので、いまさらインストールしなおしは勘弁して欲しいと思っていたのですが、ようやく解決方法がわかりました。

  • diskpart.exeを管理者権限で起動 (dos窓)
  • EISAのあるディスクとパーティションを選択(list disk, select disk, list partition, select partition)
  • delete partition
  • その後、visitaの管理画面(ディスクの管理)から、EISAのあったパーティションをフォーマット & Cドライブのどこかのフォルダにマウント

となります。

僕の場合、colinuxが数ギガあったので、colinuxフォルダごとマウントしたドライブに入れ替えました。

(別ドライブとすることもできますが、マウントしてオリジナルフォルダごとコピーするほうがcolinuxを丸ごと移動できてよかった。)

バイナリの文字列表現(ucs-2)をバイナリに変換 [perl] [java]

言語によっていろいろ違うなぁと実感。

Perl

use Encode;

binmode STDOUT, ":encoding(shiftjis)"; 

my @str = qw(00110000 01000010);
my $final = join('',map{pack('B8',$_)} @str);
$final = decode('UTF-16BE',$final); 
print $final;

Perlのmap関数の使い勝手は最強ですね。

java

import java.io.*; 

public class BinaryDecode{
  public static void main(String[] args) {
    String[] strArray = {"00110000","01000010"};
    byte[] bytes = new byte[2];
    int i = 0;
    for(String s : strArray){
      int j = Integer.parseInt(s,2);
      if(j > 127){ j = j - 256;} //-128~127に収める処理
      bytes[i++] = (byte)j;
    }
    try{
      System.out.println(new String(bytes,"UTF-16BE"));
    }catch(IOException e){
      e.printStackTrace();
    }
  }
}

javaの場合、文字列が可変長の場合、"byte[]"の代わりに"List"を使う必要が出てきてさらにややこしくなる。

また、javaでは、Byte.parseByteは、内部的にIntegerに変換して128以上だとエラー出すので、しょうもない処理が必要。

Windows IPv6のプレフィックスポリシー参照方法 [dos] [network]

いずれ、こういうコマンドも必要になるんだろう。

netsh interface ipv6 show prefixpolicy

知っておく。

ipv6 install

も忘れないようにしなきゃ

選択したURLに飛ぶブックマークレット [bookmarklet] [javascript]

マウスで選択したURLに飛ぶブックマークレット。

ttpで始まるものにも飛べるように改造してもいいかもしれない。

javascript:(function()%20%7Bvar%20w='';if(window.getSelection)%7Bw=window.getSelection();w=''+w;%7Delse%20if(document.selection)%7Bw=document.selection.createRange().text;%7Dif(w.length%3E0)%7Bwindow.open(w);%7Delse%7Balert(%22nothing%20selected%22);%7D%7D)()

選択したURLにジャンプ

RFM分析(営業・マーケティング) [business]

R(recency:最新購買日) いつ買ったか、最近購入しているか

F(frequency:累計購買回数) どのくらいの頻度で買っているか

M(monetary:累計購買金額) いくら使っているか


http://www.atmarkit.co.jp/aig/04biz/rfm.html

xargsとか忘れがちなのでメモ。 [unix] [perl] [one_liner]

便利なワンライナー


grep -r -l xxxxx . | xargs perl -pi.bak -e "s/xxxxx/yyyyy/g"


xxxxxの含まれているファイルを抽出して、中身のxxxxxをyyyyyに書き換え。

バックアップファイルとして.bakを作成

Unixのフォアグラウンドとかバックグラウンドとか(fg/bg/jobs) [unix] [tips]

すぐ忘れるのでメモ。

>xxxx &   #バックグラウンドで実行
>jobs     #バックグラウンドで動いてるやつをリストアップ
[1] - xxxx
>fg 1     #jobsで出た番号のやつをフォアグラウンドにもってくる
>[ctrl-z] #フォアグラウンドのやつをサスペンド
>bg       #フォアグラウンドのやつをバックグラウンドに持っていく

Rubyで動的に関数定義3(for Test::Unit) [ruby] [tips] [TDD]

Rubyで動的に関数定義

Rubyで動的に関数定義2

からの続き。

で、今回いろいろ調べていた大元の理由である「テストケースの自動生成」だけど、こんな感じで使えそう。


テスト対象

class Testee
  def login(login_user)
    @login_user ||=login_user
  end
  def who_am_i?
    @login_user
  end
end

一つのテストケース内でログインの試験を複数回やると、初回のログイン情報が残るためにfailする。

require 'test/unit'
require 'testee' 

class TesteeTest < Test::Unit::TestCase
  def test_should_login
    @testee.login(:hoge)
    assert_equal :hoge, @testee.who_am_i? # => ok
    @testee.login(:fuga)
    assert_equal :fuga, @testee.who_am_i? #=> fail :hogeが残ってる
  end
end


今までなら、複数の試験を手書きしてた。


そこで、今回勉強してきた、define_methodを利用してテストケースを自動生成してみる。

require 'test/unit'
require 'testee' 

class TesteeTest < Test::Unit::TestCase
  def self.generate_test
    while login_name = DATA.gets do
      login_name.chomp!
      define_method("test_should_login_by_#{login_name}") do
        @testee.login(login_name)
        assert_equal login_name, @testee.who_am_i? , " error on login by #{login_name}"
      end
    end 
  end
  def setup
    @testee = Testee.new
  end
end
__END__
:hoge
:fuga


うまくやれば、PerlのTest::Baseくらい使い勝手が良くなるかもね。


Rubyで動的に関数定義2 [ruby] [tips]

Rubyで動的に関数定義

からの続き。

生成後のインスタンスに関数を動的に生やす場合は、いろいろ試したが、以下の方法が一番よさそう。

インスタンス変数、クラスインスタンス変数、ローカル変数(クロージャ)が利用できる。


class Dog
  @dog_counter = 0
  def initialize(name)
    self.class.class_eval { @dog_counter += 1 }
    @dog_name = name
  end
  def perform
    puts "*****"
    puts "I am #{@dog_name}." # instance variable @
    puts "Total Dogs are #{self.class.class_eval {@dog_counter}}." # class instance variable @
    puts "bow!"
  end
end
dog_hoge = Dog.new('hoge')
dog_hoge.perform
dog_fuga = Dog.new('fuga')
dog_fuga.perform


インスタンスdog_fugaにだけ関数をオーバライドしてやる。

instance_eval, define_methodを利用することにより、外部ローカル変数を利用できる。


lexical_local_variable = 'Wooooo!'
(class << dog_fuga;self;end).instance_eval do
  define_method(:perform) do
    puts "*****"
    puts "I am #{@dog_name}." # instance variable @
    puts "I am one of the #{self.class.class_eval {@dog_counter}} Dogs." # class instance variable @
    puts "#{lexical_local_variable}" # lexical closure(local variable)
  end
end
dog_hoge.perform
dog_fuga.perform


いろいろ使えそうだ。


追記

Rubyで動的に関数定義3(for Test::Unit)

unixのマニュアルのテキスト保存方法 [unix] [tips]

会社の重鎮に教えてもらった。


man xxx | col -bl > xxx.txt


こうすると、下線とかboldとかが取れてきれいなテキストで落とせる。

これからそろえたい書籍「1分間」シリーズ [business] [todo] [books]

ブックマークがうまく働かなかったので、ここに書いておく。


1分間シリーズ


何冊か読んだけど古さを感じないくらいいい本。


perlでナベアツ(FizzBuzz改) [日記] [perl]

FizzBuzzってはやってたけど、3の倍数と3の付く数字でアホになる場合はどうなるかやってみた。


perl -e'print+(aho)[$_%3 and (/3/)?0:1]||$_,$/for 1..100'


もっと短くなるのだろうか。。。


参考:

FizzBuzz - Golf Challenge


追記: 3項演算子いらないみたい。

perl -e'print+(aho)[$_%3 and !/3/]||$_,$/for 1..100'


sqlで日付を月初にしてグループ化する方法 [tips] [mysql]

レポート用のクエリーとかで、日付を月初にあわせてグループ化したかったりする。

sqlでは以下のようにすればできる。


select cast(date_format(date_column,'%Y-%m-01') as Date) from table
group by cast(date_format(date_column, '%Y-%m-01') as Date);


本当にcastが必要なのかが良くわからん。


Rubyで動的に関数定義 [ruby] [tips]

module_eval(= class_eval),instance_evalがある。

なんで、この機能を調べているかというと、Railsで試験しているときに、ログインユーザを切り替えようと、一つのテスト関数内でログインを繰り返してたら、同じテスト関数内は同一セッションになって「すでにログインしてます」とかなったわけさ。(俺のインプリでは)


で、いちいちログアウトさせるのも面倒なので、いっそのことテスト関数を自動生成しようと思った。


そのうち詳しく書こうと思うので[todo]タグ。


追記:


module_eval(=class_eval)は、レシーバのクラスにインスタンス関数を定義。

irb> class Hoge
irb> end
irb> hoge = Hoge.new
irb> Hoge.module_eval {def fuga() p 'fuga';end}
irb> Hoge.fuga #=> error
irb> hoge.fuga #=> 'fuga'
irb> Hoge.new.fuga #=> 'fuga'


instance_evalは、レシーバがクラスの場合、クラス関数を定義(def self.xxxってやるやつと同等)

irb> class Hoge
irb> end
irb> hoge = Hoge.new
irb> Hoge.instance_eval {def fuga() p 'fuga';end}
irb> Hoge.fuga #=> 'fuga'
irb> hoge.fuga #=> error
irb> Hoge.new.fuga #=> error

instance_evalは、レシーバがobjectのインスタンス場合、そのobjectのインスタンス関数を定義

irb> class Hoge
irb> end
irb> hoge = Hoge.new
irb> hoge.instance_eval {def fuga() p 'fuga';end}
irb> Hoge.fuga #=> error
irb> hoge.fuga #=> 'fuga'
irb> Hoge.new.fuga #=> error


これに変数のスコープとからむとさらにややこしそうだ。

そのうち調べよう。ということでまだ[todo]

追記:

Rubyで動的に関数定義2

Rubyで動的に関数定義3(for Test::Unit)

マインドマップ作成ソフトウェアって [lifehack] [日記]

マインドマップはlifehackツールの一つとしてとても面白いと思う。

だけど、マインドマップをソフトウェアで描くのはどうもしっくり来ない。

どう見てもただの「ツリー作成」ソフトにしか見えない。


WBS(Work Breakdown Structure)作成にマインドマップ使えと勧める記事


とかいうのを見ると余計にそう思う。

amazonのサービス切れを直す [todo] [aws]

対象の探し方

find ./-name "*.xsl" | xargs grep -l amazon | xargs grep -L AWSE


ほっときすぎていろいろなサイトで問題が出ているのが発覚

RubyのYAMLの変な挙動 [ruby] [rails] [bug_or_spec]

railsでto_yamlでactiverecordのオブジェクトをyaml化すると、日付関連がこのようになった。

mydate: !timestamp 08/10/10


で、これをrubyのYAML::loadで、読ませると'argument out of range'というエラーになる。

日付で問題なのはなぜか10月(他にもあるかもしれない。)


irb> require 'yaml'
irb> YAML::load("mydate: !timestamp 08/10/10")
ArgumentError: argument out of range
irb> YAML::load("mydate: !timestamp 08/11/10")
=> {"mydate"=>Thu Jan 10 00:00:00 UTC 2008}

(あれ?、よくみると11月も1月になってるし。。。)


irbでDateをyaml化すると、以下のようなフォーマットになる。

irb> Date.new(2008,10,10).to_yaml
=> "--- 2008-10-10\n"

なので、きっとrailsがto_yamlで変なことをしてるんだろう。


いろいろ調べて、environment.rbの記述を変更することで対処できた。

ActiveSupport::CoreExtensions::Date::Conversions::DATE_FORMATS.update :default => "%Y/%m/%d"

なぜか、'%y'で設定してたので、'%Y'に変えた。


俺のミスってことだな。


Rubyのクラスのインスタンス変数 [ruby] [tips]

Rubyにはクラスにもインスタンス変数を作成することができる。

class Hoge
  def self.count_instance
    @num = 0 if @num.nil?   #クラスのインスタンス変数
    @num += 1
  end
  def self.get_count
    @num
  end
  def initialize(num)
    self.class.count_instance
    @num = num
    self
  end
  def get_count
    @num
  end
end

これがあるんならクラス変数(@@)とかっていらないのかな?

App::Chariot改変2 [perl] [chariot]

テンプレート内に日本語を書くと文字化けする。

utf-8がTemplateで読まれるときのフラグの関係だと思われる。

いろいろ調べてTemplate::Provider::Encodingという、かの有名なmiyagawaさんのモジュールを使えば良いことがわかった。

Index: Chariot.pm
===================================================================
--- Chariot.pm	(revision 13330)
+++ Chariot.pm	(working copy)
@@ -7,6 +7,7 @@
 use YAML;
 use App::Chariot::Config;
 use Template;
+use Template::Provider::Encoding;
 use File::Spec;
 use XML::RSS;
 use Scalar::Util;
@@ -55,9 +56,11 @@
         my $self = shift;
         Template->new(
             {
+                LOAD_TEMPLATES => [ Template::Provider::Encoding -> new({
                 INCLUDE_PATH =>
                   File::Spec->catfile( $self->config->assets_dir, 'tmpl' ),
                 ABSOLUTE => 1,
+                })]
             }
         );
     }


実は、このサイトがずっと英語メニューだったのはこのためだったのだ。:-p

CrossReviewのサイトに参加 [日記]

crossreview(クロスレビュー) || レビューで繋がる、みんなの輪 » hassylin

に参加した。

主にプログラミング関連の本をレビュー予定。

読むのが遅いので、dankogaiさんのように速攻レビューというようには行かないけど。

参考にしてもらえれば幸い。


本当なら自分で作りたかった。

vim changeLogの設定2 [environment] [vim] [changelog]

書くの忘れてた。

autocmd BufRead *.chg setf changelog

これを付け加えておくと、拡張子.chgのものは全てvimでchangelogとして扱われる。

前へ<<   >>次へ