Android用 FFmpeg を ビルド

タグ: | 投稿日: 投稿者:

お久しぶりです。
takeです。

今回は、FFmpeg-Android を centos6.5 でビルドするまでを記述したいと思います。

まず、必要なアイテムをダウンロードしてきます。

※NDKの展開等はここでは割愛します。

環境変数ANDROID_NDKを設定し、FFmpeg-Android ディレクトリ配下にある「FFmpeg-Anroid.sh」を起動(ビルド)します。
sudo ./FFmpeg-Android.sh

あれ?なんかANDROID_NDKの環境変数がうまく読み込めなくてエラーになってやがる。
しょうがないので、FFmpeg-Android.shを編集して、export ANDROID_NDK=xxxxx を追記。
で、またビルド!オラッ!!

途中のログで(たまたま見てた)、ccacheが無い!!とかエラーがでてたので、以下のコマンドでインストール。
sudo yum install --enablerepo=epel ccache
で、またビルド!オラッ!!

ログはあんまり見てなかったけど(すごい時間かかるので見てられない)、完走したので大丈夫かな?
意外とすんなりいけてびっくり!

次回は、今回作成したlibffmpeg.soを使用して、Androidアプリを作ってみたいと思います。

では。

Share on Google+Tweet about this on TwitterShare on StumbleUponShare on Facebook

Mac SafariのアドレスバーでReturnする前にリクエスト送信される件

タグ: , | 投稿日: 投稿者:

春うらら。

こんにちはベッチです。

MacユーザでSafariを利用されている方!

アドレスバーで直接URLを入力した時、Returnで確定する前にWebサーバにリクエストが送信されてしまっていた事に気づいていたでしょうか。

リクエストは送信されますがレスポンスで返ってきたhtmlはReturnで確定するまでブラウザに描画されないのでWebサーバのアクセスログをリアルタイムでみていないと気づかないんですけどね。

何が言いたいかというと、Webアプリ開発時に直接URL入力して検証したりする時に途中でキーボード入力をとめるとその段階のURLでリクエストが送信されたりしてすごいうざいんです。

で、その問題がようやくなおったとの事なんですが・・・

App_Store

私のマシンでは未だに問題が解決しません。

で、改めてSafariの設定をみたらあやしいところがあったので設定変更したら解決しました。

プライバシー

同じ悩み抱えていた方は設定を確認してみて下さい。

Share on Google+Tweet about this on TwitterShare on StumbleUponShare on Facebook

[git]stashコマンドで修正コードの一時退避

タグ: | 投稿日: 投稿者:

こんにちは、kikuです。

ソースコード管理に【git】を使ってますか?この記事を見てるということは使っているはずですね。
先日使ってみて便利だと思ったコマンドを紹介します。

ちょっとした作業している最中に、別ブランチでのちょっとした対応が割り込んできたり、、、ということはよくあることです。
作業中のコードがとても中途半端だったり、commitするまでも無いような状態だったりした時はすごい面倒くさくて困っちゃいますね。

そんな時はこれ!【git stash】です。

一時的に修正していた内容を退避することができます。
コマンドを叩くと、コードはHEADと同じ状態になります。
つまりHEADとの差分がなくなるということです。
その差分は【stash】に保存してくれますので安心してください。

HEADとの差分がなければ何も問題なくcheckoutできるので安心してできます。
そして退避したコードを復元させるには

【git stash pop】を使います。

pullした状態のコードに先ほど退避した差分コードを差し込みます。
これでまた作業再開できますね。

いろいろ便利なオプションがあるので少し紹介します。

まず基本的な退避(saveは省略可)

$ git stash save

stashにメッセージを付けたければ

$ git stash save "message"

退避リストを表示(stashは複数退避しておくことが可能です)

$ git stash list

listの表示例(stash@{0}はメッセージ有りで退避、stash@{1}はメッセージ無しで退避)

stash@{0}: On master: stash_test
stash@{1}: WIP on master: 8e4db62 Merge remote-tracking branch 'origin/master'

退避から戻してstashから消す

$ git stash pop

退避が複数あった場合は指定する。こちらも戻したstashは消える。

$ git stash pop stash@{1}

applyを使えばstashから消えない

$ git stash apply
$ git stash apply stash@{1}

stashから消す

$ git stash drop
$ git stash drop stash@{1}

stashからすべて消す

$ git stash clear

今回は非常にシンプルなオプションのみの紹介です。
他にもたくさんのオプションや、他のコマンドとの合わせ技などがありますが書ききれないので省略します。
是非チャンスがあれば活用してください。

Share on Google+Tweet about this on TwitterShare on StumbleUponShare on Facebook

スニペットつかおーよ

タグ: | 投稿日: 投稿者:

こんばんはベッチです。

今日はMacユーザ向けにオヌヌメのスニペット管理アプリの紹介です。
※Windowsとかは知りません。自分で探して下さい。

【スニペット管理アプリ】
Snippets

スニペット使っていない人は、スニペット管理アプリを使うと作業効率が格段にあがります。

<スニペットとは>
翻訳すると「断片」という意味です。
うん、全然わからないですね。
ここでいうスニペット管理とは、具体的にいうとプログラムを書いていてよく使うコードってありますよね?
これらの断片的なコードを登録し、使いたい時にすぐに引き出せる状態にする事をいいます。

sniptgistみたいなWebサービスで管理するという方法もありますが、ローカルのアプリで管理した方が必要な時の引き出しやすさが断然あがります。

登録済みのスニペットを探す場合、Mac OSのメニューバーにある本アプリのアイコンをクリックすると検索パネルが表示されるのでキーワードを入力するとヒットしたスニペットの一覧がズラッと表示されるので、目的のスニペットをクリックすると現在アクティブになっているアプリ内にそのテキストが貼付けられます。

この検索パネルの表示にはショートカットキーを割りあてられるので、キーボードだけで作業すると神になれます。

ちなみにスニペット管理はコードしか登録できないわけではなく、文字列なら何でも良いので、例えばメールとかでよく使う文言を登録するとかなり便利です。

こんな説明を聞いているより実際に使ってみたら相当便利ですので是非使ってみて下さい。

有料ですが今なら半額です!

スクリーンショット 2014-03-29 1.33.59

Share on Google+Tweet about this on TwitterShare on StumbleUponShare on Facebook

Gratuitous ARP

タグ: | 投稿日: 投稿者:

こんにちは。工藤です。
もうすぐ春ですね。春が過ぎると夏ですね。夏の後には秋がきて、やがて冬ですね。

「Gratuitous ARP」ってカタカナだと「グラチュータスアープ」と読むみたいです。
勝手に「グラシャスアープ」とかって覚えてました。スペイン語でありがとう「Gracias(グラシャス)」って全然違うじゃん。ありがたいarpってなんだって話です。

このGratuitous ARPは同じネットワーク内にIPアドレスの重複が発生しないかを確認するために使われます。この辺りは通常あまり意識しなくてもいいかもしれません。
もう一つ、IPの重複確認とは別にarpキャッシュなどを使用する機器「ホスト」「ルータ」「L3スイッチ」のarpテーブルを強制的に更新させる事もできます。
これらの機能を良く使用するのがVRRPなどですね。

ルータやL3スイッチの交換を実施する際に、このGratuitous ARPが威力を発揮します。例えばarpテーブルのキャッシュを300秒保持するスイッチなどがあった場合、ケーブルの差し替えだけではarpテーブルが更新されないため、通常は300秒待たないといけません。しかしこのGratuitous ARPを意図的に発行できれば、300秒待たずとも疎通を行う事ができます。

しかし使用法を誤った場合、同ネットワークのarpテーブルが狂い、正常な通信を阻害してしまう事にもつながります。そのため、通常は人為的な発行はせずに、機器が起動するタイミングやネットワークの再起動などを実施した際に自動的に発行されます。

具体的な方法についても書こうと思いましたが、面倒なのでまた別の機会にします。
機器の交換を実施する時は、時間はかかるが機器の再起動によるarpテーブル更新が一番確実ですね。

Share on Google+Tweet about this on TwitterShare on StumbleUponShare on Facebook

prestashop1.6 インストール

タグ: | 投稿日: 投稿者:

こんにちは最近オフィスが、やけに寒いなぁ~と思ったら冷房20℃に設定されてて驚愕したモリです。

今日のお題はPrestashopです!!

先日1.6がリリースされましたね!

という事で、今回も備忘録がてらにXAMPP環境にインストールする手順を書いていきたいと思います。

  • ZIPファイルを以下からダウンロード

PrestaShopサイト

1

  • 解凍したフォルダーをドキュメントルートに設置
  • バーチャルホスト設定(使用している場合のみ)

HOSTも忘れずに!

<VirtualHost *:80>
    ServerName local.www.prestashop_sample.com
    DocumentRoot "C:\pleiades\xampp\htdocs\prestashop_sample"
    <Directory "C:\pleiades\xampp\htdocs\prestashop_sample">
    AllowOverride All
    </Directory>
    ErrorLog logs/prestashop_sample.com_error.log
</VirtualHost>
  • インストール画面にアクセスする

5

  • ショップ情報情報を入力(変更可能)

7

  • データベース情報を入力

9

接続チェックをしてOKなら次へ

8

  • 完了までひたすら待つ!

10

  • インストール完了

11

  • インストールフォルダの名前変更または削除

※管理画面へアクセスする為にはInstallフォルダを削除または名前を変更する必要がある

(注意:adminフォルダの名前が自動採番で変更されます。

アクセスする場合は変更した名前でアクセスするようにしましょう

12

アクセス可能な状態の場合は以下のようにログイン画面が表示される

13

  • ログイン後のトップページ

14

デフォルトは英語になっている為、日本語に変更します。

1.5X系からGUIが結構変わっているので見つけづらいです。。。

  • その1

My preferences画面の『Language』項目をJapaneseに変更し『SAVE』

17

  • その2

デフォルトの言語を日本語に変更

地域画面の『Default country』『Default language』項目をJapanに変更して『保存』

18

以上がインストールの基本的な流れでした。

でわ、また!

Share on Google+Tweet about this on TwitterShare on StumbleUponShare on Facebook

オープンソースカンファレンスに行ってきたよ

タグ: , | 投稿日: 投稿者:

ニタです。

先日というか、だいぶ前になりましたが、オープンソースカンファレンス2014 Tokyo/Springの2日目に行ってきました。

途中、1日目も来ていたhosoくんと会い、いくつか同じセッションを聞いたりしました。
1日目の感想などは彼が書いてくれると思う(多分きっと)ので、2日目聞いたセッションについて。

業務アプリケーションにおけるモダンWeb開発の現状
本当は登壇者は3人いて、ああだこうだ喋る予定だったらしいのですが、1日目の夜に呑んだ結果、お一人でのセッションでした。

カンファレンスあるある。

で、今はnode.jsなフレームワークでの開発がモダンなWeb開発なので、yeomanを使うと便利だYO!ということでした。
WebSocketとかも勉強しておかないといけないようだし、モダンなフロント系開発もやること沢山あって面白そうですね。

つづいて、MySQLパラメーターチューニングの理屈と定石

my.cnf系の話がメインでしたが、テーブル設計での1レコードのデータサイズの見積もりしてメモリに載る容量計算して…。
MySQL、データベースも極めると際限がないなと感じつつも、細かなチューニングについて説明されており、勉強になりました。
パラメータを変えるだけでなく、クエリを見直すのも改善の一つだとも説明していました。
効率的なクエリを書けて、それに見合ったテーブル設計が求められるのだなと痛感しました。

DB系が続きますが、分散KVSとクラウドストレージ Riak & Riak CS
初心者向けMongoDBのキホン!

Riakは本家Bashoジャパンの社員の方が登壇され、Riakの基本的な機能説明でしたが、2.0および新製品のRiakCSに追加される、全文検索(コードネーム:yokozuna)は使えそうなのかと。

MongoDBも機能説明程度でしたが、NoSQLなDBではMongoが使いやすそうな印象でした。
とはいえ、トランザクション、スキーマ、JOINがないとか使いドコロ難しそうな印象も受けました。

セッション以外にも、様々なオープンソースなプロジェクトの展示もありました。
なかでもbaserCMSの管理画面は、開発側の手離れがしやすく、日本人が操作しやすいつくりになっていて、管理画面づくりの参考になりそうでした。
管理画面のトップページに、よく使う機能(新規投稿やコメント一覧表示など)のリンクが設けてあったり、確認画面をページ遷移せず、モーダルで表示させるなど、妙なところの痒いところに手が届くようなアイディアは関心しました。

Share on Google+Tweet about this on TwitterShare on StumbleUponShare on Facebook

LVMでVGを変更したら再起動後にKernel panicになった

タグ: | 投稿日: 投稿者:

こんにちは。工藤です。

Linuxのバックアップやリストアに便利ツール「Mondorescue」を使用する事が良くあり、P2Vなどに重宝したりする事もあるのですが、バックアップは簡単だけど、リストアってホント面倒だよね。
「リストアなんて事が発生しませんように!」
って毎回祈ってバックアップ取ってますから。

で、今回もハマったポイントについて。(CentOS版)

バックアップしたマシンとリストアするマシンが異なる場合などに起こり得やすい。
HDDのサイズなんかが異なっていて、手動でLVMを作成し、そこへバックアップデータをリストアした時なんかに特に注意。
grubのdevice.map、grub.confとかfstabとかmtabとかは比較的ちゃんと書き直すのですが、いざ起動しようと思うと

Volume Group not found

Kernel Panic

ってなってヤな感じです。ホント、起動中にコケるのが一番嫌いです。やる気が削がれ「あーーーーー」ってなるから。

で、気を取り直して問題解決へ。
Linuxの起動プロセスを考えるに、どうやらinitrdというヤツがキモらしい。
ここを変更したLVMの内容に書き換えなくてはならない。

Rescue CDなんかで起動させて、いつもの

# chroot /mnt/sysimage

やって

# cd /boot
# mkinitrd initrd-2.6.18-308.13.1.el5.img 2.6.18-308.13.1.el5
など実施し、initrdを再作成する。(もしアレならgrub-installしなおしても可)
そして再起動!

NGポイントがここだったらこれで回復。ここ以外だったらそれはまた別のお話。

Share on Google+Tweet about this on TwitterShare on StumbleUponShare on Facebook

OpenCvの顔認識で遊びました

タグ: | 投稿日: 投稿者:

OpenCVで顔認識を行って適当なところに目線も入れてみました。
モデルは弊社映像スタッフでございます。

結果として誤認識も結構ありますが、お手軽に作った割にはなかなかです。

これが動画

こちらが静止画

blogSample

ソースコード的にはこんな感じです。モルフォロジーしたりエッジを求めたら
精度が上がるかな?と思ったけれど見当違いでした。

#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <stdio.h>

main(int argc, char* argv[]) {
        char    haacFile[1024];
        memset(haacFile, 0x00, sizeof(haacFile));
        strcpy(haacFile, "haarcascade_frontalface_alt.xml");
        if(argc < 3){                 printf("Enter input video, and Output video file name.\n");                 return 2;         } else if(argc > 3){
                memset(haacFile, 0x00, sizeof(haacFile));
                strcpy(haacFile, argv[3]);
        }
        CvHaarClassifierCascade *cvHCC = (CvHaarClassifierCascade*)cvLoad(haacFile);
        if(cvHCC == NULL) return 1;
        CvMemStorage* cvMStr = cvCreateMemStorage(0);
//      cvNamedWindow("Example2_10", CV_WINDOW_AUTOSIZE);
        cvNamedWindow("FaceDetect", CV_WINDOW_AUTOSIZE);
        CvCapture *capture = cvCreateFileCapture(argv[1]);
        if(!capture){
                return -1;
        }
        IplImage *bgr_frame;
        double fps = cvGetCaptureProperty(capture, CV_CAP_PROP_FPS);
        printf("fps=%d\n", (int)fps);

        CvSize size = cvSize((int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH),
                        (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT));

        printf("frame (w, h) = (%d, %d)\n", size.width, size.height);

        CvVideoWriter *writer = cvCreateVideoWriter(argv[2], CV_FOURCC('D', 'X', '5', '0'), fps, size);

//      IplImage *canny_frame = cvCreateImage(size, IPL_DEPTH_8U, 1);
//      IplImage *temp = cvCreateImage(size, IPL_DEPTH_8U, 1);

        IplImage *gray_frame = cvCreateImage(size, IPL_DEPTH_8U, 1);
        while((bgr_frame = cvQueryFrame(capture)) != NULL){
                cvCvtColor(bgr_frame, gray_frame, CV_BGR2GRAY);
//              cvMorphologyEx(gray_frame, canny_frame, temp, NULL, CV_MOP_CLOSE, 1);
//              cvCanny(gray_frame, canny_frame, 60, 128, 3);
                CvSeq *face = cvHaarDetectObjects(gray_frame, cvHCC, cvMStr);
//              cvShowImage("Example2_10", bgr_frame);
                for (int i=0;i < face->total;i++){
                        CvRect *faceRect = (CvRect*)cvGetSeqElem(face, i);
                        cvRectangle(bgr_frame,
                                        cvPoint(faceRect->x, faceRect->y + ((faceRect->height / 10) * 2)),
                                        cvPoint(faceRect->x + faceRect->width, faceRect->y + ((faceRect->height / 10) * 6)),
                                        CV_RGB(0, 0 ,0), CV_FILLED, CV_AA);
                }
                cvShowImage("FaceDetect", bgr_frame);

                cvWriteToAVI(writer, bgr_frame);
                char c = cvWaitKey(10);
                if(c == 27) break;
        }
        cvReleaseVideoWriter(&writer);
        cvReleaseImage(&gray_frame);
//      cvReleaseImage(&canny_frame);
        cvReleaseCapture(&capture);
}

Share on Google+Tweet about this on TwitterShare on StumbleUponShare on Facebook

OOM killerを消極的方法で回避

タグ: , | 投稿日: 投稿者:

こんにちは工藤です。

Linuxの運用をしているとたまにやってくるoom-killer。
詳しい説明は割愛しますが、簡単に言うとメモリ不足が発生しシステムダウンを防ぐため、無差別にプロセスを殺してゆく機能です。不要なプロセスなら問題ないのですが(そもそも不要なら立ち上げないけど)重要なプロセスの場合は殺されてはたまったものではありません。いくらシステムダウンを防ぐためとはいえ、サービスの提供できないサーバなんか死んだも同然。本末転倒ですわ。

っつう事でoom-killerが発動する場合はそれはすでにシステムとして正常に稼働していない。という事にして、とっととシステムを再起動させます。その方がきっと傷口は小さくて済むはず。原因調査より復旧が優先だから!原因調査なんて賢い人がやってくれるハズです。

oomの発生時に直接再起動というプロセスは踏めないため、oom時にkernel panicになるように設定します。

/etc/sysctl.confに下記を追記しましょう。

vm.panic_on_oom=1

さらにいつも通りkernel panicになったら再起動するアレを入れておきます。

kernel.panic=60 (秒数はお好みで)

上記2行を追記したら

# sysctl -p

で適用します。

こうする事で、oom発動→kernel panic→再起動となります。

もう一度念のために

oomの原因調査は賢い人がやってくれるハズ!

Share on Google+Tweet about this on TwitterShare on StumbleUponShare on Facebook