分类 编程语言 下的文章

相比于用C++写Qt,PyQt更加适合小项目入手,在单文件/单窗口的情况下更容易入手。

静态加载.ui文件需要使用pyuic5进行编译,然后作为库引入,使用一个类去继承该类即可使用。在这个类中,组件可以通过使用ui中指定的objectName直接进行获取,类似于Android中的findViewById

接下来是一些坑:

  1. 组件具有线程绑定性,只能在主线程内更新组件(包括设置组件内容),否则好的情况抛出Exception,坏的情况直接Segmentation Fault退出了,此时只能通过Qt的信号/槽机制来;
  2. 即便是新建QMessageBox也最好在主线程中进行(同样是信号/槽机制),否则可能可以展示信息,但是会出一些奇奇怪怪的错误,我这里遇到的情况就有诸如包含空格就段错误的情景。

这操作太神奇了,完全没有想到还有这种妙用

这个表达式主要用在宏定义和条件分支两种情况:

一是宏定义的时候,可以避免由多个语句组成的宏,在没有{}的控制语句下产生错误的语义,如:

#define func() funcA(); funcB()

...

if(cond) func();

就会导致funcAfuncBcond == false的情况下产生错误的语义(原本计划是两条语句都不执行,而现在funcB必定执行)。

简单直观的解释:

if(cond)
    funcA();
funcB();

do {...} while(0)(注:这里while后面没有分号,目的是符合C/C++在语句后添加分号的风格,在调用宏的时候再加)则会被系统认为是一个单独的语句块,在面对分支结构的时候,就能够被正确地视作原子操作进行处理。

为什么不用{},而要用更复杂的do {...} while(0)呢?

直接上代码:

if(cond) { funcA(); funcB(); };

这个时候,原本在func末尾的分号成了累赘,反而会导致报错。这也是出于保持代码风格一致的考虑。

由于宏函数不存在返回值一说,而多语句的宏函数显然不会、也不应该产生返回值,所以无须担心把这类宏函数放到赋值语句中会怎么样——这和void类型的函数的行为是一致的。

二是简化条件汇集的情况。考虑这么一种情况:

if(condA) { funcA(); }
if(condB) { funcA(); funcB(); }
if(condC) { funcA(); funcB(); funcC(); }

如果真的在代码里这么写的话,想必是一座宏伟的代码金字塔了。随着条件增加,重复而又意义不大的函数体,会变得越来越长。于是有人考虑使用goto语句,合并重复的语句:

if(!condA) goto end;
funcA();

if(!condB) goto end;
funcB();

if(!condC) goto end();
funcC();

end:
    ...

但是对软件工程有所了解的人都会知道,在代码中使用goto是一种不清真的行为,会对代码的可读性和入口的单一性产生负面影响,影响后续的开发和维护工作。

继续观察,注意到上面例子中所有的情况下,只要到了某一条件不满足,就直接跳转到整个代码块的末尾。有什么语句可以跳过块内所有的剩余语句,立即跳出语句块?答案呼之欲出,break!于是,do {...} while(0); 作为能够使指令只执行一遍的循环结构,再次登场:

do {
    if(!condA) break;
    funcA();

    if(!condB) break;
    funcB();

    if(!condC) break;
    funcC();
} while(0);

这样既继承了原始代码不使用不规范函数的原则,又吸收了goto版本缩减重复代码的优点。
当然,如果有人想ifif,就当我没说

参考:http://www.spongeliu.com/415.html

参考文章中还提到了定义空宏和代码块功能,感觉这两个有点牵强。。定义空宏的话直接用分号应该也行,代码块功能也和循环语句没有必然的联系。

(咳咳,星之梦,eden*,塑料内存条,ATRI,奇怪的故事增加了)

这两天摸鱼快速打完了ATRI,现在感觉仿佛有那么一点。。惆怅的心情?

亚学家 亚学家.jpg
这图一定要放出来
555,写文的时候都晚上了,网友肯定都组团捞完回来了

也到某乎和贴吧上看了一下网友评价,觉得也和自己的感想在总体评价上一致,属于演技、逻辑、环境渲染表现良好,但是立意出发中规中矩的那种,结局就剧情中的现实意义而言算是还行的。不过由于剧本容量较小,不少网友认为水菜萌当了工具人来着= =我倒是觉得,还是那套说辞吧:若要说夏生和水菜萌两者有感情,剧中没有明确的剧情叙述;反之若要说没有,也可以辩驳说剧本里写不了一切。总之,什么观点自己喜欢就好,不必证明并强加于别人。

等什么时候steam发小绿票了去充值一下信仰吧

音乐评价也和其他人差不多,虽说算不上优秀的砖,但当作闲暇之时BGM还是足矣的。就我个人而言,绝大多数国产游戏(咳咳,反正我是还没见过那不存在的极小部分)和一部分国外游戏的BGM是做的真的8行。(可能也和游戏本身的设计有关吧)

然而OST 10月才发售。为了听歌我还得开个游戏?要是充值了的话我还能挂个游戏时长
重点是这玩意不稳定,下的DARKSiDERS的版本,只要闲置时间过久,程序就会自己停止工作= =
然后想法只有一个,那就是传统艺能——拆包了。

KrKrExtract的界面过于难受,没有GUI预览,对于还在使用SMR磁盘的用户来说更加难受了(体会过硬盘灯常亮,甚至闪都不闪的感觉吗);而GARbro好是好,缺陷在于针对(似乎只有KrKr引擎的?)不同游戏的特殊解密方式都隐藏在了一个看似加密了的文件Formats.dat中。这个文件基本上都是由原作morkt更新的,然而上一次还在去年年初= =。ATRI的xp3文件也被加密了,可以看到文件名称,但是无法读取内容。然后运气好,这次看到有佬在issue区放出了ATRI所使用的加密算法CxEncrypt的关键参数,估计就差一个把参数整合进软件的工作了。

初步看了一下代码。似乎Formats.dat是一个使用Deflate算法加密了的C#序列化对象,然后添加了一个自定义头,在主程序开始运行时加载。至于具体用法,等接下来有时间我再补充吧。

Mathematica 10默认的色调是挺好看,但是想写一篇蓝色为主色调的报告,然后就去查修改绘图的色调,了解到了ColorData这个玩意。它内置了一系列的色调,每个色调可通过向其传递一个0-1的数值获取一个对应的色调中颜色。具体操作敬请参考Mathematica内置的强大帮助引擎。

然后找到了一个比较理想的"DeepSeaColors",但是当它作为参数传递给不论是ChartStyle还是ColorFunction的时候,都相当地不尽人意,要么全局颜色过浅,要么全局颜色过深。后来想,能不能从中提取出部分色调供自己使用?因为觉得其中某段颜色还是挺好看的。

然后在网上查到了用匿名函数和Resize实现的方法。不过当时不知道ColorData里面取出来的是ColorDataFunction

暂时记在这:
https://community.wolfram.com/groups/-/m/t/113779

ColorFunction -> (ColorData["VisibleSpectrum"][
    Rescale[#, k*{-1, 1}, {380, 750}]] &)

然后就有了后来自己的想法,由于时间有限,只使用了一次函数来表达进行映射:

myBlueSeries = Table[
   ColorData[{"DeepSeaColors", "Reversed"}][x/1.6 + 0.1], {x, 0, 1, 0.2}];

然后使用的时候在图表中添加选项ChartStyle -> myBlueSeries,即可获得效果还可以的蓝色图例系列。 生成颜色的数量和变化规律都在上面那句Table里设置,有需要的自行修改即可。