amazon

20.12.11

統計解析[R]で、マルチバイト文字(日本語)を読み込む2

前回は、Rで日本語を含むファイルを読み込むのに、optionsのencodingを変更したが、 以下のようにすれば一行で済む。
> readLines(file("WanToRead.csv", encoding="SJIS")) #ファイルがshit-jisの場合

ちなみに、以下のように関数file()を用いない場合はマルチバイトの文字列として読み込まれない(エラーは出ない)。
> readLines("WanToRead.csv", encoding="SJIS")

29.11.11

統計解析[R]で、マルチバイト文字(日本語)を読み込む

Rで日本語を含むファイルを読み込むには、
> options(encoding="SJIS") #ファイルがshit-jisの場合
> readLines("WantToRead.csv")
とすればよい。

あとは、substr()やstrsplit()で刻めばよし。

注)元がnative.encなのであらかじめ確認しておくとよい。必要に応じて元に戻すように。
> options()
で現在の状態を確認できる 僕の環境では以下になった。
$encoding
[1] "native.enc"

14.11.11

charの文字列を初期化せずに後から代入する方法


#include <stdio.h>

int main(){
char a[20] = "atokara";
printf("a=%s\n",a);
return 0;
}
は、できるが、
#include <stdio.h>

int main(){
char a[20];
a = "atokara";
printf("a=%s\n",a);
return 0;
}
は、できない。

そこで、strcpyを使って以下のようにする
#include <stdio.h>
#include <string.h> //strcpyを使用するのに必要

int main(){
char a[20];
strcpy(a, "atokara");
printf("a=%s\n",a);
return 0;
}

ちなみに、char配列のサイズ指定の有無だが、
#include <stdio.h>

int main(){
char a[] = "atokara";
printf("a=%s\n",a);
return 0;
}
は、OKだが、
#include <stdio.h>
#include <string.h>

int main(){
char a[];
strcpy(a, "atokara");
printf("a=%s\n",a);
return 0;
}
は、エラーになる。strcpyの一つ目の引数はあらかじめサイズ指定が必要。

3.11.11

Psychtoolboxインストール

Matlabを使うPsychtoolboxをSnow Leopardにインストールしたときのメモ

64bitのMATLABやoctaveではPsychtoolboxが動かないのはわかっていたので、
バージョン3.2.3のoctave.appからDownloadPsychtoolboxを叩いたが、
以下のエラーが出た

octave-3.2.3:2> DownloadPsychtoolbox
Sorry, this installer doesn't support your operating system: i386-apple-darwin8.11.1.
DownloadPsychtoolbox can only install the new (OSX and Windows)
OpenGL-based versions of the Psychtoolbox. To install the older (OS9 and Windows)
versions (not based on OpenGL) please go to the psychtoolbox website:
web http://psychtoolbox.org/download.html
error: Your operating system is not supported by DownloadPsychtoolbox.
error: called from:
error: /Users/Me/Documents/MATLAB/DownloadPsychtoolbox.m at line 198, column 1

最新のDownloadPsychtoolbox.mをダウンロードしろと言われたのだが、
どこにあるか分からなかった
以下の参照ページ内のリンクからダウンロードしたDownloadPsychtoolbox.mで
無事にインストールできた

参考ページ:
http://www.brain.med.kyoto-u.ac.jp/~snishida/psych_eyelink/ptb.html

25.10.11

WordPressのインストール

apache、MySQL、phpを導入し、
/wp-admin/install.phpからインストールしようとしたら、
引っかかったのでメモ。

MySQLで作成した
データベース名、ユーザー名、パスワード、データベースのホスト名を
適切に入れて[作成する]を実行したが、

データベース接続確立のエラー

ホスト名は、MySQLで作成した通りのlocalhostだったが、127.0.0.1にしたらインストールできた。

21.9.11

Snow LeopardにDBD::mysqlをインストール


CPANから
cpan[1]> install DBD::mysql
とするとエラーになる。
どうやら、Snow Leopardが64bitなのでコンパイルに失敗するらしい。

Landescape Graphicsさんの記事をみたらできた。

DBD::mysqlのインストールは手動でコンパイルすればできる。
$ tar zxvf ~/.cpan/sources/authors/id/C/CA/CAPTTOFU/DBD-mysql-4.020.tar.gz

実は、これでは解凍出来なかったので、Finderでダブルクリックして展開。
$ cd DBD-mysql-4.020
$ sudo perl Makefile.PL --mysql_config=/usr/local/mysql/bin/mysql_config --cflags="-I/usr/local/mysql/include"
$ make $ sudo make install

6.9.11

WindowsではalutExit();が重要

Windows7のOpenAl alutについて

alutExit();
を使わずに、ループで何度も音声ファイルをメモリにロードしていたら、
途中(正しく検証していないが200個超えた辺り(257個目か?)のファイル)からロードできなくなった。

何度かに一度alutExit()して、
再びalutInit()で初期化したら問題なく動いた。

ちなみにこのプログラム、Macでは問題なく動作していた。
それをWindowsに移したら、途中から音が鳴らなくなった。

glutInit, alutInitのargc, argvの簡単な与え方

普通は、mainの引数であるargc, argvを
glutInit(&argc, argv);
alutInit(&argc, argv);
のように与えればよいが、
main以外でglutInitを呼ぶときはargc, argvが定義されていないことがある。
自分でargc, argvを定義してもよいが、以下のようにしても動く。
glutInit(NULL,0);
alutInit(NULL,0);

Macのスピーチ(テキスト読み上げ)の声をファイルに保存する方法

Macのスピーチ(テキスト読み上げ)の声(例えばAlexの声)をファイルに保存するには、

Terminalで
say -f 読ませたいテキストファイル名 -o 出力ファイル名.aiff
とする。

5.9.11

Snow Leopardで、apache2のユーザー毎設定


【Snow Leopardのapacheの起動】
Macで、apacheを起動するには[システム環境設定]-[共有]の
[Web共有]にチェックを入れれば良い

【Snow Leopardのapacheの設定ファイル(ルート)】
それの設定ファイルは
/private/etc/apache2
にある

ブラウザで指定したアドレスにindex.html等がない場合に
インデックス一覧を表示しないようにするには、
先のディレクトリにある
httpd.conf
を編集すればよい


で囲まれている部分を探し、
Opitons Indexes
とあったら、
Options -Indexes
とする

これで、ブラウザから
ルートフォルダ(http://loacalhost)
の一覧は表示されない

【ユーザ毎の設定】
この時Macでは
http://localhost/~ユーザ名

/Users/ユーザ名/Sites
が参照されるようになる

しかしこのままでは、
http://localhost/~ユーザ名
にインデックス一覧が表示されてしまう

httpd.confをいくらいじってもユーザホームでインデックス一覧を非表示にはできない

【Snow Leopardのapacheの設定ファイル(ユーザ)】
Snow Leopardでは、ユーザ毎のconfファイルが
/private/etc/apache2/users/ユーザ名.conf
にあるので、それを編集する

やはり、
Options Indexes

Options -Indexes
にすれば
http://localhost/~ユーザ名
でインデックス一覧が表示されなくなる

[R] で順列(permutation)、組み合わせ(combination)

統計解析ソフト[R]には、標準で順列(permutation)、組み合わせ(combination)が入っていない

そこで、パッケージgtoolsを使う

library("gtools")
とするか
[メニュー]-[パッケージとデータ]-[パッケージマネージャ]
でgtoolsにチェックを入れる

gtoolsにある、permutationsとcombinationsという関数を使うと行列を返す
例えばこんな感じ

> permutations(3,2)
[,1][,2]
[1,]12
[2,]13
[3,]21
[4,]23
[5,]31
[6,]32

> combinations(3,2)
[,1][,2]
[1,]12
[2,]13
[3,]23

22.8.11

MacBook ProにつなげたUSB WebカメラをUstreamで使う

MacBook ProにつなげたUSB Webカメラ (Logicool 1.3-MP Webcam C500) を使って
Ustream配信を行おうとしたができない。
UstreamではPC付属のカメラしか使えない仕様になっているらしい。

そこで、CamTwistを使う。

CamTwistは、

インストールして、
[Select a video source] で [Webcam]を 選択して、
左下の[Select]ボタンを押す。
すると[Adjust settings] に [Webcam]ができる。
(メニューの[Tools]-[Preview]で確認できる)

メニューから終了して、PCを再起動。


その後、UstreamのビデオソースでCamTwistを選択すればOK


参考:http://ksnk.jp/ustmac.html

7.7.11

OpenALの再生

OpenALをインストールしていないWindows PCで、
OpenALを使ったプログラムを動かすと音が鳴らない。

OpenAL32.dllをプログラムのフォルダに入れてみたが、鳴らない。
wrap_oal.dllも必要らしいことが分かった。

音の再生には
OpenAL32.dll と wrap_oal.dllの両方が必要。

28.6.11

mallocエラー

a.out(12345,0xXXXXXXXX) malloc: *** error for object 0xXXXXXX: incorrect checksum for freed object - object was probably modified after being freed.
*** set a breakpoint in malloc_error_break to debug

このエラー、
オブジェクトのインスタンスを、deleteした後に、アクセスしてたことによる。

new - deleteも中でmalloc使っているのだろうか。

Macではときどき動いたが、
Windowsはこの辺シビアで、必ずエラーが出た。

2.6.11

Windows7で、管理者権限で実行せずにファイルが保存できるようにする方法

Windows7 (やWindows Vista (未確認))では、UACが強力すぎで、通常では作成したアプリケーションからファイルを保存できない。
つまり設定ファイルすら保存できないので設定の変更が反映されない。
(XPでは問題なく保存できる)

対処方法は以下のとおり、

<方法1>
[プロジェクトのプロパティ] - [構成プロパティ] - [リンカー] - [マニフェスト ファイル] - [UAC の実行レベル]を
requireAdministator
にする。
こうすると、アプリケーションの実行時に管理者権限で起動するか聞かれるのでOKすればよい。

<方法2>
アプリケーションをShift + 右クリックで管理者として実行で開く
または、
アプリケーションのショートカットを作成して、ショートカットの[プロパティ] - [互換性] - [特権レベル] で
[管理者としてこのプログラムを実行する]
にチェックを入れる。


参考URL:
http://msdn.microsoft.com/ja-jp/library/bb384608.aspx
http://msdn.microsoft.com/ja-jp/library/bb384691.aspx

31.5.11

Visual Studio 2010 のフォームアプリケーションでメンバ宣言

Form1.hにどのメソッドからでもアクセスできる共有変数の作り方。


メンバは以下のように宣言する。
public: static int foo;

始めは
private: int foo;
と宣言メンバを追加したのだが、これではアクセス出来なかった。

25.5.11

[R] for Mac のRパッケージインストーラで、フリーズ

R for Mac OS X GUI 1.40-devel Leopard build 32-bit(5751)を使用しているが、
Rパッケージインストーラで[一覧を取得]するとフリーズし、Rが(応答なし)になってしまう現象について、

単にCRANのサーバが応答していないだけだった。
環境設定の、[起動]-[デフォルトのCRANミラー]を存在するものに変えてあげれば解決した。
何のエラーも表示されないからわからなかった。

30.4.11

warning C4793: `anonymous namespace'::CV_XADD': ネイティブ関数としてコンパイルされました

c:\program files\opencv-2.2.0\modules\core\include\opencv2\core\operations.hpp(81): warning C4793: `anonymous namespace'::CV_XADD': ネイティブ関数としてコンパイルされました:
1> インラインのネイティブ アセンブリはマネージ コードでサポートされていません
という警告を消すには、
stadfx.hの中に、operations.hppを呼び出しているファイルのヘッダーを書き加え、#pragma unmanagedと#pragma managedで括ればよい。
つまり、
// stdafx.h
#pragma once

#pragma unmanaged
#include "foo.h"
#pragma managed
警告の通り、マネージコードにしなければよい。

28.4.11

プロシージャエントリポイント_ftol2がダイナミックリンクライブラリmsvcrt.dllから見つかりませんでした

OpenGLで作成したプログラムをWindows XP で起動すると、
プロシージャエントリポイント_ftol2がダイナミックリンクライブラリmsvcrt.dllから見つかりませんでした
と出た。

作成は、OS: Windows 7で、Visual Studio 2010 のC++である。

この原因は、Windows 7付属のOPENGL32.dllをアプリケーションフォルダにコピーしたことにある。
アプリケーションフォルダに、Windows 7の OPENGL32.dllがあるとそれを読み込んでしまいエラーが起こる。
本来はc:¥Windows¥system32¥にあるWindos XP付属のOPENGL32.DLLを読み込む必要がある。
よって、アプリケーションフォルダのOPENGL32.dllを削除すれば良い。

error: jump to case label error: crosses initialization of ‘******’



error: jump to case label
error: crosses initialization of ‘******’
がswitch文で出る。
case 1:
[some functions]
break;
を下に変えればよい。
case 1:{
[some functions]
break;
}

26.4.11

std::vector の初期化時メモ


std::vector<std::string> array(10);
などとし、
array.push_back("blah-blah");
とすると、"blah-blah"は11番目の要素に代入される。
つまり、
for(int i = 0; i < array.size(); i++ ) std::cout << array[i] << "," << std::endl;
は、
,,,,,,,,,,blah-blah,
となる。

24.4.11

error LNK2001 in Visual Studio 2010 with OpenCV

error LNK2001: 外部シンボル ""public: virtual void __thiscall cv::HOGDescriptor::setSVMDetector(class std::vector<float,class std::allocator<float$gt; $gt; const &)" (?setSVMDetector@HOGDescriptor@cv@@UAEXABV?$vector@MV?$allocator@M@std@@@std@@@Z)" は未解決です。
リンカーのエラーによるもの。
プロパティ - リンカー - 入力 -追加の依存ファイル
This is an error of Linker.
Property - Linker - Input - Additional Dependencies

ここで、Add
C:\Program Files\OpenCV-2.2.0\build\lib\Debug\opencv_objdetect220d.lib
C:\Program Files\OpenCV-2.2.0\build\lib\Release\opencv_objdetect220.lib

error C2855 in Visual Studio 2010

error C2855: コマンド ライン オプション '/clr' は、プリコンパイル済みヘッダーが作成されたときのものと異なります。
該当するファイルのプロパティで、
プリコンパイル済みヘッダーを変更する
使用(/Yu) -> 作成(/Yc)

23.4.11

C++ string <-> double, int 等の変換 (2)

先日のものは、doubleからstringにするときに桁数が落ちていたので、
精度を落とさずに変換する方法を記す。

#include <string>
#include <sstream>
#include <iomanip> //追加

std::string double2string(double d){
std::string rt;
std::ostringstream oss;
oss << std::setprecision(16) << d; //精度を指定
rt.assign(oss.str(),0,15); //桁数を指定
return rt;
}

22.4.11

C++ string <-> double, int 等の変換

文字列string から数字 double, int 等の変換は
sstreamを使うことで案外簡単にできることが分かった。

#include <string>
#include <sstream>

double string2double(const std::string& str){
double rt;
std::stringstream ss;
ss << str;
ss >> rt;
return rt;
}

std::string double2string(double d){
std::string rt;
std::stringstream ss;
ss << d;
ss >> rt;
return rt;
}
こんな感じ。

warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます

Visual Studio 2010 C++ で
「warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存してください。」
と出た。

コメントで日本語を使っていたのが問題だった。

warning C4067: プリプロセッサ ディレクティブの後に余分な文字がありました

Visual Studio 2010 C++ で
「warning C4067: プリプロセッサ ディレクティブの後に余分な文字がありました - 改行が必要です」
と出た。

プリプロセッサで
#ifdef __APPLE__ || WIN32
としていたのが問題。

#if defined(__APPLE__) || define(WIN32)
とするがよろし。

20.4.11

Snow Leopard に、Mac Portsでatlasをインストール


Macportsでatlasをインストールするときに、building atlas で止まってしまう現象について。
6時間待ったらインストールできたとあったので、やってみた。
$ sudo port clean atlas
$ sudo port install atlas
一旦、atlasをクリーンしてから、再度インストールをしたところ、
やっぱり6時間くらいでインストールが完了できた。
インストールされたバージョンは @3.9.37_0

18.4.11

Windows 7 on Parallels インストール時の文字化け

インストーラが文字化けするときの対処が、RUNEXYのホームページに載っている。
概要は以下のとおり。

「コントロールパネル」-「地域と言語」-

「形式」タブの[形式]

「場所」タブの[現在の場所]

「管理」タブの[Unicode対応でないプログラムの現在の言語] -「現在のシステムロケール」

を日本語にする。

ALUT + OpenALで音が出ない


Xcodeで、frameworkとstatic libraryとdynamic libraryを作る方法。alutの例。
で、コンパイルしたライブラリだが、インクルード指定の順番が重要であることが分かった。

$gcc main.cpp -lalut -framework OpenAL
または
$gcc main.cpp -framework ALUT -framework OpenAL
は、コンパイルが通り音が出る。

$gcc main.cpp -framework OpenAL -lalut
または
$gcc main.cpp -framework OpenAL -framework ALUT
これだと、音が出ない。

-framework ALUTも-lalutも中身は同様であるから、
ALUTをOpenALより前に持って来ないといけないらしい。

Visual Studio 2010 on Parallels Desktop 6 on Snow Leopard

Snow Leopard上で動かした、Parallelsで走らせたVisual Studio 2010で、
複雑なソリューションをビルドすると、Visual Studioがフリーズしたようになり、
ビルドをキャンセルすると、
Error MSB4014がでる問題について。

Microsoft Connectにもあるように、
ParallelsのCPUを2つ使うように設定したらフリーズしなくなったようだ。

So, for Error MSB4014 in Visual Studio 2010 on Parallels Desktop 6 on Snow Leopard,
using 2 cores of CPUs in Parallels may solve the problem.

17.4.11

Xcodeで、frameworkとstatic libraryとdynamic libraryを作る方法。alutの例。


ソースを取ってきてコンパイルしてライブラリを作成する場合、
$./configure -[オプション]
$make
$sudo make install
などとコンパイルする方法が用意されているが、frameworkや32bit用または64bit用スタティックライブラリ、ダイナミックライブラリを作成したい時にはXcodeでコンパイルすると楽。
付属のMakefileでコンパイルするとSnow Leopardだと自動的に64bitになるから厄介。

今回は、OpenALのalutライブラリ作成を例に行う。

まずは、frameworkの作成。
これはメモてきなあれと,日記てきなあれ.さん、参照。
これで、をインクルードしたmain.cppが
$g++ -m32 main.cpp -framework OpenAL -framework ALUT
でも、
$g++ -m64 main.cpp -framework OpenAL -framework ALUT
でも、コンパイルが通るはず。

static library, dynamic library作成は、上と同様にして、
Xcodeのプロジェクトで、BSD C Libraryをstaticまたはdynamicにして
32bitならi386、64bitならx86_64を指定してリリースをビルド。
出来上がった、
libalut.a、libalut.dylibを
/usr/local/lib/
に移動すればよい。
これで、
$g++ -m32 main.cpp -framework OpenAL -lalut
と、
$g++ -m64 main.cpp -framework OpenAL -lalut
でコンパイルが通るようになる。

シリアルポート送信とその注意


CまたはC++でtermiosを使ってシリアル送信を試みた。
クラスを用いてオブジェクトを作ってみた。
始めうまく行かなかった原因が分かったのでメモ。

マシンはmacだが、シリアル接続に使っているのはELECOM製UC-SGT。これでUSB to シリアルケーブルしている。
UC-SGTには、macのドライバが付属していないが、別途使えるようにする方法があるので、mac UC-SGTなどとぐぐってみるとよい。

シリアル送受信の接続確認は
windowsだとTeratermなどが簡単だが、
macならターミナルでscreenかcuを使うとよい。

screenは林檎生活100さんのサイトを参照した。

接続する際のportのパスは、
/dev/cu.usbserial
または
/dev/tty.usbserial
僕の場合はどちらで接続できた。

ここから本題。
稚拙だがC++で接続するプログラムを書いてみた。

termiosの設定については、
FreeBSD 日本語マニュアル検索 (jman/japropos/jwhatis)

termios(4) Mac OS X Manual Page
を参照。

//serialsend.h
#include <fcntl.h>
#include <termios.h>
#include <unistd.h>
#include <iostream>

#define BAUDRATE B9600
#define PORT "/dev/cu.usbserial"

class SerialPort{
private:
int fd;
struct termios oldtio,newtio;
public:
SerialPort();
int open(const char*);
int send(const char*, int);
void close(void);
};

//serialsend.cpp
/*シリアルポートに信号を送るプログラム*/
#include "serialsend.h"

SerialPort::SerialPort(){ //コンストラクタ
memset(&newtio, 0, sizeof(newtio));//ポート設定の初期化

cfsetispeed(&newtio, B9600);
cfsetospeed(&newtio, B9600);

newtio.c_iflag |= IGNPAR;

newtio.c_oflag |= OPOST;
newtio.c_oflag &= ~ONLCR;

newtio.c_cflag |= CS8;
newtio.c_cflag |= CSIZE;
newtio.c_cflag &= ~CSTOPB;
newtio.c_cflag |= CREAD;
newtio.c_cflag &= ~PARENB;
newtio.c_cflag &= ~PARODD;
newtio.c_cflag |= HUPCL;
newtio.c_cflag |= CLOCAL;

newtio.c_lflag |= ICANON;

newtio.c_cc[VTIME] = 0;
newtio.c_cc[VMIN] = 0;
}

int SerialPort::open(const char* port){
//モデムデバイスを開く
fd = ::open(port, O_RDWR | O_NOCTTY | O_NDELAY);

//モデムデバイスが開けたかチェック
if(fd<0){
std::cerr<<"Error! "<<port<<" can not be opend."<<std::endl;
return -1;
}else{
fcntl(fd, F_SETFL, 0);
std::cout<<"Serial port fd="<<port<<" was opened."<<std::endl;
}

tcgetattr(fd,&oldtio); // 現在のポート設定を待避
tcflush(fd, TCIOFLUSH); //受信したが読み込んでいないデータ、および書き込んだが送信していないデータの両方を消去
tcsetattr(fd,TCSANOW,&newtio);
send("Port initiated. ",16); //ポートの初期化に一度何かを送っておくと調子がよさそう
return fd;
}

int SerialPort::send(const char* buf, int size){
int rt = write(fd, buf, size);

if(rt == size) {
std::cout<<buf[0]<<"... was sent."<<std::endl;
}else if(rt < 0){
std::cerr<<"Error! "<<buf[0]<<"... was not sent."<<std::endl;
}else{
std::cerr<<"Error! "<<buf[0]<<"... was partially sent."<<std::endl;
}

usleep(20000); //送信完了までの待ち時間

return rt;
}

void SerialPort::close(void){
tcsetattr(fd,TCSANOW,&oldtio);
::close(fd);
}

//main.cpp
#include "serial_send.h"

int main(void){
SerialPort a;
a.open(PORT);
a.send("something",9);
a.close();
return 0;
}

正しく送信するには、赤字の行が必須のようである。
試しにその行をコメントアウトすると、送信できないか、送信はできるが文字化けした。
usleep(20000)は20 msであるが、10 msだとほどんどの場合文字化けが起こり送信が正しく行われなかった。

シリアルポートではもっと細かい時間制御はできないのであろうか。
理論上1µsくらいまでいけそうだと思うのだが。
とにかく、上のプログラムでデータ送信を行う場合は処理に20 ms以上かかることを考慮に入れて設計をしなければならない。

12.4.11

C++ std::vectorのメソッドinsertでの注意


<メモ>
insertするとイテレータが無効になる

std::vector<std::string> vec;
vec.push_back("文字列1");
vec.push_back("文字列2");
vec.push_back("文字列3");
と作ったvectorオブジェクトvec = 文字列1, 文字列2, 文字列3(この順になっている)
の3要素目に文字列4を挿入して、vec = 文字列1, 文字列2, 文字列4, 文字列3 としたい。

std::vector<std::string>::iterator it = vec.begin(); //イテレータの初期化 この時点でitには文字列1の先頭アドレスが入る
for (int i = 0; i < 2; i++) ++it; //イテレータを2つ進める itには文字列3の先頭アドレス
vec.insert(it , "文字列4"); //文字列4の挿入
これで完成。
で、ここでこの後に
++it;
vec.insert(it , "文字列5");
とやると、4要素目には挿入できない。

4.4.11

char型の配列番号が変わってしまう現象


キーボード入力した一文字を取得して、char型配列に格納するプログラムを作っていたのだが、
変数ではなく配列の要素番号が変わってしまう現象が起きた。

#include <iostream>

class Obj{
  private:
    char c[10];
    int i;
  public:
    Obj(void);
    void func(void);
};

Obj::Obj(){
   i = 0;
}

void Obj::func(void){
   std::cout<<"i = "<<i<<std::endl;
   c[i] = 'a';
   std::cout<<"i = "<<i<<std::endl;
}

int main (void ){
   Obj obj;
   obj.func();
   return 0;
}
これを実行すると
$ ./a.out
i = 0
i = 97
となる。
i はいじってないのにと、思ったが、
原因は、char c[]の部分。
これをちゃんとchar c[10]とかにしておけば、よし。

25.3.11

C++ string型からchar**型へ


C++ではどうも"文字列"が自動的にstringになるようだ。

Cのmain関数をc_main名前に変えて、C++から呼びだそうとしたとき警告が出た。
//main.cpp
#include "c_main.h"

int main(){
    char* argv[] = {"文字列"};
    int argc = 1;
    c_main(argc,argv);
    return 0;
}
をコンパイルして実行すると
$ g++ main.cpp
$ ./a.out
warning: deprecated conversion from string constant to ‘char*'
という警告が出る。

「string constant型からchar*型への変換は非推奨です」ということである。
警告なのでこのままでもいいのだが、気持ち悪いのでいじってみた。

char* argv[] = {(char*)"文字列"};
型変換なので、これだけでOK。

全体では以下のようにすればよい。
//main.cpp
#include "c_main.h"

int main(){
    char* argv[] = {(char*)"文字列"};
    int argc = sizeof argv/sizeof argv[0];
    c_main(argc,argv);
    return 0;
}


//c_main.h
int c_main(void);


//c_main.c
#include "c_main.h"

int c_main(int argc, char *argv[]){
    ---- 関数の中身 ----
}



余談だが、
int main(int argc, char *argv[])
のargvには実行時のオプションに与える文字列の配列、argcにはその個数が入っている。
例えば、
//main.c

#include <stdio.h>
int main(int argc, char* argv[]){
    printf("argc = %d\n",argc);
    printf("1 = %s, 2 = %s, 3 = %s\n",argv[0],argv[1],argv[2]);
    return 0;
}
をコンパイルして実行すると

$ gcc main.c
$ ./a.out 文字列1 文字列2 文字列3
argc = 4
1 = ./a.out, 2 = 文字列1, 3 = 文字列2
となる。

16.3.11

CPANメモ

cpanをいじっていたら、

$ cpan
と打っても反応しなくなった。

$ sudo perl -MCPAN -e shell



cpan[1]>

モジュールの検索
cpan[1]> i /モジュール名/

モジュールのインストール
cpan[1]> install モジュール名

15.3.11

e-taxで確定申告 on MBP Snow Leopard

e-Taxで確定申告をしたときに、つまずいたことをメモしておく。

まず、公的個人認証サービスクライントソフトがインストール出来ない。
これは、エラーにもあるように、Snow Leopardは標準でJAVAが入っていない事による。

http://support.apple.com/downloads/から、
Java for Mac OS X 10.6を検索して、
Download & インストール。

このままだと、e-taxの書類をSafariで作成中にJAVAのエラーが出る。
そこで、
Macのソフトウェア・アップデートでSafariの最新版をインストール。


また、エラーコード:AF0020-701 については
ここにあるが、Safariを一旦落として、Safari.appの情報を開いて、詳細設定で、32ビットモードで起動するにチェックを入れる。

後は、この辺参考にしました。
e-Tax奮闘記

計算しなくてい良いので、手書きの申告よりずっと楽でした。

4.3.11

int argc, char *argv[]の中には何が入っているのか



glutだとglutInit(&argc,argv)で初期化を行う。

argcとargvには何が入っているか出力してみた。

#include <stdio.h>
int main(int argc, char *argv[]){
printf("argc=%d\n",argc);
printf("argv[0]=%s\n",argv[0]);
printf("argv[1]=%s\n",argv[1]);
}

で、コンパイルして
$./a.out
で実行すると、以下の結果が出た。
argc=1
argv[0]=./a.out
argv[1]=(null)

というわけでglutの初期化をmain関数以外で使うには、こんな感じしたらできた。

#include <GL/glut.h>
#include <stdio.h>

void func(int argc, char *argv[]){
glutInit(&argc,argv);
}

int main(int argc, char *argv[]){
char *v[]={"window name"};
func(1,v);
glut...;//他のglut関数
return 0;
}

C, C++で配列を返す関数

C、C++では配列を返す関数は作れない。
そこでポインタを渡してあげれば良い。

以下に対処方法の例。
2次元配列a[3][5]に関数funcで代入をする方法を示した。

=============================
[main.c]
#include <stdio.h>
#include "func.h"

int main()
{
int a[3][5]; //aの宣言
func(a); //aのポインタを関数funcに渡して処理をさせる

/*aの中身の確認*/
int i,j;
for(i=0;i<3;i++){
 for(j=0;j<5;j++){
 printf("%d \n",a[i][j]);
 }
}
return 0;
}
=============================
[func.h]
int func(int (*a)[5]); //関数の宣言
=============================
[func.c]
#include "func.h" //ヘッダーのインクルード
int func(int (*a)[5]){ //関数の中身
 int i,j;
for(i=0;i<3;i++){ //aに i x j を代入
 for(j=0;j<5;j++){
 a[i][j] = i*j;
 } }
 return 0;
 }

2.3.11

エクセルで時刻を24時間以上表示する方法

エクセルで合計時間を計算すると24時間で循環してしまう。

その対処。

セルの書式設定、ユーザー定義で
h:mm:ss

[h]:mm:ss
にする。

28.2.11

Makefileでmakeするときに、g++でコンパイルしたのにccになってしまう現象



Cで作っていたプログラムをC++に変えてみたところ、
Makefileでmakeするときに、g++でコンパイルしたのにccになってしまった。

結論から言うと、main.c -> main.cpp に変えたのは良いのだが、
main.cを残しておくとエラーを起こすようだ。

今回の経過は次のとおりである。

main.cでインクルードしていたfunc.hでcppの関数を使いたかったので、
main.cとfunc.cをmain.cppにfunc.cppに変えた。
main.cとmain.cppは同じ内容である。
func.hにはをインクルードした。

こんなMakefileを作ってmakeしてみた。
# Makefile

# ターゲット(プログラム)名とオブジェクトファイル名
target = a.exe
srcs = main.cpp
objs = $(srcs:%.cpp=%.o)

# 定義済みマクロの再定義
CXX = g++
CXXFLAGS = -g -Wall

# サフィックスルールの適応対象の拡張子の定義
.SUFFIXES: .cpp .o

# プライマリターゲット
$(target): $(objs)
$(CXX) -o $@ $^

# サフィックスルール
.cpp.o:
$(CXX) -c $<

# ファイル削除用ターゲット
.PHONY: clean
clean:
$(RM) $(target) $(objs)

すると、次のエラー。

$ make
cc -c -o main.o main.c
In file included from main.c:3:
func.h:7:20: error: iostream: No such file or directory
make: *** [main.o] Error 1

念のためターミナルに直接コマンドを打つとエラーは起きない。

$ g++ -o a.exe main.cpp
$

エラーをよく見てみると、
コンパイラを$(CXX)に指定しているのに、ccでコンパイルしている。
ちなみに、CXXの中身はg++である。
さらに、よく見てみると!?main.oの後がmain.cになっている。

makeでコンパイルされたのは、main.cppではなく、main.cを自動的にccでコンパイルしていることが分かった。
main.cを削除してmakeしたら無事成功した。

24.2.11

MacPortsでlftpを再インストール on Mac OSX Snow Leopard


lftpは、リモートサーバをターミナルと同じようにcdやlsやmkdirやtab補完まで使えて、非常に便利。

Snow Leopardでlftp使おうと思ったら、関連しているダイナミックライブラリのarchitectureが違うと怒られた。
インストール済みのlftpは、Macbookでコンパイルしたものだから32bitでコンパイルされていて使えないのは当然。
というか、これまでのOpenCVに関する問題もそれが原因。

そこで、macportsで、
$ sudo port install ltp
と打つと、今度はportが32bitだからダメだって怒られた。

結局、ここを参考にして、portsから再インストールして、無事lftpが使えるようになった。

16.2.11

Snow Leopardで32bitビルドの仕方


Snow LeopardにOpenCVをインストールしたはいいが、
コンパイル時にアーキテクチャを指定しないと以下のエラーが出た。
$ g++ -g -Wall -o a.out obj/main.o -L/usr/local/lib -lcxcore -lcv -lcvaux -lml -lhighgui
ld: warning: in obj/main.o, file was built for i386 which is not the architecture being linked (x86_64)
ld: warning: in /usr/local/lib/libcxcore.dylib, file was built for i386 which is not the architecture being linked (x86_64)
ld: warning: in /usr/local/lib/libcv.dylib, file was built for i386 which is not the architecture being linked (x86_64)
ld: warning: in /usr/local/lib/libcvaux.dylib, file was built for i386 which is not the architecture being linked (x86_64)
ld: warning: in /usr/local/lib/libml.dylib, file was built for i386 which is not the architecture being linked (x86_64)
ld: warning: in /usr/local/lib/libhighgui.dylib, file was built for i386 which is not the architecture being linked (x86_64)
Undefined symbols:
  "_main", referenced from:
      start in crt1.10.6.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

obj/main.oや*.dylibのファイルは、x86_64にリンクされていてi386でビルドされいないと言われる。
Snow Leopardのデフォルトのコンパイラが64bitでx86_64であるからのようだ。
32bitまたはアーキテクチャをi386に指定して上げればよいだろう。

$ g++ -m32 -g -Wall -o a.out obj/main.o -L/usr/local/lib -lcxcore -lcv -lcvaux -lml -lhighgui
または、
$ g++ -arch i386 -g -Wall -o a.out obj/main.o -L/usr/local/lib -lcxcore -lcv -lcvaux -lml -lhighgui
これでコンパイルできるはず。

参考:
http://jijixi.azito.com/cgi-bin/diary/index.rb?date=20100505
http://www-utheal.phys.s.u-tokyo.ac.jp/~yuasa/wiki/index.php/MacOSX_Snow_Leopardでld:_symbol(s)_not_foundが出てしまう

13.2.11

Snow LeopardにOpenCV 2.2をインストールした時のエラー対処


Snow Leopard Mac OS X 10.6.6に、OpenCV 2.2をインストールしてみた。

ここここを参考にして、
http://opencv.jp/downloadから、ダウンロードしてきて、
CMakeを使って、makeファイルを作って、ターミナルで
$ make
と打ってみたが、以下のエラーが出た。
ld: symbol(s) not found
collect2: ld returned 1 exit status
make[2]: *** [lib/libopencv_highgui.2.2.0.dylib] Error 1
make[1]: *** [modules/highgui/CMakeFiles/opencv_highgui.dir/all] Error 2
make: *** [all] Error 2

ググったらここが出てきた。
revisionのr3277がSnow LeopardとUbuntuで問題のようだ。
それなら、最新版をインストールすればよい。
$ svn co https://opencvlibrary.svn.sourceforge.net/svnroot/opencvlibrary/trunk opencv
とし、
CMakeでCMAKE_OSX_ARCHITECTURESをi386に指定して再度makeファイルを作った。
architecturesをi386に指定するのはopencv2.2が32bitに対応していて64bitには対応していないからだ。Snow Leopardのデフォルトではコンパイラがx86_64なので64bitでビルドされてしまう。
$ make
今度は先程のエラーがでなくなった。
$ sudo make install
無事インストール出来た。

4.2.11

Parallels 6 for MacのファイルをターミナルからみたときのPATH

Macのターミナルから、Parallels上のファイルにアクセスした。

$ cd /private/tmp/1045/C/
でCドライブにアクセスできる。

tmpとあるし、1045なので、この番号は変わるかも。

$ find / -name Windows
これで調べただけ。

/Volumes/とかにあるかと思ったけど違うんだね。