• 検索結果がありません。

test CreateIndex test.helpindex test Info.plist XCode Info.plist CFBundleHelpBookFolder string test CFBundleHelpBookName string test.html AppleTitle J

N/A
N/A
Protected

Academic year: 2021

シェア "test CreateIndex test.helpindex test Info.plist XCode Info.plist CFBundleHelpBookFolder string test CFBundleHelpBookName string test.html AppleTitle J"

Copied!
15
0
0

読み込み中.... (全文を見る)

全文

(1)

独り言日記

Mac

でのヘルプの実装方法(

2008/10/23

アプリケーションでの Mac でのヘルプの実装方法の覚え書きです。Mac では HelpBook というそ うです。 http://developer.apple.com/documentation/Carbon/Conceptual/ProvidingUserAssitAppleHelp/user_help_intro/chapter_1_section_1.html 結構試行錯誤した点があるのでそれを強調して書きます。

■ヘルプの元を

HTML

にて作成

[test] test.html test2.html みたいなファイル構成を行い、開始ページは index.html じゃなくてフォルダ名と同一のもの(ここ では「test」)としています。もちろん、CSS や画像ファイルなどはそのまま HTML として作成、配 置していきます。フォルダは階層構造になっていて OK です。a href でリンクをたどることがで きるようにしておきます。

■トップページ(ここでは

test.html

)にてアプリケーションで識別する名称を入れる

test.htmlをテキストエディタで開き、ヘッダ部分を見ます。 <html> <head> <title> トップページのタイトル </title>

<meta http-equiv=Content-Type content="text/html; charset=SHIFT_JIS"> <META NAME="AppleTitle" CONTENT="MyApp">

<link rel="stylesheet" type="text/css" href="./style.css" /> </head> まず、日本語の検索をまともに行えるようにするには ShiftJIS である必要があるようです。これ は 1 つめのメタタグで指定してる部分。もちろん、ファイルは ShiftJIS(Mac の場合はファイルエ ンコーディングを「日本語 (MacOS)」)にして保存します。 2つめのメタタグにて、「AppleTitle」というのに「MyApp」としています。これは、アプリケーショ ンサイドから呼ぶ場合に必要な識別名です。 最低限、この2つがトップページに設定されていれば認識できます。その他、キーワード指定や アイコン指定などがあります。上に書いている URL の Apple のサイトに詳しく書いてます。

■インデックスの作成

XCode をインストールしたときに Developer というフォルダが作成されています。ここの 「/Developer/Applications/Utilities/Help Indexer」を起動します。これがヘルプのインデックス(索引) ファイルを作るアプリケーションとなってます。

Help Indexer のメニューより Preference を選択し、設定ダイアログを出します。Minimum term

(2)

フォルダ指定のダイアログにて、先ほど作成した「test」フォルダを指定します。「CreateIndex」ボ タンを押すと処理が開始され、「test.helpindex」というファイルが「test」フォルダ内に生成されま す。 [test] test.html test.helpindex <= New!! test2.html な感じ。

■アプリケーション側の

Info.plist

XCodeにて、Info.plist をプロジェクトに加えていると思いますが、これを開きます。以下2行が ない場合は追加します。 <key>CFBundleHelpBookFolder</key> <string>test</string> <key>CFBundleHelpBookName</key> <string>MyApp</string>

「CFBundleHelpBookFolder」の string にて、作成したインデックスおよびフォルダ名である test を 指定、「CFBundleHelpBookName」の string にて、test.html のメタタグ AppleTitle で指定した名称を 指定します。

■日本語リソースのフォルダを作成し、プロジェクトに追加

「Japanese.lproj」というフォルダを作成します。その中に「InfoPlist.strings」というテキストファイ ルを作成していれる、先ほどの [test] フォルダを丸々コピーします。 [Japanese.lproj] InfoPlist.strings [test] test.html test.helpindex test2.html

この「Japanese.lproj」を XCode の「Resources」グループに入れるわけですが、ポップアップメニュー

の追加 - 既存のファイルにて追加する際に、参照タイプは「内包しているグループを基準」、ラジ オボタンの「追加したフォルダにフォルダ参照を作成する」を選択するようにします。これを間 違えるとアプリケーションパッケージにフォルダ階層がない状態で展開されてしまいますので、 ヘルプを呼び出すことができなくなります。 つ い で に。Japanese と あ る の で わ か る と 思 い ま す が、English や そ の 他 の ロ ー カ ラ イ ズ も 「XXXX.lproj」フォルダに分けていれることで、リソースを言語別に(ヘルプも含めて!)分離で きるのがわかりますね。 後、「InfoPlist.strings」の中身をテキストファイルとして編集します。 CFBundleName = " アプリケーション名 "; NSHumanReadableCopyright = "Copyright 2008-2008 自分の会社名など ";

(3)

アプリケーション名は、アプリ起動時に Apple メニューの右に表示される名称です。コピーライ トはそのまんま、コピーライト情報を記載します。なお、UTF-8 で保存するようにしてください。 以上にて、リソース関連の設定は OK です。まだ、Carbon のプログラムの場合は細工がいります。

■プログラムの先頭にて以下を追加

プログラムの開始部分(初期化部分)にて、 CFBundleRef myApplicationBundle; CFURLRef myBundleURL; FSRef myBundleRef;

OSStatus err = noErr; myApplicationBundle = NULL;

myBundleURL = NULL;

myApplicationBundle = CFBundleGetMainBundle(); if (myApplicationBundle == NULL) { err = fnfErr; } if(err == noErr) {

myBundleURL = CFBundleCopyBundleURL(myApplicationBundle); if(myBundleURL == NULL) { err = fnfErr; }

if(err == noErr) {

if(!CFURLGetFSRef(myBundleURL, &myBundleRef)) err = fnfErr; if (err == noErr) err = AHRegisterHelpBook(&myBundleRef); } } を挿入します。Apple のサイトの例そのままですが、HelpBook をキックできるように登録処理を 行ってます。はじめの 1 回だけで OK です。 後は、XCode にてアプリケーションをビルドします。パッケージ内の Resources フォルダに 「Japanese.lproj」以下がそのまま入っていれば OK です。 これで、アプリ起動にてメニュー一番右端の「ヘルプ」より検索、トップページ呼び出しのファ イルメニューが表示されてます。 というところまでたどり着くまでに結構苦労してしまいました。Mac のヘルプはインデックスの 一覧表示はないんですね。ですが、単なる HTML ヘルプではありますので、Windows と大部分は 共通化できそうではあります。

続・

Mac

でのメモリ管理が怪しい?(

2008/10/22

うむ、この問題、Shade でもまったく同じですな。実メモリ 700MB くらい消費で待たされてます。 ということで、Apple 突付きはイーフロにバグレポートするとして間接的につついてもらおう。 英語できる方いらっしゃるでしょうし。この際、巻き込んでしまえ(苦笑)。

Mac

でのメモリ管理が怪しい?(

2008/10/22

Macにてパフォーマンスチューニングしていて、気になるというか「回避できないかも」という でかい問題に出くわしました。 大きな hdr ファイル(約 50MB)をメモリ上に展開している部分です。メモリでは 6000x3000pixel で RGBE4 バイト /pixel にて、約 72MB になります。これを単純にメモリ確保しているところをア クティビティモニタで観察してみました。

(4)

hdr ファイル読み込み+メモリへの展開は数秒で終わるのですが、その後大量にメモリを消費。 650MB くらい何やってるんだろう、という不振な動きをしてます。この間、当然ながらアプリ ケーションは動作がカクカクになってしまいます。1 分くらい待つと、メモリ使用量はがたっと 減って元のメモリ使用量に戻ります。 メインスレッドでのメモリ確保・サブスレッドでのメモリ確保、両方試したのですが同じ。再現 率 100%ですが、アプリ開始時の初期化処理での読み込みでは問題なかったり。同じルーチンを 通ってるのになぁ。 メモリ確保量が小さい場合は問題ないです。Win ではまったく問題ない部分なので、どうも OS の バグっぽいなぁ。試しにファイル読み込みはせずに単純に

int wid, hei; wid = 6000; hei = 3000;

char *pBuff = (char *)malloc(wid * hei * 4); free(pBuff); みたいなコードを流しこんでみてもやっぱり同じ状態に。 う∼む、もうちょっとこじんまりしたソースで再現性を確認して Apple に申告したほうがよいの だろうか・・・。自分アプリの何かがトリガーになってる可能性ももちろんありますけど、3D 関 連のツール類にてメモリ確保処理でこれくらいでへこたれてしまってはちと困りますねぇ。動 き的にはメモリ解放を遅延させるガベージコレクションっぽい動きではあるのですが、、誰か同

(5)

じ現象に出くわしてないかな。解決策が見つからん・・・。 追伸: Mac標準アプリの「プレビュー」では 6000x3000pixel の hdr を見るともっとえらいことになります ね。メモリ消費量は実メモリ 700MB くらい、5分くらい待ってようやく出てきました。しかも、高 解像度な画像のはずなのにボケボケじゃないすか。メモリ 1GB 積んでいる MacBook なんです が、、、。

wxWidgets

Mac

版(

wxMac

)での

AUI

のバグを修正(

2008/10/21

下に書いた Mac 版 wxWidgets の AUI にて、フローティングウィンドウが移動するたびに縦方向に 小さくなる問題を修正してみました。wxMac 2.8.9 にて。「src/aui/framemanager.cpp」を編集しま す。変更箇所は wxAuiManager::Update 関数内です。 if (p.IsFloating()) { if (p.frame == NULL) { frame->SetPaneWindow(p); p.frame = frame; // 以下を追加する #if __WXMAC__ p.frame->SetSize(p.floating_pos.x, p.floating_pos.y, p.floating_size.x, p.floating_size.y + 28, wxSIZE_USE_EXISTING); #endif

if (p.IsShown() && !frame->IsShown()) frame->Show(); } else { // 以 下 を 追 加 す る #if __WXMAC__ if ((p.frame->GetPosition() != p.floating_pos) ││ (p.frame->GetSize().GetWidth() != p.floating_size.x ││ p.frame->GetSize().GetHeight() != p.floating_size.y + 16)) #else

if ((p.frame->GetPosition() != p.floating_pos) ││ (p.frame->GetSize() != p.floating_size)) #endif { p.frame->SetSize(p.floating_pos.x, p.floating_pos.y, // 以下を追加する #if __WXMAC__ p.floating_size.x, p.floating_size.y + 16, #else p.floating_size.x, p.floating_size.y, #endif wxSIZE_USE_EXISTING); // 以 降 は 同 じ } } 「WXMAC」と表記した部分を追加しました(WXMAC は Mac のためのプリプロセッサです)。何 を 変 更 し た の か と い う と、「wxAuiPaneInfo.GetSize().GetHeight()」で 取 得 で き る 高 さ と 「wxAuiPaneInfo.floating_size.y」での高さはキャプション分の差がある、という部分を吸収してい ます。その差はちょうど 16pixel になってます。

(6)

どうも、AUI 上ではフレームのサイズと保持しているフローティングウィンドウの高さを同じも のとしているようですが、実際はキャプション分を上乗せしていないため、ずれてしまいます。 この場合は Update が呼ばれる(=移動する)たびにどんどん縦方向に縮んでいくんですね。 「 if (p.frame == NULL)」のカッコ内は、一番始めにフローティングウィンドウを出すときに通りま す。wxAuiManage::LoadPerspective の処理時、ドッキングからフローティングウィンドウに移行す るときなど。なぜ 28 を加算しているかは、、、なんででしょう。いずれにせよ、これでずれなくな りました。 ということで、手を加えないはずの wxWidgets 内に手を入れてしまいました。

wxWidgets

Mac

版(

wxMac

)での

AUI

でのフローティングウィンドウのずれ

2008/10/21

wxWidgetsの Mac 版にて AUI も使えるのですが、サンプルのもそうですがフローティングウィン ドウを移動させると高さが -16 小さくなりますね。なので、移動するたびにどんどん小さくなり ます。ソース上は framemanager.cpp の Update 関数内を修正すればよいのかな。

サブスレッドから

OpenGL

命令を呼んではいけない(

2008/10/20

自分用メモ。

OpenGLの命令(glXXXX の関数)は、メインスレッドでないところから呼ぶと Mac 環境では落ち てしまいます。Windows ではいけるのですが、OS 依存をなくすために OpenGL 処理はメインス レッドでキックできるような仕組みにするほうがよさげです。クリティカルセクションで保護 してもアウトだったので、単純に「メインスレッドから呼ぶべし」という条件のようですね。 後、これは当たり前ではありますが複数スレッドから OpenGL 命令をキックしないこと(上と同 じ意味になりますね)。バッティングした場合にどう動くかはドライバの判断になりますので、 可能なら直列で(Queue 管理でもして)送るように。ただ、Vista とか OS レベルでハード(これ は OpenGL というよりも DirectX ですが)に密着してるものでは、さすがに対応しているのかもし れません。が、そのあたりはよく分かりません。 後、Vista は OpenGL の実装の仕方によってはほんとに簡単なアプリであっても激重になります。 マルチコアでかつ Vista では不安定、なのは新しいドライバに変えたとしても起こりえる場合があ

りますので、このあたりは作法で回避、です。wxWidgets の OpenGL の wxGLCanvas では今のとこ ろ重くはなってないです。これ、ちょっと前までは自前 OpenGL でやってたのですがかなり不安 定でした。何がトリガーなんでしょうね。

Mac OS X

XCode3.0

での

wxWidgets

2008/10/18

XCode 3.0にて、wxWidgets( 今は 2.8.9) をビルドしてみたときの覚え書きです。

http://www.wxwidgets.org/

(7)

マンドラインからでは簡単なんですけどね。

■どれがプロジェクト?

wxMac-2.8.9/src内の「wxWindows.xcodeproj」を Xcode3.0 にて開きます。はじめに「src」内に作業 領域を作るか、みたいなのを聞いてくるので OK ですすめます。これで、src ディレクトリ内に 「build」ディレクトリができ、ここにコンパイル、ビルドしたファイルが入ります。

setup.h

の設定

XCodeでの「グループとファイル」のツリー表示されてる部分より、wxWidgets/include/wx/setup.h を開きます。OpenGL を使用する場合は「wxUSE_GLCANVAS」を 1 に、トグルボタンを使う場合 は「wxUSE_TOGGLEBTN」を 1 にします(Mac の場合はなぜかデフォルト 0 になってる)。

Unicodeにて wxWidgets を統一したほうが後々楽ですので「wxUSE_UNICODE」も 1 にします。

■ソースをいじる

wxAuiToolBar というクラスを定義していないのになぜか使ってる箇所があるのでコメントアウ ト。/src/aui/framemanager.cpp の AddPane 関数内の「if (pinfo.HasGripper())」の部分をすべてコメン ト化。

■ターゲット

SDK

の変更

「wxWindows」プロジェクトの「情報をみる」にて、「一般」の「ターゲット SDK を使用したクラ

ス開発」で、「Mac OS X 10.4(Universal)」を選択。0S X 10.5 のままだと wxWidgets に限らず、うま いこといかない場合がありました。不安定なのかな。

■コンパイラオプション変更

wxWindowsプロジェクトの「情報を見る」より、ビルドオプションの「インラインメソッドを隠 す」を On にする。static の「情報を見る」より、ビルドオプションの「除去スタイル」を「すべ てのシンボル」にする。「デッドコード除去」の On、「デフォルトでシンボルを隠す」を On にす る。XCode では、コンパイラオプションがライブラリ側とアプリ側にて異なっている場合は警告 が出るかエラーになるようです。鬼のように警告が流れる場合は、コンパイラオプションをライ ブラリ側とアプリ側で見比べてみるのがてっとりばやい解決策に結びつきそうです。

■ビルド!!

「アクティブなビルド構成」を Deployment にし、グループとファイルのターゲットにて「static」を ビルドします。すると、build/Deployment/libwx_mac_static.aが生成されます。これが wxWidgets の 静的ライブラリです。 ということで、以上が XCode での静的ライブラリ「libwx_mac_static.a」を作成する手順です。 wxWidgetsを活用したいアプリケーション側では、ヘッダファイル、ビルドした静的ライブラリ、 そしてフレームワークを参照する必要があります。以降は、ライブラリじゃなくてそれを利用す るアプリサイドの設定です。

wxWidgets

ヘッダファイルの置き場所

wxMac-2.8.9/src/build/include wxMac-2.8.9/include

(8)

前者は「setup.h」の置き場所です。環境によって違いますので注意。これを、アプリケーションビ ルド時のヘッダ検索パスに入れます。

wxWidgets

ライブラリの置き場所

wxMac-2.8.9/src/build/Deployment 先ほどビルドした静的ライブラリの出力先です。これをアプリケーションビルド時のライブラ リ検索パスに入れます。

■必要なライブラリ

「libwx_mac_static.a」をプロジェクトに加えます。

■必要なフレームワーク

IOKit.framework CoreFoundation.framework System.framework WebKit.framework AppKit.framework QuickTime.framework Carbon.framework GLUT.framework AGL.framework OpenGL.framework GLUT/AGL/OpenGLは OpenGL 関連にて必要です。

■必要な動的ライブラリ

libz.dylib libiconv.dylib

これらは /usr/lib にあるやつです。wxWidgets のプロジェクトからドラッグしてきました(XCode

の UI 上での入力方法がわからん・・・)。

■プリプロセッサの指定

__WXMAC__ __WXMAC_XCODE__ ビルドオプションの「プリプロセッサマクロ」という部分に上記を追加します。 後は、wxWidgets のソースを書いてビルドするだけ。Windows と同じアプリが出たときはなかな か感動です。画像リソースなどは再度設定しないといけないですね。

新しい

MacBook

2008/10/15

なんか発表になったようで。GeForce のグラフィック搭載はちょっとうらやましいです。 http://plusd.itmedia.co.jp/pcuser/articles/0810/15/news024.html

(9)

低価格の MacBook が値下げしてるし。最近 MacBook を買ったばかりなのであちゃ∼、なんですが

(^_^;;。ほしいときが買い時ではあったのでいたしかたないですね。

MacOSへレンダラを移植中ですが、Windows でいう「WaitForMultipleObjects」の部分を構成から 見直さないと速度アップできないなぁ。今のところ、1 スレッド→ 2 スレッドでのベンチにて 1.5 倍速程度。2 倍にはしたいです。Windows の CoreDuo 機では純粋に 2 倍にいけてるのでいけるは

ず。しかし、レンダラはベンチマークというか CPU を極限まで使う処理に向いてますね。マルチ

コアばんざいです。

POSIXのセマフォにて交通整理してるのですが、複数からの了承待ち+タイムアウト時間がある 待ち (Windows の WaitForMultipleObjects) は sem_wait/sem_trywait では実装できません。というか、

POSIXではその機能はないようでした。もう 1 つタイムアウト用のスレッド+複数待ちでの解除 セマフォを用意すれば同等のことをできるような気がしますので、実験せねば。しかし、スレッ ドはスケジュール管理がパズルですね。コアレンダラ部は、速度面以外では移植は完了しまし た。なんとなくですが、「いや∼、昔に比べて Mac は硬くなったなぁ(落ちにくいの意味で)」と しみじみ思ってます。後、プログラムしやすいです。制御できる範囲は Windows よりも上な気が してます。開発側からしてみれば、Aqua の皮をかぶった UNIX だなぁ。スレッドというか割り込 み部分はどことなくですが、PC-98 を思い出しました(signal での割り込み処理とか。[Ctrl]+[C] な どもフックできますね)。 後、一部リトルエンディアンとビッグエンディアンの問題が発生する箇所があるのですが(bmp 画 像の扱いにて。できるだけ速く読み込み書き込みしたいので、この部分は独自実装してます)、も うモトローラ系は切り捨てていいのかな、Apple も製品として扱ってないようでしたし。画像読 み書きは QuickTime のフレームワークを使ってるのですが、このへん、また日記に書くことにし ます(初期化処理が新旧混在でややこしい部分です)。

Mac OS X

でのセマフォ(

2008/10/13

POSIXのセマフォ機能を Mac OS X で使えるのかチェック中。 http://www.linux.or.jp/JM/html/LDP_man-pages/man7/sem_overview.7.html を参考にしてます。

「名前なしセマフォ」なんですが、sem_init() にて -1 を返しますね。errno を見ると「ENOSYS」が 返ってます。サポートされてないようで (T_T)。

ということで「名前付きセマフォ」を確認。

sem_t *g_sem; ...

// 名前付きセマフォの作成

g_sem = sem_open("/tmp/hoehoe", O_CREAT, S_IRWXU, 0); if(g_sem == SEM_FAILED) {

// エラー !! }

(10)

// ...

// 名前付きセマフォの破棄 sem_close(g_sem);

sem_unlink("/tmp/hoehoe");

これでうまいこと動作しました。

こ れ で Windows で の「WaitForSingleObject」の 動 き は Mac で も 実 装 で き そ う で す。後 は 「WaitForMultipleObjects」っぽいことをどうするか。sem_trywait を複数分まわして判断するのが楽 そうですね。 ちなみに、タイムアウトを指定しての「sem_timedwait」は Mac ではサポートされてないようでし た(関数自体がないです)。 スレッドマスターの道は遠いですねぇ∼∼。UNIX 系は mutex しかいじったことがなかったので (しかもかれこれ 8 年くらい前にちらっと)、このへんは新鮮ではあります。いやはや、このへん の仕組み、よくできてます。 Windowsでいう「CreateEvent」で作成するイベントハンドルでの「SetEvent」(シグナルの発行)は

POSIXの「sem_post」を使う、「WaitForSingleObject/WaitForMultipleObjects」は POSIX の「sem_wait または sem_trywait」を使う、という置き換えになりそうです。

後、POSIX の sem_wait/sem_trywait を呼んだタイミングで、sem_t 構造体内のカウンタは減少する ので、Windows で言う「ResetEvent」は不要、ということですね。POSIX のほうが慣れるとスレッ ド管理は楽そうだなぁ。

Mac OS X

でのスレッド管理(

2008/10/12

Mac OS Xでのスレッド管理は、ThreadManagerを利用する方法や POSIX を使用する方法がありま すが、POSIX が割とわかりやすかったんで(というか、Linux でも使えるので)いじってみました。 #include <pthread.h> が必要です。 その際の Tips など記載です。

■ミリ秒単位のスリープ

/** * ミリ秒単位のスリープ * @param[in] msec 時間待ちのミリ秒数 */

void sleepMS(const int msec) { struct timespec t; t.tv_sec = msec / 1000; t.tv_nsec = (msec % 1000) * 1000000; nanosleep(&t, NULL); }

(11)

sleep関数は秒単位ですので、nanosleep を使います。usleep は過去のものだそうです。

■スレッド関数

スレッドにて別処理される関数を用意します。関数は以下な感じ。中身はアプリ別で独自に実 装のこと。

bool g_stopF = false; ///< 終 了 確 認 フ ラ グ bool g_busyF = false; ///< スレッド稼働フラグ

/**

* スレッドでの処理関数 */

void *myThread(void *data) { g_busyF = true; // 実際はクリティカルセクションにて保護してフラグをたてること while(1) { if(g_stopF) break; // 何か終了条件 // 何か処理 // .... sleepMS(500); // ウエイト ( ここでは 500ms) } g_busyF = false; // 実際はクリティカルセクションにて保護してフラグをたてること return NULL; }

■スレッド停止関数

ここでは、例としてグローバル変数をフラグにしてますが、スレッドとバッティングする可能性 があるため、値の取得・変更時は、mutex(WIndows でのクリティカルセクション)で保護するよ うにします。 /** * スレッドの停止処理 */ void threadStop() { g_stopF = true; // 実際はクリティカルセクションにて保護してフラグをたてること while(1) { if(!g_busyF) break; sleepMS(500); // 500ms のウエイト } }

■スレッドの作成と開始

pthread_attr_t attr; pthread_t posixThreadID; int threadErr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);

threadErr = pthread_create(&posixThreadID, &attr, &myThread, NULL); pthread_attr_destroy(&attr); if(threadErr) { // スレッドの作成に失敗 } これでスレッド関数「myThread」が開始されます。メインスレッドではすぐに処理を返します。

■スレッドの破棄処理

(12)

スレッドの終了は、スレッド関数 myThread 内で終了フラグをみて関数を抜ける、というのを前提 としてそれが終わった後、メインスレッドにて以下を呼びます ( いらないかもしれませんが、これ を呼ばないとメモリリークする可能性あり。Apple のサイトのサンプルでは記載されてませんで した )。 pthread_detach(posixThreadID); http://developer.apple.com/documentation/Cocoa/Conceptual/Multithreading/CreatingThreads/chapter_4 _section_3.html にて簡単な例があります。 後、メモリリークしているかの確認で http://developer.apple.com/jp/technotes/tn2124.html にていろいろ情報があります。 プログラム中にて char commandStr[256];

sprintf(commandStr, "vmmap %d │ grep ¥"shared pmap¥"", getpid()); system(commandStr); のようにすると、プロンプト上でなんか情報をゲットできますね ( どれがメモリに関する情報か わからないので適当ですが )。vmmap/heap/malloc_history/leaks をみれば何かわかるかも。

mutex

主にグローバル変数の値を変更する場合、取得する場合の保護処理で使います。単純に、Windows のクリティカルセクション相当の処理は // グローバル変数

pthread_mutex_t g_mut = PTHREAD_MUTEX_INITIALIZER;

// ク リ テ ィ カ ル セ ク シ ョ ン 開 始 pthread_mutex_lock(&g_mut); // 何か処理 // クリティカルセクション終了 pthread_mutex_unlock(&g_mut); な感じ。以下のサイトを参考にしました。 http://www.linux.or.jp/JM/html/glibc-linuxthreads/man3/pthread_mutex_init.3.html しかし、UNIX 系のルールを使えるのは助かります。

Mac OS X

に関する覚え書き(

2008/10/11

(13)

普段は Windows マシンにてプログラムするので、Mac の当たり前に使うであろう機能を結構知ら なかったりします。とりあえず、自分なりで「使えそう」というのをまとめてみました。

■バックスラッシュの入力

[Option] + [\] プログラムの改行にて「\n」としても認識しないですので ,「\ n」(Safari では [option]+[\] も [\] も 同じになっちゃいます ) などの入力は必須。ちなみに、これを知らないときはバックスラッシュ の部分だけコピペしてました (^_^;;。

■「・」の入力

かなモード時に [Option]+[/] Windows環境と異なるので。。。。みたいに「。。。」を打ってる例がある理由がわかったような (^_^;;

■プログラムの強制終了

[command]+[option]+[esc]

Win

でいうタスクマネージャらしきもの

アプリケーション / ユティリティ / アクティビティモニタ

■ひらがなをカタカナに変換

かなモード時に MacBook の場合は [fn]+[F7] たしか、デスクトップでは [F7] だけでいけてたような・・・。

■かな入力時の半角ローマ字変換

上記と同じパターンですが、[fn]+[F8]。全角ローマ字の場合は [fn]+[f9]

FInder

にて一つ上の階層に移動

[command]+[↑ ]

■画面キャプチャ

・[command]+[Shift]+[3] にてスクリーン全体をキャプチャ ・[command]+[Shift]+[4] にて範囲選択にてキャプチャ ・[command]+[Shift]+[4]+[Shift] にて、指定のウィンドウをクリックすると指定ウィンドウを キャプチャ なお、キャプチャされた画像はデスクトップに png 形式にて保存される。

Win

でいうペイントブラシみたいな機能

う∼ん、標準でないのか。ちょっとした作図にてよく使うのですが http://paintbrush.sourceforge.net/ を入れてみました。

(14)

■付箋紙

「Cellu It!」というのを入れてみました。 http://homepage.mac.com/sachiki/ また何か追加したら記載することにします。環境としては FTP クライアントを探さなくては。

GDI+

の画像読み込み(

2008/10/05

GDI+での画像読み込み(高速版)ですが、以前書いていたのに問題がありました。以下が正しい 例ですが、bitmapData.Scan0 に格納される 1 ライン分は 4 の倍数格納、という bmp の呪縛から抜け 切れてないんですね。ですので、横が 298 ピクセル、という半端な数の場合では食い違いが起こっ てました。 Gdiplus::Bitmap *pBmp; Gdiplus::BitmapData bitmapData; RGBTRIPLE *pRGBPos;

unsigned char *pPos; int scanBytes, x, y;

// 指定ファイルより画像を読み込み pBmp = new Gdiplus::Bitmap(wFileName); if(!pBmp) return false;

// 画像の幅と高さ

int wid = (int)(pBmp->GetWidth()); int hei = (int)(pBmp->GetHeight()); // 画像の RGB 要素にダイレクトにアクセス

pBmp->LockBits(NULL, Gdiplus::ImageLockModeRead, PixelFormat24bppRGB, &bitmapData); scanBytes = (int)bitmapData.Stride; // = ((wid * 3) + 3) & 0ffffffc;

pPos = (unsigned char *)bitmapData.Scan0; // ピクセル情報を取得

for(y = 0; y < hei; y++) { pRGBPos = (RGBTRIPLE *)pPos; for(x = 0; x < wid; x++) { // Red 要素は pRGBPos->rgbtRed // Green 要素は pRGBPos->rgbtGreen // Blue 要素は pRGBPos->rgbtBlue ... 何か処理 pRGBPos++; }

if(y + 1 >= hei) break; pPos += scanBytes; } // ロックの解除 pBmp->UnlockBits(&bitmapData); delete pBmp; しかし、今でもメモリアクセスは 4 の倍数のほうが速いのかなぁ。昔の PC-98 時代は、4 の倍数ア クセスは鉄則だったのですが、現在でもなんか影響しそうかもしれない。SSE を使ったプログラ ムもたしかそんなのがありましたし(16 倍数でのメモリ確保ってのもありましたね)。

MacBook

2008/10/04

MacBookの一番グレードの低いのを買ってきました。最近まで名称は iBook かと思ってたのです が、MacBook なんですね。CoreDuo のノート PC です。これで Mac 移植ができるぜ∼、というこ

(15)

とで wxWidgets をビルド。サンプル等すんなり動作しました。

GUIは wxWidgets に頼ってるので OKっぽいんですが、今いじってるプログラムのコア部分はス

レッドと文字列変換処理部が OS 依存なものですので これを調査せねば。5 年くらい前に使って た文字列処理関数、そのまま使えるかなぁ。

参照

関連したドキュメント

問題はとても簡単ですが、分からない 4人います。なお、呼び方は「~先生」.. 出席について =

本装置は OS のブート方法として、Secure Boot をサポートしています。 Secure Boot とは、UEFI Boot

これはつまり十進法ではなく、一進法を用いて自然数を表記するということである。とは いえ数が大きくなると見にくくなるので、.. 0, 1,

○○でございます。私どもはもともと工場協会という形で活動していたのですけれども、要

巣造りから雛が生まれるころの大事な時 期は、深い雪に被われて人が入っていけ

また、 NO 2 の環境基準は、 「1時間値の1 日平均値が 0.04ppm から 0.06ppm までの ゾーン内又はそれ以下であること。」です

○藤本環境政策課長 異議なしということでございますので、交告委員にお願いしたいと思

自分ではおかしいと思って も、「自分の体は汚れてい るのではないか」「ひどい ことを周りの人にしたので