アプリケーションのアップデートは、セキュリティ上の観念などから、バージョンが上がった時点で行うべきであるというのが僕の信条である。
さて、今朝docomoプリインストールアプリのアップデート通知がきたので、早速アップデートした。そして、ホーム画面に戻ると、何やら謎の何かが。
さて、この「しゃべってコンシェル」は邪魔なので消そう……としたところでアプリを起動すると使用許諾契約に同意を求められる。
お か し く ね ?
使用許諾契約にはこのように書いてある。 しゃべってキャラ対応しゃべってコンシェルアプリ ソフトウェア使用許諾規約
第4条(契約の成立、効力及び終了) 1. お客様が、本ソフトウェアの画面上に表示される「同意」ボタンを押下した時点をもって、お客様は本規約に同意したものとみなされ、お客様と弊社との間に本規約に基づく契約(以下「本契約」といいます。)が成立し、効力を生じるものとします。
はて、「同意」ボタンを押した覚えなどないのに起動しているということは、インストールした時点で使用許諾契約に同意したことになるのだろうか?でも使用許諾契約読んでないぞ? そもそも利用をしたくないのに使用許諾契約に同意しなければ利用の停止ができないとはどういうことなのだ? 腹が立つ。docomoは何を考えているのだろう。理解ができない。
お客様視点によるCS推進活動 さて、「お客様の満足度」を考えると、同意を得ていないサービスの提供というのははたして満足されるのだろうか?というか企業としてどうなのだ?
顧客にとっては、「繋がる」ことが当たり前であって(softbank除く)それによって満足度を得るのは難しい。しかし、繋がらないことや上記のことによって、満足度は簡単に低下する。満足度は上がりにくく下がりやすいから、努力が欠かせない。
なぜiPhoneが好まれるのか。キャリアによる不要なプリインストールアプリが無いからではないのか?その点で、本当に「お客様目線」で考えているとは考えがたい。
まあいちゃもんつけてるだけなんだけど、それでもこれには苛ついた。エンジニアは悪くない。体質が悪いのだ。
もしやMacPortsからOpenCVを導入したのは間違いだったのではと感じた。
OpenCVのインストールフォルダにdataフォルダがあって、その中のhaarcascadesフォルダに顔認識に必要なファイルがあるが、MacPortsからOpenCVをインストールするとそんなのはない。 Githubで落としてくるとかして手に入れなければならない。Itseez/opencv・GitHub
顔認識するときカメラ起動するとキモい顔が映って死ぬ。
#include <iostream>
#ifdef __cplusplus
#include <opencv2/opencv.hpp>
#endif
int main(int argc, char *argv[])
{
cv::Mat img , gray;
// カメラからのビデオキャプチャを初期化する
cv::VideoCapture cap(0);
//キャプチャ画像をRGBで取得
cap.set( CV_CAP_PROP_FRAME_HEIGHT, 720 );
cap.set( CV_CAP_PROP_FRAME_WIDTH, 1280 );
//カメラがオープンできない場合終了
if( !cap.isOpened() )
{
return -1;
}
// ウィンドウを作成する
char windowName[] = "camera";
cv::namedWindow( windowName, CV_WINDOW_AUTOSIZE );
// 分類器の読み込み(2種類あるから好きな方を)
std::string cascadeName = "/Users/yusuke/Desktop/data/haarcascades/haarcascade_frontalface_alt.xml";
//std::string cascadeName = "/Users/yusuke/Desktop/data/lbpcascades/lbpcascade_frontalface.xml";
cv::CascadeClassifier cascade;
if(!cascade.load(cascadeName))
return -1;
//画像を使う場合はこれ
/*const char *imagename = "example.jpg";
img = cv::imread(imagename, 1);
if(img.empty()) return -1;
*/
//scaleの値を用いて元画像を縮小、符号なし8ビット整数型,1チャンネル(モノクロ)の画像を格納する配列を作成
double scale = 4.0;
// 何かキーが押下されるまで、ループをくり返す
while( cvWaitKey( 1 ) == -1 )
{
cap >> img;
// グレースケール画像に変換
cv::cvtColor(img, gray, CV_BGR2GRAY);
cv::Mat smallImg(cv::saturate_cast<int>(img.rows/scale), cv::saturate_cast<int>(img.cols/scale), CV_8UC1);
// 処理時間短縮のために画像を縮小
cv::resize(gray, smallImg, smallImg.size(), 0, 0, cv::INTER_LINEAR);
cv::equalizeHist( smallImg, smallImg);
std::vector<cv::Rect> faces;
/// マルチスケール(顔)探索xo
// 画像,出力矩形,縮小スケール,最低矩形数,(フラグ),最小矩形
cascade.detectMultiScale(smallImg, faces, 1.1, 2, CV_HAAR_SCALE_IMAGE, cv::Size(30, 30));
//cascade.detectMultiScale(smallImg, faces);
// 結果の描画
std::vector<cv::Rect>::const_iterator r = faces.begin();
for(; r != faces.end(); ++r)
{
cv::Point center;
int radius;
center.x = cv::saturate_cast<int>((r->x + r->width*0.5)*scale);
center.y = cv::saturate_cast<int>((r->y + r->height*0.5)*scale);
radius = cv::saturate_cast<int>((r->width + r->height)*0.25*scale);
cv::circle( img, center, radius, cv::Scalar(80,80,255), 3, 8, 0 );
}
//cv::namedWindow("result", CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO);
cv::imshow( windowName, img );
//cv::waitKey(0);
}
}
リンクさせるライブラリは
libopencv_core.2.4.5.dylib
libopencv_highgui.2.4.5.dylib
libopencv_imgproc.2.4.5.dylib
libopencv_objdetect.2.4.5.dylib
libstdc++.dylib
Build Setting→Apple LLVM compiler 4.2 - Language
から、C++ Standard Library を ibstdc++(GNU C++ standard library)
に設定する。
htc j butterflyという端末は防滴で充電端子があるのにスタンドが売り切れだから作るしかなかった
ケーブルを切ってピンヘッダを切って抜いてハンダ付けして終わり。
でもこれだけだと手で押さえるかテープで貼ったりしないと充電できないので……
こんなのをLEGOで作った
こんな感じに端子が接触して充電される
//
// main.cpp
// OpenCV-Cameratest
//
// Created by unasuke on 2013/05/27.
// Copyright (c) 2013年 unasuke. All rights reserved.
//
#include <iostream>
#ifdef __cplusplus
#include <opencv2/opencv.hpp>
//#include <opencv2/highgui/highgui.hpp>
#endif
int main(int argc, const char * argv[])
{
// insert code here...
// カメラからのビデオキャプチャを初期化する
//macではカメラの順序が最初なのでcvCreateCameraCaptureに渡す引数は0
CvCapture *videoCapture = cvCreateCameraCapture( 0 );
if( videoCapture == NULL )
{
return -1;
}
// ウィンドウを作成する
char windowName[] = "camera";
cvNamedWindow( windowName, CV_WINDOW_AUTOSIZE );
// 何かキーが押下されるまで、ループをくり返す
while( cvWaitKey( 1 ) == -1 )
{
// カメラから1フレーム取得する
IplImage *image = cvQueryFrame( videoCapture );
// ウィンドウに画像を表示する
cvShowImage( windowName, image );
}
// ビデオキャプチャを解放する
cvReleaseCapture( &videoCapture );
// ウィンドウを破棄する
cvDestroyWindow( windowName );
return 0;
}
リンクさせる.dylibは
libc++.dylib
libopencv_core.2.4.5.dylib
libopencv_highgui.dylib
の3つ(画像加工をしないので)
MacのiSight?内蔵カメラは最初に接続されてるのでcvCreateCameraCaptureに渡す引数は0。
C++の設定だけどC++要素全くない。
前回記事でMacPortsを使ってGitをインストールした。その流れにのり、MacPortsでOpenCVをインストールする。
$ sudo port selfupdate
$ sudo port install opencv
長い時間掛かるかもしれないのでこれからの苦難を想像して身構えておくのが吉。
まずはプロジェクトの作成から始める。
Create a new Xcode project"を選択し……
OS X"の"Application"の"Command Line Tool"を選択し……
各項目を記入し……
こんな画面になるかと思うので、囲ったところをクリックして下準備。
まずはHeader Search PathとLiberty Search Pathを設定する。それぞれ MacPortsからインストールした場合は、Header Search Pathが
/opt/local/include
Liberty Search Pathが
/opt/local/include
/opt/local/lib
と、それぞれnon-recursiveで設定する。recursiveにすると大量のエラーが出る。Liberty Search Pathは設定してない例もいくつか見つけたので不要かもしれない。
次にLink Binary With Librariesを設定する。今回はウィンドウの表示、ガウシアンフィルタを利用するので、以下の4つのLibraryをリンクさせる。
libc++.dylib
libopencv_core.2.4.5.dylib
libopencv_highgui.dylib
libopencv_imgproc.dylib
OpenCVの.dylibは(MacPortsからのインストールなら)/opt/local/lib
にあるので検索すると見つけやすい。追加は"Add Other"から行う。
これで下準備は終わり。
今回はある画像をガウシアンフィルタを適用しぼかす。
//
// main.cpp
// OpenCV-test
//
// Created by unasuke on 2013/05/26.
// Copyright (c) 2013年 unasuke. All rights reserved.
//
#include <iostream>
#ifdef __cplusplus
#include <opencv2/opencv.hpp>
#endif
int main(int argc, const char * argv[])
{
// insert code here...
//画像を開く
IplImage* before_img = cvLoadImage("/Users/yusuke/Desktop/lena.jpg", CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR );
if( before_img == NULL )
{
return 0;
}
//ウィンドウの作成
cvNamedWindow("test-before", CV_WINDOW_AUTOSIZE);
cvNamedWindow("test-after" , CV_WINDOW_AUTOSIZE);
//画像変換のためIplImage型で宣言
IplImage* after_img = cvCreateImage(cvGetSize(before_img), before_img->depth, before_img->nChannels);
//ガウシアンフィルタを使って画像をぼかす
cvSmooth(before_img, after_img, CV_GAUSSIAN , 9);
//画像をウィンドウに表示
cvShowImage("test-before", before_img);
cvShowImage("test-after", after_img);
//キーの入力待ち
cvWaitKey();
//すべてのウィンドウを削除
cvDestroyAllWindows();
//画像データの開放
cvReleaseImage(&before_img);
cvReleaseImage(&after_img);
return 0;
}
で、実行するとこうなる。
疲れた。
GUIを使わないのはついマウスに手が伸びる癖を何とかしたいから。
Gitをインストールするために、まずはMacportsをインストールする。MacPortsのインストールにはXcodeが必要なのでそれはMacAppStoreからダウンロードとインストール。 The MacPorts Project
Gitのインストールの前に、まずはMacPortsを最新の状態にする。
$ sudo port selfupdate
何か言われたらそれもやっておく。
$ sudo port upgrade outdated</pre>
Gitをインストールするために以下のコマンドを実行。
$ sudo port install git-core</pre>
まずは適当なフォルダに適当なコードを保存する。今回は試しにということで授業で出された課題である電話帳のプログラムでGitを使ってみた。
ホームフォルダの下に
WorkSpase/database/database.c
と配置した。この場所はどこでもいいと思う。
そして。このフォルダに移動する。
$ cd WorkSpase/database
そしたらこのフォルダをGitで管理するために以下のコマンドを実行。
$ git init
でもこのままではまだ何も管理してくれないのでプログラムを登録する。
$ git add database.c
これファイル名のところを".“にするとそのフォルダに有るすべてのファイルを登録できるとか。便利。 じゃあ今どんな状態か見てみよう、と。
$ git status
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: database.c
#
no changes added to commit (use "git add" and/or "git commit -a")
人によるかもしれないけどだいたいこんな感じの表示が出てくる。じゃあ、変更を登録しよう。
$ git commit -m "first commit."
"first commit"のところは変更点(どんな関数を追加したとか)を英語で書くといいかも。書かなくてもいいかも。ただ書いたほうが絶対にいい、かも。 で、状態をみてみると……
$ git status
# On branch master
nothing to commit, working directory clean
はい、記録されたようですね。じゃあ今までの履歴を見てみよう。
$ git log
commit 5b54c1047d3cbf5f3b828f8361c2cc49f83649e2
Author: unasuke
Date: Fri May 24 00:45:39 2013 +0900
add comment.
commit 6f517649010f2fe6177655951e1bcd21aa6d8347
Author: unasuke
Date: Thu May 23 01:40:49 2013 +0900
first commit.
僕は2回程度commitしたのでこんな感じになってるけどだいたいそんなような表示になったはず。 やったぜ!Git入門だ!
……で?これだけで何が嬉しいの?状態なのではやめにGitHubとあれこれさせたいところ。専門用語はあえて使わなかった。理解してからまたまとめ直すかもしれない。
後々Twitter Bootstrapを使ってデザインを変更するつもりだったので、どうせならとGitHubアカウントをとってみた。
Gitの使い方は全くわかっていないので、今はBootstrapとTwitter4Cをwatchしている。
タイトルが長い。 MacにBootcampを使ってWindowsをインストールすると、標準ではMacとWindowsの2つのパーティションができる。しかし、どちらもどちらのファイルシステム(HFS+とNTFS)を読み書きすることができないので、データの共有は外部保存領域を使用せねばならない。これは面倒である。まあ再起動も面倒ではあるのだが。 そこで、ディスクユーティリティ.appを用いて共有パーティション(exFAT)を作成したのだが、Windowsが起動ディスク選択画面で見えなくなってしまった。
そこで、Windows8のインストールディスクを挿入し、optionキーを押しながら起動。この時の起動ディスクは光学メディアの形のUEFIではなく、光学メディアの形のWindowsである。そしてコンピュータの修復から自動修復を選択し、あとは待っていれば自動修復が完了しWindowsが起動できるようになる。
はてなダイアリーからTumblrになって、さらにWordPressにまでお引越し。「うなすけとあれこれ」のリンクが3回も変わってしまいました。
今後投稿する内容として、はてダとTumblrで反応が多かった記事を加筆・訂正して投稿し直すことや日常的または技術的なことです。要するに今までの内容プラス過去の投稿で閲覧稼ぎといったところです。
しばらくしたら、はてなのアカウントを消したいです。利用しているサービスがはてなダイアリーとはてなフォトライフのみだったので。あとはてなブックマークの仕組みもよく分からなかったので。Tumblrは残します。
広告がいやでTumblrに移行したのですが、はてなダイアリーふうに使っていくにはあまりにもTumblrのいいところ(リブログ)を活かせないと思ったのが主な移行理由です。
拙い文章を長々垂れ流すブログですが、今後とも宜しくお願い致します。