GNS3 1.5.1 安装小记

所需文件:
GNS3
Oracle VM VirtualBox
GNS3 VM

一、安装虚拟机以及GNS3
注意,安装GNS3的时候,选择要安装的组件,要慎重选择,可以选择安装。也可以提前安装wiresharke 以及 Solorwinds。如果不提前安装,在这个过程中是要下载的,下载速度很慢很慢。当然也可以取消下载。安装npcap前注意备份下系统变量path……不知道gns3什么时候更新依赖,所以保险起见,或者事先安装新版本的npcap。
二、导入GNS3 VM
解压双击导入,就这么简单
三、配置GNS3
打开GNS3,选择Edit-Preferences
选择Server,这里不要本地服务器,就要远程。远程设置成那个虚拟机的ip就好,记得要输用户名和密码,都是gns3
选择远程的一个原因是,方便。
如果是本地的,本地要打开两个进程,而且打开gns3的时候也会自动启动虚拟机,好麻烦。。远程的自己打开虚拟机随用随开,想休眠就休眠。没那么多顾忌。
四、配置GNS3 VM
虚拟机两块网卡,第一块最好与主机共享,然后选择支持dhcp的那块。第二块是网络地址转换(NAT),反正两块中必须有个nat。
ssh进虚拟机,这个虚拟机只有nano,凑活用吧。 下面代码是乱入的,保存为keygen.py

#! /usr/bin/python
print "************************************************************************"
print "Cisco IOU License Generator v2 - Kal 2011, python port of 2006 C version"
import os
import socket
import hashlib
import struct

# get the host id and host name to calculate the hostkey
hostid=os.popen("hostid").read().strip()
hostname = socket.gethostname()
ioukey=int(hostid,16)

for x in hostname:
    ioukey = ioukey + ord(x)

print "hostid=" + hostid +", hostname="+ hostname + ", ioukey=" + hex(ioukey)[2:]

# create the license using md5sum
iouPad1='\x4B\x58\x21\x81\x56\x7B\x0D\xF3\x21\x43\x9B\x7E\xAC\x1D\xE6\x8A'
iouPad2='\x80' + 39*'\0'

md5input=iouPad1 + iouPad2 + struct.pack('!Q', ioukey)[4:] + iouPad1
iouLicense=hashlib.md5(md5input).hexdigest()[:16]

print "************************************************************************"
print "Add the following text to ~/.iourc:"
print "[license]\n" + hostname + " = " + iouLicense + ";\n"

print "************************************************************************"
print "You can disable the phone home feature with something like:"
print " echo '127.0.0.127 xml.cisco.com' >> /etc/hosts"
print "************************************************************************"

在虚拟及中安装python-minimal,否则运行python keygen.py的时候也要提示你安装。
然后检查两个文件
nano ~/.iourc
nano /etc/hosts
如果对了,那licence就搞好了。否则的话就自己新建吧。
1.5.1的web地址是ip:3080,之前的版本是ip:8000
然后就可以愉快的玩耍了
对了,送点福利
www.networklab.in/downloads/
sobek.su/Cisco/IOS/
自己注册cisco也是可以下载ios的

ecshop 2.7.3 从安装开始兼容高版本php

接上篇 ecshop 2.7.3 向上兼容至php7
首先修改/install/index.php

//line 95
//|| !function_exists('mysql_connect'))
|| !function_exists('mysqli_connect'))

这样在环境检查的时候,底部就可以继续下一步
按照前面的文章,把所有改修改的修改了,也可以暂时跳过这一步,无视那些Deprecated信息,只修改mysqli相关
再修改/install/includes/lib_installer.php

//那个lib_auto_installer.php就没有用处。。。
//首先是gd_version静态调用 line 27
function get_gd_version()
{
    include_once(ROOT_PATH . 'includes/cls_image.php');
    $image = new cls_image;
    //return cls_image::gd_version();
    return $image->gd_version();
}
//然后检测支持mysql line87
//$mysql_enabled = function_exists('mysql_connect') ? $_LANG['support'] : $_LANG['not_support'];
$mysql_enabled = function_exists('mysqli_connect') ? $_LANG['support'] : $_LANG['not_support'];
//line 160
//$filter_dbs = array('information_schema', 'mysql');
$filter_dbs = array('information_schema');
//line 162
//$conn = @mysql_connect($db_host, $db_user, $db_pass);
$conn = @mysqli_connect($db_host, $db_user, $db_pass, 'ecshop');//这个最后一个参数指定为ecshop的数据库就行,也可以为任意存在的数据库
//line 172 这个函数修改完,就可以正常搜索数据库了
//while (($row = mysql_fetch_assoc($result)) !== false)
while (($row = mysqli_fetch_assoc($result)) != false)
//line 533 这个在安装demo数据的时候,可能要嵌套创建目录,所以修改下
//if (!mkdir($target, 0777))
if (!mkdir($target, 0777, true))

接下来,就可以和ecshop愉快的玩耍了。

ecshop 2.7.3 向上兼容至php7

首先将includes下的cls_mysql.php重命名为cls_mysqli.php。然后打开,将类名修改为cls_mysqli。修改构造方法。

将与类名相同的方法名全部改为__construct,如果有__construct构造方法,删去。总之只有一个__construct构造方法。以下简称修改构造方法。

参考:http://php.net/manual/zh/language.oop5.decon.php
将cls_mysqli.php里面的mysql_全部替换为mysqli_,区分大小写。
将所有依赖于cls_mysql.php的文件全部修改了。

admin/includes/init.php
api/init.php
api/client/includes/init.php
includes/init.php
includes/fckeditor/editor/filemanager/connectors/php/config.php
mobile/init.php
wap/init.php

搜索以下三种方法,这三种方法的参数第一个都是mysql资源id,而,mysql_的这三种方法最后一个参数是mysql资源id,所以要一个一个改了。还好工程量不大。注意,mysqli_connect方法最后要加$dbname参数。
mysqli_connect
mysqli_query
mysqli_select_db

修改下列文件的构造方法

/api
 uc.php:uc_note
/admin/includes
 cls_exchange.php:exchange
 cls_google_sitemap.php:google_sitemap_item
 cls_sql_dump.php:cls_sql_dump
/includes
 cls_captcha.php:captcha
 cls_ecshop.php:ECS
 cls_error.php:ecs_error
 cls_iconv.php:Chinese
 cls_image.php:cls_image
 cls_mysql.php:cls_mysql
 cls_rss.php:RSS_Base;RSS_Builder;RSSItem
 cls_session.php:cls_session
 cls_sms.php:sms
 cls_smtp.php:smtp
 cls_sql_executor.php:sql_executor
 cls_template.php:cls_template
 cls_transport.php:transport
/includes/fckeditor
 fckeditor_php4.php:FCKeditor
/includes/modules/convert
 shopex46.php:shopex46
 shopex47.php:shopex47
 shopex48.php:shopex48
/includes/modules/integrates
 discuz55.php:discuz55
 dvbbs.php:dvbbs
 ecshop.php:ecshop
 integrate.php:intergrate
 phpbb.php:phpbb
 phpwind6.php:phpwind6
 ucenter.php:ucenter
 vbb.php:vbb
/includes/modules/payment
 alipay.php:alipay
 balance.php:balance
 bank.php:bank
 cappay.php
 chinabank.php
 cod.php
 ips.php
 kuaiqian.php
 paypal.php
 paypal_ec.php
 post.php
 shenzhou.php
 tenpay.php
 tenpayc2c.php
 upop.php
/includes/modules/shipping
 cac.php
 city_express.php
 ems.php
 flat.php
 fpd.php
 post_express.php
 post_mail.php
 presswork.php
 sf_express.php
 sto_expres.php
 yto.php
 zto.php

修改includes/lib_base.php

function gd_version()
{
    include_once(ROOT_PATH . 'includes/cls_image.php');
    $gd = new cls_image;
    return $gd->gd_version();
}

接下来修改includes/cls_template.php,将所有/e模式的preg_replace全部换为preg_replace_callback

<?php
function fetch_str($source) //line 300
    //return preg_replace("/{([^\}\{\n]*)}/e", "\$this->select('\\1');", $source);
    return preg_replace_callback("/{([^\}\{\n]*)}/", 'self::select', $source);

function select($tag) //line 370
    //$tag = stripslashes(trim($tag));
    $tag = stripslashes(trim($tag[1]));
    //line 493
    //$out = "<?php \n" . '$k = ' . preg_replace("/(\'\\$[^,]+)/e" , "stripslashes(trim('\\1','\''));", var_export($t, true)) . ";\n";
    $out = "<?php \n" . '$k = ' . preg_replace_callback("/(\'\\$[^,]+)/" , function($m){return stripslashes(trim($m[1],'\''));}, var_export($t, true)) . ";\n";

function get_val($val) //line 552
    //$val = preg_replace("/\[([^\[\]]*)\]/eis", "'.'.str_replace('$','\$','\\1')", $val);
    $val = preg_replace_callback("/\[([^\[\]]*)\]/is", function($m){return '.'.str_replace('$','$',$m[1]);}, $val);//或者下面这种形式
    $val = preg_replace_callback("/\[([^\[\]]*)\]/is", function($m){return '.'.$m[1];}, $val);

function smarty_prefilter_preCompile($source) //line 1069-1071
    /*
    $pattern     = '/<!--\s#BeginLibraryItem\s\"\/(.*?)\"\s-->.*?<!--\s#EndLibraryItem\s-->/se';
    $replacement = "'{include file='.strtolower('\\1'). '}'";
    $source      = preg_replace($pattern, $replacement, $source);
    */
    $pattern     = '/<!--\s#BeginLibraryItem\s\"\/(.*?)\"\s-->.*?<!--\s#EndLibraryItem\s-->/s';
    //$replacement = "'{include file='.strtolower('\\1'). '}'"; //这行用不着咯,当然要注释掉
    $val = preg_replace_callback("/\[([^\[\]]*)\]/is", function($m){return '.'.$m[1];}, $val);

然后是includes/lib_debug.php

function pre( $string, $return_mode = false, $tabwidth = 3 ) //line 580
    $string = preg_replace('/\t+/em', "str_repeat( ' ', strlen('\\0') * $tabwidth );", $string);
    //$string = preg_replace_callback('/\t+/m', function($m){global $tabwidth;return str_repeat( ' ', strlen($m[0]) * $tabwidth );}, $string);

最后是/admin/template.php

//line 763
//$pattern = '/(?:<!--\\s*TemplateBeginEditable\\sname="('. implode('|',array_keys($regions)) .')"\\s*-->)(?:.*?)(?:<!--\\s*TemplateEndEditable\\s*-->)/se';
$pattern = '/(?:<!--\\s*TemplateBeginEditable\\sname="('. implode('|',array_keys($regions)) .')"\\s*-->)(?:.*?)(?:<!--\\s*TemplateEndEditable\\s*-->)/s';
//$template_content = preg_replace($pattern, "'<!-- TemplateBeginEditable name=\"\\1\" -->\r\n' . \$regions['\\1'] . '\r\n<!-- TemplateEndEditable -->';", $template_content);
$template_content = preg_replace_callback($pattern, function($m){return '<!-- TemplateBeginEditable name="' . $m[1] . '" -->' . "\r\n" . $regions["'$m[1]'"] . "\r\n<!-- TemplateEndEditable -->";}, $template_content);

将下列文件的mktime()换成time()

admin/cloud.php
admin/shop_config.php
admin/sms_url.php<br>

将下列文件end()方法中嵌套调用的全部分解开来写

admin/flashpay.php
admin/shipping.php
admin/topic.php
includes/lib_main.php

将下列文件array_shift()方法中嵌套调用的全部分解开来写

includes/cls_template.php

将admin/sitemap.php内 & new 全部改为 new
将下列文件中的静态调用全部修改了

admin/article.php
admin/database.php
admin/picture_batch.php
admin/includes/cls_sql_dump.php

冒着被打骚扰的危险注册了云起帐号,下载了ecshop3.0,发现,除了主题好看了点,添加了过滤之外,其他都然并卵。。。云服务多多少少还是有点用处的
不过,里面几个补丁合适可以参考参考的

//includes_admin_template_restore_backup.php
$template = $this;
return preg_replace_callback("/{([^\}\{\n]*)}/", function($r) use(&$template){return $template->select($r[1]);}, $source);

//includes_cls_template_fetch_str.php
$template = $this;
return preg_replace_callback("/{([^\}\{\n]*)}/", function($r) use(&$template){return $template->select($r[1]);}, $source);

//includes_cls_template_get_val.php
$val = preg_replace_callback("/\[([^\[\]]*)\]/is", function($r){return '.' . $r[1];}, $val);

//includes_cls_template_select.php
$out = "<?php \n" . '$k = ' . preg_replace_callback("/(\'\\$[^,]+)/", function($r){return stripcslashes(trim($r[1], '\''));}, var_export($t, true)) . ";\n";

//includes_cls_template_smarty_prefilter_preCompile.php
$pattern     = '/<!--\s#BeginLibraryItem\s\"\/(.*?)\"\s-->.*?<!--\s#EndLibraryItem\s-->/s';
$source      = preg_replace_callback($pattern, function($r){return '{include file=' . strtolower($r[1]). '}';}, $source);

//includes_lib.debug_pre.php
$string = preg_replace_callback('/\t+/m', function($r) use($tabwidth){return str_repeat(' ', strlen($r[0]) * $tabwidth);}, $string); //至少比我那global优雅多了

万事大吉,高版本php全都可以运行了。有问题请留言。有错误请指教。

wordnet-php

需求很简单,解决很粗暴。

把wordnet db file导入到mysql数据库中

文件分为两种,
index.* 索引文件 除了index.sense
data.* 数据文件
所以,表也就两个。
但是,wordnet有*.exc文件,也就是单词的变形。在我这,这个需求被砍了。。。被砍的还有上下位词啊什么语义语素方面的东西,那些单词没有中文解释。。不过,sql表结构还是遵从源文件的数据格式的,所以数据没有缺失。
嗯,只关注了这两种文件,所以那些语义语素之类的暂时抛弃了。

读文件,按空格切成数组,读字段,生成sql插入语句,执行插入。
因为需要大量插入,所以,调大了max_allowed_packet,表使用InnoDB引擎。插入效率棒棒哒。
这只是整理数据,具体的界面还没有放到github上。
上代码,TL;DR 继续阅读wordnet-php

再谈谈程序员的健康

因为已经有了很多关于程序员健康的文章,所以起了个“再谈程序员的健康”。

站着工作,于是有了买笔记本支架。
老祖宗总结了:
久视伤血,久卧伤气,久坐伤肉,久立伤骨,久行伤筋。是谓五劳所伤。
via 黄帝内经 素问 宣明篇第二十三

腹式呼吸
我们在襁褓中的时候就是用腹部呼吸的。学过美声的应该知道腹式呼吸。
具体去查百科,这里只是提一下。可以减掉小肚子的。

走路,不要跑步,不要跑步,不要跑步
为什么不要跑步?因为伤膝盖。你可以试下跑步,如果膝盖发红,那么跑步就不适合你,当然少量的跑也是可以的。
可以尝试倒着走,不一样的感觉,而且可防治腰肌劳损。
足病、膝关节病和平衡力差的人最好不要尝试倒走。

坐姿要正确,舒适的椅子是必要的。
经常扭扭腰,扭扭脖子,看看远处,或者是看看养眼的,比如说好看的妹子啊,有创意的摆件啊。。。

减肥
餐前喝点水,饱腹
吃低GI的食物
比如,燕麦 面包 猕猴桃 馒头 牛奶 柚子

健身
可以参考书籍
囚徒健身 强烈推荐,里面有个六艺十式,可以作为锻炼的参考。
徒手斗士 这本书没有中文版,原名Pavel_Tsatsouline_-_The_Naked_Warrior,各位可以看豆瓣的译文,或者去微盘下载。
当然也可以关注一些健身的大V或者微信。

关于养生,可以试着关注一些公众号。养生也是要去了解一些的。
最最重要的一点:不要熬夜,不要把工作当成生活,不要把工作带到生活中,规划好自己的职业道路,好好利用周末去学习自己感兴趣的东西。
好吧,我承认关于健康的只有一点,不要熬夜,不要熬夜,不要熬夜。