Antkillerfarm Hacking V7.0

C#, Lisp, Kotlin, Lua, Haskell, Objective-C, Vim

2020-05-03

C#

XmlReader

XmlReader是.NET中处理XML的类。之前的W3C已经提出了DOM和SAX两种模型。作为最早的模型,这两种模型在各种语言中都有相应的实现,关于它们的讨论也有很多,在此不再赘述。

XmlReader是一种快速、无缓冲、向前并只读的轻量级XML引擎,在这一点上它和SAX是相同的。它和SAX的主要区别在于它们的设计模式是不同的。SAX是push模式的XML引擎,它会在读到相应的节点时,触发消息并将之发送给调用程序。而XmlReader则是pull式的XML引擎,它更符合人们的通常的对文件顺序处理的习惯。当然除此之外,它还有其他的好处。参看MSDN的相关章节。

通常情况下,pull模型比push模型的效率高,但push模型的灵活性要高些。例如,Dos下的编程主要是一种顺序执行的pull模型结构,而Windows下的编程则是一种基于消息的push模型结构。所以,读取特定标签内容的XML文档,采用XmlReader比较好,而对于那些结构不固定或需要遍历的XML文档用SAX较好。

PS: XmlReader提出的pull方案,后来被libxml2采用,成为了GTK+的一部分。

Microsoft.WindowsCE.Forms

这是一个Wince的类。由于.NET CF中的System.Windows.Forms.Form没有DefWndProc参数,所以要想接收窗体消息就要用到它。不过它的dll需要自己添(在.NET CF的安装路径下可以找到这个Microsoft.WindowsCE.Forms.dll),接收C++编程时的那些WM_开头的消息时需要用到这个模块中的MessageWindow类。

代码示例如下:

public class MsgWindow : MessageWindow
{
    public const int WM_CUSTOMMSG = 0x0400+3333;
    
    private Form1 msgform;//Form1是用于接收消息的那个窗体Form。
    public MsgWindow(Form1 msgform)
    {
        this.msgform = msgform;
    }
    protected override void WndProc(ref Message msg)
    {
        switch (msg.Msg)
        {
            case WM_CUSTOMMSG:
                //do sth
                break;
        }
        base.WndProc(ref msg);
    }
}

C#中的发布功能

C#项目属性中有个publish标签是关于发布程序的功能的。用过Java的人都知道,Java的可移植性是很不错的,但Java程序的部署相对于一般 的本地程序来说就显得比较麻烦了。至少在本人的程序生涯中,就多次经历拿着JAR文件兴冲冲的跑去,却发现目标机没有JRE的情况。

C#中的发布功能除了能打包程序和.NET Framework之外,还有网络发布的功能。这里我主要讨论单机程序的打包。如果只有程序文件的话,情况比较简单,没什么难度。如果还有数据文件的话就 要注意了。在程序文件(Application Files)对话框中,每个文件有一个发布状态(Publish Status)的属性,如果你希望数据文件和程序文件在同一个文件夹下的话,最好选择包含(Include)而不是数据文件(Data File),后者会把你的数据文件部署到一个专门的数据文件夹下,这个文件夹可用 System.Deployment.Application.DataDirectory获得。

Mono

.NET的跨平台一直不咋样,直到2014年MS推出的.NET core才有所改观。虽然.NET core可以开发C#应用,然而仅仅局限于非GUI的应用,所以目前更推荐使用Mono方案。

Mono早先是Xamarin推出的跨平台.NET替代项目,目前已经被MS收购,按照MS的路线图,Mono将作为非Windows平台的.NET方案而存在。它将和Windows平台的.NET方案共用.NET core的代码。

官网:

https://www.mono-project.com/

Mono有个IDE,叫做MonoDevelop。

官网:

https://www.monodevelop.com/

安装方面,尽管ubuntu的仓库已经有了Mono,但是却没有MonoDevelop,且该Mono版本与最新的MonoDevelop不兼容,因此还是老老实实采用官网的方案安装吧。

参考:

https://www.cnblogs.com/shanyou/p/4295163.html

.NET Core与.NET Framework、Mono之间的关系

https://www.cnblogs.com/wer-ltm/p/8776846.html#!comments

.NET:持续进化的统一开发平台

https://mp.weixin.qq.com/s/j5PFEkWd49SNKVdlWoqHiw

.NET Core很酷,你不得不知!

gtksharp

安装:

sudo apt install gtk-sharp3

编译:

mcs helloworld.cs -pkg:gtk-sharp-3.0

https://www.mono-project.com/docs/gui/gtksharp/hello-world/

gtksharp

NuGet

NuGet是C#项目的包管理工具,作用类似maven、pip。

官网:

https://www.nuget.org/

参考

https://www.zhihu.com/question/20451584

Java和C#最大的不同是什么?

https://blog.csdn.net/dodream/article/details/4719578

CLR、CLI、CTS、CLS的关系

https://www.zhihu.com/question/576573706

C#有方法可以直接编译成机器语言运行吗?(NativeAOT)

Lisp & GUI

客观的说,目前开源领域并没有很好用的和Lisp配套的GUI工具集,几个开源实现要么完工度不高,要么过于古老,好几个的样式都是90年代中期的风格。

更有人指出,GUI基本上是OO语言的天下了,Lisp根本不适合干这个事。

不过事实的真相是:

1.最早的交互式GUI生成工具是用Lisp写的。没错,就是苹果乔教主旗下的Interface Builder,时间是1986年。

2.PTC公司的CAD系统是用Lisp和C++写的。

3.苹果公司早期使用MCL作为GUI开发语言(from 1984),因此那个时代有大量的程序是用Lisp写的。包括Mac上最早的MS Word。Objective-C是乔教主到NextStep之后的事,最初和苹果并无交集。

4.由于Mac在艺术家群体的流行。很多音乐软件是用Lisp写的,包括Open Music, PWGL, ScoreCleaner, Igor Engraver和Symbolic Composer等。

5.有家叫做LispWorks(From 1989)的公司提供对Lisp GUI的商业支持,而且提供的界面并不逊色于GTK、Qt等当代GUI工具集。上面提到的音乐软件基本上都是基于LispWorks的。

综上可见,Lisp开发GUI不是可能性的问题,而是一个有待重新发掘的问题。

Kotlin

Kotlin是一门编程语言,由JetBrains公司开发,与Java 100%互通。

官网:

http://kotlinlang.org/

官网文档:

http://kotlinlang.org/docs/reference/android-overview.html

国内中文文档:

https://huanglizhuo.gitbooks.io/kotlin-in-chinese/content/

国内中文文档2:

http://www.liying-cn.net/kotlin/docs/reference/

国内中文文档3:

https://www.kotlincn.net/

官方示例:

https://github.com/Kotlin/kotlin-examples

Lua

Lua的包管理工具叫做LuaRocks。官网:

https://luarocks.org/

参考:

https://mp.weixin.qq.com/s/nwhSDxz1Pu2JCU_IeMR9ww

Lua程序逆向之Luac文件格式分析

http://lua-users.org/wiki/GraphicalUserInterfaceToolkits

Lua的GUI工具列表

https://mp.weixin.qq.com/s/BFIBTkdHAy38FiNGiuLYbQ

深入理解Lua虚拟机

Haskell

官网:

https://www.haskell.org/

Haskell主要有两套包管理系统cabal和stack,它们的仓库都是一样的,只是前端语法不同。stack相对比较新,也是目前的首选。

Haskell的官方仓库:

http://hackage.haskell.org/

清华镜像:

https://mirrors.tuna.tsinghua.edu.cn/help/hackage/

Haskell的安装有多种模式,推荐Stack模式,直接使用Stack安装所需要的依赖。

Stack的官网:

https://www.haskellstack.org/

然而国内访问不了,幸好有github:

https://github.com/commercialhaskell/stack/releases/

Objective-C

环境搭建

PC上搭建Objective-C(以下简称OC)开发环境,主要借助GNUstep开源项目的成果。

以Ubuntu为例,步骤如下:

1.安装软件包。

sudo apt install gnustep-devel libjpeg-dev libtiff5-dev gobjc-4.9

2.设置环境变量。

GNUSTEP_MAKEFILES=/usr/share/GNUstep/Makefiles

Vim

模式

普通模式:使用vim打开一个文件时默认模式,也叫命令模式,允许用户通过各种命令浏览代码、滚屏等操作。

插入模式:也可以叫做编辑模式,在普通模式下敲击 i 、a 或 o 就进入插入模式,允许用户通过键盘输入、编辑。

命令行模式:在普通模式下,先输入冒号:,接着输入命令,就可以通过配置命令对vim进行配置了,如改变颜色主题、显示行号等,这些配置命令也可以保存到/etc/vim/vimrc配置文件中,每次打开默认配置执行。

可视化模式:在普通模式下敲击前盘上的 v 键,就进入可视化模式,然后移动光标就可以选中一块文本,常用来完成文本的复制、粘贴、删除等操作。

替换模式:如果我们想修改某个字符,不需要先进入插入模式,删除,然后再输入新的字符,直接在普通模式下,敲击R键就可以直接替换。

EX模式:类似于命令行模式,可以一次运行多个命令。

用户统一使用ESC键返回到普通模式。

常用操作

dd: 删除整行

/是向下查找,而?是向上查找,n是继续查找。

u——撤销上一个编辑操作

:set nu: 显示行号

:行号: 跳转到行号

yy: 复制整行

p: 粘贴

分栏显示

vim -on file1 file2 ...:上下分屏。n为分屏个数。

vim -On file1 file2 ...:左右分屏。

:new——创建一个空白分栏界面,和原文件窗口上下排列。

:split——将当前文件分成上下两栏显示。

:vnew:vsplit——功能相同,不同的是新窗口是左右排列的。

:only——取消分屏。

按下ctrl+w之后再利用方向键或者h,j,k,l可以选择当前激活的窗口。

把光标移动到下一个的屏:ctrl+w w

把光标移动到上一个的屏:ctrl+w p

关闭其他窗口:Ctrl + w, o

关闭当前屏:Ctrl+w,c

:vertical diffsplit file2——垂直对比两个文档。

NeoVim

NeoVim是Vim的派生品,以及最有力的竞争者。

参考

https://mp.weixin.qq.com/s/k5zdN0rJtVBSVMK4_6g5Bw

年仅62岁!开源巨擘“Vim之父”因病离世,一生写下Vim传奇

https://mp.weixin.qq.com/s/5694PDHy9BeoL8qy31MaxQ

如何用vim格式化代码

https://mp.weixin.qq.com/s/QpJWyLY5AyrXGF-j7LYTGg

1700页数学笔记火了!全程敲代码,速度飞快易搜索,硬核小哥教你上手LaTeX+Vim

https://mp.weixin.qq.com/s/tvn2SKXyrZZRGDF6-Myx3A

Vim激荡30年发展史

https://mp.weixin.qq.com/s/c9KAOJ6Z_5zjwI7C3OMq4w

5分钟学会Vim分屏操作方方面面

https://www.runoob.com/linux/linux-vim.html

Linux vi/vim

https://zhuanlan.zhihu.com/p/37352209

VimScript五分钟入门

Fork me on GitHub