2013年9月26日木曜日

Gmailによる他メールサーバ・アカウントの管理

今時は複数のメールアカウントを持っていて、用途に応じて使い分けている方が多いと思います。私も、Gmailがメインですが他にも2つ持っていてそのうち一つ(仮にアカウントAと呼びます)をGmailに転送する設定にしています。(もう一つはなぜかやたら迷惑メールが来るので、ほとんど使っていません)
おかげで普段はアカウントAは直接チェックせずにGmailだけで確認が済み、メールのチェックが非常に楽になりました。しかし時々、アカウントAに来たメールをアカウントAで返信したいのですが、そのためにいちいちアカウントAを使うためのメーラーを起動していました。(Gmailから返信すると、fromがGmailアカウントになってしまいます)これが非常に面倒くさくなってきたので、GmailアカウントAから転送されたメールに返信するさい、アカウントAから直接返信されたようにする設定にしました。

昔、何かの記事でそういうことができるという記述があったのですが、その時は必要性をあまり感じていませんでした。改めて調べてみるとよく意味のわからにオプションもあったので、設定方法をメモしておきます。(ブラウザでGmailを使用している前提で話をします)

1.「設定」でメールアドレスを追加
画面右上の歯車マークから「設定」を選択し、設定画面にします。そのうちの「アドレス」タブにある「名前」のところの「メールアドレスを追加」をクリックします。(図は追加後なのでメールアドレスがすでに2行あります。1行目がデフォルトでGmailのアカウント、2行目がアカウントAです。)

(プライベートな情報は消してあります)

2.追加したメールアドレスの設定
すると別ウインドウが表示されるので、そこにアカウントAのメールアドレスを追加します。


ここで「エイリアスとして扱います」というチェックがあります。こいつの意味は後程説明します。メールアドレスにアカウントAを入力し、「次のステップ」をクリックします。するとGmail経由で返信するか、アカウントAのメールサーバ経由で返信するかの選択がでてきます。(注:Gmail経由で返信するというのは、おそらくメールヘッダのfrom欄にはアカウントAが表示されるんでしょうが、返信自体はGmailメールサーバからから送られるんだと思います。見た目はいいかもしれませんが、今時はセキュリティの問題からGmailのような無料のフリーメールはブロックしてしまうメールサーバもありますので、この設定は問題がでる可能性があります)アカウントAのSMTPサーバ経由をチェックして、当該SMTPサーバの設定をします。(どういう仕組かSMTPサーバの名称とポート番号は最初から設定されていました。これまで受信したメールの情報を調べたんだと思います。あとアカウント名にはアカウントAの@マーク前の文字列が入っていました。あとはパスワードを入力するだけです。(注:ここでアカウントAのメールサーバのパスワードを入力しないといけません。このパスワードはGoogleのサーバに送られます。これは他のPCでもこの設定を使えることから確認できます。セキュリティ上、どうよという気に少しなります)これでアカウントAから転送されてきたメールにGmailから返信するとき、アカウントAのSMTPサーバ経由で返信できるようになります。(複数のアカウントを登録すると、返信メールのfrom欄でどれを使うか選択できるようになるそうです)

ところで、「エイリアスとして扱います」の意味ですが、デフォルトではこれはチェックが入っています。この状態でGmailアカウントAにメールを送信(返信を含む)すると、アカウントAの転送設定のせいでGmailに送られてきてしまい、本来の返信ができません。先ほどのGmail経由から返信するという選択と関連しているかもしれませんが、これでは困るのでチェックを外します。

2013年9月23日月曜日

Windowsプログラムのメモリ不足

2013/8/16にLinuxプログラムがどれだけのデータ量を扱えるか実験してみました。そのときのサンプルプログラムをWindows7の32bit、64bit双方に移植してみて、動作を比較してみます。

1.Linuxの結果(復習)
1回400kBのmallocを8017回(3GB超)でmallocエラー(メモリ不足)になりました。

2.Windows7(32bit)の結果(Visual Studio 2010)
mallocを5275回(2GB程度)でmallocエラーとなりました。Linuxでいうheapにあたるデータエリアは2GBフルに扱えるようです。

3.Windows7(64bit)の結果(Visual Studio 2012)
mallocが5225回(2GB程度)でエラーになりました???あれ、ちょっと結果が予想と違います。デフォルトのplatformがwin32(32bit)なんですね、すぐに気づきました。ビルド→構成マネージャでビルドするバイナリのplatformを指定できるので、win32→x64に変更して再ビルドして実験です。
サンプルプログラムは10,000回のfor-loopをしますが、簡単に回りきって(メモリ取得に全部成功、4GB程度のメモリを取得)しまいました。

まあほぼ予想通りの結果が得られました。ちなみに上記3つの試験を行ったPCは全部別々です。Linuxは古いPCでメモリが1GBしかなかったので、サンプルプログラムの実行に結構時間がかかりました。Swapが結構発生していましたからね。(2分くらい。swapエリアは5GB設定してあり、2.5GBほど使ってmallocエラーになります。)
一方、Windows7(32bit)でも4GB、Windows7(64bit)は6GBのメモリを搭載したPCだったのでほとんどswapは発生しません。ちなみにswapを発生させるほどWindows7(64bit)でmallocの回数を増やしたところ、処理負荷がすごいことになりマウスも思うように動かなくなってしまい、途中終了させるのにかなり時間がかかりました。あいかわらずWindowsでSwapが発生すると、動作がひどい状態になります。(最近のPCは平気で4GBのメモリもっているのが多いので気づきませんが、swapの処理の重さが更にひどくなったような気がします)

2013年9月18日水曜日

Windows7(64bit)へのVisual Studio 2012 Express for Desktopのインストール記録

メインにしているマシンであるWindows7(64bit)、これまでJava(Eclipse)でしかプログラミングに使っていませんでしたが、ちょっとC++が使いたくなり、Visual Studio 2012 Express for Desktop(これがこれまでの通常のアプリ開発版らしい)をインストールしてみました。ところがこれが思いのほか問題が出たので、メモしておきます。

1.Visual Studio 2012 Expressのインストール最初のトライ
最初はオンラインでやってみたんですが、結局何か問題が出たといってきて途中終了してしまいました。そのときは特にエラーコードらしいものを出してくれなかったので、しかたなくMicroSoftのHPからインストールイメージをDLして、CD焼きました。それで挑戦してみてもやはりエラー、ただし今度は何が悪いのか表示してくれました。

→Net FrameWork 4.5のインストールに失敗しました

意味がわからず何回か試してみたんですが、時にはSQLのモジュールインストールに失敗したといってきたこともあり。ただ、このNet FrameWork 4.5のエラーがよくでてきました。(結局、数回トライしてみました)意味がわからず、コントロールパネルからこのPCにインストールされているNet FrameWorkを調べてみると、1.xくらいのかなり古いものでした。どうも、Visual Studioをインストールする条件に4.5が必要なようで、それのインストール(アップグレード?)に失敗しているようです。

注:このときネットをぐぐってると、あるサイトに「C:\ProgramDataのアクセス権をEveryOneに許可しろ」というのがありました。管理者権限のあるアカウントでインストールしているのに何で?と思い当該フォルダのアクセス権を調べてみると、管理者権限のあるアカウントに対してもここはフルアクセスじゃないんですね、ここ。(読み取りと実行しかありませんでした)一瞬これかと思ったんですが、ちょっとこの変更はやばくね?と思い、やめときました。結果、これは関係なく、セキュリティ上あぶない状態にPCをしてしまうところでした。

2.Administratorアカウントでインストールする
上記のことがあり、もしかしてと思いAdministratorでログインしてみました。といってもデフォルトではWindows7には起動時にAdministratorのアカウントは表示されません。ネットで調べると、(古い記録で)コントロールパネルのユーザー管理のところに制御用のスイッチがあるというのがありましたが、現時点(20130918)ではそんなものありません。どうも許してくれないようです。(セキュリティが厳しくされたか?)しかたなくさらに調べて、DOSプロンプトから以下のコマンドで可能になることがわかりました。

> net user administrator /active:yes

これでログオフすると、ログイン画面にAdministratorアカウントが表示されるようになります。(おそろしいことにデフォルトはパスワードなしです。これをやったらパスワードを設定するか、またAdministratorではログインできないようにしたほうが安全です。もとに戻すには、/active:noとするだけです。ただし、Administratorでログインするか管理者権限のあるDOSプロンプトでないと、/active:noはエラーになるようです。)
しかし、エラーの表示は変わりません。

3.Net FrameWork 4.5のインストール
しかたないのでまず先に単独で、Net FrameWork 4.5をインストールすることにしました。やはりMicroSoftのHPからパッケージをDLしてインストールしようとしたんですが、今度は以下のエラーコードを表示して途中終了してしまいました。

→ 0x8000222 Windows Updateのエラー

またまたネットをぐぐると、同じコードでいくつかひっかかりましたが、Windows Updateのエラーの場合はどうも重症のようで10行のDOSコマンドのbatファイルを作り、それを管理者権限で動かさないといけないようです。中身をみても何やっているのか意味がわかりませんが(なにやらビット制御?らしきコマンドやってます)、試しにやってみると、無事Net FrameWork 4.5のインストールができました。

4.再度、Visual Studio 2012 Expressのインストール
これで管理者権限のある通常使っているアカウントでも無事インストールできるようになりました。

かなり苦労しましたが、これってWindows7(64bit)だから?よくわかりません。

追記@20130922
実際に使って見ようと動かしてみたら「このWindowsのバージョンでは既知の互換性の問題があります」と言われてしまいました。そのまま解決策を調べるのボタンを押してみたら、MSのHPに「Net Framework 4.5を更新すると、Visual Studioはこの不具合により不安定になる可能性があります」とでていて、patchが置いてありました。このところやたらセキュリティ更新が続いてました(Kernel baseも2、3回更新されたような)が、なんだよこれは!一緒に更新しといて欲しいもんです。(patchを実行したら無事動きました)

2013年9月16日月曜日

ART-Linuxの実験 プロセス周期動作の精度

以前、ART-Linuxのプロセス起動に関してリアルタイム性を簡単なプログラムで見てみました。その結果、1ms周期とか10ms周期で動かすと少し設定より早めに処理が動く結果を得ました。(「プロセス起動」というよりは、正確にはプロセスは起動しっぱなしなので、その中での処理の周期動作の制御(タイマ割り込み)ですね)

このときは1台のPCで結果を調べてたので、周期動作の制御が悪いのか、時間計測の精度が悪いのかはっきりしないところがあったので、外部に信号を出してみることにしました。具体的には以下の様な形態で実験してみました。
PC1:10ms(or 5ms)で周期的にPC2に対しICMPパケット(Request)を送る。
PC2:WireSharkを起動しておき、PC1からくるICMP(Reqest)に対し、ICMP(Reply)を何時返信したか時間を記録する。

要は、PC1から周期的にPC2に対しPingを送って、その時間を計測するわけです。これならPC1のタイマ制御がおかしいならPC2の記録からわかります。
ところでWindows7ってPingに対してどれくらいで返信するのが通常なんでしょうか?この実験をする前に、別途手動で確認してみると数十usで返信していました。確か、今はある程度簡単な処理はCPUの処理なしでEthernetコントローラの方でHW的に行ってしまうという話を以前聞いていたのですが、どうもそのようです。しかもそれがWireSharkでログもできているので、実験環境としては問題ないでしょう。(あれ?でもその動作時間までログができているということは、どこかにCPUの処理が入っているはず。現状はどこまでHWでやっていて、どこをCPUで処理してるんだろ?)

20130928追記:
snappyの実験をしてて、100KBのデータの解凍をPC2が約70usで処理してしまいました。そうなると上記Pingの処理時間ではCPU処理の可能性もでてきました。PC2の処理負荷が高い状態で、PC1にてWireSharkによりログとってみないとよくわかりません。

結論からいうとPC1での測定結果と、PC2での測定結果はほぼ同じでした。つまり、PC2のログを見てもPC1からくるICMP(Request)は少し早くなってました。(ただ詳細に見ると、個々の周期間隔は数十us早かったり、遅かったりもしていました。傾向的に早い場合が多いという感じです。) 10ms(or 5ms)を10,000回行い、WireSharkのログをExcelでグラフを描いてみると、何か階段状に処理周期が早くなってました。ただそれが10,000回で20回の段差があるかないかなので、個々のデータを見ても何が起きているのかわかりません。何の周期処理とぶつかっているのかわかりませんが、定期的にタイマ割り込みが設定より早く発生することが続く(?)という感じです。

10msを10,000回実行:最終的に15ms早く終了
5msを10,000回実行:最終的に7.5ms早く終了

単純にタイマ割り込みの精度計算すると、どちらも0.15%の精度ということです。用途によっては十分な気もしますが、自分で周期を作り出す制御をする用途に使う場合はちょっと微妙なところです。ただ外部からより正確な周期で信号が送られてきて、それに対して反応するには周期の周波数にもよりますが、十分な気もします。まあとりあえず、実験例という程度の参考データが一応とれました。

2013年9月4日水曜日

LibreOfficeのソースからのビルド:実行編

ビルドできたものがちゃんと動くか確かめないといけません。かといって正式にインストールしてしまうのはちょっと困ります。(既にCentOS6でインストールされている古いものとぶつかります)
そこで、以下のコマンドを実行します。

$ made dev-install

これを行うと、しばらく時間がかかりますがビルドしたところに、install/というパッケージを作ってくれますが、install/program/sofficeで今ビルドしたものを直接実行できます。
実行してみると、、、、メニューがやはり英語だ(^_^;) まあローカライズの設定せずにやってますから、予想はしてましたけどね。とりあえず動くようです。

さて、今度はもっとパワーのあるマシンを用意してチャレンジしてみますか。

注:上記の複数バージョンが動く話、ベータバージョンに限るという情報がありました。(RCはだめとか)そういえば、このソースはLibreOffice4.1のパッケージ版おとしてるところからソースをとってきたんだけど、起動時のダイアログになぜかベータで表示されていたよな・・・・(Helpで見ると、Ver4.1.0.4となっており、もしかして4.1からの開発版?)

LibreOfficeのソースからのビルド:ビルド編


さて早速ビルドをはじめます。まず何もオプションをつけずに実行。

$ make

そうしたら何かのライブラリらしきものをLibreOfficeのサーバーから大量にwgetし始めました。
(よく調べたら、最初に"make fetch"しとけと注意書きがありました。(-_-;))
随分時間がかかりましたが、しばらくビルドが進んで、png.hがないとエラーになりました。
当該箇所のソースを見ると、どうも描画ルーチンの模様。ということで以下のコマンドでlibpngの開発パッケージをインストール。

$ sudo yum install libpng-devel

autogen.shのチェックには入ってなかったようです。

更に数時間ビルドしてると、システムに入れてあったウイルススキャンが、ビルド中に/tmp以下に作成される作業用データをmalwareと警告してきて、ビルドが止まってしまいます。しばし悩みましたが、しかたなくビルド中はウイルススキャンを切りました。

更に数時間(とにかく時間がかかる・・・)、エラーがでて以下の3つのうち再チャレンジしてみろと。

Error: a unit test failed, please do one of:

export DEBUGCPPUNIT=TRUE            # for exception catching
export GDBCPPUNITTRACE="gdb --args" # for interactive debugging
export VALGRIND=memcheck            # for memory checking

and retry using: make CppunitTest_sd_filters_test


export DEBUGCPPUNIT=TRUEを試してみると少し進みましたが、その先でまたエラーがでて同じ推奨が・・・

エラーの内容がどうもunittest(単体試験)に失敗したとのこと、いやそんなの修正方法わかんないよ\(-o-)/ 開発中の最新版はあきらめて、最新リリースの4.1のソースをDLしてきて再度チャレンジ。
しかしやはり単体試験で落ちる。VALGRINDのexportしたら、単体試験のところでmemory errorで落ちているといわれる始末。(basic_scannerの試験といわれても、scaannerのドライバ入っているかどうかもわからない)
仕方ない、本気でgdb見てみるかと思い、デバッグ可能にするオプションを探します。

./autogen.sh --disable-gconf --disable-gtk --without-junit --disable-cve-tests --enable-symbols

デバッグ可能にする以下のオプションでmake開始。

make -sr ENABLE_SYMBOLS=true

export DEBUGCPPUNIT=TRUE
export GDBCPPUNITTRACE="gdb --args"

を設定したが、単体試験のところでかかっても何も情報がでない。(どうもexceptionでプロセスの外に出てから、gdbにかかっている模様)よくエラーを見たら、いつの間にかVALGRINDもexportしていて、そちらの方でmemory errorをひっかけて停止していました。

VALGRINDは無効にしたところ、なぜか単体試験が通る(ビルドが先に進む)ようになった???
しかし恐ろしく時間がかかり(途中からのビルドなのに10時間たっても終わらない)、特に単体試験がやたら時間がかかります。プロセスとメモリの利用状況を調べてみると、gdbが1.3GBのメモリを喰ってる!どうもGDBCPPUNITTRACEのフラグにより、gdb下でmakeが動いているようで、それが恐ろしくメモリをくい、swapの嵐になっているようです。(今回のマシンは古いのでメモリが1GBしかない)

ちょっと考え直してみましたが、これまでビルドが止まってたのは決まって単体試験でした。しかもマシンのパワーが貧弱なこともあり、夜通し動かしていたことがよくあり(この暑いさなかクーラーのない部屋で)、しかも普通のPCです。長時間動かして熱にメモリがやられていたのかもしれません。あるいはswapが激しくて、長時間運転のうちにハードエラーが起きたか。
あらためて残りの部分のビルドは素直にやってみたら、なんとか通りました。
(結局、デバッグ用シンボルの作成は意味なかったです)

PS
ちょっとこの単体試験でビルドが止まる現象を落ち着いて考え直してみました。最後にやっとビルドが通るようになったと書きましたが、実際にはある単体試験で止まっても、継続するとなぜか次では通り少し進んで、別の単体試験で止まるということを繰り返しました。
gdbのところでプロセスサイズの話をしましたが、今回初めてLibreOfficeをビルドしたので、各種機能をほとんど盛り込んで(withoutせずに)ビルドしました。そのためプロセスサイズが大きくなり、単体試験を続けて実行中、Heapのメモリがなくなってきた現象が発生したのかもしれません。
フル機能のLibreOffficeをビルドしようと思ったら64bitOSでないとダメ?