SlideShare ist ein Scribd-Unternehmen logo
1 von 61
@nyaocat
Boost 勉強会#9
にゃおきゃっと です
 TwitterID : @nyaocat
 趣味プログラマ
 ↓平日はだいたいこの辺のどちらかに居ます↓
伝えたい事
 Boost使おう
Hello World しよう
#include <iostream>
using namespace std;

int main(){
  cout << “Hello, World!” << endl;
}
Hello World しよう
$ g++ hello.cpp –o hello

$ ./hello
Hello, World!
複数回挨拶させたい!
$ ./hello --count 3
Hello, World!
Hello, World!
Hello, World!

こんな感じに
複数回挨拶させたい!
int main(int argc, char *argv[]){
  int hellon = 1;
  if (argc > 2 && strcmp(argv[1], “--count”)==0)
     hellon = atoi(argv[2]);

    for (int i = 0; i < hellon; ++i)
      cout << “Hello, World!” << endl;
}
複数回挨拶させたい!
int main(int argc, char *argv[]){
  int hellon = 1;
  if (argc > 2 && strcmp(argv[1], “--count”)==0)
     hellon = atoi(argv[2]);

    for (int i = 0; i < hellon; ++i)
      cout << “Hello, World!” << endl;
}
--help も付けたくなった
                    ら?
int main(int argc, char *argv[]){
  int hellon = 1;
   if (argc > 1 && strcmp(argv[1],”--help”) == 0){
     cout << “Usage …” << endl;
     exit(0);
 }
  if (argc > 2 && strcmp(argv[1], “--count”)==0)
     hellon = atoi(argv[2]);

…
--hello-c++で
別の挨拶を出したくなったら?
int main(int argc, char *argv[]){
  int hellon = 1;
  char helloMessage []= “Hello, World!”;
   if (argc > 1 && strcmp(argv[1],”--help”) == 0){
     cout << “Usage …” << endl; ここに追加を忘れてないか?
     exit(0);
 }
  if (argc > 2 && strcmp(argv[1], “--count”)==0)
     hellon = atoi(argv[2]);

    if (argc > 2 && strcmp(argv[1], “--hello-c++”)==0)
       helloMessage = “Hello, C++ !”;

…
--hello-c++ と –x の両方に同じ意
     味を持たせたくなったら?
if (argc > 2 &&( strcmp(argv[1], “--hello-c++”)==0
              || strcmp(argv[1], “-x”) == 0) )
--color, -c でカラー表示機能も
                 付けたくなったら?
for (int i = 0; i < argc; ++i){
 if (strcmp(argv[i], “--count”)==0)
     hellon = atoi(argv[i+1]);
 if (strcmp(argv[i],”—color”)==0
     ||strcmp(argv[i],”-c”))
   …;
 if (strcmp(argv[i], “--hello-c++”)==0
              || strcmp(argv[i], “-x”) == 0)
   …;
}
-c –x と指定可能なら
-cx と –xc も許可されるべきだよ
                       ね
for (int i = 0; i < argc; ++i){
 if (strcmp(argv[i], “--count”)==0)
     hellon = atoi(argv[i+1]);
 if (strcmp(argv[i],”—color”)==0
     &&strcmp(argv[i],”-c”))
   …;
 if (strcmp(argv[i], “--hello-c++”)==0
              && strcmp(argv[i], “-x”) == 0)
   …;
 if (strcmp(argv[i], “-cx”) || strcmp(argv[i],”-xc”)
 …….

}
--countは省略-n にしよう
  -n3 とトークンが連結されてて
                       も
            使えるようにしよう
if (………)
   …….
 if (………………………………………………………………………)
   …….
 if (………………………………………………………………………)
   …….
あ、あと –version, -v オプション
も付けて勿論-cvx, -cxv, -xvc, -xvc,-
  vcx,-vxc と全部可能な感じで
if (………)
   …….
 if (………………………………………………………………………)
   …….
 if (………………………………………………………………………)
   …….
 if (………………………………………………………………………)
   …….
 if (………………………………………………………………………)
   …….
 if (………………………………………………………………………)
   ……if (………………………………………………………………………)
   …….
 if (………………………………………………………………………)
   …….
 if (………………………………………………………………………)
   ……
if (………………………………………………………………………)
   …….
 if (………………………………………………………………………)
   …….
 if (………………………………………………………………………)
   ……
if (………………………………………………………………………)
   …….
 if (………………………………………………………………………)
   …….
 if (………………………………………………………………………)
   ……
if (………………………………………………………………………)
   …….
 if (………………………………………………………………………)
   …….
 if (………………………………………………………………………)
   ……
遠からず破綻する
 誰でも知ってる
そこで



Boost::program_options
概要
 コマンドラインオプション解析を簡潔に書ける
 -xvz と –x –v –z 等を受ける事も自動でしてくれる
 カスタマイズ性は高く無いけどそのまま使えるライ
 ブラリ

!ここから
using namespace std;
using namespace boost;
using namespace boost::program_options;
前提
先程の例
options_description opt(“オプション”)
opt.add_options()
 (“help”, “ヘルプ表示”)
 (“count,n”, value<int>(), “挨拶する回数”)
 (“hello-c++,x”, “メッセージをHello,C++ にする”)
 (“color,c”, “カラー表示”)
 (“version,v”, “バージョンを表示”)
先ほどの例
variables_map vm;
store(parse_command_line(argc, argv, opt), vm);
notify(vm);
先ほどの例
int hellon = 1;
if (vm.count(“count”))
  hellon = vm[“count”].as<int>();



for ( int i = 0; i < hellon; ++i )
  cout << “Hello, World!” << endl;
先ほどの例
./hello –x –n2
./hello --count 3
./hello –vcx
./hello –version –hello-c++ -n1

./hello --help
ヘルプ自動生成
if ( vm.count[“help”] )
   cout << opt << endl;

オプション:
--help                    ヘルプを表示
-n [ --count ] arg        挨拶する回数
-x [ --hellp-c++ ]        メッセージをHello,C++ に
-c [ --color ]            カラー表示
-v [ --version ]          バージョン表示
複数の値、デフォルト値

opt.add_options()
  (“option1”, value<int>()->default_value(10), “op1”)
  (“option2”, value<vector<int>>(), “op2”)
  (“option3”, value<int>()->multitoken(), “op3”);
解析した結果を直接代入
int optvar ;

opt.add_options()
  (“option1”, value<int>(&optvar), “op1”)



 notify() 時にoptvar に値を入れてくれる
オプションとペアになってない
          値も扱う
 ./foo --hoge XXX /etc/passwd
オプションとペアになってない
          値も扱う
 ./foo --hoge XXX /etc/passwd




              突然の死
オプションとペアになってない
          値も扱う

 ./foo --hoge XXX /etc/passwd


 /etc/passwd がどのオプションとも結びついてない
オプションとペアになってない
          値も扱う


 positional_option_description を使う
オプションとペアになってない
           値も扱う
 positional_options_description pd;
 pd.add(“input-file", 1);


 ./foo --hoge XXX /etc/passwd
↓
 ./foo --hoge XXX --input-file /etc/passwd


 解決……?
オプションとペアになってない
          値も扱う
 ヘルプメッセージと挙動が食い違う


 じゃあヘルプメッセージを変えれば良い
オプションとペアになってない
 オプションを2つ用意する
               値も扱う
 公開ヘルプ用、実際の処理用

options_description opt(“オプション”)
opt.add_options()
 (“help”, “ヘルプ表示”)

options_description hidden(“処理用”)
hidden.add_options()
   ( opt )
  (“—input-file”, value<int>(), “隠しオプション”)
オプションとペアになってない
          値も扱う
variables_map vm;
store(parse_command_line(argc, argv, hidden), vm);
notify(vm);

if (vm.count(“help”) )
   cout << opt << endl;
•未知のオプションにも対応させ
              る



 ./compiler-wrapper --compiler-option –O2 -lSDL
•未知のオプションにも対応させ
              る



              突然の死
 ./compiler-wrapper --compiler-option –O2 -lSDL
•未知のオプションにも対応させ
              る

 ./compiler-wrapper --compiler-option –O2 -lSDL


 -O, -l を定義してないので不明なオプション例外


 basic_command_line_parser の
   allow_unregistered を使う
•未知のオプションにも対応させ
              る

 ./compiler-wrapper --compiler-option –O2 -lSDL


 -O, -l を定義してないので不明なオプション例外


 basic_command_line_parser の
   allow_unregistered を使う
•未知のオプションにも対応させ
              る

 command_line_parser(argc, argv)
    .options(opt)
    .allow_unregistered()
    .run();
•未知のオプションにも対応させ
              る

 ./compiler-wrapper --compiler-option –O2 -lSDL



 ./compiler-wrapper --compiler-option=“–O2 -lSDL”
他のオプション形式にも対応す
             る
boost::program_options が標準で用意してるのは
   二種類のみ

ロングオプション(ハイフン二個、 --hoge=value 等可
 能)
ショートオプション(ハイフン一個、一文字限定 –
 acxv 可能

ハイフン3つ以上等
他のオプション形式にも対応す
             る
 -fno-rtti とかやりたい
 Windows風に /Z /D とかやりたい
 tar xvzf とかやりたい


 突然の……
他のオプション形式にも対応す
             る
 別に確実に死ぬ訳ではない


 ただ、オプションとして認識されない
(から、適切なオプション設定が無いと死ぬ)

 オプションとして認識させる必要がある


 引数解析前にパーサで前処理させれば良し
他のオプション形式にも対応す
              る
pair<string,string> reg_f (string const& s){
  if ( s.find(“-f”) == 0 )
     if ( s.substr(2, 3) == “no-” )
        return { s.substr(5), string(“false”) };
     else
        return { s.substr(3), string(“true”) };
   else
       return {string(), string()};
}
他のオプション形式にも対応す
             る

 store(command_line_parser(ac,av)
         .options(desc)
         .extra_parser(reg_foo)
         .run(), vm);
他のオプション形式にも対応す
             る


 ./rofi -fno-pants


     ↓

 ./rofi --pants false
他のオプション形式にも対応す
             る
 実はこれでは /D や xvzf には対処できない


 extra_parser は一つのトークン
      ⇒ 一つのオプション、値のペアにするのみ
他のオプション形式にも対応す
              る
 編集した argc argv を渡す


 basic_command_line_parser
      ( int argc, char const* const argv);
 basic_command_line_parser
      ( vector<string> const& args );

 Qi ~!Karma ja~!!
コンフィグファイルを読む
こんなの

[section]
value1 = 123
hoge = true
piyo = ok
# comment
コンフィグファイルを読む
セクション名 . フィールド名になる

options_description opt(“オプション”)
opt.add_options()
 (“section.value1”, value<int>(), “value1”)
 (“section.hoge”, bool_switch(), “hoge”)
 (“section.piyo”, value<string>(), “piyo”);
コンフィグファイルを読む
作成した option がそのまま流用可能
コードも流用可能

ifstream ifs(“a.conf”);
variables_map vm;
store(parse_config_file(ifs, opt), vm);
notify(vm);
環境変数を読む
 流用可能


variables_map vm;
store(parse_envirement(opt, name_mapper), vm);
notify(vm);
環境変数を読む
 name_mapper :: string -> string


オプション引数が渡されるので、
対応する環境変数名を返す

空文字列を返すとそのオプションでは環境変数を
チェックしない
環境変数を読む
 name_mapper :: string -> string


オプション引数が渡されるので、
対応する環境変数名を返す

空文字列を返すとそのオプションでは環境変数を
チェックしない
パーサー
 それぞれの parser は        basic_parsed_options< charT
 >
      を返す

variables_map vm;
store(parse_hogehoge(), vm);
notify(vm);

独自定義のパーサが利用出来る!!
パーサー
(有用なパーサが思いつきませんでした)
Windows対応
 WinMain だと lpCmdLine


 sprit_winmain( lpCmdLine )で
  vector<string> に出来る
Q&A
Q&A
 C++/Tk(仮)から随分変わったね?


Cpptk はライセンス無しだった為使えない事が
   昨日の朝分かりました

突然の死
Q&A
 Getopt, Getopts は?
Q&A
 Getopt, Getopts は?




             突然の死
ありがとうございました
 突然の死は単に例外が投げられる事を示すもので
 あって異常終了ではありません

 Windows風オプション処理等は標準で用意されてい
 た事を発表中にご指摘頂きました

http://www.boost.org/doc/libs/1_49_0/doc/html/boost/
  program_options/command_line_style/style_t.html

Weitere ähnliche Inhalte

Was ist angesagt?

Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~
CHY72
 
2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」
2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」
2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」
Hiro H.
 

Was ist angesagt? (20)

Ocaml lecture slides 01 at axsh
Ocaml lecture slides 01 at axshOcaml lecture slides 01 at axsh
Ocaml lecture slides 01 at axsh
 
Boost tour 1_40_0
Boost tour 1_40_0Boost tour 1_40_0
Boost tour 1_40_0
 
Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
 
不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarray不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarray
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
 
C++でHello worldを書いてみた
C++でHello worldを書いてみたC++でHello worldを書いてみた
C++でHello worldを書いてみた
 
新しい並列for構文のご提案
新しい並列for構文のご提案新しい並列for構文のご提案
新しい並列for構文のご提案
 
Boost Tour 1_58_0 merge
Boost Tour 1_58_0 mergeBoost Tour 1_58_0 merge
Boost Tour 1_58_0 merge
 
Boost Tour 1.48.0 diff
Boost Tour 1.48.0 diffBoost Tour 1.48.0 diff
Boost Tour 1.48.0 diff
 
実用Brainf*ckプログラミング
実用Brainf*ckプログラミング実用Brainf*ckプログラミング
実用Brainf*ckプログラミング
 
Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~
 
shared_ptr & weak_ptr (ppt 第2版, DL 専用)
shared_ptr & weak_ptr (ppt 第2版, DL 専用)shared_ptr & weak_ptr (ppt 第2版, DL 専用)
shared_ptr & weak_ptr (ppt 第2版, DL 専用)
 
Boost Fusion Library
Boost Fusion LibraryBoost Fusion Library
Boost Fusion Library
 
shared_ptr & weak_ptr (ppt 初版, DL 専用)
shared_ptr & weak_ptr (ppt 初版, DL 専用)shared_ptr & weak_ptr (ppt 初版, DL 専用)
shared_ptr & weak_ptr (ppt 初版, DL 専用)
 
Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11
 
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr
 
2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」
2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」
2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」
 
Pythonで始めるDropboxAPI
Pythonで始めるDropboxAPIPythonで始めるDropboxAPI
Pythonで始めるDropboxAPI
 
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
 
brainfuckを吐く自作言語bf-reusable
brainfuckを吐く自作言語bf-reusablebrainfuckを吐く自作言語bf-reusable
brainfuckを吐く自作言語bf-reusable
 

Ähnlich wie Boost jp9 program_options

Adding simpl GVN path into GHC
Adding simpl GVN path into GHCAdding simpl GVN path into GHC
Adding simpl GVN path into GHC
Kei Hibino
 
C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competition
yak1ex
 
ZFSのソースコードをチラ見してみる
ZFSのソースコードをチラ見してみるZFSのソースコードをチラ見してみる
ZFSのソースコードをチラ見してみる
Koichi Suzuki
 
Continuation with Boost.Context
Continuation with Boost.ContextContinuation with Boost.Context
Continuation with Boost.Context
Akira Takahashi
 
SystemC Tutorial
SystemC TutorialSystemC Tutorial
SystemC Tutorial
kocha2012
 

Ähnlich wie Boost jp9 program_options (20)

Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3
 
Boost Tour 1.50.0
Boost Tour 1.50.0Boost Tour 1.50.0
Boost Tour 1.50.0
 
高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装
 
Adding simpl GVN path into GHC
Adding simpl GVN path into GHCAdding simpl GVN path into GHC
Adding simpl GVN path into GHC
 
Material
MaterialMaterial
Material
 
プログラムの処方箋~健康なコードと病んだコード
プログラムの処方箋~健康なコードと病んだコードプログラムの処方箋~健康なコードと病んだコード
プログラムの処方箋~健康なコードと病んだコード
 
モナドハンズオン前座
モナドハンズオン前座モナドハンズオン前座
モナドハンズオン前座
 
C++によるソート入門
C++によるソート入門C++によるソート入門
C++によるソート入門
 
C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competition
 
Impractical Introduction of Boost Spirit Qi [PPT]
Impractical Introduction of Boost Spirit Qi [PPT]Impractical Introduction of Boost Spirit Qi [PPT]
Impractical Introduction of Boost Spirit Qi [PPT]
 
20141128 iOSチーム勉強会 My Sweet Swift
20141128 iOSチーム勉強会 My Sweet Swift20141128 iOSチーム勉強会 My Sweet Swift
20141128 iOSチーム勉強会 My Sweet Swift
 
Common LispでGPGPU
Common LispでGPGPUCommon LispでGPGPU
Common LispでGPGPU
 
ZFSのソースコードをチラ見してみる
ZFSのソースコードをチラ見してみるZFSのソースコードをチラ見してみる
ZFSのソースコードをチラ見してみる
 
One - Common Lispでもワンライナーしたい
One - Common LispでもワンライナーしたいOne - Common Lispでもワンライナーしたい
One - Common Lispでもワンライナーしたい
 
Continuation with Boost.Context
Continuation with Boost.ContextContinuation with Boost.Context
Continuation with Boost.Context
 
PHP AST 徹底解説
PHP AST 徹底解説PHP AST 徹底解説
PHP AST 徹底解説
 
F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~
 
Swiftおさらい
SwiftおさらいSwiftおさらい
Swiftおさらい
 
Ekmett勉強会発表資料
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料
 
SystemC Tutorial
SystemC TutorialSystemC Tutorial
SystemC Tutorial
 

Kürzlich hochgeladen

研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
atsushi061452
 

Kürzlich hochgeladen (14)

LoRaWAN無位置ロープ型水漏れセンサー WL03A-LB/LSカタログ ファイル
LoRaWAN無位置ロープ型水漏れセンサー WL03A-LB/LSカタログ ファイルLoRaWAN無位置ロープ型水漏れセンサー WL03A-LB/LSカタログ ファイル
LoRaWAN無位置ロープ型水漏れセンサー WL03A-LB/LSカタログ ファイル
 
Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介
Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介
Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介
 
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
 
Keywordmap overview material/CINC.co.ltd
Keywordmap overview material/CINC.co.ltdKeywordmap overview material/CINC.co.ltd
Keywordmap overview material/CINC.co.ltd
 
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
 
2024年5月17日 先駆的科学計算フォーラム2024 機械学習を用いた新たなゲーム体験の創出の応用
2024年5月17日 先駆的科学計算フォーラム2024 機械学習を用いた新たなゲーム体験の創出の応用2024年5月17日 先駆的科学計算フォーラム2024 機械学習を用いた新たなゲーム体験の創出の応用
2024年5月17日 先駆的科学計算フォーラム2024 機械学習を用いた新たなゲーム体験の創出の応用
 
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
 
MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。
 
情報を表現するときのポイント
情報を表現するときのポイント情報を表現するときのポイント
情報を表現するときのポイント
 
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
 
LoRaWAN無位置ロープ式水漏れセンサーWL03A 日本語マニュアル
LoRaWAN無位置ロープ式水漏れセンサーWL03A 日本語マニュアルLoRaWAN無位置ロープ式水漏れセンサーWL03A 日本語マニュアル
LoRaWAN無位置ロープ式水漏れセンサーWL03A 日本語マニュアル
 
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
 
ネットワーク可視化 振る舞い検知(NDR)ご紹介_キンドリル202405.pdf
ネットワーク可視化 振る舞い検知(NDR)ご紹介_キンドリル202405.pdfネットワーク可視化 振る舞い検知(NDR)ご紹介_キンドリル202405.pdf
ネットワーク可視化 振る舞い検知(NDR)ご紹介_キンドリル202405.pdf
 
Intranet Development v1.0 (TSG LIVE! 12 LT )
Intranet Development v1.0 (TSG LIVE! 12 LT )Intranet Development v1.0 (TSG LIVE! 12 LT )
Intranet Development v1.0 (TSG LIVE! 12 LT )
 

Boost jp9 program_options