分类: Web 相关

  • 北京工业大学校园网自动登录shell脚本

    北京工业大学校园网自动登录shell脚本

    时效性提醒:本文首次编写发布于7 年前。

    运动会没课,正好有时间,用shell脚本重写了一下之前的python自动登录脚本,这次写死了一些在北工大校园网内不会变的值,比原来完全python爬虫模拟的方式大幅简化,并且能够自动判断WiFi和有线网,同样支持IPv6登录(默认不启用)。

    github地址:https://gist.github.com/WuSiYu/edb10f958cdfecc28688f02e0ec83deb

    使用很简单,在后面加入用户名和密码即可,有线无线会自动判断。默认下,有线以“ipv4认证”登录,WiFi正常登录:

    ./bjut-autologin.sh <user> <password>

    设置LOGIN_IPV6环境变量后,将启用ipv6登录,此时有线以“ipv4与ipv6统一认证”,WiFi下会在正常登录后再到lgn6.bjut.edu.cn进行“ipv6认证”,在WiFi下会导致多占用一个session,一共占用两个session(都9102年了还限制2 session登录的学校是屑)。而有线因为有“统一认证”,所以还是一个session:

    LOGIN_IPV6=1 ./bjut-autologin.sh <user> <password>

    同时本脚本还有“一键登出”的功能,在脚本后面加上-l--logout即可,有线无线同样是自动判断:

    ./bjut-autologin.sh -l

    本脚本仅依赖curl,在openwrt上可能需要手动安装一下。不过就算用自带的wget,还是得手动装https的支持(在某工大不隔离的大内网下用http的理智程度大概并不高),所以综合来讲还是curl比较划算。

    runing on openwrt

    脚本内容

    #!/bin/sh
    
    # Copyright (c) 2019 SiYu Wu <wu.siyu@hotmail.com>
    # BJUT gateway auto login script v0.1
    # Usage: bjut-autologin.sh <user> <password>
    #    set LOGIN_IPV6=1 to enable ipv6 login, it will use one extra session on WiFi.
    
    LOGIN_IPV6=${LOGIN_IPV6:-0}
    
    if [ $# -ne 2 ] && !([ $# -eq 1 ] && ([[ $1 == '-l' ]] || [[ $1 == '--logout' ]]) ); then
    	echo "Usage: $0 <user> <password>"
    	echo "       $0 -l, --logout"
    	echo "  set LOGIN_IPV6=1 to enable ipv6 login, it will use one extra session on WiFi."
    	exit 1
    fi
    
    
    if [ $# -eq 1 ] && ([[ $1 == '-l' ]] || [[ $1 == '--logout' ]]); then
    	res=`curl -m 2 -s https://lgn.bjut.edu.cn/F.htm`
    	if [ `echo $res | grep -c 'Logout Error(no webmode)'` -eq 1 ]; then
    		echo 'WiFi connection detected'
    
    		res=`curl -m 2 -s https://wlgn.bjut.edu.cn/F.htm`
    		if [ `echo $res | grep -c 'Msg=14'` -eq 1 ]; then
    			echo '==> WiFi logout successful'
    		else
    			echo 'Error: WiFi logout failed!'
    		fi
    
    	elif [ `echo $res | grep -c 'Msg=14'` -eq 1 ]; then
    		echo '==> Wired logout successful'
    	else
    		echo 'Error: Wired logout failed!'
    	fi
    
    	exit 0
    fi
    
    
    lgn_code=`curl -m 2 -s -o /dev/null -w "%{http_code}" http://lgn.bjut.edu.cn`
    
    if [ $lgn_code -eq 302 ]; then
    	echo 'WiFi connection detected'
    
    	res=`curl -m 2 -s --data "DDDDD=$1&upass=$2&6MKKey=%B5%C7%C2%BC+Login" https://wlgn.bjut.edu.cn`
    	if [ `echo $res | grep -c 'successfully logged in'` -eq 1 ]; then
    		echo '==> WiFi ipv4 login successful'
    	else
    		echo 'Error: WiFi ipv4 login failed!'
    	fi
    
    	if [ $LOGIN_IPV6 -ne 0 ]; then
    		res=`curl -m 2 -s --data "DDDDD=$1&upass=$2&v46s=2&v6ip=&f4serip=172.30.201.2&0MKKey=" https://lgn6.bjut.edu.cn/`
    		if [ `echo $res | grep -c 'successfully logged in'` -eq 1 ]; then
    			echo '==> WiFi ipv6 login successful'
    		else
    			echo 'Error: WiFi ipv6 login failed!'
    		fi
    	fi
    
    elif [ $lgn_code -eq 200 ]; then
    	lgn_response=`curl -m 2 -s http://lgn.bjut.edu.cn`
    	if [ `echo $lgn_response | grep -c Balance` -eq 1 ]; then
    		echo "Error: Already logged in"
    		exit 2
    	else
    		echo 'Wired connection detected'
    
    		if [ $LOGIN_IPV6 -ne 0 ]; then
    			res=`curl -m 2 -s --data "DDDDD=$1&upass=$2&v46s=0&v6ip=&f4serip=172.30.201.2&0MKKey=" https://lgn6.bjut.edu.cn/V6?https://lgn.bjut.edu.cn`
    			v6ip=${res:419:39}   # TODO: This implementation is not aesthetically pleasing due to compatibility with small systems without `sed` command.
    			res=`curl -m 2 -s --data "DDDDD=$1&upass=$2&0MKKey=Login&v6ip=$v6ip" https://lgn.bjut.edu.cn/`
    			if [ `echo $res | grep -c 'successfully logged in'` -eq 1 ]; then
    				echo '==> Wired ipv4+ipv6 login successful'
    			else
    				echo 'Error: Wired ipv4+ipv6 login failed!'
    			fi
    
    		else
    			res=`curl -m 2 -s --data "DDDDD=$1&upass=$2&v46s=1&v6ip=&f4serip=172.30.201.2&0MKKey=" https://lgn.bjut.edu.cn`
    			if [ `echo $res | grep -c 'successfully logged in'` -eq 1 ]; then
    				echo '==> Wired ipv4 login successful'
    			else
    				echo 'Error: Wired ipv4 login failed!'
    			fi
    		fi
    
    	fi
    else
    	echo "Error: no connection to gateway"
    	exit 2
    fi
    
    exit 0
    
  • 北京工业大学校园网自动登录脚本-Python旧版

    北京工业大学校园网自动登录脚本-Python旧版

    时效性提醒:本文首次编写发布于8 年前。

    180424 update: 新版shell登录脚本,仅依赖curl,适用更广,WiFi/有线自动判断,不过大概率无法工作在bjut以外的学校

    国内的大学校园网通常都会都会有一个烦人的计费系统,某211地下室也不例外,其使用了“城市热点”提供的Web认证页面,只有在Web页面登陆后才会有外网的访问权限。对于架设路由等设备自然是非常不方便的,于是便有了各种自动登录脚本。

    对于本校的奇葩系统,单纯的ipv4认证或ipv6认证都是一句curl就能解决的,但IPV4与IPV6统一认证就会比较费事,于是乎我干脆直接用python3写了个爬虫脚本,完全模拟Web页面登陆的步骤。由于是使用正则表达式动态的获取参数(比如内网认证服务器的IP地址),有良好的兼容性,在其他使用了相同系统的高校中改改没准也能用。

    项目地址:https://github.com/WuSiYu/BJUT-autologin-both46

    以下Readme.md:

    简介

    北工大的校园网登录非常奇葩,如果你仅需要单一的ipv4登录或者ipv6登录,简单的使用curl发送一个POST请求就可以了,但这样无法同时使用ipv4和ipv6。若有此需求,只能通过IPV4与IPV6统一认证模式。在这个模式中,会先向跳转网址https://lgn6.bjut.edu.cn/V6?https://lgn.bjut.edu.cn发送POST请求,再向https://lgn.bjut.edu.cn发送第二个POST请求,跳转回来。过程中必须分别包含在页面中给出的v4和v6两个地址,才可正常的登录使用。

    所以本Python脚本通过正则表达式获取两个页面中的地址,完全模拟使用浏览器IPV4与IPV6统一认证登录时的各步骤,以达到可以同时使用ipv4和ipv6的效果。

    此脚本在本部宿舍有线网络上测试通过,暂不支持无线网络使用。

    使用

    Usage:  gateway-login.py <user> <password>     #登录网关
            gateway-login.py --status              #查看账号信息
            gateway-login.py --logout              #注销账号
    

    如果报错无法登陆,请先尝试注销一遍。

  • Bilibili 各分区视频数量综合查询脚本

    Bilibili 各分区视频数量综合查询脚本

    时效性提醒:本文首次编写发布于8 年前。

    最近在玩爬虫,先放一个B站各二级分区的视频数量统计脚本

    Github:https://gist.github.com/WuSiYu/847a468fbb62874d863a50c55c2101a6

    截止文章更新时的数据(2018-07-26):

            1: 动画
                    24:MAD·AMV              视频数 = 237037
                    25: MMD·3D              视频数 = 286253
                    47: 短片·手书·配音      视频数 = 134351
                    27: 综合                视频数 = 400319
    
            13: 番剧
                    33: 连载动画            视频数 = 25417
                    32: 完结动画            视频数 = 16342
                    51: 资讯                视频数 = 14179
                    152: 官方延伸           视频数 = 87700
    
            167:国创
                    153: 国产动画           视频数 = 11638
                    168: 国产原创相关       视频数 = 56066
                    169: 布袋戏             视频数 = 18004
                    170: 资讯               视频数 = 2813
    
            3: 音乐
                    28: 原创音乐            视频数 = 25568
                    31: 翻唱                视频数 = 389256
                    30: VOCALOID·UTAU       视频数 = 146718
                    59: 演奏                视频数 = 275273
                    29: 三次元音乐          视频数 = 435277
                    54: OP/ED/OST           视频数 = 55044
                    130: 音乐选集           视频数 = 464374
    
            129:舞蹈
                    20: 宅舞                视频数 = 124956
                    154: 三次元舞蹈         视频数 = 132236
                    156: 舞蹈教程           视频数 = 12381
    
            4: 游戏
                    17: 单机联机            视频数 = 2575433
                    171: 电子竞技           视频数 = 1125988
                    172: 手机游戏           视频数 = 1090576
                    65: 网络游戏            视频数 = 1481897
                    173: 桌游棋牌           视频数 = 173554
                    121: GMV                视频数 = 70994
                    136: 音游               视频数 = 186184
                    19: Mugen               视频数 = 48716
    
            36:科技
                    124: 趣味科普人文       视频数 = 225165
                    122: 野生技术协会       视频数 = 206091
                    39: 演讲· 公开课        视频数 = 264381
                    96: 星海                视频数 = 68729
                    95: 数码                视频数 = 227037
                    98: 机械                视频数 = 83445
                    176: 汽车               视频数 = 110731
    
            160:生活
                    138: 搞笑               视频数 = 367800
                    21: 日常                视频数 = 1325202
                    76: 美食圈              视频数 = 367535
                    75: 动物圈              视频数 = 320371
                    161: 手工               视频数 = 164167
                    162: 绘画               视频数 = 148553
                    175: ASMR               视频数 = 12
                    163: 运动               视频数 = 285217
                    174: 其他               视频数 = 438994
    
            119:鬼畜
                    22: 鬼畜调教            视频数 = 76198
                    26: 音MAD               视频数 = 40437
                    126: 人力VOCALOID       视频数 = 18340
                    127: 教程演示           视频数 = 754
    
            155:时尚
                    157: 美妆               视频数 = 260127
                    158: 服饰               视频数 = 78249
                    164: 健身               视频数 = 42877
                    159: 资讯               视频数 = 41470
    
            165:广告
                    166: 广告               视频数 = 93370
    
            5: 娱乐
                    71: 综艺                视频数 = 403683
                    137: 明星               视频数 = 934160
                    131: Korea相关          视频数 = 703781
    
            181:影视
                    182: 影视杂谈           视频数 = 117564
                    183: 影视剪辑           视频数 = 954530
                    85: 短片                视频数 = 111317
                    184: 预告 资讯          视频数 = 134911
                    86: 特摄                视频数 = 42765
    
            放映厅:
            177:纪录片
                    37: 人文历史            视频数 = 53559
                    178: 科学探索           视频数 = 20429
                    179: 热血军事           视频数 = 6769
                    180: 舌尖上的旅行       视频数 = 19724
    
            23:电影
                    147: 华语电影           视频数 = 2902
                    145: 欧美电影           视频数 = 493
                    146: 日本电影           视频数 = 45
                    83: 其他国家            视频数 = 85
    
            11: 电视剧
                    185: 国产剧             视频数 = 5311
                    187: 海外剧             视频数 = 371
    
    
    
    

    脚本代码:

    #!/usr/bin/env python3
    '''
    Bilibili 各分区视频数量查询脚本
    作者: WuSiYu(wu.siyu@hotmail.com)
    日期: 2018-07-26 00:54
    
    本脚本参考了uupers团队的研究: https://github.com/uupers/BiliSpider/wiki
    '''
    from urllib import request
    import json
    
    ALL_RID = (12, 15, 16, 17, 19, 20, 21, 22, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 37, 39, 41, 46, 47, 50, 51, 53, 54, 56, 59, 60, 65, 67, 71, 74, 75, 76, 77, 79, 80, 82, 83, 85, 86, 94, 95, 96, 98, 114, 116, 118, 120, 121, 122, 124, 125, 126, 127, 128, 130, 131, 134, 135, 136, 137, 138, 139, 141, 145, 146, 147, 152, 153, 154, 156, 157, 158, 159, 161, 162, 163, 164, 166, 168, 169, 170, 171, 172, 173, 174, 175, 176, 178, 179, 180, 182, 183, 184, 185, 187)
    videoCounts = {}
    
    regionCount = len(ALL_RID)
    i = 1
    
    for rid in ALL_RID :
    	print('Getting data form bilibili... (' + str(i) + '/' + str(regionCount) + ')', end="\r")
    	apiURL = 'http://api.bilibili.com/x/web-interface/newlist?ps=1&pn=1&rid=' + str(rid)
    	req = request.Request(apiURL)
    	req.add_header('User-Agent', 'Mozilla/5.0 (X11; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0')
    	f = request.urlopen(req)
    	data = json.loads( f.read() )
    	videoCounts[rid] = data['data']['page']['count']
    	i += 1
    
    print('Getting data form bilibili... done    ')
    print('''
    	1: 动画
    		24:MAD·AMV  \t\t视频数 = ''' + str( videoCounts[24] ) + '''
    		25: MMD·3D  \t\t视频数 = ''' + str( videoCounts[25] ) + '''
    		47: 短片·手书·配音  \t视频数 = ''' + str( videoCounts[47] ) + '''
    		27: 综合  \t\t视频数 = ''' + str( videoCounts[27] ) + '''
    
    	13: 番剧
    		33: 连载动画  \t\t视频数 = ''' + str( videoCounts[33] ) + '''
    		32: 完结动画  \t\t视频数 = ''' + str( videoCounts[32] ) + '''
    		51: 资讯  \t\t视频数 = ''' + str( videoCounts[51] ) + '''
    		152: 官方延伸  \t\t视频数 = ''' + str( videoCounts[152] ) + '''
    
    	167:国创
    		153: 国产动画  \t\t视频数 = ''' + str( videoCounts[153] ) + '''
    		168: 国产原创相关  \t视频数 = ''' + str( videoCounts[168] ) + '''
    		169: 布袋戏  \t\t视频数 = ''' + str( videoCounts[169] ) + '''
    		170: 资讯  \t\t视频数 = ''' + str( videoCounts[170] ) + '''
    
    	3: 音乐
    		28: 原创音乐  \t\t视频数 = ''' + str( videoCounts[28] ) + '''
    		31: 翻唱  \t\t视频数 = ''' + str( videoCounts[31] ) + '''
    		30: VOCALOID·UTAU  \t视频数 = ''' + str( videoCounts[30] ) + '''
    		59: 演奏  \t\t视频数 = ''' + str( videoCounts[59] ) + '''
    		29: 三次元音乐  \t视频数 = ''' + str( videoCounts[29] ) + '''
    		54: OP/ED/OST  \t\t视频数 = ''' + str( videoCounts[54] ) + '''
    		130: 音乐选集  \t\t视频数 = ''' + str( videoCounts[130] ) + '''
    
    	129:舞蹈
    		20: 宅舞  \t\t视频数 = ''' + str( videoCounts[20] ) + '''
    		154: 三次元舞蹈  \t视频数 = ''' + str( videoCounts[154] ) + '''
    		156: 舞蹈教程  \t\t视频数 = ''' + str( videoCounts[156] ) + '''
    
    	4: 游戏
    		17: 单机联机  \t\t视频数 = ''' + str( videoCounts[17] ) + '''
    		171: 电子竞技  \t\t视频数 = ''' + str( videoCounts[171] ) + '''
    		172: 手机游戏  \t\t视频数 = ''' + str( videoCounts[172] ) + '''
    		65: 网络游戏  \t\t视频数 = ''' + str( videoCounts[65] ) + '''
    		173: 桌游棋牌  \t\t视频数 = ''' + str( videoCounts[173] ) + '''
    		121: GMV  \t\t视频数 = ''' + str( videoCounts[121] ) + '''
    		136: 音游  \t\t视频数 = ''' + str( videoCounts[136] ) + '''
    		19: Mugen  \t\t视频数 = ''' + str( videoCounts[19] ) + '''
    
    	36:科技
    		124: 趣味科普人文  \t视频数 = ''' + str( videoCounts[124] ) + '''
    		122: 野生技术协会  \t视频数 = ''' + str( videoCounts[122] ) + '''
    		39: 演讲· 公开课  \t视频数 = ''' + str( videoCounts[39] ) + '''
    		96: 星海  \t\t视频数 = ''' + str( videoCounts[96] ) + '''
    		95: 数码  \t\t视频数 = ''' + str( videoCounts[95] ) + '''
    		98: 机械  \t\t视频数 = ''' + str( videoCounts[98] ) + '''
    		176: 汽车  \t\t视频数 = ''' + str( videoCounts[176] ) + '''
    
    	160:生活
    		138: 搞笑  \t\t视频数 = ''' + str( videoCounts[138] ) + '''
    		21: 日常  \t\t视频数 = ''' + str( videoCounts[21] ) + '''
    		76: 美食圈  \t\t视频数 = ''' + str( videoCounts[76] ) + '''
    		75: 动物圈  \t\t视频数 = ''' + str( videoCounts[75] ) + '''
    		161: 手工  \t\t视频数 = ''' + str( videoCounts[161] ) + '''
    		162: 绘画  \t\t视频数 = ''' + str( videoCounts[162] ) + '''
    		175: ASMR  \t\t视频数 = ''' + str( videoCounts[175] ) + '''
    		163: 运动  \t\t视频数 = ''' + str( videoCounts[163] ) + '''
    		174: 其他  \t\t视频数 = ''' + str( videoCounts[174] ) + '''
    
    	119:鬼畜
    		22: 鬼畜调教  \t\t视频数 = ''' + str( videoCounts[22] ) + '''
    		26: 音MAD  \t\t视频数 = ''' + str( videoCounts[26] ) + '''
    		126: 人力VOCALOID  \t视频数 = ''' + str( videoCounts[126] ) + '''
    		127: 教程演示  \t\t视频数 = ''' + str( videoCounts[127] ) + '''
    
    	155:时尚
    		157: 美妆  \t\t视频数 = ''' + str( videoCounts[157] ) + '''
    		158: 服饰  \t\t视频数 = ''' + str( videoCounts[158] ) + '''
    		164: 健身  \t\t视频数 = ''' + str( videoCounts[164] ) + '''
    		159: 资讯  \t\t视频数 = ''' + str( videoCounts[159] ) + '''
    
    	165:广告
    		166: 广告  \t\t视频数 = ''' + str( videoCounts[166] ) + '''
    
    	5: 娱乐
    		71: 综艺  \t\t视频数 = ''' + str( videoCounts[71] ) + '''
    		137: 明星  \t\t视频数 = ''' + str( videoCounts[137] ) + '''
    		131: Korea相关  \t视频数 = ''' + str( videoCounts[131] ) + '''
    
    	181:影视
    		182: 影视杂谈  \t\t视频数 = ''' + str( videoCounts[182] ) + '''
    		183: 影视剪辑  \t\t视频数 = ''' + str( videoCounts[183] ) + '''
    		85: 短片  \t\t视频数 = ''' + str( videoCounts[85] ) + '''
    		184: 预告 资讯  \t视频数 = ''' + str( videoCounts[184] ) + '''
    		86: 特摄  \t\t视频数 = ''' + str( videoCounts[86] ) + '''
    
    	放映厅:
    	177:纪录片
    		37: 人文历史  \t\t视频数 = ''' + str( videoCounts[37] ) + '''
    		178: 科学探索  \t\t视频数 = ''' + str( videoCounts[178] ) + '''
    		179: 热血军事  \t\t视频数 = ''' + str( videoCounts[179] ) + '''
    		180: 舌尖上的旅行  \t视频数 = ''' + str( videoCounts[180] ) + '''
    
    	23:电影
    		147: 华语电影  \t\t视频数 = ''' + str( videoCounts[147] ) + '''
    		145: 欧美电影  \t\t视频数 = ''' + str( videoCounts[145] ) + '''
    		146: 日本电影  \t\t视频数 = ''' + str( videoCounts[146] ) + '''
    		83: 其他国家  \t\t视频数 = ''' + str( videoCounts[83] ) + '''
    
    	11: 电视剧
    		185: 国产剧  \t\t视频数 = ''' + str( videoCounts[185] ) + '''
    		187: 海外剧  \t\t视频数 = ''' + str( videoCounts[187] ) + '''
    ''')
    
  • 博客又启用新主题:Sility

    博客又启用新主题:Sility

    时效性提醒:本文首次编写发布于8 年前。

    之前的那个主题魔改了一半,只对1080p分辨率做了适配,其他分辨率下显示会略有问题,不过也没啥时间改了,于是乎干脆换个主题。

    现在这是一个Material Design风格的主题,相比之前的注重于视觉效果的暗色风格,其实还是现在的亮色风格更适合内容的阅读。

  • 前端膜法:用CSS去除Chrome表单自动填充时的淡黄色背景

    前端膜法:用CSS去除Chrome表单自动填充时的淡黄色背景

    时效性提醒:本文首次编写发布于9 年前。

    用过Chrome的人都知道,如果你在提交表单(如登录)时,选择了记住用户名和密码,那么下次登录时,保存的用户名和密码会自动填充,并且相应<input>标签的背景也会被强制设为淡黄色。

    对于默认样式的输入框而言,加上淡黄色的背景并不会显得很违和。但如果你用了CSS让它变得漂亮些,那么这个强制添加的淡黄色背景很可能会毁掉你那精心调校的样式。

    如果你遇到了这种情况,那么你一定会想着如何去把这个丑陋的淡黄色背景去掉,但不幸的是,这个由浏览器强加的样式,优先级是最高的,你根本无法覆盖掉它。

    所以我们只能通过一些CSS hack的方式曲线救国,来“去除”这个讨厌的东西。

    input:-webkit-autofill {
        -webkit-box-shadow: 0 0 0px 1000px #000000 inset;
    }

    这段CSS代码把所有被自动填充表单所涂上淡黄色的<input>标签,设置了一个巨大的白色内向box-shadow,已达到覆盖掉淡黄色背景的目的,适用于<input>原本是纯色背景的情况。

    而对于最开始图中的情况,<input>标签原本是透明背景,这样才能把后面高斯模糊的背景图透出来,所以上面“覆盖”的方法并不可行,我们需要让背景都“消失”,于是便有了下面这种更加曲线救国的方式。

    :-webkit-autofill {
        -webkit-text-fill-color: #fff !important;
        transition: background-color 5000000s ease-in-out 0s;
    }

    首先第一行先重新设置了原本的字体颜色,从CSS上来讲-webkit-text-fill-color刚好可以覆盖掉color

    而重点在第二行,我们通过transition给那个淡黄色的背景加了个长达5000000秒的淡出效果,于是乎,这个淡黄色的背景就这样被巧妙的“隐藏”了起来,除非浏览者愿意盯着它看好几个小时,那淡黄色的背景才会略微显现出来一点点。

    CSS的属性众多而有很多又互相干涉,相信对很多初学者留下了越改越乱,不停拆东墙补西墙的印象,但正是因为这样,才会出现各种有趣的CSS hack。

    Web开发和打FPS一样,是一个下限很低而上限很高的东西,而Web也是在快速的发展着,只有不断接触新的知识,才能不落后于时代。

  • 博客启用新主题:Metro CreativeX

    博客启用新主题:Metro CreativeX

    时效性提醒:本文首次编写发布于9 年前。

    目前大概就是这个样子,之后会对其进行一些修改和定制。

  • WordPress中方便的代码高亮插件 – Crayon

    WordPress中方便的代码高亮插件 – Crayon

    时效性提醒:本文首次编写发布于9 年前。

    之前一直没有关注这方面,最近正好有需求,发现这个插件真的很省事。

    (更多…)

  • MarkNote v2已部署于 note.wusiyu.me

    MarkNote v2已部署于 note.wusiyu.me

    时效性提醒:本文首次编写发布于10 年前。

    MarkNote v2已足够稳定并超越了旧的v1版,估v2版已部署于note.wusiyu.me,支持https,请访问https://note.wusiyu.me

    旧的v1版已移至https://wusiyu.me/note-old/

     

  • MarkNote v2 的进度

    MarkNote v2 的进度

    时效性提醒:本文首次编写发布于10 年前。

    相比较为简单的一代,二代将会有一下特性:

    1. 完善的用户系统
    2. 更强大的MarkDown编辑器
    3. 方便管理的文档列表,能将多个文档放入一个文件夹(记事本)中,并能在其间自由拖动
    4. 更完善的分享功能
    5. 全面ajax化,友好的用户体验
    6. 新的界面,可自由更改配色
    7. 也许会增加与印象笔记绑定并云同步的功能
    8. 还有很多的其它的改进

    目前进展:

    注意,现在二代还处于较早期的开发中,请不要在对外公开的服务器上部署!

  • PHP-如何正确的删除array中的一个元素

    时效性提醒:本文首次编写发布于10 年前。

    数组是几乎所以编程语言里必有的数据结构,而在编程时,数组可以又与其他数组和数据结构相结合,构成如二维数组三维数组233维数组乱七八糟什么都不是的数组。而数组也是最基本的可迭代的数据结构,常与for(foreach)相结合,形成。。。

    好了我tm实在编不下去了,下面步入正题。

    在PHP中,删除array中的一个元素有两种方法

    1.array_splice($array, $offset, 1);

    示例代码:

    $array = array('aaa', 'bbb', 'ccc', 'ddd');
    $offset = 1;
    array_splice($array, $offset, 1);
    
    var_dump($array);
    
    /* 输出:
    
    array(3) {
      [0]=>
      string(3) "aaa"
      [1]=>
      string(3) "ccc"
      [2]=>
      string(3) "ddd"
    }
    */

    注意,不能写成array_splice($array, $offset);,一定要写上最后那个为1的参数,否则会把数组直接从$key的位置删到末尾!
    而且array_splice中所用的是偏移量,而不是key,这点要注意!

    2.unset($array[$key]);

    示例代码:

    <?php
    $array = array('aaa', 'bbb', 'ccc', 'ddd');
    $key = 1;
    unset($array[$key]);
    
    var_dump($array);
    
    /* 输出:
    
    array(3) {
      [0]=>
      string(3) "aaa"
      [2]=>
      string(3) "ccc"
      [3]=>
      string(3) "ddd"
    }
    */

    注意,元素的key没有重新排序,而是直接从0跳到了2,这可能会导致一些潜在的问题,你可以在后面使用array_values();来重新排序key

  • 雅黑PHP探针魔改版 – 支持PHP7,大幅改进界面

    雅黑PHP探针魔改版 – 支持PHP7,大幅改进界面

    时效性提醒:本文首次编写发布于10 年前。

    雅黑PHP探针,还是非常好用的,但n年没有更新了,以至于其使用的新版PHP已弃用的函数,使其在新版PHP下甚至无法工作。

    所以我对它进行了一番魔改,修复在新版PHP下的bug自然不必说,顺便还魔改了一下界面,加入了图标,是不是立马就又现代感了?

    废话不多说了,直接上地址:

    Gitbub:https://github.com/WuSiYu/PHP-Probe

    git@osc国内分流:https://github.com/WuSiYu/PHP-Probe

    PS:关于这个bug我已经给雅黑PHP探针的作者发邮件说明了,但几个月过去了根本没有回我。。。

  • 给phpMyAdmin安装一个漂亮的主题

    时效性提醒:本文首次编写发布于10 年前。

    phpMyAdmin是一个非常流行的MySQL管理软件,是做php+mysql开发时的重要工具之一。

    然而phpmyadmin默认的主题简直能把人丑哭。。。不过前几天我在官网居然找到了这个叫metro的主题,扁平化设计,非常养眼,效果如图:

    安装这个主题也很简单,首先到官网去下载这个主题,链接:下载地址

    解压压缩包,会得到一个叫metro的文件夹,将它复制到phpmyadmin程序目录中的themes/文件夹里即可。如果你是使用linux发行版的安装包的话,phpmyadmin的程序目录一般在/usr/share/webapps/phpMyAdmin/usr/share/phpMyAdmin这种类似的位置。

    另外,现在还有一个Material Design风格的主题正在开发,也挺值得期待的。

  • Atom编辑器体验

    时效性提醒:本文首次编写发布于11 年前。

    Atom代码编辑器是GithubGayhub出的一款免费开源的代码编辑器,用起来感觉跟Sublime差不多,不过atom有着更方便的插件安装和设置界面,而且功能也比sublime多些,并与Git十分和谐。

    (更多…)

  • DownThemAll!——FireFox优秀的下载插件

    时效性提醒:本文首次编写发布于11 年前。

    Firefox是一个十分强大的浏览器,不过它自带的下载功能跟其他浏览器一样,比较蛋疼。不过呢,Firefox是一个有着无数插件的浏览器,海量的插件弥补了Firefox本身的一些不足,而现在我们介绍的DownThemAll!插件,就是一款支断点续传,多线程的下载神器。

    (更多…)

  • 用CSS隐藏链接、按钮按下时讨厌的虚线框

    时效性提醒:本文首次编写发布于11 年前。

    将以下内容添加到CSS中即可

    a,input,button{
        outline: none !important;
        -webkit-appearance: none;
        border-radius: 0;
    }
     
    button::-moz-focus-inner,input::-moz-focus-inner{
        border-color:transparent !important;
    }
     
    :focus {
        border: none;
        outline: 0;
    }

    之后再点击链接、按钮,那烦人的虚线框就再也不会出来了。