2015年5月7日木曜日

Java8で使用するTLSのバージョン事情

Java 7のとき


TLSv1をデフォルトで使用するようになっている。
SSLv3については、例のpoodle事件の影響で、JDK 7u75リリース以降無効になっている。
https://www.java.com/ja/download/faq/release7_changes.xml

TLS1.2も使えるが明示的に有効にしないと使えない。

Java 8


TLSv1.2をデフォルトで利用。
通信相手が対応してなかったりするとTLSv1で通信したりする。

そこをやんごとなき事情があって、1.2を使いたくないとか、そんなときの設定。
プロパティに下記を設定
(起動パラメータの場合はおなじみ、-Dhttps.protocols="" -Djdk.tls.client.protocols="" 記法)

https.protocols=TLSv1,TLSv1.1
jdk.tls.client.protocols=TLSv1,TLSv1.1



2015年4月16日木曜日

Windows Server 2003のおもいで

Windows Server 2003がやっとサポート終了を迎えるらしい。

プレス発表「3か月後に控えたWindows Server 2003のサポート終了に関する注意喚起」
http://www.ipa.go.jp/about/press/20150414.html

学生時代FreeBSDで過ごして、社会人になって出会ったこの商用サーバーOSは、自分にとって、二度とWindowsで仕事はするまい、と思わせてくれる存在だった。

その後、Windows Serverと疎遠になったこともあって、後継の2008などに触れることもなく、平和な生活を過ごしている。

ここでは、もう2度と使われない知識を供養する意味でいろいろ書いておこうと思う。
(インストーラーでF6押してドライバ読み込むとか、drwtsn32でドクターワトソン起動とか...)

イメージ

エポックメイキングな、2000という存在があって、それを成熟させたのが2003だったと理解している。NT -> 2000ぐらいで圧倒的な存在となって、ライバル(Netwareとかそのへん)をエンタープライズ界隈で寄せ付けない感じになっていた。

同じ会社のおじさんが、NetwareはCUIで、NTはGUIだったので、総務兼情シスみたいなユーザーにとって、NTは使いやすかったのでは?みたいなことを言っていたのが記憶に残っている。

ActiveDirectory : AD

以下AD。言わずと知れたAD。

たぶん、当時所属していたところが、ActiveDirectoryとPC(当時Windows XP)の導入、運用でお金を貰うビジネスをしていたので、嫌だなーと思いつつ、すげー触った。

最初、概念的にまったく理解できなかったんだけど、これは要するにディレクトリサービスに必要なものをあれこれつけたAll in one ですよ、ってことなんだと思う。

Windows Server 2003の時代だと、2000で構築した環境のリプレイス案件が多かった気がする。ntdsutil、dcpromoいろいろ覚えてたけどもう忘れた。

DNSサービス(サーバー)

MS 標準のDNSサーバーが役に立たねー、って記憶が一番つよい。BINDを基準で考えると、DNSサーバーとして圧倒的に機能が足りないので。

ただ、AD + BINDの運用ってレコードの管理とかが超かったるいので、そういう感じで運用している現場をぼくは見たことがなかった。

あと、DNSサーバーのroot hintって、Windows Updateとかで更新されてるのかと思いやそんなこともなく、root hintが更新されてない環境が多かったように記憶している。

Microsoft Cluster Service : MSCS

いわゆるHAクラスタリングソフトなんだけど、MS謹製なので、MSのサーバー(サービス)と相性がよく、CIFSのファイルサーバーなんかを、MSCS + NAS(or SAN)で組むことが身近では多かった。

なんか、これを組めると出来る人、みたいな扱いをされてたけど、当時から結構ネット上に情報もあったし、お手軽なクラスタリングソフトだったと思う。

変なところではDHCPdとかそういうのにも使ったりしているところがあった。

NTP

AD環境の場合、クライアントPCとかは、FSMOロールのサーバーの時刻に同期していなければならない(kerberos認証の都合上)。

なので、ADのドメインに参加すると、クライアントは自動でNTPの設定をFSMOに合わせるようになる(microsoft.comじゃなくてね)

なんだけど、自分が見た現場はへぼいのが多くて、FSMOの時刻が外部のNTPを見てるかとおもいきや、system localしか見ていなかったり(FSMOのサーバーがどんどん時刻が遅延していくと、クライアントPC全部がどんどん遅れていく)とか、そういうのが多かった。

NT backup

Windowsの標準のバックアップツールでメジャーな奴といえば、これ。

仕事で使ったケースだと、backup先をCIFSマウントした(へぼい)NASとかにすると、なんか失敗するケースがあって、テープメディア前提のソフトウェアの悲しさみたいなものを感じた(適当に言ってます)。

あと、Windowsのレジストリのバックアップって結構めんどくさくて、安全なバックアップとしてNT backupをつかう、というノウハウもあった。

レジストリのバックアップにレジストリエディタの .reg ファイル書き出し機能を使うのは危険


イベントログ

今はどうか知らんが、Windowsのログといえばイベントログで、これがまた扱いにく(UNIXの文化から来ると)。フラットファイルじゃないからね。

syslogサーバーとかに載せたいときは、NT-syslogとか使ってた気がする。

あと、コマンドでいうと、eventtriggersとかが、2003/XPからはあって、重宝してた気がする。

bat / WSH

有名なActivePerlも実はWSH上で動いている。が、本番サーバーで使ってる現場に出会ううことはなかった。

vbsの文法が好きになれなくて、自分で書くのはjscriptにしてたんだけど、引き継ぎできねーって怒られたのを記憶している。

@echo off 懐かしい

当時、参考にしていたドキュメント

リソースキット(本)は、インフラの基本的なことが書いていて勉強になった…かもしれない。

あと、MSのサポートだったり、kbばかり見ていた気がする。

市販の本でいうと、
アンドキュメンテッドMicrosoftネットワーク
WINDOWS SERVER2003完全技術解説
インサイド MS WINDOWS

あたりが記憶に残っている。

アンドキュメンテッド~はwiresharkで、SMB/CIFSの解析をするのに非常に助かったりした。

その他

Sysinternalsとか、リソースキットのツールとか、このへんの便利ツールがデフォルトで入っていないのが本当に使えないなぁ、と思っていて。

受託で仕事をしていると、サーバーに便利ツールを入れるのも、非常に面倒なプロセスを踏む必要があって、萎えた。

アプリケーション・サーバーは触ってなかったのでASP.netとかIISはぜんぜん知らない。

netshコマンドは使いこなせた気がしない。あれ、MSとCiscoが仲良かった頃の名残なんだよね。

2015年4月7日火曜日

VarnishでBANメソッドを定義する

公式見ながら設定したりしたが、挙動は確認できたけどいまいち自信なし

一応Javaから叩いている
ex)JavaでVarnish用のHttpMethod BANを発行してみる

localhost以外からcallしたいときは、acl purgeメソッドのところにIPなりhostなりを追加すればよい

以下vcl

backend default {
  .host = "example.com";
  .port = "80";
}

acl purge {
        "localhost";
}

sub vcl_recv {

        if (req.request == "BAN") {
                if (!client.ip ~ purge) {
                        error 405 "Not allowed.";
                }

                ban("obj.http.x-url ~ " + req.url);
                error 200 "Banned.";
        }
}

sub vcl_fetch {
        set beresp.http.x-url = req.url;
}

CommonsDBCPでminIdle以下のコネクション数になっちゃう時はtimeBetweenEvictionRunsMillis設定しよう

タイトルまま。

ex) そもそものCommonsDBCPの設定の話はこのへんでもみてね
http://www.atmarkit.co.jp/ait/articles/0709/25/news149_3.html

netstatをみたときに、Tomcatのコネクションプーリングのコネクション数が、minIdle以下になってることがあって。

例えばminIdle 5にしたときに、netstat叩いたとして、

$ netstat -an |grep "DBのIPアドレス":3306|grep ESTABLISHED |wc -l

1
みたいな。

で、どうもアイドル状態のコネクションは、検証し続けないとminIdle以下になっちゃうらしいんですね。アクセスが多くなるとmaxIdleまでは増えてくれるんだけど、コネクション生成コストもばかにならないので、minIdle数ぐらいは、常に貼っておいてほしいと。

そんなときは、timeBetweenEvictionRunsMillisを明示的に設定すればよくて(デフォルト値は-1なのでなんもしてない)、これを設定すると、idle中の検証をしてくれるので、minIdle以下のコネクションになることがなくなった(^○^)

手元の環境では、60000(ミリ秒)と設定している。

おわり

追記1

timeBetweenEvictionRunsMillisを明示的に設定したら、もう1ついいことがあった。

ピーク帯にコネクション数が、DBCPで設定してある、maxIdleぐらいまで達するんだけど、そのあと、負荷が下がっても、コネクション数が、mysqlのwait_timeout(デフォルト8時間)ぐらい維持されてたんだよね。

timeBetweenEvictionRunsMillisを設定したら、上記の8時間ぐらい増えた分が維持されていたコネクションが、すみやかに使わなくなったらcloseするようになった。

良いことでした。

٩(๑❛ᴗ❛๑)۶


追記2

http://www.atmarkit.co.jp/ait/articles/0709/25/news149_3.html
これみたら

 testWhileIdle以降はプール内でアイドル状態のコネクションを検証するかどうかのパラメータだ。この機能を使用するときには、validationQueryパラメータが設定されている必要がある。

って書いてたんだけど、このへんのソースみた感じ
http://svn.apache.org/viewvc/commons/proper/dbcp/trunk/src/main/java/org/apache/commons/dbcp2/BasicDataSource.java

特にvalidationQueryにtimeBetweenEvictionRunsMillisが依存してる感じはない(なんか見落としてたらごめん)。

ソース読みきれないので推測入るんだけど、アイドル接続の有効性を確認(クエリを投げての検証)は、validationQueryが必要っぽいんだけど、アイドル接続の生存期間を確認するだけなら、minEvictableIdleTimeMillisのデフォ値で見てくれているので今回は期待した挙動(追記1)になったんだと思う。

2015年2月27日金曜日

コマンドでOphcrack(Windows7対象)

基本的にWindowsは使ってないんだけど、身内がWindows7でパスワード忘れたわーわーってなってたので、久しぶりにOphcrackでパスワードリセットしたのでメモ。

なんか、LiveCDのisoをusbメモリに書き込んでbootさせたんだけど、なんかXがうまく立ち上がってくれなかったので、コマンドラインで実行してみた。

対象環境
Windows 7

流れ

1. ここ(http://ophcrack.sourceforge.net/download.php?type=livecd)から
「ophcrack-vista-livecd-3.6.0.iso」をダウンロード

2. ここ(http://ophcrack.sourceforge.net/tables.php)から「Vista free」をダウンロード

3. 1をbootableな形式でusbメモリに書き込む。2もusbメモリに書き込む(別のusbメモリにするか、別パーティションにするとよい)

4. 3で作ったusbメモリで作業対象のPCをboot(BIOSでboot順序を変えておく)

5. Xが起動せずにシェルが起動した場合はsuしてrootになっておく(公式サイトによれば、suのpasswordは"root")

6. 2のvista freeのテーブルディレクトリをマウントしておく

例)# mount /dev/sdb2s2 /mnt


7. こんなコマンドを実行。おしまい

例)# ophcrack -g -t /mnt/table -w /media/sda3/Windows/System32/config

オプションの意味
-g : GUIを起動しない
-t : テーブルファイルの置き場を指定。今回は6でマウントした場所になっている
-w:windowsのCドライブをマウントしているところを指定して、System32のconfigを指定

まぁ、tableファイルいろいろあるけど、そんな長くないパスワードだったらVista Freeのテーブルだけで、5分ぐらいでいけると思う

( ´ー`)フゥー...

2015年2月24日火曜日

Rのチートシート


RとRubyによるデータ解析入門
http://www.amazon.co.jp/dp/4873116155
2章を参考に。


環境周り


Rの導入(macportsで)
sudo port install R

ファイルをコマンドラインから実行
R --vanilla --slave < hoge.R

--vanilla : Rがこれまでに保存していたオブジェクトを読み込まない
--slave : 標準出力に表示を出さない

パッケージのインストール
install.packages('tree')

インストール済パッケージ一覧
installed.packages()

パッケージのアンインストール
remove.packages('hoge')

パッケージの使用
library(tree)

Rのシンタックス

コメント
#

代入演算子

x <-1
or
1 -> x
or
mean(x = 1:10)

=はトップレベルでのみ使うことができて、関数内で使った場合はスコープが関数内になる。
x <- 1:10
とすると関数外でも使うことができる。

関数定義

my_function <- function(x,y) {

}


関数作成時に初期値を設定するには下記のようにする

my_function <- function(x,y=5) {

}

関数呼び出し

my_function(1,2)

引数に初期値がある場合は、すべての引数を指定しなくても良い

my_function(1)


条件文とループ


条件文の例

x <- 10
if (x > 20) {
print("x is greater than 20")
} else {
print(x is less than 20")
}

ループ3つ

repeat {}

breakないと止まらないお


while () {}

for ( x in 1:10) {}


データ構造

ベクトル(1次元配列)

// 結合関数cでつくる
> height <- c(1,2,3)

// :演算子でつくる
> 1:10

// seq関数でつくる
> seq(0,100,by=10)

// ベクトルの長さを取る
> length(height)

// ベクトルにアクセス
> length[1]

ベクトルのインデックスは0からではなく、1からはじまる

// 複数要素を取ることもできる
> length[2,3]


リスト

// key/value的な感じ
> peater <- list(name='Peter', age=30, glasses=TRUE)

// 参照は、位置もしくは、名前
> peater[1]

> peater['name']

// exact=FALSEにすると、名前の部分一致でもアリらしい
> petaer['na',exact=FALSE]


行例

> m <- matrix(1:20,nrow=5,ncol=4)

// デフォルトは列方向につくられるので、行方向につくりたいとき
> m <- matrix(1:20,nrow=5,ncol=4,byrow=TRUE)


アクセス

// 10番目、の意
m[10]

// 位置
m[3,4]

// 行列3~5行目,2~3列目
m[3:5,2:3]


配列

ベクトルを2次元以上へ拡張したもの。array()で作成する。
行列を複数つくる感じ

> a <- array(1:24,c(2,3,4))


ファクタ

値には、名義値、順序値、連続値がある。
名義値と順序値をつくりたいためのファクタ。


> colors <- c('green', 'red', 'blue')
> factor(colors)
[1] green red   blue
Levels: blue green red

デフォルトではabc順。factor作成時に順序指定することもできる。
> factor(colors, order=TRUE, levels=colors)


データフレーム

名前のついた複数のベクトルからなるリスト

ちょい書きかけ...

2015年2月22日日曜日

MacOSXでの複数Java環境の管理

yosemiteにて

インストールされているJava一覧


$ /usr/libexec/java_home -V

Matching Java Virtual Machines (2):    1.8.0_25, x86_64:   "Java SE 8"     /Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home    1.7.0_40, x86_64:   "Java SE 7"     /Library/Java/JavaVirtualMachines/jdk1.7.0_40.jdk/Contents/Home/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home


いまのJavaHome

$ /usr/libexec/java_home

/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home

余談

JavaHomeの切り替えなんだけど、

export JAVA_HOME=`/usr/libexec/java_home -v 1.8.0_25` 

みたいなversion指定で切り替えられるんだけど、個人的には、

 ln -s /Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home /usr/local/java8

みたいにソフトリンクのほうが、
共存させててるときにわかりやすいなのでなんとなくそうしてる