2015年もお世話になりました。
shaseです。
仕事が納まっていませんが、簡単に振り返りを。
新年の抱負のほうは、別の所に書こうと思います。
というのも、bloggerから別のところに引っ越そうと思うからです。
今年を振り返ると、プライベートはほぼ結婚式、ハネムーン、引っ越し、それらの準備で忙殺されました。
仕事のほうは、マンガコンテンツ販売の為のサービス開発から、マンガコンテンツ供給の為のサービス開発に変化がありました。
技術的にはあまり見るべきものはなく、Goを少し仕事で使い始めたのと、Javaのバージョンを8にあげたり、AWSを少し使うようになったり、ぐらいでしょうか。
英語や、数学があまりできなかったな、という反省などもあります。
最後ですが、google bloggerにはお世話になりました。
また、どこかで宜しくお願いします。
2015年12月29日火曜日
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' とかしとけば動くが...
// 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-)/
$ 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
要するにicmpを利用して、見た目分かりやすくレイテンシを表示してくれるツールです。
(一応書いとくと、tracertと一緒でUDPモードもあります)
manを見るとわかりますが、オプションも少ないし、とりあえず、installして遊んでみるとよいかと(^v^)
さて、じゃあ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をかませてみる。
まぁ、bash でいいじゃんという説も...。
QUERY=`cat <<'EOF'
select * from hoge_table
where id = 1
;
EOF`
まぁ、bash でいいじゃんという説も...。
2015年9月23日水曜日
JavaでProgram Arguments(Command Line Arguments)を取り出す
javaのアプリケーションなんかを実行する際に、
なんてことをすることはよくあると思うんですが、arg1の値を使いたいとかのときは、
mainメソッドからだと、当然、public static void main(String.. args) {}のargsから取れるわけです。
じゃあ、mainメソッド以外から取り出すときに、よい取り出し方ってどうなんだろうと小一時間探してみたんですが、イマイチ見つからず、結果的にこんな感じで取り出してみました。
ほかにあったりしないのかな ( ´ー`)フゥー...
追記
ちなみに、Springの場合だと、
とかでもいけます。
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
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する
// 実行
$ ./bin/hello
// アクセスしてみよう
http://localhost:8000/hello/shase
おしまい٩(๑❛ᴗ❛๑)۶
// 適当に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日土曜日
今年も半分終わった
半分終わったし、振り返り。
(今週体調悪かったし。なんかそういう時って、振り返りモードなりません?)
5月あたまの結婚式の準備と、6月の引っ越関連で、ほぼなにかしたらそれに関することを毎週末やっていたような気がします。
ほんと、今週ぐらいから、前の家のあれこれが終わったりして、新居とかそういうの考えられるようになった感じです。
まだ、実装は手探り手探りやってますけど、チームのエンジニア的にOpportunityになればなーと思います。運用中のサービスの仕事って、結構マンネリ化しやすいですしね。
プロジェクト的には、とある新規のしごとの山場を迎えている感じで、今年の夏は、これ関連のことをずっとやっていそうな雰囲気。当分忙しそう。
(今週体調悪かったし。なんかそういう時って、振り返りモードなりません?)
生活
今年の6月まで、ライフイベント関連のあれやこれやでバタバタしていた記憶しかなく、でもそれはある意味予定通りでして。5月あたまの結婚式の準備と、6月の引っ越関連で、ほぼなにかしたらそれに関することを毎週末やっていたような気がします。
ほんと、今週ぐらいから、前の家のあれこれが終わったりして、新居とかそういうの考えられるようになった感じです。
仕事
あんまり書けることないけどw、やって良かったかなぁと思ったのは、春に、稼働中のサービスをJava7から、Java8に置き換えできたことかなぁ、と思います(課外活動的な感じで)。まだ、実装は手探り手探りやってますけど、チームのエンジニア的にOpportunityになればなーと思います。運用中のサービスの仕事って、結構マンネリ化しやすいですしね。
プロジェクト的には、とある新規のしごとの山場を迎えている感じで、今年の夏は、これ関連のことをずっとやっていそうな雰囲気。当分忙しそう。
学び
2015年やること を書いてはみたものの、書いてる時から、今年前半はあれこれするのは無理であろうと、予想したとおりになった感じですねw
多少英語とかやってたりしたんですけど、今年の後半戦から改めて取り組もう、という感じです。
ほんとにチラ裏でした\(^o^)/
多少英語とかやってたりしたんですけど、今年の後半戦から改めて取り組もう、という感じです。
ほんとにチラ裏でした\(^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
あたりまえだけど、全部に適用されてしまうわけでして。
特定の通信だけ明示的に指定したいケースを考えてみる。
Java 8.x
apache httpclient 4.4.x
とりあえずfactoryのところ変えてみたよ、って感じ。
SimpleClientHttpRequestFactoryはjavaの設定そのままなので、HttpComponentsClientHttpRequestFactoryを使ってみました。
gistとか貼ったほうが見やすいね。(。-人-。) ゴメーン
Java8で使用するTLSのバージョン事情
http://blogger.shase.info/2015/05/java8tls.html
あたりまえだけど、全部に適用されてしまうわけでして。
特定の通信だけ明示的に指定したいケースを考えてみる。
環境
Spring 4.1.xJava 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-sslgistとか貼ったほうが見やすいね。(。-人-。) ゴメーン
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でドクターワトソン起動とか...)
プレス発表「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はぜんぜん知らない。
アプリケーション・サーバーは触ってなかったので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;
}
一応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
これみたら
って書いてたんだけど、このへんのソースみた感じ
http://svn.apache.org/viewvc/commons/proper/dbcp/trunk/src/main/java/org/apache/commons/dbcp2/BasicDataSource.java
特にvalidationQueryにtimeBetweenEvictionRunsMillisが依存してる感じはない(なんか見落としてたらごめん)。
ソース読みきれないので推測入るんだけど、アイドル接続の有効性を確認(クエリを投げての検証)は、validationQueryが必要っぽいんだけど、アイドル接続の生存期間を確認するだけなら、minEvictableIdleTimeMillisのデフォ値で見てくれているので今回は期待した挙動(追記1)になったんだと思う。
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分ぐらいでいけると思う
( ´ー`)フゥー...
なんか、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にて
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
みたいにソフトリンクのほうが、
共存させててるときにわかりやすいなのでなんとなくそうしてる
インストールされている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
みたいにソフトリンクのほうが、
共存させててるときにわかりやすいなのでなんとなくそうしてる
2015年2月20日金曜日
MySQLでデッドロック検知したときに、とりあえず見るところ
お手本はこちら。
http://d.hatena.ne.jp/sh2/20090618
これはただの自分用のメモです。
5.5 later想定
デットロックが監視にひっかかったら!!
http://d.hatena.ne.jp/sh2/20090618
これはただの自分用のメモです。
5.5 later想定
デットロックが監視にひっかかったら!!
- 心を落ち着かせる
- show full process list;
- 今流れてるクエリを眺める
- show engine innodb status\G
- LATEST DETECTED DEADLOCKのあたりを見よう
- select * from information_schema.INNODB_TRX order by trx_id;
- limitとかwhereとか適当に効かせて
- ロックを引き起こしてる輩:information_schema.INNODB_LOCKSをみる
- ロックで待たされちゃってる輩:information_schema.INNODB_LOCK_WAITS
- ( ´ー`)フゥー...
2015年2月6日金曜日
2015年やること
1月中、いろんなことを調べたり、試したりしていて、今年やることを(今更)決めたので、残しておこうと思う。これはただのチラ裏。
いろいろ考えていたのは、今年というか、30代のテーマどうしようかなーと思っているのがあって、なかなかもやもやしていたのだった。
やることってか、学ぼうリストみたいな感じですね(言ったからにはやろうというか)
今年やること
英語
いい加減Google翻訳に頼る生活辞めたい。普通にTOEICの勉強しようと思う。
数学(統計)
ECサイトにいることもあって、手元にデータなんかいろいろあるので、いっちょセクシィなアウトプットを目指す。
Ruby
仕事は相変わらずJavaを書いてる気がするんだけど、趣味のものはなるべくRuby使おうかな、と。もう少し慣れたい。Rubyで仕事をしたいかというと特にそういうのもないんだけど。
関数型言語(Haskell ?)
最近、情報が多いのがHaskellなので、これかなー
今年やるかも?
Go
swiftはたぶんやらない
ほか、仕事で必要になった知識は別途是是非でやっていくということで。
人生上の大きなイベントが昨年から今年にかけて多いので、勉強の時間取るのをうまくやっていかないとね。
おしまい
2015年2月2日月曜日
固定長リストへ循環アクセスするサンプル
タイトルまま
コード
コード
package hoge; import java.util.Arrays; import java.util.List; import org.junit.Test; public class TestTest { @Test public void test1() { List実行結果list = Arrays.asList("a","b","c","d","e","f","g"); for(int i=0;i< 10;i++) { System.out.println(list.get(i % list.size())); } } }
a b c d e f g a b c
2015年1月16日金曜日
【補足あり】JavaCVでPixel操作サンプル
さて、昨日つくった環境で
http://blogger.shase.info/2015/01/javacv.html
公式のサンプル(といっても結局c++なんだけど…)っぽいことをしてみる。
https://code.google.com/p/javacv/wiki/OpenCV2_Cookbook_Examples_Chapter_2#Accessing_Pixel_Values
ここにある、Accessing Pixel Values ってやつ。
元画像
CvMatのgetとputがduplicatedってどーゆーことー ?_?
【補足】
get,putの代わりにcvGet2Dとか、cvSet2Dとかあるのでこれでよいですね。
と、ここまで、やって、OpenCV使うにしてもJavaCVいろいろ微妙なんじゃないかな、と思い始めた俺ががいる。
http://blogger.shase.info/2015/01/javacv.html
公式のサンプル(といっても結局c++なんだけど…)っぽいことをしてみる。
https://code.google.com/p/javacv/wiki/OpenCV2_Cookbook_Examples_Chapter_2#Accessing_Pixel_Values
ここにある、Accessing Pixel Values ってやつ。
元画像
加工後
コード
package hoge; import org.junit.Test; import static org.bytedeco.javacpp.opencv_core.*; import static org.bytedeco.javacpp.opencv_imgproc.*; import static org.bytedeco.javacpp.opencv_highgui.*; public class HogeTest { @Test public void test1() { IplImage image = cvLoadImage("abc.jpg"); CvMat cvMat = new CvMat(); cvGetMat(image, cvMat); int div = 100; int nbElements = cvMat.rows() * cvMat.cols() * cvMat.channels(); for (int i = 0; i < nbElements; i++) { double v = (int) cvMat.get(i); double newV = v / div * div + div / 2; cvMat.put(i, newV); } IplImage image2 = new IplImage(cvMat); cvSaveImage("abc2.jpg", image2); cvReleaseImage(image); } }
CvMatのgetとputがduplicatedってどーゆーことー ?_?
【補足】
get,putの代わりにcvGet2Dとか、cvSet2Dとかあるのでこれでよいですね。
と、ここまで、やって、OpenCV使うにしてもJavaCVいろいろ微妙なんじゃないかな、と思い始めた俺ががいる。
MacOSでJavaCVが動かなくて悲しい思いをした
環境は、Mac OS
OpenCVやりたいー。
Javaだから、JavaCV使って見ようと思って、pom.xmlに追加するじゃないですか。
https://github.com/bytedeco/javacv
公式サイトの通り。
で、公式サイトの通りテストプログラムを書いてみる。
悲しい。 結論から言うと、コイツ、いろんなjarが足りないらしい。ひどい! で、それらの足りないものを補ってくれるものが公開されてます。
ずばりここに書いてあった。
Making Computer Vision actually work
http://marellbox.marell.se/?p=687
で、書いてある回避用リポジトリをpom.xmlに追加すると動いたー。
( ´ー`)フゥー...
OpenCVやりたいー。
Javaだから、JavaCV使って見ようと思って、pom.xmlに追加するじゃないですか。
https://github.com/bytedeco/javacv
<dependency> <groupId>org.bytedeco</groupId> <artifactId>javacv</artifactId> <version>0.10</version> </dependency>
公式サイトの通り。
で、公式サイトの通りテストプログラムを書いてみる。
import org.junit.Test; import static org.bytedeco.javacpp.opencv_core.*; import static org.bytedeco.javacpp.opencv_imgproc.*; import static org.bytedeco.javacpp.opencv_highgui.*; public class HogeTest { @Test public void test1() { IplImage image = cvLoadImage("/Users/hoge.jpg"); if (image != null) { cvSmooth(image, image); cvSaveImage("/Users/hoge2.jpg", image); cvReleaseImage(image); } } }でもこんなエラーになるわけです。
java.lang.UnsatisfiedLinkError: no jniopencv_core in java.library.path at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1860) at java.lang.Runtime.loadLibrary0(Runtime.java:845) at java.lang.System.loadLibrary(System.java:1084) at org.bytedeco.javacpp.Loader.loadLibrary(Loader.java:535) at org.bytedeco.javacpp.Loader.load(Loader.java:410) at org.bytedeco.javacpp.Loader.load(Loader.java:353) at org.bytedeco.javacpp.opencv_core.(opencv_core.java:10) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:264) at org.bytedeco.javacpp.Loader.load(Loader.java:385) at org.bytedeco.javacpp.Loader.load(Loader.java:353) at org.bytedeco.javacpp.opencv_highgui. (opencv_highgui.java:13) at jp.co.cyberagent.dokusho.service.HogeTest.test1(HogeTest.java:17) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:601) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) at org.junit.runners.ParentRunner.run(ParentRunner.java:309) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) Caused by: java.lang.UnsatisfiedLinkError: no opencv_core in java.library.path at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1860) at java.lang.Runtime.loadLibrary0(Runtime.java:845) at java.lang.System.loadLibrary(System.java:1084) at org.bytedeco.javacpp.Loader.loadLibrary(Loader.java:535) at org.bytedeco.javacpp.Loader.load(Loader.java:401) ... 31 more
悲しい。 結論から言うと、コイツ、いろんなjarが足りないらしい。ひどい! で、それらの足りないものを補ってくれるものが公開されてます。
ずばりここに書いてあった。
Making Computer Vision actually work
http://marellbox.marell.se/?p=687
で、書いてある回避用リポジトリをpom.xmlに追加すると動いたー。
<dependency> <groupid>org.bytedeco</groupid> <artifactid>javacv</artifactid> <version>0.10</version> </dependency> <dependency> <groupid>se.marell</groupid> <artifactid>opencv-macosx-x86_64</artifactid> <version>2.4.10-0.10</version> <scope>runtime</scope> </dependency> ... <repository> <id>marell</id> <url>http://marell.se/nexus/content/repositories/releases/</url> </repository>
( ´ー`)フゥー...
2015年1月14日水曜日
JavaでVarnish用のHttpMethod BANを発行してみる
いわゆる独自メソッドを定義したいという話。
やりたいことは、
curl -X BAN http://localhost/hogehoge
最初SpringのrestTemplateで考えていたんだけど、これ独自メソッドにどうやってやるんやろ?ってしばらく悩んだ結果、諦めてApacheのHttpClientにしてみた。。。
やりたいことは、
curl -X BAN http://localhost/hogehoge
これ。
Javaでやると、こんなんなった。
最初SpringのrestTemplateで考えていたんだけど、これ独自メソッドにどうやってやるんやろ?ってしばらく悩んだ結果、諦めてApacheのHttpClientにしてみた。。。
2015年1月10日土曜日
rbenvでruby2系の環境をつくる
CentOS 6系で試したメモ
#事前に入れておく yum install -y git gcc openssl-devel #rbenvを拾ってくる git clone https://github.com/sstephenson/rbenv.git ~/.rbenv # pathを通す echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile echo 'eval "$(rbenv init -)"' >> ~/.bash_profile #上記の読み込み exec $SHELL -l #rbenvの動作確認 rbenv -v #ruby-buildの導入 git clone https://github.com/sstephenson/ruby-build.git~/.rbenv/plugins/ruby-build cd ~/.rbenv/plugins/ruby-build #install 可能リスト rbenv install --list #2.1.2のinstall rbenv install -v 2.1.2 #再読み込み rbenv rehash #設定 rbenv global 2.1.2 #確認 ruby -v
2015年1月9日金曜日
Sinatraでechoサーバー
rubyが入ってるmacにて。
sinatraの仕様はこちらを参考にしました
http://qiita.com/mechamogera/items/9c620155e669b394d513
5分でできますね。(^^)
sinatraのinnstall
gem install sinatra --no-ri --no-rdoc -V
echo.rb
require 'sinatra'
get '/hoge' do
http_headers = request.env.select { |k, v| k.start_with?('HTTP_') }
p "#{http_headers}"
起動コマンド
ruby -rubygems ./echo.rb -o 127.0.0.1 -p 10000 &
動作確認
http://127.0.0.1:10000/hogeにGETでアクセス
sinatraの仕様はこちらを参考にしました
http://qiita.com/mechamogera/items/9c620155e669b394d513
5分でできますね。(^^)
2015年1月6日火曜日
Macで、apache + phpの環境をつくる
MacPortsでちょーざっくり
他必要なものがあったら入れる
(sudo port list php53-* ででてくるものとか)
phpとapacheとhandler入れる
sudo port install php53 apache2
sudo port install php53-apache2handler
他必要なものがあったら入れる
(sudo port list php53-* ででてくるものとか)
apacheにモジュール読み込ませる
cd /opt/local/apache2/modules
sudo /opt/local/apache2/bin/apxs -a -e -n php5 mod_php53.so
httpd.confに追加
#phpのtypeを追加
AddType application/x-httpd-php .php
Include conf/extra/httpd-vhosts.conf
Include conf/extra/mod_php53.conf
DirectoryIndex index.html index.php
httpd-vhosts.confに最低限の設定を
<VirtualHost *:80>
DocumentRoot "/opt/local/apache2/htdocs"
ServerName localhost
</VirtualHost>
php.iniを環境にあわせて編集
sudo ln /opt/local/bin/php53 /opt/local/bin/php
sudo cp /opt/local/etc/php53/php.ini-development /opt/local/etc/php53/php.ini
sudo vim /opt/local/etc/php53/php.ini
適当に
apache起動
sudo /opt/local/apache2/bin/apachectl start
動作確認
sudo vim /opt/local/apache2/htdocs/info.php
$ cat /opt/local/apache2/htdocs/info.php
<?php
phpinfo();
?>
ブラウザで、 http://localhost/info.php
2015年1月5日月曜日
PHPはじめてなJava屋のチートシート
コメント
- /
- /** ~ */
メソッド
- private メソッドの名前
- アンダースコアからのキャメル
- ex) _buildHoge() { }
演算子
- ::(ダブルコロン)
- static,定数,オーバーライドしたクラスのプロパティやメソッドに対してアクセス
- ->(アロー演算子)
- オブジェクトのメンバにアクセス
- ex) $this->(メソッド) // 自クラスのメソッド、変数にアクセス
- ===(厳密な比較)
- .(文字列結合)
- .= (文字列結合代入)
- $hoge = "aaa";$hoge .= "bbb!"; // $hoge は、"aaabbb" となる
モジュール
- defined()
- 指定した定数が存在しているかの確認
- ex)bool defined ( string $name )
- 定義するのは、define("A_B_C","className");
TIPS
- フィールドへのアクセス等は$this->
- private $_hoge = '';
- $this->_hoge = "aaa";
- とか
- new クラス名してないのになんか使われてるっぽい
- new ReflectionClass(クラス名)になってた
- error_log() : 標準のエラーログ関数
- ドコに吐かれるかは、php.iniで定義
参考にしてみたもの
Zend Framework PHP 標準コーディング規約
http://framework.zend.com/manual/1.12/ja/coding-standard.html
ほかGoogle先生
登録:
投稿 (Atom)