С++ 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,但找到了库 Prophet by Facebook
Prophet 允许您根据包含日期 (ds) 和变量值 (y) 列的数据 (csv) 进行预测。您可以在官方网站文档中的 快速入门
作为数据集,我使用了从网站上传的 csv https://www.investing.com,在实现时我使用了 R 语言Prophet API 对他来说。我真的很喜欢 R,因为它的语法简化了对大量数据的处理,允许您编写更简单,并且比使用传统语言(Python)时犯的错误更少,因为您必须使用 lambda 表达式,并且在 R 中,您已经拥有所有 lambda 表达式。
为了不准备要处理的数据,我使用了包 anytime,可以将字符串转换为日期,无需预处理。使用 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

用于训练和文本生成–使用库 textgenrnn,要过滤需要使用拼写检查的短语 hunspell 及其 C/python 库。在 Colaboratory,您可以开始生成文本。大约 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

你那里有多少错误?

黑客新闻上,我发现了一篇非常有趣的文章,其中作者建议使用Petersen-Lincoln 方法,生物学家使用该方法来计算鸟类、猴子和其他动物的数量,以便在应用程序中*击鼓*计数错误

自然栖息地的虫子– 大脚怪瞄准 作者:德里克·哈特菲尔德

方法很简单,我们取两个鸟类学家,他们发现特定物种的鸟类,它们的任务是“确定这些鸟类的种群规模。两位鸟类学家对发现的鸟类进行标记,然后计算常见鸟类的数量,代入林肯指数公式,即可得出大致的种群规模。
现在开始申请——方法也很简单,我们进行了两次 QA,他们发现了应用程序中的 bug。假设一位测试人员发现了 10 个错误 (E1),第二位测试人员发现了 20 个错误 (E2),现在我们计算错误总数 – 3 (S),然后使用公式我们得到林肯指数

这是对整个应用程序中错误数量的预测,在给出的示例中大约有 66 个错误。

Swift 示例

我已经实现了一个测试平台来测试该方法,你可以在这里看到它:
https://paiza.io/projects/AY_9T3oaN9a-xICAx_H4qw?language=swift

可以更改的参数:

让 aliceErrorFindProbability = 20 – QA Alice 发现的错误百分比 (20%)
让 bobErrorFindProbability = 60 – QA Bob 发现的错误百分比 (60%)
让实际BugsCount = 200 –应用程序中到底有多少错误

在上次运行中我收到了以下数据:
估计错误数:213
实际错误数:200

也就是说,应用程序中有 200 个 bug,林肯指数给出了预测“200 个 bug”。 213:
“Alice 发现了 36 个错误”
“鲍勃发现了 89 个错误”
“常见错误数量:15”

估计错误数:213
实际错误数:200

弱点

此方法可用于评估应用程序在开发的各个阶段的错误数量;理想情况下,错误数量应该减少。 该方法的弱点包括人为因素,因为两个测试人员发现的错误数量应该不同,并且发现了不同的错误,但是 必须找到常见的,否则该方法将不起作用(零常见错误–被零除)< br/>此外,诸如常见错误这样的概念需要专家在场才能理解其共性。

来源

还有多少错误需要查找? –约翰·库克博士,总裁
The thrill of the chase – Brian Hayes

源代码

https://paiza.io/projects/AY_9T3oaN9a-xICAx_H4qw ?语言=swift
https://gitlab.com/demensdeum/statistics/tree/master/1_BugsCountEstimation/src

磨削齿轮

哦,缪斯,有时要抓住你是多么困难。
Death-Mask 及相关框架(Flame Steel Core、Game Toolkit 等)的开发暂停了几个月,以决定游戏的艺术部分、音乐、声音和游戏玩法。
计划–为 Flame Steel Game Toolkit 创建一个编辑器,为游戏脚本编写一个解释器(基于 Rise 语法),为尽可能多的平台实现 Death-Mask 游戏。
最困难的阶段已经过去了——在实践中,编写自己的跨平台游戏引擎、自己的 IDE 和一组库的可能性已被证明。
我正在进入创建一个真正深思熟虑、有趣的项目的阶段,请继续关注。

公共领域的死亡面具

从今天开始,《死亡面具》游戏将进入开放获取模式——您可以通过以下链接关注游戏实施的进度:(哇!)
[死亡面具狂野]

当前版本– 0.1 包含基本的箭头控件、wsad、地图生成、项目(包括死亡面具!)、渲染。
还有很多工作要做,我对您的反馈非常感兴趣 –这样你就可以在狂野版游戏的页面上写评论了。
在最终版本中,游戏在玩家找到物品“”后结束。死亡面具
测试愉快:)

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

Taytay 监控 Git 存储库的状态

我提请您注意Taytay –用于监控 Swift 语言 git 存储库状态的实用程序。目前,Swift可以安装在所有主流桌面操作系统上。对于 Ubuntu,我建议使用 Swiftenv。将 Taytay 链接到实用程序 git-cola,但您可以编辑源并将其更改为任何其他程序。

源代码:
https://gitlab.com/demensdeum/taytay

我们击败了马里维奇,黑色正方形opengl

Malevich定期出现在OpenGL上的任何开发人员。这是出乎意料而大胆地发生的,您只需启动该项目并看到一个黑色正方形而不是一个美妙的渲染:

今天,我将出于什么原因被一个黑色广场拜访,发现的问题是因为OpenGL不会在屏幕上绘制任何内容,有时甚至使窗户透明。

使用工具

对于调试OpenGL,有两个工具帮助了我: renderdoc and renderdoc 和 and and and and apitrace 。 Renderdoc&#8211;用于调试OpenGL渲染过程的工具,您可以查看所有内容&#8211;顶点,着色器,纹理,驾驶员的债务消息。 Apitrace&#8211;一个追踪图形API挑战的工具,进行转储调用并显示参数。还有一个很好的机会可以通过WDIFF(或没有但不那么方便)比较两个转储

检查您与谁一起工作

我有一个操作系统ubuntu 16.10,带有旧的依赖项SDL2,GLM,Assimp,Glew。在最新版本的Ubuntu 18.04中,我得到了游戏的组装“ noopener”> death-mask 在屏幕上没有显示任何东西(仅在屏幕上显示任何东西)。在16.10 I 使用Chroot和组件时,我会使用Graphics 进行游戏组件。

似乎在Ubuntu 18.04

中破裂了

ldd 显示了与相同库SDL2的Linkka,Gl。在Renderdoc驾驶非工作版本,我在顶点着色器的入口处看到垃圾,但我需要更坚实的确认。为了理解二进制技术之间的区别,我将它们俩都通过 apitrace 驱动。垃圾场的比较表明,新鲜的Ubunta上的大会打破了OpenGL的潜在客户计划,实际上将垃圾发送到那里:

矩阵聚集在GLM库中。从16.04&#8211;我再次获得了游戏的工作构建。问题是GLM 9.9.0中单个矩阵的初始化的差异,有必要清楚地指出构造函数中的Mat4(1.0f)参数。更改了初始化并通过写下图书馆的作者,我开始做测试FSGL 。在我在FSGL中发现缺陷的写作过程中,我将进一步描述它们。

确定生命中的谁

对于使用OpenGL进行正确的工作,您需要自愿强行强行 请求某个版本的上下文。因此,它查找SDL2(您需要严格将版本放置在初始化上下文之前):

<! - 使用hilite.me->

生成的html

 sdl_gl_seettribute(sdl_gl_context_major_version, 3 )> 3 );
sdl_gl_settribute(sdl_gl_context_minor_version, 2 );
sdl_gl_settribute(sdl_gl_context_profile_mask,sdl_gl_context_profile_core_core);

例如,renderdoc不适合3.2以下的上下文。我想指出的是,切换上下文之后,看到相同的黑屏的可能性很高。为什么?
因为OpenGL 3.2的上下文必须需要VAO缓冲液的存在,而没有99%的图形驱动程序不起作用。添加简单:
<! - 使用hilite.me->

生成的html

 glgenvertexarrays( 1  vao
Glbindvertexaray(VAO);

不睡觉,冻结

我在kubuntu上也遇到了一个有趣的问题,而不是一个黑色的正方形,我被透明了,有时一切都正确地呈现。我在Stack Overflow上找到了解决此问题的解决方案:
https://stackoverflow.com/questions/38411515/sdl2-opengl-window-appears-semi-transparent-sometimes

FSGL测试渲染代码也存在睡眠(2s);因此,在Xubuntu和Ubuntu上,我收到了正确的渲染并将应用程序入睡,但是在Kubuntu上,我在Dolphin发射的80%和30%的发射和终端中收到了透明的屏幕。为了解决此问题,我按照文档中的建议在SDLEVENT调查后在每个帧中添加了渲染。

测试代码:
https://gitlab.com/demensdeum/FSGLtests/blob/master/renderModelTest/

与驾驶员交谈

Opengl supports the communication channel between the application and the driver, to activate it, you need to turn on the flags Gl_debug_outPut, GL_DEBUG_OUTPUT_SYNCHRONUS, affix the warning GLDEBUGMESSAGECONTROL and tie the calback through GLDEBUGMESSAGECALLBACK
可以在此处以初始化的示例:
https://github.com/rock-core/gui-vizkit3d/blob/master/src/EnableGLDebugOperation.cpp

别害怕,看着它成长

在这篇文章中,我将讨论我使用shared_ptr智能指针的不幸经历。在我的游戏Death-Mask中实现下一代后,我注意到了一段记忆泄露 。每个新级别都会使消耗的 RAM 增加 + 1 MB。 显然有些对象保留在内存中并且没有释放它。为了纠正这个事实,有必要在关卡过载时正确实施资源,但这显然没有做到。由于我使用了智能指针,因此有多种选择可以解决这个问题,第一个涉及手动检查代码(又长又无聊),而第二个涉及研究 lldb 调试器和 libstdc++ 源代码的功能以实现自动跟踪的可能性计数器更改。

在互联网上,所有的建议都归结为手动检查代码、修复它,并在找到有问题的代码行后用鞭子抽打自己。还建议实现您自己的内存处理系统,就像 90 年代和 2000 年代以来在 C++11 标准中智能指针到来之前开发的所有主要项目一样。我尝试在所有共享指针的副本的构造函数上使用断点,但几天后没有发生任何有用的事情。有一个想法是向 libstdc++ 库添加日志记录,但结果证明人工成本非常高。


星际牛仔 (1998)

我突然想到了一个解决方案,那就是跟踪私有变量shared_ptr 的变化–使用计数。这可以使用 lldb 中内置的观察点来完成。通过 make_shared 创建共享指针后,可以使用以下行跟踪 lldb 中计数器的更改:

观看 设置 var 相机._M_refcount._M_pi->_M_use_count

“相机”在哪里?这是一个shared_ptr对象,需要跟踪其计数器状态。当然,shared_ptr的内部会根据libstdc++的版本不同而有所不同,但大体原理还是可以理解的。安装观察点后,我们启动应用程序并读取每个计数器更改的堆栈跟踪,然后查看代码(原文如此!),找到问题并修复它。就我而言,对象并未从缓存表和游戏逻辑表中释放。我希望这个方法能帮助你在使用shared_ptr时处理泄漏,并且更加喜欢这个内存工具。祝调试愉快。

游戏愿景#3

游戏非常驻专栏第三期游戏愿景

Observer(PC 和游戏机,Bloober 团队)–来自勇敢的波兰人的赛博朋克恐怖。一部由鲁特格尔·哈尔主演的简短而大气的恐怖电影。作为一名赛博朋克迷,我非常喜欢这款游戏的一切。不是很困难的谜语,主角迷人的小故障,平静时刻与动作混合的游戏玩法,深入研究死者记忆的能力,攻壳机动队风格的情节+许多科幻流行文化的参考。缺点–小故障太多,有时会因为内容过多而导致无法玩,也有部分玩家被某些恐怖元素激怒而无法继续玩。
评分:8/10

Paradigm(Windows/OS X,Jacob Janerka)–一种能够同时模仿和嘲笑一切的追求。有对苏联、美国、任务类型、华丽摇滚、旧游戏机、人物、纪念碑、IT人员、视锥细胞、计算机、妇女、儿童、父母、艺术家、爱情、科学家、游戏行业、玩家本身的嘲笑#8211;一般来说,不可能列出所有内容。绝对不可预知的情节,荒诞的气氛和艺术,不是特别难的谜语。该游戏存在罕见的错误和崩溃,某些时刻和笑话有些可预测,并非原创。
评分:9/10

Late Shift(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

如果您愿意,可以写信我对新语言有什么想法、建议和评论吗?

腐败的核心

呼吸困难;头盔显示屏显示氧气供应整整半个小时。这段时间,瑞维尔计划前往市中心,获取死亡面具。周围弥漫着刺鼻的绿色雾气,这里没有空气,半死不活的人在街道上徘徊,生物被面具的影响所捕获。
脚步声在废弃建筑的空荡荡的房间里传开,瑞维尔小心翼翼地移动着,不知道在科技实验室最危险的地方会发生什么。

别动!
作者:M-Delcambre

这座城市长期以来一直被腐败所占领,但世俗的腐败却没有,它奴役了政客和权力饥渴的思想。死亡面具的腐败接管了众生的思想,他们失去了对自己的控制,开始为了满足她的欲望而生活。所有受到影响的人都开始相信,他们的服务将带来永生。为了维持控制,面具需要不断涌入新的奴隶并用纯粹的生物占领新的领土。

在西北方,瑞维尔看到了爱丽丝告诉他的蓝色光芒;在它的中心是一座由科技实验室建造者建造的巨大建筑。奇怪而怪诞的突出框架和机械部件堆积在一起,仿佛是由一个疯子创造的,其外观令人毛骨悚然。

雷维尔从大楼的窗户下来到街上,准备继续他的旅程,突然他听到金属肢体撞击柏油路的巨响。转身,他看到了眼前的恶魔——一个类似蜘蛛的三人头生物机械生物,正缓缓向他靠近。天空中出现了一圈奇异的镜黑色,让人难以将目光移开。城市警报声震耳欲聋,召唤着奴隶生物来帮助恶魔。情况实在是太糟糕了,但雷维尔为此准备了一个惊喜…

Sabre-Plus C++ IDE

开始开发我自己的 C++ IDE – Sabre-Plus。新IDE的主要思想–简单、快速并且对开发“有帮助”。目前,源代码可在 GitHub 上获得 MIT 许可;Qt 用于与 UI 配合使用。将来我计划将所有与 C++ 相关的开发转移到 Sabre-Plus –死亡面具肯定会被迁移。有关点的更多详细信息:

  • 简单–计划不添加超过必要的内容例如,不包含源代码控制客户端、内置终端和类似的东西。该功能仅专注于代码编辑和错误分析。编辑器代码应该分解为简单的类,以正确地完成自己的部分(Unix 方式)
  • 快–涉及 IDE 代码库和编辑器本身的行为。 IDE 中的所有操作都应尽可能快,即使是创建/导入项目等通常很长且复杂的操作。
  • 帮助–分析编写和编译代码时的典型错误。根据用户请求纠正错误和警告。该计划是添加对特定平台上构建的应用程序的分析,并显示有关安装必要的库和组件的帮助信息。

要为您的操作系统构建编辑器,您需要安装 Qt 5 SDK,从存储库下载 IDE 代码,在 Qt Creator 中打开 Saber-Plus.pro 文件并运行构建:

https://github.com/demensdeum/saberplus

简单的 TensorFlow 示例

我向您展示一个使用深度学习框架的简单示例 – TensorFlow。在此示例中,我们将教神经网络检测正数、负数和零。安装 TensorFlowCUDA我告诉你,这个任务真的不是一件容易的事)

为了解决分类问题,分类器TensorFlow 有几个现成的高级分类器,只需最少的配置即可工作。首先,我们将使用以下方法训练 DNNClassifier具有正数、负数和零的数据集具有正确的“标签”。在人类层面,数据集是一组带有分类结果(标签)的数字:

10 –积极
-22 –负面
0 –零
42 –积极
…其他有分类的号码

接下来,训练开始,之后您可以输入数据集中未包含的数字 –神经网络必须正确识别它们。
下面是分类器的完整代码,带有用于训练和输入数据的数据集生成器:

导入 张量流导入 itertools导入 随机来自 时间 导入时间 分类号:__number = 0__classifiedAs = 3def __init__(自我,数字):自己.__number =数字如果数字 == 0自我.__classifiedAs = <跨度风格=“颜色:#0000dd;字体重量:粗体;”> 0 <跨度风格=“颜色:#888888;”>#零elif 数字 > 0自我.__classifiedAs = <跨度风格=“颜色:#0000dd;字体重量:粗体;”> 1 <跨度风格=“颜色:#888888;”>#积极elif数字 < 0自我.__classifiedAs = <跨度风格=“颜色:#0000dd;字体重量:粗体;”> 2 <跨度风格=“颜色:#888888;”>#负面def 数字(自我):返回 自我.__号码def 分类为(自我):返回 自我.__classifiedAsdef classifiedAsString(classifiedAs):如果分类为== 0返回 “零”elif 分类为 == 1返回 “正”elif 分类为 == 2返回 “负”def trainDatasetFunction():trainNumbers = []trainNumberLabels = []对于 i  范围(-10001001):数字 = ClassifiedNumber(i)trainNumbers.append(number.number())trainNumberLabels.append(number.classifiedAs())返回({“number”:trainNumbers },列车编号标签)def inputDatasetFunction():全局 randomSeedrandom.seed(randomSeed) # 得到相同的结果数字 = []对于 范围(0, 4):数字.append(随机.randint(-9999999, 9999999))返回 {“数字”:数字}def main():print("TensorFlow Positive-Negative-Zero 数字分类器测试,由 demensdeum 2017 (demensdeum@gmail. com)")maximalClassesCount = len(设置< /span>(trainDatasetFunction()[1])) + 1numberFeature =tensorflow.feature_columnnumeric_column("数字")分类器 = 张量流.估计器DNNClassifier(feature_columns = [numberFeature],hidden_​​units = [10, 2010],n_classes = maximalClassesCount)生成器 = 分类器.train(input_fn = trainDatasetFunction,步骤 = 1000).预测(input_fn =  输入数据集函数)inputDataset = inputDatasetFunction()结果 = 列表(itertoolsislice(生成器,len(inputDatasetFunction()[“数字”])))我 = 0for 结果 in 结果:打印("编号:%d 分类为 %s" % (inputDataset["数字"][i], classifiedAsString(结果["class_ids"][0 ])))我 += 1randomSeed = time()主要的()

这一切都从 main() 方法开始,我们设置分类器将使用的数字列– tensorflow.feature_column.numeric_column(“number”) 接下来,设置分类器参数。描述当前的初始化参数是没有用的,因为 API 每天都在变化,你绝对应该查看已安装的 TensorFlow 版本的文档,而不是依赖过时的手册。

接下来,启动训练,指示返回从 -1000 到 1000 的数字数据集的函数 (trainDatasetFunction),并根据正数、负数或零对这些数字进行正确分类。接下来,我们提交训练数据集中不存在的输入数字——从 -9999999 到 9999999 (inputDatasetFunction) 随机进行分类。

最后,我们根据输入数据的数量启动迭代(itertools.islice),打印结果,运行它,你会感到惊讶:

number: 4063470 分类为 Positive编号:6006715 分类为阳性编号:-5367127 分类为负面编号:-7834276 分类为负面

iT 还活着

<脚本异步 src="//s.imgur.com/min/embed.js" charset="utf-8">

说实话,我仍然有点惊讶分类器“理解”甚至那些我没有教过的数字。我希望将来我能更详细地了解机器学习这个主题,并且会有更多教程。

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网络;所有交易均由用户自己自动确认。攻击场景–需要获得 51% 的网络才能忽略其余 49% 的确认,之后攻击者即可完全控制比特币/区块链。这可以通过连接与其余部分重叠的计算能力来实现。这种攻击场景称为51% 攻击

猜猜我是否可以

当您第一次启动钱包时,计算机会生成一对“私钥和公钥以确保其正确运行。这些密钥的唯一性非常高,但可以选择使用代码字“–”来生成密钥。所谓的“脑钱包”。一个人将钥匙存储在他的脑海中;他不需要备份wallet.dat文件,因为任何时候,都可以使用该代码字重新生成密钥。攻击场景–攻击者选择或学习代码字,生成私钥-公钥对并获得钱包的控制权。

只需复制

私钥-公钥对包含在 wallet.dat 文件中。任何有权访问此文件的软件&#8211;可以访问比特币钱包。防止此类攻击的方法是添加一个代码字,用户必须记住并输入该代码字才能使用钱包进行所有交易。添加密码后,攻击者需要拥有wallet.dat和密码才能获得完全控制权。
还值得补充的是,当您输入代码字时,它会进入计算机的内存,因此任何允许读取“其他人”内存的硬件和/或软件漏洞都将允许病毒软件读取该代码字。

系统错误

破解比特币的加密算法将立即导致其死亡。假设算法的实现中出现了错误,发现错误的攻击者获得了对区块链的全部或部分控制。此外,比特币中使用的加密算法并不能免受未来量子计算机、量子算法的出现和实现的黑客攻击。将结束比特币当前的实施。不过,这可以通过改用后量子加密算法来解决。

适用于 Windows 的 Nixenv Linux 控制台实用程序

我整理了自己的 MSYS 替代方案,这套工具包括实用程序 coretools + git + cmake + make + 将 msvs msbuild 添加到 PATH 环境变量。这套应用程序对于那些习惯在Linux平台上进行开发的开发人员来说是必需的,他们需要使用Microsoft Visual Studio从命令行构建适用于Windows的应用程序。下载:

https://www.mediafire.com/file/s5yf75blfslkbym/nixenv.exe

https://www.4shared.com/file/QyjJXBaJca/nixenv.html

安装,更改 nixenv.bat 文件中的路径并运行它。

火焰钢战斧

从今天开始,我开始为游戏框架开发一个编辑器—— 火焰钢战斧。

编辑器允许您编辑游戏框架Flame Steel Game Toolkit的场景。
我选择了相对较新的基于 Java 的 Kotlin 语言,以便在战斗条件下对其进行测试。

您可以按照存储库中的流程进行操作:
https://github.com/demensdeum/FlameSteelBattleAxe

WebGL + SDL + Emscripten

我最终使用 SDL 1 和 Emscripten 将 Mika 移植到 WebGL。

接下来我将描述需要在代码中更改哪些内容才能成功完成 JavaScript 中的构建。

  1. 使用 SDL 1 而不是 SDL 2。目前 emscripten 有一个 SDL 2 端口,但我发现使用 emscripten 内置的 SDL 1 更合适。上下文不是在窗口中初始化的,而是使用 SDL_SetVideoMode 和 SDL_OPENGL 标志初始化的。使用 SDL_GL_SwapBuffers() 命令绘制缓冲区
  2. 由于 JavaScript 循环的方式–渲染被放置在一个单独的函数中,并使用 emscripten_set_main_loop
  3. 函数定期调用

  4. 还必须使用密钥“-s FULL_ES2=1”进行组装
  5. 我不得不放弃 assimp 库,从文件系统加载模型,并从磁盘加载纹理。所有必需的缓冲区都已加载到桌面版本上,并插入到 c 头文件中,以便使用 emscripten 进行组装。

代码:
https://github.com/demensdeum/OpenGLES3-Experiments/tree/master/9-sdl-gles-obj-textured-assimp-miku-webgl/mikuWebGL

文章:
http://blog.scottlogic.com/2014/03/12/native-code-emscripten-webgl-simmer-gently.html
https://kripken.github.io/emscripten-site/docs/porting/multimedia_and_graphics/OpenGL-support.html

型号:
https://sketchfab.com/models/7310aaeb8370428e966bdcff414273e7