【第5回】IBM Cloud と Raspberry Pi を用いたエアコン制御 ー Raspberry Pi の設定2

<目次>

  1. 初回概要
  2. IBM Cloud の設定
  3. LINE Platform の設定
  4. Raspberry Pi の設定
  5. Raspberry Pi の設定

今回は、Raspberry Pi におけるNode-RED・スピーカー・赤外線基盤の設定方法をご紹介します。

▼ Raspberry Pi の設定 ▼

< Node-REDのインストール >

1. 左上の黒い四角のアイコンをクリックし、ターミナルを開きます。

※ ターミナルは、コマンドという命令文を用いてRaspberry Pi の操作や設定を行う為のツール です。

2. 「sudo apt-get install nodered」コマンドを実行し、Node-REDをインストールします。

3. 「update-nodejs-and-nodered」コマンドを実行し、Node-REDを最新版にアップデートします。

4. 「sudo systemctl enable nodered.service」コマンドを実行し、Raspberry Pi 起動時に自動でNode-REDも起動するように設定します。

< Node-REDの設定 >

1. ターミナルにて、「cd $HOME/.node-red」「npm install node-red-contrib-scx-ibmiotapp」コマンドを実行し、Node-REDにIBM IoT Platform をインストールします。

※ うまくいかない場合「sudo npm install -g node-red-contrib-scx-ibmiotapp」コマンドを実行します。

以下、参考サイトです。Node-REDに他のパッケージを追加する方法が載っています。

Nodeの追加

2. 左上のラズベリーのアイコン→「プログラミング」 →「 Node-RED 」を選択し 、Node-RED を起動します。

3. ターミナル画面右上のURLをコピーします。

4. Webブラウザで先程のURLを開きます。このとき、開いたページがNode-REDの設定画面になります。

5. Node-RED設定画面の右上メニューより「読み込み」→「クリップボード」をクリックします。

6. 本投稿のページ最後に記載しているテキストをコピーします。

7. 先程のテキストを読み込み枠に貼り付け、「読み込み」をクリックします。

8. 読み込むと以下の画面が表示されます。

9. 「websocket out」をクリックし編集画面を開きます。

「URL」項目の「鉛筆マーク」をクリックします。

第2回 IBM Cloud の設定の際に決めた「ホスト名」を、<ホスト名>部分に入力します。

10. 「IBM IoT」をクリックし、「API Key」項目の「鉛筆マーク」をクリックします。

第2回 IBM Cloud の設定の際に表示された「APIキー」と「認証トークン」をそれぞれ「API Key」と「API Token」欄に入力する。

※ 大文字英語「O」と数字「0」の区別に注意。

11. 右上の「デプロイ」をクリックし、IBM Cloud との接続を確認します。

接続できている場合、「websocket in」,「 websoket out」,「IBM IoT」の下に接続済みが表示されます。

※ 上記の一つでも切断になっている場合は、どこかにエラーがあるので、7のステップからやり直してみてください。

< 音声機器のセットアップ >

1. ターミナルを開き、「sudo apt-get install swig3.0 python-pyaudio python3-pyaudio sox」コマンドを実行します。

2. 「pip install pyaudio」コマンドを実行します。

※ portaudioがないエラーが発生した場合:「sudo apt-get install portaudio19-dev」コマンドを実行し、再び「pip install pyaudio」コマンドを実行します。

3. 「sudo apt-get install libatlas-base-dev」コマンドを実行します。

< 音声機器の動作確認 >

1. 「aplay -l」コマンドを実行し、音声を発生する機器の「card」と「device」の数字をメモする。

2. 「arecord -l」コマンドを実行し、音声を聞き取る機器の「card」と「device」の数字をメモする。

3. 「nano ~/.asoundrc」コマンドを実行し、以下を入力します。

※ 但し、「playback.pcm」項目の「hw:」以降の数字は1で確認したcardとdeviceの値をコンマで区切って入力する。また、「capture..pcm」項目の「hw:」以降の数字は2で確認したcardとdeviceの値コンマで区切って入力する。

pcm.!default{

type asym

playback.pcm{

type plug

slave.pcm “hw:1,0”

}

capture.pcm{

type plug

slave.pcm “hw:1,0”

}

}

4. 「Ctrl」+「x」を入力し終了します。保存画面が開きますので「y」を入力し保存を選択します。保存するファイル名が表示されます。変更せずに「Enter」を入力します。

5. エクスプローラーを開き、piファイルの下にtempファイルを作成します。

※ 録音したデータを保存する場所です。

6. 「arecord –r 32000 –d 3 /home/pi/temp/out.wav」コマンドを実行すると、ターミナルに録音中が表示されます。録音中が表示されている間に音を記録してくれるので、何か音を記録させます。

7. 「aplay /home/pi/temp/out.wav」コマンドを実行し、先程の録音データが再生できることを確認します。

※ 音量調整は「alsamixer」コマンドを実行する。

【第4回】IBM Cloud と Raspberry Pi を用いたエアコン制御 ー Raspberry Pi の設定1

<目次>

  1. 初回概要
  2. IBM Cloud の設定
  3. LINE Platform の設定
  4. Raspberry Pi の設定
  5. Raspberry Pi の設定

今回は、Raspberry Pi の設定方法をご紹介します。

※Raspberry Pi ー 電子部品を本体に接続することによって様々な機能(音声認識・気象観測等)を実装できるコンピュータ。

▼   Raspberry Pi の設定   ▼

<OSインストール>

1. NOOBS タグの 「Download ZIP」を選択し、Raspberry Pi で使用するOSをダウンロードします。

Download NOOBS for Raspberry Pi

2. タウンロードしたデータをSDカードに展開します。

 

3. SDカードを取り出し、Raspberry Pi にセットします。

4. Raspberry Pi を起動します。

※電源に接続すると自動で起動します。

5. Raspbian[RECOMMENDED]を選択し、「Install」をクリックします。OSのインストールが始まります。

※私は2時間程度かかりました。

6. インストール中に、画面下の選択欄から使用言語を日本語に設定します。

7. 起動後、ダイアログが表示されます。ダイアログの「Next」をクリックします。

8. 国・言語・時間が日本のものであることを確認し、「Next」をクリックします。

9. Raspberry Pi で使用する任意のPasswordを入力し、「Next」をクリックします。

10. Wifi の設定を行い、「Next」をクリックします。

※有線LANを使う場合、設定は不要です。そのまま「Skip」をクリックします。

※設定し忘れた場合、画面右上の両矢印のアイコンからいつでも設定できます。

11. 「Next」をクリックし、アップデートを行います。

※私は1時間程度かかりました。

12. セットアップを行う為に「Reboot」をクリックし、再起動します。

以上でRaspberry Pi のセットアップは完了です。


次回は、Raspberry Pi 内のシステムやインターフェースの設定方法をご紹介します。

【第3回】IBM Cloud と Raspberry Pi を用いたエアコン制御 ー LINE Platformの設定

目次

  1. 初回概要
  2. IBM Cloud の設定
  3. LINE Platform の設定
  4. Raspberry Pi の設定
  5. Raspberry Pi の設定

今回は、LINE Bot の作成と設定についてご紹介します。

※ LINE Bot とは、LINE上でのユーザーの発言に対して自動応答するプログラムです。

▼   LINE Bot の設定   ▼

< LINE Bot の作成 >

1. LINE Developers サイトから、お持ちのLINEアカウントでログインします。

LINE Developers

2. 開発者名とメールアドレスを任意に登録します。

 

3. 新規 Channel 作成画面のサイドメニューから「新規プロバイダー作成」をクリックします。

4. 任意のプロバイダー名を入力し、「確認」→「作成」をクリックします。

5. プロバイダーが作成された後、Messaging API 欄の「チャネル作成する」をクリックします。

6. 各項目を以下のように設定し、規約への同意にチェックした後「作成」をクリックします。

  • アプリ名:任意のアプリ名を入力
  • アプリ説明:任意のアプリ説明を入力
  • プラン:「フリー」を選択
  • 大業種・小業種:適切な項目を選択
  • メールアドレス:お知らせを受け取るメールアドレスを入力

< LINE Bot の設定 >

1. 作成したMessaging API をクリックします。

2. 作成した Bot の「Channel 基本設定の画面」→「メッセージ送受信設定」→「アクセストークン(ロングターム)」から「再発行」をクリックします。

3. 表示されるポップアップウィンドウから「再発行」をクリックし、アクセストークンをメモします。

※アクセストークンは IBM Cloud とデータの送受信を行うために使用します。

4. 「Webhook 送信」の「利用する」を選択し「更新」をクリックします。

5. 「Webhook URL」 に「https://<ホスト名>.mybluemix.net/sample」を入力し「更新」をクリックします。

(ホスト名は IBM Cloud で設定したものを入力します。)

(ホスト名の大文字は小文字として入力します。)

6. 「LINE@機能の利用」→「自動応答メッセージ」→「利用しない」を選択し「更新」をクリックします。

※IBM Assistant にて応答メッセージを送受信する為、LINEの自動応答メッセージは無効にします。

7. 「友だち追加時あいさつ」→「利用しない」を選択し「更新」をクリックします。

8. QR コードから友だち追加します。

9. IBM Cloud のダッシュボード画面から Node-RED を開きます。

10. Pre Line Message API ノードを編集し、<token>枠に LINE Developer でメモしたアクセストークンを設定します。


以上で LINE Bot の設定は完了です。

次回は、Raspberry Pi の設定についてご紹介します。

【第2回】IBM Cloud と Raspberry Pi を用いたエアコン制御 ー IBM Cloud の設定

<目次>

  1. 初回概要
  2. IBM Cloud の設定
  3. LINE Platform の設定
  4. Raspberry Pi の設定
  5. Raspberry Pi の設定

今回はCloud 環境を作る為に IBM Cloud を使用します。

IBM Cloud で使用したシステムは以下の通りです。

  • Watson Assistant  --- 対話機能(AI)
  • Speech To Text   --- 音声をテキストに変換
  • Text To Speech   --- テキストを音声に変換
  • Internet of Things ーーー Raspberry Pi 基盤との情報交換機能
  • Node-RED   --- 上記(IBM Cloud内)のシステムの制御

この投稿では、上記 IBM Cloud 内システムの設定をご紹介します。


▼   IBM Cloud 設定   ▼

< IBM Cloud のアカウントの作成 >

1. IBM ID の登録および IBM Cloud アカウントの作成ページを開きます。

IBM ID の登録および IBM Cloud アカウントの作成

2. 必要事項を入力し、アカウントを作成します。

※ アカウントを作成するのに、IBM の承認が必要であり1日程度待つ必要があります。

< 各種カタログの作成 >

1. IBM Cloud にログインし、以下のカタログを作成します。

サービス名・アプリ名・ホスト名は任意に入力します 。(ホスト名は後に使用します)

  • Watson Assistant (カテゴリー:Watson)
  • Speech To Text (カテゴリー:Watson)
  • Text To Speech (カテゴリー:Watson)
  • Internet of Things Platform Starter (カテゴリー:スターター・キット)

2. Watson Assistant・Speech To Text・Text To Speechの資格情報をメモします。

< Watson Assistantのセットアップ >

1. ダッシュボードのWatson Assistantサービスを開きます。

2. 「ツールの起動」を選択します。

3. 「Workspaces」を選択し、「Import a workspace」ボタンをクリックします。

4. aispeaker-conversation.jsonファイルを選択しインポートします。

※上記のファイル内容はページの最後に記載します。

※今回は予め作成したものをインポートします。基本的なWatson Assistant の設定方法にご興味をお持ちの方はこちらへどうぞ。

Watson Assistant の使い方を学ぶ

5. 「view detail」よりワークスペースIDをメモします。

【第1回】IBM Cloud と Raspberry Pi を用いたエアコン制御 ー 初回概要


初めて投稿いたします、小島と申します。

ITに関してまだ知識が浅く、閲覧されている皆様にとっては物足りないかもしれず恐縮ですが、学習したことを分かりやすくブログでお伝えしていければと思います。

今回は IBM CloudRaspberry Piを使ったエアコン制御についてご紹介します。

※IBM Cloud ー IBMが提供しているCloudシステム。インターネット環境があれば、Cloud内のシステムを使用できます。

※Raspberry Pi ー 電子部品を本体に接続することによって様々な機能(音声認識・気象観測等)を実装できるコンピュータ。

仕組みは以下の通りです。

続いて使用したソフトウェア、サービス、ハードウェアの一覧です。

<使用機器>

Raspberry Pi 3 Model B
MicroSDカード 8GB以上
キーボード USB接続
マウス USB接続
スピーカー USB接続
マイクロフォン USB接続
ディスプレイ HDMI接続
赤外線リモコン irMagician (USB CDC ACM デバイス)
電源用マイクロUSB 接続 プラグ(A)オス-USB(Micro-B)オスタイプの充電器
ディスプレイケーブル HDMI
ネットワーク接続用 LANケーブル
赤外線リモコン用USB接続 USB(A)オス-USB(Micro-B)オスタイプのUSBケーブル

 

<使用プラットフォーム>

IBM Cloud Cloud Foundry アプリケーション
LINE LINE API

 


 

物理的なエアコン制御は、LINEのチャット機能と音声入出力機を用いて行います。

1. LINEチャットからエアコン操作

ーー

2. 音声入力からエアコン操作

ーー

 

イラストが細かくて恐縮です。

今後も制作しながら、読者の皆様に分かりやすくお伝えできるように頑張ります。

 

今回は、下記URLページを参照して作らせていただきました。

IBM Cloudライト・アカウントによるサンプル・アプリケーション:AIスピーカー編(外部リンク)

次回から下記の4回に分けて、チャットボットの作成手順及びポイントとなる箇所をご紹介予定です。

  1. IBM Cloud の設定
  2. LINE Platform の設定
  3. Raspberry Pi の設定
  4. Raspberry Pi の設定

長い記事になりますが、気長に見て頂けると嬉しいです。

SimpleSAMLphpでShibbolethとSAML / シングルサインオン

SimpleSAMLphpを使ってSPとテスト用IdP(Shibboleth)を構築する。
Shibbolethによる学術認証フェデレーションへの要参加するシステム構築で、SAMLでシングルサインオンをする必要が出てきました。

検証用にIdentity Providers(IdP)を用意する必要があり、OpenAMとかいろいろ漁ったところ、サクッと検証サーバ立てるのに、SimpleSAMLphpが一番手っ取り早かった。spもSimpleSAMLphpを利用します。

以下、インストール設定メモです。
idp,spとも同一サーバ上で動作させることができますが、分かりやすいようにサーバを分けました。
(※一度インストール~動作まで理解できれば同一サーバでも導入はすごく簡単です。)
・apache,phpは導入済みを前提とします。
・ホストのFQDNが正しく表示されること。

【確認環境】
—————————————————-
1.iDP (ユーザ認証サーバ)
FQDN:idp.sco.jp
https://idp.sco.jp
CentOS 7.2.1511
apache 2.4.6
php 5.4
simplesamlphp-1.14.9

—————————————————-
2.SP (ユーザ認証要求)
FQDN:sp.starserv.ne.jp
http://sp.starserv.ne.jp
RedHat 6.8
httpd-2.2
php 5.6
simplesamlphp-1.14.9
—————————————————-
【目標】
http://sp.starserv.ne.jpからSAMLでシングルサインオンできること。

【インストール】
1.iDP

https://simplesamlphp.org/docs/stable/simplesamlphp-install
を参考にします。

simplesamlphp-1.14.9.tar.gzをダウンロードし/var/simplesamlphp に展開する。
Apacheの設定で
Alias /simplesaml /var/simplesamlphp/www
を追加する。
今回は、httpsで動かします。(httpでも問題ありません。)

https://idp.sco.jp/simplesaml/
1

■iDPの設定
/var/simplesamlphp/config/config.php

・admin ユーザのログインパスワード123から変更

'auth.adminpassword' => '1234567890',

※パスワードは暗号化できますが、とりあえずplainで。
・管理者(admin)でログインできるか確認。

・idpモジュールの有効化

'enable.saml20-idp' => true,
'enable.shib13-idp' => true,

※enable.saml20-idpは今回使わないので、falseでいいですが実験のためこれも有効にしました。
SimpleSAMLphp設定ページで有効になっているか確認します。
2
・認証方法を設定
ユーザ属性データは、exampleauthを使うことにし、
authsources.phpに記載します。(LDAPとかいろんなDBが利用できますがここはパス)
まずは有効化設定(enableファイルを作成する。)
touch /var/simplesamlphp/modules/exampleauth/enable

ID=user1 password=test1
ID=user2 password=test2
の2ユーザ作成
/var/simplesamlphp/config/authsources.php

    'example-userpass' => array(
        'exampleauth:UserPass',
        'user1:test1' => array(
            'uid' => array('user1'),
            'eduPersonAffiliation' => array('member', 'developer'),
        ),
        'user2:test2' => array(
            'uid' => array('user2'),
            'eduPersonAffiliation' => array('member', 'admin'),
        ),
    ),

・自己証明書を作成
/var/simplesamlphp/certフォルダーに、server.crt、server.pemを作成します。
cd /var/simplesamlphp/cert
openssl req -newkey rsa:2048 -new -x509 -days 3652 -nodes -out server.crt -keyout server.crt

/var/simplesamlphp/metadata/saml20-idp-hosted.php

        'privatekey' => 'server.pem',
        'certificate' => 'server.crt',

/var/simplesamlphp/metadata/shib13-idp-hosted.php

        'privatekey' => 'server.pem',
        'certificate' => 'server.crt',

iDPの設定は一旦ここまで、後で「連携」でメタデータをSPと相互に信頼設定する必要があります。

■SPの設定
iDPの設定と同じように、simplesamlを設置します。
http://sp.starserv.ne.jp/simplesaml
iDPは動作させません。SPとして使います。
/var/simplesamlphp/config/config.php

'auth.adminpassword' => 'qwertyuiop',

※パスワードは暗号化できますが、とりあえずplainで。
・管理者(admin)でログインできるか確認。

・自己証明書を作成
/var/simplesamlphp/certフォルダーに、server.crt、server.pemを作成します。
・動作確認のため、デバッグモードにする。

'loggingdir' => '/var/log/simplesaml/',
'debug' => true,
'showerrors' => true,
'errorreporting' => true,
'logging.level' => LOG_DEBUG,
'logging.handler' => 'file',

・iDPの指定
/var/simplesamlphp/config/authsources.php

    'default-sp' => array(
        'saml:SP',
.
.
.
        'idp' => 'https://idp.sco.jp/simplesaml/shib13/idp/metadata.php',

idp’がNULLの場合はログイン画面の前にiDP選択画面が出てくるので、明示的に指定する。

・メタデータの設定
■iDP側 https://idp.sco.jp/simplesaml
SP側のSimpleSAMLphp設定ページ‐「連携」で、
default-sp「メタデータを表示」をクリックして、表示されたメタデータXMLをクリップボードにコピーする。
3

4

iDP側のSimpleSAMLphp設定ページ‐「連携」-XML を 「SimpleSAMLphpメタデータに変換」を
クリックし、貼り付けて「パース」する。
php用にコンバート表示されます。
shib13-sp-remote、saml20-sp-remoteの2つ。

5

表示された内容の、$metadata以下を
/var/simplesamlphp/metadata/saml20-sp-remote.php
/var/simplesamlphp/metadata/shib13-sp-remote.php
に記載します。上手くいけば、下記のようにSPが連携登録されます。
5-1

■SP側 http://sp.starserv.ne.jp/simplesaml
iDP側のSimpleSAMLphp設定ページ‐「連携」で、
SAML 2.0 IdPメタデータ「メタデータを表示」をクリックして、表示されたメタデータXMLをクリップボードにコピーする。
SP側のSimpleSAMLphp設定ページ‐「連携」-XML を 「SimpleSAMLphpメタデータに変換」をクリックし、貼り付けて「パース」する。
php用にコンバート表示されます。
saml20-idp-remoteの1つ。
表示された内容の、$metadata以下を
/var/simplesamlphp/metadata/saml20-idp-remote.php
に記載します。
同じ作業を
Shib 1.3 IdPメタデータについて行う。
/var/simplesamlphp/metadata/shib13-idp-remote.php

6

●連携の確認1

SP側 http://sp.starserv.ne.jp/simplesaml – 「認証」タブ
「設定されている認証元をテスト」
default-spをクリック

7
ログイン画面が表示されます。
8
user1:test1
user2:test2
でログインできればOK

9

●連携の確認2
最後にテストアプリからログインを試します。これができれば目的達成です。
サンプルプログラム
index.php

<?
require_once('/var/simplesamlphp/lib/_autoload.php');

$as = new SimpleSAML_Auth_Simple('default-sp');
$as->requireAuth();
$attributes = $as->getAttributes();

?>

<div style="font-weight: bold;">Hello, SimpleSAMLphp</div>
<table border="1">
<?php  foreach ($attributes as $key => $value): ?>
  <tr>
    <td><?=$key;?></td>
    <td><?=$value[0];?></td>
    <td><?=$value[1];?></td>
  </tr>
<?php endforeach;?>
</table>

<a href="logout.php">logout</a>

logout.php

<?
require_once('/var/simplesamlphp/lib/_autoload.php');

$as = new SimpleSAML_Auth_Simple('default-sp');
$as->requireAuth();
$attributes = $as->getAttributes();

$as->logout('http://sp.starserv.ne.jp/logout.html');
?>

logout.html

<html>
<body>
END
</body>
</html>

http://sp.starserv.ne.jp/index.php アクセス9.5

自動的にログイン認証画面が出ます。(実際ここは、学術認証IDP画面だったり、それぞれ接続先のログイン画面となります。)

10

—動作ログ—
/var/log/simplesaml/simplesamlphp.log
Nov 30 18:43:51 simplesamlphp DEBUG [f138141d33] Session: doLogin(“default-sp”)
Nov 30 18:43:51 simplesamlphp DEBUG [f138141d33] Received SAML1 response
Nov 30 18:43:51 simplesamlphp DEBUG [f138141d33] Loading state: ‘_34d95aa9e4b6b8c2488713e94cd808da3658b6fb79:http://sp.starserv.ne.jp/simplesaml/module.php/core/as_login.php?AuthId=default-sp&ReturnTo=http%3A%2F%2Fsp.starserv.ne.jp%2F’
Nov 30 18:45:20 simplesamlphp DEBUG [f138141d33] Session: Valid session found with ‘default-sp’.
Nov 30 18:45:20 simplesamlphp DEBUG [f138141d33] Session: Valid session found with ‘default-sp’.
Nov 30 18:45:20 simplesamlphp DEBUG [f138141d33] Session: doLogout(‘default-sp’)
Nov 30 18:45:20 simplesamlphp DEBUG [f138141d33] Session: ‘default-sp’ not valid because we are not authenticated.

MS Project ガントチャート IDが全部表示されない

当社は、小規模から大規模の案件全てMS Projectにて、プロジェクトの管理をしています。

タスクの追加、リソースの割り当てを一通り行った後、一部タスクを新たに他の新規のリソースに割り当てたところ、ガントチャートで一部のIDが表示されなくなってしまった。タスクのフィルターはすべて選択になっているにも関わらず。

m2

ただし、ガントチャート(進捗管理)ではすべてのIDが出て表示される。

m3

1時間ぐらい悩み、タスクのフィルターで、”すべてのフィルターをクリアー”を
実行したら表示された。
フィルターの何か変はゴミが残ってたのかも。今更ですが、今後は、”すべてのフィルターをクリアー”をすると覚えておこう。

m34png

 

 

Nexus5x,6P のカメラ reverse landscapに対応

Nexus5x及び6Pで、QRコード読み取り,3D 行先コンパス ARでカメラ画像が、180度回転表示するバグを修正しました。

Nexus 5Xのイメージセンサーは設計上の部品配置の都合で、他のAndroid端末と異なり逆(reverse landscape)に取り付けられているとのことで、rotationが未設定のアプリはpreviewが反転するようになった。
http://qiita.com/tomoima525/items/f59d345ea40c36244f9b

当アプリも180度回転表示してしまいました。

元々は、
camera.setDisplayOrientation(90)
で90度回転させて縦表示するようにしていたのですが、
Nexus5xだと、
camera.setDisplayOrientation(90 + 180)
にしないとだめで、

camera2 APIを利用すれば全自動ですが、
最終、以下のコードを追加して対応致しました。

    int numCameras = Camera.getNumberOfCameras();
    int cameraID;
    int back_camera_flg = 0;

    int index = 0;
    Camera.CameraInfo cameraInfo;
    int result = 0;

    while (index < numCameras) {
      cameraInfo = new Camera.CameraInfo();
      Camera.getCameraInfo(index, cameraInfo);
      if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT && back_camera_flg == 0){
        result = (cameraInfo.orientation) % 360;
        result = (360 - result) % 360;
        Log.w(TAG,"----- CAMERA INFO FRONT " + result );
      }
      if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK) {
        back_camera_flg = 1;
        result = (cameraInfo.orientation + 360) % 360;
        Log.w(TAG,"----- CAMERA INFO BACK " + result );
        break;
      }
      index++;
    }
     //camera.setDisplayOrientation(90);
    camera.setDisplayOrientation(result);
    //
    camera.setParameters(parameters);
  }