读书 & 那些或许会消失的美文《浪花集》

翻看几十年前的日记本,发现那时候有个爱好:剪报。也就是说收集报刊杂志中的有意思内容,比如说优美的句子等等。当然,那时候不懂得珍惜,除了剪报还剪书,用现在的话说那就叫败家子。


(图源 :pixabay)

我的日记中贴满来自报纸或者书刊的发黄发旧的纸张,一段段美文就好似一幅幅图画,每幅图画都是一段闪亮的记忆。

突然发现一段《浪花集》,这一小篇纸来自一本很老旧很老旧的书上。当时我从旧书堆里找到这本书时,它已经残旧不堪了,但是里边的每一篇文章都深深地吸引着我,毕竟那是一个文化匮乏的年代。

然后,这本珍贵的旧书,就惨遭我的毒手了,除了留下王统照的《烈风雷雨》就是这段《浪花集》了。很多年前,我在网上搜索《烈风雷雨》时,还找不到只言片语,现在再搜,已经可以搜索到很多相关内容了,但是我用浪花集中的句子去搜索,却了无踪迹。

这些珍贵的文章,如果没有人肯贴到网上,没有人肯传播,或许就将会永远的消失了。毕竟没有谁无聊地翻这些老书,或者有几个败家子能把这些经典的段落剪报,并且在几十年后再翻看。

那么既然我翻到这里,就将这篇美文敲出来,以免它消失吧。


(图源 :pixabay)

以下为手打摘抄内容:

《浪花集》

作者:水晟

1
春天的美好难道仅仅是因为它清风柔和,阳光明媚,柳丝垂金,鲜花娇美?不!更由于它生长着未来的希望,充满着蓬勃的生机,孕育着金色的收获,焕发着无限的活力。

青春,不正象这春天吗?青年朋友,请真正理解青春的含义!

正值妙龄,赶快把理想的种子播撒;精力充沛,赶紧为事业的大厦奠基;风华正茂,赶快把光明的未来设计;血气方刚,赶紧把远行的道路开辟!

2

勤奋——打开文化宝库的钥匙,攀登科学高峰的阶梯,点燃智慧之炬的火种,攻克知识堡垒的锐器。它既是天才的摇篮,也是成就的母体。年轻的朋友啊,如果你真想有所作为,请勤奋、勤奋、再勤奋,千万不要吝惜劳动的汗水。

3

要想人生之树充满生机、茁壮成长,你就必须象青松那样顽强,迎风沐雨、挺拔向上。

要想理想之花艳丽夺目、喷吐芳香,你就必须象腊梅那样顽强,不畏严寒、凌冰怒放。

要想在知识的天空中采星撷月、探索宝藏,你就必须象雄鹰那样顽强,搏击风云,振翅翱翔。

要想在事业的大海上扬帆启程、飞浆远航,你就必须象海燕那样顽强,不畏风暴,勇闯骇浪。

原文中多处“”,应为“”,为了不改变原文面貌,我不做修改,仅在此处标记出来。


(图源 :pixabay)

这么美,又这么励志的文章,怎么能忍心让它消失呢!


This page is synchronized from the post: 读书 & 那些或许会消失的美文《浪花集》

温故而知新:复习一下字符编码(ASCII、GB2312、Unicode、UTF-8、区位码)

在以前工作的项目中,没少和字符编码打交道。

在做手机短信相关的项目时,发送中文短信需要将GB2312的编码的字符按照UNICODE编码打包到PDU中,很多年前单片机上没有系统或者只有很简陋的系统,那时候我们采取的是查表映射的方法。

在做液晶屏相关的项目时,对于包含字库的控制芯片,要在液晶上显示文本等信息,我们的做法是自已生成一个按区位码汉字点阵库,然后程序读取点阵信息再在液晶屏上对应的位置按点阵信息点亮或者熄灭对应的点来达到显示汉字的目的。

那么什么ASCII、GB2312、Unicode、UTF-8、机内码又都是些啥,都有些啥关系呢?反正每次项目用到的时候,我都搞得挺明白的,然后过段时间又忘得干干净净,比如我如何去我自己实现的汉字库中读取一个汉字的点阵出来呢?

每每这个时候,我就要陷入到深深的思索当中,然后把这些信息通通在脑子里过一遍,然后过段时间,再忘掉它😳。于是我决定简单的回忆和记录一下,下次再用到,我翻这篇文章就可以了,真聪明啊。

ASCII

ASCII即American Standard Code for Information Interchange(美国信息交换标准代码)。

ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符。标准ASCII 码也叫基础ASCII码,使用7 位二进制数(剩下的1位二进制为0)来表示所有的大写和小写字母,数字0 到9、标点符号, 以及在美式英语中使用的特殊控制字符。

对于人家老美而言,有这套编码似乎就足够了,什么大小写字母、数字、标点全不在话下,但是到了中国和日本等国家,我们使用计算机就面临一个艰难的抉择,要么就是全用英文不再计算机上使用方块字,要么就是弄一套自己的编码。幸好,在计算机科技发展初期,国人没犯懒,否则可能我就没法在STEEMIT上用中文写文章了。

GB2312 / 区位码 / GBK

既然ASCII只能存储西文字符,那么如果要编码中文汉字啥的咋办?128个或者256字符显然不够,小学生现在都要掌握几千汉字呢。所以早在80年代,中国国家标准总局就发布了《信息交换用汉字编码字符集》,也就是GB 2312—1980。

这套编码用两个字节来表示对应的符号,将所有带编码字符(汉字6763个和非汉字图形字符682个)分成94个区每个区有94位,每个字符占一个位。你可以将区和位想象成一个94X94的表格,每个格内放一个字符,用区号和位号可以定位到字符,这就是区位码

将区号和位号分别加0xA0,并放入两个字节,就是我们通常说的GB2312编码(也叫EUC-CN表示法,这样做的目的是为了便于兼容ASCII。

说到GB2312,又不得不提一下GBK编码,GBK即《汉字内码扩展规范》(GBK即“国标”、“扩展”汉语拼音的第一个字母,英文名称:Chinese Internal Code Specification)。

GBK 向下与 GB 2312 编码兼容,向上支持 ISO 10646.1国际标准,是前者向后者过渡过程中的一个承上启下的产物。ISO 10646 是国际标准化组织 ISO 公布的一个编码标准,即 Universal Multilpe-Octet Coded Character Set(简称UCS),大陆译为《通用多八位编码字符集》,台湾译为《广用多八位元编码字元集》,它与 Unicode 组织的 Unicode 编码完全兼容。

Unicode

无论是GB2312也好还是后来的扩展GBK也罢,显示汉字甚至日文平假名片假名等都毫无压力,但是如果藏文呢?蒙古文呢?还有其它一些国家乱七八糟的文字呢?总不能英语和汉语一统江湖吧?

当然了,对于别的国家会有类似GB2312的编码出现,所以我们计算机设置语言的时候要有一个非UNICODE编码识别成啥语言,否则它不清楚对于一段代码是识别成蒙古文好呢?还是泰国文字好呢?

这时候,Unicode出现了,你看这个名字就霸气,大统一编码。也就是说它的编码囊括事业上所有语言的所有的字符,这样因为两个不同的字符不会出现相同的编码,就不会打仗不会乱码了。

确切地说,Unicode是包含字符集、字符编码在内的全套标准,而UTF-8、UTF-16、UTF-32、UCS-2等则为编码方案。

通常我们程序中提到用到的Unicode编码都指的是UCS-2,也就是将字符编码到两个字节中,但是呢,它过时啦。

UCS-2 uses two bytes (16 bits) for each character but can only encode the first 65,536 code points, the so-called Basic Multilingual Plane (BMP). With 1,114,112 code points on 17 planes being possible, and with over 137,000 code points defined so far, many Unicode characters are beyond the reach of UCS-2. Therefore, UCS-2 is obsolete, though still widely used in software. UTF-16 extends UCS-2, by using the same 16-bit encoding as UCS-2 for the Basic Multilingual Plane, and a 4-byte encoding for the other planes. As long as it contains no code points in the reserved range U+0D800-U+0DFFF, a UCS-2 text is a valid UTF-16 text.

UTF-8是比较常用的编码方案了,尤其是在网络上传输数据时。

从Unicode到UTF-8的编码方式如下:

所以尽管它后边带个8,但是它的长度是不固定的,也就是说是变长编码。对于ASCII字符而言,按上述规则编码出来的UTF-8编码与ASCII完全相同,只占一个字节。在网络上传输数据时,这种编码方案会更加节省网络流量。

区位码

在GB2312条目下,我已经介绍了区位码。之所以在单独提出来,是想回到当初的问题:“我如何去我自己实现的汉字库中读取一个汉字的点阵出来呢?”

因为我的点阵库是按区位码放置,除了界面上的设置外,我们还可以点设置按钮进行一些设置:

知道了这些,那么我们传入一个汉字,首先获得它的GB2312编码,然后根据区位码的规则计算出区位,在根据汉字点阵的长宽计算出每个汉字点阵的字节,根据区位、单个点阵字节数,计算出对应点阵在点阵库中的偏移量,取出对应字节即可。

至于横向纵向,倒序正序我是时常迷糊的,不过这个好办,显示的汉字颠倒了,我再改程序即可😀

文章为个人理解,错漏难免,仅供参考

参考资料


This page is synchronized from the post: 温故而知新:复习一下字符编码(ASCII、GB2312、Unicode、UTF-8、区位码)

读书 & 秦雪梅——观文

4月23日是“世界图书与版权日”,网上网下都掀起轰轰烈烈的读书行动,我说朋友圈最近这个多晒读书的呢。可惜最近除了读一本余华的《活着》就在没读过啥书,而《活着》读得我十分压抑。

当然了,什么《Python编程》、《C++ Primer Plus》应该也算读书,不过估计我晒朋友圈有可能会被打死。


(图源 :pexels)

说到读书,劝人读书的名句很多很多,比如“读书破万卷,下笔如有神”、又比如“非学无以广才,非志无以成学”、又比如“书到用时方恨少,事非经过不知难”、又比如”万般皆下品,唯有读书高”、又比如“书卷多情似故人,晨昏忧乐每相亲”等等等等,不胜枚举。

不过我最喜欢的还是: 书中自有黄金屋,书中自有颜如玉。 为啥喜欢这句呢?因为其它的名句都太过于抽象,比如唯有读书高,那么到底咋个高法?而“书中自有黄金屋,书中自有颜如玉”则简单粗暴,黄金屋代表财富和事业,颜如玉代表美女和爱情,只要读书,啥都有了,夫复何求?咳,我的黄金屋呢?我的颜如玉呢?


(图源 :pexels)

不过说到劝学劝人读书,我印象最深的是豫剧《秦雪梅》的一段唱词,不过我不是什么豫剧、京剧、评剧啥的爱好者,只不过很久很久很久以前恰巧在杂志上看到这段唱词,摘录到笔记本上,一直保存至今。

我劝你读书图强发奋,切不可荒嬉虚度光阴。
你时时要想到处境艰难,莫忘耻,莫忘贫,莫忘婚姻。
夜以继日力求上进,学而习,习而学,日异月新。

大比年登榜琼林宴饮,一声平地响,近远皆闻。
那时节你荣耀,亲友也沾润,我的父他见你比今日更亲。
咱成一对好鸳鸯,永不离分。

倘若你读书不成,功名无份,瞻前途不堪想徒叹终身。

莫怨天,莫怨地,莫怨命运,莫垂头,莫丧气,莫要灰心。
人定胜天有古训,成败得失在于人。
把我的金石牢牢记住,你千万莫辜负我的一片痴心。

你看,好好读书,考上好大学,光宗耀祖,然后搞对象也容易了。反之名落孙山就麻烦了。这段书馆功夫,说功利吧,有些功利,不过到也是现实。所以,青年才俊们,都好好读书吧。


(图源 :pexels)

我也要抽时间把《格林童话》《安徒生童话》等世界名著好好读读啦,看看能不能找到黄金屋和颜如玉。😀


This page is synchronized from the post: 读书 & 秦雪梅——观文

每天进步一点点:终于搞定了libcurl Windows下编译

在昨天的帖子每天进步一点点:C++ 中使用libcurl 获取返回数据的学习中,大致学会了怎么用libcurl 向网站POST或者GET数据,以及如何将返回数据存储到变量。


(图源 :pixabay)

今天突发奇想,在Windows下测试一下嘛。结果一下子掉坑里了,一整天都在晕如何在Windows下编译。研究了一大堆网页,迷糊到爆炸的时候,才发现人家官方就有Windows下编译指南,我这一天干得都啥事啊。尽管如此,操作起来还是很麻烦,踩了一堆坑,记录如下,备忘以及供需要的朋友参考吧。

步骤

下载源码

首先去github的对应页面下载curl代码,至于在Windows下你是用的git还是直接下我就不管啦,我直接下的zip.

下载好了之后,解压zip文件。

启动编译工具

在开始菜单中查找: ‘Developer Command Prompt for VS \

比如我安装的是VS2015,那么对应的工具就是:’Developer Command Prompt for VS2015’,启动它,进入命令行窗口。

进入我们解压好的目录,比如我这里:
cd C:\Users\oflyhigh\Downloads\curl-master\curl-master

执行 buildconf.bat

Github的编译文档中没有提到这个,但是这个步骤和重要,否则编译时会出如下错误:

Copying libs…
NMAKE : fatal error U1073: don’t know how to make ‘..\src\tool_hugehelp.c’
Stop.
NMAKE : fatal error U1077: ‘“C:\Program Files (x86)\Microsoft\Visual Studio 14.0\VC\BIN\nmake.exe”‘ : return code ‘0x2’
Stop.

编译

进入到winbuild目录
cd winbuild

执行编译指令:
nmake /f Makefile.vc mode=static DEBUG=no VC=14 MACHINE=x86

有关编译指令的选项说明请参考:
https://github.com/curl/curl/blob/master/winbuild/BUILD.WINDOWS.txt

对于上述指令而言,编译静态库,关闭调试,目标机器X86,编译工具版本为VC14

测试

编译成功后,我们会在项目目录下生成
builds\libcurl-vc14-x86-release-static-ipv6-sspi-winssl目录,其中包含如下内容:

分别是可执行文件、头文件以及静态库。

然后我们来测试一下我们编译出来的curl.exe是否好用,来试试读取创世块:

curl.exe --data "{\"id\":1,\"jsonrpc\":\"2.0\",\"method\":\"call\",\"params\":[\"database_api\",\"get_block\",[1]]}" https://api.steemit.com


一切正常!

参考文件


This page is synchronized from the post: 每天进步一点点:终于搞定了libcurl Windows下编译

扁担钩与刀螂

上午外出办事,看到路边公园的草地上年轻的妈妈带着孩子拿着精致的网兜捕蝴蝶玩,很温馨很有爱。不由得想起小时候的一件趣事。


(图源 :百度图片)

小时候家里条件一般,总之不像现在的孩子都有很玩具,所以父母时不时地从大自然中给我找点好玩的东西。在我还是很小很小很小的时候,印象里应该不超过4周岁,有一天妈妈给我抓到一只扁担钩,应该是蚱蜢的一种,但是细长细长的。小时候有段童谣:扁担钩挑水,蚂蚱煮饭。三叫驴摊鸡蛋,请蝈蝈来吃饭,里边的扁担钩就是这种昆虫。

拿到扁担钩后我觉得很新奇,用小手抓着它玩,它爬开,我再抓回来,玩得不亦乐乎。然后我幼小的心灵中就认定这是一种很友善很好玩的小东西。可惜玩了不一会,它翅膀一张,就飞跑了,我怎么也没追上,哇哇大哭。

但是妈妈有好多事情要忙,去院子里看一圈没有扁担钩的踪迹,把我哄得不哭了,就忙其它事情去了。之后的几天我都在心心念着我的扁担钩,可是再也不见它的踪迹。


(图源 :百度图片)

有一天下午,我在院子里自己玩耍,突然发现菜地的一根韭菜的叶子上,趴着一个似曾相识的东东,咦,这不是我的扁担钩嘛,只是脑袋从尖尖的变成了倒三角、肚子变得有些大、还有两个胳膊变得更加粗壮了。

尽管我的“扁担钩”变化有些大,但是我依然幼稚地认为我的小扁担钩又飞回来了。于是我轻轻地上前,把它一把抓到手里。然后,然后我的小“扁担钩”毫不客气的回头挥着它粗壮的胳膊给了我一下,顿时我的小嫩手出现一道红印子,有的地方渗出了血珠。

那疼的叫一个刻骨铭心啊,疼得我哇哇大哭。我也顾不得我的扁担钩为什么会袭击我了,之前它是那么的友善,咋变这么粗暴了呢?伤心、失望加上疼痛,就是一个哭啊。

爸爸当时正好在家,听到我哭得这么凄惨赶紧出来看。然后指着还没有逃逸的罪魁祸首告诉我这是刀螂,不是扁担钩,让我看刀螂的两个前臂,问我像不像两把大刀,而且大刀上还带有尖锐的锯齿,难怪被它砍一下那么疼。

然后爸爸给我演示了如何抓刀螂,从它的后边,用两指轻轻夹住它的脖子,就把它抓起来了。刀螂使劲挣扎,企图用它的大刀砍爸爸的手掌,然而无论如何也砍不到。

爸爸将刀螂放回韭菜叶上,让我试着去抓,我是说什么也不抓了。



(图源 :pixabay)

被小刀螂伤害,让我幼小的心灵中一直畏惧刀螂,直到我上了初中之后,才敢对刀螂下手,才觉得它一点也不可怕。现在回想起来这段往事,觉得充满温情,充满父母对我的爱。就像带孩子捕蝴蝶的年轻妈妈,尽管父母没给我买过精致的网兜,没领我捕过蝴蝶,但是他们对我的爱,不差分毫。


This page is synchronized from the post: 扁担钩与刀螂

每天进步一点点:C++ 中使用libcurl 获取返回数据的学习

最近使用学习在C++中使用libcurl,不得不感概PHP是世界上最好的语言,PHP用curl那叫一个省心。Python用起来就要略复杂了,详情可以看我之前的学习笔记《每天进步一点点:Python中使用PycURL访问STEEM RPC》。不过嫌弃PycURL麻烦的可以换Requests等其它库。

但是C++使用libcurl 呢?哎,全是泪水。


(图源 :pixabay)

POST、GET

其实libcurl简单的POST、GET操作还是很简单的

可以参考以下链接:

以POST操作为例:

大致就是初始化、设置参数、执行、清理四个步骤。运行上述代码,我们也可以看到POST的返回内容。但是等等,内容是咋返回的呢?

libcurl 返回数据

默认至stdout

为了找回数据是咋返回的,我搜索了一些文档,不过还是看的迷迷糊糊的,知道我看了这两个页面:

其中CURLOPT_WRITEDATA的说明中提到:

By default, this is a FILE * to stdout.

也就是说数据默认输出到标准输出。这就解释了上述GET、POST示例中并没有使用cout、printf一类的输出操作,我们却可以看到内容。

保存至变量

接下来的问题是,如何将我们要的输出数据保存到变量呢?一种方法是CURLOPT_WRITEDATA中的文件指针换成我们自己的文件,然后输出到文件,(再读回来),如果是下载文件等操作,这种方法还是很便利的。但是如果我们需要在程序中处理数据呢?再读回来的操作显然很傻。

答案是使用CURLOPT_WRITEFUNCTION以及CURLOPT_WRITEDATA,当我们设置了CURLOPT_WRITEFUNCTION,每次我们收到数据后,这个回调函数将会被调用。

size_t write_callback(char *ptr, size_t size, size_t nmemb, void *userdata);
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_WRITEFUNCTION, write_callback);

其中ptr是我们收到数据的指针,数据长度为size*nmembuserdata是由CURLOPT_WRITEDATA设置的变量,操作方式如下:

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_WRITEDATA, void *pointer);

使用CURLOPT_WRITEFUNCTION需要注意以下几点:

  • 回调函数可能被调用不止一次,换句话将数据可能不是一次性返回的
  • 每次返回的数据长度为:size*nmemb
  • 回调函数需要返回接收数据的长度,否则会引发CURLE_WRITE_ERROR

我在这三点上都栽过跟头,希望大家注意别犯和我一样的错误。

保存到变量的例子

libcurl的例子页面,提供了一个将返回数据保存到变量的例子

Shows how the write callback function can be used to download data into a chunk of memory instead of storing it in a file.

例子中定义一个包含指向内存的指针变量,以及接受到的数据长度的变量,然后使用molloc以及realloc以及memcpy来操作内存。这样每次回调函数被调用就会自动计算需要的内存,动态分配,然后复制数据。

这个例子使用了C语言的一些手法来达成这个目的,相对而言比较复杂,需要我们自己管理以及释放内存等。对于文本数据而言,使用string还是超方便的,这里就不再赘述了。

参考链接


This page is synchronized from the post: 每天进步一点点:C++ 中使用libcurl 获取返回数据的学习

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×