2015年12月6日日曜日

CentOS6系に最新のgitを入れる

// 古いgitを入れる
sudo yum install git -y

cd /tmp
git clone git://git.kernel.org/pub/scm/git/git.git
sudo yum -y install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-ExtUtils-MakeMaker

// 古いgitを消しておく
sudo yum -y remove git

cd git
sudo make prefix=/usr/local all
sudo make prefix=/usr/local install

// おわり
/usr/local/bin/git -version

まぁ、わざわざ最初のgit cloneのためにgit入れるのアホらしい気もしないでもない\(-o-)/

2015年11月21日土曜日

CentOS 6.6にruby 2.2をsoftwarecollections.orgから入れる

手順は、softwarecollections.orgに書いてるけどね。

// software collectionsのutilを入れる
$ sudo yum install scl-utils -y

// リポジトリのrpmをとってくる
// ここに書いてある:https://www.softwarecollections.org/en/scls/rhscl/rh-ruby22/
$ wget https://www.softwarecollections.org/en/scls/rhscl/rh-ruby22/epel-6-x86_64/download/rhscl-rh-ruby22-epel-6-x86_64.noarch.rpm

// リポジトリのパッケージ入れる
$ yum install rhscl-rh-ruby22-*.noarch.rpm -y

// ruby入れる
$ sudo yum install rh-ruby22 -y

// rh-ruby22を有効化
$ sudo scl enable rh-ruby22 bash

// ruby version見てみる
$ ruby -v
ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-linux-gnu]

おしまい\(-o-)/

追記

なんかエラーでた

// 別Userにスイッチして実行
$ /opt/rh/rh-ruby22/root/usr/bin/ruby
/opt/rh/rh-ruby22/root/usr/bin/ruby: error while loading shared libraries: libruby.so.2.2: cannot open shared object file: No such file or directory

なんかこれと同じ現象
https://bugzilla.redhat.com/show_bug.cgi?format=multiple&id=1280344

とりあえず、scl enable rh-ruby22 'ruby -v' とかしとけば動くが...

CentOS 6.6にJenkins入れる

// OpenJDK 8のinstall
$ sudo yum install java-1.8.0-openjdk -y

// jenkinsのリポジトリ追加
$ wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
$ sudo rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key

// jenkinsのインストール
$ sudo yum install jenkins -y

// jenkins起動
$ sudo service start jenkins

// インストールしたマシンにブラウザでアクセス
http://host:8080/

おしまい\(-o-)/

2015年10月21日水曜日

mtr (My traceroute)で遊ぼう

むかーし、Windows使いのころ、お世話になったコマンドに、pathpingというコマンドがありまして、ネットワーク障害の時など多用しておりました(イントラのネットワークがしょぼい職場でした)。

さて、じゃあMac(というか、UNIX系)だと、何がpathpingにあたるかというと、mtrというコマンドが実はありまして、homebrewを使ってる人は、

$ brew install mtr

これだけです。(もちろんLinuxにもあります)。

詳しい説明は、英語版wikipediaに(予想外に)ありましたが、要するに、高機能なping + tracerouteみたいなものです。

たとえばこんな感じ

$ sudo /usr/local/Cellar/mtr/0.86/sbin/mtr --report 8.8.8.8

Start: Wed Oct 21 21:43:19 2015
HOST: hostname                     Loss%   Snt   Last   Avg  Best  Wrst StDev
  1.|-- x.x.x.x                           10.0%    10    1.4   3.2   1.4  11.9   3.4
(略)
 11.|-- google-public-dns-a.googl  0.0%    10    3.5   3.9   3.5   6.4   0.8

要するにicmpを利用して、見た目分かりやすくレイテンシを表示してくれるツールです。
(一応書いとくと、tracertと一緒でUDPモードもあります)

manを見るとわかりますが、オプションも少ないし、とりあえず、installして遊んでみるとよいかと(^v^)


2015年10月14日水曜日

shでヒアドキュメントを変数に代入

catをかませてみる。

QUERY=`cat <<'EOF'
select * from hoge_table
where id = 1
;
EOF`

まぁ、bash でいいじゃんという説も...。

2015年9月23日水曜日

JavaでProgram Arguments(Command Line Arguments)を取り出す

javaのアプリケーションなんかを実行する際に、

java -jar foobar.jar --arg1=true --arg2=false

なんてことをすることはよくあると思うんですが、arg1の値を使いたいとかのときは、
mainメソッドからだと、当然、public static void main(String.. args) {}のargsから取れるわけです。

じゃあ、mainメソッド以外から取り出すときに、よい取り出し方ってどうなんだろうと小一時間探してみたんですが、イマイチ見つからず、結果的にこんな感じで取り出してみました。

String command = System.getProperty("sun.java.command");
String[] args = command.split(" ", 0);


ほかにあったりしないのかな ( ´ー`)フゥー...

追記

ちなみに、Springの場合だと、

ConfigurableApplicationContext ctx = //どこかからapplicationContext取得
ConfigurableEnvironment ce = ctx.getEnvironment();
String arg = ce.getProperty("arg1");

とかでもいけます。

2015年8月28日金曜日

Spring in Summer 雑感

これいってきました

Spring in Summer ~ 夏なのにSpring
https://jsug.doorkeeper.jp/events/27682

最初のほうと、最後のほうは所要で外したんだけど、午後のセッションはだいたい聴くことができた。

その中でも、やっぱり、pivotalのJosh Long氏の話が面白くて時間作って行ってよかったなーと思った。(同時通訳の方も早口なのにすごい翻訳だった)

Josh Long氏は地球の裏側からきたばっかりらしいんだけど、3つのセッションを大変パワフルにこなしてました。

The Macro of Microservices
概念的な話。アジャイルでDevOpsでCIでねーみたいな。
pivotalは、開発とデリバリーの溝を埋めたい。
プラットフォームを作りたいという顧客がいる。これはクレイジーだと思う。
ソフトウェア企業だったら、ソフトウェアに注力しようよ。チップを製造したりはしないでしょ?
Art of scalability読んでみてね。いい本だよ。子どもにも読み聞かせよう(笑うとこ)
Netflixすごいよ話。アメリカ人めっちゃ見てるよ。
コンウェイの法則として知られる法則「ソフトウェアを開発する組織は、その構造をそっくりまねた構造の設計を生み出す」
オープンソースを開発している組織は、分散アーキテクチャになるけど、
クローズドソースで開発している組織は、同じ部屋で開発して、モノリシック化してしまう。

ほかいろいろ

The Bootiful Application
ライブコーディングセッション#1
Spring bootてきな。

The Bootiful Microservice
ライブコーディングセッション#2
Spring Cloudてきな。

以下、あんまり細かくメモはとってないので超ざっくりと雑感。
(細かいところは、twitterのhash tagをみるとよいかと:https://twitter.com/hashtag/jsug_sis?src=hash

マイクロサービスアーキテクチャ(以下、MSA)について、よく日本のネット界隈で言われてることって、ガラパゴス、とまでは言わないけど、ちょっと断片的だったり、ポイントがずれていたりするのかな、って思ったりした。

特に、実装面で、よくMSAとして言われてるのは単にAPIの集合みたいなケースが多いように思うんだけど、実際、netflixはこんな感じで(逸れるけど、netflixのgithubすごいよね)、我々の、spring bootとspring cloudで(netflixのOSSの力も使って)、こんな風に実現できるんだぜ、みたいな。

見せ方がうまいなーと思うのもあるけど、やっぱり概念だけじゃなくて、実装を見ると、SOAと言われてた時に、分散アーキテクチャとしてこういう要素要るよね、って言われてた内容が、MSAでも、こういうの必要だよね、ってなってリアリティがでてきた。

the Macro of Microservices by Josh Long
https://speakerdeck.com/joshlong/the-macro-of-microservices


ライブコーディングの一部はここにあるっぽい
https://github.com/joshlong/bootiful-microservices

勉強しないとなーという気になったので、行ってよかった。とりあえず、netflixとspring cloudのリポジトリみてみなきゃ。

おしまい٩(๑❛ᴗ❛๑)۶


見かけた公開資料

マイクロサービスアーキテクチャの設計
http://www.slideshare.net/yusuke/jug2015

Spring Framework / Boot / Data 徹底活用 〜Spring Data Redis 編〜
http://www.slideshare.net/yoshidanaohiro52/spring-framework-boot-data-spring-data-redis

Jsug2015 summer spring適用におけるバッドノウハウとベタープラクティス
http://www.slideshare.net/Yoichi-KIKUCHI/jsug2015-summer-spring

20150828 JSUG Spring in Summer 2015 - Spring BootアプリケーションをAmazon Elastic Beanstalkに一発でデプロイしてみよう
http://www.slideshare.net/daisuke_m/20150828-jsug-spring-in-summer-2015-spring-bootamazon-elastic-beanstalk

2015年8月26日水曜日

golang1.5 + gb + gojiでhello world 3分クッキング

gojiを試しつつ、ginのほうが好きかも...

// 適当にpathを設定
$ export GOPATH=~/go

// gb落とす
$ go get github.com/constabulary/gb/...

// プロジェクトのディレクトリ掘る
$ mkdir -p example-project/src/hello

// ここ(https://github.com/zenazn/goji/blob/master/README.md)に書いてあるexampleをとりあえず動かしてみる
$ vim ./example-project/src/hello/main.go

// これ通さないとだめっぽい("don't run this binary directly, it is meant to be run as 'gb vendor ...'" って怒られる)
export GB_PROJECT_DIR=./example-project

// fetchする(vendorディレクトリがつくられる)
$ cd ./example-project
$ ~/go/bin/gb-vendor fetch github.com/zenazn/goji
$ ~/go/bin/gb-vendor fetch github.com/zenazn/goji/web

// buildする
$ ~/go/bin/gb build

// 実行
$ ./bin/hello

// アクセスしてみよう
http://localhost:8000/hello/shase

おしまい٩(๑❛ᴗ❛๑)۶

2015年7月11日土曜日

今年も半分終わった

半分終わったし、振り返り。
(今週体調悪かったし。なんかそういう時って、振り返りモードなりません?)

生活

今年の6月まで、ライフイベント関連のあれやこれやでバタバタしていた記憶しかなく、でもそれはある意味予定通りでして。

5月あたまの結婚式の準備と、6月の引っ越関連で、ほぼなにかしたらそれに関することを毎週末やっていたような気がします。

ほんと、今週ぐらいから、前の家のあれこれが終わったりして、新居とかそういうの考えられるようになった感じです。

仕事

あんまり書けることないけどw、やって良かったかなぁと思ったのは、春に、稼働中のサービスをJava7から、Java8に置き換えできたことかなぁ、と思います(課外活動的な感じで)。

まだ、実装は手探り手探りやってますけど、チームのエンジニア的にOpportunityになればなーと思います。運用中のサービスの仕事って、結構マンネリ化しやすいですしね。

プロジェクト的には、とある新規のしごとの山場を迎えている感じで、今年の夏は、これ関連のことをずっとやっていそうな雰囲気。当分忙しそう。

学び

2015年やること を書いてはみたものの、書いてる時から、今年前半はあれこれするのは無理であろうと、予想したとおりになった感じですねw

多少英語とかやってたりしたんですけど、今年の後半戦から改めて取り組もう、という感じです。

ほんとにチラ裏でした\(^o^)/

2015年5月19日火曜日

MacにMySQLインストール後の状態


oracleさんから拾ってきてインストール後の状態

Target

  • MySQL 5.6 
  • MacOSX mavericks

初期状態のメモ

  • 起動 / 停止
    • $ sudo /usr/local/mysql/support-files/mysql.server start
  • scokファイルの場所
    • /tmp/mysql.sock
  • コンソールログイン
    •  /usr/local/mysql/bin/mysql -uroot -S /tmp/mysql.sock
  • mysql home(ソフトリンク)
    • /usr/local/mysql

2015年5月8日金曜日

RestTemplateで使用するTLSのバージョンを指定する

昨日書いたこれは

Java8で使用するTLSのバージョン事情
http://blogger.shase.info/2015/05/java8tls.html

あたりまえだけど、全部に適用されてしまうわけでして。

特定の通信だけ明示的に指定したいケースを考えてみる。

環境

Spring 4.1.x
Java 8.x
apache httpclient 4.4.x

とりあえずfactoryのところ変えてみたよ、って感じ。
SimpleClientHttpRequestFactoryはjavaの設定そのままなので、HttpComponentsClientHttpRequestFactoryを使ってみました。

before

// request factoryの生成
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory() {
};

// factoryになんかセットしたりする


// リクエスト
HttpEntity<String> request = new HttpEntity<String>(requestHeaders);
String url = "https://localhost"
RestTemplate restTemplate = new RestTemplate(factory);
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, request, String.class); 

after

 // request factoryの生成
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
SSLContext sslContext = null;

try {
  sslContext = SSLContext.getInstance("TLSv1.2");
  sslContext.init(null, null, null);
  } catch (Exception e) {
    //todo:
  }

  SSLConnectionSocketFactory sf = new SSLConnectionSocketFactory(sslContext);
  CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(sf).setSSLHostnameVerifier(new NoopHostnameVerifier()).build();
  factory.setHttpClient(httpClient);

 // リクエスト
 HttpEntity<String> request = new HttpEntity<String>(requestHeaders);
 String url = "https://localhost"
 RestTemplate restTemplate = new RestTemplate(factory);
 ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, request, String.class);
 

参考にした

http://www.baeldung.com/httpclient-ssl


gistとか貼ったほうが見やすいね。(。-人-。) ゴメーン

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;
}