Docker镜像仓库在国内访问速度巨慢无比,感谢DaoCloud公司提供的稳定加速
镜像,具体的配置方法如下:
1. 修改 /etc/docker 目录下的daemon.json
如果没有/etc/docker这个目录或者/etc/docker目录下没有daemon.json文件,手动创建即可。
将daemon.json的内容修改如下:
1 | { |
2. 重启Docker服务
运行这两个命令:
1 | systemctl daemon-reload |
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
希望能够对你有所帮助。
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 |
Devise是Rails中一个功能强大、逻辑复杂的用于实现站点用户管理和登录的组件。鉴于Ruby之不重复造轮子的精神思想,Devise是值得去深入研究学习一下的。由于Devise本身的复杂性,这里对搭建的过程做一个记录,也借此分享一下基于Devise实现最基本的站点用户管理和登录的过程。
需要在机器上安装Ruby和Rails。
本次编程环境:
首先新建一个Rails项目TestSite,创建Post scaffold,包含title和body两个字段
1 | rails new TestSite |
接着在Gemfile中添加devise
1 | gem 'devise' |
在项目中执行bundle,以及执行devise:install
1 | bundle |
由于我们暂时只在本地测试,因此修改config/environments/development.rb文件,在其中加入mailer配置:
1 | config.action_mailer.default_url_options = { host: 'localhost', port: 3000 } |
指定Devise将要运行在哪个模型上,这里使用user作为模型,那么运行:
1 | rails generate devise User |
下一步,就是运行迁移:
1 | rails db:migrate |
如果希望在应用运行之前校验用户身份,在ApplicationController中加入以下过滤器:
1 | before_action :authenticate_user! |
指定路由:
1 | root to: 'posts#index' |
在Application的首页,加上用户注销的链接:
1 | <%= link_to "Logout", destroy_user_session_path, method: "DELETE" if current_user %> |
如果想要自定义登陆界面的视图,则运行以下命令:
1 | rails g devise:views users |
这里后面带模型名称,就会创建在这个模型范围内的视图(建议这样做,便于以后拓展多重用户身份模型)
此时就可以在相应的视图中自定义登录、注册、重置密码等相应的界面了。
生成控制器就和生成视图的流程是类似的,运行:
1 | rails generate devise:controllers users |
这样控制器就创建好了。
控制器这一段是值得好好说道说道的。
首先观察下控制器,控制器是可以追加功能的,也可以覆盖原来的方法,不过不推荐这样做,因为从目前经验来看devise自带的控制器已经足够健壮了。但是有时候,我们需要在原有的基础上新增一些功能,例如记录登录日志、增加一点自定义认证方式等等。这里简单介绍下如何在控制器中新增功能。
上一步操作,为我们生成了以下控制器:
1 | app/controllers/users/confirmations_controller.rb |
这里以登录为例,如果我们想要改写登录功能,首先我们要在路由中改写我们要复写的控制器路由:
routes.rb中:
1 | Rails.application.routes.draw do |
接着修改app/controllers/users/sessions_controller.rb,这里我们简单实现一个功能,当用户在前台登陆时,在后台的console中输出用户的登录信息。复写create方法:
1 | # POST /resource/sign_in |
尝试在前台登录,控制台输出了我们想要的信息:
待续
上手Markdown,你只需要先熟悉以下几种语法就够了:
下面开始一一讲解
标题很简单,用#号就可以。
一级标题是#,二级标题就用##,三级标题就用###,以此类推。
例如以下内容:
# 一级标题
## 二级标题
### 三级标题
在页面中展示的样子就是:
至于章节,一般用—来表示,这样在页面中会显示章节线。
例如:
—
Area 1
---
Area 2
效果就是:
Area 1
Area 2
粗体用**内容**
来表示,斜体用*内容*
来表示。
例如:
*斜体*
**粗体**
效果:
斜体
粗体
列表一般用
+ 无序列表1级
+ 无序列表2级
+ 无序列表3级
1. 有序列表1
2. 有序列表2
来表示
显示的效果如下:
1 |
|
显示的效果就是:
1 | #test code |
这个稍微复杂点,链接用:
[链接描述](URL)
图片用
![图片描述](URL)
例如:
[百度](https://www.baidu.com/)
![百度Logo](https://www.baidu.com/favicon.ico)
效果:
表格一般是以下形式:
|表格|表格|表格|表格|表格|
|:-|:-|:-|:-|:-|
|1|2|3|4|5
|6|7|8|9|0
效果:
表格 | 表格 | 表格 | 表格 | 表格 |
---|---|---|---|---|
1 | 2 | 3 | 4 | 5 |
6 | 7 | 8 | 9 | 0 |
Update your browser to view this website correctly. Update my browser now