机器学习练手-Python玩“跳一跳” iOS+Win 硬件实现

皮皮哇皮皮哇

更新了基于OpenCV的算法,计算更准确。

还有Arduino实现,溜了溜了

——————————-

感谢来自 @神奇的战士 的跳跃距离算法

原项目地址:wangshub/wechat_jump_game

知乎专栏:教你用Python来玩微信跳一跳


1.3 再更: 悄咪咪地加上Arduino版

1.3 又更了: 竟然有1k赞还上了日报,一本满足。昨天研究了一晚上,加入了大家喜爱的OpenCV。现在计算准确率已经很好了,不会出现误差累积。感谢 @船D长 :用Python+Opencv让电脑帮你玩微信跳一跳 给我的启发,大神的代码简洁优雅,非常受用。

1.2 更:谢谢大家的400赞,非常开心。想说一下,我是因为手边只有树莓派才用树莓派控制舵机的,它毕竟是一台200+的小型计算机,肯定是大材小用了。想要自己动手做一个的知友们可以不用急着买树莓派,给我一两天的时间。我的arduino已经到啦,正在测试!

本项目源码: yangyiLTS/wechat_jump_game_iOS

认真写的一个简介

现在已有的跳一跳辅助原理有以下这些:

外星力量派:

日天派:

  • 直接抓取post请求包修改分数,服务器不对分数进行验证,想改多少改多少

平民方法:

基本步骤:1、获取游戏画面;2、图像分析计算跳跃距离;3、模拟触摸手机屏幕进行游戏。

其中针对不同平台也有不同的实现方案:

  • Android平台:adb工具实现截图和触摸,PC或手机实现图像分析
  • iOS平台+Mac:使用Mac的WDA工具,原理同adb工具。
  • iOS但没有Mac:我的方法可能可以解决这个问题

先上效果:

基本思路是:

  1. 使用iOS自带Airplay服务将游戏画面投影到电脑上。
  2. 使用Pillow库截取电脑屏幕,获得游戏画面。
  3. 使用OpenCV分析图片,计算出跳跃距离,乘以时间系数获得按压时间。
  4. 将按压时间发送至树莓派/Arduino,树莓派/Arduino控制舵机点击手机屏幕。

运行环境&工具

  • Python 3.6 in Windows
  • Pillow、numpy 、pyfirmata
  • opencv-python
  • 局域网环境
  • iToools Airplayer
  • 树莓派 或 Arduino
  • SG90 舵机
  • 杜邦线、纸板
  • 一小块海绵
  • 橙子或其它多汁水果(可选)

原理&步骤

下载源码

  • 下载wechat_autojump_iOS&Win_opencv.py到Windows。
  • 如果使用树莓派,下载 servo_control.py到树莓派。
  • 如果使用Arduino,下载servo_control_arduino.py到Windows,并且确保windows已经装好Arduino驱动和Arduino IDE。

舵机部分

  • 拿一根杜邦线粘在舵机的摆臂上,并且用纸板固定舵机到合适高度,如图:

  • 取一小块海绵,约10mm*10mm*5mm,不必太精确。海绵中间挖一个小洞。大概是这样:
  • 海绵上滴水浸透,放在手机屏幕上“再来一次”的位置。杜邦线的另一头插进橙子。(触发电容屏需要在屏幕上形成一个电场,我尝试过连接干电池负极的方案,但是效果不理想,最后不得已拿了室友的一个橙子。当然,一直捏着或者含着导线也是可以的。)

如果使用树莓派

  • 舵机连接上树莓派,电源使用5v(Pin #04,Pin #06),舵机控制线接在GPIO18(Pin #12)。

  • 树莓派(OS:Raspbian Jessie)连接上局域网。
  • 打开 servo_control.py,这里需要根据实际安装位置调整舵机高点和低点位置(范围: 2.5~12.5)
servo_down = 3.8
servo_up = 5 

最终效果

  • 海绵放在“再来一次”的位置可以自动重新开始,然后就会一直自动刷分
  • 在wechat_autojump_iOS&Win_opencv.py里

文档的开头需要注释掉这句,这是Arduino使用的

#from servo_control_arduino import arduino_servo_run

设置树莓派的ip地址

ip_addr = '192.168.199.181'

main()函数里面需要选择 send_time()

# #send_time() 为树莓派控制函数
 send_time(t)

 # #arduino_servo_run() 为arduino控制函数
 ##arduino_servo_run(t/1000)
  • 最后树莓派上运行servo_control.py ,监听9999端口,等待Win的计算结果

如果使用Arduino

  • Arduino请选择Arduino UNO或Arduino Mega,因为pyfrimata库不支持Arduino Nano。入门级的Arduino UNO成本在80RMB左右。
  • Arduino需要烧入预置的StandardFirmata程序,在Arduino IDE的自带示例里面可以找到
  • 在工具—端口可以看到当前Arduino连接的串行端口,记下来等下要用到。

  • 安装pyfirmata,cmd运行
pip install pyfirmata
  • 把舵机连接上Arduino,舵机有一个三线的接口。黑色(或棕色)的线是接地线,红线接+5V电压,黄线(或是白色或橙色)接控制信号端。舵机的电源线直接接在Arduino的+5V输出和GND上,控制信号端接在Digital 3输出口(程序设置是3号口,可以修改,但是必须是支持PWM输出的接口)

如果做完下面步骤,程序跑起来之后,发现舵机即使不动也会发出 “滋滋”的声音而且动作缓慢,是因为电脑USB口供电不足所致。这个时候需要对舵机使用外接5V电源,接上5V电源之后,还要把外接电源的地线(负极)跟Arduino的地线(板上的GND口)连在一起。

  • 打开servo_control_arduino.py,这是Arduino的控制脚本

这里填入上一步看到的端口

# 修改串口编号 如果Arduino驱动正确,在Arduino IDE可以看到串口编号
serial_int = 'COM3'

这里根据Arduino的型号选择,不需要的那行注释或删掉

# 如果是Arduino UNO 使用这一行
board = pyfirmata.Arduino(serial_int)

# 如果是Arduino Mega 使用这一行  pyfirmata库暂不支持Nano
board = pyfirmata.ArduinoMega(serial_int)

然后调试一下舵机的最高点和最低点

# 设置舵机的高点和低点  单位:角度
# 范围 0-180°
servo_high = 45
servo_low = 37

舵机要根据实际的安装位置调试,运动幅度不宜太大,直接运行servo_control_arduino.py文件舵机会按设定位置来循环三次,如果舵机运动正常,则Arduino部分工作正常。

  • 打开wechat_autojump_iOS&Win_opencv.py,也有一些地方需要配置

这行代码位于文件开头,确保没有被注释

from servo_control_arduino import arduino_servo_run

到文档的靠后的部分找到main()函数,其中

控制函数选择 arduino_servo_run(),需要把send_time(t)注释掉

# #send_time() 为树莓派控制函数
# send_time(t)

# #arduino_servo_run() 为arduino控制函数
arduino_servo_run(t/1000)

配置完成

橙子有点蔫了。。。

Windows 部分

  • 下载Airplayer(免安装,暂无捆绑)
  • 配置Airplayer,画质什么的统统调到最高。启动iPhone上的Airplay,然后可以在电脑上看到iPhone画面,游戏运行时需要Airplayer全屏显示

  • 安装opencv-python、numpy
pip install numpy
pip install opencv-python
  • 下载wechat_autojump_iOS&Win_opencv.py,我的显示器分辨率是1920*1080,手机是iPhone7。如果使用不同的设备需要注意更改时间系数等参数。
  • 安装Pillow库,本文使用Pillow库的ImageGrab截屏,截屏代码:
im = ImageGrab.grab((654, 0, 1264, 1080)) 
im.save('a.png', 'png')

其中(654, 0, 1264, 1080)是截屏的范围,我的显示器分辨率是1080p,截取屏幕中间的部分得到的图片大小是610*1080,但这个时候图片最左边的一列的像素是黑色的。

  • 全部完成后,运行wechat_autojump_iOS&Win_opencv.py
  • 如果搭建完成后发现落点飘到天上去的情况,如图

是因为截图残留的黑边所致,这个黑边出现在截图的左边或者右边都会导致落点的计算偏差,打开screenshot_backups文件夹里面的图片会发现计算的轨迹像上图一样飘到整个图的上方。这时候的解决办法是:

找到pull_screenshot()函数:

# 使用PIL库截取Windows屏幕
def pull_screenshot():
    im = ImageGrab.grab((654, 0, 1264, 1080))
    im.save('a.png', 'png')

代码中(654, 0, 1264, 1080),表示截图的坐标。其中654,1264为截图的左边界和右边界,需要修改这两个边界使截图的尺寸变小。

举个例子,我发现默认参数的情况下出来的截图左边有3个像素的黑边,右边有1个像素的黑边,这个时候截图函数需要改成:

# 使用PIL库截取Windows屏幕
def pull_screenshot():
    im = ImageGrab.grab((657, 0, 1263, 1080)) # 左边增加3个像素,右边减少一个
    im.save('a.png', 'png')

修改完截图函数之后还需要修改默认图片的宽高,位置是在# Magic Number下面:

# Magic Number,不设置可能无法正常执行,请根据具体截图从上到下按需设置
under_game_score_y = 170  # 截图中刚好低于分数显示区域的 Y 坐标
press_coefficient = 2.38 # 长按的时间系数,
piece_base_height_1_2 = 10  # 二分之一的棋子底座高度,可能要调节
# 图片的宽和高
w,h = 610,1080

继续上面的例子,这个时候图片的宽和高需要改成

# 图片的宽和高
w,h = 606,1080  

然后再次运行程序检查截图是否还有黑边。

OpenCV算法详解

  • 本算法主要使用opencv和numpy两个库,首先要导入
import cv2
import numpy as np
  • 使用OpenCV模板匹配,找到棋子

棋子是一个非常特殊的目标,用PS把它抠出来,保存为模板使用OpevCV的模板匹配函数,准确率几乎完美。

meth = eval('cv2.TM_CCORR_NORMED')
piece_template = cv2.imread('piece.png',0) # 棋子模板
# 模板匹配 获取棋子坐标
def find_piece(img):
    res = cv2.matchTemplate(img, piece_template, meth)
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
    piece_x, piece_y = max_loc 
    # cv2.matchTemplate函数返回的是模板匹配最大值左上角的坐标
    # 下面修正为棋子底盘中点坐标
    piece_x = int(piece_x + piece_w / 2)
    piece_y = piece_y + piece_h - piece_base_height_1_2 
    return piece_x, piece_y

其中piece.png是棋子模板,长这样:

这个模板是必须的,但是它只适配610*1080的截图尺寸,如果分辨率跟我的有差异,需要另外扣一个模板,保存为png格式。如果对opencv没兴趣的话看到这里就可以跳过了。GitHub上还有其它目标的模板,但是不是一定要重新扣,原因下面讲。

  • 对其它特殊目标尝试模板匹配

我最初的想是对有加分的特殊目标(徐记士多,魔方,下水道,播放器)使用模板匹配,通过函数返回值使主函数增加延时,让我们可以吃到特殊目标的加分。但是后来发现模板匹配的效果不理想,可能是选用的匹配算法问题?或是模板问题?稍后尝试修复。

现在wechat_autojump_iOS&Win_opencv.py文件里有一段代码是进行特殊目标模板匹配的,但是因为我把置信度阈值调得很高(低了又乱匹配),所以匹配成功率非常低。如果不成功,则采用下面的算法寻找目标。

  • 对图片进行边缘检测

接下来继续寻找落点坐标,现在要把图像的边缘提取出来,游戏界面都是纯色,提取边缘非常容易:

因为已经获得了棋子坐标,所以这一步的时候先把棋子范围的像素去掉以免干扰。

代码是

img2 = cv2.GaussianBlur(img2, (3, 3), 0) # 先对图片高斯模糊
img_canny = cv2.Canny(img2, 1, 10) # 执行canny函数

输出的图像已经变成只有边缘的二值图像了

  • 尝试模板匹配小圆点

提取边缘之后尝试对连击之后的小圆点进行模板匹配,但是效果一样不理想,大部分时候会跳过这一步。

  • 找到目标落点

到了最后一步,就是找到棋子的落点,在代码中即board_,board_y。这个点有几个特点:

  1. 落点方块(圆柱)的最高点是整个图的最高点,先定义为board_y_top,这里我们已经排除了分数部分,背景和有可能高过方块的棋子部分。
  2. 落点平面的形状是对称的菱形或者椭圆形,确实有个别特殊的情况我们先不在意这些细节。然后这些形状在垂直方向是轴对称的,所以board_y_top一定在垂直的对称轴上。
  3. 同时落点平面也是水平方向轴对称的,并且从上往下遍历的第一个宽度最大的点是水平对称轴的位置。随便搞个图

然后我的思路是先找board_y_top:

# 遍历起点为分数下沿
board_y_top = under_game_score_y

for i in img_canny[under_game_score_y:]:
    if max(i): # i是一整行像素的list,max(i)返回最大值,一旦最大值存在,则找到了board_y_top
            break
    board_y_top += 1

# board_y_top的像素可能有多个 对它们的坐标取平均值
board_x = int(np.mean(np.nonzero(img_canny[board_y_top]))) 

然后从board_y_top开始找图形的侧边缘,因为是对称图形只要找左右边缘之一就可以了。但是在两个落点非常近的时候,棋子会挡住其中一个边缘,造成影响。所以先根据棋子位置判断棋子在目标落点的左边还是右边,再选择与棋子不同的位置寻找侧边沿

x1 = board_x
    fail_count = 0
    if board_x > piece_x:
        for i in img_canny[board_y_top:board_y_top+80]:
            try:
                x = max(np.nonzero(i)[0])
            except:
                pass
            if x > x1:
                x1 = x
                board_y += 1
                if fail_count < 5 and fail_count != 0:
                    fail_count -= 1
            elif fail_count > 5 and board_y - board_y_bottom >10:
                result = 1
                board_y -= 3
                break
            elif fail_count > 5 and board_y - board_y_bottom <= 10:
                result = 0
                break

            else:
                fail_count += 1

    else:
        for i in img_canny[board_y_top:board_y_top+80]:
            try:
                x = min(np.nonzero(i)[0])
            except:
                pass
            if  x < x1:
                x1 = x
                board_y += 1
                if fail_count < 5 and fail_count != 0:
                    fail_count -= 1
            elif fail_count > 5 and board_y - board_y_bottom > 10:
                board_y -= 3
                result = 1
                break
            elif fail_count > 5 and board_y - board_y_bottom <= 10:
                result = 0
                break
            else:
                fail_count += 1

这段代码非常的不pythonic,得想办法优化,其中零零碎碎的整数是一些容差参数,因为在像素角度不是绝对的圆形和方形,在方型平面上的效果会比圆形平面好,但是总体效果都很不错。

  • 最后,在上面那个算法抽风的情况下,采用原来的旧算法补救,可以说是十分之稳了
if result == 0:
        board_y = piece_y - abs(board_x - piece_x) * math.sqrt(3) / 3

问题&其它

  • 采用新版算法后,计算上的误差已经很小,可以查看screenshot_backups/文件夹,看是否得到正确的计算结果。但是仍然无法一直连续击中中心,这是由于舵机的物理误差引起的,需要调节好时间系数,舵机的高点和低点。如果采用海绵+水的接触方案,注意接触面的高度会因为水的蒸发而改变。评论区也有锡纸接触的方案,就看你们喜欢拉。
  • (1.3 已解决)由于是物理点击屏幕,会产生一定的操作误差。操作误差由时间常数误差、舵机运动时间、杜邦线触点插进海绵的深度等等因素引起。而当前使用的算法在一种情况下会出现误差叠加的问题。

Z形路径误差累积过程

如图:在绿色方块跳至灰色方块的过程中,出现操作误差。连续“Z形”路径中误差会逐渐累积。这个问题在落点方块较小时有一定的发生概率。我尝试过添加一些纠正算法,但效果不明显。这个误差会在Z形路径中断时(出现连续3个落点在一条直线上)自动修正。如果误差较大棋子即将掉落,可以终止程序,手动修改时间系数纠正。

  • 舵机的摆动角度和时间系数没有绝对的数值,需要慢慢尝试,当前使用的时间系数是2.43。
  • 可以使用arduino + pyfirmata组合控制舵机,成本比较低,已经可以用arduino啦~。
  • 这个游戏在跳了200+次之后方块会变的非常小(如题图),已经不是普通人类所能做到的。研究了外挂之后才知道手玩高分有多难,大家还是不要刷分了,会没朋友的。

来自一只正在艰难地转CS的通信狗,并没有二维码。第一次发文章,有很多小问题,欢迎各路大佬指教,给大佬倒茶。

 

转载自:https://zhuanlan.zhihu.com/p/32526110

认知百科精神领域-”阶层流动”必须努力的故事

我走在大学校园里,夏有梧桐秋有银杏,学校有名我无名,然而我走在文化中,我好像文化中的一员。我走在CBD,高楼林立而寂然无声,人们西装革履谈吐优雅,我也西装革履谈吐优雅,我身处大中国的大城市的心脏,我是心脏中热血奔流的一滴。

我并没有钱,然而我拿着过万的工资,我便坦然地按着过万的收入分配消费,我走过百货商场,看着艾格拉夏贝尔圣迪奥这些大学时代买不起的牌子轻轻一笑嫌弃档次,然而我走过一楼安静的奢侈品时不动声色捏紧了荷包。我站在黄金城市的黄金区域,做着这个黄金时代的黄金职业,我觉得自己和黄金融为一体,我是黄金的一员。

我过年回家,从飞机换高铁转长途,窗外的楼一路矮下去,最后坐上自己出身的县城肮脏破旧的公交车,我忍不住地窃喜,我走出来了,真好,看我真有出息。看看这里,落后,裙带关系横飞,公共设施脏乱,啊,这是我从前的故乡,如今不啻心中的深渊。

我走出了深渊,我自我感觉特别良好,我抽出一张清香的纸巾,我包好刚好嚼到没味道的口香糖,我在没人理会的分类垃圾桶前踌躇片刻,我自信地丢去“不可回收”的那一个。我来自都市文明,我来自文明都市。我孝顺,懂礼貌,我走路要直线,我要让家人一同享受,我也要接他们去吃高级日料,带他们听歌剧,让某年会出生的一个幸福小生命住在学区房里,三岁英语五岁钢琴。

然而联系我和这一切都市文明的唯一,不过一份工作而已。

当我停滞不前,当我及时行乐,我发现朝九晚五和白领高薪不可兼得,我不是我引以为傲的母校里唯一优秀的学生,新的人才被不断培养出来,新的血液不断注入,新的行业被不断创造出来,新的知识要不断学习,新的技能要跑着去掌握。还没等年终奖到手,新建立的企业将广告撒满天下,我谋生的公司市场份额步步退缩,苟延残喘。我自诩为擅长的expertise成为明日黄花,行业内已无人再使用。

我失去了这个联系,我安慰自己,岁月静好现世安稳,山河犹在国泰明安,回家吧,让温馨平淡的隐居生活抚慰这道创伤。

我发现家乡没有能匹配我专业的工作,我发现那寥寥的几个公司开出的薪水是我从前一个月的房租,我想看的电影没有3D影院可以放映,我喜欢的歌手从不来这里开演唱会,我踩在马路上没走几步裤腿已经沾灰,我晚上肚子饿没有便利店在等着。我过着柴米油盐自己有空做饭的日子,饭做好了我也摆到好看,我用着前年款的iphone拍了照片,我不屑用美图秀秀,我用PS加了康熙字典体,我也发朋友圈炫耀。年岁到时我被热心的阿姨拉去相亲。我坐在桌前,看着对面靠家里关系拿到职位的年轻人声音嘹亮地高谈阔论,我心中得意一笑,我想指出他的观点逻辑混乱,我想说出他的常识错误,我想和他一辩再辩。为什么不呢?我是从前的学霸而今的知识女性。
他按灭了烟头,喊,服务员!菜怎么还没来?

我真诚地爱着这故乡,可以写出千百篇高考作文来歌颂;我也真诚地、不为人知地嫌弃着它,从空气到土地。

我卑鄙吗?我俗气吗?
我脆弱吗?我无能吗?

我勤奋聪明,我热爱学习,我用知识改变了命运。我知道genetics,我忍不下转基因的谣言碎语;我养成说你好对不起谢谢的习惯,我不愿意去插队占用老弱病残专座;
我得益于良好的环境,我在良好的环境中成长为一个我满意的人。
环境是多么强大啊,同化一切!我感激从前读书上进的日子,我怀念从前理性聪明的同事。我鼓励自己继续上进,我坚信我能继续出淤泥而不染。

多年之后我早晨起来对着镜子梳妆打扮,我出门上班,我看见公交前队伍如龙,我皱起眉头也上前奋力挤去,我到了单位和同事一起淘宝广东来的A货包包,一个男同事把一块钱的红包拆成二十份,我连忙登录微信,我拿到了0.4元,我是手气最好。
深渊原来并非深渊,哪里有所谓深渊?争名逐利又如何?不过是生活细水如流,我大彻大悟,心满意足。
一抬头,见上面有个年轻姑娘在凝视着我,一脸书生气,目光怜悯又自得。

我以为这是我一个人的故事,原来它已有名字——“阶层流动”——而我的故事,不过是万万千千中平庸的一个。

我不是喜爱努力,我只是必须努力。我只是必须努力,并且每时每刻

*文中“我”为虚指。

作者:甘棠
链接:https://www.zhihu.com/question/39057568/answer/80005753

认知百科教育领域-女生靠结婚靠年轻不如靠学历稳

我肯定算底层家庭出身又有几分姿色的女孩。现在在国内top5名校读书。

家里条件不好又算得上漂亮的女生我初中一抓一把,她们在玻璃厂、超市工作,因为未婚先孕草草结婚,男孩子几句甜言蜜语就任人宰割。
当然有擅用美貌的,可是漂亮妞一茬儿一茬儿的来,竞争太激烈了。接近权力就自以为拥有权力,太傻了。
光靠漂亮脸蛋实现阶级跨越,对不起我真没见过。况且,又穷又贪又没见过世面还漂亮,不骗你骗谁。

看到她们,我更庆幸自己拼死考上现在的学校。我去过很多地方参加过比赛,当过交换生,导师带我去过很贵很贵的餐厅,有车有房学历很高的学长追过我。
只要我再努力一点,就可以申csc出国。

我接触过富二代,高官子女,公司老板,学术大牛。虽然不指望和他们有一毛钱关系,但我亲眼见过底层的女孩向往的生活。
因为亲眼见过,我知道饵再诱人,也不能用身体去搏,得不到的。

我承认年轻美貌是资本,但是没脑子没见识,好皮囊会成无妄之灾。
我也深知读了名校以后,想脱离底层一样还有很远的路,可是,比起靠男人靠结婚靠年轻,靠学历靠得住太多太多了。
读书是你唯一抓得住的,你知道吗。

作者:匿名用户
转载自:https://www.zhihu.com/question/59445150/answer/166725891

职场百科专业选择-公务员真的那么好吗?

刚刚考上家附近的公务员。
16年本科毕业计算机专业,考上公务员之前在成都敲了一年的代码,是在一个初创公司,待遇给的其实蛮不错,7k多一个月,对于我这种刚刚毕业的人来说蛮高了,加班也不算多,一般是项目上线前会加班一周,平时上班时间一般是九点半到六点半,我一般晚上七点走,因为不打卡的缘故所以早上也时不时十点才到公司哈哈哈。其实家就在成都旁边某城市,但是最终我还是谋生了离职的想法,离职的原因一方面是我认为互联网虽然发展快,但是技术的更替也快,需要不断学习和提升,但是往往一个公司的技术方向是确定的,那么如果换工作就需要在很短时间里去掌握其他的东西,我虽然现在才20多岁但是假如我30多了我有了家庭有了孩子我的学习能力和精力是否能跟上?第二是我现在选择的是初创公司,这样可以最大发挥我自己的能力,做出的项目也更有成就感,但是我肯定会逐步去大公司发展,我的同学很多一毕业就去迅雷京东这类次顶级互联网公司了,薪水也确实比我可观很多,但是他们却又向我抱怨他们的上班时间长加班时间多,996算是正常工作时间。我记得前不久聚餐,大家都胖了不少,但是我精神面貌比他们都好,因为他们大部分时间晚上十点回家都可能还要继续工作但是我八点就开始吃鸡或者和女友聊天甚至休息了。第三是华为辞退34岁员工的这个事我琢磨了一下,我一个码农假如没法进入管理层那么我在35以后我的价值肯定会降低,到了40岁的时候基本上市场价值和一个工作三年的码农可能就差不多了,因为大公司有更好的选择而小公司又给不了合适的价格,那我以及大多数我这种人肯定只能降低身价,但是那个时候正是家庭最需要钱的时候,那我是继续做一个月一万多的工作透支身体还是选择创业?创业的话埋头苦干交际圈窄的程序员创业的社会资源在哪里?最后一个原因可能也最致命,和女友分手了,原因是我不够关心她,说实话我现在也觉得莫名其妙。然后她一个月后就和别人好上了,社会社会。
然后我琢磨着考公务员吧。公务员在三四线城市可以说性价比极高。收入算中上,压力相对小一些,能接触一定的社会资源同时父母以及未来岳父岳母也满意啊。
由于交接等工作,我八月三十一号离职的九月二十三号考试居然考了第一,这我也得说不破不立啊。
然后因为已经离职了所以时间大把,报了个面试班面试也第一,现在已经在政审阶段了。
好了然后我再说一下公务员哪里好因为我父亲是公务员所以多少了解一点。首先他年纪大了加之经常下乡所以上班时间很随意,如果愿意的话甚至可以九点去上班十点就走,局长也很开明只要你完成工作其他的自己安排时间。所以我爸气色很好随时都乐呵呵的,心态很正。第二每年十五天公休假,再加上其他各种假,一年二三十天吧,因为我妈是教师所以他们可以很容易一起出去旅行,夫妻之间相处时间很多感情很稳定。第三收入,算上公积金的话一年十万左右,根据年终奖的多少而波动。我们这里房价5k左右。然后可以工作之余搞点小副业,公务员贷款利息极低再加上有资源所以可以去买商铺出租,当然这是最稳的,也可以和朋友开店啥的赚钱与否因人而异。第三就是社会地位有,再加上稳定所以很好相亲,考上后各种知道我分手了的来说媒。
所以我觉得公务员在三四线城市属于能考就一定去考着试试的工种,一线城市适合各种二代。
不过目前精准扶贫很累人尤其是基层,但是我敢说比很多给别人打工的还是要轻松一点的。
————————————————–
我现在又想了想,我并不是非要去赚那么多钱,我只是想能够更多的陪伴家人和朋友,钱是永远赚不完的,对我而言人活着,有比钱和理想重要的东西,而且太多太多。
转载自:https://www.zhihu.com/question/20062767/answer/292898341

学术百科论文领域-常见学术名词介绍

SCI、影响因子、引用次数及CNS是什么?

SCI是美国《科学引文索引》(Science Citation Index,简称)由美国科学信息研究所(Institute for Scientific Information,简称ISI,现被并入汤姆森集团)主办,是目前国际上公认的最具权威的科技文献检索工具,它从全球挑选出 6500种刊物(其中中国72种),将其刊载文章收录其中由于不同质量的期刊和文章被引用的频率不同,SCI在实际应用中,逐渐派生出科研绩效评价功能,但目前学术界公认的看法是,SCI在科研绩效评价中只能起辅助作用,学术评价仍应以国际通行的同行评议为主。

 

影响因子(impact factor)是美国汤姆森(Thomson)公司搞出来的引用程度指数。从这个指数可以看出每种杂志文章的引用多寡程度。引用次数及文章被征引次数。例如ISI 在2003年九月底整理出一份到2002年为止所有领域期刊被引用次数的前十名,其中,《生物化学期刊》(Journal of Biological Chemistry)以370,056次,再度蝉联宝座;英国《自然》(Nature)期刊 以326,546次,屈居亚军,《美国国家科学院刊》(Proceedings of the National Academy of Sciences, USA)与《科学》(Science)期刊则是分居第三、四名。临床医学领域与基础医学领域之经典期刊-《新英格兰医学杂志》(New England Journal of Medicine)、《细胞》(Cell)则是分别名列第八名与第十名。由于影响因子前6甚至前10的杂志,全跟生物有关的领域有关。原因是这些年生物方面的文章多,引用也多,影响因子必然高出其他领域很多,使得水平和IF不能直接划等号。在生物以外的其他领域,高水平的杂志IF也比较高,仍然是事实。虽然大家不明说IF,但直接参考IF评价水平,也没什么大问题。在许多地方成为教授是否可以晋升、申请科研基金的一个重要指标。但也不全然可从IF值来评价文章水平的高低,如在生物学领域,很多有重要影响的文章是发表在不知名杂志上的;而有些大学者,一生的文章也没有几篇。比如,Luria和Delbruck证明基因突变的文章,发表在Genetics上;Avery证明DNA是遗传物质的文章,发表在Journal of Experimental Medicine 上;即使是Hershey和Chase的获得诺贝尔奖的那个著名试验,也不过发表在Journal of General Physiology上。获得诺贝尔奖的学者,绝大多数人都是根据一篇或少数几篇文章才获此殊荣的。以量取胜的例子当然也有,但极为罕见。

 

CNS(Cell, Nature, Science)是美国Cell(《细胞》)、英国Nature(《自然》)及美国Science(《科学》)三大举世公认的顶极科学期刊简称。做科学以在其中一个杂志上发表论文为荣。在几个生命科学著名杂志里面,有英国的《自然》、美国的《科学》、《细胞》、《新英格兰医学杂志》和《自然》的几个分科杂志。《自然》和《科学》有不同学科的论文,一般认为《自然》和《科学》的长文(在两个杂志里分别称为articles和research articles)最难进,然后是《细胞》,再是《自然》和《科学》的短文(分别称为letters和reports)。当然长短还和资料多少有关。《新英格兰医学杂志》的权威性和历史要优于《自然·医学》。但绝对区分杂志很难:《自然 · 细胞生物学》与《分子细胞》和《基因与发育》相当,并与《欧洲分子生物学组织杂志》接近,《自然 · 神经科学》与《神经元》相当,《自然·免疫学》与《免疫》和《实验医学杂志》相当。

转载自:http://hanxiumei3061.blog.163.com/blog/static/1076792762009816102823618/

 

wordpress-修改26主题代码记录

修改twenty-sixteen主题代码记录

一、添加了底部日期和版权信息

需要修改 foot.php 文件

<div class="site-info">
				<?php
					/**
					 * Fires before the twentysixteen footer text for footer customization.
					 *
					 * @since Twenty Sixteen 1.0
					 */
					do_action( 'twentysixteen_credits' );
				?>
		
				<span class="site-title">
		© Copyright 2017 -&nbsp;<?php esc_attr_e(date('Y')); ?> &nbsp;|&nbsp;
<a href="<?php echo esc_url( home_url( '/' ) ); ?>" rel="home"><?php bloginfo( 'name' ); ?></a>
		|&nbsp;&nbsp;All Rights Reserved		
				</span>
				<a href="<?php echo esc_url( __( 'https://wordpress.org/', 'twentysixteen' ) ); ?>"><?php printf( __( 'Proudly powered by %s', 'twentysixteen' ), 'WordPress' ); ?></a>
				
			</div><!-- .site-info -->

二、添加了额外的主题的css样式

不需要修改文件,只需要在 appearance 的 customize里面的 additional css 里面添加就行了

@media screen and (min-width: 61.5625em){

body:not(.search-results) article:not(.type-page) .entry-content {
		float: right;
		width: 100%;
	}
	
}

@media screen and (min-width: 56.875em)
{
.sidebar {
    margin-left: 72%;
    width: 28%;
}
}

wordpress-子主题Child Theme

zh-cn:子主题

WordPress子主题也是一个主题,它继承了另一个主题——父主题——的功能,并允许你对父主题的功能进行修改,或者添加新功能。本文将说明如何创建一个基本的子主题并解释您能用它来干什么。本文将使用 WordPress 3.0 的默认主题 Twenty Ten 作为父主题进行举例说明。

创建一个子主题是很简单的。创建一个目录,将格式编写正确的 style.css 文件放进去,一个子主题就做成了!只需要对 HTML 和 CSS具有基本的了解,您就可以通过创建一个非常基本的子主题 来对一个父主题的样式和布局进行修改和扩展,而不需要对父主题的文件作任何修改。通过这样的方式,当父主题被更新的时候,您所做的修改就可以保存下来。

因为这个原因,我们强烈推荐您使用子主题的方式来对主题进行修改。

如果您对 PHP, WordPress Templates,和 WordPress Plugin API有个基本的理解,理论上来讲,您可以使用子主题对父主题的每一个方面进行扩展,而不需要对父主题的文件进行任何修改。

目录结构

子主题放在wp-content/themes目录下属于自己的目录里。下面的结构显示的就是子主题和它的父主题(Twenty Ten)在典型的WordPress目录结构中的位置:

  • public_html
    • wp-content
      • themes (主题存放的目录)
        • twentyten (示例中父主题Twenty Ten的目录)
        • twentyten-child (子主题存放的目录,可以任意命名)
          • style.css (子主题中不可或缺的文件,文件名必需为 style.css)

这个文件夹里面可以少至只包含一个style.css文件,也可以包含多至一个完整WordPress主题所拥有的文件:

  1. style.css (必需)
  2. functions.php (可选)
  3. Template files (可选)
  4. Other files (可选)

让我们看看它们是如何起作用的。

必需的style.css文件

style.css是一个子主题唯一必须的文件。它的头部提供的信息让WordPress辨认出子主题,并且重写父主题中的style.css文件

对于任何WordPress主题,头部信息必须位于文件的顶端,唯一的区别就是子主题中的Template:行是必须的,因为它让WordPress知道子主题的父主题是什么。

下面是一个style.css文件的头部信息的示例:

/*
Theme Name:     Twenty Ten Child
Theme URI:      http: //example.com/
Description:    Child theme for the Twenty Ten theme 
Author:         Your name here
Author URI:     http: //example.com/about/
Template:       twentyten
Version:        0.1.0
*/

逐行的简单解释:

  • Theme Name. (必需) 子主题的名称
  • Theme URI. (可选) 子主题的主页。
  • Description. (可选) 子主题的描述。比如:我的第一个子主题,真棒!
  • Author URI. (可选) 作者主页。
  • Author. (optional) 作者的名字。
  • Template. (必需) 父主题的目录名,区别大小写。 注意: 当你更改子主题名字时,要先换成别的主题。
  • Version. (可选) 子主题的版本。比如:0.1,1.0,等。

*/ 这个关闭标记的后面部分,就会按照一个常规的样式表文件一样生效,你可以把你想对WordPress应用的样式规则都写在它的后面。

要注意的是,子主题的样式表会替换父主题的样式表而生效。(事实上WordPress根本就不会载入父主题的样式表。)所以,如果你想简单地改变父主题中的一些样式和结构——而不是从头开始制作新主题——你必须明确的导入父主题的样式表,然后对它进行修改。下面的例子告诉你如何使用@import规则完成这个。

一个子主题的范例

这个例子中的父主题是Twenty Ten,我们喜欢这个主题的几乎每个部分,除了网站标题的颜色,因为我想把它从黑色的改成绿色的。使用子主题的话,只用完成以下三个简单的步骤:

  1. wp-content/themes目录下创建一个新目录,并将它命名为twentyten-child(或其他你喜欢的名称)。
  2. 将下面的代码保存在名为style.css的文件里,并将它放到新建的这个文件夹。
  3. 到WordPress的控制台>主题,然后激活你的新主题:Twenty Ten Child。
/*
Theme Name: Twenty Ten Child
Description: Child theme for the Twenty Ten theme 
Author: Your name here
Template: twentyten
*/

@import url("../twentyten/style.css");

#site-title a {
    color: #009900;
}

下面一步步解释上面代码的作用:

  1. /* 开启子主题的头部信息。
  2. Theme Name: 子主题名称的声明。
  3. Description: 主题的描述(可选,也可被省略)。
  4. Author: 作者名字的声明(可选,也可被省略)。
  5. Template: 声明子主题的父主题,换言之,父主题所在的文件夹的名称,区分大小写。
  6. */子主题头部信息的关闭标记。
  7. 用 @import规则将父主题的样式表调入
  8. #site-title a 定义网站标题的颜色(绿色),覆盖父主题中相同的样式规则。

注意 @import 规则

需要注意的是,@import 规则之前没有其他的CSS样式规则,如果你将其他的规则置于它之上,那么它将无效,并且父主题的样式表不会被导入。

使用 functions.php

不像style.css,子主题中的functions.php不会覆盖父主题中对应功能,而是将新的功能加入到父主题的functions.php中。(其实它会在父主题文件加载之前先载入。)

这样,子主题的functions.php提供了一个灵活稳定的方式来修改父主题的功能。如果你想在你的主题里加入一些PHP函数,最快的方式可能是打开functions.php文件然后加入进去。但那样并不灵活:下次你的主题升级更新了,你加入的新功能就会丢失掉。相反地,如果你使用子主题,将functions.php文件放进去,再将你想加入的功能写进这个文件里,那么这个功能同样会工作得很好,并且对于父主题以后的升级更新,子主题中加入的功能也不会受到影响。

functions.php文件的结构非常简单:将PHP起始标签置于顶部,关闭标签置于底部,它们之间就写上你自己的PHP函数。你可以写得很多,也可以写得很少,反正按你所需。下面的示例是一个基本的functions.php文件的写法,作用是将favicon链接加入到HTML页面的head元素里面。

<?php

function favicon_link() {
    echo '<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico" />' . "\n";
}
add_action('wp_head', 'favicon_link');

?>

给主题作者的提示。事实上子主题的functions.php首先加载意味着你的主题的用户功能可插入——即子主题是可替换的——通过有条件地进行声明。例如:

if (!function_exists('theme_special_nav')) {
    function theme_special_nav() {
        //  Do something.
    }
}

注意,替换的过程是在父级主题中,使用php的function_exits进行判断。 用这种方式,子主题可以替换父主题中的一个PHP函数,只需要简单地对它再次声明。

模板文件

模板文件 在子主题中的表现和style.css一样,它们会覆盖父主题中的相同文件。子主题可以覆盖任何父主题模板中的文件,只需要创建同名文件就行。(注意:index.php在WordPress3.0及以上版本才能被覆盖。)

同样,这项WordPress的功能允许你修改父主题的样式功能而不用去编辑父主题的文件,并且你的修改能让你在更新父主题后继续保留。

下面是一些使用模板文件的子主题的例子:

  • 增加一个父主题没有提供的模板(例如:网站地图页面的模板,或者一单栏页面,它们在页面编辑,模板选择里是可用的)
  • 增加一个比父模板更加具体的模板(见模板级别)。(例如:新加的tag.php模板用于按tag归档的文章来代替父主题中通常的archive.php模板。)
  • 替换父主题中的一个模板.(例:使用你自己的home.php来覆盖父主题中的home.php

其他文件

除了style.css,functions.php,index.php和home.php,子主题可以使用任何正式主题使用的类型的文件,只要文件被正确链接。打个比方,你可以使用在样式表里或者Javascript文件里链接的图标、图片,或者从functions.php文件中调用出来的额外PHP文件。

转载自:https://codex.wordpress.org/Child_Themes

ftp软件-免费开源的FileZilla

FileZilla是一个免费开源的FTP软件,分为客户端版本和服务器版本,具备所有的FTP软件功能。可控性、有条理的界面和管理多站点的简化方式使得Filezilla客户端版成为一个方便高效的FTP客户端工具,而FileZilla Server则是一个小巧并且可靠的支持FTP&SFTP的FTP服务器软件。
FileZilla是一种快速、可信赖的FTP客户端以及服务器端开放源代码程式,具有多种特色、直接的接口。FileZilla在2002年11月获选为当月最佳推荐专案。
因为需要对网站进行管理,所以利用FileZilla的站点管理功能,将本地文件传送到服务器。也可以下载服务器文件。其实利用 了sftp功能,FileZilla支持网络代理。可以方便的进行远程连接操作。

 
 
 

windows特有软件-AdvanceSystemCare

Advanced SystemCare

Advanced SystemCare是一款能分析系统性能瓶颈的优化软件。它通过对系统全方位的诊断,找到系统性能的瓶颈所在,然后有针对性地进行修改、优化。优化后系统性能和网络速度都会有明显提升。

       平常使用的时候感觉不错,就记录一下。