今天看见了别人总结的,感觉太有用了。 num&0x1, 为1说明是奇数,为0说明是偶数。因为只看二进制位的最后一位 a % b,当底b为2的n次幂的时候,可以改写成 a & (b - 1) 原理也是按位只看最后n位的数据,高位直接不用看。 我这个还专门看了一下有多块,数量级差的太多了, 但初步能看见的时间来说,1亿次差了0.1秒,从时间成本上来说其实差别不大。 看了一下,差了四条汇编指令,还得考虑取数据的时间
Archive for 编程
这几天忙着写文档,一直看的线上环境的系统。今天启动本地测试环境,发现登录不成功。排查问题发现登录成功后,之后的请求没有携带cookie。然后我就仔细看了一下登录请求的参数。 发现在chorme header头的cookie里有一个黄色的小叹号,发现问题了。 this set-cookie didn't specify a "SameSite" attribute,然后变成默认Lax。(不能复制,懒得打英文了) 然后我搜索了一下Samesite定义,有三个值,None, Lax,Strict.这个参数是防止跨站攻击用的,因为测试环境,所以最方便就是跨站调试了。 然后我搜了一下flask源码,发现有这个设置,配置了一下发现不管用。然后放弃了。 找了一下怎么关闭chrome的这个选项,虽然别的网站可能有一点风险。自己调试的时候会方便点。 chrome://flags/#same-site-by-default-cookies chrome://flags/#cookies-without-same-site-must-be-secure 这两项设置为Disabled,并重启浏览器
搞了一个像素游戏,很小的游戏。里边的文字也不多,找个像素字体太费劲,还有版权什么的信息,就想之前看过字体数据转像素矩阵的代码。搜了一下,发现直接有点阵字体,找了代码试了一下,完全可用。
我将字体转成像素矩阵后,可以直接按像素大小把字给画出来,非常方便了,就是计算稍微多一点。
HZK16字库是符合GB2312国家标准的16×16点阵字库,HZK16的GB2312-80支持的汉字有6763个,符号682个。其中一级汉字有 3755个,按声序排列,二级汉字有3008个,按偏旁部首排列。
我们在一些应用场合根本用不到这么多汉字字模,所以在应用时就可以只提取部分字体作为己用。 HZK16字库里的16×16汉字一共需要256个点来显示,也就是说需要32个字节才能达到显示一个普通汉字的目的。
我们知道一个GB2312汉字是由两个字节编码的,范围为0xA1A1~0xFEFE。A1-A9为符号区,B0-F7为汉字区。每一个区有94个字符(注意:这只是编码的许可范围,不一定都有字型对应,比如符号区就有很多编码空白区域)。
下面以汉字「我」为例,介绍如何在HZK16文件中找到它对应的32个字节的字模数据。
前面说到一个汉字占两个字节,这两个中前一个字节为该汉字的区号,后一个字节为该字的位号。其中,每个区记录94个汉字,位号为该字在该区中的位置。所以要找到「我」在hzk16库中的位置就必须得到它的区码和位码。
区码:汉字的第一个字节-0xA0,因为汉字编码是从0xA0区开始的,所以文件最前面就是从0xA0区开始,要算出相对区码
位码:汉字的第二个字节-0xA0
这样我们就可以得到汉字在HZK16中的绝对偏移位置:offset = (94*(区码-1)+(位码-1))*32。
注解:
区码减1是因为数组是以0为开始而区号位号是以1为开始的
(94*(区号-1)+位号-1)是一个汉字字模占用的字节数
最后乘以32是因为汉字库文应从该位置起的32字节信息记录该字的字模信息(前面提到一个汉字要有32个字节显示)
#include
emmm,其实从一开始自己学编程就各种研究做游戏,但都是坚持不下来等各种原因,啥没搞出来。 但是游戏框架倒是没少接触,自己脑子里想了好几个游戏,也分不同时间做过,然后每次都经历的过程差不多,选框架,选图片素材。开始的这种工作消耗了我基本好多时间,然后慢慢学框架发现这里不好做,那里不好实现,慢慢就放弃了。 有时候游戏还没开始,就想着跨平台,要搞个跨平台的框架。要做个手机游戏,首先想到的是苹果,安卓都要可以,找跨平台引擎写。时间都浪费在这里了。 期间写过一个微信小游戏,用了cocos creator,然后用了一个预置模板,然后加载特别慢,对这个引擎失望透顶。发现还不如我自己画的快。后来又写了一个小游戏,直接用的js库,ui什么的都自己画了,又快又爽。 用引擎就是会很多照顾新手,页面操作多,繁琐,虽然编程也可以。js的low,唯一好处就是web和微信支持,别的语言懒得学。像unreal,unity之类的搞3d太难了,虽然想搞。用框架就是依赖性太强,想改个东西还得看源代码,太低级的觉得太低级不想用,没啥必要用,太高级的又觉得都是费功能,太慢了。 用python之前考虑不跨平台,不想用。后来觉得去他妈的跨平台,老子先搞一个pc平台把我的想法实现了再说。然后想搞个无限地图的功能,找了一些现成的地图方案,发现缺陷太大,放弃。自己想了想,然后网上查了一下,发现跟我想法一样,自己用python撸了一个无限地图的功能,框架也是python的,发现巨慢无比,三十帧左右。也许是代码有问题可以优化,但是我想想即时把帧数优化上去了,后边加游戏逻辑还得慢,然后一直优化吧,直接放弃。然后找了一个c++写的小众游戏的引擎,功能很合我的意,官方有python绑定,看着例子写了个demo,感觉挺好。然后等我开始写深入功能的时候,发现ui是个问题,官方封装的代码太复杂,我c++不太懂,绑定第三方图像库也不了解。其实python的绑定封装的接口也乱,但是demo里边的东西,我大部分都了解了实现游戏逻辑没啥问题。又找了一圈别的库,又又又一次的放弃了。 折腾的比上边描述的要多的多,想起来写下来的就这些了。 前段时间我突然出来一个想法,想用commonlisp写个游戏,只是一个玩法好玩,想借助cl看看有没有好的发挥cl的特性。突然想明白一个事,我为什么想写游戏却局限于现在的技术栈里边呢。现在写web多,然后多考虑的是python,js之类的,用惯了不想换,但是又不是做这个擅长的事。以前上学学c,c++也都是只写逻辑,没有第三方依赖,最多写写vc,也是集成环境。突然想到,老子要用c写游戏了。 随便一搜就决定了用的技术,因为之前也了解了比较多的了。所以直接选点SDL,一个跨平台,一个c,百分比满意。然后官网找的一个书,一天看完了,发现使用很简单。图片音频这些加载,我又犯了强迫症,不行依赖额外的库。宁可使用第三方的开源代码放到项目里。后来又想通了,纠结这些事不对的。 我下定决心都用官方的,SDL_image mixer ttf,然后自己接触了这么多引擎框架,觉得cocos2d确实作者牛逼,一些游戏概念划分的很好。我参照cocos2d的理念,自己假期抽时间撸了一个c的小游戏框架,已经基本完善。 后边要做的主要就三块,一块是ui,这个也自己写,想了一下,总共用不了几个元素,自己撸还是来的快和爽,想怎么改怎么改,前期就是会丑一些。第二块就是物理,这里目前打算是用第三方的,其实也用不了太多的东西,但是自己撸数学懒得看,数学调试也麻烦,不然还得依赖别人写的库,不如直接用第三方的物理引擎。第三块就是游戏逻辑相关了,这里就是慢慢添加了,难道应该不大,就是消耗时间。 特别写完我的小框架后,就特别觉得之前为什么不用c写呢,陷入了python易用,写得快速的死胡同里了。最近因为写框架,写的c也不少,上班后写python的时候,每写完一行就想加个分号。我发现语言这东西不能一直换,思维什么的定势了不容易转换。 写c也没感觉说效率低多少,最主要的是要考虑内存申请和释放的问题。还有就是不能面向对象设计,每次都要传参数,就想怎么写的容易一点。但是c想写的容易一点就可以容易一点,但是像python,虽然本身设计带了很多设计模式,你想写容易一点,就得更深入挖掘python的知识,其实学起来反而不容易,除非写多了才会容易了。 c还有个问题,就是源码文件目录的设计,第三方库依赖的问题,虽然有ldd,otool之类的工具,但是我不清楚游戏业界都是怎么做的,我以后还得考虑,全源码编译。目前先软件包安装写代码。gcc 等一系列编译工具链也没看,大体功能知道,后边要用再看也来得及,现在主要还是pk代码要紧。 想起个问题就是为什么不用c++,这个写游戏是用的最多的,环境肯定好很多。但是一个就是c比较底层,写熟练了不局限于游戏这一块地方,系统编程用的也很多。c++面向对象确实比c好,但是太复杂了,想起了上学时那些关系什么的,产生了畏惧。其实我自己写自己用的代码,无所谓封装的好不好,但是综合权衡还是用了c,现在还是很满意的。
在Mac上写cocos2d游戏代码的时候,写了个label,调了几次没居中,突然想到是不是mac屏幕的原因。然后鼠标滑了一下看了一下还正好差一倍居中。 然后网上搜了一下,在github上找到了解决方案。 HiDPI屏幕都会有这种问题,有两种patch,一个改pyglet的,一个改cocos2d的,然后我手动改了一下cocos2d的代码解决了。 话说cocos2d不更新了,维护也不知道会不会改。突然感觉选择cocos2d有点虚了。 issues:https://github.com/los-cocos/cocos/issues/303
上一篇使用antlr解析的,发现不行,官方提供的语法文件bug太多,多到不能用的程度,还是得用专门的开源库。这次选jsqlparser了。 从github下载一个源码,mvn package 打一个jar包。将jsqlparser-0.9.6.jar拷贝到工作目录。
import java.util.*;
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
import net.sf.jsqlparser.statement.select.Select;
import net.sf.jsqlparser.util.TablesNamesFinder;
public class ParserTest {
public static void main(String[] args){
System.out.println("Hello World!");
String sql = "select NVL( (SELECT 1 FROM DUAL), 1) AS A from TEST1,test";
try{
Select selectStatement = (Select) CCJSqlParserUtil.parse(sql);
TablesNamesFinder tablesNamesFinder = new TablesNamesFinder();
List tableList = tablesNamesFinder.getTableList(selectStatement);
for(String s : tableList) {
System.out.println(s);
}
}catch(Exception e){
String sql1 = " TEST1";
//e.printStacktrace();
}
}
}
这是调用解析table name的代码。
编译运行
javac -cp ./jsqlparser-0.9.6.jar ParserTest.java
java -cp .:./jsqlparser-0.9.6.jar:$CLASSPATH ParserTest
还挺好用。
做个项目要解析mysql sql语句,使用开源的库发现问题很多,不太适合。推荐的几个项目都是项目里边集成的,语言也不符合,太麻烦。只能自己搞了,选择antlr的原因是官方提供mysql解析的语法,做起来比较简单。 安装: curl -O http://www.antlr.org/download/antlr-4.5.3-complete.jar 然后写一个shell脚本antlr,用来执行命令 #!/bin/bash java -cp .:./antlr-4.5.3-complete.jar:$CLASSPATH org.antlr.v4.Tool $* 从https://github.com/antlr/grammars-v4.git clone一些已经写好的sql语法文件。 生成Python版的解析代码。 ./antlr -Dlanguage=Python2 MySQLLexer.g4 ./antlr -Dlanguage=Python2 -visitor MySQLParser.g4 第二个加参数是为了生成MySQLGrammarVisitor。 然后参照例子写了个函数包起来就能用。这工具做的好,原因就是不用研究太深就能用。
selenium安装 去官网下载一个jar包,然后运行:java -jar selenium-server-standalone-2.53.1.jar 然后写代码就行了,会打开一个浏览器窗口。看看有办法静默打开不,好像phantomjs模式可以,这个还要安装。
# coding: utf-8
# from selenium import selenium
from selenium.webdriver.common.by import By
from selenium import webdriver
from selenium.webdriver.phantomjs.webdriver import WebDriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
browser = webdriver.Firefox()
# browser = WebDriver()
browser.get('http://baidu.com/')
print browser.title
f = browser.find_element_by_id('kw')
f.send_keys(u'谷歌')
f = browser.find_element_by_id('su')
f.click()
WebDriverWait(browser, 10).until(EC.title_contains(u"谷歌"))
print browser.title
# browser.quit()
这个开始的时候想解决的,查文档搜索都没有,就没搞。现在有时间了准备搞搞,发现就一行代码就行了。 sql-hint.js文件 CodeMirror.registerHelper("hint", "sql", function(editor, options) {这里边。 addMatches()结果都存在result了,然后对result进行排序就搞定了。 result = result.sort(); 一行代码。
说说研究这个的起因: 妹子这几天心情不好,频发状态,为了随时了解她的动态,觉得写个接口时刻关注她是否发送新状态。mac下的通知中心是最好的消息提醒了,比ubuntu下的好多了,非常容易看到而且不烦人,所以想看看能不能调这个通知中心的接口。 系统编程肯定是可以了,但是我想用python写脚本,于是google一下,没有。改成英文找到了。。 几个关键的知识点: osascript https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/osascript.1.html https://developer.apple.com/library/mac/documentation/AppleScript/Conceptual/AppleScriptX/AppleScriptX.html#//apple_ref/doc/uid/10000156-BCICHGIE 这应该是osx的系统级脚本语言,类似之前windows的vbscript吧。最早就用VBscript就能写界面程序,只要一个vbs脚本,学那个的时候才刚研究编程。 无需写个脚本,osascript有个-e参数,后面可以跟一个多行的脚本语句。就这个了。 想弹出一个提示,只要终端执行:osascript -e 'display notification "Content ! !" with title "Title"' subtitle display notification "message" with title "title" subtitle "subtitle" sound声音 display notification "message" sound name "Sound Name"声音文件都在 ~/Library/Sounds /System/Library/Sounds ok,直接python调一下语句就行了。后边两个是看stackoverflow上总结的,只管记录一下,以后说不定用到,应该问的也能查到。 通知中心的偏好设置里边,appscript编辑器必须在-在通知中心里边,这样才会有提示。 https://developer.apple.com/library/mac/documentation/AppleScript/Conceptual/AppleScriptLangGuide/reference/ASLR_cmds.html#//apple_ref/doc/uid/TP40000983-CH216-SW224