2013年8月15日星期四

Wordpress顶级category转换为tag(为特定category及其子孙category中的文章统一添加特定tag)

wp_terms存储的是term的基本信息,包括term_id、name、slug等。
wp_term_taxonomy存储的是term_taxonomy的信息,即和posts直接发生关系的具体的category、tag、menu等,term_taxonomy_id和term_id是多对一的关系,比如有一个category和一个tag有同样的name和slug,那么它们会有不同的term_taxonomy_id,和相同的term_id。taxonomy是其具体所属的类别,包括category、nav_menu、post_tag等。
wp_term_relationships存储的则是广义上的posts和term_taxonomy之间的关系,object_id和term_taxonomy_id是一对多的关系,即一篇文章可以属于多个分类,拥有多个tag。

想将某顶级category转为tag,实质就是将其所有子孙category中的文章加上一个特定tag,处理完成后删除此category。思路是检查每篇文章所属的category是否为顶级category,若否,则找出其上级category,直到是顶级为止。若为预期的转换对象,则为此篇文章添加目标tag。

具体而言,就是检查wp_term_relationships,得到每个object_id对应的term_taxonomy_id;
去wp_term_taxonomy检查此term_taxonomy_id的parent是否为0,若非,则检查其parent的parent,直到为0;得到此时原term_taxonomy_id现在对应的祖先term_taxonomy_id,找出其所对应的term_id;
对照wp_terms,看此term_id对应的name是否为预期的转换对象;
若是,则在wp_term_relationships添加一条记录,内容为此object_id和预期的目标tag的term_taxonomy_id。

之后计数项(wp_term_taxonomy中的count)不会自动刷新,随便找篇文章对预期目标tag的状态进行修改,保存即可。

2013年6月12日星期三

PHPCMS V9转换到Wordpress的SQL语句

没玩过PHPCMS,不过有一个网站需要导入数据,于是……

创建文章:
insert into wp_posts(ID,post_title)
select id,title from phpcms_news where islink=0

修改时间:
update wp_posts a,phpcms_news b
set a.post_date=FROM_UNIXTIME(b.inputtime),a.post_date_gmt=FROM_UNIXTIME(b.updatetime)
where a.ID=b.id

添加内容:
update wp_posts a,phpcms_news_data b
set a.post_content=x.content
where a.ID=b.id

文章分类:(如原分类编号为17,新分类编号为5)
insert into wp_term_relationships(object_id,term_taxonomy_id)
select id,5 from phpcms_news where catid=17

2013年5月29日星期三

如何理解Twitter API的“开放”

为了易于理解,或许可以将Twitter的成长做个不够准确的比喻:

一个婴儿生有异象,似乎预示着未来的非凡,无奈父母囊中羞涩,能否养活都是个问题,只好求助于江湖同道。于是幼时每日都被领去不同的场子吃百家饭,今天客串一部电影,明天参与一场马戏,改日又被拉去唱歌剧……果然天赋异禀,无论什么演出都十分出彩。不论演出是公益还是收费,孩子的父母总是一文不取。

这孩子攒了好几身行头之余,倒也在演出中和观众的互动中掌握了诸多手艺,慢慢地薄有名声,成了不大不小一个童星。父母见他头角峥嵘,自然欢喜,却又觉得不是久长之计——此时倒也薄有积蓄了,便买了其中一套精美的演出服装,又雇了这服装的设计师,专为这孩子设计形象。外面的演出虽然还出场,然而慢慢就挑剔起来,去得越来越少,倒是罄其所有,专门修了自家的剧场,每日上演不同的节目,引得各色人等尽皆前来捧场——唯有一点,无论演什么节目,扮相都大同小异。

这新的造型虽然略显单一,胜在设计精美,又方便一望即知。加之少年功夫愈发精湛,一时间观者如潮门庭若市,拥趸比小时候多了数十倍不止。更引来无数商贾在剧场外围售卖各类周边产品。其父母随即声称,感念这孩子全赖众力才有今日,自是不会垄断所有商机,然而诸位卖什么须得我们授权,但收益照旧绝不抽成,此外就是不得私自用这孩子的形象去做广告。众人听了都觉得甚为公道,中有几个巨商所获甚至远超这少年的父母,都是大喜,各自闷声发大财不提。

唯有那些最初慧眼识珠曾经带这孩子四处演出的人偶尔抱怨几声,少数喜欢看他形象百变的老观众心下失落,写几篇东京梦华录一般的酸文。也有一两家场子鼓舞精神,每次难得请到少年出场都扮得新颖别致,票价虽高也座无虚席,然而终究是勉力支撑,再不复旧时光景。

众人心中慢慢明白,这孩子终究是他父母的,吃百家饭也罢,无偿出演也罢,周边产品无偿授权也罢,毕竟都是他父母说了算。抱他教他看他长大,或是赞他捧他靠他吃饭,都不该忘了这一点;而和他成长中共同经历的每一幕也并非虚妄。

2013年3月4日星期一

在Lenovo Yoga 13'上运行Android-x86

因为在it168的idea乐园的Yoga论坛上面看到一个Yoga运行Android的视频,但是发帖的超版各种吊人胃口就是不说怎么弄,于是我随便搜了一下,发现这个项目:Android-x86,体验了一下。
因为之前看到论坛有人在问,就把简单的过程发上去,结果立刻被删了……这超版得有多小心眼啊……

很多上网本和Virtualbox已经有专门对应的版本了,yoga暂时还没有。就装通用的。


在项目主页下载最新的ISO,用UltraISO解到U盘,启动Yoga来体验。
(需要事先将Bios里面的启动项从UEFI改成legacy)

我的yoga硬盘是GPT的,android_x86安装程序找不到分区,所以用live cd启动来玩。
可以在不去动YOGA的Secure boot、EFI和原有的GPT硬盘分区之类的东东的前提下,安装到硬盘的。只是启动时需要一个U盘来引导。
具体的方法:
  1. 在本机硬盘上划分出一个2、3G的FAT32分区
  2. 用之前做好的U盘来启动,同时插入另外一个U盘
  3. 安装时候目标选择另外一个U盘,中间选择安装GRUB
  4. 安装完成之后重启进Win8,将刚才装好的U盘上面的Android开头的目录(如果选择了system可写则还有system目录,但实测这样会非常慢)复制到之前划分的FAT32分区
  5. 重启电脑,插入支持的无线网卡,按F12选择从刚才安装目标的U盘启动
  6. 然后这个引导程序会去扫描你的本地硬盘分区,会找到你刚才复制文件进去的那个分区启动……
  7. 进了Android之后卸载USB存储设备,拔掉U盘就好
这里很有趣,这个Android-X86不是按照GRUB里面写的分区去引导,而是去扫描所有分区,从找到的第一个包含相关文件的分区引导的,于是就可以实现这种曲线救国的半硬盘引导方式了……

内置的wifi和蓝牙的那个芯片太新了,没有对应的linux驱动,所以无法识别。
我用的是tplink的tl-wn823n,不知道是不是个案,会频繁掉线,可以按ctrl+shift+f1切换到终端,运行
ping baidu.com,
就会一直ping,好像就会保持连线了,可以多稳定一段时间。
然后可以按ctrl+shift+F7切换回来继续玩。

其他硬件方面,触摸屏完美,摄像头、声音都完美。Youtube流畅,本地视频播放没有测试。重力感应无效,不过可以用Rotation Locker来手动调整。

大概测试了一下,ucweb不行,x86专用版也不行,布卡漫画完美,小说下载阅读器不行,flipboard完美。
分辨率似乎很高,反正各种清楚。是物理分辨率1600*900,运行远程桌面玩其他没触屏机器机器的Win8很爽……




2012年12月3日星期一

Teleport Ultra扒站备忘

太久没有用这个东西了。

要求:被扒的整站以及第一层外站链接。
一开始被“不多于”迷惑了,填了1,感觉明显不对。

2012年11月28日星期三

被黑之后笨办法检查远程登录记录


  • 首先开启对登陆事件的记录(服务器版的Windows默认是开的):
    "Admin Tools" - "Local Security Settings" - then in MMC Uunder "Local Policies", "Audit Policy" then on the right "Audit account logon events"
  • 然后去"事件查看器" - "Windows 日志" - "安全"里面筛选任务类别为“登录"的,导出为txt
  • 将此txt上传到linux……用csplit切开:
    csplit -k log.txt 49 {1000000}
    这里不明白为什么明明是每48行一段的,参数需要写49才正确
  • 然后找出登录的:
    find  ./  -name "xx*" | xargs -n50 grep 'winlogon.exe' > file
    "xx"是csplit切分的默认前缀
  • 稍微处理一下列表,得到包含文件名为其中一整行的新文件:
    tr -s ":" "\n" <file >file.txt
  •  写个脚本用于把这些日志挪别处去:
    cat file.txt | while read line
    do
    mv $line {path}
    done
  • 然后继续从这些日志中删掉自己登陆的,先找出来:
    find  ./  -name "xx*" | xargs -n50 grep '{常用ip}' > file
    由于之前没有过滤登录类型,所以记得首先排除127.0.0.1
  • 再把上述脚本改改,把自己登陆的log删掉
  • 然后看看剩下的,黑我的人是从哪里登录用了什么用户名之类……
其他额外获得的知识:
  • Windows用户登录的类型代码
  • grep与正则,如需要grep <tab>:
    grep $'tab'

2012年10月30日星期二

WZR-HP-G450H使用官方DD-WRT固件配合autoddvpn实操

首先从Buffalo官网下载pro版本的固件(即DD-WRT)升级

然后按照官方教程所讲的进行配置,注意事项有:

  1. 文中提到的dnsmasq配置的样例文件,在我这里需要把等号前后各加上空格才能生效
  2. 官方的vpnup.sh只包含了由gfwlist包含的域名nslookup而来的ip,且很多非www的二级域名对应的ip将不会支持,加之gfwlist更新缓慢,所以需要自行将遇到的访问受限的站点如为min.us等多个网站提供CDN服务的cloudfront.net等查到ip段:
    nslookup domain.name 8.8.8.8
    加到dnsmasq option:
    server = /domain.name/8.8.8.8
    和vpnup_custom:
    route add -net aaa.bbb.ccc.0/24 gw $VPNGW
  3. 因为采用的是gracemode并手动执行openvpn,所以参考这篇教程。有点过时了,比如comp-lzo一定后面要加参数了,还有script-security 3 system也是一定要有的……具体可以自己看log
    值得注意的是因为default GW不是VPN的,服务器端openvpn的server.conf也要记得去掉
    push "gateway def1"
    而保留
    push "bypass-dhcp"
  4. 因为是用dnsmasq的,所以在内网机器ping任何站点都没问题(会按照设置用指定的dns server去查询并返回结果);不要去路由器上直接ping受限站点,因为默认是用ISP的dns server的…这样会造成人为的污染并缓存下来,然后内网各机器就都上不去了…