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日土曜日

よくつかうsvnコマンドの備忘録


  • 変更ファイル一覧(特定リビジョンの範囲で)


[bash]
svn diff --summarize -r -r [rev01]:[rev02]
[/bash]

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