JVMTIを使った超低負荷プロファイラの作成
|
|
|
- きよたつ つくとの
- 7 years ago
- Views:
Transcription
1 JVMTI を使った超低負荷プロファイラの作成 2011 年 12 月 22 日 数村憲治 Java アプリケーションにおいて ボトルネックになる要因はいろいろありますが もっともよく問題になるのが ロックによる排他待ちです ロックによる排他待ちを検出するにはどうしたらよいでしょうか? もっとも簡単なのは Java のフルスレッドダンプを取ることです この方法での問題は 排他待ちになっている瞬間に採取しなければならないことです 排他待ちになっているかどうかをその他の方法で知る必要があり また排他待ちの時間が例えば1 秒間であれば その1 秒間を確実にとらえなければなりません また フルスレッドダンプの採取自体のコストも高く この方法は実用的ではない場合が多いです また 近年の傾向として アプリケーションが巨大化したり サードパーティのライブラリを使うようになったり 自分自身の開発したところ以外での分析も必要になってきます このようなケースでは プロファイラを使うことにより ボトルネックを検出するのがよい方法と言えます 本ドキュメントでは プロファイラの特性を簡単に考察した後 低負荷プロファイラを作成し ミリ秒オーダーでのロックによる排他待ち時間を検出する方法を紹介します 1. プロファイラの特性プロファイラを設計 作成 利用するうえで 考える点がいくつかありますが ここでは 特に重要なものとして以下を紹介します 1 ソース修正や リコンパイルの要 不要 Java 以外の言語では ソースをコンパイルする時に プロファイラ用の特殊なコードを埋め込むタイプのプロファイラがありますが Java ではこのタイプのものはあまりありません ただし クラスをロードするタイミングで BCI(Bytecode Insertion) を使用し 動的にプロファイルコードを挿入するものがあります アロケーションをトラックする場合には このタイプのプロファイラが有効です 排他検出では この手法はあまり使われません 2 プロファイラプロセスとターゲットプロセスが 同一プロセスなのか別プロセスなのかプロファイラがターゲットプロセスと同一プロセスで動作することにより より詳細な情報を簡単に採取することはできますが ターゲットプロセスに対して副作用や性能影響を与える場合があります 一方 プロファイラ自身を 別プロセスあるいは別マシンで動作させることで ターゲットプロセスへの影響を極小におさえるものもあります Java では 前者のタイプのものが主流となります 3 リアルタイム性の有無採取したデータを加工 ( リストやグラフ化等 ) して見る必要がありますが データを一括採取した後にまと 1
2 めて見るものと データを取りながらリアルタイムで見るものがあります リアルタイムの場合は 視覚化ツールとのデータのやりとりがオーバーヘッドとなることがあります 必ずしも これらすべての特性について満足するプロファイラが利用できるとは限りません 用途や目的に応じて 適切なプロファイラを選択する必要があります 2. 原始的ボトルネック検出排他待ちをしている場所を特定し その場所でどれくらいの時間を待たされているのかを検出する方法を考えます ここでは もっとも単純な方法として ロックを取る前後で時間を記録し java.lang.system.out.println() 等でロック待ち時間を出力する方法を紹介します プロファイラの特性は 1ソースを必要とし 2 同一プロセスで動作し 3リアルタイム性はない プロファイラとなります リスト1:System.out.println の使用例 void foo() if (debug) System.out.println("before lock : " + System.currentTimeMillis()); synchronized (lock) if (debug) System.out.println("after lock : " + System.currentTimeMillis()); この方法は アプリケーションのソースが入手できることはもちろんですが ある程度ボトルネックとなる箇所が分かっていることが前提となります ボトルネック箇所の見当がついていない段階で むやみに println 文を入れると 出力が大量になり 逆にボトルネックを見つけるのが難しくなります 時間を求める方法として ここでは System.currentTimeMillis() を使用していますが java.util.data と java.text.dateformat 等を使い 絶対時刻をプリントすることも考えられます しかし オーバーヘッドを最小におさえることを考えるなら この方法は得策ではありません この方法の落とし穴は System.out.println() メソッド内で排他処理があるため 短い時間のロックを検出しようとしたときに System.out.println() メソッド内での排他待ちがノイズになることです 例えば 次のようなコードでは リスト2: ノイズの出るコード例 if (debug) System.out.println("Enter method foo : " + System.currentTimeMillis()); n = n+1; if (debug) System.out.println("Exit method foo : " + System.currentTimeMillis()); n = n+1; 2
3 の実行に時間がかかるように見えることがあります しかし そのような場合 実際には System.out.println() で時間がかかっています このようなケースでは 間違った解析をすることがあるので 注意が必要です 3. モニタとは次に JVMTI を使用したプロファイラの説明をしますが その前に Java における synchronize 機構について簡単に説明します 詳細は The Java Virtual Machine Specification を参照してください Java 言語における排他制御 (synchronize) は モニタにより実現されますが これは 次のような2つの部屋モデルによって考えることができます 図 1: モニタの仕組み 待合室 オーナー部屋 1 enter 2 entered exit 3 待ちスレッド オーナースレッド 1: Monitor enter: 待合室に入る この段階ではロックは取れていない 2: Monitor entered: オーナー部屋に入る この段階でロック獲得 3: Monitor exit: 部屋から退出 ロックを解放 右側の部屋がオーナー部屋で この部屋に入ることができれば ロックを取れたことになります 左側の部屋が待合室で ロック競合が起きた場合 ロックを取れなかったスレッドは この部屋で待つことになります オーナー部屋にいたスレッドが 部屋から出ると 待合室にいるスレッドの中から一つのスレッドが選ばれ オーナー部屋に入ることができます 4. JVMTI を使用したプロファイラ JVMTI(JVM Tool Interface) は デバッガー プロファイラ 監視ツール等が JVM(Java Virtual Machine) とやりとりするためのインターフェースです 詳細は JVM TI Reference を参照してください JVMTI を使用したプロファイラの特性は 1ソースを必要とせず 2 同一プロセスで動作します 3リアルタイム 3
4 性については どちらでも作成できますが 今回作成するプロファイラは リアルタイム性はありません JVMTI の内容は非常に豊富ですが ここでは 次の2つのイベントを中心に解説します MonitorContendedEnter MonitorContendedEntered MonitorContendedEnter イベントは 競合があったときに 待合室に入るときのイベントです MonitorContendedEntered イベントは 待合室からオーナー部屋へ入るときのイベントです 競合がなければ これらのイベントは発生しません 競合が発生した場合 MonitorContendedEnter の発生時刻から MonitorContendedEntered の発生時刻までの時間が 排他待ち時間となります この時間が長いところがたくさんあると そこがボトルネックだと考えることができます 4.1. イベントの登録 JVMTI プロファイラを起動すると まず Agent_OnLoad 関数が呼ばれます MonitorContendedEnter と MonitorContendedEntered のイベントは この関数内で登録します リスト3:Agent_OnLoad のハイライト JNIEXPORT jint JNICALL Agent_OnLoad(JavaVM *vm, char *options, void *reserved) jvmtienv *jvmti; jvmticapabilities capabilities; jvmtieventcallbacks callbacks; (*vm)->getenv(vm, (void **)&jvmti, JVMTI_VERSION_1); // jvmtienv の獲得 memset(&capabilities,0, sizeof(capabilities)); capabilities.can_generate_monitor_events = 1; (*jvmti)->addcapabilities(jvmti, &capabilities); // jvmticapabilities の初期化 // monitor event の追加 memset(&callbacks,0, sizeof(callbacks)); // jvmtieventcallbackの初期化 callbacks.monitorcontendedenter = &cbmonitorenter; // MonitorContendedEnter に対するコールバックの設定 callbacks.monitorcontendedentered = &cbmonitorentered; // MonitorContendedEntered に対するコールバックの設定 (*jvmti)->seteventcallbacks(jvmti, &callbacks, (jint)sizeof(callbacks)); return JNI_OK; 4.2. コールバック関数の定義 Agent_OnLoad で設定したコールバック関数を定義します リスト4: コールバック関数のハイライト static void JNICALL cbmonitorenter(jvmtienv *jvmti, JNIEnv *env, jthread thread, jobject object) printmonitor(jvmti, thread, "TRY"); 4
5 static void JNICALL cbmonitorentered(jvmtienv *jvmti, JNIEnv *env, jthread thread, jobject object) printmonitor(jvmti, thread, "LCK"); 4.3. イベント情報の出力発生した MonitorContendedEnter と MonitorContendedEntered の情報を出力します ここでは MonitorContendedEnter と MonitorContendedEntered の差分時間は求めません プロファイラでのオーバーヘッドをおさえるため 差分時間は すべてのデータを採取した後に 別途 出力情報から求めることにします リスト5: イベント情報出力のハイライト static void printmonitor(jvmtienv *jvmti, jthread thread, char *tag) jvmtiframeinfo frames[3]; jint count; long long nano; char *thname; int i; char buf[2048]; char *bufp; int n; nano = geteventtime(); // イベント発生時刻 // イベントが発生したスタックトレースを取得 (*jvmti)->getstacktrace(jvmti, thread, 0, 3, frames, &count); bufp = buf; thname = getthreadname(jvmti, thread); // イベントが発生したスレッド名を取得 n = sprintf(bufp, "%lld %s [%s]", nano, tag, thname); bufp += n; // スタックトレースの解析 for (i = 0 ; i < count ; ++i) char *methodname; jclass klass; char *classname; (*jvmti)->getmethodname(jvmti, frames[i].method, &methodname, NULL, NULL); (*jvmti)->getmethoddeclaringclass(jvmti, frames[i].method, &klass); (*jvmti)->getclasssignature(jvmti, klass, &classname, NULL); n = sprintf(bufp, " %s#%s", classname, methodname); bufp += n; (*jvmti)->deallocate(jvmti, (unsigned char*)methodname); (*jvmti)->deallocate(jvmti, (unsigned char*)classname); fprintf(fp, "%s n", buf); // イベント情報の出力 4.4. 完全なソースコード 5
6 完全なソースコードについては 付録を参照してください 4.5. プロファイラのコンパイルと起動方法コンパイルは以下のようにおこないます 図 2:Linux 系 OS での例 % cc -I $JAVA_HOME/include -I $JAVA_HOME/include/$OS shared fpic -o libprofiler.so profiler.c -lrt 図 3:Solaris OS での例 % cc -I $JAVA_HOME/include -I $JAVA_HOME/include/$OS -G -o libprofiler.so profiler.c ここで $JAVA_HOME は JDK のインストールしているパス $OS は 使用している OS 名 (Solaris や Linux 等 ) になります 作成した libprofiler.so は LD_LIBRARY_PATH で設定されているパス上に配置します 起動は以下のようにおこないます java -agent:profiler=file= ファイル名 MAIN-CLASS ファイル名 でしたファイルにイベント情報が出力されます 4.6. イベント情報の解析出力されるイベント情報は以下のようなフォーマットになります リスト6: イベント情報の例 2010/06/24 15:27: TRY [Thread-3] Ljava/util/Hashtable;#get Ljava/util/Calendar;#setWeekCountData Ljava/util/Calendar;#<init> LCK [Thread-3] Ljava/util/Hashtable;#get Ljava/util/Calendar;#setWeekCountData Ljava/util/Calendar;#<init> では 基準となる時刻を出力しています 2は MonitorContendedEnter の情報 3では MonitorContendedEntered の情報を出力しています 2/ 3の1カラム目は イベントの発生時刻を 1からの経過時間で表示しています 2カラム目は TRY または LCK で MonitorContendedEnter か MonitorContendedEntered を区別します 3カラム目は スレッド名を表示しています 4カラム目以降は スタックトレースを表示しています この例では java.util.hastable#get メソッドで排他待ちとなっていますが このメソッドは java.util.calendar#setweekcountdata メソッドから呼ばれて さらにこのメソッドは java.util.calendar#<init> から呼ばれていることを示しています 2/ 3より 137,744 ナノ秒の排他待ちがあることが分かります 6
7 5. さらなる改善今回 イベント情報を出力する最終 API として fprintf を使用していますが 一般的に fprintf 内では排他制御をしていると考えられます ここでは 詳細は記載しませんが この影響も排除したい場合は イベント情報を直接ファイルに出力するのではなく スレッドローカルエリアを使用し 出力を非同期に行う方法があります 6. 参考文献 URL JVMTI Java 言語仕様 付録プロファイラのソース Profiler using JVMTI sample source #include <stdio.h> #include <time.h> #include <stdlib.h> #include <string.h> #include <stddef.h> #include <sys/types.h> #include "jni.h" #include "jvmti.h" typedef struct jvmtienv *jvmti; // jvmti environment char *logfile; // log file name FILE *logfp; // log file pointer jboolean vmdead; // flag if vm is about to end jlong epoc; globaldata_t ; static globaldata_t *gdata; #if defined sun static inline jlong gettime() return gethrtime(); #elif defined linux static inline jlong gettime() 7
8 struct timespec tp; jlong result; clock_gettime(clock_monotonic, &tp); result = (jlong)(tp.tv_sec) * (1000 * 1000 * 1000) + (jlong)(tp.tv_nsec); return result; #endif Called on VM termination static void JNICALL cbvmdeath(jvmtienv *jvmti, JNIEnv *env) gdata->vmdead = JNI_TRUE; Called after VM initialization static void JNICALL cbvminit(jvmtienv *jvmti, JNIEnv *env, jthread thread) time_t t; struct timeval v; struct tm *tm; int mil; (*jvmti)->seteventnotificationmode(jvmti, JVMTI_EVENT_MONITOR_CONTENDED_ENTERED, NULL); (*jvmti)->seteventnotificationmode(jvmti, JVMTI_EVENT_MONITOR_CONTENDED_ENTER, NULL); JVMTI_ENABLE, JVMTI_ENABLE, gdata->epoc = gettime(); // 現在時刻を記録 gettimeofday(&v, NULL); tm = localtime(&(v.tv_sec)); mil = v.tv_usec / 1000; fprintf(gdata->logfp, "%4d/%02d/%02d %02d:%02d:%02d.%03d n", tm->tm_year+1900, tm->tm_mon, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec, mil); if (gdata->logfile!= NULL) fflush(gdata->logfp); Convert Thread object to thread name static inline char *getthreadname(jvmtienv *jvmti, jthread thread) void *data; jvmtithreadinfo tin; (*jvmti)->getthreadlocalstorage(jvmti, thread, &data); if (data == NULL) (*jvmti)->getthreadinfo(jvmti, thread, &tin); // スレッド終了時に tin を Deallocate で解放する必要あり (*jvmti)->setthreadlocalstorage(jvmti, thread, tin.name); return tin.name; 8
9 return (char *)data; Print monitor infomration static void printmonitor(jvmtienv *jvmti, jthread thread, char *tag) jvmtiframeinfo frames[3]; jint count; jlong nano; char *thname; int i; char buf[2048]; char *bufp; int n; nano = gettime() - gdata->epoc; // イベント発生時刻 // イベントが発生したスタックトレースを取得 (*jvmti)->getstacktrace(jvmti, thread, 0, 3, frames, &count); if (count == 0) return; bufp = buf; thname = getthreadname(jvmti, thread); // イベントが発生したスレッド名を取得 n = sprintf(bufp, "%lld %s [%s]", nano, tag, thname); bufp += n; // スタックトレースの解析 for (i = 0 ; i < count ; ++i) char *methodname; jclass klass; char *classname; (*jvmti)->getmethodname(jvmti, frames[i].method, &methodname, NULL, NULL); (*jvmti)->getmethoddeclaringclass(jvmti, frames[i].method, &klass); (*jvmti)->getclasssignature(jvmti, klass, &classname, NULL); n = sprintf(bufp, " %s#%s", classname, methodname); bufp += n; (*jvmti)->deallocate(jvmti, (unsigned char*)methodname); (*jvmti)->deallocate(jvmti, (unsigned char*)classname); if (gdata->logfp!= NULL) fprintf(gdata->logfp, "%s n", buf); // イベント情報の出力 callback function for MonitorEnter event static void JNICALL cbmonitorenter(jvmtienv *jvmti, JNIEnv *env, jthread thread, jobject object) if (gdata->vmdead == JNI_TRUE) return; printmonitor(jvmti, thread, "TRY"); 9
10 callback function for MonitorEntered event static void JNICALL cbmonitorentered(jvmtienv *jvmti, JNIEnv *env, jthread thread, jobject object) if (gdata->vmdead == JNI_TRUE) return; printmonitor(jvmti, thread, "LCK"); -agnet に指定したオプションの解析 static void parse_option(char *options) char *filename; if (options == NULL) return; if (strncmp(options, "file=", 5)) return; filename = options + 5; gdata->logfile = strdup(filename); Called when profiler is loaded. JNIEXPORT jint JNICALL Agent_OnLoad(JavaVM *vm, char *options, void *reserved) jvmtienv *jvmti; jint res; jvmticapabilities capabilities; jvmtieventcallbacks callbacks; gdata = (globaldata_t*)malloc(sizeof(globaldata_t)); memset(gdata, 0, sizeof(globaldata_t)); res = (*vm)->getenv(vm, (void **)&jvmti, JVMTI_VERSION_1); // jvmtienv の獲得 if (res!= JNI_OK) return res; parse_option(options); // ログファイルの作成 if (gdata->logfile!= NULL) gdata->logfp = fopen(gdata->logfile, "w"); if (gdata->logfp == NULL) fprintf(stderr, "cannot open file %s n", gdata->logfile); return JNI_ERR; else gdata->logfp = stdout; gdata->jvmti = jvmti; 10
11 memset(&capabilities,0, sizeof(capabilities)); capabilities.can_generate_monitor_events = 1; (*jvmti)->addcapabilities(jvmti, &capabilities); // jvmticapabilities の初期化 // monitor event の追加 memset(&callbacks,0, sizeof(callbacks)); // jvmtieventcallbacks の初期化 callbacks.vminit = &cbvminit; callbacks.vmdeath = &cbvmdeath; callbacks.monitorcontendedenter = &cbmonitorenter; // MonitorContendedEnter に対するコール バックの設定 callbacks.monitorcontendedentered = &cbmonitorentered; // MonitorContendedEntered に対するコー ルバックの設定 (*jvmti)->seteventcallbacks(jvmti, &callbacks, (jint)sizeof(callbacks)); (*jvmti)->seteventnotificationmode(jvmti, JVMTI_ENABLE, JVMTI_EVENT_VM_INIT, NULL); (*jvmti)->seteventnotificationmode(jvmti, JVMTI_ENABLE, JVMTI_EVENT_VM_DEATH, NULL); return JNI_OK; JNIEXPORT void JNICALL Agent_OnUnload(JavaVM *vm) if (gdata->logfile!= NULL) fclose(gdata->logfp); gdata->logfp = NULL; 11
JS2-14 マルチコアCPU時代の Javaプログラミング
JavaOne Tokyo 2012 JS2-14 マルチコア CPU 時代の Java プログラミング 2012 年 4 月 5 日 富士通株式会社数村憲治 Copyright 2012 FUJITSU LIMITED 自己紹介 数村憲治 [email protected] 富士通株式会社 Interstage Application Server 開発チーム Java VMの開発 サポート 大規模システムでの性能チューニングに
memo
数理情報工学演習第一 C プログラミング演習 ( 第 5 回 ) 2015/05/11 DEPARTMENT OF MATHEMATICAL INFORMATICS 1 今日の内容 : プロトタイプ宣言 ヘッダーファイル, プログラムの分割 課題 : 疎行列 2 プロトタイプ宣言 3 C 言語では, 関数や変数は使用する前 ( ソースの上のほう ) に定義されている必要がある. double sub(int
PowerPoint プレゼンテーション
プログラミング応用演習 第 4 回再帰的構造体 プログラミングを 余談 : 教えることの難しさ 丁寧に説明しないと分かってもらえない 説明すると 小難しくなる学生が目指すべきところプログラム例を説明されて理解できる違うやり方でも良いので自力で解決できる おっけー 動けば良い という意識でプログラミング 正しく動くことのチェックは必要 解答例と自分のやり方との比較が勉強になる 今日のお題 再帰的構造体
Java知識テスト問題
Java 知識テスト SDAS プログラマ(Java 編 ) 運営事務局 このテストは J2EE プログラマとしての Java の知識を評価するものです 問題は 30 問, テスト時間は J2EE 知識テストとあわせて 90 分です 問題は全て択一式です 選択肢から 1 つだけ選択してください 資料の閲覧は禁止です テストが終わり次第 答案用紙を提出していただいてかまいません テスト終了後, 本テストの内容を他の方に話さないでください
解きながら学ぶC++入門編
!... 38!=... 35 "... 112 " "... 311 " "... 4, 264 #... 371 #define... 126, 371 #endif... 369 #if... 369 #ifndef... 369 #include... 3, 311 #undef... 371 %... 17, 18 %=... 85 &... 222 &... 203 &&... 40 &=...
10/ / /30 3. ( ) 11/ 6 4. UNIX + C socket 11/13 5. ( ) C 11/20 6. http, CGI Perl 11/27 7. ( ) Perl 12/ 4 8. Windows Winsock 12/11 9. JAV
[email protected] [email protected] http://www.misojiro.t.u-tokyo.ac.jp/ tutimura/sem3/ 2002 12 11 p.1/33 10/16 1. 10/23 2. 10/30 3. ( ) 11/ 6 4. UNIX + C socket 11/13 5. ( ) C 11/20
AquesTalk プログラミングガイド
AquesTalk プログラミングガイド ( 株 ) アクエスト 1. 概要 本文書は 規則音声合成ライブラリ AquesTalk をアプリケーションに組み込んで使用するためのプログラミングに関して 方法および注意点を示したものです AquesTalk には 2 種類のライブラリがあります 音声データをメモリ上に生成するものと サウンドデバイスに出力する 2 種類があります 使用するアプリケーションに応じて選択してください
新・明解Java入門
第 1 章 画面 文字 表示 Java Java Java Java Java JRE Java JDK 21 1-1 Java Java Java Java 誕生 Fig.1-1 Oak Java Sun Microsystems 2010 Oracle Java Oracle 4 Java http://www.java.com/ http://www.alice.org/ Fig.1-1Java
POSIXスレッド
POSIX スレッド (3) システムプログラミング 2011 年 11 月 7 日 建部修見 同期の戦略 単一大域ロック スレッドセーフ関数 構造的コードロッキング 構造的データロッキング ロックとモジュラリティ デッドロック 単一大域ロック (single global lock) 単一のアプリケーションワイドの mutex スレッドが実行するときに獲得, ブロックする前にリリース どのタイミングでも一つのスレッドが共有データをアクセスする
AquesTalk Win Manual
AquesTalk Win マニュアル 株式会社アクエスト http://www.a-quest.com/ 1. 概要 本文書は 規則音声合成ライブラリ AquesTalk をアプリケーションに組み込んで使用するためのプログラミングに関して 方法および注意点を示したものです AquesTalk には 2 種類のライブラリがあります 音声データをメモリ上に生成するものと サウンドデバイスに出力する 2
IronPython による柔軟なゲーム開発 筑波大学 AmusementCreators
IronPython による柔軟なゲーム開発 筑波大学 AmusementCreators 自己紹介 Amusement Makers ではありません 注意 IronPython って?.Net Framework および Mono 上で動作する Python.NetFramework Mono は共通中間言語 (CIL) のための仮想マシン CIL が動く仮想マシンの仕様は共通言語基盤 (CLI)
Javaセキュアコーディングセミナー2013東京第1回 演習の解説
Java セキュアコーディングセミナー東京 第 1 回オブジェクトの生成とセキュリティ 演習の解説 2012 年 9 月 9 日 ( 日 ) JPCERT コーディネーションセンター脆弱性解析チーム戸田洋三 1 演習 [1] 2 演習 [1] class Dog { public static void bark() { System.out.print("woof"); class Bulldog
ex01.dvi
,. 0. 0.0. C () /******************************* * $Id: ex_0_0.c,v.2 2006-04-0 3:37:00+09 naito Exp $ * * 0. 0.0 *******************************/ #include int main(int argc, char **argv) double
Minimum C Minimum C Minimum C BNF T okenseq W hite Any D
6 2019 5 14 6.1 Minimum C....................... 6 1 6.2....................................... 6 7 6.1 Minimum C Minimum C BNF T okenseq W hite Any Digit ::= 0 1 2... 9. Number ::= Digit Digit. Alphabet
Effective Android NDK Advanced Core Engineer
Effective Android NDK Advanced Core Engineer Effective Android NDK Effective Android NDK NDK NDK NDK JNI Effective Android NDK native java native NDK NDK NDK C, C++ native toolset Android java native NDK
AquesTalk2 Win マニュアル
株式会社 AQUEST http://www.a-quest.com/ AquesTalk2 Win Manual 1. 概要 本文書は 規則音声合成ライブラリ AquesTalk2 Win をアプリケーションに組み込んで使用するためのプログラミングに関しての方法および注意点を示したものです AquesTalk2 は 簡単に小型機器への組み込みが出来る音声合成ミドルウェアです このライブラリを用いることで
日本アンドロイドの会 四国支部 Kickoff ミーティング in ABC2009
NDK の使い方 Android のネイティブ開発環境 2009.8.14 20:25-21:00 京都リサーチパーク 4 号館 2F ルーム 2A 日本 Android の会幹事四国支部長 瀬戸直喜 この資料の一部は Google が作成 提供しているコンテンツをベースに変更したもので クリエイティブコモンズの表示 2.5 ライセンスに記載の条件に従って使用しています アジェンダ 概要 イントロダクション
Microsoft Word - Cプログラミング演習(10)
第 10 回 (6/25) 3. ファイルとその応用 (3) ファイルの更新 シーケンシャルファイルの更新 シーケンシャルファイルでは, 各レコードが可変長で連続して格納されており, その中の特定のレコードを変更することができない そこで一般的には, マスタファイルからデータを取り出し, 更新処理を行ったあとに新マスタファイルに書き込む 注 ) マスタファイル : 主ファイル, 基本ファイルと呼ばれるファイルで内容は比較的固定的であり,
Microsoft PowerPoint ppt
仮想マシン () 仮想マシン 復習 仮想マシンの概要 hsm 仮想マシン プログラム言語の処理系 ( コンパイラ ) 原始プログラム (Source program) コンパイラ (Compiler) 目的プログラム (Object code) 原始言語 (Source language) 解析 合成 目的言語 (Object Language) コンパイルする / 翻訳する (to compile
PowerPoint プレゼンテーション
プログラミング応用演習 第 5 回演習 前回までのお話 ポインタ ポインタを用いた文字列処理 構造体 ファイル 再帰的構造体 リスト構造 動的メモリ管理 今日のお題 ポインタやファイルなど これまでの内容の練習 教材 以前 以下に単語を収録したファイルがあることを紹介した : /usr/share/dict/words この中からランダムに単語を取り出したファイルを用意した http://sun.ac.jp/prof/yamagu/2019app/
JavaプログラミングⅠ
Java プログラミング Ⅰ 12 回目クラス 今日の講義で学ぶ内容 クラスとは クラスの宣言と利用 クラスの応用 クラス クラスとは 異なる複数の型の変数を内部にもつ型です 直観的に表現すると int 型や double 型は 1 1 つの値を管理できます int 型の変数 配列型は 2 5 8 6 3 7 同じ型の複数の変数を管理できます 配列型の変数 ( 配列変数 ) クラスは double
C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ
C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ 今回のプログラミングの課題 次のステップによって 徐々に難易度の高いプログラムを作成する ( 参照用の番号は よくわかる C 言語 のページ番号 ) 1. キーボード入力された整数 10 個の中から最大のものを答える 2. 整数を要素とする配列 (p.57-59) に初期値を与えておき
HashMapからConcurrentHashMapへの移行
HashMap から ConcurrentHashMap への移行 レガシー アプリケーションにおける注意点 2012 年 1 月 4 日橋口雅史 1. はじめにアプリケーションでは キーと値のマッピングが多用されます 例えば ユーザー名 というキーにユーザーの 情報 をマッピングするといった用途で java.util.map インタフェースは広く使われています 特に ハッシュテーブルに基づいて高速にマップを検索
Microsoft PowerPoint - CproNt02.ppt [互換モード]
第 2 章 C プログラムの書き方 CPro:02-01 概要 C プログラムの構成要素は関数 ( プログラム = 関数の集まり ) 関数は, ヘッダと本体からなる 使用する関数は, プログラムの先頭 ( 厳密には, 使用場所より前 ) で型宣言 ( プロトタイプ宣言 ) する 関数は仮引数を用いることができる ( なくてもよい ) 関数には戻り値がある ( なくてもよい void 型 ) コメント
Microsoft Word - Cプログラミング演習(12)
第 12 回 (7/9) 4. いくつかのトピック (5)main 関数の引数を利用したファイル処理 main 関数は, 起動する環境から引数を受け取ることができる 例えば 次に示すように,main 関数に引数を用いたプログラムを作成する 01 /* sample */ 02 /* main 関数の引数 */ 03 #include 04 05 main(int argc, char
Microsoft Word - 【第5分科会】ConcolicTestingグループ_付録_修正_ doc
付録 1 研究スケジュール 本研究は以下のスケジュールで行った. 項目内容期間論文調査 CREST に関する論文の調査 2014 年 5 月 CREST のインストール VMWare による Linux 環境の構築と,CREST 及び必要プログラムのインストール CREST の試用サンプルコードにて CREST を実行して, 出力結果を確認 SIG の準備 実施ソフトウェア品質シンポジウム SIG:
WebOTXプロファイラを使用したメモリリーク調査方法
WebOTX プロファイラを使用したメモリリーク調査方法 2006 年 10 月初版 改版履歴 i 目次 1. はじめに...1 2. OutOfMemoryErrorの確認...1 3. JavaVMのヒープ使用量の確認...2 4. WebOTXプロファイラの利用...5 4.1. WebOTXプロファイラを利用するための設定...5 4.1.1. ドメインのJavaVMオプションにプロファイラのオプションの追加...5
Exam : 1z1-809-JPN Title : Java SE 8 Programmer II Vendor : Oracle Version : DEMO Get Latest & Valid 1z1-809-JPN Exam's Question and Answers 1 from Ac
Actual4Test http://www.actual4test.com Actual4test - actual test exam dumps-pass for IT exams Exam : 1z1-809-JPN Title : Java SE 8 Programmer II Vendor : Oracle Version : DEMO Get Latest & Valid 1z1-809-JPN
untitled
II 4 Yacc Lex 2005 : 0 1 Yacc 20 Lex 1 20 traverse 1 %% 2 [0-9]+ { yylval.val = atoi((char*)yytext); return NUM; 3 "+" { return + ; 4 "*" { return * ; 5 "-" { return - ; 6 "/" { return / ; 7 [ \t] { /*
Microsoft PowerPoint - chap10_OOP.ppt
プログラミング講義 Chapter 10: オブジェクト指向プログラミング (Object-Oriented Programming=OOP) の入り口の入り口の入り口 秋山英三 F1027 1 例 : 部屋のデータを扱う // Test.java の内容 public class Test { public static void main(string[] args) { double length1,
プログラミングI第10回
プログラミング 1 第 10 回 構造体 (3) 応用 リスト操作 この資料にあるサンプルプログラムは /home/course/prog1/public_html/2007/hw/lec/sources/ 下に置いてありますから 各自自分のディレクトリにコピーして コンパイル 実行してみてください Prog1 2007 Lec 101 Programming1 Group 19992007 データ構造
Developer Camp
2F Delphi/C++ チュートリアルセッション Delphi でキカイを制御する アプリケーションの設計とテクニック 株式会社イマジオム代表取締役 高木太郎 1 はじめに この講演の内容 制御プログラムというもの 制御プログラム設計のポイント 制御プログラム実装のテクニック 3 どんなものを考えているのか? 例 :3 次元プリンタ ここに入っている PC がシステム全体を制御 3 次元プリンタ原理
新・明解C言語 実践編
第 1 章 見 21 1-1 見えないエラー 見 List 1-1 "max2x1.h" a, b max2 List 1-1 chap01/max2x1.h max2 "max2x1.h" #define max2(a, b) ((a) > (b)? (a) : (b)) max2 List 1-2 List 1-2 chap01/max2x1test.c max2 #include
program.dvi
2001.06.19 1 programming semi ver.1.0 2001.06.19 1 GA SA 2 A 2.1 valuename = value value name = valuename # ; Fig. 1 #-----GA parameter popsize = 200 mutation rate = 0.01 crossover rate = 1.0 generation
1 C STL(1) C C C libc C C C++ STL(Standard Template Library ) libc libc C++ C STL libc STL iostream Algorithm libc STL string vector l
C/C++ 2007 6 18 1 C STL(1) 2 1.1............................................... 2 1.2 stdio................................................ 3 1.3.......................................... 10 2 11 2.1 sizeof......................................
昨年度までの研究紹介 および 研究計画
第 12 回 ICN 研究会ワークショップ Cefore で キャッシュプラグイン開発 2018 年 8 月 30 日 ( 木 ) キャッシュプラグイン csmgrd は起動時に使用するキャッシュプラグインを指定 Cache plugin: キャッシュデータ保存方式 Cache algorithm: キャッシュ選択 / 置換アルゴリズム Cache Plugin Cache algorithm csmgrd
新版明解C言語 実践編
2 List - "max.h" a, b max List - max "max.h" #define max(a, b) ((a) > (b)? (a) : (b)) max List -2 List -2 max #include "max.h" int x, y; printf("x"); printf("y"); scanf("%d", &x); scanf("%d", &y); printf("max(x,
JavaプログラミングⅠ
Java プログラミング Ⅱ 11 回目スレッド課題 確認 問題次の各文は正しいか誤っているか答えなさい (1) スレッドは 1 つの実行箇所をもつ一連の処理の流れである (2) マルチスレッドで各スレッドの処理は並行して実行される (3) Java はマルチスレッド処理を記述できない (4) 新たにスレッドを生成する場合 Thread クラスを拡張し かつ Runnable インタフェースを実装する必要がある
第3回 配列とリスト
連結リスト Algorithms and Data Structures on C この回の要点 連結リストによるリスト 連結リストの構造 連結リストの利点と欠点 C 言語による連結リストの実現 ヘッダファイルによるソースファイルの分割 連結リスト (linked list) リストの実現の一種 リストに含まれる各要素をリンクによって連結した構造 リンクとは 他のデータへの参照のこと 各要素は 自分から次のデータへのリンクを持つ
Undestand の解析 Understand の C 言語で抽出できない依存関係について サンプルコードを用いて説明します 確認バージョン Understand 3.0 (Build 640) Understand 3.1 (Build 700) Understand 4.0 (Build 78
Undestand の解析 Understand の C 言語で抽出できない依存関係について サンプルコードを用いて説明します 確認バージョン Understand 3.0 (Build 640) Understand 3.1 (Build 700) Understand 4.0 (Build 788) 抽出できない依存関係 Understand の C 言語の解析 (Fuzzy/Strict) で
CashDrawer ライブラリ API 仕様書 2014/07/09 CashDrawer ライブラリ API 仕様書 Rev / 10
2014/07/09 CashDrawer ライブラリ API 仕様書 Rev. 00.0.04 1 / 10 目次 1. ファイル構成... 3 2. 環境 3 2.1. 動作環境 OS... 3 2.2. コンパイル時の注意点... 3 2.3. USB ドライバ... 3 3. 関数一覧... 4 3.1. USB 接続確認処理 (CD_checkConnect CD_checkConnect)
1 1.1 C 2 1 double a[ ][ ]; 1 3x x3 ( ) malloc() malloc 2 #include <stdio.h> #include
1 1.1 C 2 1 double a[ ][ ]; 1 3x3 0 1 3x3 ( ) 0.240 0.143 0.339 0.191 0.341 0.477 0.412 0.003 0.921 1.2 malloc() malloc 2 #include #include #include enum LENGTH = 10 ; int
OOCOBOL紹介
ISO ANSI COBOL85 COBOL 1959 COBOL OOCOBOL 1 ... 1... 3.... 3. OOCOBOL... 4.1.... 4.2.... 5.3. IDENTIFICATION DIVISION... 7.4. ENVIRONMENT DIVISION.... 7.5. DATA DIVISION... 7.6. PROCEDURE DIVISION....
ex01.dvi
,. 0. 0.0. C () /******************************* * $Id: ex_0_0.c,v.2 2006-04-0 3:37:00+09 naito Exp $ * * 0. 0.0 *******************************/ #include int main(int argc, char **argv) { double
Condition DAQ condition condition 2 3 XML key value
Condition DAQ condition 2009 6 10 2009 7 2 2009 7 3 2010 8 3 1 2 2 condition 2 3 XML key value 3 4 4 4.1............................. 5 4.2...................... 5 5 6 6 Makefile 7 7 9 7.1 Condition.h.............................
r07.dvi
19 7 ( ) 2019.4.20 1 1.1 (data structure ( (dynamic data structure 1 malloc C free C (garbage collection GC C GC(conservative GC 2 1.2 data next p 3 5 7 9 p 3 5 7 9 p 3 5 7 9 1 1: (single linked list 1
ohp07.dvi
19 7 ( ) 2019.4.20 1 (data structure) ( ) (dynamic data structure) 1 malloc C free 1 (static data structure) 2 (2) C (garbage collection GC) C GC(conservative GC) 2 2 conservative GC 3 data next p 3 5
AquesTalk for WinCE プログラミングガイド
AquesTalk for WinCE プログラミングガイド ( 株 ) アクエスト 1. 概要 本文書は 規則音声合成ライブラリ AquesTalk for WinCE ( 以下 AquesTalk) をアプリケーションに組み込んで使用するためのプログラミングに関して 方法および注意点を示したものです AquesTalk には 2 種類のライブラリがあります 音声データをメモリ上に生成するものと
Insert your Title here
マルチコア マルチスレッド環境での静的解析ツールの応用 米 GrammaTech 社 CodeSonar によるスレッド間のデータ競合の検出 2013 GrammaTech, Inc. All rights reserved Agenda 並列実行に起因する不具合の摘出 なぜ 並列実行されるプログラミングは難しいのか データの競合 デッドロック どのようにして静的解析ツールで並列実行の問題を見つけるのか?
arduino プログラミング課題集 ( Ver /06/01 ) arduino と各種ボードを組み合わせ 制御するためのプログラミングを学 ぼう! 1 入出力ポートの設定と利用方法 (1) 制御( コントロール ) する とは 外部装置( ペリフェラル ) が必要とする信号をマイ
arduino プログラミング課題集 ( Ver.5.0 2017/06/01 ) arduino と各種ボードを組み合わせ 制御するためのプログラミングを学 ぼう! 1 入出力ポートの設定と利用方法 (1) 制御( コントロール ) する とは 外部装置( ペリフェラル ) が必要とする信号をマイコンから伝える 外部装置の状態をマイコンで確認する 信号の授受は 入出力ポート 経由で行う (2) 入出力ポートとは?
【注意事項】RX Driver Package、 RXファミリ RTC モジュール Firmware Integration Technology
注意事項 RX Driver Package RX ファミリ RTC モジュール Firmware Integration Technology 概要 RX Driver Package および RX ファミリ RTC モジュール Firmware Integration Technology( 以下 RTC FIT モジュール ) の使用上の注意事項を連絡します 1. R_RTC_Read 関数における時刻読み出し処理の注意事項
ガイダンス
情報科学 B 第 2 回変数 1 今日やること Java プログラムの書き方 変数とは何か? 2 Java プログラムの書き方 3 作業手順 Java 言語を用いてソースコードを記述する (Cpad エディタを使用 ) コンパイル (Cpad エディタを使用 ) 実行 (Cpad エディタを使用 ) エラーが出たらどうしたらよいか??? 4 書き方 これから作成する Hello.java 命令文 メソッドブロック
問題1 以下に示すプログラムは、次の処理をするプログラムである
問題 1 次に示すプログラムは 配列 a の値を乱数で設定し 配列 a の値が 333 より大きく 667 以下の値 の合計値を求めるプログラムである 1 と 2 に適切なコードを記述してプログラムを完 成させよ class TotalNumber { public static void main(string[] args) { int[] a = new int[1000]; // 1 解答条件
1.ppt
/* * Program name: hello.c */ #include int main() { printf( hello, world\n ); return 0; /* * Program name: Hello.java */ import java.io.*; class Hello { public static void main(string[] arg)
NTP for NORTi ユーザーズガイド
NTP for NORTi User's Guide 2008 年 5 月版 株式会社ミスポ 目次 第 1 章導入... 1 1.1 はじめに... 1 1.2 NTP の概要... 1 1.3 特長... 2 1.4 NTP for NORTi の動作... 2 1.5 制限事項... 2 1.6 ファイル構成... 3 第 2 章 NTP の実装... 4 2.1 概要... 4 2.2 リソース...
