「システムは、
できるだけシンプルに
一連の変更後”Bjarne Stroustrup-プログラマ、C ++の作成者前文
この記事では、Habrでほとんど取り上げられていない、かなり人気のある
Portable Componentsライブラリー(POCOと略記)についてお話したいと思います。 ソフトウェア製品のビジネスロジックの開発者にとっても、ほとんどの適用された問題の解決においても役立ちます。 C ++のクロスプラットフォームライブラリが豊富にあるため、POCOに直面する人が増え、どこから始めればいいのかわからなくなります。 この記事では、ライブラリに固有のテクノロジーを説明し、いくつかの問題を解決する簡単な例を示します。 また、このライブラリには、オープンソースプロジェクトと商用プロジェクトの両方で多くの成功が収められています。
説明
POCOは、ソフトウェア製品の開発、デバッグ、およびテストのプロセスを簡素化するクラスのコレクションです。 このライブラリは、接続性が低いモジュラーシステムの原理に基づいています。 彼女の同僚であるBoostと同様に、POCOはモジュールに分割され、各モジュールはシステムでその役割を果たしますが、Boostのような一般化されたプログラミングパラダイムほど
ハードコアとして
テンプレートマジックを使用しません。 もう1つの重要なプラスは、最終ディストリビューションのサイズです。POCO(Poco Foundation)カーネルのサイズは約1.5メガバイトのメモリ(バージョン1.4.3.0、MSVC v100)を必要とし、残りのモジュールは50〜800 KBです。 。
Applied Informatics Software Engineering GmbH -POCOの開発者は、2または4 MBのフラッシュと8 MBのRAMしか搭載されていないRJ-45コネクタフォームファクターで作られた
Digi Connect ME 9210などの小型デバイスのサポートさえ宣言しています。
POCOは主にネットワーク開発に焦点を当てており、
Windows、Unix、Linux、eLinux、Mac OS X、Solaris、QNX Neutrino、Vxworks、Openvms、Tru64、HP-UX、Androidなどの一般的なオペレーティングシステムに移植されています。 プラットフォーム依存モジュールはすべてロジックから分離されているため、このリストは非常に急速に拡大しています。 実際、POCOは、C ++言語用の最新のコンパイラーがあるオペレーティングシステムに移植できます。
ライブラリは、サーバーまたはクライアント用のソフトウェアであるかどうかにかかわらず、開発の基礎として適用できますが、アプリケーションは使用可能なアーキテクチャのいずれかで実行されることが保証されます(特別な魔法がない場合もあります)。 さらに、POCOにはTCP Server Framework、Reactor Frameworkなどの強力なツールがあり、高性能のWEBサーバーを非常に簡単に作成できるため、開発時間を節約できます。 また、ライブラリには、コンソールアプリケーション、Unixデーモン、Windowsサービスを作成するためのスナップインがあります。 Qt、wxWidget、GTK +などのライブラリとの並行作業が可能です。
ライブラリの一部の概念は、
Javaクラスライブラリ、MS .NET Framework、およびApple Cocoaから借用してい
ます 。 これらは主に、フロー制御やタイマーなどの高レベルのものです。
Pocoは、標準C ++およびSTLライブラリを使用して、
ANSI / ISO C ++ 2003言語標準に厳密に準拠して作成されています。
Boost Software Licenseの下で利用でき、商用および非商用の両方の使用が可能です。
POCOの学習方法
ほとんどの例は、ソースコード、SDKリファレンス、およびプレゼンテーションにあります。
基本モジュールと使用例
ライブラリコア
- 動的データ型指定ツールAnyおよびDynamicAny
DynamicAny any("99"); int i = any;
- 時刻と日付の操作
const char *date = "05.06.1977";
- イベントおよびアラートツール
#include "Poco/BasicEvent.h" #include "Poco/Delegate.h" #include <iostream> using BasicEvent; using Delegate; class Source { public: BasicEvent<int> theEvent; void fireEvent(int n) { theEvent(this, n); } }; class Target { public: void onEvent(const void* pSender, int& arg) { cout << "onEvent: " << arg << endl; } }; int main(int argc, char** argv) { Source source; Target target; // Event' source.theEvent += Delegate<Target, int>( &target, &Target::onEvent); // source.fireEvent(42); // source.theEvent -= Delegate<Target, int>( &target, &Target::onEvent); return 0; }
- 正規表現処理
RegularExpression regular("([0-9]+) ([0-9]+)"); vector<string> arr; regular.split("123 456", 0, arr);
- ダイナミックリンクライブラリを操作するためのツール。
SharedLibrary lib("C:\\Windows\\System32\\shell32.dll"); if (lib.isLoaded() && lib.hasSymbol("Control_RunDLL")) { auto fun = static_cast<void (*)()>(lib.getSymbol("Control_RunDLL")); fun();
- メモリ管理ツール
- シングルトン
class Singleton { public: int add(int i, int p) { return i+p; } static Singleton& instance() { static SingletonHolder<Singleton> single; return *single.get(); } }; … int res = Singleton::instance().add(1,2);
- 文字列フォーマッター
- システム情報と環境変数の使用
cout << " : " << Environment::osName() << "\n : " << Environment::osVersion() << "\n: " << Environment::osArchitecture() << "\n. : " << Environment::nodeName() << "\nMAC-: " << Environment::nodeId(); if (Environment::has("HOME")) cout << "\n .: " << Environment::get("HOME") << endl; Environment::set("POCO", "foo");
データ圧縮
- ストリーミングデータ圧縮を実装するためのツール
- ZIPファイルを作成するためのツール
ofstream zipper("text.gz", ios::binary); ofstream text("text.txt", ios::binary); text << "Hello my little computer world. I can zip this string. It's wonderful."; text.close(); Zip::Compress zipc(zipper,true); zipc.addFile (Path("text.txt"), "text.txt"); zipc.close(); ifstream dezipper("text.gz", ios::binary); poco_assert (dezipper); Zip::Decompress zipd(dezipper,Path().append("\\text.dz")); zipd.decompressAllFiles();
暗号化
- 擬似乱数ジェネレータ
Random rnd; rnd.seed(); cout << ": " << rnd.next() << "\n: " << rnd.next(10) << "\n: " << rnd.nextChar() << "\n: " << rnd.nextBool() << "\n . : " << rnd.nextDouble(); RandomInputStream ri; string rs; ri >> rs;
- ハッシュを作成するメカニズム
string message(" "); string passphrase("anl!sfsd9!_3g2g?f73");
- X509証明書のサポート
- データ暗号化メカニズム
- ストリーム暗号
- OpenSSLサポート
データベース
- さまざまなデータベース(SQLite、MySQL、ODBCなど)との相互作用
Data::SQLite::Connector::registerConnector(); Data::Session ses("SQLite", "mydb.db"); int count = 0; ses << "SELECT COUNT(*) FROM PERSON", into(count), now; cout << "People in DB " << count; string firstName(""; string lastName(""); int age = 0; ses << "INSERT INTO PERSON VALUES (:fn, :ln, :age)", use(firstName), use(lastName), use(age), now; ses << "SELECT (firstname, lastname, age) FROM Person", into(firstName), into(lastName), into(age, -1), now; Data::SQLite::Connector::unregisterConnector();
- セッションプール
- レコードセット
Statement select(session); select << "SELECT * FROM Person"; select.execute(); RecordSet rs(select);
- タプル
struct Person { string fullname, city; size_t age; }; … typedef Tuple<string, string, int> Person; vector<Person> people; people.push_back(Person("Bart Simpson", "Springfield", 12)); people.push_back(Person("Lisa Simpson", "Springfield", 10)); Statement insert(session); insert << "INSERT INTO Person VALUES(:name, :address, :age)", use(people), now;
ファイルシステム
- ファイルとディレクトリのプラットフォームに依存しない作業
Path p_wind("C:\\Windows\\system32\\cmd.exe"); Path p_unix("/bin/sh"); p_wind = "projects\\poco"; p_unix = "projects/poco"; p_unix.parse("/usr/include/stdio.h", Path::PATH_UNIX); bool ok = p_unix.tryParse("/usr/*/stdio.h"); ok = p_unix.tryParse("/usr/include/stdio.h", Path::PATH_UNIX); ok = p_unix.tryParse("/usr/include/stdio.h", Path::PATH_WINDOWS); ok = p_unix.tryParse("DSK$PROJ:[POCO]BUILD.COM", Path::PATH_GUESS);
ログを操作する
- 強力なログ管理ツール
- ログのフォーマット
- ログ転送チャネル
マルチスレッド
ネットワーク技術
- ソケット
Net::SocketAddress sa("www.habrahabr.ru", 80); Net::StreamSocket socket(sa); Net::SocketStream str(socket); str << "GET / HTTP/1.1\r\n" "Host: habrahabr.ru\r\n" "\r\n"; str.flush(); StreamCopier::copyStream(str, cout);
- マルチスレッドサーバー
- DNS
const HostEntry& entry = DNS::hostByName("www.habrahabr.ru"); cout << " : " << entry.name() << endl; const HostEntry::AliasList& aliases = entry.aliases(); for (HostEntry::AliasList::const_iterator it1 = aliases.begin(); it1 != aliases.end(); ++it1) cout << ": " << *it1 << endl; const HostEntry::AddressList& addrs = entry.addresses(); for (HostEntry::AddressList::const_iterator it2 = addrs.begin(); it2 != addrs.end(); ++it2) cout << "IP: " << it2->toString() << endl;
- 一部のアプリケーション層プロトコル(FTP、SMTPなど)のクライアント
- HTTP(S)サーバー、HTTP認証
- C ++コードのコンパイラ-HTML挿入、HTMLフォーム処理、MIME
- URIサポート、UUID
- RFC 6455サポート
- SSL / TLSサポート
プロセス
- プロセスの操作(開始、停止)
cout << " PID: " << Process::id() << endl; vector<string> args; args.push_back("shell32"); args.push_back("ShellAboutA"); Process::launch("rundll32", args);
- プロセス同期
- 共有メモリメカニズム
File file("Shared.dat"); SharedMemory mem(file, SharedMemory::AM_READ); cout << &*mem.begin() << endl;
ストリーミング操作
- BASE-64、HexBinaryのストリームコーディング/デコーディング
Base64Encoder encoder(cout); encoder << " Base64 stdout";
- メモリ入出力ストリーム
- URIストリームのサポート
Net::HTTPStreamFactory::registerFactory(); auto_ptr<istream> input( URIStreamOpener::defaultOpener().open("http://habrahabr.ru") ); cout << input->rdbuf();
テキストエンコーディング
- UTF-8およびUnicodeとの間のエンコードをサポート
string utf8(" UTF-8 ."); UTF8Encoding decoder; TextIterator end(utf8); for (TextIterator iter(utf8, decoder); iter != end; ++iter) int unicode = *iter;
- エンコード変換をサポート
string latin(" Latin1 ."); Latin1Encoding decoder; UTF8Encoding encoder; OutputStreamConverter converter(cout, decoder, encoder); converter << latin << endl;
実用性
- コンソールおよびサーバーアプリケーションを作成するためのフレームワーク。
- コマンドライン引数のサポート
構成
XML
- DOM、SAX2をサポート
- 読み取りモードと書き込みモードの両方をサポート
おわりに
結論として、これらのモジュールには特別な注意が必要であり、別の記事が必要なため、いくつかのモジュールの説明は省略されています。 この図書館には明るい未来があると心から信じています。 また、POCOの新しい
C ++ 11標準の利点もいくつか見たいと思います。
次の記事では、POCOの特定の事項について説明します。 客観的なコメントや異議を申し上げます。
読んでくれてありがとう。