シンタックスハイライト

2012/03/20 § コメントする

はてなから引っ越した。

日付がバグったが、00時を01時に置換してデータ移行はできた。

はてなを使い出した理由は「コードのシンタックスハイライト」だけだった。

だけど、これがデカイ。

ひどい失態をやらかしたはてなから引っ越したはいいけど、シンタックスハイライトどうしよう。

ブログ難民

2012/03/13 § コメントする

はてな、もうアカンな。

時間あるときにまた引っ越さな。

googleとはてな以外の引越し先か。

どこに行けばいいんやろ

sqlite3

2012/02/17 § コメントする

sqliteの型はかなりいいかげん。

型は

NULL
INTEGER
REAL
TEXT
BLOB
しかない。がcreate tableで他の型を書いても通す。

stringとかvarcharとか。でも内部では適当に扱われる。

たまに文字入れたつもりがREAL扱いされたりするので注意。

他所様のサイトにpostするときは文字コードに注意

いや、すっかり忘れてた。

そりゃそうだね。

  • 自動化されたテストのないアジャイルはダメだ

頻繁なリリースなのでみんな焦る。

テストがないから(やっても手作業)既存の振る舞いを変えるのが怖くて場当たり的な対応をする。

構造の変更もできない。(怖くて)

  • 詰む

若手の子に言っとくこと

2012/01/30 § コメントする

今度若手の子と飲みに行ったら話すことのメモ。

  1. 多人数の開発では糞なルールでもないよりはあったほうがいい
  2. 他人の書いたコードを呼び出す不安はわかるが同じ処理を新しく作るのはやめよう
  3. ガード節使おう
  4. バージョン管理使ってるんだから古いコードは削除してOK
  5. Shallow CopyとDeep Copy、同値と同一の違いを分かっておこう
  6. 定数はコンパイル時に取り込まれるから注意しよう
  7. ユニットテストとリファクタリングはセットです
  8. わかりにくいコメントでメソッドの説明書くよりはテスト書いといた方が挙動がわかりやすい
  9. フレームワークは作った人の意図を汲んで使ってあげてください
  10. 入力は厳しくチェックしてダメならささっと例外上げてあげよう。わかりやすいエラーメッセージも添えて
  11. 業務アプリ作るならDBとはどうせ付き合うことになる。ORマッパーもいいけどSQL書こうよ
  12. トランザクション分離レベル、共有ロック、更新ロック、排他ロックは理解しとこう
  13. ついでに楽観的同時実行制御、悲観的同時実行制御を理解しよう
  14. さらについでにスレッドも覚えよう。レースコンディションとか共有のリソースいじるという意味ではDBとさして変わらない。プロセス内のメモリの話なだけだ。
  15. sqlの暗黙の型変換に気をつけよう
  16. フレームワークの変な挙動を逆手にとったハックはやめよう
  17. java以外もやろう。クロージャと高階関数くらいは覚えとこう
  18. 変数のスコープとエクステントをしっとこう
  19. 遅延評価を覚えとこう

rubyでエクセル

2012/01/23 § コメントする

時間もあったしjavaは飽きたからrubyでエクセルからエラーコードの情報を抜いてみた。

書き捨てのスクリプトだからわりと適当。

やっぱ高階関数いるよ。いるって。javaにも入れろよ。

高階関数には無名関数が必要だよ。

# -*- coding: utf-8 -*-
require "win32ole"
require "kconv"

def writeExcel path
  excel = WIN32OLE.new('EXCEL.Application')
  excel.visible = false
  excel.displayAlerts = false
  wb = excel.workbooks.open path
  sheet = wb.worksheets.item(1)
  begin
    yield sheet
  ensure
    wb.save
    wb.close
    excel.quit
  end
end

writeExcel "C:/Temp/xxx/xxx.xls" do |os|
  whidx = 1
  excel = WIN32OLE.new('EXCEL.Application')
  excel.visible = false
  excel.displayAlerts = false
  dir=Dir.glob "C:/xxx/xxx/**/*xls"
  dir.map do |e|
    wb=excel.workbooks.open e
    begin
      file_name = File.basename wb.name , ".xls"
      1.upto wb.sheets.count do |idx|
        sheet = wb.sheets.item(idx)
        next unless sheet.name.toutf8 == "xxxx"
        
        1.upto 100 do |hidx|
          cell=sheet.cells.item(hidx,1)
          no=cell.value
          next unless no
          next unless no.to_s=~/^[0-9.]+$/
          puts no.to_s
          cell=sheet.cells.item(hidx,3)
          title=cell.value
          cell=sheet.cells.item(hidx,18)
          check=cell.value
          cell=sheet.cells.item(hidx,48)
          error_code=cell.value
          cell=sheet.cells.item(hidx,52)
          msg_code=cell.value
          break unless title

          puts "file:#{file_name},title:#{title},check:#{check},errorcode:#{error_code},msgcode:#{msg_code}"
          cell=os.cells.item(whidx,1)
          cell.value=file_name
          cell=os.cells.item(whidx,2)
          cell.value=title
          cell=os.cells.item(whidx,3)
          cell.value=check
          cell=os.cells.item(whidx,4)
          cell.value=error_code
          cell=os.cells.item(whidx,5)
          cell.value=msg_code
          whidx = whidx+1
        end
      end
    ensure
      wb.close
      excel.quit
    end
  end
end

RVM入れた(ホントは結構前に)

2011/12/26 § コメントする

おもい腰を上げてRVM導入
参考にしたサイト
Mac に rvm をインストールして 複数バージョンの Ruby を使う – hogehoge foobar Blog Style5
nashiwaterの日記
以下コマンド等

rvm list known

インストール可能なrubyのリスト

rvm install x.x.x

rubyのインストール

rvm list

入ってるrubyのリスト

rvm reset

設定リセット。systemに戻す

rvm use x.x.x

特定のバージョンを使うように設定。ログアウトすると設定消える。

rvm --default x.x.x

デフォルト設定。ログアウトしても消えない。

rvm get latest
rvm reload
rvm version

rvmのアップデート

rvm gemset name

仕様中のgemsetの名前表示

rvm gemset create xxx

gemsetの作成

rvm use x.x.x@xxx

使用するrubyとgemsetを指定

つでにgem

gem install xxx

でインストール

gem list --remote|grep xxx

入れれるの探す。

javaその5(周辺ツール)

2011/11/29 § コメントする

色々と足りんなあ。知識が。

スレッドダンプ取得:

SendSignal

逆コンパイラ

2010-02-16 – 谷本 心 in せろ部屋

究極の問題解析ツール、逆コンパイラJD-Eclipseとは (1/2) – @IT

例外発生時にブレーク

Java例外ブレークポイントの追加

スレッドダンプ、ヒープダンプ、プロファイラ、スナップショット

VisualVM 入門 — Java.net

javaその4(DBアクセス)

2011/11/23 § コメントする

さらに続き。

データベースアクセスを試す。

色々忘れている。流石に忘れている。

Class.forNameとか懐かしすぐる。

まあ、いい。

繋いだのはpostgres。

jdbcはmacportsでサクッと入れた。

で、まずeclipseでクラスパスを通す。

eclipseではビルドパスから設定するみたい。

なぜ、クラスパスではなく、ビルドパスなのか疑問に思いつつ、postgresのjdbcがどこに入っているのか調べる。

/opt/local/share/java/

にあるpostgresql.jarを追加。

でつないでみる。

当然繋がらない。

tcpipでつながってくれないみたい。

Connection refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections

だってさ。

なんだかんだいじったけど結局は

/opt/local/var/db/postgresql84/defaultdb/postgresql.conf

の#listen_addresses = ‘localhost’をコメントアウトしたらいけた。

confの位置がmacportsで入れるか、他の手段で入れるかで場所が変わるからその辺り探すのが面倒。

ただ、バージョンアップをセコセコ自分でしたくないからできる限りはmacportsを使いたい。

で、eclipse上でjdbcの設定して以下のコードで動いた。

package test1;
import java.sql.*;
public class Cls4 {
public void test() throws ClassNotFoundException, SQLException{
Class.forName("org.postgresql.Driver");
Connection con = DriverManager.getConnection("jdbc:postgresql://localhost:5432/xxx","xxx","xxx");
PreparedStatement ps = con.prepareStatement("select * from test0");
ResultSet rs = ps.executeQuery();
while(rs.next()){
int id = rs.getInt(1);
String str = rs.getString(2);
boolean b = rs.getBoolean(3);
System.out.println(String.format("%d,%s,%b", id,str,b));
}
}
}

繋がらねー、とconfをいじりまわしてたんだけど結局はポート番号を間違えていたという情けないオチだった。

動いたからいいや。

それからResultSetのgetXXXの添字はなんで1スタートなんだろう?0じゃねえのかよ、と思ったのはナイショだ。

javaその3(正規表現とファイルIO)

2011/11/23 § コメントする

さらに続き。

特筆する点は特になし。

mc.groupCountは

グループ 0 はパターン全体を表します。グループ 0 は、このカウントに含まれません。

グループインデックスがこのメソッドから返された値以下の正の整数である場合は、この正規表現エンジンで有効です。

だそうで、なんか微妙。

IOはBufferedxxxを作るのがjavaの様式美。懐かしいな、これ。

package test1;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.regex.*;
public class Cls3 {
public void test() throws IOException{
//正規表現
String target = "http://faroffsea.blogspot.com/";
Pattern pt = Pattern.compile("(.*)://(.*)/");
Matcher mc = pt.matcher(target);
if(mc.matches()){
for(int i = 0;i <= mc.groupCount(); i++){
System.out.println(mc.group(i));
}
}
//ファイルIO
File f = new File("./iotest.txt");
if(f.exists()){
f.delete();
}
f.createNewFile();
BufferedWriter bw = new BufferedWriter(new FileWriter(f));
try{
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss");
bw.write(sdf.format(Calendar.getInstance().getTime()));
}finally{
bw.close();
}
BufferedReader br = new BufferedReader(new FileReader(f));
try{
System.out.println(br.readLine());
}finally{
br.close();
}
System.out.println("end");
}
}

javaその2

2011/11/23 § コメントする

javaの続き。

FFIは使わんだろうからナシ。

イテレータ関連についても高階関数も遅延評価もないからナシ。

で、例外に関して。

シンタックスは普通だから特筆すべきことはない。

ただし、javaには検査例外があるのが特殊。

以下参照。

http://d.hatena.ne.jp/daisuke-m/20081202/1228221927

http://blogs.msdn.com/b/nakama/archive/2009/01/09/net-java.aspx

.netでは例外は基本的に投げっぱなしー>集約ハンドラで処理

を基本としていたが、javaでは検査例外があるので、そうもいかない。

try-catchを書かないとコンパイルが通らない。

throwsも含めてメソッドシグニチャ(メソッドの仕様)なのだといわれれば納得はできる。

しかし、引用したブログで記述のある業務エラーを例外で表現する方法に関しては反対したい。

理由としては

業務エラーは想定しうるエラーなので、例外処理機構で処理するのは気持ち悪い。

つまり本当の例外、回復不能状態と同じシンタックスで条件分岐、処理を行うのがキモチ悪い。

というだけなのですが。

追記

java7からはRAII的な機能が入ってるってさ。

try ( XXX xx = new XXX() ) {
...
}

で、スコープを抜けるときにリソースの破棄処理が走るそうだ。

XXXに入るクラスはjava.lang.AutoCloseable、java.io.Closeableを実装する必要あり。

ま、C#のusingとだいたい一緒。

あれ?usingってたしか問題あったような・・・

Using ステートメントに関する問題の回避

これだっけ?