VC
1 | #include <stdio.h> |
GCC
1 | #include <stdio.h> |
VC
1 | #include <stdio.h> |
GCC
1 | #include <stdio.h> |
默认安装的MySQL数据库,无法远程连接。
登录MySQL之后,运行
1 | SELECT user,host from mysql.user; |
如果只有一条记录,说明是这个原因。
将下面的脚本保存成user.sql,登录MySQL,运行:
1 | use mysql; |
Notice: 会重置MySQL user表,并且将root用户密码设置为空。
脚本内容: 点这里直接下载
1 | SET FOREIGN_KEY_CHECKS=0; |
1 | set JAVA_HOME=C:\Program Files\Java\jdk1.8.0_40 |
建立热点:
@echo off
netsh wlan set hostednetwork mode=allow
netsh wlan set hostednetwork ssid=热点名 key=密码
netsh wlan start hostednetwork
关闭热点
netsh wlan set hostednetwork mode=disallow
使用Phantomjs访问网页并截图
1 | var page = require('webpage').create(); |
example.png

Phantomjs已经接近废弃,如今推荐使用google的headless技术。
创建项目
1 | rails new BootstrapProject |
创建模型
1 | rails g scaffold xxx --skip-stylesheets |
运行迁移
1 | rake db:migrate |
如果项目和模型都已经建立好了并已经运行了迁移,那么可以省略以上步骤,直接进入下面的流程
在Gemfile中添加bootstrap,这里使用twitter-bootstrap-rails
1 | gem 'jquery-rails' |
bundle
1 | bundle install |
安装bootstrap
1 | rails g bootstrap:install |
在模型上运用bootstrap
1 | rails g bootstrap:themed xxx -f |
注:xxx可以是任意的模型,例如模型名称是Article,那么这里的语句就是:
1 | rails g bootstrap:themed Articles |
还要在application.js中加上引用,否则bootstrap的一些按钮会失效:
1 | //= require jquery |
Enjoy it~
最近手上多了一个树莓派2代,于是折腾就这么开始了。
因为总是得要个显示屏或者路由器或者插根网线才能玩,有点麻烦,所以有了此文。
设备清单:
树莓派2代
EDUP EP-N8508GS无线网卡(USB)
普通网线一根
最终实现的效果是树莓派的有线网卡用来作为wan口,无线网卡建立热点
笔记本可以通过连接wifi连接上树莓派进行操作
下面说说过程:
首先我参考了
http://elinux.org/RPI-Wireless-Hotspot
这篇文章中的方法,但是并没有成功。后来看到文章的末尾才知道,是驱动对不上号,文章末尾明确标明默认的hostapd程序不支持rtl8188系列网卡,而我的usb网卡就是rtl8188cus系列。
所以在开始之前,建议先用lsusb命令看一下网卡的型号再考虑进行下一步。
如果你的网卡不是rtl8188系列那你可以参考上面文章中的方法来配置,如果是那么可以参考我的方法。
根据那篇文章最后给出的连接,找到了这个驱动:
https://github.com/lostincynicism/hostapd-rtl8188
然而当编译好驱动重新运行之后仍然是不行,还是不支持。
最后还是参考了这篇文章:
http://wangye.org/blog/archives/845/?_t_t_t=0.7382462719884554
原因可能就是因为我这个系列网卡比较特殊。但是最后在这个文章中发现了编译好的第三方驱动,虽然有点不满意,但还是凑合着用了。
http://www.daveconroy.com/turn-your-raspberry-pi-into-a-wifi-hotspot-with-edimax-nano-usb-ew-7811un-rtl8188cus-chipset/
具体步骤:
先切换为root用户,可以省去很多不必要的麻烦。
所以以下操作都是以root用户:
1.安装hostapd和udhcpd服务并且更换hostapd程序
apt-get install udhcpd hostapd
wget http://www.daveconroy.com/wp3/wp-content/uploads/2013/07/hostapd.zip
unzip hostapd.zip
mv /usr/sbin/hostapd /usr/sbin/hostapd.bak
mv hostapd /usr/sbin/hostapd.edimax
ln -sf /usr/sbin/hostapd.edimax /usr/sbin/hostapd
chown root.root /usr/sbin/hostapd
chmod 755 /usr/sbin/hostapd
2.编辑/etc/udhcpd.conf文件,配置dhcp服务:
确保文件当中有下列内容
start 192.168.1.2
end 192.168.1.254
interface wlan0
remaining yes
opt dns 223.5.5.5 223.6.6.6
opt subnet 255.255.255.0
opt router 192.168.1.1
opt lease 864000 #
相信一般都能看懂,其中的interface需要根据情况来写。
3.编辑/etc/default/udhcpd 文件,将下面这行注释掉。
DHCPD_ENABLED="no"
4.将无线网卡wlan0的ip设为192.168.1.1
ifconfig wlan0 192.168.42.1
5.修改/etc/network/interfaces文件,添加下面的内容
iface wlan0 inet static
address 192.168.1.1
netmask 255.255.255.0
并且将下面这两条注释掉
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet manual
6.接着就正式开始配置无线相关的选项了,编辑/etc/hostapd/hostapd.conf,如果没有这个文件就自行创建它。
interface=wlan0
driver=rtl871xdrv
ssid=无线名称
hw_mode=g
channel=6
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=无线密码
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
7.在/etc/default/hostapd文件中指定hostapd服务的配置文件,内容如下
DAEMON_CONF="/etc/hostapd/hostapd.conf"
8.更改系统的转发规则和iptables规则,依次运行下列命令:
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT
iptables-save > /etc/iptables.nat
service hostapd start
service udhcpd start
update-rc.d hostapd enable
update-rc.d udhcpd enable
9.最后一点点收尾工作:
编辑/etc/network/interfaces文件,在末尾加上着一条:
up iptables-restore < /etc/iptables.nat
以及/etc/sysctl.conf文件,确保下面的选项存在
net.ipv4.ip_forward=1
到此为止就全部完成了,用手机,电脑等无线设备都可以连接上树莓派了。
为后续的折腾打下基础。
折腾的整个过程还挺复杂的,需要修改多处文件,而且每一处修改都会微妙的影响到最后路由器的运行,小小的改变都有可能造成瘫痪或者影响性能。由此可见,想DIY一款高性能的个性无线路由器还是很有挑战性的。
步骤如下
1 | gem sources --add https://ruby.taobao.org/ --remove https://rubygems.org/ |
之后:
1 | gem install rails |
如果是win10,选择 DevKit-mingw64-64-4.7.2-20130224-1432-sfx.exe 这个版本。
然后运行,并选择解压到c:\devkit
进入c:\devkit目录
运行
ruby dk.rb init
之后修改config.yml
添加下面三行
1 | --- |
注意把路径换成当前ruby的安装路径,-前后各有一个空格不可忽略。
然后运行
ruby dk.rb install
最后进入需要建立工程的目录,使用如下命令新建rails项目
rails new testapp
如果在此过程中报错,则进入testapp中
使用
bundler install
来安装所需要的依赖包。
如果还报错,修改testapp目录中的Gemfile
将第一行的sources源内容改为
source 'https://ruby.taobao.org/'
然后再执行bundler install命令
假设你已经安装好ruby了
接下来安装rvm
$ curl -L https://get.rvm.io | bash -s stable
某些情况下,可能需要编译一下rvm的初始化脚本
我的位置是在/etc/profile.d/rvm.sh,所以运行这一句:
$source /etc/profile.d/rvm.sh
接着安装bundler
gem install bundler
然后安装rails
gem install rails
如果这地方出现错误,尝试使用rvm切换ruby的版本:
rvm install 2.0.0
rvm 2.0.0 --default
1 | curl -L https://get.rvm.io | bash -s stable |
!
最近在研究二进制,研究到函数调用部分,将自己理解的原理做个记录。
首先需要了解系统栈的工作原理,栈可以理解成一种先进后出的数据结构,这就不用多说了。
在操作系统中,系统栈也起到用来维护函数调用、参数传递等关系的一个作用。嗯,这是我的理解。
在高级语言编程中,函数调用的底层原理是对用户屏蔽的,所以不用过多的纠结于底层的实现。而对于
汇编研究者来说,了解这个原理就很重要了。
首先可以想象一下,汇编语言在内存中是以指令的形式存在的,这些指令是按照顺序存储和执行的,高级语言中
编写的循环、调用,到了底层都会变成一些最基本的判断和跳转,如何在线性的结构上完成“非线性”的过程调度,
理解了这些,就理解了汇编。
这里先抛出高级语言的一个例子:
1 | /*20160701*/ |
在这个程序中,main函数调用了函数funcA,funcA对传入的数据进行+1然后返回。
这个程序在编译之后,main函数变成这样:
1 | (gdb) disassemble main |
其中rbp是调用main函数的函数的栈桢的底部,这么说有点绕,简单的来说,main函数调用了funcA,那funcA中首先要做的一件事情就是把调用它的main函数栈桢的底部保存,所以在main函数被操作系统装载执行之后,main要做的首先是把调用它的函数的栈桢的底部保存,不然怎么返回呢?
第二个步骤把rsp的值传递给rbp,这是替换当前栈桢的底部,因为调用了funcA,所以要为funcA创建独立的栈桢,于是抬高栈底,怎么抬高呢,把栈顶传给指向栈桢底部的指针就可以了。
下一步是抬高栈顶,这是为funcA创建栈桢空间。
接着将参数传递给edi,因为这里只有一个参数,所以不涉及到参数顺序的问题,关于这个问题,可以去了解一下函数调用约定
调用了funcA,再来观察一下funcA的内部机制:
1 | (gdb) disassemble funcA |
同样的,在funcA中,首先保存上一个函数,即main函数栈桢的栈底,然后将rsp的值赋给rbp,抬高栈桢底部。
接着从edi中取得参数,并放入位于自身栈桢空间中,rbp之后的双字单元内。
然后执行操作,将其自增。
执行完成之后,将返回值保存在eax中,等待返回。
弹出上一个函数的栈桢的底部,重新回到main函数的空间。
PS:
直到目前为止,这个程序反编译出来的结果和书上说的原理还是有一些出入的,还有下面几个问题:
0x01 书上说的是,传递参数,会将参数按照一定顺序压栈,而不是像本程序中这样使用edi
0x02 在main函数调用funcA函数之后,将栈顶指针esp抬高了,但是在funcA函数执行完成需要返回到main函数的时候,只恢复了ebp指针,并没有恢复esp指针,这是为什么?
希望接下来可以搞懂上面的两个问题。
本文中用到的相关代码:
1 | /*20160701*/ |
Update your browser to view this website correctly. Update my browser now