Friday, December 31, 2021

用开源GIMP编辑GIF动图

 新年到,微信同学群大家发了一堆video和GIF动图,我不甘落后,可一时也没这么可show的,于是网上现抓,可稍好看点的都有水印,怎么办?祭出开源的PhotoShop编辑器:GIMP。网上的图可能有版权(copyright),如下例用到的,我找不到license信息(Had tried to check the site showed in the bottom of the image, but not able to access that URL. Please let me know if anybody seeing concern about this. Thanks in advance)。这里只是简单介绍怎样用GIMP快速编辑图,应该不是问题。

好久没用了,现学教程。工具板都找不到,不过GIMP倒是列出所有的layer了。

工具版不是在menu->Tools下,而是menu->Windows下,或者Recently Closed Docks,或者New Toolbox(ctrl+b)和Dockable Dialog->Tool options。所有layer都visiable时,看不清修改的效果,所以要把除Background的layer都改成invisible(click layer左边的眼睛),然后每改完当前层,就把下一层变成visible。当所有层都改完并可见后,选menu File->Export->存成GIF文件,特别注意要选GIF Option->As Animation,然后按export。



Wednesday, December 29, 2021

两个关于基因和病毒的中文科普Youtube video

 知识就是力量。科学技术是第一生产力。最近在Youtube上看到的尹烨和李治中的两个访谈和演讲,涨知识。

 

中国需要让大众崇尚科学,少些纸醉金迷、物欲横流、唯利是图的颓废。我最看不惯的就是国内的电影电视剧大都是宫廷和抗日神剧,缺少科幻和现代的影视。中国人不是写不出好作品,除了最近的刘云慈的三体,和郑渊洁的舒克贝塔,以前叶永烈写了很多金明戈亮的作品,拿到今天也未必过时。 叶永烈写的小灵通漫游未来更是给了我们一代人对未来的憧憬。我们需要更多的像果壳和知吧的网站,让下一代的孩子有开阔的眼界。

Monday, December 27, 2021

教小朋友编程之坦克大战 2

加声音并不难,最简单的办法是直接调用SDL的mixer API(需要package libSDL2_mixer-devel),参见forked的Tanks,已经加入开始,开火和击中的声音,各自用独立的channel,好处是同一声音不会overlap。

So far有点跑偏了,原因是我打算先完成Windows下的c++ code,然后port到Python的Pygame上

前面讲到,在cygwin下编译出来的可执行文件,需要依赖X server来render graphics,不是很方便。所以我想直接编译成Windows的图形界面,那么就需要用Visual Studio了,同时要设置Windows下的SDL环境。关于Windows下的SDL,可参见David的how-to-install-sdl2-in-visual-studio,主要是要下载SDL的Windows开发库,包括SDL2 core, ttf(字体), mixer(声音)和image(图像)支持,我只下载了x64 binary,目前最新的是:

我不想安装庞大的VC,也不需要VC的IDE,所以准备只安装VC的Build Tools,甚至不需要Windows SDK,因为根据SDL的文档,它没有其余的dependency。VC Build Tools选择如下:

如果像上图中所有的Optional都清空,只需要2.66GB的空间,可以运行msbuild命令,但是不能运行nmake。运行环境setup通常会看到:'C:\Program' is not recognized as an internal or external command, operable program or batch file. 一方面是空格引起的错误,另一方面环境设置文件如vcvars64.bat并未安装。参见微软文档,需要安装至少一个build环境,如上图的最新MSVC v143 - VS2022 C++ x64/x86 build t..,会额外增加1.6GB的空间。这样环境设置批处理文件都会被安装,不过运行时还会看到The system cannot find the file specified,应该可以忽略。现在可以运行nmake了,需要修改Makefile加入nmake setting,另一个选项是用CMake生成新Makefile。

CMake是Open-Source Cross-Platform Make, 支持Linux,Windows和MacOS。在VS Code中可安装CMake(用来编辑CMakeLists.txt)和CMake Tools(微软为VS Code定制的CMake extension)。如果不用微软的CMake Tools, 也可以直接创建CMake task(参见https://www.40tude.fr/compile-cpp-code-with-vscode-cmake-nmake,需要保证环境变量Path里有CMake的路径)。在用微软的CMake Tools时,我遇到了:

[proc] Executing command: "C:\Program Files\CMake\bin\cmake.EXE" --no-warn-unused-cli -DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=TRUE -Hc:/w/Tanks -Bc:/w/Tanks/build -G "Visual Studio 17 2022" -T host=x64 -A win32
[cmake] Not searching for unused variables given on the command line.
[cmake] -- Selecting Windows SDK version  to target Windows 10.0.19044.
[cmake] -- The C compiler identification is unknown
[cmake] -- The CXX compiler identification is unknown
[cmake] CMake Error at CMakeLists.txt:3 (project):
[cmake]   No CMAKE_C_COMPILER could be found.

可是MSVC v143已经安装了!CMakeOutput.log显示:

cannot open input file 'kernel32.lib'

这个kernel32.lib应该是从Windows SDK来的,难道必须安装这个庞大的SDK?这个missing lib看起来和上面的No CMAKE_C_COMPILER好像没关联?还是先试试法国人的CMake task吧(我加了 "group": "build",这样就不用"alt-t"=>选task,直接"ctrl-shift-b"=>选build。同样有错:

CMake Error: Could not create named generator 

可是task里已经设了:-G 'NMake Makefiles'。Debug了半天,原来是双引号惹的祸,而且args应该是给list,所以args line应该像这样:

            "args": ["-G \"NMake Makefiles\"", "-DCMAKE_BUILD_TYPE=Debug", ".."],

另外NMake Makefiles不支持toolset设置,如: -T host=x64 -A win32

如果看到错误:

CMake Error at CMakeLists.txt:3 (project):
  Running
   'nmake' '-?'
  failed with:
   The system cannot find the file specified

这是因为没有运行Visual Studio的环境变量设置,VS code找不到nmake可执行文件。

为了绕开诸多麻烦,我直接改了Makefile用cl直接build,然后就遇到问题:

 fatal error C1083: Cannot open include file: 'stddef.h': No such file or directory

 网上一查,Introducing the Universal CRT http://blogs.msdn.com/b/vcblog/archive/2015/03/03/introducing-the-universal-crt.aspx
"The headers, sources, and libraries are now distributed as part of a separate
Universal CRT SDK. This SDK is included with Visual Studio; it is installed by
default to C:\Program Files (x86)\Windows Kits\10."。看来还是必须安装Windows SDK,最新的Windows 11 SDK, another 2.27GB。装了Windows Kits(SDK)后,至少微软的CMake Tools可以成功生产build file。

@Update on Dec 29, 2021: 一番折腾后终于搞定CMake, 虽然不够完美。CMakeLists.txt文件已经push到forked的Tanks。上面提到的下载的SDL库和头文件要重新安排目录结构,排成和Linux的一样,就不需要改动任何源程序了,然后把所有的SDL文件放在根目录下SDL子目录,这样Makefile就可以用相对目录了。用CMake/NMake build:

  1. cd build
  2. cmake -G "NMake Makefiles" ..
  3. nmake
  4. manually copy all SDL dll file to build/out
  5. All done. Just run: build/out/tanks.exe


Wednesday, December 22, 2021

教小朋友编程之坦克大战 1

教小朋友编程是个任重道远的活,特别是当小朋友不热心学习,上课只是应付,希望混完时间好继续玩游戏。想让小朋友好好学,就要保证课程通俗易懂,又要好玩,小朋友最喜欢玩游戏。

 很多推荐从Scratch(麻省理工MIT创建的像搭积木式的流程编程)学起。Jon Woodcock写的《Coding Games in Scratch: A Step-by-Step Visual Guide to Building Your Own Computer Games》很不错,小朋友基本可以step by step一步步做下来,书中有少许bug或missing的地方可能要成人程序员的帮助才能解决,不过其中的几个小游戏还是很不错的。Scratch的问题是太过简单,对稍微大点的孩子能学到的编程知识非常有限。

就我个人看来,Python和Java是另外两个适合作为入门编程语言,Python尤为容易作为起步。教小朋友可以从游戏编程开始,比如Minecraft。Minecraft网站提供python-101,可能有些课件不是free的,可以参看David Whale, Martin O'Hanlon写的《Adventures in Minecraft》,同样有step by step的instruction,可以教小朋友Python的基本数据类型,程序逻辑等,很不错。

国内有提供Python教程以坦克大战为题,是个很好的题材。当年我们曾在游戏机上乐此不比的玩这个游戏(Tank 1990)。


我于是上网查了查,有人用C++编写了这个游戏并公布在Github,是基于C++11和SDL2 2D图形库。源程序很容易在Linux下编译运行,当我在Windows下运行时遇到了几个问题。在Windows上编译时,Makefile是针对MinGW设置的。我个人不喜欢在Cygwin上再安装MingW,所以决定改Makefile,直接用Linux的设置在Cygwin下编译运行,除了不用拷贝链接MingW的库,'-mwindows' option也没有什么作用。需要安装Cygwin SDL2 package: libSDL2-devel, libSDL2_ttf-devel, libSDL2_image-devel。奇怪的是编译后生成的可执行文件运行后,什么都没有发生。通过debug后发现,SDL_Init()返回-1,SDL_GetError返回 "No available video device"。Google结果是Cygwin下需要启动xserver,并设置DISPLAY=:0。此后终于可以在Windows下打坦克大战,只是没有声音。下一步看看怎么把声音加上,和怎样用Pygame来porting。