httpd 2.4.33のmod_sslでLibreSSL 2.7以上を使うときのパッチ

httpdのバージョンが上がったらそのうち対応されて直ると思いますが
それまでは使えると思うのでメモっておきます。

具体的には次のようなエラーがでた場合の対処です。

LibreSSLのopenssl/dh.hでDH_set0_pqgが宣言されているのに
mod_sslのssl_engine_init.cでDH_set0_pqgがstaticで実装されていて合っていないというエラーです。

このDH_set0_pqgという関数はOpenSSL1.1未満では実装されていないため、
mod_sslはOpenSSLが1.1未満の場合に自前の実装を使うようになっています。

プリプロセッサ的にはMODSSL_USE_OPENSSL_PRE_1_1_APIがONになっていれば
mod_ssl側でDH_set0_pqgを実装する形です。

このMODSSL_USE_OPENSSL_PRE_1_1_APIはLibreSSLを使うとONになるようになっているため
DH_set0_pqgが実装されたLibreSSL 2.7以降と合わせると不整合という状態になってしまいます。
(LibreSSLは基本的にOpenSSL 1.0.1ベースだが、LibreSSL 2.7でOpenSSL 1.0.2や1.1.0の機能がいくらか追加された)

対処としてはmod_ssl側の実装を削除してしまうだけです。

mod_sslとLibreSSLでは微妙に実装内容が違うのですが、きっとLibreSSL側の実装の方が信用できる。
mod_sslの方が信用できるよ派の人はssl_engine_init.c内のDH_set0_pqgを適当にリネームでもすればよいと思います。

あと私はApacheよりNginx派です。

[PHP]Seleniumを使ってみよう(2)

福岡拠点の野田です。
前回「Seleniumを使ってみよう(1)」では、Selenium サーバーを立ち上げるところまで実施しました。
https://blog-s.xchange.jp/?p=418

今回はその続きです。
弊社では、PHPを使うことが多いので、その例を紹介します。
PHPがローカル環境にない方は、さくっとインストールしてください(環境変数にパスを通すのも忘れずお願いします)。
http://www.php.net/downloads.php

composerが入っていなかったら、インストールします。
https://getcomposer.org/doc/00-intro.md#installation-windows

任意のフォルダにcomposer.jsonを配置します。

facebook/webdriverは、curl関数を使うため、php_curlのエクステンションを有効にします。ほかにスクリーンショットの編集等でgdライブラリを使う場合がありますので、php_gd2のエクステンションを有効にします。

ちなみに php.ini のある場所は、php -i で表示することができます。

cmd でDOSのターミナルを開いてcomposer.jsonを配置したフォルダでcomposer update を実行してください。必要なライブラリをインストールします。これでSeleniumを使ってテストを実行する準備が整いました。

サンプルコードを以下にアップしています。

https://github.com/nodat/php-selenium-tools

processor.php と scenario.yaml を composer.json のフォルダに配置してください。

以下のようなバッチを作成して実行することで動きます。

まだまだ粗削りですが、scenario.yaml を作りこんでいくことで E2E のテストを実現することができます(適宜、バージョンアップしていきます)。
細かい処理については、ソースコードを解析して見てください。

[PHP]Seleniumを使ってみよう(1)

福岡拠点の野田です。今回は、Seleniumを使った自動テストをやろうということでSeleniumの環境構築まで紹介しようと思います。

SeleniumはJavaで動かすことができます。Javaがインストールされていない環境では、JRE(ランタイム、単体実行向け)もしくはJDK(開発者向け)をインストールする必要があります。

Java SE Runtime Environment 8 Downloads
http://www.oracle.com/technetwork/java/javase/downloads/jre8-downloads-2133155.html

各環境にあったファイルをダウンロードしてインストールしてください。

続いてSeleniumサーバーをダウンロードします。

https://www.seleniumhq.org/download/

Seleniumはサーバーとブラウザを操作するWEBドライバーの組み合わせ動きます。

まずは、Selenium Standalone Serverをダウンロードします。ダウンロードしたファイルを任意のフォルダに配置します。

あとは以下のドライバーをダウンロードして、上記と同じフォルダに放り込みます。

The Internet Explorer Driver Server (IEを操作。IEDriverServer.exe)
※SeleniumのサイトよりDL

Mozilla GeckoDriver (Firefox を操作。geckodriver.exe)
https://github.com/mozilla/geckodriver/releases

Google Chrome Driver (Chromeを操作。chromedriver.exe)
https://sites.google.com/a/chromium.org/chromedriver/

起動するには、仮に server.bat として以下のような内容でバッチを作成します。

※上記は、IE + Chrome を指定する例

server.bat をダブルクリックするとSeleniumサーバーを起動することができます。

続き:https://blog-s.xchange.jp/?p=424

FlashプレイヤーインストールでIPが変わった話

開発環境のサイトにアクセスができなくなり、解決した方法です。

皆さんももしかしたら同じ現象に陥るかもしれませんので、ご参考まで。

 

昨日までアクセスできていたのに、本日開発環境にアクセスできなくなりました。

URLをたたくとぐるぐる回り、どのページにアクセスしても同じ状態です。

他の人に聞いてみると、アクセスできるとの事。

何かネットワーク設定が変わってしまったのではと思い、PCのグローバルIPを確認してみると、見たことのないIPが表示されています。

結果として、

Flashプレイヤーインストール時に同時に知らぬ間にインストールされていたMcAfeeが原因でした。

McAfeeの関連アプリをアンインストールしたところグローバルIPが元に戻り、開発環境にアクセスできるようになりました。

【Python】pandasを利用した文字検索の方法と性能比較

東京拠点 本橋です

私の行っているプロジェクトでは開発言語の一部にPythonを使用しています。
csvなどの表形式データを処理するのにpandasライブラリはとても便利ですね。
そしてpandasを使ってSQLと同じように検索をする事が多いと思います。

「pandasで使って文字データに対する曖昧検索の処理をしたい。
けど、どうすればいいの?」

という事があったので検証してみました。

 

pandasにも曖昧検索用に以下の関数が用意されています。
 ①・match(正規表現)
 ②・contains(正規表現)
 ③・contains(検索文字)

どれを選べば良いのでしょうか・・・
技術検証を兼ねて調査してみました。

①match関数を使って正規表現で検索
 pettern = ‘.*’ + 【検索したい文字列】 + ‘.*’
 df_1[df_1[‘文字データ項目’].str.match(pettern)]

②contains関数を使って正規表現で検索
 pettern = u'(^(?=.*’ + 【検索したい文字列】 + ‘))’
 df_1[df_1[‘文字データ項目’].str.contains(pettern)]

③contains関数を使って検索文字のみで検索
 df_1[df_1[‘文字データ項目’].str.contains(【検索したい文字列】)]

・性能比較

 データ量:50項目20万行の中から80行のデータ抽出に対して実施

・結果

 ①・match(正規表現) ・・・・ 133ms
 ②・contains(正規表現)・・・・ 156ms
 ③・contains(検索文字)・・・・  96ms

containsは曖昧検索にも対応している関数なので
わざわざ正規表現にすることでかなり遅くなるようです
今回は正規表現で難しい事をしたいわけでもないので、
contains(検索文字)を採用!

運動不足なITエンジニアのマラソン奮闘記

はいさ~い!沖縄開発部の佐久本です。
沖縄は少しずつ寒さもなくなり、過ごしやすい季節となりました。

IT業界は運動不足な人が多いイメージですが、私の趣味はマラソンです。
過去にはフルマラソン完走経験もありますが、最近走るのはサボっています。

練習していない中、マラソン大会にはちゃっかりと参加していますが、
走り終わった後に、もっと練習しておけばよかったと後悔します。

今回はIT企業らしくなく、技術的な話ではありませんが、
沖縄で参加した方が良いマラソンイベントを紹介します。
※離島のマラソンには参加していないので偏った意見ですが・・・

(1)NAHAマラソン
沖縄で一番有名ではないかと思うNAHAマラソンです。
毎年12月に約3万人も人が参加する大きなイベントです。

沿道の方の応援も多く、7キロ付近で西城秀樹のYMCAが流れて
みんなで走りながらYMCAをやるという奇妙な空間があります(笑)
最初に参加したときは、恥ずかしながらやってましたが、今では違和感なくやっています(笑)
コスプレをしている人もたくさん居て、走りつつも見て楽しむマラソンだと思います。

個人的には12月の暑いマラソンとなるため、完走が難しいです。
過去に4回出てますが、完走は1回しかしていません。
ちゃんと練習してないからだと思いますが・・・

那覇マラソン公式サイト
http://www.naha-marathon.jp/

(2)尚巴志ハーフマラソン
次は、毎年11月頃に行われる尚巴志ハーフマラソンです。

NAHAマラソンのように華やかなマラソンではありませんが、
新里坂(シンザトビラ)という山登りをしているような勾配のある坂と
ニライカナイ橋という海がよく見えるポイントがあります。
綺麗な海の景色を見ながら走るマラソンは格別です!!!

あまり海が見えている写真が無かったのですが、オーシャンビューを楽しむことができるはずです。。。

尚巴志ハーフマラソン公式サイト
http://www.shouhashi.jp/

(3)あやはし海中ロードレース
次は、毎年4月頃に行われるあやはし海中ロードレース(ハーフマラソン)です。

こちらは東洋一の全長4.7Kmの「海中道路」(大きな橋)を渡るマラソンとなります。

NAHAマラソンや尚巴志ハーフマラソンに比べて平坦なコースで、
橋から眺める海の景色や磯のかおり感じながら走ることができるマラソンになります。
楽しく海をゆっくり眺めながら走りたい方におすすめのマラソンです。

あやはし海中ロードレース公式サイト
http://www.i-sam.co.jp/ayahashi_roadrace/

ということで、おすすめのマラソンイベント3つを紹介しました。
もし、沖縄でマラソンイベントに参加したい方が居れば、ぜひ参加してみてください。

技術的な話も今後は書いていきたいと思いますが、
沖縄の面白いところもどんどんアップしていきたいと思いますので、ご期待ください。

君はマーティン・ファウラーを知っているかい?

いかがお過ごしでしょうか。福岡拠点の野田です。
春は新しい生活がはじまる季節です。初心に返って今日はマーティン・ファウラーの話を少し。

ソフトウェアの設計の世界でマーティン・ファウラーを知らない人はいないと思います。ThoughtWorksに所属し、アジャイルソフトウェア開発宣言の起草を支援するなど、ソフトウェア開発業界に数多くの影響を与えている人です。

https://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%83%BB%E3%83%95%E3%82%A1%E3%82%A6%E3%83%A9%E3%83%BC

私がマーティン・ファウラーを初めて知ったのは、2005,6年ごろ依存性注入(DI: Dependency Injection)が話題になったころ。今では多くのフレームワークに採用され、当たり前となった概念も当時は目からうろこでした。

http://kakutani.com/trans/fowler/injection.html
https://ja.wikipedia.org/wiki/%E4%BE%9D%E5%AD%98%E6%80%A7%E3%81%AE%E6%B3%A8%E5%85%A5

DDDで基本となるValueObjectをPoEAAで紹介していたり、マイクロサービスについて語っていたり、設計の世界では伝道師的な存在だと思っています。

http://kimitok.hateblo.jp/entry/2014/11/09/211820
https://martinfowler.com/bliki/ValueObject.html

まだ知らなかった方はこれを機会に是非記事を読んでみてください。発表されてから時間の経つものが少なくないですが、いまでも通用するものが数多くあります。

気になる本家サイトは、こちら。

https://martinfowler.com/

英語サイトの日本語訳をやっている方々もいらっしゃいますので、ご参考まで。

http://bliki-ja.github.io/

 

OpenGLが使うピクセルフォーマット

WindowsアプリでOpenGLを使ってプログラムを組む時の初期化処理の一環で、次のようにピクセルフォーマットを設定してやる必要があります。これを紹介しているサイトはいくつも見つかりますが、これが一体なにを示しているのか?まで解説しているところがないので調べてみました。

この部分って定型になっていて、気にしなくてもOpenGLプログラミングできますが、一度気になると調べたくなる性分なので仕方ない。

ここで使っているAPIの1つ目はChoosePixelFormat()です。このAPIはアプリを動作させるPC上で使用可能なピクセルフォーマットの番号を返してくれます。第一引数のhDCにはOpenGLで描画するウィンドウのデバイスコンテキストを指定します。第二引数のpfdにはPIXELFORMATDESCRIPTOR 変数のアドレスを指定します。前処理として、このPIXELFORMATDESCRIPTOR のメンバ変数に値を設定してやる必要があります。

nSize
PIXELFORMATDESCRIPTORのサイズ。Windows APIでよくやる手法です。nVersion
絶対1です。

dwFlags
ここで使用目的を指定します。OpenGLではこうです。
(0x01)PFD_DOUBLEBUFFER – ダブルバッファリングで描画高速化
(0x04)PFD_DRAW_TO_WINDOW – ウィンドウに対する描画
(0x20)PFD_SUPPORT_OPENGL – OpenGLサポート

iPixelType
PFD_TYPE_RGBAでRGBAでの使用を宣言します。
もう一つPDF_TYPE_COLORINDEXがありますが、こちらは使いません。

cColorBits
使用する色のビット数を指定します。
8bit – 白黒
24bit – RGB(赤緑青)
32bit – RGBA(赤緑青+透明度)

これを実行すると入力に応じて適切な番号が返ってくるので、これをSetPixcelFormat()に渡してデバイスコンテキストが使用するピクセルフォーマットとして設定するわけです。

ちなみにそのPCでどのようなピクセルフォーマットが使用可能かを取得するAPIも存在します。

DescribePixelFormat(hDC, 0, 0, NULL);でそのPCにあるピクセルフォーマットの個数が返ります。あとは第二引数にその番号を入れてやれば情報を取得することができます。ChoosePixelFormat() で帰ってきた番号を入れることで、OpenGLで使うピクセルフォーマットの内容も分かります。私の環境ではこうなっていました。

おじさんがソロキャンプツーリング行ってきた~道志渓谷キャンプ場~

2018年3月17日

天気は晴れ、少し寒いけど念願の初めてのキャンプツーリングに出発!

行先はここ↓

道志渓谷キャンプ場

この日のためにひと月以上前からキャンプ用品を揃えたりデイキャンプをしたりなど、

着々と準備を進めてきました。

 

キャンプ場までは約90Km

初めてのキャンプ、初めての積載(ブログに載せるつもりなかったので積載しているバイクの写真はないです。。)で高速なんて使えるわけないだろ!

ということで僕はおとなしく下道を走るのでした。

目的地までの道のり

 

今回の目標は以下の4つ

①焚火を楽しむ

②食事を楽しむ

③星空を楽しむ

④無事に家に帰る

やっぱり焚火だけはどうしてもやりたい!

ただ、最初っからやりたいこと多すぎるかな、と思いつつ二回ほどコンビニに立ち寄り

食事と買い物を済ませいざキャンプ地へ!

 

キャンプ地到着

この上の写真の右のほうに屋根が写ってますがここが管理棟。

バイク止めてまずは携帯の電波確認! うん、ちゃんと4Gでつながる。

なにかあったときのためにも電波はつながるかちゃんと確認しておかないとね。

そんなことしていたら中から管理人のおばさんがでてきてそのまま受付へ。

バイクは一泊1000円(3月は温泉でないのでいつもより500円安いらしい)という

超激安価格になっていて最近キャンプ道具揃えて散財している身としては

大変うれしい設定となっています。

(たいてい車料金とバイク料金でわかれていてバイクのほうが若干安い。)

お金払って注意事項の確認。

川サイドか山サイドか好きなとこにテントはってね

と言われたので川見ながら過ごしたかったので川のほうへ降りて行ってテント設営開始。

デイキャンプの成果見せてやる!

と張り切ってテント設営しようとしたはいいけれど風が思いのほか強く難航。

そして…

なんとか設営完了。

山のせいで日陰になってるけど目の前が川という絶好のロケーション!

テント設営後は近くを散歩したりのんびり川を見つつコーヒーを飲んで音楽を聴いて、

とても贅沢なひと時を過ごしました。

 

今回最大の目標を達成

17:00を過ぎるころにはあたりは暗くなりはじめ、だんだんと寒さが増してきて。

ただし、寒さと引き換えに風が止んだ!

早速管理棟で薪を買ってきて焚火の準備。

この日のために焚火の起こし方を調べてきたけど実践は初めてで

ドキドキしながら火起こし。

なんとか火起こしできて夕飯のカレーめんを堪能

18:00に焚火を開始して約2時間30分後、最後の薪がなくなり終了。

焚火を囲んでご飯を食べながら星空を見る、

というこれまたとてつもない贅沢な経験ができました。

 

さらば、キャンプ地!

焚火が終わるとやることもなくなり、テントに入り就寝。

まだ21:00なので寝れるはずないですが、寝袋にくるまれながら暗闇を楽しみます。

寝ては起きてを繰り返し、想像以上の寒さに震えつつもあっという間に朝を迎え

6:00から朝食をとりつつまったり過ごす。

朝食が終わり、ぼちぼち撤収の準備を始めていると山から太陽が!

それまで明るくても肌寒かったのですが一気に暖かくなり

それまでの寒さを吹き飛ばしてくれました。

撤収作業を中断し、しばしの日光浴。

30分ほど経過し撤収作業再開!

8:30ごろキャンプ地を出発し自宅へ帰るのでした。

 

感想

行くまではどうなることかわからず、楽しさ半分不安半分でしたが

実際についてみたら楽しさしかなかったです。

積載の問題でかなり行き帰りの運転がしずらかったので

これは次回の改善点ですね。

目標も達成できて、想像以上に贅沢な時間を過ごすことができてとても幸せでした。

近いうちに今度は桜を目的にキャンプ行ってきたいと思います。

VPSサーバーのリソース不足を回避する方法

福岡拠点の野田です。もうすぐ花見の季節ですね。来週か再来週あたり、お昼休みの合間を縫って花見に行きたいと思っています。

さて、今日は、仮想サーバーのリソース状況について話をしようと思います。
皆さんは、VPS環境で以下のような画面を見たことがありますでしょうか。開発用だったり、低予算の貧弱な環境では、結構こういう場面に遭遇することもあります。

上記は、composer を実行した際に発生したエラーです。このエラーがでたあと、httpd をいったん停止してから実行すると普通に実行できたりします。これは、仮想サーバーのリソースが不足するために発生しているエラーになります。こういうときは、都度、エラーが出るたび、httpdを止めて、ということをしなければいけないのでしょうか。

仮想サーバのリソース状況をチェックするには以下のようなコマンドがあります。

この中のprivvmpagesという値に注目します。これは、プライベート仮想メモリサイズです。リソースを解放するためには、httpd など消費リソースが大きいサービスを再起動するとリソースが解放されます。

以下は、リソース情報をチェックし、閾値を越えてリソースが足りない状態になると httpd サーバーを再起動するスクリプトになります。

/root/bin/restart.sh

シェルを毎分 cron 実行したら、リソースがないときは、httpdを再起動して、適宜、リソースが解放されるという仕組みです。

ちなみに800 というのはなんとなくの感覚値です(・ω<) 。某VPSサーバーでは、httpd を再起動すると 3000 くらいまで回復します。300 とか切るとセグメンテーションエラーとかメモリ関連のエラーがよく発生します。

これでサーバーのリソース不足でエラーとなるイライラも収まるでしょう。それでは、Have a nice server life!