2009年12月30日

[Java] 固定小数点を扱う場合は BigDecimal

Java で $123.45 などというようにドル建ての金額などを扱う場合は固定小数点のデータ構造が必要になる。 そのような場合は java.math.BigDecimal を使えばよさそう。

BigDecimal はスケールなし整数値 (unscaledValue) と、小数点第何位までかを示す scale の整数であらわされる。 例えば 123.45 ならば unscaledValue = 12345, scale = 2 となる。

以下、テストコードとその実行結果をメモメモ

コード

package test;

import java.math.*;

public class BigIntegerTest {

	public static void main(String[] args) {
		BigDecimal num = new BigDecimal("2.35");
		printBigDecimalStructure(num);
		BigDecimal num2 = num.setScale(1, BigDecimal.ROUND_DOWN);
		printBigDecimalStructure(num2);
		BigDecimal num3 = num.setScale(0, BigDecimal.ROUND_DOWN);
		printBigDecimalStructure(num3);
		BigDecimal num4 = num.setScale(10, BigDecimal.ROUND_DOWN);
		printBigDecimalStructure(num4);
	}
	
	static void printBigDecimalStructure(BigDecimal bd) {
		System.out.println("<" + bd + ">");
		System.out.println("unscaledValue: " + bd.unscaledValue());
		System.out.println("scale:" + bd.scale());
		System.out.println();
	}

}

実行結果

<2.35>
unscaledValue: 235
scale:2

<2.3>
unscaledValue: 23
scale:1

<2>
unscaledValue: 2
scale:0

<2.3500000000>
unscaledValue: 23500000000
scale:10
posted by dev-man at 23:50| Comment(15) | TrackBack(0) | Java | このブログの読者になる | 更新情報をチェックする

2009年10月16日

[CSS] 印刷時の改ページ位置を指定する

<p style="page-break-after: always;">
この直後に改ページ
</p>

↓試しに実際にやってみる。
※印刷プレビューしてみて下さい

こんにちは

改ページ!!

こんばんわ

posted by dev-man at 16:08| Comment(0) | TrackBack(0) | XAMPP | このブログの読者になる | 更新情報をチェックする

2009年08月21日

[MySQL] 数値型の桁数指定

MySQL で create table する時、

CREATE TABLE `mytable` (
`id` INT( 4 ) NOT NULL
)
とかって書く時の INT( 4 )が何を意味するかって話です。

今まで私は、最大桁数を表すと思ってました。でもMySQLのリファレンスを見てみると、

MySQL には、INT(4) のように、型の基本キーワードに続いて整数値の表示幅をかっこ内に指定できるオプションがあります。このオプションの表示幅の指定は、カラムに指定された幅より小さい幅を持つ値で表示の左側を埋める目的で使用されますが、そのカラムに格納できる値の範囲が制限されたり、そのカラムに指定された幅を超える幅を持つ値の桁数が制限されたりすることはありません。オプションの拡張属性 ZEROFILL と組み合せて使用した場合、デフォルトのスペースに代わってゼロが埋め込まれます。 たとえば、INT(5) ZEROFILL として宣言されたカラムの場合、値 4 は 00004 として取り出されます。
引用元: http://dev.mysql.com/doc/refman/4.1/ja/numeric-types.html
なぬ!あくまでも表示する時の桁数であり、別に最大桁数を制限するものではないのね!!

おしまい◎

posted by dev-man at 18:15| Comment(0) | TrackBack(0) | MySQL | このブログの読者になる | 更新情報をチェックする

2009年07月19日

[MySQL] select 文で、曜日によって抽出するレコードを変更したいとき

下記のSQLでは、id を 7 で割った余りと今日の曜日によって、抽出するレコードを決定します。

  • 月曜日・・・余りが 0 のものを抽出
  • 火曜日・・・余りが 1 のものを抽出
  • (略)
  • 日曜日・・・余りが 6 のものを抽出

SELECT *
FROM mytable
WHERE id mod 7 = WEEKDAY( current_date )
posted by dev-man at 12:03| Comment(0) | TrackBack(0) | MySQL | このブログの読者になる | 更新情報をチェックする

2009年07月18日

[Apache] BASIC 認証の有無をIPで振分

Webサーバへのアクセスを、

  • 特定の範囲のIPからのアクセス ⇒ アクセス許可
  • それ以外のIPからのアクセス ⇒ BASIC認証を要求
みたいにしたいときは、 .htaccess または httpd.conf を以下のように設定する。

AuthUserFile /home/username/.htpasswd
AuthName tonopedia
AuthType Basic
require valid-user
Satisfy any # これが肝
order deny,allow
deny from all
allow from 192.168.1. # 認証を求めないIPの範囲
allow from 192.168.2. # 認証を求めないIPの範囲(このように複数記述可能)
posted by dev-man at 23:13| Comment(0) | TrackBack(0) | Apache | このブログの読者になる | 更新情報をチェックする

2009年06月02日

[MySQL] 利用可能な最少の(空きの)IDを取得する

MySQLで一意のIDを使用するにはauto_incrementを使えば通常問題ないのですが、レコードを削除した場合、IDが一つ空いた状態になります。 通常はそれで問題ありませんが。

場合によっては、空いたIDを優先的に使用したい場合もあります。調べてみたところ、MySQLはそのような機構を提供していないので、以下のSQLで求めることにしました。

# 最も小さい利用可能なIDを探す

select min(t_getnewid.inc_id) newid from 
(
	select t_orig.myid, t_inc.inc_id from

	# オリジナルの表
	(
		select (IDフィールドの名前) myid from (テーブル名)
	) t_orig

	# インクリメントした表を外部結合
	right join
	(
		select 1 inc_id union # IDの最小値が1の場合
		select (IDフィールドの名前) + 1 inc_id from (テーブル名)
	) t_inc
	on t_orig.myid = t_inc.inc_id

) t_getnewid
where t_getnewid.myid is null
posted by dev-man at 09:49| Comment(0) | TrackBack(0) | MySQL | このブログの読者になる | 更新情報をチェックする

2009年04月22日

[Perl] 2つの配列の積集合、和集合、差集合を得る

Perlは問題点の多い言語と言われますが、やはり実用性は本当に高いな、と思う今日このごろ。大きなプログラムを書いても遅くならないし。

さて、2つの配列の積集合(共通する要素)、和集合(いずれか一方または両方に含まれる要素)、差集合(一方にのみ含まれる要素)を求めるには、List::Compare が便利みたいなので試してみた。

#!/usr/bin/perl

use List::Compare;

# 比較する二つの配列
my @list1 = ('a', 'b', 'c');
my @list2 = ('b', 'c', 'd');

my $lc = List::Compare->new(\@list1, \@list2);

# 積集合 (@list1, @list2 両方の配列に含まれる要素)
my @intersection = $lc->get_intersection;
print "@intersection \n";
 # prints b c

# 和集合(@list1, @list2 のすべての要素から重複を取り除いたもの)
my @union = $lc->get_union;
print "@union \n";
 # prints a b c d

# 差集合 (@list1にのみ含まれる要素)
my @list1only = $lc->get_Lonly;
print "@list1only \n";
 # prints a

# 差集合 (@list2にのみ含まれる要素)
my @list2only = $lc->get_Ronly;
print "@list2only \n";
 # prints d

より詳しくは: http://search.cpan.org/dist/List-Compare/lib/List/Compare.pm

差集合だけで良い場合は Array::Diffでも良いみたい。

posted by dev-man at 00:48| Comment(0) | TrackBack(0) | Perl | このブログの読者になる | 更新情報をチェックする

2009年02月14日

ノートパソコンが快適になった

普段使用している Lenovo Thinkpad X61 、なんだか色々と問題を抱えていた。

ところが、Service Pack 3 を適用し、さらにウィルス対策ソフトを Kaspersky から Avast! に乗り換えたら、これらの問題が解決した。

解決した問題:

  • ローカルでのWeb開発 (Apache + MySQL, XAMPP使用) がとても重かったのが解決。これは多分 Kaspersky から Avast に乗り換えたから。
  • 外部ディスプレイを接続し、その後接続を解除するともれなくブルースクリーンが出現していた問題が解決。ドライバの問題?
  • スピーカーから片方しか音が出ていなかったのが解決。これもドライバの問題?
posted by dev-man at 15:36| Comment(0) | TrackBack(0) | Windows | このブログの読者になる | 更新情報をチェックする

2009年01月20日

[Windows] カレントディレクトリをバッチファイルのあるディレクトリに移動

どこから実行しても,バッチファイルのあるディレクトリをカレントディレクトリにしたい場合.

batファイルの先頭に

cd /d %~dp0
を書く.

posted by dev-man at 18:55| Comment(0) | TrackBack(0) | Windows | このブログの読者になる | 更新情報をチェックする

2009年01月06日

[LaTeX] include しているファイルを全て1つのtexファイルにまとめる

  • \include{〜}で挿入されたファイルを実際に読み込み、1つのファイルにまとめる。
  • まとめたファイルは標準出力ないし新規ファイルに書き出す。
  • ソースはこちら (Perl スクリプトです)

使い方

標準出力に出力する場合

% perl matometex.pl main.tex
または
% ./matometex.pl main.tex

別ファイルに出力する場合

% perl matometex.pl main.tex output.tex
または
% ./matometex.pl main.tex output.tex

matometex.pl

#!/usr/bin/perl

my $infile = $ARGV[0];
my $outfile = "";

if (defined($ARGV[1])) {
	$outfile = $ARGV[1];
}	


open IN, $infile;

if ($outfile ne "") {
	open OUT, ">" . $outfile;
}

while (<IN>) {
	$_ =~ s/[\r,\n]//g;
	$_ =~ s/\\input\{(.+)\}/&file2str($1)/ge;
	if ($outfile ne "") {
		print OUT $_ . "\n";
	} else {
		print $_ . "\n";
	}
}

close IN;

if ($outfile ne "") {
	close OUT;
}

exit;

sub file2str {
	my $file = $_[0];
	open FILE, $file;
	my $str = "";
	while (<FILE>) {
		$_ =~ s/[\r,\n]//g;
		$str .= $_ . "\n";
	}
	return $str;
}
posted by dev-man at 18:06| Comment(0) | TrackBack(0) | LaTeX | このブログの読者になる | 更新情報をチェックする