Java DateFormat

Java DateFormat

多国籍企業で全世界で動くシステムがある。
日本主導のシステムだが、日付フォーマットを各国のフォーマットに対応させている。
日本ではyyyy/MM/dd、アメリカではMMM d, yyyy、フランスではd MMM yyyy。
Webシステムで、日付はカレンダーから選択する。
OracleにインサートするときはCHAR(10)に対してYYYY/MM/DDで登録する。

こういう感じでYYYY/MM/DD形式の日付に変換してみた。

1
2
3
4
5
6
7
java.lang.String requestDate = request.getParameter("requestDate");
java.util.Locale locale = request.getLocale();

java.text.SimpleDateFormat formatYmd = new java.text.SimpleDateFormat("yyyy/MM/dd");
java.text.DateFormat formatLocal = java.text.DateFormat.getDateInstance(2, locale);

String requestDateYmd = formatYmd.format(formatLocal.parse(requestDate));

OracleのカラムをDATEで定義すると、今度はタイムゾーンの問題が発生する。
これはまた後日。

同じタグの記事
同じカテゴリの記事

pythonでソート

pythonでソート

リストをソートしたい

条件がシンプルな場合は、リストをそのままソートしてしまえばよい。

1
2
3
olist = [5, 3, 1, 2, 4]
olist.sort()
print(olist)

単純なリストであれば、破壊的にソートしてもよいと思うが、
リストを分けたいときはsortedを呼び出す。

1
2
3
olist = [5, 3, 1, 2, 4]
slist = sorted(olist)
print(slist)

タプルのリストをソートしたい

リストにタプルを詰めて、タプルの何番目かの情報でソートしたい。

1
2
3
olist = [('a', 5), ('c', 3), ('e', 1), ('d', 2), ('b', 4)]
slist = sorted(olist, key = lambda x : x[1])
print(slist)

この例では、タプルの2番目(配列の添字は1)の項目を基準にソートしている。

クラスのリストをソートしたい

リストにクラスを詰めて、クラスのプロパティでソートしたい。

1
2
3
4
5
6
7
8
9
10
11
12
class Dto:
    def __init__(self, id, name):
        self.id = id
        self.name = name
    def __repr__(self):
        return '[{0}:{1}]'.format(self.id, self.name)

olist = [
    Dto(5, 'a'), Dto(3, 'c'), Dto(1, 'e'), Dto(2, 'd'), Dto(4, 'b')
]
slist = sorted(olist, key = lambda x : x.name)
print(slist)

この例では、クラスのnameプロパティでソートしている。

文字列として格納した数値のリストを数値としてソートしたい

1
2
3
olist = ['1', '11', '111', '2', '22', '3', '33']
slist = sorted(olist, key = lambda x : int(x))
print(slist)

ソートのキーのみ数値として認識させているので、ソート結果の内容は文字列のままになっている。

逆順ソート

1
2
3
4
5
6
olist = [5, 3, 1, 2, 4]
slist = sorted(olist, reverse = True)
print(slist)
print(olist)
olist.sort(reverse = True)
print(olist)

reverse引数にTrueを指定すると逆順ソートが可能になる。

ソートではないが、リストのフィルタリングを行いたい

偶数のみ抽出

1
2
3
olist = [5, 3, 1, 2, 4]
flist = list(filter(lambda x : x % 2 == 0, olist))
print(flist)
1
2
3
olist = [('a', 5), ('c', 3), ('e', 1), ('d', 2), ('b', 4)]
slist = list(filter(lambda x : x[1] % 2 == 0, olist))
print(slist)
1
2
3
4
5
6
7
8
9
10
11
12
class Dto:
    def __init__(self, id, name):
        self.id = id
        self.name = name
    def __repr__(self):
        return '[{0}:{1}]'.format(self.id, self.name)

olist = [
    Dto(5, 'a'), Dto(3, 'c'), Dto(1, 'e'), Dto(2, 'd'), Dto(4, 'b')
]
slist = list(filter(lambda x : x.id % 2 == 0, olist))
print(slist)

まとめ

ソートは出力時に是非行いたい。
フィルターは、リストやマップに入れる前に条件を付ければよい気がする。

同じタグの記事
同じカテゴリの記事

pythonクラスの__str__と__repr__

pythonクラスの__str__と__repr__

クラスを作成したら__str__と__repr__を実装する。
__str__はstr()で呼び出した時や、print()で呼び出した時に実行される。人間にとって読みやすいようにフォーマットする。

__repr__はrepr()で呼び出した時や、インタラクティブなシェルでインスタンス名を入力したときに実行される。eval()で再利用可能な形式でフォーマットする。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class MyClass:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def __str__(self):
        return '[{0}({1})]'.format(self.name, self.age)
    def __repr__(self):
        return "MyClass('{0}','{1}')".format(self.name, self.age)

user01 = MyClass('John Doe', 35)
print(user01)
str(user01)
repr(user01)
user01

これで、

1
2
3
4
[John Doe(35)]
[John Doe(35)]
MyClass('John Doe','35')
MyClass('John Doe','35')

と出力される。
repr()が実装されているので、evalを呼び出すこともできる。

1
2
user02 = eval(repr(user01))
print(user02)

ちなみに、__str__と__repr__を実装しないとprintしたときに

1
<MyClass object at 0x03C01310>

のように出力される。

デバッグのしやすさから考えると、どちらも実装しておいた方が良い。

同じタグの記事
同じカテゴリの記事

散歩

ブロッコリー。一度収穫した後?

小田急線。先頭車両が木に掛かってしまった。残念。

用水路に鴨?

椿?

公園の池にも鴨。

波紋が美しい。

同じタグの記事
同じカテゴリの記事

神社の落ち葉

季節感がある。

御神木と空。快晴。

同じタグの記事
同じカテゴリの記事

標準出力と標準エラー出力のリダイレクト

標準出力と標準エラー出力のリダイレクト

適当に作ったチェックプログラムがある。
cronで日々実行している。
標準出力や標準エラー出力が放置されているので、cronがメールを送ってくれる。
でも、不要なので標準出力と標準エラー出力は適当なファイルにリダイレクトしておいて、
何かの機会に確認する。

最新版の出力だけを保存する場合。

1
command &> file

追記したい場合。

1
command &>> file

追記は古いシステムでは、この記法は使えないため下記の昔ながらの記法を利用する。

1
command >> file 2>&1

これで、cronのメールが止まった。
cronのメールそのものを止めてもいいけど、このメールを頼りにしている人もいるかもしれないので。

同じタグの記事
同じカテゴリの記事

Oracleのjdbc connectionが

Oracleのjdbc.connectionが

1週間で、50回程度呼び出されたJavaバッチで
「IOエラー: Connection reset」が2度発生した。
最初は、不調なOracleと脆弱なネットワーク環境を疑ったが、
他のバッチでエラーが発生していないので、ネットで検索してみた。

Linuxの乱数のとり方に問題があるためらしい。
接続に時間がかかることもあるようだ。

Oracleのjdbcドライバが/dev/randomを利用していることが原因との事。
乱数の取り方を変える方法はjavaオプションを指定する。

1
java -Djava.security.egd=/dev/urandom program.Program

これで、java.sql.SQLRecoverableException: IOエラー: Connection resetを抑制できる(はず)。

同じタグの記事
同じカテゴリの記事

スタートメニューにマイプログラム

スタートメニューにマイプログラムを追加する

仕事でWindows10を使うことになった。
普段使うソフトは、スタートメニューの検索機能を使っって立ち上げたい。
macOSのSpotlightを使う感覚で。
インストーラーでインストールしたプログラムは、検索できるが、zipを解凍して配備したプログラムなどは、WindowsSearchを経由して、検索できなくはないが、リストの下の方に表示されてしまう。
一番上に表示されるように、アプリケーションとして認識されるよう、スタートメニューに追加する。

Windows7の時は「スタートメニュー」の「すべてのプログラム」を右クリックして「開く」を選択し、使いたいアプリケーションのショートカットを登録しておいた。
Windows10では「スタートメニュー」を右クリックしても、それらしいところが開かない。

設定方法

エクスプローラーで下記のパスをたどる。

パスを直接入力するのであれば

C:\Users\ユーザ名\AppData\Roming\Microsoft\Winows\Start Menu\Programs

パスをマウスでたどるのであれば

C > ユーザ > AppData > Roaming > Microsoft > Windows > スタートメニュー > プログラム

ここにファイルを置くと、スタートメニューに追加される。
これでコルタナさんが高速に検索してくれる。

なお、このディレクトリは隠し属性がついているそうなので、すべてのファイルを表示する設定になっていないとたどり着けないらしい。

同じタグの記事
  • ありません。
同じカテゴリの記事

vue.jsでテンプレートが一瞬表示されてしまう

vue.jsでテンプレートが一瞬表示されてしまう

vue.jsを使って管理ツールや監視ツールを作っていたが、ページを開いたときに一瞬Mustacheテンプレートが表示されていた。
今までは特に気にしていなかったが、なんとなく気になってしまったら、気になって仕方がない。
これを抑制したい。

スタイルシートに、

1
2
3
[v-cloak] {
    display: none;
}

テンプレートを隠したいタグに、

1
2
3
<div v-cloak>
    {{ message }}
</div>

これで、

<div>が表示されなくなる。
ちなみに、これはVue.jsドキュメントのディレクティブのところに書かれていた。
もっと早く気がつけばよかった。
もう一度、ドキュメントを頭から眺めてみたい。

同じタグの記事
同じカテゴリの記事