2013年4月7日日曜日

スタンドアローンで動作する祝日判定スクリプト

タイトルどおりなんですが、仕事で必要なので作ってみました。(ついでに社内のレポートもあったので)。
でも、最近仕事が忙しくて、悲しいかな業務時間に作業してないので、せっかくなのでブログにも置いときます。
社内のレポートは業務時間を使ってもいいことになっているので、有難い制度なんですけどねー。

やりたいこと


日本の祝日を判定したい

1.元データ


スタンドアローンということで、何らかの元データをローカルに保持しないといかんわけで、今回はGoogle カレンダーのAPIを利用しました。

今回利用したXMLリクエスト


http://www.google.com/calendar/feeds/outid3el0qkcrsuf89fltf7a4qbacgt9@import.calendar.google.com/public/full-noattendees?start-min=2013-01-01&start-max=2013-12-31

リクエストパラメータの意味


詳細は、Google Calendar API v2 Atom Referenceを。























outid3el0qkcrsuf89fltf7a4qbacgt9@import.calendar.google.com比較的信頼度が高いとされる、mozillaプロジェクトの祝日一覧(mozzila Calendar Project)
 full-noattendees full版からgg:whoを抜いたもの(今回は不要なので)
 start-min=2013-01-01 期間の始まり
start-max=2014-01-31 期間の終わり

2.実際のコード


[python]
#!/usr/bin/env python

from xml.dom.minidom import parse
import sys
import re

def get_parse(fileName):
try:
obj = parse(fileName)
except IOError:
obj = 0

return obj

def get_arg2(arg2):
pattern = re.compile("^\d{4}-\d{2}-\d{2}$")
matched = pattern.search(arg2)

if matched:
argDate = arg2
else:
argDate = 0

return argDate


def main():
fileName=sys.argv[1]
obj = get_parse(fileName)

if obj == 0:
print "file not found"
return 1

argDate = get_arg2(sys.argv[2])

if argDate == 0:
print "argument is unjust. ex)2013-01-01"
return 1

obj_list = obj.getElementsByTagName("gd:when")

for i in obj_list:
if argDate == i.getAttribute("startTime"):
return 0

print "unmatch holiday"
return 2


if __name__=='__main__':
sys.exit(main())
[/python]

3.ざっくり仕様



  • 第一引数に元xmlのファイルパス

  • 第二引数に確認したい日付をyyyy-MM-ddにて渡す

  • 祝日であれば、0、祝日でない場合は2、その他のエラーは1を返す


4.動作イメージ


[bash]
shase$ ./holidayCheck.py japanHoriday.xml 2013-10-15
unmatch holiday
shase$ ./holidayCheck.py japanHoriday.xml 2013-05-05
shase$ echo $?
0
[/bash]

2013年3月26日火曜日

Linuxでのhostsの反映

前に、macでのhostsの変更の反映メモを書いたけど、Linuxでも似たような話があるので、メモ代わりに。


Linuxはリゾルバキャッシュがありましぇーん、とかよく(古い)記事とかであったりしますが、最近のディストロだとだいたい、nscdっていうネームサービスキャッシュデーモンたんが動いており、時々、hostsやらpasswdやらの変更が反映されないみたいな悪さをしてくれやがります。(LDAP関連のトラブルでもよくでてくるんじゃないかな?)

余談だけど、最近のFreeBSDでも動いてるらしい(余談おわり)。

詳細は「man nscd」してもらえればいいんですが、とりあえずhostsのキャッシュをクリアしたいとき(nscdの再起動:nscd restartでもいけるけど)。

/usr/sbin/nscd -i hosts

とかすればおk

2013年3月24日日曜日

macでipfwを使って特定ホストに対する通信を止めたい

環境はMacOS X Lion


ipfwのチートシート


  • sudo ipfw list
    • ルールの表示
  • sudo ipfw delete "number"
    • ルールの削除
  • sudo ipfw add "rule"
    • ルールの追加"rule"のところはmanでもみてくれ
  • sudo ipfw show 
    • ルールとパケットの表示
  • sudo ipfw -f flush
    • 既存の設定のflush

で、特定ホストに対する通信のblock


denyのところに止めたい宛先アドレスを入れよう
以下、設定シェルの例

#!/bin/sh
ipfwcmd="ipfw"
add="$ipfwcmd -q add"
# flush old rules
$ipfwcmd -f flush
$add deny tcp from me to xxx.xxx.xxx.xxx
$add deny icmp from me to xxx.xxx.xxx.xxx

細かいルールはmanでも見てね(・ω<)

2013年3月23日土曜日

2013年2月16日土曜日

mavenプロジェクトでのjvmのバージョン指定してるトコ

mavenのサイトに書いてるけど。

http://maven.apache.org/plugins/maven-compiler-plugin/examples/set-compiler-source-and-target.html
maven-compiler-pluginのトコで指定だってさ。下の例はjdk1.4を指定してる様子。
[xml]

[...]

[...]


org.apache.maven.plugins
maven-compiler-plugin
3.0

1.4
1.4



[...]

[...]

[/xml]

2013年1月1日火曜日

2012年を振り返りつつ、2013年を考える

最初、2012年のまとめを書こうかと思っていたんですが、2012年は個人的に激動すぎて、ちょっと今の段階で振り返って、それをまとめることが難しいという結論になりました。

外部環境の動きによって、もたらされた自分の変化。

自分から能動的に動いた結果の自分の変化。

それぞれあるのですが、どれも今の段階でどうだったのか、評価を下すには早すぎると感じました。2〜3年して振り返った時に、2012年の評価ができるんじゃないかな、と思っています。

個別の事項についての、KPTはできるんですけどね。

というわけで、2013年の豊富を。

仕事の面で。

世の中の動きがどうなるかわかりませんが、Web系のエンジニアとしてやっていこうという気持ちに変わりはありません。今年選択した道を深化させて行きたいと思います。(Web以外のインターネット産業が勃興した場合はその限りではありませんw)

2011年の今頃は、モヤモヤしていたのですが、2012年は個人的な決断を行ったので、今は雑念も少なく、仕事に取り組むことができています。

多くの人にご迷惑をかけました。働くようになって、今年ほど自分の無力を感じたことはありませんでした。スキル的なところもそうですし、人間的なところもそうです。

スキル的なところは、一朝一夕にどうしようもないので、積み上げをしていくしかありません。そのスピードは上げていく必要がありますが。

人間的なところは逆にすぐできることも多くあります。同じ失敗だけはしないようにしたいと思います。今年はそこで、大きな失敗をしました。IT業界ではよくある話ですが、よくある話しとして済ませてはいけないと個人的には考えています。

抽象的なことばかり書いてもあれなので、1つだけ今年記憶に残ったエピソードを書きます。

弊社では、運用と開発に役割が分かれているわけではなく、エンジニア職は基本的に両方をこなします。

今年は3ヶ月ぐらい、実際のサービス運用から離れていた時期がありました。ニートしていたとかではなく、仕事で別のミッションがあったからなのですが。

その後、またとあるサービスの開発&運用をやることになったのですが、運用の感覚みたいなものが欠落していることに気が付きました。

具体的に言うと、リソースのモニタリングにおける気づき、であったり、何かのオペレーション時のリスク(事前察知?)に疎くなっていたり、等。

このあたり、日々の筋トレに近いものがあるのかもしれません。やらなくなると、徐々に衰える。

よくよく考えてみると、仕事って現場から離れると現場感覚が無くなんて、よく言われる話。ただ、それを如実に実感したのは初めてでした。

2012年11月30日金曜日

dateコマンドで現在時刻をミリ秒まで出力(UnixTimeで)

環境はLinuxで。
今どきのdateコマンドは%Nでナノ秒まで出るっぽい。
なのでそれを割ってやる。
$ echo $(printf '%ld' $(expr `date +%s%N` / 1000000))
$ 1354169981849
追記
--dateつけると任意の日時を出力できるよ。
$ echo $(printf '%ld' $(expr `date +%s%N --date "2000-11-11 12:00"` / 1000000))

2012年11月16日金曜日

【EffectiveJava輪講】5.ジェネリックス

※社内の輪講用メモ。まだ途中。

翻訳が、「ジェネリクス」ではなく、「ジェネリックス」なので、表記を合わせています。

p.n表記は、EffectiveJavaのページ番号です。

前史(ジェネリックス以前)


コレクションから読みだしたすべてのオブジェクトをキャストしていた。(挿入する型を間違えるとキャスト失敗)

現在(ジェネリックス時代)


個々のコレクションに許される型をコンパイラに伝え、コンパイラは自動的にキャストを挿入。誤った型を挿入しようとすると、コンパイル時に判明。

ジェネリックスを理解するために。変性の話。


(この辺参考URLから)























変位意味Javaでの例
共変広い型から狭い型へA<P>はA<C>のスーパータイプ
反変狭い型から広い型へ A<P>はA<C>のサブタイプ
非変型を変換できないことA<P>とA<C>の型に関係はない

Javaではすべてのジェネリック型は非変(ジェネリック型変数の変位指定はできない)。

不変であるということは、List<Object>のパラメータに、List<String>を渡すことができない。

 

No. 23 新たなコードで原型を使用しない


Javaのジェネリック対応は、過去バージョンとの互換性の維持が前提となっているため、犠牲にしている部分がある。

  • 原型(Raw Type)が使用できること

  • 変位指定ができない


要素型が不明な場合、原型を使用すると下記のように書いてしまうのはよくない(p.110)

[java]
static int numElementsInCommon(Set s1, Set s2) {
int result = 0;
for (Object o1 : s1)
if (s2.contains(o1))
result++;
return result;
}
[/java]

非境界ワイルドカード型で書きなおすと(p.111)

[java]
static int numElementsInCommon(Set s1, Set s2) {
int result = 0;
for (Object o1 : s1)
if (s2.contains(o1))
result++;
return result;
}
[/java]

  • 非境界とは?


    • 上限や下限がないこと。



原型を使用しない、の例外2つ

クラスリテラルでは原型を使用しないといけない(非境界ワイルドカード型だったらOK)

instanceofつかうとき
[java]
if ( o instanceof Set ) {
Set m = (Set) o; //Setでキャストする必要がある
}
[/java]

No. 24 無検査警告を取り除く


省略

No. 25 配列よりリストを選ぶ


なぜ配列よりリストを選ぶべきなのか?
配列は実行時の型安全は提供するが、コンパイル時の型安全は提供しない


  • 配列の特徴


    • 共変である

    • 具象化されている




配列よりリストを選ぶ例(p.119)
[java]
import java.net.InterfaceAddress;
import java.util.ArrayList;
import java.util.List;


public class sample01 {

//元のコード
static E reduce(List list, Function f, E initVal) {
E[] snapshot = (E[]) list.toArray(); //警告
E result = initVal;
for(E e : snapshot)
result = f.apply(result, e);
return result;
}

//安全にする
static E reduce2(List list, Function f, E initVal) {
List snapshot;
synchronized(list) {
snapshot = new ArrayList(list);
}
E result = initVal;
for (E e : snapshot)
result = f.apply(result, e);
return result;
}

interface Function {
T apply (T arg1, T arg2);
}

}
[/java]

以下次回に持ち越し

No. 26 ジェネリック型を使用する


No. 27 ジェネリックメソッドを使用する


No. 28 APIの柔軟性向上のために、境界ワイルドカードを使用する


No. 29 型安全な異種コンテナを使用する






参考資料


2012年10月24日水曜日

memcached-toolが無いときに

memcachedを使うときに、

$ telnet hoge-host 11211
stats
...

quit
とかして、確認することはポピュラーだと思います。

シェルスクリプトとかで操作したい時は、memcached-toolが入っていると楽ですね。
ただ、memcachedがinstallされていない鯖だと、memcached-toolも入っていないことが多いので、そういうときに使えるワンライナー
$ echo -e 'stats\nquit' | curl -s -T - telnet://hoge-hos:11211
curlかわいいよ、curl

2012年9月20日木曜日

eclipse新規設定備忘録

環境は、MacOSX Lion,Eclipse 3.7 Java EE

plugin


  • vrapper

  • Maven Integration for WTP(m2e)

  • Eclipse Color Theme

  • Properties Editor

  • FreeMarker Editor

    • ref. http://ameblo.jp/kochablo/entry-11059888121.html

prefarence


  • 文字コード(UTF-8に)
    • Preferences -> General -> Workspace
    • Text file encoding -> utf-8

  • 行番号の表示させる
    • Preference -> General -> Editors -> Text Editors
    • "Show line numbers" にチェック

  • コードフォーマッタの適用
    • Preferences -> Java -> Code Style -> Formatter
    • importしてapplyしてOK

  • カーソル位置の変数のハイライトがうまくいってなかったら
    • Preferences -> Java -> Editor -> Mark Occurences
      • Mark occurrences of the selected element in the current fileにチェックしてapplyしてOK

2012年9月14日金曜日

sqlite3のコマンド少々

個人的なメモでござる。
オフィシャルなコマンドリファレンスはココ
http://www.sqlite.org/sqlite.html

環境



  • Mac OS X Lion


MySQLでいうところの¥Gしたいとき


垂直表示をしたい時は
[bash]
sqlite> .mode line
[/bash]

MySQLでいうところの、show tables


[bash]
sqlite> select * from sqlite_master where type='table';
[/bash]

MySQLでいうところの、show create tableてきな


[bash]
sqlite> select sql from sqlite_master where type='table' and name='調べたいtable名';
[/bash]

ま、FireFoxのcookieが見たかっただけなんですが...(いつからか、Firefoxのcookieはsqlite3に格納されるようになっています)。

2012年8月18日土曜日

Mac OS X Lionでのhostsの変更を即時反映する

T/O

どうでもいいけど、Macってこんなんなのね。
[bash]
$ ls -la /etc
lrwxr-xr-x@ 1 root wheel 11 4 13 19:58 /etc -> private/etc
[/bash]

実際の変更はこんな感じ
[bash]
$ sudo vim /etc/hosts
$
$ sudo killall -HUP mDNSResponder
[/bash]
こうすればリゾルバキャッシュがフラッシュされるらしいよー。