我在抓取一个中文网页时遇到该问题.
出现该问题的原因是字符编码不一致导致的.查看获取到的网页内容编码是 ASCII-8BIT的,所以需要强制转换为UTF-8.
1 | code_html = HTTP.get('http://www.stats.gov.cn/tjsj/tjbz/xzqhdm/201401/t20140116_501070.html').to_s |
我在抓取一个中文网页时遇到该问题.
出现该问题的原因是字符编码不一致导致的.查看获取到的网页内容编码是 ASCII-8BIT的,所以需要强制转换为UTF-8.
1 | code_html = HTTP.get('http://www.stats.gov.cn/tjsj/tjbz/xzqhdm/201401/t20140116_501070.html').to_s |
你应该遇到过通过区县查省份,通过区县查邮编的时候.一般我们会打开浏览器google一下.但是,我不想,我想敲一行代码就能迅速的查到,谁让咱是程序员呢😊.这就是我这篇记录的产生原因.
源码地址
本文将记录采用行为驱动开发(BDD)的方式,创建一个gem到发布的真实过程.
安装bundler
1 | gem install bundler |
创建gem项目(项目名称为 china_district_code)
1 | bundler gem china_district_code |
生成的目录结构应该是这样
1 | china_district_code |
引入测试gem.打开gemfile文件,输入以下内容后运行命令: bundle install
1 | source 'https://gems.ruby-china.org' |
生成配置文件
1 | rspec --init #初始化rspec |
执行完成后,目录结构应该像这样子
1 | china_district_code |
然后生成我们的测试文件
1 | touch spec/china_district_code_spec.rb |
生成自动化测试配置文件,下面的命令执行完成后,文件夹内会多出一个Guardfile文件(自动化测试Guard的配置文件,默认不用修改).
1 | guard init rspec |
然后可以启动我们的自动化测试,监控文件变化.
1 | bundle exec guard |
关于自动化测试插件 guard的用法可以参考
Guard的Github地址
命令说明地址
以上的基础工作完成,下面开始写我们的行为测试.
打开china_district_code_spec.rb,输入以下内容(请无视我的中国味英语o(╯□╰)o)
1 | require 'spec_helper' |
保存后,你会发现Guard已经自动运行了测试,并给出提示,所有的测试都是pending状态.
shell中应该像这样:
1 | 00:13:39 - INFO - Running: spec/china_district_code_spec.rb |
然后,我们来实现我们的行为,忽略折腾的过程….直接上完成的code.
1 | china_district_code_spec.rb |
然后,一个个实现我们的需求,享受由红变绿的过程(囧)
1 | #encoding: utf-8 |
完成了gem的开发,接下来需要编译并发布.我们先修改一下gem的配置项.
打开 ‘china_district_code.gemspec’,修改如下
1 | # coding: utf-8 |
在发布之前,我们先安装到本地试用一下,(可以用 rake -T 查看rake任务)
1 | 修改版本号为 VERSION = "0.0.1" |
完成以上步骤后,可以确认我们的gem是没有问题的.下面打包发布到https://rubygems.org/
1 | rake release |
你有可能会遇到这样的错误提示!(可以通过将代码提交到本地git仓库解决.(git add . && git commit -m ‘first commit’))
1 | -> ⮀ china_district_code ⮀ ⭠ master± ⮀ rake release |
然后再次运行 rake release时,可能还会遇到下面这个错误(这是要求你的代码需要提交到远程仓库.我选择提交到github)
1 | ✘ ⮀ -> ⮀ china_district_code ⮀ ⭠ master± ⮀ rake release |
提交完成后,再次执行 rake release,看到以下内容则表示成功了.啦啦啦
1 | -> ⮀ china_district_code ⮀ ⭠ master ⮀ rake release |
然后自己装一下,让下载次数加1…😄
插入排序的原理:
1.从第一个元素开始,该元素可以认为是已经被排序
2.取出下一个元素,在已经排序的元素序列中从后向前扫描
3.如果该元素(已排序)大于新元素,将该元素移动到下一个位置
4.重复步骤3,知道找到已排序的元素小于或等于新元素的位置
5.将新元素插入到该位置
6.重复步骤2-5
下面是实现代码:
1 | require 'pry' |
排序过程
1 | [66, 66, 51, 76, 81, 26, 57, 69, 23] |
C#写习惯了,当使用Sublime写Ruby时没有IDE进行debug,实在是不习惯.
怎么办?!
不能debug,创造条件也要debug!
经过一番搜索加实践,记录如下.
需要的gem
1 | gem install pry |
安装了上述gem后,在需要debug的代码中添加 binding.pry
1 | require 'pry' |
当代码运行起来后就会停在binding.pry下一行代码的位置.
pry是不支持单步调试的,为啥呢?!
如果需要单步调试就需要 pry-byebug这个gem.
pry文档
pry-byebug文档
pry-byebug的一些用法
使用简化的命令
1 | #在用户根目录下创建 .pryrc配置文件 |
如果需要通过按enter键达到执行上一次输入的命令的效果,则在配置文件中输入以下内容.
1 | # Hit Enter to repeat last command |
断点用法:
1 | break SomeClass#run #断点打在 SomeClass这个类下的run方法上 |
退出pry
1 | exit! |
我有个需求需要Rails连接mysql和sqlserver,这就需要rails的多数据库操作支持.
rails对mysql原生支持是很好的,所以不需要改动什么.但是操作sqlserver就需要手动配置一下了.
查了一堆资料后记录如下:
需要用到的gem:
github地址
1 | gem 'tiny_tds' |
database.yml针对sqlserver的配置
1 | sqlserver_db: |
model的设置:
具体原因参考
在models文件夹下创建一个sqlserver_base.rb的文件,代码为:
1 | class SqlserverBase < ActiveRecord::Base |
sqlserver表对应的model这样声明:
1 | class Friend < SqlserverBase |
在rails中,当下拉框select 可以多选时,如果需要在后台接收到数组参数,需要进行如下设置.
1,html中 name属性需要设置为数组形式,如下
1 | <select name="site_event[]" id="site_event" v-model='site_event_selected' multiple> |
2,后台接收时如下
1 | def query_pv_uv_by_day |
报错描述:
我有一个ajax请求
1 | @get_sites = (data) -> |
请求的action
1 | def get_sites |
然后报错信息为:
1 | ArgumentError in Backend::ExportPvUvsController#get_sites |
让我郁闷了…我查了一整天的资料都没找到解决方法.所有的问题都是说缺少 respond_to 块.但是我的有啊…
实在憋不住了,上ruby china发帖问了一下.帖子发完没几分钟就被关小黑屋了.
我就纳闷了,我累死查了一整天的问题会这么简单?!不死心的我一边问管理员为啥关小黑屋,一边继续查.
在纠结中等到了李华顺大神的回复.他直接指出是 “format”打错了…
得知原因的我真想找个坑跳进去.怎么说我也是一个老程序员了,怎么能这么粗心.
总结:写C#一直用编译器能大大降低这种低级错误,但是在编辑器上一定要多注意、多注意、多注意!
写此篇文章的目的是警醒自己.
快速排序算法的原理:
在一个长度不小于3的序列A[0..n-1]中,对于任何 0 < n < n-1,以每一个元素p = A[n]为界,都可以将序列分隔为前、后两个子序列 A1 = A[0..n]和 A2 = A[n..n-1],则称p为序列A的轴点。然后对两个子序列排序,当子序列排序完成即可得到整个序列的排序结果(又称为 分治法)。
轴点的要点为:若一个元素是轴点,则经过排序之后,它的位置不应发生变化。
但是,实际应用中,序列中可能不存在这样一个轴点。所以需要选取轴点。
一般轴点的选取都选择数组的第一项或最后一项,但是最高效的方式是随机选取轴点.
下面的代码将采用固定轴点的方式演示快速排序.
1 | require 'pry' |
排序过程
1 | [23, 13, 51, 76, 81, 26, 57, 69, 66] |
冒泡排序算法的原理:
有一组数列A[0..n-1],重复遍历该数列,一次比较两个相邻的元素A[i]和A[i+1],如果A[i]<=A[i+1]则不需要交换位置,如果A[i]>A[i+1],则需要交换位置.
实现:
1 | require 'benchmark' |
遍历过程
1 | [3, 1, 8, 2, 6, 5, 9, 10, 4] |
环境:
osx 10.11.5
ruby ‘2.2.0’
gem ‘rails’, ‘4.2.3’
gem ‘mysql2’, ‘~> 0.3.18’
今天在折腾rails时,遇到mysql2与rails版本匹配问题, 虽然mysql2已经指定了 ‘~> 0.3.18’ 版本。报错信息:
1 | LiudongyuematoMacBook-Air:r_admin_demo liudongyue$ rails s |
可能的解决方法:
重装mysql,重装mysql2
1 | brew uninstall mysql |