ロックオン開発チームブログ -Lockon Knowledge Repositories-

FirefoxのアドオンJetPackを試す

どうも、ソリューションチームの中西です。

Firefoxのアドオンとして発表されたJetpackが話題になっているようですのでちょっと遊んでみます。

JetpackはFirefoxのアドオンを作りやすくするアドオンです。

JavaScriptライブラリのJQueryで作成することができます。
とりあえずJetpackをインストールします。
下記サイトのGetStartedをクリックしてからFirefoxを再起動してください。

https://jetpack.mozillalabs.com/
dcnjfm9c_83dnprqsdn_b.png
インストールされたらさっそく試してみましょう。

ロケーションバーに about:jetpack と入力してください。

Jetpackの設定画面が表示されます。

ここではJetpack開発のチュートリアルやらインストールされているJetpackスクリプトの管理、そして開発が行えます。

dcnjfm9c_85ggzcr9cz_b.png
Developタブを押すとエディタ上で開発が行えます。

「try out this code」の部分を押せばすぐに動作確認できます。

dcnjfm9c_86gfmbqfcb_b.png
開発する場合はFirebugがあった方が良いです。



では、そろそろ開発を。

まずはお約束Hello,Worldから。

----------------------------------


$(function(){

  jetpack.statusBar.append({

  onReady: function(doc){

  jetpack.notifications.show("Hello , Jetpack");

}

 });

});


----------------------------------

実行するとお約束な文字列が表示されます。



もうちょっと色々さわってみます。

ステータスバーにロックオンが誇るEbisのマスコットのエビス君のアイコンを表示させてみましょう。

そしてエビス君をクリックするとHello,Ebisと表示させるようにします。



----------------------------------


$(function(){

jetpack.statusBar.append({

//エビス君のアイコンを表示させる。

html: '< img src="http://www.ebis.ne.jp/favicon.ico" alt="" width="20" height="20" />',

width: 20 ,

//クリックするとメッセージを表示させる。

onReady: function(doc){

$(doc).find("img").click(function(){

jetpack.notifications.show("Hello ,Jetpack");

});

}

});

});


----------------------------------



と、まあ、こんな感じで比較的簡単にFirefoxに機能を追加することができます。

かなりお気軽に拡張機能が作れるようになっていますので皆様もアドオン開発にじゃんじゃんチャレンジしてください。
 
じつは恥ずかしながらJQueryを触った事が無かったのでJQueryで戸惑いました…

ついでにJQueryも勉強します。

Boots C++でspiritを利用しての構文解析

こんにちは、にゃんです。
 
今回は構文解析について少しだけお話ししたいと思います。
 
構文解析というと、難しくとらえがちですが
ライブラリやツールを使用することで簡単に実装ができます。
 
実際の利用に近いソースを記述するとわかりにくくなるので
構文解析の手法を学ぶための単純なソースを記述します。
 
少し改造を行うだけでもcsv解析などはすぐに作成できるでしょう。
機会があれば、そのあたりも紹介したいと思います。
 
使用する言語はC++です。
今回はboostライブラリーを使用して構文解析を行います。
 
boostライブラリについては多くのサイトで紹介されていますが
その中で今回は「spirit」についてです。
 
どのようなライブラリかと言うと文字列解析(構文解析)等に用いられます。
一般的にはyaccなどで作成したファイルを流用することが多いのですが
設定が面倒なので にゃんは、boostライブラリで解析を行っています。
 
さっそく簡単な構文解析をおこなってみましょう。
スペース区切りでデータを分解してくれるプログラムです。
 
-----------------------------------------------------

#include <string>
#include<boost/spirit.hpp>

using namespace
std;
using namespace
boost::spirit;

void out(char const*p1, char const*p2) {
cout << p1 << endl;
}

struct Test :public grammar<Test>{
template
<typename T>
struct
definition{
rule<T> expr, data;
definition(const Test& self){
expr = data | ch_p('\n');
data = (*alnum_p)[&out];
}

const
rule<T>& start() const{
return
expr;
}
};

};

int main(){
Test test;
string str = "表示 用文 字列";
parse(str.c_str(),test,space_p | ch_p('\n'));
return
0;
}


-----------------------------------------------------
 
簡単に解説を行いますと、boostで定義されているgrammarクラスをTestクラスが継承し、
その中に解析ルールを記述します。
 
expr = data | ch_p('\n');
data = (*alnum_p)[&out];
 
こちらが解析ルールとなります。
 
BNF等で解析ルールを説明するのが良いのですが、今回はスペース区切りで
解析を行うので必要ないでしょう。
 
exprはdataか改行というルールとなります。
dataは「alnum_p」が英数字と数値を意味し「*alnum_p」で*をつけることにより複数の文字を意味します。
(*alnum_p)[&out];で解析結果をout関数へ送ることができます。
 
Boostライブラリーはこのように、扱いさえ覚えれば非常に有効なものですので
皆様もぜひ触ってみてください。

C++のnew,deleteのオーバーライド

こんにちは。
にゃん と申します。

今までの開発ブログではないネタを書きます。
いまさらC++です!

もともと、にゃんはC言語,C++系でDirectX等を学んでいましたので
このようなネタが中心となります。

皆様はC++にはnewとdeleteをオーバーライドができるのをご存知でしょうか?
余り使用されていませんが今回はnewとdeleteのオーバーライドの一例を
ご紹介させていただきたいと思います。
先にソースを記述します。
//////////ここからソース//////////
'> 1 : #include <stdio.h>
2 :
3 : // 確保する配列の個数
4 : #define MEMORY_ERIA 10
5 :
6 :
7 : class Test{
8 : private:
9 : // newで使用されるメモリー領域
10 : static Test gm_Memory[MEMORY_ERIA];
11 : // 使用されている個数
12 : static unsigned int gm_useMemory;
13 : // 使用フラグ
14 : bool m_use;
15 : public:
16 : // コンストラクタ
17 : Test(){
18 : }
19 : // デストラクタ
20 : ~Test(){
21 : }
22 : // newのオーバーライド
23 : void* operator new(size_t t){
24 : gm_useMemory++;
25 : for( int i = 0; i < MEMORY_ERIA; i++ ){
26 : if( !gm_Memory[ i ].m_use ){
27 : gm_Memory[ i ].m_use = true;
28 : return &gm_Memory[ i ];
29 : }
30 : }
31 : return NULL;
32 : }
33 : // deleteのオーバーライド
34 : void operator delete(void* test){
35 : ((Test*)test)->m_use = false;
36 : gm_useMemory--;
37 : }
38 : };
39 :
40 : // newで使用されるメモリー領域
41 : Test Test::gm_Memory[MEMORY_ERIA] = {};
42 : // 使用されている個数
43 : unsigned int Test::gm_useMemory = 0;
44 :
45 : int main(){
46 : // データを確保
47 : Test* data[MEMORY_ERIA];
48 : // 初期化
49 : for(int i=0;i<MEMORY_ERIA;i++){
50 : data[i]=new Test();
51 : }
52 : // 偶数番目を削除
53 : for(int i=0;i<MEMORY_ERIA;i++){
54 : if( i % 2 == 0 ){
55 : delete data[i];
56 : data[i] = NULL;
57 : }
58 : }
59 : return 0;
60 : }
//////////ここまでソース//////////
以上がソースとなりますがこのプログラムの特徴は
  newを行っていても不特定のメモリーが確保されない。
  newを行える最大領域が決定している。
  operatorを駆使することで配列アクセスを可能となる。
  deleteでの解放処理が簡易であるため構想に動作する。
  メモリーマップを見るデバッグが容易である。
その他にもさまざまですが主な特徴となります。

ソースコードの量に対し説明する項目が少ないですが
10、12行目でグローバル変数を定義しています。
これらがnew,delete時に使用される配列となります。
defineで「MEMORY_ERIA」を定義し最大確保数を決定しています。
14行目の「m_use」で現在のメモリーが使用されているかの判定を行います。
newを置こうと「m_use」が「true」になりdeleteを行うと「false」になります。
したがってprivate宣言となっていますがこれは各内部関数からでも不用意に変更してはダメな
ローカル変数となります。

23行目からのnewのオーバーライド部分ですがgm_Memory変数配列からm_use
が使用されていない部分を探しポインターを返しているだけとなります。
34行目のdeleteはさらに単純で「void*」が引数に存在するのでこれをクラス名で
キャストを行い、m_useのフラグを「false」に変更するだけです。
これらがnew,deleteのオーバーライドに対する説明となります。

では、どのようなシステムに流用できるかですが、
今回のソースはnew,deleteのオーバーライドを実装するためだけのソースですが
これらを改良し、にゃんは主にタスクリスト(連結リスト)に使用しています。
その他に配列数が固定のスタック等にも応用可能かもしれません。

機会があれば応用編も行いたいと思います。
ソースコードの量が肥大化しすぎるため苦しいかもしれませんが
では、またお会いしましょう
にゃんでした。

PHPでopenSSLが有効でないとハマるとき

PEARのHTTP_RequestやHTTP_Clientで、通常のHTTPなら返ってくるのですが、SSLサイトを取りに行こうとすると、中身が返ってこないという現象に遭遇しました。
 
 
ブラウザで叩くとしっかり存在します。

試しにfopenやfile_get_contetnsで開こうと思ってもダメ。

というところまできて、php.iniの設定を洗ってみたところ、やっぱPHPのインストール時にミスっていてopenSSLが有効になっていないことに気づきました。

--with-openssl=[dir]
が通っていないときは、無言で返ってくるようです。
 
 
ってことで、PHPでSSLが?ってときは、OpenSSLが組み込まれているか、真っ先に確認すると幸せになれそうです。(・∀・)

Rubyで顔認識

こんにちは。
ロックオンの中西です。

久しぶりに開発ブログを書きます。

今回はRubyで画像内の人物の顔の認識を行いたいと思います。

最近、社内で「攻殻機動隊」がちょっと流行っているので「笑い男」にならってやってみました。

でも、人気があるのかネットで検索したら同じ様な事してる人はかなり多いですね。

Rubyと画像処理ライブラリのOpenCVを利用します。
こちら各環境に合わせてインストールしてください。また、Ruby画像処理の画像処理ライブラリのRMagickと
RubyのOpenCVを利用したの物体認識ライブラリのObjectdetectも用います。
これらはgemでインストールできます。



以下は顔を認識して四角形を描画するプログラムです。

require 'rubygems'

require 'RMagick'

require 'objectdetect'

#OpenCVのインストールディレクトリの中の顔認識のxmlを利用する
model_path = 'OpenCVのディレクトリ/opencv/haarcascades/haarcascade_frontalface_alt2.xml' # 要変更

#読み込むファイル名、実行時にファイル名を引数として与える

file = ARGV[0]

#顔の位置を検出

array_face_position = ObjectDetect::detect(model_path, file)
original_img = Magick::ImageList.new(file)

#四角形を書くための設定

square = Magick::Draw.new
square.stroke('green')
square.fill_opacity(0)
square.stroke_width(1)

#顔を検出するごとに四角形を描画する

array_face_position.each do |position|

x, y, width, height = position square.polyline(x,y,x+width,y,x+width,y+height,x,y+height,x,y)
square.draw(original_img)

end

#画像を出力、実行時に引数2として与える。固定でもいいけど。
original_img.write(ARGV[1]+'.jpg')

以下は顔認識の結果になります。
画像は採用ブログより引用しました。
lena_out.jpg


まずは画像処理といえばlenaさん。

問題なく検出できています。

test_out3.jpg


ひょうきんになった愛弟子。
おもしろ眼鏡着用でも問題ありません。

test_out6.jpg


ゲシュタルトの限界に迫った表情でも問題なく検出できます。

高性能。

test_out1.jpg


セクシーな表情は検出できず。。。

残念です。

とまあ、検出能力はこんな感じです。
目と口の位置が検出のポイントだと思います。

顔は複数あっても検出できます。



下にあるのは指定した画像を検出した顔に貼付けるプログラムです。

貼付けてるのは「笑い男マーク」じゃなく弊社のキャラクターのエビス君。
out_ebis.jpg

require'rubygems'

require 'RMagick'

require 'objectdetect'

model_path = 'OpenCVのディレクトリ/opencv/haarcascades/haarcascade_frontalface_alt2.xml' # 要変更

file = "test.jpg"
array_face_position = ObjectDetect::detect(model_path, file)
original_img = Magick::ImageList.new(file)

#合成する画像を読み込み

src_image = Magick::Image.read("ebis.png")[0]

#Drawインスタンス生成

draw_instance = Magick::Draw.new



#顔を検出したら画像を上書きする

array_face_position.each do |position|

x, y, width, height = position
draw_instance.composite(x-10,y-10,width+20,height+20,src_image,Magick::OverCompositeOp)
draw_instance.draw(original_img)

end



#画像を出力

original_img.write('out.jpg')




まだまだ本物には遠い感じですがプログラムってこういうこともできるよって事で。



参考:dara日記 「OpenCVで物体認識を行うRuby拡張ライブラリのソース」

Copyright(c) LOCKON CO.,LTD. All Rights Reserved.