パターン「スナップショット」

この投稿では、パターン「スナップショット」について説明します。または「メメント」

このパターンは「行動」を指します。デザインパターン。

グラフィック エディタを開発していて、ユーザー コマンドに基づいてアクションをロールバックする機能を追加する必要があるとします。このパターンを実装する場合、システム コンポーネントがロールバックされた「アクション」の内部状態にアクセスできないことも非常に重要です。他のシステム コンポーネントはスナップショット オブジェクトにのみアクセスでき、変更することはできません。内部状態を示し、明確でシンプルな外部インターフェイスを提供します。この問題を解決するには、「スナップショット」パターンが使用されます。または「キーパー」。

作品例「スナップショット」以下に示します:


クリックするとスプライトが表示され、カールした矢印をクリックするとアクションがキャンセルされます。スプライトが消えます。この例は 3 つのクラスで構成されています。

<オル>

  • スプライトとグラフィカル インターフェイスが表示されるキャンバス。
  • 画面コントローラー。クリックを処理し、画面のロジックを制御します。
  • 変更のたびに保持されるキャンバスの状態は、必要に応じて、画面コントローラを使用してロールバックされます。
  • パターン「スナップショット」のコンテキストでは、クラスは次のとおりです:

    <オル>

  • キャンバス–ソースでは、このクラスの状態は、後で要求に応じてロールバックできるように「スナップショット」として保存されます。また、ソースは「スナップショット」を転送するときに状態を復元できる必要があります。
  • コントローラー–管理者であるこのクラスは、状態を保存/ロールバックする方法とタイミングを知っています。
  • 状態–スナップショット。ソースの状態に加えて、ロールバック順序を正確に確立できる日付情報またはインデックスを保存するクラスです。
  • このパターンの重要な特徴は、ソースのみがスナップショット内の保存された状態の内部フィールドにアクセスできる必要があることです。これは、スナップショットを外部からの変更 (カプセル化をバイパスして何かを変更したい便利な開発者による) から保護するために必要です。システムロジックを破壊します)。カプセル化を実装するには、組み込みクラスが使用され、C++ ではフレンド クラスを指定する機能が使用されます。個人的には、Rise ではカプセル化を行わないシンプルなバージョンを実装し、Swift で実装する場合は Generic を使用しました。私のバージョンでは – Memento は、同じクラス状態のエンティティにのみ内部状態を与えます。

    ソース

    https://refactoring.guru/design-patterns/memento

    ソースコード

    https://gitlab.com/demensdeum/patterns/< /p>

    訪問者のパターン

    この投稿では、「訪問者」と呼ばれるデザイン パターンについて説明します。または「訪問者」
    このパターンは行動パターンのグループに属します。

    問題を考えてみましょう

    このパターンは主に、早期バインド言語における単一ディスパッチの制限を回避するために使用されます。

    アリス X by NFGPhoto (CC-2.0)
    抽象クラス/プロトコル Band を作成し、MurpleDeep のサブクラスを作成し、2 つのメソッドを持つ Visitor クラスを作成しましょう。 1 つは Band の子孫をコンソールに出力するためのもので、2 つ目は MurpleDeep を出力するためのものです。主なことは、メソッドの名前 (シグネチャ) が同じで、引数がクラスによってのみ異なることです。 Band 引数を指定した中間出力メソッドを使用して Visitor のインスタンスを作成し、MurpleDeep の visit メソッドを呼び出します。
    以下は Kotlin のコードです。

    出力は “これはバンド クラスです

    どうしてそんなことが可能なのでしょうか?!

    なぜこれが起こるのかは、ロシア語を含む多くの記事で賢明な言葉で説明されていますが、コンパイラーがコードをどのように認識するかを想像してみることをお勧めします。おそらくすべてがすぐに明らかになるでしょう。

    問題の解決

    この問題を解決するには多くの解決策があります。次に、訪問者パターンを使用した解決策を検討します。
    Visitor 引数を持つ accept メソッドを抽象クラス/プロトコルに追加し、メソッド内でvisitor.visit(this) を呼び出し、次に accept メソッドのオーバーライド/実装を MurpleDeep クラスに追加します。これにより、決定的かつ冷静に DRY に違反し、再度次のように記述します。 Visitor.visit(this).< br />最終コード:

    ソース

    https://refactoring.guru/ru/デザインパターン/訪問者-ダブルディスパッチ

    ソースコード

    https://gitlab.com/demensdeum/patterns

    フライウェイトパターン

    この投稿では、構造パターン「軽量」について説明します。または「日和見主義者」 (フライ級)
    このパターンは構造パターンのグループに属します。

    以下でパターンがどのように機能するかの例を見てみましょう。


    なぜ必要なのでしょうか? RAM を節約するため。 Java (CPU とメモリを無駄に消費する) が広く使用されている現在では、これはそれほど重要ではなくなりましたが、使用する価値はあるという意見には私も同意します。
    上記の例では40個のオブジェクトしか出力していませんが、120,000個に増やすとその分メモリ消費量も増加します
    。Chromium ブラウザでフライウェイト パターンを使用しないメモリ消費量を見てみましょう。

    パターンを使用しない場合、メモリ消費量は最大 300 メガバイトになります。

    次に、パターンをアプリケーションに追加して、メモリ消費量を確認してみましょう。

    このパターンを使用すると、メモリ消費量は約 200 メガバイトになるため、テスト アプリケーションでは 100 メガバイトのメモリを節約できます。この差はさらに大きくなる可能性があります。

    それはどのように機能しますか?

    上の例では、40 匹の猫を描画します。わかりやすくするために、120,000 匹の猫を描画します。各猫は PNG イメージとしてメモリにロードされ、ほとんどのレンダリングではレンダリング用のビットマップ (実際には bmp) に変換されます。圧縮された PNG はレンダリングに非常に時間がかかるため、これは速度を上げるために行われます。パターンを使用しない場合、12万枚の猫の写真をRAMにロードして描画しますが、パターンを使用すると「軽量」になります。 1 匹の猫をメモリにロードし、さまざまな位置と透明度で 12 万回描画します。重要なのは、猫の画像とは別に座標と透明度を実装することです。レンダリングでは 1 匹の猫だけを受け取り、正しいレンダリングのために座標と透明度を持つオブジェクトを使用します。

    コードではどのようになりますか?

    以下は、言語 Rise< /p>

    パターンを使用しない場合:


    猫の画像はループ内のオブジェクトごとに個別にロードされます。猫の画像。

    使用パターン:

    猫の 1 枚の写真が 12 万個のオブジェクトで使用されています。

    どこで使用されますか?

    Apple の「再利用」などの GUI フレームワークで使用されます。 (再利用) UITableViewCell テーブル セル。これにより、このパターンを知らない初心者にとっては参入障壁が高くなります。ゲーム開発でもよく使用されます。

    ソースコード

    https://gitlab.com/demensdeum/patterns/< /p>

    ソース

    https://refactoring.guru/ru/design-patterns/フライ級
    http://gameprogrammingpatterns.com/flyweight.html

    良い人、悪い人、そして醜いシングルトン

    このメモでは、さまざまな (成功したプロジェクトとそれほど成功していない) プロジェクトに取り組みながら、シングルトン パターン (外国文学におけるシングルトン) を使用したときの私の経験と同僚の経験について説明します。このパターンがどこにも使用できないと私が個人的に考える理由を説明し、チーム内のどのような心理的要因がこのアンチパターンの統合に影響を与えるかについても説明します。チームメンバーの一人が扱いやすく、特別な世話や世話の知識を必要としない小さなかわいい子犬を連れてきたことからすべてが始まり、飼育された野獣で終わった理由を理解しようとしていた倒れた、不自由な開発者全員に捧げます。あなたのプロジェクトを人質に取り、ますます多くの工数を必要とし、ユーザーの神経とお金を食いつぶし、一見単純な実装を評価するためにまったく途方もない数字を生み出すことになります。


    Wolf in sheep’s clothing by SarahRichterArt

    物語は別の宇宙で起こり、すべての偶然はランダムです…

    Cat@Home を使用して自宅で猫を撫でましょう

    誰でも、人生の中で猫を撫でたいという抑えがたい欲求を抱くことがあります。世界中のアナリストは、猫の配達とレンタルのアプリケーションを作成した最初のスタートアップが非常に人気となり、 近い将来モーグリに数兆ドルで買収されるだろうと予測しています。すぐにこれが起こります–チュメニ出身の男がCat@Home アプリケーションを作成し、すぐに億万長者になり、モーグリ 会社は新たな利益源を獲得し、何百万ものストレスを抱えた人々が次の機会を得ることができました。猫に家に来てもらい、さらにアイロンをかけ、落ち着かせてもらいます。

    クローンの攻撃

    ムルマンスク出身の非常に裕福な歯科医、アレクセイ ゴロボロドコは、フォーブス誌の Cat@Home に関する記事に感銘を受け、自分も天文学的なお金持ちになりたいと決意しました。この目標を達成するために、彼は友人を通じて Goldfield – の会社を見つけました。ソフトウェア開発サービスを提供する Wakeboard DevPops は、Cat@Home クローンの開発を同社に発注します。

    優勝チーム

    このプロジェクトは Fur&Pure と呼ばれ、20 人の有能な開発チームに委託されています。次に、5 人からなるモバイル開発チームに注目してみましょう。各チームメンバーはアジャイルとスクラムを武器に自分の仕事に従事し、チームは予定通り (6 か月以内) バグもなく開発を完了し、iStore でアプリケーションをリリースし、100,000 人のユーザーから 5 と評価されます。アプリケーションの素晴らしさ、サービスの素晴らしさ (結局のところ、代替世界) に関するコメント。猫にはアイロンがけが施され、アプリはリリースされ、すべてが順調に進んでいるように見えます。ただし、Cat@Home には猫だけでなく犬もすでに登場しているため、モーグリはスタートアップを数兆ドルで買収することを急いでいません。

    犬が吠え、キャラバンは進む

    アプリケーションの所有者は、アプリケーションに犬を追加する時期が来たと判断し、会社に評価を依頼し、 アプリケーションに犬を追加するために少なくとも 6 か月の猶予を受け取ります。実際には、アプリケーションは再び最初から作成されます。この期間中、Moogle はヘビ、クモ、モルモットをアプリケーションに追加し、Fur&Pur は犬のみを受け取ります。
    なぜこのようなことが起こったのでしょうか?柔軟なアプリケーション アーキテクチャの欠如がすべての原因です。最も一般的な要因の 1 つはシングルトンのアンチパターンです。

    何が問題ですか?

    自宅で猫を注文するには、消費者はリクエストを作成してオフィスに送信する必要があります。オフィスはそれを処理し、猫を連れた宅配便を送ります。宅配便はすでにサービスの代金を受け取っています。
    プログラマーの 1 人がクラス「Cat Application」を作成することにしました。必要なフィールドを指定すると、 このクラスがシングルトンを通じてグローバル アプリケーション空間に組み込まれます。なぜ彼はこんなことをしているのでしょうか?時間を節約するため (30 分の 1 ペニーの節約)。アプリケーションのアーキテクチャを熟考して依存関係の注入を使用するよりも、アプリケーションを公開する方が簡単だからです。次に、他の開発者がこのグローバル オブジェクトを選択し、クラスをそれにバインドします。 たとえば、すべての画面自体がグローバル オブジェクト「Cat Request」にアクセスします。アプリケーション上のデータを表示します。その結果、このようなモノリシックなアプリケーションがテストされ、リリースされる
    ことになります。すべてがうまくいっているように見えますが、突然、アプリケーションに犬のリクエストを追加するという要件を要求する顧客が表示されます。チームは、システム内のいくつのコンポーネントがこの変更によって影響を受けるかを必死で評価し始めます。分析の最後に、アプリケーションに「猫のリクエスト」だけでなくリクエストも受け入れるように教えるには、コードの 60 ~ 90% をやり直す必要があることが判明しました。しかし、「犬の申請」も同様です。少なくとも 2 頭の動物に対処するには、この段階で他の動物の追加を評価することはすでに無意味です。

    シングルトンを防ぐ方法

    まず、要件収集の段階で、柔軟で拡張可能なアーキテクチャを作成する必要性を明示します。第二に、弱点の調査を義務付けて、製品コードの独立したレビューを並行して実施する価値があります。あなたが開発者で、シングルトンが大好きな場合は、手遅れになる前に正気に戻ることをお勧めします。そうしないと、眠れない夜と神経のすり減りが確実です。多数のシングルトンを含むレガシー プロジェクトに取り組んでいる場合は、できるだけ早くシングルトンまたはプロジェクトを削除するようにしてください。
    シングルトン – グローバル オブジェクト/ 変数のアンチパターンから依存関係の注入に切り替える必要があります。必要なすべてのデータが初期化段階でクラスのインスタンスに与えられる最も単純な設計パターンであり、グローバル空間にさらにバインドする必要はありません。

    ソース

    https://stackoverflow. com/questions/137975/what-is-so-bad-about-singletons
    http://misko.hevery.com/2008/08/17/singletons-are-pathological-liars/
    https://blog.ndepend.com/singleton-pattern-costs/

    デスマスク開発レポート1

    新しい非常設セクション「開発者日記」または外国風の開発日記
    など。ゲーム デスマスク の開発は本格化しています。エンジンのロゴ2019 年の Flame Steel Engine ゲーム用に追加されました。島ごとに初期マップを選択する画面 (緑、赤、黒、白)、迷宮の壁、天井、床のテクスチャの出力、プレイエリアのサイズの拡大です。 p>


    レッド ゾーンの都市の地図

    次に、Doom スタイルのスプライトの代わりに環境用の 3D モデルを追加する予定です。また、武器、ボックス、敵、友人のモデルも追加する予定です。ゲームプレイでは、通貨、ショップ、戦利品のある興味深い場所を示すゲームマップの一部を購入する機能、および「デスマスク」の可能な場所を追加することが計画されています。電脳迷宮を旅する仲間を雇える機能も追加したいと思っています。
    ニュースをフォローしてください。

    スイフト 4.2.3 – Ubuntu 18.10

    Ubuntu 18.10 で実行するために必要なライブラリを使用して Swift を構築します。 Apple Web サイトで入手可能な最新バージョン – Ubuntu 18.04の場合。公式 Web サイトのアセンブリに基づいており、Ubuntu 18.04 のライブラリが追加されています。また、bash ターミナルの PATH と LD_LIBRARY_PATH を追加するサンプル スクリプトも追加しました:
    http://www.mediafire.com/file/lrs74mvoj3fti03/swift4.2.3.ubuntu.18.10.x86_64.tar.gz/file

    宣言型言語Zakaz

    私は純粋な宣言型プログラミング言語を皆さんに紹介します –ザカズ。新しい言語の主なアイデア –アプリケーションには、自由形式で記述された実行コマンドが含まれており、「実行者」によって実行される必要があります。 「出演者」がいない場合は、コマンドを実行できない場合、プログラムの実行は停止します。アプリケーションは技術仕様 (tez) と呼ばれ、.tez 拡張子が必要です。 Zakaz 構文には 2 つのルールが必要です。

    • 各コマンドは新しい行で始まります
    • 各コマンドは人間が理解できる形式的な言語で記述する必要があります

    Hello World.tez の例:

    画面上に 「Hello World」 テキストを表示します「Zakaz 'tez' example」 テキストを画面に表示します

    動作原理の説明を表示し、Firefox ブラウザでサイト http://demensdeum.com を開く仕様の例

    画面に「ウェブサイトのデモを表示」 テキストを表示しますShow 「この 'tez' を実行するには、システムに Firefox がインストールされている必要があります。\"システム\" C 関数" テキストを表示「\"FirefoxPerformer\" が Zakaz ランタイムに割り当てられています。マニュアルを確認してください詳細については、画面上のテキストFirefox でアドレス "http://demensdeum.com" の Web サイトを表示します

    上記の例は “executor” と一緒に実行する必要があります。 FirefoxPerformer は、最新のコマンドを処理して Firefox を通じてサイトをレンダリングできます

    ./ZakazRuntime openDemensdeumSite.tez FirefoxPerformer

    エグゼキュータを実装するには、抽象クラス ZakazRuntime::Performer を使用してエグゼキュータを動的ライブラリとして実装し、createPerformer() グローバル関数メソッドからスマート ポインタとともに返す必要があります。 FirefoxPerformer 実装を例として使用できます。

    ソース コード

    https://gitlab.com/demensdeum/zakiz

    С++ Application Plugins

    In this post I will describe an example of adding functionality to a C ++ application using plugins. The practical part of the implementation for Linux is described; the theory can be found at the links at the end of the article.

    Composition over inheritance!

    To begin with, we will write a plugin – a function that we will call:

    #include "iostream"
    
    using namespace std;
    
    extern "C" void extensionEntryPoint() {
    	cout << "Extension entry point called" << endl;
    };
    

    Next, we will build the plugin as a dynamic library “extension.so”, which we will connect in the future:
    clang++ -shared -fPIC extension.cpp -o extension.so

    Next we write the main application that will load the file “extension.so”, look for a pointer to the function “extensionEntryPoint” there, and call it, typing errors if necessary:

    #include "iostream"
    #include "dlfcn.h"
    
    using namespace std;
    
    typedef void (*VoidFunctionPointer)();	
    
    int main (int argc, char *argv[]) {
    
    	cout << "C++ Plugins Example" << endl;
    
    	auto extensionHandle = dlopen("./extension.so", RTLD_LAZY);
    	if (!extensionHandle) {
    		string errorString = dlerror();
    		throw runtime_error(errorString);
    	}
    
    	auto functionPointer = VoidFunctionPointer();
    	functionPointer = (VoidFunctionPointer) dlsym(extensionHandle, "extensionEntryPoint");
    	auto dlsymError = dlerror();
     	if (dlsymError) {
    		string errorString = dlerror();
    		throw runtime_error(errorString);
     	}
    
    	functionPointer();
    
    	exit(0);
    } 
    

    The dlopen function returns a handler for working with a dynamic library; dlsym function returns a pointer to the required function by string; dlerror contains a pointer to the string with the error text, if any.

    Next, build the main application, copy the file of the dynamic library in the folder with it and run. The output should be the “Extension entry point called”

    Difficult moments include the lack of a single standard for working with dynamic libraries, because of this there is a need to export the function to a relatively global scope with extern C; the difference in working with different operating systems associated with this subtlety of work; the lack of a C ++ interface to implement OOP approach to working with dynamic libraries, however, there are open-source wrappers, for example m-renaud/libdlibxx

    Example Source Code

    https://gitlab.com/demensdeum/cpppluginsexample

    Documents

    http://man7.org/linux/man-pages/man3/dlopen.3.htm
    https://gist.github.com/tailriver/30bf0c943325330b7b6a
    https://stackoverflow.com/questions/840501/how-do-function-pointers-in-c-work

    ミシェルのようにときめいて

    [人工知能の力を感じてください]
    この投稿では未来を予測する方法について説明します。

    統計学には、ある種の問題があります –時系列分析。特定の変数の日付と値があれば、将来のこの変数の値を予測できます。
    最初は、TensorFlow ですが、ライブラリ 預言者 by Facebook.
    Prophet では、日付 (ds) 列と変数値 (y) 列を含むデータ (csv) に基づいて予測を行うことができます。この操作方法については、公式 Web サイトのドキュメントのセクション クイック スタート
    データセットとして、https://www.investing.com、実装時に R 言語 および Prophet API 彼にとって。私は R がとても気に入りました。R の構文は大量のデータの操作を簡素化し、よりシンプルに記述でき、ラムダ式を使用する必要がある従来の言語 (Python) を使用する場合よりも間違いが少ないからです。 R にはすべてのラムダ式がすでにあります。
    処理用のデータを準備しないようにするために、パッケージ いつでも、前処理なしで文字列を日付に変換できます。通貨文字列を数値に変換するには、readr パッケージを使用します。 .

    その結果、ビットコインの価格は 2019 年末までに 8,400 ドルになり、ドルの為替レートは 61 ルーブルになるという予測を受け取りました。これらの予測を信じるべきでしょうか?個人的にはそこまでの価値は無いと思うので… 本質を理解せずに数学的手法を使用することはできません。

    出典

    https:// facebook.github.io/prophet
    https://habr.com/company/ods/blog/323730/
    https://www.r-project.org/

    ソース コード

    https://gitlab.com/demensdeum/MachineLearning/tree/master/4prophet

    テスラが語る

    この投稿では、見積もりジェネレーター を作成するプロセスについて説明します。

    TL;DR

    トレーニングとテキスト生成用 –ライブラリを使用します textgenrnnhunspell とその C/python ライブラリ。共同作業では、テキストの生成を開始できます。テキストの約 90% は完全に判読できませんが、残りの 10% には少し意味が含まれており、手動で修正するとかなり見栄えの良いフレーズになります。
    最も簡単な方法は、Colaboratory で既製のニューラル ネットワークを起動することです。
    https://colab.research.google.com/drive/1-wbZMmxvsm3SoclJv11villo9VbUesbc(新しいタブで開きます)”>https://colab.research.google.com/drive/1-wbZMmxvsm3SoclJv11villo9VbUesbc

    ソース コード

    https://gitlab.com/demensdeum/MachineLearning/tree/master/3quotesGenerator

    出典

    https://karpathy.github.io/2015/05/21/rnn-effectiveness/https://medium.com/deep-learning-turkey/google-colab-free-gpu-tutorial-e113627b9f5dhttps://minimaxir.com/2018/05/text-neural-networks/
    https://github.com/wooorm/dictionaries (opens in a new tab)” href=”https://minimaxir.com/2018/05/text-neural-networks/” target=”_blank”>https://minimaxir.com/2018/05/text-neural-networks/
    https://karpathy.github.io/2015/05/21/rnn-effectiveness/
    https://medium.com/deep-learning-turkey/google-colab-free-gpu-tutorial-e113627b9f5d
    https://karpathy.github.io/2015/05/21/rnn-effectiveness/ (opens in a new tab)” href=”https://karpathy.github.io/2015/05/21/rnn-effectiveness/” target=”_blank”>https://karpathy.github.io/2015/05/21/rnn-effectiveness/
    https://medium.com/deep-learning-turkey/google-colab-free-gpu-tutorial-e113627b9f5d
    https://karpathy.github.io/2015/05/21/rnn-effectiveness/https://medium.com/deep-learning-turkey/google-colab-free-gpu-tutorial-e113627b9f5dhttps://github.com/wooorm/dictionaries

    ” rel=”noopener” target=”_blank”>https://github.com/wooorm/dictionaries (opens in a new tab)”>https://github.com/wooorm/dictionaries

    そこには何個のエラーがありますか?

    Hacker News で、著者がピーターセン-リンカーン法は、生物学者が鳥、猿、その他の動物の個体数を数えるために使用し、アプリケーションで * ドラム ロール* 虫を数える ために使用されます。

    自然生息地のバグ– ビッグフットの目撃情報 (デレク・ハットフィールド

    方法は非常に簡単です。鳥類学者は、特定の種の鳥、その任務 –これらの鳥の個体数を調べます。発見された鳥は両方の鳥類学者によってマークされ、その後、一般的な鳥の数が計算され、リンカーン指数の式に代入され、おおよその個体数サイズが得られます。
    さあ、アプリケーションです –方法も非常に簡単です。2 つの QA を受けて、アプリケーションのバグを見つけます。 1 人のテスターが 10 個のバグ (E1) を発見し、2 番目のテスターが 20 個のバグ (E2) を発見したとします。ここでバグの合計数を計算します。 3 (S)、式を使用してリンカーン指数を取得します。

    これはアプリケーション全体のバグ数の予測です。この例では、最大 66 個のバグがあります。

    迅速な例

    メソッドをテストするためのテストベンチを実装しました。ここで確認できます。
    https://paiza.io/projects/AY_9T3oaN9a-xICAx_H4qw?language=swift

    変更できるパラメータ:

    aliceErrorFindProbability = 20 – にします。 QA アリスによって発見されたバグの割合 (20%)
    let bobErrorFindProbability = 60 – QA Bob によって発見されたバグの割合 (60%)
    実際のバグ数 = 200 – にします。アプリケーションには実際にどれくらいのバグがあるのか​​

    最後の実行では、次のデータを受け取りました。
    推定バグ数: 213
    実際のバグ数: 200

    つまり、アプリケーションには 200 個のバグがあり、リンカーン指数では – という予測が得られます。 213:
    “アリスは 36 個のバグを見つけました”
    “ボブは 89 個のバグを見つけました”
    “一般的なバグ数: 15”

    推定バグ数:213件
    実際のバグ数: 200

    弱点

    この方法は、開発のすべての段階でアプリケーションのエラー数を評価するために使用できます。理想的にはバグの数が減少するはずです。 2 人のテスターから見つかったバグの数は異なるはずであり異なるバグが見つかったため、この方法の弱点には人的要因が含まれます。 共通のものを見つける必要があります。そうでない場合、メソッドは機能しません (一般的なバグがゼロ – ゼロ除算)< br />また、一般的なバグなどの概念には、 それらの共通性

    を理解する専門家の存在が必要です。 >

    ソース

    あといくつのエラーを見つける必要がありますか? –ジョン D. クック博士、社長
    The thrill of the chase – Brian Hayes

    ソースコード

    https://paiza.io/projects/AY_9T3oaN9a-xICAx_H4qw ?言語=スウィフト
    https://gitlab.com/demensdeum/statistics/tree/master/1_BugsCountEstimation/src

    歯車研削

    ああ、ミューズ、時々あなたを捕まえるのはとても難しいです。
    Death-Mask および関連フレームワーク (Flame Steel Core、Game Toolkit など) の開発は、ゲームの芸術的な部分、音楽、サウンド、ゲームプレイを決定するために数か月間中断されます。
    計画 – Flame Steel ゲーム ツールキットのエディタを作成し、(Rise 構文に基づいて) ゲーム スクリプトのインタプリタを作成し、可能な限り多くのプラットフォーム向けに Death-Mask ゲームを実装します。
    最も困難なステージを突破しました –実際には、独自のクロスプラットフォーム ゲーム エンジン、独自の IDE、ライブラリのセットを作成できる可能性が証明されています。
    非常に思慮深く興味深いプロジェクトを作成する段階に進んでいます。楽しみにしていてください。

    iOS 用ニュース クローラー

    iOS ニュース クローラー –アプリケーションは読み込み中にテキストを検索し、結果を表示します。
    大きなファイル (200MB 以上) のサポートがすぐに含まれており、結果は result.log ファイルに保存されます。
    シンプルで考え抜かれたデザイン
    です。Regex ライブラリを使用した正規表現のサポート。

    ソースコード:
    https://gitlab.com/demensdeum/news-crawler

    パブリックドメインのデスマスク

    本日より、ゲーム Death-Mask がオープンアクセスになります –ゲームの実装の進捗状況は次のリンクで確認できます: (すごい!)
    [デスマスク ワイルド]

    現在のバージョン – 0.1 には、基本的な矢印コントロール、wsad、マップの生成、アイテム (デスマスクを含む!)、レンダリングが含まれています。
    やるべきことはまだたくさんあります。皆様からのフィードバックに非常に興味があります。そのため、ゲームのワイルド バージョンのページにコメントを書くことができます。
    最終バージョンでは、プレイヤーがアイテムを見つけた後にゲームが終了します –デスマスク
    テストを楽しんでください:)

    Авторы ресурсов

    Hangar18 ソースコードインデックス作成ユーティリティ

    ハンガー18 – Rust で書かれた C++ ソース コードのインデックス作成ユーティリティ。このユーティリティは、「定義に移動」機能を実装します。 Saber-Plus IDE で。
    ユーティリティへの入力は、ソース コード ディレクトリへの絶対パスと、検索する必要がある宣言行です。出力は grep のような出力です。

    ソースコード:
    https://gitlab.com/demensdeum/hangar18

    Git リポジトリのステータスを監視する Taytay

    Taytay – についてご紹介します。 Swift 言語の git リポジトリのステータスを監視するユーティリティ。現在、Swift はすべての主流デスクトップ オペレーティング システムにインストールできます。 Ubuntu の場合は、Swiftenv を使用することをお勧めします。 Taytay をユーティリティ git-cola ですが、ソースを編集して他のプログラムに変更することができます。

    ソースコード:
    https://gitlab.com/demensdeum/taytay

    Malevich、Black Squares OpenGLを破りました

    Malevichは、OpenGLの開発者に定期的にやって来ます。これは予期せずに大胆に起こります。プロジェクトを開始して、素晴らしいレンダリングの代わりに黒い広場を見るだけです:

    今日、私が黒い広場に訪れた理由について説明します。これは、OpenGLが画面に何も描かず、時には窓を透明にするために発見された問題について説明します。

    ツールを使用

    openglをデバッグすると、2つのツールが私を助けてくれました: renderdoc and and Apitrace 。 RenderDoc&#8211; OpenGLレンダリングプロセスをデバッグするためのツール、すべてを表示できます&#8211;頂点、シェーダー、テクスチャ、ドライバーからの借金メッセージ。 Apitrace&#8211;グラフィックAPIの課題を追跡するためのツールは、ダンプコールを行い、議論を示します。また、WDIFFを介して2つのダンプを比較する絶好の機会もあります(またはそれほど便利ではありません)

    あなたが働いている人とチェック

    古い依存関係SDL2、GLM、ASSIMP、GLEWを備えたオペレーティングシステムUbuntu 16.10があります。 Ubuntu 18.04の最新バージョンでは、ゲームのアセンブリを取得します death-mask 16.10でChrootとアセンブリを使用する場合、グラフィックスを使用してゲームの作業アセンブリを取得します。

    Ubuntu 18.04

    で何かが壊れたようです

    ldd は、Linkkaを同一ライブラリSDL2、GLに示しました。 Renderdocで非公式のビルドを運転して、頂点シェーダーの入り口でゴミが見られましたが、よりしっかりした確認が必要でした。二ナリック間の違いを理解するために、私はそれらを apitrace を通して両方を運転しました。ダンプの比較により、新鮮なUbuntaのアセンブリがOpenGLの見込み客のプログラムを破り、実際にゴミをそこに送信することがわかりました:

    マトリックスはGLMライブラリに集まります。 16.04&#8211からGLMをコピーした後;私は再びゲームのワーキングビルドを手に入れました。問題は、GLM 9.9.0の単一マトリックスの初期化の違いであり、コンストラクターのMAT4(1.0F)の引数を明確に示す必要があります。初期化とライブラリの著者である 「Noopener」> FSGL のテスト。 FSGLで欠陥を見つけた執筆の過程で、それらについてさらに説明します。

    誰が人生にいるのかを決定します

    OpenGLを使用した正しい作業では、 自発的に強制的に 特定のバージョンのコンテキストを要求する必要があります。したがって、SDL2を探します(コンテキストを初期化する前に、バージョンを厳密に配置する必要があります):

    <! - hilite.me->

    を使用して生成されたHTML

    “>

     sdl_gl_seettrtribute(sdl_gl_context_major_version、 3 );
    sdl_gl_settribute(sdl_gl_context_minor_version、 2 );
    sdl_gl_settribute(sdl_gl_context_profile_mask、sdl_gl_context_profile_core);

    たとえば、RenderDocは3.2未満のコンテキストでは動作しません。コンテキストを切り替えた後、同じ黒い画面を見る可能性が高い。なぜ?
    OpenGL 3.2のコンテキストは、VAOバッファーの存在を必要とする必要があるため、グラフィックドライバーの99%が機能しません。簡単に追加:
    <! - hilite.me->

    を使用して生成されたHTML

    ">

     glgenvertexarrays( 1  vao);
    glbindvertexaray(VAO);

    眠らないでください、凍結

    私はクブントゥで興味深い問題にも会いました。黒い正方形の代わりに透明に見えることがあり、時々すべてが正しくレンダリングされました。スタックオーバーフローでこの問題の解決策を見つけました:
    https://stackoverflow.com/questions/38411515/sdl2-opengl-window-appears-semi-transparent-sometimes

    FSGLテストレンダリングコードも存在していました睡眠(2s);そのため、XubuntuとUbuntuで正しいレンダリングを受け取り、アプリケーションを睡眠に送りましたが、Kubuntuでは、イルカの発売の80%と発射とターミナルの30%で透明なスクリーンを受け取りました。この問題を解決するために、ドキュメントで推奨されているように、Slevent調査の後、各フレームにレンダリングを追加しました。

    テストコード:
    https://gitlab.com/demensdeum/FSGLtests/blob/master/renderModelTest/

    ドライバーに話しかけます

    OpenGLは、アプリケーションとドライバーの間の通信チャネルをサポートし、それをアクティブにするには、GL_DEBUG_OUTPUT、GL_DEBUG_OUTPUT_SYNCHRONUSをオンにする必要があります。
    ここで初期化の例を撮ることができます:
    https://github.com/rock-core/gui-vizkit3d/blob/master/src/EnableGLDebugOperation.cpp

    怖がらないで成長を見守ってください

    この投稿では、shared_ptr スマート ポインターに関する私の失敗について話します。ゲーム Death-Mask に次のレベルの世代を実装した後、ある記憶に気づきました。漏れがある新しいレベルごとに、消費される RAM が + 1 メガバイト増加しました。一部のオブジェクトがメモリ内に残り、解放されなかったのは明らかです。この事実を修正するには、レベルが過負荷になったときにリソースを正しく実装する必要がありましたが、明らかに実行されていませんでした。私はスマート ポインターを使用していたので、この問題を解決するにはいくつかのオプションがありました。1 つ目はコードを手動でレビューすること (長くて退屈)、2 つ目は lldb デバッガーの機能と libstdc++ ソース コードを調べて自動追跡の可能性を調べることです。カウンタの変更。

    インターネット上では、すべてのアドバイスは要約すると、手動でコードを確認して修正し、問題のあるコード行を見つけたら鞭で自分を叩くというものでした。また、C++11 標準にスマート ポインターが登場する前に、90 年代と 2000 年代以降に開発されたすべての主要プロジェクトと同様に、メモリを操作するための独自のシステムを実装することも提案されました。すべてのshared_ptrsのコピーのコンストラクターでブレークポイントを使用しようとしましたが、数日経っても何も役に立ちませんでした。 libstdc++ ライブラリにロギングを追加するというアイデアがありましたが、人件費が膨大であることが判明しました。


    カウボーイ ビバップ (1998)

    プライベート変数shared_ptr –の変更を追跡するという解決策が突然思いつきました。 use_count。これは、lldb に組み込まれているウォッチポイントを使用して行うことができます。make_shared でshared_ptr を作成した後、次の行を使用して lldb のカウンターへの変更を追跡できます。

    セットを見る var カメラ._M_refcount._M_pi->_M_use_count

    「カメラ」はどこにあるのかこれは、カウンタの状態を追跡する必要があるshared_ptrオブジェクトです。もちろん、shared_ptr の内部は libstdc++ のバージョンによって異なりますが、一般的な原理は理解できます。ウォッチポイントをインストールした後、アプリケーションを起動して各カウンターの変更のスタックトレースを読み取り、コードを確認して (原文どおり!)、問題を見つけて修正します。私の場合、オブジェクトはキャッシュ テーブルとゲーム ロジック テーブルから解放されませんでした。この方法が、shared_ptr を使用する際のリークへの対処に役立ち、このメモリ ツールをさらに気に入っていただけることを願っています。デバッグを楽しんでください。

    ゲームのビジョン #3

    ゲームに関する不定期コラムゲーム ビジョンの第 3 回。

    オブザーバー (PC およびコンソール、Bloober チーム) –勇敢なポーランド人によるサイバーパンク ホラー。ルトガー・ハウアー主演の短くて非常に雰囲気のあるホラー映画。サイバーパンクのファンとして、私はこのゲームのすべてが気に入りました。それほど難しくない謎、主人公の魅力的なグリッチ、アクションと穏やかな瞬間を組み合わせたゲームプレイ、死者の記憶を文字通り掘り下げる能力、攻殻機動隊スタイルのプロット、SFポップカルチャーへの多くの言及。マイナスのうち –不具合が多すぎてプレイできないように見えることもあります。また、特定のホラー要素があまりにも恐ろしくて激怒し、プレイを続けることができなくなったプレイヤーもいます。
    評価: 8/10

    パラダイム (Windows/OS X、Jacob Janerka) –すべてを一度にパロディにして笑い飛ばすという探求。そこにはソ連、アメリカ、クエストジャンル、グラムロック、古いゲーム機、人々、記念碑、IT関係者、コーン、コンピューター、女性、子供、親、芸術家、愛、科学者、ゲーム業界、プレイヤー自身、そしてプレイヤー自身への嘲笑があった。 #8211;一般に、すべてをリストすることは不可能です。まったく予測不可能なプロット、不条理な雰囲気とアート、特に難しい謎ではありません。このゲームにはまれにバグやクラッシュがあり、一部の瞬間やジョークはわずかに予測可能でオリジナルではありません。
    評価: 9/10

    遅番 (PC およびコンソール、CtrlMovie Ltd) –インタラクティブフィルム。基本的には良いアイデアがあまりにも不十分に実装されたことを本当に残念に思います。すべてが悪い–プロット、スター俳優の欠如、演技、PC 版では頻繁にフリーズ、変動性はほぼゼロ (幻想)。 2010 年代にこれほど多くの問題を抱えたゲームをどのようにしてリリースできたのか全く理解できません。実際にはこれは普通のビデオ プレーヤーであり、ゲーム全体を YouTube などのインターネットに投稿することもできましたが、その代わりにUnity は、このような強力なゲーム エンジンさえも打ち破ることに成功しました。 Steam の公式フォーラムは、修正、ホットフィックス、回避策などに特化しています。技術的な障害があり、ユーザー サポートが不足しており、すべてのテストはプレーヤーに対して直接行われます。絶賛レビューや体験談を購入
    しました。評価: 3/10

    ライズプログラミング言語

    皆さんの注意を引くために、– と呼ばれる私独自のプログラミング言語を紹介します。 上昇します。 Rise から JavaScript へのトランスパイラーは現在利用可能です。

    以下のリンクで確認して使用できます。– JavaScript (ECMAScript 5 方言) の台頭:
    https://gitlab.com/demensdeum/Rise

    また、完全に Rise で書かれたデモ アプリケーションも紹介します。

    Rise デモ アプリケーションのソース コード:
    https://gitlab.com/demensdeum/RiseDemoApplication

    次の場合は、と書いてください。新しい言語に関するアイデア、提案、コメントがありますか。

    腐敗の核心

    呼吸するのが難しく、ヘルメットのディスプレイにはちょうど 30 分間酸素供給が表示されていました。この間にレビルは市内中心部に到達し、デスマスクを入手する計画を立てていた。周囲には鋭い緑色の霧が立ち込め、空気はなく、半死んだ人々が街を徘徊し、マスクの影響で捕らえられた生き物たちがいた。
    廃ビルの空き部屋に足音が広がり、レビルはテクノラボの最も危険な場所で何が起こるか分からず、慎重に移動した。

    動かないでください!
    M-デルカンブレ

    による

    この都市は長い間汚職に囚われてきましたが、政治家や権力者たちの心を奴隷にする世俗的な汚職ではありませんでした。デスマスクの腐敗は生き物たちの心を乗っ取り、彼らは自制心を失い、彼女の欲望を満たすために生き始める。その影響を受けた人々は皆、奉仕の結果として永遠の命を得ることができると信じるようになりました。制御を維持するために、マスクは新しい奴隷を継続的に流入させ、純粋な生き物で新しい領土を占領する必要があります。

    レビルは北西で、アリスが彼に話した青い輝きを見た。その中心にはテクノラボの建設業者が作った巨大な建物がある。突き出たフレームや機械部品が積み重なった奇妙でグロテスクな外観は、あたかも狂人が作ったかのように恐ろしいものでした。

    レビルは旅を続けるために建物の窓から通りに降りましたが、そのとき突然金属の手足がアスファルトに当たる大きな衝撃音を聞きました。振り向くと、目の前に悪魔がいた。蜘蛛に似た、人間の頭が 3 つある生体力学的生き物がゆっくりと彼に向かって近づいてきました。奇妙な鏡のような黒い色の円が空に現れ、目を離すのが困難でした。都市のサイレンの耳をつんざくような轟音が響き渡り、悪魔を助けるよう奴隷の生き物たちを呼びました。状況は最悪でしたが、レビルはこの事件のためにサプライズを用意していました…

    Sabre-Plus C++ IDE

    C++ 用の独自の IDE の開発を開始しました –セイバープラス。新しい IDE の主なアイデア –シンプルで、速く、開発に「役立つ」ものであること。現時点では、ソース コードは GitHub で MIT ライセンスの下で入手できます。UI の操作には Qt が使用されます。将来的には、C++ に関連するすべての開発を Saber-Plus – に移管する予定です。 Death-Mask は確実に移行されます。ポイントの詳細:

    • シンプル –必要以上に追加しない予定です。たとえば、ソース管理クライアント、組み込みターミナル、および同様のものは含まれません。この機能は、コード編集とエラー分析のみに焦点を当てています。エディターのコードは、その役割を正しく実行する単純なクラスに分割する必要があります (Unix 方式)
    • 高速 –これは、IDE コード ベースとエディター自体の動作の両方に関係します。 IDE 内のすべてのアクションは、プロジェクトの作成やインポートなど長くて複雑なアクションであっても、できるだけ高速である必要があります。
    • お手伝い–コードの作成およびコンパイル時の典型的なエラーの分析。ユーザーのリクエストに応じてエラーと警告を修正します。計画では、特定のプラットフォームでのアプリケーション ビルドの分析を追加し、必要なライブラリとコンポーネントのインストールに関するヘルプ情報を表示する予定です。

    オペレーティング システム用のエディターをビルドするには、Qt 5 SDK をインストールし、リポジトリから IDE コードをダウンロードし、Qt Creator で Saber-Plus.pro ファイルを開いてビルドを実行する必要があります。

    https://github.com/demensdeum/saberplus