約 949,266 件
https://w.atwiki.jp/asterisk99/pages/570.html
original (2019/05/14 付) Google 翻訳 (2019/05/19 付) # API examples #APIの例 This wiki provides simple examples on how to use the tesseract-ocr API (v3.02.02-4.0.0) in C++. このWikiは、C ++でtesseract-ocr API(v3.02.02-4.0.0)を使用する方法に関する簡単な例を提供します。 It is expected that tesseract-ocr is correctly installed including all dependecies. tesseract-ocrがすべての依存関係を含めて正しくインストールされていることが期待されます。 It is expected the user is familiar with C++, compiling and linking program on their platform, though basic compilation examples are included for beginners with Linux. 基本的なコンパイル例はLinuxの初心者向けですが(#compiling-c-api-programs-linux)、ユーザーは自分のプラットフォームでC ++、プログラムのコンパイルおよびリンクに精通していることが期待されます。 More details about tesseract-ocr API can be found at baseapi.h. tesseract-ocr APIについての詳細はbaseapi.hにあります。 # Basic example #基本的な例 Code コード `c++ | `c ++ #include tesseract/baseapi.h #include tesseract / baseapi.h #include leptonica/allheaders.h #include leptonica / allheaders.h int main() int main() { { char *outText; char * outText; tesseract TessBaseAPI *api = new tesseract TessBaseAPI(); tesseract TessBaseAPI * api = new tesseract TessBaseAPI(); // Initialize tesseract-ocr with English, without specifying tessdata path // tessdataパスを指定せずに、tesseract-ocrを英語で初期化します if (api- Init(NULL, "eng")) { if(api- Init(NULL、 "eng")){ fprintf(stderr, "Could not initialize tesseract.\n"); fprintf(stderr、 "tesseractを初期化できませんでした。\ n"); exit(1); 出口(1); } } // Open input image with leptonica library // leptonicaライブラリで入力画像を開く Pix *image = pixRead("/usr/src/tesseract/testing/phototest.tif"); Pix * image = pixRead( "/ usr / src / tesseract / testing / phototest.tif"); api- SetImage(image); api- SetImage(image); // Get OCR result // OCR結果を取得する outText = api- GetUTF8Text(); outText = api- GetUTF8Text(); printf("OCR output \n%s", outText); printf( "OCR出力 \ n%s"、outText); // Destroy used object and release memory //使用済みオブジェクトを破棄してメモリを解放する api- End(); api- End(); delete [] outText; delete [] outText; pixDestroy( image); pixDestroy(&image); return 0; 0を返します。 } } ` | ` The program must be linked to the tesseract-ocr and leptonica libraries. プログラムはtesseract-ocrおよびleptonicaライブラリーにリンクされていなければなりません。 If you want to restrict recognition to a sub-rectangle of the image - call SetRectangle(left, top, width, height) after SetImage. Each SetRectangle clears the recogntion results so multiple rectangles can be recognized with the same image. E.g. 認識を画像のサブ矩形に制限したい場合は、SetImageの後に_SetRectangle(left、top、width、height)_を呼び出します。各SetRectangleは認識結果を消去するので、同じ画像で複数の長方形を認識することができます。例えば。 `c++ | `c ++ api- SetRectangle(30, 86, 590, 100); api- SetRectangle(30、86、590、100); ` | ` # GetComponentImages example #GetComponentImagesの例 `c++ | `c ++ Pix *image = pixRead("/usr/src/tesseract/testing/phototest.tif"); Pix * image = pixRead( "/ usr / src / tesseract / testing / phototest.tif"); tesseract TessBaseAPI *api = new tesseract TessBaseAPI(); tesseract TessBaseAPI * api = new tesseract TessBaseAPI(); api- Init(NULL, "eng"); api- Init(NULL、 "eng"); api- SetImage(image); api- SetImage(image); Boxa* boxes = api- GetComponentImages(tesseract RIL_TEXTLINE, true, NULL, NULL); Boxa * boxes = api- GetComponentImages(tesseract RIL_TEXTLINE、true、NULL、NULL); printf("Found %d textline image components.\n", boxes- n); printf( "%dテキスト行の画像コンポーネントが見つかりました。\ n"、boxes- n); for (int i = 0; i boxes- n; i++) { for(int i = 0; i n; i ++){ BOX* box = boxaGetBox(boxes, i, L_CLONE); BOX * box = boxaGetBox(boxes、i、L_CLONE); api- SetRectangle(box- x, box- y, box- w, box- h); api- SetRectangle(ボックス - x、ボックス - y、ボックス - w、ボックス - h); char* ocrResult = api- GetUTF8Text(); char * ocrResult = api- GetUTF8Text(); int conf = api- MeanTextConf(); int conf = api- MeanTextConf(); fprintf(stdout, "Box[%d] x=%d, y=%d, w=%d, h=%d, confidence %d, text %s", fprintf(stdout、 "ボックス[%d] x =%d、y =%d、w =%d、h =%d、信頼度 %d、テキスト %s"、、 i, box- x, box- y, box- w, box- h, conf, ocrResult); i、box- x、box- y、box- w、box- h、conf、ocrResult); } } ` | ` # Result iterator example #結果イテレータの例 It is possible to get confidence value and BoundingBox per word from a ResultIterator ResultIteratorから単語ごとの信頼値とBoundingBoxを取得することが可能です。 `c++ | `c ++ Pix *image = pixRead("/usr/src/tesseract/testing/phototest.tif"); Pix * image = pixRead( "/ usr / src / tesseract / testing / phototest.tif"); tesseract TessBaseAPI *api = new tesseract TessBaseAPI(); tesseract TessBaseAPI * api = new tesseract TessBaseAPI(); api- Init(NULL, "eng"); api- Init(NULL、 "eng"); api- SetImage(image); api- SetImage(image); api- Recognize(0); api- 認識(0); tesseract ResultIterator* ri = api- GetIterator(); tesseract ResultIterator * ri = api- GetIterator(); tesseract PageIteratorLevel level = tesseract RIL_WORD; tesseract PageIteratorLevel level = tesseract RIL_WORD; if (ri != 0) { if(ri!= 0){ do { 行う { const char* word = ri- GetUTF8Text(level); const char * word = ri- GetUTF8Text(level); float conf = ri- Confidence(level); float conf = ri- 信頼度(レベル)。 int x1, y1, x2, y2; int x1、y1、x2、y2。 ri- BoundingBox(level, x1, y1, x2, y2); ri- BoundingBox(レベル、&x 1、&y 1、&x 2、&y 2); printf("word %s ; \tconf %.2f; BoundingBox %d,%d,%d,%d;\n", printf( "単語 %s ; \ tconf %.2f;境界ボックス %d、%d、%d、%d; \ n"、 word, conf, x1, y1, x2, y2); ワード、conf、x1、y1、x2、y2)。 delete[] word; []単語を削除します。 } while (ri- Next(level)); while(ri- Next(level)); } } ` | ` It is also possible to use other iterator levels (block, line, word, etc.), see PageiteratorLevel. 他のイテレータレベル(ブロック、行、単語など)を使用することもできます。PageiteratorLevelを参照してください。 #L219) # Orientation and script detection (OSD) example #オリエンテーションと文字検出(OSD)の例 `c++ | `c ++ const char* inputfile = "/usr/src/tesseract/testing/eurotext.tif"; const char * inputfile = "/usr/src/tesseract/testing/eurotext.tif"; tesseract Orientation orientation; tesseract オリエンテーション tesseract WritingDirection direction; tesseract WritingDirectionの方向。 tesseract TextlineOrder order; tesseract TextlineOrderの順序 float deskew_angle; float deskew_angle; PIX *image = pixRead(inputfile); PIX * image = pixRead(入力ファイル); tesseract TessBaseAPI *api = new tesseract TessBaseAPI(); tesseract TessBaseAPI * api = new tesseract TessBaseAPI(); api- Init("/usr/src/tesseract/", "eng"); api- Init( "/ usr / src / tesseract /"、 "eng"); api- SetPageSegMode(tesseract PSM_AUTO_OSD); SetPageSegMode(tesseract PSM_AUTO_OSD); api- SetImage(image); api- SetImage(image); api- Recognize(0); api- 認識(0); tesseract PageIterator* it = api- AnalyseLayout(); tesseract PageIterator * it = api- AnalyseLayout(); it- Orientation( orientation, direction, order, deskew_angle); it- Orientation(&orientation、&direction、&order、&deskew_angle); printf("Orientation %d;\nWritingDirection %d\nTextlineOrder %d\n" \ printf( "印刷の向き %d; \ n書き込み方向 %d \ nテキスト行の順序 %d \ n" \ "Deskew angle %.4f\n", "傾き角 %.4f \ n"、 orientation, direction, order, deskew_angle); 方向、方向、順序、deskew_angle); ` | ` Explanation for result codes are in publictypes.h 結果コードの説明は[publictypes.h]にあります(https //github.com/tesseract-ocr/tesseract/blob/master/src/ccstruct/publictypes.h#L120) # Example of iterator over the classifier choices for a single symbol #単一のシンボルに対する分類子の選択に対する反復子の例 `c++ | `c ++ Pix *image = pixRead("/usr/src/tesseract/testing/phototest.tif"); Pix * image = pixRead( "/ usr / src / tesseract / testing / phototest.tif"); tesseract TessBaseAPI *api = new tesseract TessBaseAPI(); tesseract TessBaseAPI * api = new tesseract TessBaseAPI(); api- Init(NULL, "eng"); api- Init(NULL、 "eng"); api- SetImage(image); api- SetImage(image); api- SetVariable("save_blob_choices", "T"); api- SetVariable( "save_blob_choices"、 "T"); api- SetRectangle(37, 228, 548, 31); api- SetRectangle(37、228、548、31); api- Recognize(NULL); 認識(NULL); tesseract ResultIterator* ri = api- GetIterator(); tesseract ResultIterator * ri = api- GetIterator(); tesseract PageIteratorLevel level = tesseract RIL_SYMBOL; tesseract PageIteratorLevel level = tesseract RIL_SYMBOL; if(ri != 0) { if(ri!= 0){ do { 行う { const char* symbol = ri- GetUTF8Text(level); const char * symbol = ri- GetUTF8Text(level); float conf = ri- Confidence(level); float conf = ri- 信頼度(レベル)。 if(symbol != 0) { if(symbol!= 0){ printf("symbol %s, conf %f", symbol, conf); printf( "シンボル%s、conf %f"、シンボル、conf); bool indent = false; bool indent = false; tesseract ChoiceIterator ci(*ri); tesseract ChoiceIterator ci(* ri); do { 行う { if (indent) printf("\t\t "); printf( "\ t \ t");の場合(インデント) printf("\t- "); printf( "\ t-"); const char* choice = ci.GetUTF8Text(); const char * choice = ci.GetUTF8Text(); printf("%s conf %f\n", choice, ci.Confidence()); printf( "%s conf %f \ n"、選択、ci.Confidence()); indent = true; indent = true; } while(ci.Next()); while(ci.Next()); } } printf("---------------------------------------------\n"); printf( "--------------------------------------------- \ n "); delete[] symbol; []記号を削除します。 } while((ri- Next(level))); while((ri- Next(level))); } } ` | ` # Compiling C++ API programs on Linux #LinuxでC ++ APIプログラムをコンパイルする Including and linking to Tesseract s API is done in a standard Linux way. To compile a basic program against the API, you can use a command like this TesseractのAPIの組み込みとリンクは、標準のLinuxの方法で行われます。 APIに対して基本プログラムをコンパイルするには、次のようなコマンドを使用できます。 ` | ` g++ -o myprogram myprogram.cpp -llept -ltesseract g ++ -o myprogram myprogram.cpp -llept-ltesseract ` | ` If Tesseract is installed in an unusual place, you can specify the include and lib directories explicitly with g++ s -I and -L flags, like this Tesseractが異常な場所にインストールされている場合は、次のようにg ++の-Iおよび-Lフラグを使用してincludeおよびlibディレクトリを明示的に指定できます。 ` | ` g++ -o myprogram myprogram.cpp -I/home/nick/local/include/tesseract -L/home/nick/local/lib -llept -ltesseract g ++ -o myprogram myprogram.cpp -I / home / nick / local / include / tesseract -L / home / nick /ローカル/ lib -llept -ltesseract ` | ` # C-API in python #PythonのC-API Tesseract-ocr from version 3.02.02 provide C-API. This enable to use tesseract-ocr shared library in python (and other languages that can use C libraries) バージョン3.02.02からのTesseract-ocrはC-APIを提供します。これはpythonでtesseract-ocr共有ライブラリを使う(そしてC言語を使うことができる他の言語)を可能にします。ライブラリ) ```python python import os 輸入os import ctypes ctypeをインポート lang = "eng" lang = "eng" filename = "/usr/src/tesseract-ocr/phototest.tif" filename = "/usr/src/tesseract-ocr/phototest.tif" libname = "/usr/local/lib64/libtesseract.so.3" libname = "/usr/local/lib64/libtesseract.so.3" TESSDATA_PREFIX = os.environ.get( TESSDATA_PREFIX ) TESSDATA_PREFIX = os.environ.get( TESSDATA_PREFIX ) if not TESSDATA_PREFIX TESSDATA_PREFIXでない場合 TESSDATA_PREFIX = "../" TESSDATA_PREFIX = "../" tesseract = ctypes.cdll.LoadLibrary(libname) tesseract = ctypes.cdll.LoadLibrary(libname) tesseract.TessVersion.restype = ctypes.c_char_p tesseract.TessVersion.restype = ctypes.c_char_p tesseract_version = tesseract.TessVersion() tesseract_version = tesseract.TessVersion() api = tesseract.TessBaseAPICreate() api = tesseract.TessBaseAPICreate() rc = tesseract.TessBaseAPIInit3(api, TESSDATA_PREFIX, lang) rc = tesseract.TessBaseAPIInit3(api、TESSDATA_PREFIX、lang) if (rc) if(rc) tesseract.TessBaseAPIDelete(api) tesseract.TessBaseAPIDelete(api) print("Could not initialize tesseract.\n") print( "tesseractを初期化できませんでした。\ n") exit(3) 出口(3) text_out = tesseract.TessBaseAPIProcessPages(api, filename, None, 0) text_out = tesseract.TessBaseAPIProcessPages(api、filename、None、0) result_text = ctypes.string_at(text_out) result_text = ctypes.string_at(text_out) print Tesseract-ocr version , tesseract_version 「Tesseract-ocrバージョン」、tesseract_versionを印刷します。 print result_text result_textを印刷する ` | ` Example of passing python file object to C-API can be found at pastebin. PythonファイルオブジェクトをC-APIに渡す例はpastebinにあります。 Example of extracting orientation from Tesseract 4.0 Tesseract 4.0から方向を抽出する例 ```python python # /usr/bin/env python3 #/ usr / bin / env python3 # coding utf-8 #コーディング utf-8 PATH_TO_LIBTESS = /path/to/development/libtesseract.so PATH_TO_LIBTESS = /path/to/development/libtesseract.so import cffi # requires "pip install cffi" import cffi#には "pip install cffi"が必要です。 ffi = cffi.FFI() ffi = cffi.FFI() ffi.cdef(""" ffi.cdef( "" " struct Pix; Pixを構築します。 typedef struct Pix PIX; type PIX PIX PIXを構築します。 PIX pixRead ( const char filename ); PIX pixRead(const char filename); char * getLeptonicaVersion ( ); char * getLeptonicaVersion(); typedef struct TessBaseAPI TessBaseAPI; typedef struct TessBaseAPI TessBaseAPI; typedef int BOOL; typedef int BOOL; const char* TessVersion(); const char * TessVersion(); TessBaseAPI* TessBaseAPICreate(); TessBaseAPI * TessBaseAPICreate(); int TessBaseAPIInit3(TessBaseAPI handle, const char datapath, const char* language); int TessBaseAPIInit3(TessBaseAPI ハンドル、const char データパス、const char *言語); void TessBaseAPISetImage2(TessBaseAPI handle, struct Pix pix); void TessBaseAPISetImage2(TessBaseAPI ハンドル、Pix pix構造体); BOOL TessBaseAPIDetectOrientationScript(TessBaseAPI* handle, char** best_script_name, BOOL TessBaseAPIDetectOrientationScript(TessBaseAPI *ハンドル、char ** best_script_name、 int best_orientation_deg, float script_confidence, int best_orientation_deg、float script_confidence、 float* orientation_confidence); float * orientation_confidence); """) "" ") libtess = ffi.dlopen(PATH_TO_LIBTESS) libtess = ffi.dlopen(PATH_TO_LIBTESS) from ctypes.util import find_library ctypes.util import find_libraryから liblept = ffi.dlopen(find_library( lept )) liblept = ffi.dlopen(find_library( lept )) ffi.string(libtess.TessVersion()) ffi.string(libtess.TessVersion()) ffi.string(liblept.getLeptonicaVersion()) ffi.string(liblept.getLeptonicaVersion()) api = libtess.TessBaseAPICreate() api = libtess.TessBaseAPICreate() libtess.TessBaseAPIInit3(api, ffi.NULL, ffi.NULL) libtess.TessBaseAPIInit3(api、ffi.NULL、ffi.NULL) pix = liblept.pixRead( mono.png .encode()) pix = liblept.pixRead( mono.png .encode()) libtess.TessBaseAPISetImage2(api, pix) libtess.TessBaseAPISetImage2(api、pix) script_name = ffi.new( char ** ) script_name = ffi.new( char ** ) orient_deg = ffi.new( int * ) orient_deg = ffi.new( int * ) script_conf = ffi.new( float * ) script_conf = ffi.new( float * ) orient_conf = ffi.new( float * ) orient_conf = ffi.new( float * ) libtess.TessBaseAPIDetectOrientationScript(api, script_name, orient_deg, script_conf, orient_conf) libtess.TessBaseAPIDetectOrientationScript(api、script_name、orient_deg、script_conf、orient_conf) print(ffi.string(script_name).decode( utf-8 )) print(ffi.string(script_name).decode( utf-8 )) print(orient_deg[0]) print(orient_deg [0]) print(script_conf[0]) print(script_conf [0]) print(orient_conf[0]) print(orient_conf [0]) ` | ` # Example using the C-API in a C program #CプログラムでC-APIを使用する例 The C-API can of course also be used by regular C programs, as in this very basic example. この非常に基本的な例のように、C-APIは通常のCプログラムでももちろん使用できます。 `c | `c #include #include #include #include #include #include void die(const char *errstr) { void die(const char * errstr){ fputs(errstr, stderr); exit(1); } } int main(int argc, char *argv[]) { int main(int argc、char * argv []){ TessBaseAPI *handle; PIX *img; char *text; if((img = pixRead("img.png")) == NULL) handle = TessBaseAPICreate(); if(TessBaseAPIInit3(handle, NULL, "eng") != 0) TessBaseAPISetImage2(handle, img); if(TessBaseAPIRecognize(handle, NULL) != 0) if((text = TessBaseAPIGetUTF8Text(handle)) == NULL) fputs(text, stdout); TessDeleteText(text); TessBaseAPIEnd(handle); TessBaseAPIDelete(handle); pixDestroy( img); return 0; } } ` | ` On Linux you can compile it as you would build a program using the C++ API. Linuxでは[C ++ APIを使ってプログラムをビルドするのと同じようにコンパイルする]ことができます(#compiling-c-api-programs-linux)。 # Example creating searchable pdf from image in C++ #C ++で画像から検索可能なPDFを作成する例 `c++ | `c ++ #include leptonica/allheaders.h #include leptonica / allheaders.h #include tesseract/baseapi.h #include tesseract / baseapi.h #include tesseract/renderer.h #include tesseract / renderer.h int main() int main() { { const char* input_image = "/usr/src/tesseract-oc/testing/phototest.tif"; const char * input_image = "/usr/src/tesseract-oc/testing/phototest.tif"; const char* output_base = "my_first_tesseract_pdf"; const char * output_base = "my_first_tesseract_pdf"; const char* datapath = "/Projects/OCR/tesseract/tessdata"; const char * datapath = "/プロジェクト/ OCR / tesseract / tessdata"; int timeout_ms = 5000; int timeout_ms = 5000; const char* retry_config = nullptr; const char * retry_config = nullptr; bool textonly = false; bool textonly = false; int jpg_quality = 92; int jpg_quality = 92; tesseract TessBaseAPI *api = new tesseract TessBaseAPI(); tesseract TessBaseAPI * api = new tesseract TessBaseAPI(); if (api- Init(datapath, "eng")) { if(api- Init(datapath、 "eng")){ fprintf(stderr, "Could not initialize tesseract.\n"); fprintf(stderr、 "tesseractを初期化できませんでした。\ n"); exit(1); 出口(1); } } tesseract TessPDFRenderer *renderer = new tesseract TessPDFRenderer( tesseract TessPDFRenderer * renderer = new tesseract TessPDFRenderer( output_base, api- GetDatapath(), textonly, jpg_quality); output_base、api- GetDatapath()、textonly、jpg_quality); bool succeed = api- ProcessPages(input_image, retry_config, timeout_ms, renderer); bool succeed = api- ProcessPages(input_image、retry_config、timeout_ms、renderer); if (!succeed) { if(!成功){ fprintf(stderr, "Error during processing.\n"); fprintf(stderr、 "処理中にエラーが発生しました。\ n"); return EXIT_FAILURE; EXIT_FAILUREを返します。 } } api- End(); api- End(); return EXIT_SUCCESS; EXIT_SUCCESSを返します。 } } ` | ` # Example of monitoring OCR progress in C++ #C ++でOCRの進捗を監視する例 `c++ | `c ++ #include tesseract/baseapi.h #include tesseract / baseapi.h #include tesseract/ocrclass.h #include tesseract / ocrclass.h #include leptonica/allheaders.h #include leptonica / allheaders.h #include #include スレッド void monitorProgress(ETEXT_DESC *monitor, int page); void monitorProgress(ETEXT_DESC * monitor、int page); void ocrProcess(tesseract TessBaseAPI api, ETEXT_DESC monitor); void ocrProcess(tesseract TessBaseAPI api、ETEXT_DESC monitor); void monitorProgress(ETEXT_DESC *monitor, int page) { void monitorProgress(ETEXT_DESC *モニタ、intページ){ while (1) { while(1){ printf( "\r%3d%%", monitor[page].progress); printf( "\ r%3d %%"、モニター[ページ] .progress); fflush (stdout); fflush(標準出力)。 if (monitor[page].progress==100) if(monitor [page] .progress == 100) break; ブレーク; } } } } void ocrProcess(tesseract TessBaseAPI api, ETEXT_DESC monitor) { void ocrProcess(tesseract TessBaseAPI api、ETEXT_DESC monitor){ api- Recognize(monitor); 認識 - 監視(監視) } } int main() { int main(){ tesseract TessBaseAPI *api = new tesseract TessBaseAPI(); tesseract TessBaseAPI * api = new tesseract TessBaseAPI(); ETEXT_DESC *monitor = new ETEXT_DESC(); ETEXT_DESC * monitor = new ETEXT_DESC(); if (api- Init("/tesseract/tessdata_best", "eng")) { if(api- Init( "/ tesseract / tessdata_best"、 "eng")){ fprintf(stderr, "Could not initialize tesseract.\n"); fprintf(stderr、 "tesseractを初期化できませんでした。\ n"); return 1; 1を返します。 } } api- SetPageSegMode(tesseract PSM_AUTO); SetPageSegMode(tesseract PSM_AUTO); Pix *image = pixRead("/tesseract-ocr/test/testing/phototest.tif"); Pix * image = pixRead( "/ tesseract-ocr / test / testing / phototest.tif"); if (!image) { if(!image){ fprintf(stderr, "Leptonica can t process input file!\n"); fprintf(stderr、 "Leptonicaは入力ファイルを処理できません!\ n"); return 2; 2を返します。 } } api- SetImage(image); api- SetImage(image); int page = 0; int page = 0; std thread t1(ocrProcess, api, monitor); std thread t1(ocrProcess、api、monitor); std thread t2(monitorProgress, monitor, page); std thread t2(monitorProgress、monitor、page); t1.join(); t1.join(); t2.join(); t2.join(); pixDestroy( image); pixDestroy(&image); char *outText = api- GetUTF8Text(); char * outText = api- GetUTF8Text(); printf("\n%s", outText); printf( "\ n%s"、outText); if (outText) if(outText) delete [] outText; delete [] outText; api- End(); api- End(); return 0; 0を返します。 } } ` | ` More complex example (e.g. cancelling OCR process) can be found in source code of TesseractGui, gimagereader or android textfairy app. より複雑な例(OCRプロセスのキャンセルなど)は、TesseractGuiのソースコードにあります。[gimagereader](https // fossies) .org / linux / gimagereader / qt / src / Recognizer.cc)またはandroid textfairy app。
https://w.atwiki.jp/api_programming/pages/170.html
http //developer.garmin.com/connect-iq/programmers-guide/ios-sdk-guide/ Garmin Developers Connect IQ SDK 大まかな流れ(想像) URLスキームで、元のアプリケーションにメッセージを送る ミュージックアプリを動かす場合 iOS SDK Guide iOS用のモバイルSDKを用いて、ガーミンウェアラブルデバイス上で動作するMonkey Cアプリケーションと連動するiOSアプリケーションを製作できます。 リモートデータを取得したり、ウェアラブルデバイスからiOSデバイスにresource-intensive tasksを読ませることでfeature-richなユーザーエクスペリエンスを構築することができます。 このガイドはMobile SDKにiOSプロジェクトを加え、SDKのAPIやあなたのMonkey Cアプリケーションとの通信方法を紹介するものです。 メモ:iOSプロジェクトを作成するためのメモであって、Garminデバイスから通信するためのメモではない? Configuring a Project To Use the Mobile SDK フレームワークをプロジェクトに加えるiOS用のモバイルSKDは、iOSフレームワークパッケージとして配布され、iOS SDKの中に見つけることができます。まず、Xcodeにおいて、ConnectIQ.framework をプロジェクトのフレームワークグループにドラッグします。 Add the bundle to the project.iOS向けのモバイル SDK はそのSDKで使われるリソースにバンドルされて配布されており、iOS SDK の中に見つけることができる。SDKがこれらリソースにアクセスできるように、SDKのフレームワークを参照するプロジェクトに加える必要がある。ConnectIQ.bundle ファイルをXcodeの適切なファイルに加える。 (e.g. Resources or Supporting Files). リンク依存をフレームワークに加えるTo allow a project to build with the Mobile SDK, add a linker dependency to the framework for each of the project’s targets by adding an entry to the Target Build Phases Link Binary With Libraries panel. バンドルリソースをコピーするSimilarly, in order for the resources inside the bundle added in step 2 to be available at runtime, they must be copied to the target’s resources at build time. This can be accomplished by adding an entry to the Build Phases Copy Bundle Resources panel. 必要なリンカフラグを加えるThe Mobile SDK for iOS utilizes category methods internally. When importing a library that uses category methods, an additional flag must be specified to allow the library to be linked correctly. To do this, add the –ObjC flag to the Target Build Settings Other Linker Flags setting. URL scheme を登録するAndroid用のモバイルSDKと違い、iOS Mobile SDK を用いて作られたアプリはスタンドアローンであり、GCMに直接は依存せず、デバイスと通信する。しかし、GCMは必要となり、最初に通信のできるConnect IQ-compatible devices や Monkey C アプリがインストールされたデバイスをさがすのに使う。アプリとGCMは iOS の URL スキームを通してお互いをの情報を交換する。 To facilitate this, a URL scheme that GCM can send data to must be registered by the app. To do this, add an entry to the Target Info URL Types panel. A string that is not likely to collide with any other apps on the iOS device should be chosen. See the Apple documentation for more information on custom URL schemes. Set background execution mode (optional).The iOS system allows apps that communicate with Bluetooth devices to be woken up to execute in the background when a connected device has data to send. This can be useful for companion apps that process requests for their respective Monkey C applications on a wearable device. To enable this behavior, turn on the Uses Bluetooth LE accessories option in the Target Capabilities Background Modes panel. SDK を初期化する All interaction with the Mobile SDK is done through the ConnectIQ class. This class must be initialized during app startup with the project’s URL scheme and a UI override delegate. Typically this is done within the app delegate’s application didFinishLaunchingWithOptions method. [[ConnectIQ sharedInstance] initializeWithUrlScheme @"exapp-123456" uiOverrideDelegate self]; URLスキームは Configuring a Project To Use the Mobile SDKのStep4 で選んだもとの同じ文字列を選ぶ必要がある。 The URL scheme should be the same string chosen in Step 4 of When invoking a method of the ConnectIQ class that requires GCM to be installed and it is not present on the iOS system, by default an alert dialog will be shown to users that allows them to go to the Apple App Store page for GCM to install it. By passing an instance of an object that conforms to the IQUIOverrideDelegate protocol here, custom behavior or a specialized UI may be specified in this case. To use the default alert dialog and behavior, pass nil. Implementing a UI Override Delegate If a UI override delegate was specified and an action was performed that requires GCM to be installed, the ConnectIQ class will call the needsToInstallConnectMobile method on that delegate. The app should inform the user that GCM is required for this action and give the user the option to open the Apple App Store page for GCM or to cancel the action that triggered it. If the user chooses to install GCM, the howAppStoreForConnectMobile method may be called. - (void)needsToInstallConnectMobile { // Show alert to user with choice to install GCM if (alert.result == YES) { [[ConnectIQ sharedInstance] showAppStoreForConnectMobile]; } } Note that this example is synchronous, but if UI is shown to the user, the showAppStoreForConnectMobile method should be called as a result of user input instead of directly in the needsToInstallConnectMobile method. デバイスとの動作 (Working with Devices) Finding Connect IQ-compatible Devices iOS SDK はBluetooth を介して、直接デバイスと通信する。しかし、どのデバイスが使用できるのかを知る必要はある。そのため、アプリケーションは次のメソッドを呼び出さなければならない。 showConnectIQDeviceSelection [[ConnectIQ sharedInstance] showConnectIQDeviceSelection]; This method launches GCM to the foreground and allows the user to choose which paired Connect IQ-compatible devices to share with the companion app. If GCM is not installed and a UI override delegate was set, its needsToInstallConnectMobile will be called. Note that by launching GCM, this method causes the companion app to go into the background, possibly resulting in the app being suspended. The companion app should expect to be suspended when calling this method. Once ユーザーがペアリングしたデバイスにto share with the companion 選択したら、GCM will launch the companion app (via its registered URL scheme), シリアル化された URL クエリアイテムをデバイスのリストとして送信する。The companion app should override its app delegate’s application openURL sourceApplication annotation method to listen for this. The companion app may then call the parseDeviceSelectionResponseFromURL method クエリアイテムをモバイルSDKとして使われるIQDevice オブジェクトである NSArray に展開して – (BOOL)application (UIApplication *)application openURL (NSURL *)url sourceApplication (NSString *)sourceApplication annotation (id)annotation { if ([url.scheme isEqualToString ReturnURLScheme] [sourceApplication isEqualToString IQGCMBundle] { NSArray *devices = [[ConnectIQ sharedInstance] parseDeviceSelectionResponseFromURL url]; if (devices != nil) { [self.devices removeAllObjects]; for (IQDevice *device in devices) { self.devices[device.uuid] = device; } return YES; } } return NO; } Note that in this example, the parsed devices are stored to a dictionary for later use within the app, but are not cached in any kind of persistent storage. To avoid needing to launch GCM excessively to discover devices, companion apps should cache devices to persistent storage. When a list of devices is returned by GCM, companion apps should clear all previously cached references to devices they may have known about. Always use only the latest list of devices that the user has authorized. Listening for Device Events Once the companion app has one or more IQDevice instances from GCM, it may register with the ConnectIQ class to receive notifications when that device’s connection status changes by calling registerForDeviceEvents delegate . [[ConnectIQ sharedInstance] registerForDeviceEvents device delegate self]; The delegate passed in must be an instance of a class that conforms to the IQDeviceEventDelegate protocol. Once registered, the delegate’s deviceStatusChanged status method will be invoked when the device’s connection status changes. The getDeviceStatus method may also be called to get the current connection status of the device. These methods both return a device’s status as an IQDeviceStatus value. A companion app must register to receive device events before calling methods that operate on devices or apps, such as getDeviceStatus or sendMessage toApp progress completion . To stop listening for device events, a companion app may call either the unregisterForDeviceEvents delegate or unregisterForAllDeviceEvents method. [[ConnectIQ sharedInstance] unregisterForDeviceEvents device delegate self]; [[ConnectIQ sharedInstance] unregisterForAllDeviceEvents self]; アプリケーションとの動作 (Working with Apps) Creating an App Instance Apps are represented in the Mobile SDK as instances of the IQApp class. An instance of the IQApp class represents a single app on a single device. This means that in order to work with an app that’s installed on two different devices, a companion app will need two instances of the IQApp class with the same app ID, one for each device. To create an app instance, use the IQApp class’s appWithUUID device method. NSUUID *uuid = [[NSUUID alloc] initWithUUIDString @””]; IQApp *app = [IQApp appWithUUID uuid device device]; Requesting an App’s Status Once an IQApp instance has been created that links an app ID to an IQDevice instance, a companion app may request the status of the app on that device by calling the getAppStatus completion method. [ [ConnectIQ sharedInstance] getAppStatus app completion ^(IQAppStatus *appStatus) { if (appStatus != nil appStatus.isInstalled) { NSLog(@”App is installed! Version %d”, appStatus.version); } } ]; This method communicates with the device over Bluetooth, and therefore is asynchronous. The completion block will be invoked when the device responds, or the request times out. If the request is successful, the completion block will be invoked with an instance of the IQAppStatus class. A companion app may inspect this status to discover if the app is installed on the device, and if so, what the version of that app is. A companion app could then potentially show a UI that recommends that the user upgrade the app on the device. If the device is not currently connected or the request times out, the completion block will be invoked with a nil status. Installing, Upgrading or Managing an App If a companion app determines that an app is out of date or not installed, it may allow the user to install or upgrade that app by launching the Connect IQ store within GCM. To do this, simply call the showConnectIQStoreForApp method. [[ConnectIQ sharedInstance] showConnectIQStoreForApp app]; A companion app may also call this method even if the app is installed and up to date on the device, to allow the user to manage or uninstall the app from the device. Like the showConnectIQDeviceSelection method, by launching GCM, this method causes the companion app to go into the background, possibly resulting in the app being suspended. The companion app should expect to be suspended when calling this method. メッセージの送信 Once a companion app has determined that an app is installed on a connected device, the companion app はその iOS アプリケーションのメールボックスに Bluetooth を介して次のメソッドを使ってメッセージを送る sendMessage toApp progress completion このメソッドはメッセージとしてオブジェクト、送信先として IQApp、そしてさらに2つのブロックを取る。一つはデータ送信状態を定期的に呼び出させるもの、もう一つは転送が終了した場合に呼び出されるものである。 NSArray *message = @[@”hello pi”, @(3.14159)]; [ [ConnectIQ sharedInstance] sendMessage message toApp app progress ^(uint32_t sent, uint32_t total) { float percent = 100 * sent / (float)total; NSLog(@".2f%% - %u/%u", percent, sent, total); } completion ^(IQSendMessageResult result) { NSLog(@"Send message finished with result %@", NSStringFromSendMessageResult(result)); } ]; The message object that is passed to this method is first converted by the SDK into a Monkey C-compatible type, and is then sent to the app’s mailbox on the device. Therefore, only Objective-C types that can be directly translated to comparable Monkey C types are valid. Valid message types include NSString, NSNumber, NSArray, NSDictionary and NSNull. Take advantage of nesting other types inside an NSArray or NSDictionary to form complex messages. Values contained in NSNumber objects will be converted to the most appropriate Monkey C value type on the device. Keep in mind that the wearable devices have limited memory and processing power compared to an iOS device. Messages should be as small as possible. However, sending frequent small messages can incur performance and battery life costs. Therefore, it is more desirable to send occasional large messages than it is to frequently send many tiny messages. Companion apps should aim to balance the costs of memory and performance by sending messages only when necessary and keeping message size to a minimum. Receiving Messages A companion app may register to receive messages that are sent from an app on a device by calling the registerForAppMessages delegate method. This method takes an IQApp to listen for messages from, and an instance of an object that conforms to the IQAppMessageDelegate protocol as the listener. After registering, when a message from that app is successfully received, the receivedMessage fromApp method will be called on the listener. To stop listening for app messages, a companion app may call either the unregisterForAppMessages delegate or unregisterForAllAppMessages method. – (void)viewWillAppear (BOOL)animated { [[ConnectIQ sharedInstance] registerForAppMessages self.app delegate self]; } – (void)viewDidDisappear (BOOL)animated { [[ConnectIQ sharedInstance] unregisterForAllAppMessages self]; } – (void)receivedMessage (id)message fromApp (IQApp *)app { NSLog(@"Received message from app %@ '%@'", app, message); } A companion app may register to receive messages from multiple apps across many devices. However, multiple companion apps should never register to receive messages from the same app. The nature of Bluetooth communication on iOS prevents the Mobile SDK from determining which companion app to deliver the message to. Therefore, undefined behavior will result from multiple companion apps registering to receive messages from the same app. Developer Blog Contact Resources ©2016 Garmin LTD or Its Subsidiaries Terms of Use Privacy Garmin
https://w.atwiki.jp/kaitoapi/pages/9.html
動画(youtube) @wikiのwikiモードでは #video(動画のURL) と入力することで、動画を貼り付けることが出来ます。 詳しくはこちらをご覧ください。 =>http //atwiki.jp/guide/17_209_ja.html また動画のURLはYoutubeのURLをご利用ください。 =>http //www.youtube.com/ たとえば、#video(http //youtube.com/watch?v=kTV1CcS53JQ)と入力すると以下のように表示されます。
https://w.atwiki.jp/kaitoapi/pages/5.html
まとめサイト作成支援ツールについて @wikiにはまとめサイト作成を支援するツールがあります。 また、 #matome_list と入力することで、注目の掲示板が一覧表示されます。 利用例)#matome_listと入力すると下記のように表示されます #matome_list
https://w.atwiki.jp/rajun/pages/32.html
Twitter REST API の使い方 電車の時間を教えてくれるtwiiterのbot的ななにかをつくる。 Twitter API / 開発
https://w.atwiki.jp/memoprogram/pages/24.html
HICON LoadIcon( HINSTANCE hInstance,//#1 アプリケーションインスタンスのハンドル LPCTSTR lpIconName//#2 リソース名の文字列またはリソース識別子 ); 引数 #1 hInstance 定義済みアイコンを取得する場合、NULLを指定する。 カスタムアイコンをロードする場合、アプリケーションのインスタンスハンドルを指定する。 #2 lpIconName 定義済みアイコンの場合、以下の識別子を指定する。 IDI_APPLICATION 既定のアプリケーションアイコン IDI_ASTERISK IDI_INFORMATION と同じです IDI_ERROR ストップマークのアイコン(米国の歩行者用信号の赤と同じで、手を開いて制止しているデザインです) IDI_EXCLAMATION IDI_WARNING と同じです IDI_HAND IDI_ERROR と同じです IDI_INFORMATION 情報アイコン(吹き出しの中に i の文字) IDI_QUESTION 疑問符のアイコン IDI_WARNING 感嘆符のアイコン IDI_WINLOGO Windows ロゴのアイコン 戻り値 新しくロードされたアイコンのハンドルが返る。 失敗した場合NULLが返る。
https://w.atwiki.jp/tamotech/pages/34.html
スレッド スレッドスレッド概要 プログラムの中でスレッドを作成する方法 スレッドの排他制御 スレッドローカル(ThreadLocal) スレッド概要 TECHSCOREより スレッドとは、プログラムを実行している主体(例えて言うなら1人の人間)です。すべてのプログラムはスレッドによって実行されています。 1つのスレッドは、ひとりの人間がプログラムを1行ずつ読んでプログラムの流れを追いかけるように、命令を1つずつ解釈し処理を実行していきます。 まあよく聞くけどいまいちイメージわかず。。 Javaの道より インターネットブラウザはマルチスレッドプログラムです。画像をダウンロードしながら、音楽を聞きながら、画面をスクロールしたり、他のページを閲覧したりと言ったことができます。 プログラムの中でスレッドを作成する方法 Threadクラスを継承したクラスを利用する 1. Threadクラスを継承するクラスを作成する。 2. そのクラスでrunメソッドを宣言する。 3. そのクラスのインスタンスを作成する。 4. そのインスタンスのstartメソッドを呼び出す。 Runnableインタフェースを実装したクラスを利用する 1. Runnableインタフェースを実装したクラスを作成する。 2. そのクラスでrunメソッドを実装する。 3. そのクラスのインスタンスを作成する。 4. そのインスタンスを引数としたコンストラクタでThreadクラスのインスタンスを作成する。 5. そのThreadクラスのインスタンスのstartメソッドを呼び出す。 スレッドの排他制御 マルチスレッドで同じオブジェクトが同時に操作されるとプログラムに不具合が発生する。同じオブジェクトが同時に操作されないようするために、スレッドの排他制御が必要となる。 スレッドローカル(ThreadLocal) ThreadLocalは、スレッド毎の値を保持する為のクラス。 あるクラス(のインスタンス)がマルチスレッドで呼ばれる際に、スレッド毎に異なる値(インスタンス)を使いたい場合に使用する。 自分でThread(やRunnable)を使ってマルチスレッド化しているなら スレッド毎の値なんて簡単に保持できるので、ThreadLocalには意味が無い。 しかしウェブアプリ(サーブレット)は1つのインスタンスがマルチスレッドで呼ばれるので、そのスレッド毎に別のインスタンスを保持したい時にはとても便利。
https://w.atwiki.jp/kapipara099/
このwikiでは、スクラッチというプログラミングソフトで、 私が作っているアニメや、ゲームなどの最新情報をお届けします。 あと、テラリア&モンハンやる人募集中!!(switchです) フレコ;2703-0324ー6136 ぜひ、フォローをお願いします。フォロバします!! ユーザー名:kapipara099 https //scratch.mit.edu/users/kapipara099/ まずは、私が作ったオリジナル曲、カピナイのURLを貼ります。↓ https //scratch.mit.edu/projects/891357210/ どうでしたか?コメント欄に、感想お願いします。 次は、アニメの情報です。 大体のストーリーの流れは、幽霊が見える学生が、 異世界の神の幽霊に出会い、二つの世界の共生が乱れ、 二つの世界が合体し、、、 という流れです。完成したら、ここにURLを貼っておきます。 あと、一緒にアニメ作る人募集中!! やってくれる人は、コメント欄で教えてください。
https://w.atwiki.jp/kaitoapi/pages/7.html
アーカイブ @wikiのwikiモードでは #archive_log() と入力することで、特定のウェブページを保存しておくことができます。 詳しくはこちらをご覧ください。 =>http //atwiki.jp/guide/25_171_ja.html たとえば、#archive_log()と入力すると以下のように表示されます。 保存したいURLとサイト名を入力して"アーカイブログ"をクリックしてみよう サイト名 URL
https://w.atwiki.jp/kaitoapi/pages/10.html
@wikiにはいくつかの便利なプラグインがあります。 アーカイブ インスタグラム コメント ニュース 人気商品一覧 動画(Youtube) 編集履歴 関連ブログ これ以外のプラグインについては@wikiガイドをご覧ください = http //atwiki.jp/guide/