フライウェイトパターン

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

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


なぜ必要なのでしょうか? 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

単純な TensorFlow の例

ここでは、ディープ ラーニングを使用するためのフレームワークを使用する簡単な例を紹介します。テンソルフロー。この例では、ニューラル ネットワークに正、負の数、およびゼロを検出するよう教えます。 TensorFlowCUDA 教えておきますが、このタスクは実際には簡単ではありません)

分類問題を解決するには、分類子TensorFlow には、最小限の構成で動作する既製の高レベル分類器がいくつかあります。まず、DNNClassifier をトレーニングします。正、負の数値、ゼロを含むデータセット正しい「ラベル」を付けてください。人間のレベルでは、データセットは分類結果 (ラベル) を含む一連の数値です。

10 –ポジティブ
-22 –ネガティブ
0 –ゼロ
42 –ポジティブ
な…分類のあるその他の番号

次に、トレーニングが開始され、その後、データセットにも含まれていない数値を入力できるようになります。ニューラル ネットワークはそれらを正しく識別する必要があります。
以下は、トレーニングおよび入力データ用のデータセット ジェネレーターを備えた分類子の完全なコードです。

インポート テンソルフローインポート itertoolsインポートランダムから時刻 インポート時間クラス 分類番号:__number = 0__classifiedAs = 3def __init__(自分、番号):自分.__number =数値if 数値 == 0:self.__classifiedAs = <スパン スタイル="カラー: #0000dd; font-weight: ボールド;">0 <スパン スタイル="カラー: #888888;">#ゼロエリフ 番号 > 0:self.__classifiedAs = <スパン スタイル="カラー: #0000dd; font-weight: ボールド;">1 <スパン スタイル="カラー: #888888;">#ポジティブエリフ 番号 < 0:self.__classifiedAs = <スパン スタイル="カラー: #0000dd; font-weight: ボールド;">2 <スパン スタイル="カラー: #888888;">#否定的def 数値(自分):戻る 自分自身.__番号def classifiedAs(自分):戻る 自分自身.__classifiedAsdef classifiedAsString(classifiedAs):if として分類== 0:return 「ゼロ」elif== として分類されました 1:return 「ポジティブ」elif== として分類されました 2:return "Negative"def trainDatasetFunction():trainNumbers = []trainNumberLabels = []私は 範囲(-10001001):数値 = ClassifiedNumber(i)trainNumbers.append(number.number())trainNumberLabels.append(number.classifiedAs())return ( {"number" : trainNumbers } , trainNumberLabels)def inputDatasetFunction():グローバル ランダムシードrandom.seed(randomSeed) # 同じ結果を得る数字= []私は 範囲(0, 4):数値.append(random.randint(-99999999999999))return {"number" : 数値 }def メイン():print("TensorFlow 正負ゼロ数値分類子テスト (demensdeum 2017 による) (demensdeum@gmail. com)")maximalClassesCount = len(set< /span>(trainDatasetFunction()[1])) + 1numberFeature = tensorflow.feature_columnnumeric_column("数値")分類子= tensorflow.推定子DNNClassifier(feature_columns = [numberFeature], hidden_​​units = [102010]、n_classes = maximalClassesCount)ジェネレーター= 分類子.train(input_fn = trainDatasetFunction、ステップ = 1000).predict(input_fn =  inputDatasetFunction)inputDataset = inputDatasetFunction()結果 = リスト(itertools)。 islice(generator, len(inputDatasetFunction()["数値"])))i = 0結果の結果:print("番号: %d は %s として分類されました" % (inputDataset["number"][i], generatedAsString(result["class_ids"][0 ])))i += 1ランダムシード = time()主要()

すべては main() メソッドで始まり、分類子が機能する数値列を設定します – tensorflow.feature_column.numeric_column(“number”) 次に、分類子のパラメーターを設定します。 API は毎日変更されるため、現在の初期化引数を説明することは役に立ちません。古いマニュアルに依存せず、インストールされているバージョンの TensorFlow のドキュメントを必ず参照する必要があります。

次に、正、負、またはゼロに基づいてこれらの数値を正しく分類して、-1000 から 1000 までの数値のデータセットを返す関数 (trainDatasetFunction) を示すトレーニングが開始されます。次に、トレーニング データセットに含まれていない数値を入力として送信します。 -9999999 か​​ら 9999999 までのランダム (inputDatasetFunction) を使用して分類します。

最後に、入力データ (itertools.islice) の数に基づいて反復を開始し、結果を出力して実行すると、驚くべき結果が得られます。

番号: 4063470 は陽性として分類されました番号: 6006715 陽性として分類番号: -5367127 は陰性として分類されました番号: -7834276 陰性として分類

iT’S ALIVE

正直に言うと、私が教えていない数値さえも分類子が「理解」していることに今でも少し驚いています。将来的には、機械学習のトピックをより詳細に理解できるようになり、より多くのチュートリアルが提供されることを願っています。

GitLab:
https://gitlab.com/demensdeum/MachineLearning

リンク:
https://developers.googleblog.com/2017/09/introducing-tensorflow-datasets.html
https://www.tensorflow.org/versions/master/api_docs/python/tf/estimator/DNNClassifier

ビットコインの破壊

このメモは行動を促すものではありません。ここではビットコインとブロックチェーン テクノロジーの脆弱で潜在的に危険な側面について説明します。

脆弱なセンター

ビットコインとブロックチェーンの動作原理は、共通のデータベースを保存および変更することであり、その完全なコピーは各ネットワーク参加者によって保存されます。このシステムは分散化しているように見えます。その理由は…データベースが保存される単一の組織/サーバーはありません。また、ブロックチェーンの主な利点として分散化が挙げられます。これにより、ユーザーの知らないうちにビットコインに何も起こらないことが保証されます。


Elkin のブロック ペスト原則

ブロックチェーンが機能するためには、各ユーザーがブロックチェーン データベースの最新コピーをダウンロードし、特定のルールに従ってそれを操作する必要があります。これらのルールには、あるウォレットから別のウォレットへの資金移動の確認時に各取引の一定割合(取引手数料)を受け取る、ビットコインマイニングの原則の実装が含まれます。ユーザーは自分で 1,000,000 ビットコインを引き出して、それで何かを購入することはできません。他のユーザーの場合、アカウント内の金額は変更されません。また、自分のデータベース内でのみ他人のウォレットから資金を引き出すオプションも除外されます。この変更は他のビットコイン ユーザーには反映されず、無視されます。
現在の実装の脆弱性は、ビットコイン ウォレットがサーバー github 上に配置されていることです。分散化に関する広告スローガンを完全にブロックします。 単一のセンターからウォレットをダウンロードする必要はありません –開発者のウェブサイトでは、 ビットコインを扱うことは不可能です。つまり、開発者はいつでもネットワークを完全に制御できます。したがって、 ブロックチェーン技術自体は分散化されていますが、 ネットワークと連携するためのクライアントは単一のセンターからダウンロードされます。 >。
攻撃シナリオ–すべての資金を引き出して第三者の口座に現金化するためのコードがウォレットに追加されたとします。その後、最新バージョンのウォレットのユーザーはすべてのビットコインを自動的に(回復の可能性なしで)失うことになります。多くのウォレット所有者がソースコードをチェックして構築しているとは思えないため、そのような攻撃の結果はほとんどのユーザーに影響を与えるでしょう。

多数決で決定

ブロックチェーンは分散型 P2P ネットワークであり、すべてのトランザクションはユーザー自身によって自動的に確認されます。攻撃シナリオ–残りの 49% の確認を無視するには、ネットワークの 51% を取得する必要があり、その後、攻撃者はビットコイン/ブロックチェーンを完全に制御できるようになります。これは、残りの部分と重複するコンピューティング能力を接続することで実現できます。この攻撃シナリオは、51% 攻撃として知られています。 p >

できるかどうか教えてください

最初にウォレットを起動すると、コンピュータはペア – を生成します。秘密鍵と公開鍵を使用して、正しい動作を保証します。これらのキーの一意性は非常に高いですが、コード ワード – を使用してキーを生成するオプションもあります。いわゆる “ブレイン ウォレット“。ユーザーは鍵を頭の中に保存するため、wallet.dat ファイルをバックアップする必要はありません。このコードワードを使用して、いつでもキーを再生成できます。攻撃シナリオ –攻撃者はコードワードを選択または学習し、秘密鍵と公開鍵のペアを生成してウォレットを制御します。

コピーするだけ

秘密鍵と公開鍵のペアは、wallet.dat ファイルに含まれています。このファイルにアクセスできるソフトウェア –ビットコインウォレットにアクセスできる。このような攻撃に対する保護は、ユーザーがウォレットとのすべてのトランザクションで覚えて入力する必要があるコードワードを追加することです。コードワードを追加した後、攻撃者が完全な制御を得るには、wallet.dat とコードワードが必要になります。
また、コード ワードを入力すると、そのコード ワードがコンピュータのメモリに取り込まれるため、*他人* のメモリの読み取りを可能にするハードウェアやソフトウェアの脆弱性があると、ウイルス ソフトウェアがこのコード ワードを読み取ることが可能になることも付け加えておきます。

システムエラー

ビットコインの暗号化アルゴリズムをハッキングすると、ビットコインは即座に死に至ります。アルゴリズムの実装でエラーが発生し、それを発見した攻撃者がブロックチェーンの完全または部分的な制御を取得したとします。また、ビットコインで使用される暗号化アルゴリズムは、将来の量子コンピューター、その出現と量子アルゴリズムの実装によるハッキングから保護されていません。これにより、 ビットコインの現在の実装が終了します。ただし、これはポスト量子暗号化アルゴリズムに切り替えることで解決できます。