岁数越来越大,感觉所了解的做人的道理却越来越少。
生活复杂吗?生活需要纠缠于种种变化,需要交织于变化之中的人们。
变化无穷无尽,烦恼亦无穷无尽。
确定性让我们对生活能够精确把握,而在变化中,如何寻找一种确定性?
那就是要遵循生存的法则,坚持做人的原则。
原则不是顽固与执着,原则是生长的基础,是生存的边界。
原则能让事物变得简单,能让自己和身边的人睡得踏实。
原则不与清高相矛盾,原则只是界定了虚伪。
原则让自己不费脑筋,也让别人少伤脑筋。
岁数越来越大,感觉所了解的做人的道理却越来越少。
生活复杂吗?生活需要纠缠于种种变化,需要交织于变化之中的人们。
变化无穷无尽,烦恼亦无穷无尽。
确定性让我们对生活能够精确把握,而在变化中,如何寻找一种确定性?
那就是要遵循生存的法则,坚持做人的原则。
原则不是顽固与执着,原则是生长的基础,是生存的边界。
原则能让事物变得简单,能让自己和身边的人睡得踏实。
原则不与清高相矛盾,原则只是界定了虚伪。
原则让自己不费脑筋,也让别人少伤脑筋。
Docker镜像仓库在国内访问速度巨慢无比,感谢DaoCloud公司提供的稳定加速
镜像,具体的配置方法如下:
如果没有/etc/docker这个目录或者/etc/docker目录下没有daemon.json文件,手动创建即可。
将daemon.json的内容修改如下:
1 | { |
运行这两个命令:
1 | systemctl daemon-reload |
Ruby有着便捷强大的Gem包管理机制,作为五十年后人类使用最多的编程语言,有必要提前普及一下Ruby Gem的编写制作教程,帮助大家更好的使用Ruby,使用Gem,最好也能让Ruby的Gem库更加丰富,社区能够更加活跃。那么如何从零开始制作和发布自己的Gem呢?一起来动手操作一下。
制作和发布Ruby Gem包一共分如下几个步骤:
RubyGems.ORG 是一个大型的Gems仓库,你可以现在就加入它,贡献你的Gem。这一步想必无需多说,注册完成之后,你就拥有了属于自己的RubyGems帐号,别人就可以看到你的主页和你发布的Gems。
注册完成之后,你还需要将你的crendentials保存到本地,方便后续直接在命令行使用gem命令。运行
1 | curl -u 你的用户名 https://rubygems.org/api/v1/api_key.yaml > ~/.gem/credentials; chmod 0600 ~/.gem/credentials |
我们这次要发布的Gem叫做template_chorder,你也可以改名成任意你想要的名字。首先我们创建一个工程目录,我的目录名叫做GemTemplate,其中包含如下内容:
其中,template.gemspec是项目的描述文件,gem build命令会基于这个文件进行打包。
template.gemspec内容如下:
1 |
|
其中s.name就是将来这个包发布出去的名字。默认的,我们需要将工程的主代码放在lib目录里面,这是ruby的约定。我们的Gem只包含一个很简单的功能,只需要放置全部代码在一个文件当中即可。
lib/template.rb的代码如下:
1 | class Template |
就是这么简单。
在工程的根目录,运行
1 | gem build template.gemspec |
工程根目录将会产生一个 template_chorder-0.0.0.gem文件。
就是这么简单。
对于刚刚生成的template_chorder-0.0.0.gem,运行
1 | gem install template_chorder-0.0.0.gem |
来安装它。
安装好以后,就可以在irb解释器中引入和运行它了。完整的过程如下:
疑问
这里其实是有点疑问的,就是为什么gem的名字叫做template_chorder,而在irb中引入的却是template。确实,如果gem包中的文件取名不严谨的话,可能会与其他包产生冲突。至于如何消除冲突,请君自己先思考下。
卸载Gem包,运行 gem uninstall template_chorder
制作好这样一个不负责任的Gem包以后,就可以厚颜无耻地在RubyGems上发布它。但是为了社区的环境卫生清洁,尽量还是不要发布那些粗制滥造的包,就以此为戒吧。
发布Gem包,运行 gem push template_chorder-0.0.0.gem
,如果第1步当中的帐号注册和保存
crendentials文件都没有问题,那么包就可以发布出去了。
本文的包发布在:https://rubygems.org/gems/template_chorder
希望能够对你有所帮助。
又到了一年的末尾,自来南京以后,常常满怀仪式感地做某些事。像是每年一度的登栖霞山,以及每年一度的汤山,不定期去看长江,几年一度的登钟山。
今日又去了汤山。汤山位于南京的东郊,据说此地温泉极妙,蒋介石曾经在此整了个疗养院。如今的汤山,满满的商业气息。每至元旦,南方的天气湿冷,老中青成群结队来此中嬉戏。
此温泉我已经连续踏足过三届,每年都是和不同的人。去年是和大学舍友一起在元旦节当天去的。如今2018已经落幕,个人经验是元旦还是尽量不要去泡汤,元旦泡了汤的我的2018年,干什么黄什么。
这次去汤山,感觉人流量少了很多,上次去的时候,地下车库和地面上停了不少车,小杨生煎的队一直排到了门外,连吃口饭都困难。今天的小杨生煎,店铺里只坐了一半的人。与友笑道,莫非是消费真的降级了?连汤都不泡了吗。其实也有可能是,消费升级了,人们都去了更高大上的地方玩耍,只有我们这些LowB还继续流连这里,乐此不疲。
看到温泉的一处亭子上写着一副对联,下阕是“洗身容易洗心难”。我不太想说话。
年底了,总是有各种各样的新闻出来占据我们的视野。吴小波这两天又出来预测明年的经济。朋友圈各路人才对他褒贬不一,有的赞扬有的鄙视。而我觉得他书写的还算中肯,别的不了解,也不评论。
贸易战是要继续打下去的,本世纪异彩纷呈。昨天看了iPhone XR,居然连个3D touch都不带,老乔走了以后库克真是魅了良心。我作为无产阶级恐怕以后只能站在华为这一边。
明年,就是毕业第三个年头了!看看如今的自己,真的是不太满意啊。生命真的太无可奈何,太短暂了,我们甚至都没有足够的时间去好好感受它。以前总梦想自己在各个领域里牛逼,如今甚至觉得,能在一个领域里做出点成绩就已经很对得起这一辈子了。也许很多时候幸福来源于成就感,而成就在外界看来有大有小,有的人穷尽一生作出了一点客观上看起来很微小的成就,可是只要对于生命而言足够精彩,那就足够了。
就像是新闻里拾荒者攒钱赞助贫困大学生的例子,也许他用尽一生攒下的钱,还不如很多人买过的iPhone加起来的钱多,而他的一生,可能要比大多数拥有iPhone的人要精彩。那种用一辈子时间捡破烂,帮助很多人所获得的幸福和成就感,却是我们买iPhone所体会不到的。那种幸福感,可能就叫做信念吧。
今年,从年初就告诉自己,对自己要求少一点,本命年不宜大动,可还是跳了一次槽,搬了两次家。今年给自己的要求就是,花一年时间停一停,听一听自己内心的声音,搞清楚自己想要什么。搞清楚孰可为,孰不可为。就这样昏昏浑浑混了一年以后,其实多少算是想明白一些了。
跟有的人需要在一次很远的旅行中才想明白很多道理相比,我不同,我穷,所以不需要旅行就能想的很明白。
至于想明白什么,其实就是明白了舍弃,不能又想要熊掌,又想熊不想要你的手掌。
明白了人生短暂,光阴似箭,做自己想要做的事情,自己觉得对的事情,不要浪费时间。
要尽到做人、做儿子、做男人应尽的责任。
今日的汤山一行,沐浴过后,算是给过去的自己一个终结,给未来的自己一个新的开始。
悟已往之不谏,知来者之可追。实迷途其未远,觉今是而昨非。
以后,多读书,多写字,多做学问。做个独立思考的人,做个好人。
向着2019,出发!
1 | FROM debian |
完整的项目下载:
DVWA-Docker.tgz多进程示例:
multiprocess.rb1 | def test_proc(name,second) |
运行结果:
多线程示例:
multithread.rb1 |
|
运行结果:
关于多线程与多进程的区别此处就不再赘述了。
Python3中已经具备了非常完善的多线程与多进程的相关库,可以非常容易的实现程序多进程与多线程的功能。
示例代码如下:
多线程示例
multithread.py1 |
|
运行结果:
多进程示例
multiprocess.py1 |
|
运行结果:
VirtualBox虚拟机动态分配的虚拟磁盘用久了以后会变得非常大,相当占用空间。可以采用将磁盘闲置空间重新清零的方法,还原多余的占用空间。
第一步是采用zerofree(Linux)或SDelete(Windows)工具在虚拟机中将磁盘空闲区域清零:
Linux
在Linux虚拟机中,先安装zerofree,以Debian为例,执行 apt-get install zerofree
命令安装。
安装完成后,需要重启虚拟机机器进入Recovery模式,操作过程如下。
开机时进入Advanced options:
在Advanced模式中选择recovery mode:
在Recovery模式下登录后,依次执行以下命令清除/dev/sda1设备的闲置空间:
1 | busybox mount -o ro,remount /dev/sda1 |
其他磁盘设备同理。
Windows
如果是Windows虚拟机,可以在https://docs.microsoft.com/zh-cn/sysinternals/downloads/sdelete 下载微软官方的SDelete工具。
下载后解压并且进入SDelete目录,在CMD中运行SDelete.exe,并提供参数,例如清理C盘,则运行以下命令:
1 | SDelete.exe -z C: |
等待上述过程执行完成以后,可以进入第二步,在主机中回收虚拟磁盘闲置的空间:
进入Virtualbox的虚拟机目录,这里以一台Debian虚拟机为例,在目录中运行以下命令:
1 | "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" modifyhd Debian.vdi --compact |
C:\Program Files\Oracle\VirtualBox\是Virtualbox在Windows 64位系统中的默认安装位置,如果安装位置与此不同,修改即可。
等待执行到100%,即可完成磁盘回收。
磁盘回收的过程中有效数据不会丢失,可以放心操作。
使用aapt工具获取apk的信息,可以使用
1 | aapt dump badging xxx.apk |
如果没有aapt,使用apt安装:
1 | apt-get install aapt |
写个脚本批量获取
1 | #!/bin/bash |
脚本下载链接:
get_apk_name随着技术的发展,近年很多的网站、移动应用程序、微信小程序等等,采用前后端分离、使用JSON API数据传递这种方式来设计和开发。如此,前端程序可以保持独立、并且相对来说比较完整,后端程序逻辑复杂、性能强劲。前端可以有丰富的对数据的展现方式(图表、动画等等),后端也只需要完善相应的对模型的控制,同时输出一份前端所需要的数据,采用Ajax+JSON方式传递,从而让前后端的开发相对而言都更为轻松,在结构合理、技术完备的情况下,工程层面也能实现较大程度的规模上的突破。
Rails作为一种流行的MVC框架,本身在API的开发上已经有了很成熟的配套设施了。Rails的模板支持.json.jbuilder形式的JSON数据渲染,配合jbuilder从模型对象数组直接创建JSON数据,在开发上有着无与伦比的便利。在此之前,如果使用php开发程序,从数组创建JSON,需要先整理好数组,再json_encode(Array)进行输出,很是麻烦。当然身为PHP程序员的你可能要说,PHP也有很强大的API构建框架,可以很方便的构建出健壮的API,是的,我承认有这些框架的存在,只是限于本人的水平和喜好,在PHP开发方面并没有走的那么深远,也就不熟悉其中的一些高级操作了。如果有兴趣,也可以发邮件就这方面进行一些探讨。
近期由于一个项目的需要,需要从已有的Rails应用中开辟出一个新的独立接口,供客户端程序调用,因此学习了一下Rails API的构建方法,也顺便留下此文,作为记录。关于Rails API的构建,我参考了这篇文章 https://blog.csdn.net/li_001/article/details/65937664
以下就是如何使用Rails构建JSON API
我当前采用的环境是 Ruby 2.4.1 + Rails 5.2.0
首先假设我们的应用已经创建好了,并且建立一个Article模型,包含两个字段,title和content,运行迁移并创建种子数据。
此时进入项目根目录,新建一个控制器:
1 | rails g controller api/v1/base --no-assets |
这个控制器的代码就会位于app/controllers/api/v1/base_controller.rb,我们需要在其中完善一些权限有关的配置。
由于Rails默认的安全属性,以及我们如果之前自定义了一些控制器中的过滤方法,我们需要在该控制器中跳过它,例如我们首先禁用rails自带的CSRF 保护和CSRF token的输出,以及去除掉返回包中的set-cookies头,由于我的应用还使用了devise作为用户认证的模块,所以还要在此禁用掉authenticate_user方法。
完整的代码如下:
1 | class Api::V1::BaseController < ApplicationController |
创建好base控制器以后,我们需要在这个控制器的基础上派生出一些新的控制器,这里我们新建一个articles控制器
1 | rails g controller api/v1/articles --no-assets |
此时除了会生成控制器代码以外,还会在app/views/api/v1目录下创建articles目录,作为模板存放的目录。
articles控制器的代码位于app/controllers/api/v1/users_controller.rb,内容如下
先在其中定义一个show方法:
1 | class Api::V1::ArticlesController < Api::V1::BaseController |
接下来我们对路由config/routes.rb进行配置
1 | namespace :api do |
articles控制器的视图代码位于app/views/api/v1/articles/,我们在其中建立show.json.jbuilder文件,内容如下:
1 | json.article do |
上面这段代码,是jbuilder建立json的语句代码,至于jbuilder的用法,可以参考这篇文章http://ohcoder.com/blog/2015/04/19/jbuilder/
启动Rails程序,访问/api/v1/articles/1.json,即可看到接口输出的JSON数据。
除了从接口获取JSON数据以外,我们还需要向接口POST JSON数据,并希望接口实现数据的解析和保存。
首先像往常一样,需要在控制器中创建create方法,用于新建数据:
1 | def create |
呵呵,一行代码,是的,就这么简单。
而article_params,则是个私有方法,大概需要这样实现:
1 | def article_params |
在客户端(或网页中)向该接口发送数据,地址是/api/v1/articles
发送的数据类似下面这样:
1 | { |
直接发送这条数据可能会出错,因为在请求的时候需要带上json格式描述
1 | Content-Type: application/json |
完整的POST请求,参考下:
1 | POST /api/v1/articles HTTP/1.1 |
Update your browser to view this website correctly. Update my browser now