unix/linux:決められた時刻に処理を実行する(ワンライナー編)

unix/linuxの便利コマンドの紹介です。


テストや補正作業を行う際、決められた時刻に決められたコマンドを実行したい場合があります。
unix/linuxでは、atコマンドを使用することで、決められた時刻に決められたコマンドを自動的に実行するように登録することができます。

しかし、atコマンドを通常の使い方をする場合、対話式にコマンドを入力したりコマンドを記載したファイルを別途用意したりする必要があり、オペレータに作業を依頼したりシェルスクリプトに組み込んだりする場合に都合が悪い場合があります。
そこで、下記のようにプロセス置換(コマンドをファイルに見立てる記法)を用いることで、対話式のコマンド入力やファイルの用意をする必要がなくなります。

・20:00に/home/hoge/test.txt(空ファイル)を作成するように登録する例

#> at 20:00 -f <(touch /home/hoge/test.txt)


OSのバージョンやatコマンドの設定によっては、atコマンドを使用できない場合もあります。
その場合は、下記のようにループ処理とバックグラウンドを併用することで、atコマンドと同じようなことを実現できます。

・20:00に/home/hoge/test.txt(空ファイル)を作成するように登録する例

#> (TIME=date "+%H%M"; while[${TIME} -lt 2000]; do sleep 60; TIME=date “+%H%M”; done; touch /home/hoge/test.txt) &


いかがでしたでしょうか。

unix/linuxのコマンドを使いこなせるようになると、できる作業の幅が広がります。
今回紹介したコマンドも、使う機会が少なくないのではと思います。

これからも、便利コマンドを紹介していきたいと思います!

java:イミュータブルなクラスを作る方法

「イミュータブル」とは「不変」という意味で、オブジェクト指向の世界では「状態(クラス変数)がオブジェクト生成時から変更されないこと」を指します。
有名所では、Stringがイミュータブルなクラスとして知られています。

イミュータブルなクラスを自作するためには、以下の条件を満たすようにクラスを作成する必要があります。

①クラス変数はprivateで定義する

クラス変数が外のクラスから直接書き換えられるのを防ぐため

②setterメソッドを定義しない

クラス変数を書き換えるメソッドは定義しない

③クラスをfinalで定義する

サブクラスでクラス変数を書き換えられるのを防ぐため

④ミュータブルなオブジェクトへの参照を含んでいない

ミュータブルなオブジェクトを変更する処理を記述しないようにするため

クラスをイミュータブルにするメリットとしては、内部の状態の変化を気にする必要が無くなるために処理を追いやすくなるというのがあります。
関数型プログラミングにも通じる考え方なのですが、オブジェクト生成より後で内部の状態が書き変わることがないため、クラスのメソッドが返す値が一定となり、内部の状態の変化を気にしながらトレースする必要がなくなります。
また、
hoge2 = hoge1;
のようなオブジェクトのアドレスのコピーが使いやすくなります。
イミュータブルではないクラスでこのコピー方法を用いると、hoge2の状態の変化がhoge1にも影響してしまい(hoge1とhoge2で同じアドレスを指しているため)、思わぬ影響が出ることがあります。
しかし、イミュータブルなクラスであれば、状態を変化させようと思えば新たにオブジェクトを作り直して新たなメモリ領域を確保しなければならないので、hoge2の状態を変化させても(オブジェクトを作り直しても)hoge1へ影響するのを防ぐことができます。
イミュータブルではないクラスでも、オブジェクトの中身全体をコピーすれば思わぬ影響を防ぐことはできるのですが、オブジェクトのアドレスをコピーする場合と比べてメモリ使用量が増え処理も遅くなります。

以下で、イミュータブルなクラスを定義してそれを使用するサンプルコードを示します。

【サンプルコード】

・ImmutableCalc.java

・ImmutableTestMain.java

【実行結果】


いかがでしたでしょうか。

オブジェクトの内部の状態を意識する手法には多くの技術者が慣れ親しんでいると思いますし、オブジェクトのアドレスのコピーも便利ですが、それが思わぬ影響を及ぼすこともあります。
思わぬ影響を防ぐために、イミュータブルなクラスを作成する手法は覚えておいて損はないでしょう。

これからも役に立つ情報を発信していきたいと思います!