プログラマメモ2

2009-11-03

[perl]サブルーチンの引数


perlです。
サブルーチンの引数の指定の仕方。
この書き方すっきりしてるなと思った次第。
ちなみにこの方法だと引数のもとの値の上書きとか、副作用がないようですね。

#!/usr/bin/perl

sub func {
my ($a, $b, $c) = @_;
print "$a $b $c\n";
}

func("ok1", "ok2", "ok3");


参考




2009-10-22

0002/11/30の謎


Javaです。

下記のようなコードに出会いました。

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class TestDate {

public static void main(String[] args) throws ParseException {
a("20091022");
a("00000000");
}

static void a(String s) throws ParseException {
SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
Date date = format.parse(s);
System.out.printf("in:[%s] out:[%s]%n", s, new SimpleDateFormat(
"yyyy/MM/dd").format(date));
}
}


動かしたらこんな結果になりました。
in:[20091022] out:[2009/10/22]
in:[00000000] out:[0002/11/30]


気分としては、00000000を渡したら、0000/00/00になって欲しかったのですが、
Dateを使う実装だったので、0002/11/30という値になったわけです。

どうして0002/11/30になるんですかね?

0002/11/30でグーグルさんに尋ねるといくつかヒットしますね。




2009-10-19

ダングリングタプル - 宙ぶらりんなタプルだよ


ダングリングタプル(dangling tuple)
結合時に相手がいないタプルのことをダングリングタプルというらしい。
結合不能タプルともいうようだ。

danglingって宙ぶらりんとかいう意味があるらしい。

で、このダングリングタプルから、外部結合(outer join)の話となるわけ。

この用語は下記の本で知りました。

データベースの仕組み (情報科学こんせぷつ)
4254127138




2009-10-18

H2でテーブル作成時のSQLを取得


H2データベースです。

select SQL from INFORMATION_SCHEMA.tables;


システムテーブルであるINFORMATION_SCHEMAからいろいろ情報取得できます。

webのH2コンソールで、ためしてみました。


実験するときに使いやすいのでついつい使ってしまうH2です。




2009-10-16

[java]行と列をいれかえる


行と列をいれかえます。

どんなことをしたいかというと下記のようにしたいわけです。

a b c
1 2 3
e f g
4 5 6

a 1 e 4
b 2 f 5
c 3 g 6


さらにこんな感じ。
1 2 3 4
5 6 7 8
a b c d
e f g h

1 5 a e
2 6 b f
3 7 c g
4 8 d h


コードこんな感じ。

public class TestR_C {
public static void main(String[] args) {
String[][] ss = new String[][] { { "a", "b", "c" }, { "1", "2", "3" },
{ "e", "f", "g" }, { "4", "5", "6" } };
print(ss);
System.out.println();
print(a(ss));
System.out.println();
ss = new String[][] { { "1", "2", "3", "4" }, { "5", "6", "7", "8" },
{ "a", "b", "c", "d" }, { "e", "f", "g", "h" } };
print(ss);
System.out.println();
print(a(ss));
}

static String[][] a(String[][] ss) {
int r = 0;
int c = ss.length;
{
for (String[] s : ss) {
if (r < s.length)
r = s.length;
}
}

String[][] ss2 = new String[r][c];

int rp = 0;
for (String[] s : ss) {
int cp = 0;
for (String val : s) {
ss2[cp][rp] = val;
cp++;
}
rp++;
}

return ss2;
}

static void print(String[][] ss) {
for (String[] s : ss) {
for (String val : s) {
System.out.printf("%s ", val);
}
System.out.println();
}
}

}




2009-09-23

reStructuredTextで変換されない文字列を埋め込みたい場合 - Raw Data Pass-Through



reStructuredTextです。

Overview — Sphinx v0.6.3 documentationを調べています。
用途はほとんどHTML変換のためなのですが、画像の他に動画を埋め込んだり、flashとか入れた場合どうするんだろうと、悩んでいました。

で、reStructuredTextを調べていて、そのものずばり、Raw Data Pass-Throughというものがありました。
rawディレクティブを使って引数をhtmlにすると、HTMLのコード直接書けます。
HTML Writerがそのまんまスルーしてくれます。

.. raw:: html
ここにHTMLタグが書けるよ




2009-08-27

ラベル付きブロックのラベルを日本語で。


Javaです。

最近、日本語で変数名とかメソッド名をつけてもいいかなーと思ってます。
一年前ぐらいなら、日本語で変数名とかメソッド名なんて絶対だめと考えていましたが、似非英語を使うよりも、いいかなと。

あと、コメントに仕様書からのコピーのっけるなら、日本語で書かれた仕様書にさらに近づけるというわけで。

単語の省略形もさけてましたが、別にこれもOKかな。
いろいろな文化(プログラミングの)、経験した人がいるわけで、もう何でもありだ(笑)
もちろんルールを決めたらそれを守る方向で。

ソースコードと仕様書の乖離をどうふせぐかも頭が痛い問題だと思います。

ここんとこ考えているのは、ラベル付きブロックを使って上手い具合に仕様書とあわせられないかなーということです。

package ラベル;

public class ラベル参考 {

public static void main(String[] args) {
a();
}

static void a() {

処理1: {

if (false)
break 処理1;

if (false)
break 処理1;

if (false)
break 処理1;
}

処理2: {

if (false)
break 処理2;

if (false)
break 処理2;

if (false)
break 処理2;
}
}
}




参考




2009-08-20

ByteBufferで、リトルエンディアン指定で。


Javaです。
バイナリのファイルデータを読み込むときとかにByteBufferを使ってます。

リトルエンディアン指定で、読み込む場合は、orderを指定します。

import java.nio.ByteBuffer;
import java.nio.ByteOrder;


public class TestByteBuffer {

public static void main(String[] args) {
a();
}

static void a(){
byte[] bs = {0x01,0x0, 0x0, 0x0};
ByteBuffer buffer = ByteBuffer.wrap(bs);
buffer.order(ByteOrder.LITTLE_ENDIAN);
System.out.println(buffer.getInt());
}
}




2009-08-03

いまさらながらJavaの文字列(String)を==で比較しちゃだめよ


Javaです。

いまさらながら文字列の比較です。

下記のコードで出力される結果は、なんでしょうか。

public class Testストリング0 {
public static void main(String[] args) {
String a = "abc";
String b = "abc";
System.out.println(a == b);
}
}


僕の環境ではtrueでした。

で、一瞬、いつから文字列の比較で==がOKになったのかしらと思いました。

気をとりなおして、下記のコードで検証。
public class Testストリング0 {
public static void main(String[] args) {
String a = "abc";
String b = "abc";
a +="d";
b +="d";
System.out.println(a == b);
System.out.println(a.equals(b));
}
}


案の定、==では比較できませんでした。




2009-07-20

ひとつのメソッドにしか実装が許されていない場合には、もっとラベル付きのブロックを使ったらどうかな。


Javaです。
あるプロジェクトでは、あるフレームワークでは、exectuteメソッドにしかロジック(ビジネスロジック)を実装してはいけないそうです。
インナークラスを作ってはいけないし、メソッドをつくってもいけないそうです。プログラマが許されているのは、このメソッドの中での実装のみです。
こうなるとひとつのメソッドが1000行近くなる場合もあるようです。これは不幸です。

少しでも読みやすいコードを書くためにラベル付きのブロックを使うというのがいいのではないかと考えてます。

ちなみにブロック内で宣言した変数はそのスコープでしか有効でないですし。

public class TestLabelAndBlock {

public static void main(String[] args) {
execute();
}

static void execute() {
{

INIT: {
int a;
}

MAIN: {
int a;
}

FINALLY: {
int a;
}

}
}
}




2009-07-11

ソースコードにSQLを埋め込む場合には、ツールで簡単にとりだせるように目印をつける。


SQLをソースコードに埋め込む場合はツールでとりだしやすいように前後にマーカーを入れましょうという話。
重要なのは、対象部分の前後にコメントを入れること。簡単な正規表現で抜き出せるようにしておくとよいかも。

えーと、こんなのはどうだろう

// START SQL:ユニークキー
ここに対象部分
// END SQL:ユニークキー




 

プログラマの本棚