2013年10月30日水曜日

Linux上でH2 Databaseが起動しない

概要

Linux上でH2 Databaseが起動しない
理由はホスト名が/etc/hostsに記述されていないためエラーが発生

詳細

実行

/h2-1.3.173.jar org.h2.tools.Server

エラー内容

Exception in thread "main" org.h2.jdbc.JdbcSQLException: 入出力例外: "java.net.UnknownHostException:
 XXXXXXX.local: XXXXXXX.local: 名前またはサービスが不明です"
IO Exception: "java.net.UnknownHostException: XXXXXXX.local: XXXXXXX.local: 名前またはサービスが不明です" [90028-173]
 at org.h2.message.DbException.getJdbcSQLException(DbException.java:331)
 at org.h2.message.DbException.get(DbException.java:160)
 at org.h2.message.DbException.convert(DbException.java:275)
 at org.h2.util.NetUtils.getLocalAddress(NetUtils.java:263)
 at org.h2.server.web.WebServer.updateURL(WebServer.java:328)
 at org.h2.server.web.WebServer.init(WebServer.java:317)
 at org.h2.tools.Server.<init>(Server.java:51)
 at org.h2.tools.Server.createWebServer(Server.java:413)
 at org.h2.tools.Server.runTool(Server.java:306)
 at org.h2.tools.Server.main(Server.java:117)
Caused by: java.net.UnknownHostException: XXXXXXX.local: XXXXXXX.local: 名前またはサービスが不明です
 at java.net.InetAddress.getLocalHost(InetAddress.java:1466)
 at org.h2.util.NetUtils.getLocalAddress(NetUtils.java:261)
 ... 6 more
Caused by: java.net.UnknownHostException: XXXXXXX.local: 名前またはサービスが不明です
 at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method)
 at java.net.InetAddress$1.lookupAllHostAddr(InetAddress.java:894)
 at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1286)
 at java.net.InetAddress.getLocalHost(InetAddress.java:1462)
 ... 7 more

解決方法

/etc/hostsに記述することで解決

hostsの確認

$ hostname
XXXXXXX.local
$ cat /etc/hosts
127.0.0.1 localhost

hostsの修正

$ vi /etc/hosts
127.0.0.1  XXXXXXX.local localhost

2013年10月24日木曜日

フォルダ配下のファイル名を作成日時順に連番を付ける

関数


# ------------------------------------------------------------------
# フォルダ配下のファイル名を作成日時順に連番を付ける
# 関数名:AddNumber-FileNameByCreationTime
# 引数  :FolderPath 対象フォルダ
# :Include 対象拡張子
# :AddType 連番指定[接頭or接尾] (※接頭の場合は「Prefix」、接尾の場合は「Suffix」を指定)
# :NumberFormat 0埋め桁数 (※3桁の場合「000」と桁数分0を指定)
# 戻り値:なし
# ------------------------------------------------------------------
function AddNumber-FileNameByCreationTime([String]$FolderPath,[String]$Include,[String]$AddType="Prefix",[String]$NumberFormat="0"){
$count = 0;
Get-ChildItem $FolderPath -Recurse -Include $Include | Sort-Object {$_.CreationTime -as [DateTime]} |
ForEach-Object {
# 接頭に連番追加
if("Prefix" -eq $AddType){
$Name =$_.Name
Rename-Item $_.FullName -newName ("{0:$NumberFormat}_$Name" -F $count++)
}
# 接尾に連番追加
elseif("Suffix" -eq $AddType){
$BaseName =$_.BaseName
$Extension =$_.Extension
Rename-Item $_.FullName -newName (("$BaseName"+ "_" + "{0:$NumberFormat}$Extension") -F $count++)
}
}
}

メモ

DateTime型をソートする場合、キャスト(変換)しないといけない
Sort-Object {$_.CreationTime -as [DateTime]} 

2013年10月22日火曜日

配列から重複を削除

概要

HashSetを使用して配列の値を一意にする。
プリミティブ型の場合、そのまま使えないのでオブジェクトにラップして一意にする。

メソッド


import java.util.Arrays;
import java.util.HashSet;
/**
*
* @author ao-zkn
*/
public class RemoveArraysDuplicate {
/**
* String型の配列から重複した値を削除する
*
* @param arrays 配列
* @return 重複を削除した配列
*/
private static String[] removeStringArraysDuplicate(String[] arrays) {
if (arrays == null || arrays.length == 0) {
return arrays;
}
// 重複削除
HashSet<String> hashSet = new HashSet<>();
hashSet.addAll(Arrays.asList(arrays));
return hashSet.toArray(new String[0]);
}
/**
* int型の配列から重複した値を削除する
*
* @param arrays 配列
* @return 重複を削除した配列
*/
private static int[] removeIntArraysDuplicate(int[] arrays) {
if (arrays.length == 0) {
return arrays;
}
// 重複削除(オブジェクトにラップ)
HashSet<Integer> hashSet = new HashSet<>();
for (Integer i : arrays) {
hashSet.add(i);
}
// プリミティブ型に変換
Integer[] integers = hashSet.toArray(new Integer[0]);
int[] array = new int[integers.length];
for (int i = 0; i < array.length; i++) {
array[i] = integers[i];
}
return array;
}
public static void main(String[] args) {
String[] s = {"a", "b", "c", "d", "a", "c", "d"};
System.out.println(Arrays.toString(removeStringArraysDuplicate(s)));
int[] i = {1, 2, 3, 4, 5, 1, 3, 5, 9};
System.out.println(Arrays.toString(removeIntArraysDuplicate(i)));
}
}

2013年10月14日月曜日

2つのCSVファイルから項目に一致した行を出力

概要

2つのCSVファイル(顧客マスタ、商品マスタ)から、顧客マスタに商品マスタ.商品コードが存在するものをPowerShellを使ってCSV出力する

メモ

CSVファイル

■商品マスタ(items.csv)

ITEM_ID,ITEM_NAME
10000,AAAAAA
10001,BBBBBB
10002,CCCCCC
・・・・
・・・・
■顧客マスタ(customers.csv)
CUSTOMER_ID,ITEM_ID,CUSTOMER_NAME,QUANTITY
8000,10000,aaaaa,100
8000,10002,bbbbb,50
8001,10005,ccccc,1000
・・・・
・・・・

SQL文だと以下のような感じ

■SQL

SELECT CUSTOMERS.* FROM CUSTOMERS, ITEMS 
WHERE CUSTOMERS.ITEM_ID = ITEMS.ITEM_ID

PowerShell その1

$result = Import-Csv c:\items.csv | Select-Object ITEM_ID 
Import-Csv c:\customers.csv | Where-Object {$result -match $_.ITEM_ID} | Export-Csv c:\output.csv -NoType
customers.csvが10万件、items.csvが1万件で約数十分ぐらいかかる(※スペックによるがとにかく遅い!!)

PowerShell その2

その1の場合、シンプルだが遅いので
items.csvをHashTableにセット(ITEM_IDに重複がないこと)する方法で解決した(約20秒ぐらいで終わる)

$hash = @{}
Import-Csv c:\items.csv | ForEach-Object {$hash.Add($_.ITEM_ID, $_)}
Import-Csv c:\customers.csv | ForEach-Object {if($hash.Get_Item($_.ITEM_ID)){$_}} | Export-Csv c:\output.csv -NoType

2013年10月6日日曜日

音楽ファイルのタグ情報を取得する

概要

フォルダ配下の音楽ファイルのタグ情報を取得する。

・タグ情報を取得するため「taglib-sharp.dll」を使用する。
以下のサイトより取得後、任意の場所に解凍する。
http://download.banshee.fm/taglib-sharp/2.1.0.0/
ファイル名:taglib-sharp-2.1.0.0-windows.zip

関数


# 任意に解凍したtaglib-sharp.dllを指定する
Remove-Variable -Name TagLibFilePath -Force -ea silentlycontinue
Set-Variable -Name TagLibFilePath -Value "C:\develop\lib\taglib-sharp.dll" -Option ReadOnly -Scope "Global"
# ------------------------------------------------------------------
# 音楽ファイル(m4a,flac,mp3)よりタグ情報を取得する
# 関数名:Get-MusicTagData
# 引数 :MusicFolderPath フォルダパス
# 戻り値:タグ情報
# ------------------------------------------------------------------
function Get-MusicTagData([String]$MusicFolderPath){
# ライブラリ読み込み
$TagLib = [System.Reflection.Assembly]::LoadFile($TagLibFilePath)
$result = @()
# フォルダ配下のm4a,flac,mp3を取得
Get-ChildItem $MusicFolderPath -Recurse -Include *.m4a ,*.flac,*.mp3 |
ForEach-Object {
$audiofile = [TagLib.File]::Create($_.fullname)
# タグ情報をセット
$value = New-Object PSCustomObject -Property @{
#ファイル名
FILENAME = $_.name
#アルバム
Album = $audiofile.Tag.Album
#アルバムアーティスト
AlbumArtists = $audiofile.Tag.AlbumArtists
#年
Year = $audiofile.Tag.Year
#タイトル
Title = $audiofile.Tag.Title
#アーティスト
Artists = $audiofile.Tag.Artists
#作曲者
Composers = $audiofile.Tag.Composers
#ジャンル
Genres = $audiofile.Tag.Genres
#トラック番号
Track = [String]$audiofile.Tag.Track + "/" + [String]$audiofile.Tag.TrackCount
#ディスク番号
Disc = [String]$audiofile.Tag.Disc + "/" + [String]$audiofile.Tag.DiscCount
#コメント
Comment = $audiofile.Tag.Comment
}
$result += $value
}
return $result
}

実行例

 Get-MusicTagData -MusicFolderPath "C:\develop\flac\MR.BIG\Big, Bigger, Biggest"

メモ

タグ情報/プロパティ情報をすべて取得(※taglib-sharp.dllから取得できるすべて)

$TagLib = "C:\develop\lib\taglib-sharp.dll"
# ライブラリ読み込み
[System.Reflection.Assembly]::LoadFile($TagLib)
# タグ情報を取得するファイル名を指定
$audiofile = [TagLib.File]::Create("C:\develop\flac\MR.BIG\Big, Bigger, Biggest\01 Addicted to that rush.flac")
# タグ情報を取得
$audiofile.Tag
# プロパティ情報を取得
$audiofile.Properties