Archive for 算法-编程

上一篇使用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 还挺好用。

Continue

做个项目要解析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。   然后参照例子写了个函数包起来就能用。这工具做的好,原因就是不用研究太深就能用。

Continue

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()

Continue

之前没有这个错“Type Error: Network request failed”,然后之后有了,很纳闷。 通过查找发现是ios9之后请求必须走https不然系统就给你禁掉了。解决办法   Info.plist文件里修改 <key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> <key>NSExceptionDomains</key> <dict> <key>localhost</key> <dict> <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> <true/> </dict> </dict> </dict> 这个官方网站也有提,“Running On Device”这节。

Continue

搞了两三次升级了,各种问题,都不记得了。   npm install --save react-native@0.29 然后提示 “UNMET PEER DEPENDENCY react@15.0.2”。 npm WARN react-native@0.29.1 requires a peer of react@~15.2.0 but none was installed.   然后根据提示升级react的版本,npm install --save react@~15.2.0。 然后又执行了一遍:npm install --save react-native@0.29 就好了。   第二部执行:react-native upgrade,会替换很多配置等文件。   第三步:rnpm link 导入资源

Continue

去官网下载个zip包,然后解压。进入目录执行python setup.py然后就安装完了。 先不考虑搭建安卓环境,环境变量配置直接跳过。执行完source ~/.bash_profile后。 cocos -v 2.1 说明安装成功了。 文档地址:http://www.cocos2d-x.org/docs/editors_and_tools/cocosCLTool/index.html 创建新项目

cocos compile -s ~/MyCompany/MyGame -p ios -m release -o ~/MyCompany/MyGame/bin

运行项目

cocos run -s ~/MyCompany/MyGame -p ios

Continue

很多东西搞一次查一次很烦,记一下,下一次找笔记。加深记忆 react-native-vector-icons这个改了一下配置文件导入静态资源,upgrade react-native的时候每次选择替换配置文件,然后会找不到资源文件。执行rnpm link就好了 对于安卓和ios两个版本,发现大部分人的做法是开发两套,我直接写了一套,对于不兼容的地方判断操作系统不同针对。方法 var { Platform } = React; var styles = StyleSheet.create({ height: (Platform.OS === 'ios') ? 200 : 100, });    

Continue

想研究一下virtualenv是怎样保证python运行环境独立的。库里边带了几个二进制,导致clone源代码的时候发现库好大啊,当时就祈祷源码不要太多。 目录结构 大体看了一下文件目录,主要文件就一个virtualenv.py。(也确实安装完就这一个文件) bin/rebuild-script.py这个文件是用来构建新的virtualenv.py文件的。 virtualenv_embedded 文件夹里边的文件是 生成虚拟环境后的脚本,但不是最终版的。上边构建文件将这几个文件插入virtualenv.py virtualenv_support 几个二进制库 创建一个环境 $ virtualenv ENV 从virtualevn main()入手,2000多行。前边解析参数,extend_parser和adjust_options可以自定义修改参数,目的应该是可以使创建环境的命令简单。after_install是环境创建完成后执行,可以做一些基础包的安装等操作。我猜virtualenvwrapper应该会对这几个函数定义。 --python参数可以指定解析器的版本。resolve_interpreter是返回指定解析器的绝对路径,作者使用path变量和提供的执行文件名组合再判断文件是否存在,是否可执行来判断。我感觉可以直接使用which取一下,差不多。 VIRTUALENV_INTERPRETER_RUNNING是判断是否使用的指定解析器,不是指定解析器,就更改变量,用指定解析器重新执行。是的话就继续执行。在加载文件的时候判断是指定解析器,把virtualenv安装环境的path去掉。 后面删掉了PYTHONHOME,make_environment_relocatable好像是对环境目录移动复制等操作后进行重定向,这个没用过。主要就把环境bin目录下的文件的python执行解析器,修改lib库文件路径 create_environment就是创建环境的函数了,第一个参数是环境根目录,后边都是执行参数。 path_locations 根据不同系统解析器环境,返回要创建的环境的目录 install_python,开始先判断了不能用虚拟环境创建自己,clear参数清除环境下的lib库。使用sys.prefix找到python安装路径,还有一个real_prefix和base_prefix这俩路径官网没查到什么意思 创建新环境的lib文件夹,fix_lib64是为了兼容一些别的环境lib文件夹命名不同,咋不开始就定好。使用os库找到标准库的目录stdlib_dirs.然后将标准库文件软连接到新环境的lib下,copy_file分析了是软连接然后找到真实文件,连接到真实文件上. 还有一个REQUIRED_MODULES必要库,先判断这些必要库是否在标准库里边,不在通过imp.find_module找到,同样添加软连接到lib目录.这个应该也是为了兼容吧.其中lib目录有单独的一套,卧槽 我只能说这是python的坑吗,我觉得肯定不是作者特意写好多。(具体不了解不同系统有啥区别也不想看) 创建lib目录下的site-packages,site又是一套我查.include也是软连接 bin目录python二进制复制,那么多代码都是不同py实现的结果,其实就一句copy.不是windows解析器二进制还有带版本号的。然后测试了一把解析器能不能执行。最后返回新环境python的路径 install_distutils 安装 install_wheel 安装安装包的工具. install_activate 安装环境的启动退出脚本 install_python_config 安装python_config文件 上边两个模式基本相同,源文件在virtualenv_embedded下,通过编译到virtualenv.py文件里,然后安装的时候替换相关变量,然后生成新的文件。 最后再看看activate.sh文件如何启动 执行这个脚本的时候,先进行deactivate操作,相当于切换环境。主要就是判断之前的环境变量保存的几个变量是否存在,存在还原, 并删除。因为可以不存在,当前使用的system的python环境.ps1也还原 下边进行新环境变量的赋值。记录要切换的环境根目录,path加入环境bin目录, 删掉pythonHOME.更改ps1加上环境名,替换。pydoc重新绑定,变成了现在的pydoc。 然后就没了

Continue

java有一个jstat 可以查看gc的情况等数据。可以看一下如何注入python进程获取gc每一代的次数。主要使用gdb 首先ps找一个python进程的pid。 ps aux| grep python 1264   然后执行 gdb -p 1264 -batch -eval-command='call PyGILState_Ensure()' -eval-command='call PyRun_SimpleString("exec(\"import gc\\nprint(gc.get_count())\")")' -eval-command='call PyGILState_Release($1)' 你会发现 1264启动日志输出一个元祖(492, 8, 0),分别代表每一代gc的次数。 同样也可以进行手动gc,或者查看线程数等操作。或者执行任意代码。  

Continue

这个问题是老长时间之前的了,我在repl下边看书边写代码测试一些看书想到的问题,然后把你个内建函数名写错了,sbcl提示我参数不是list,但是群里求救别人都没看出来是函数名写错了,后来我发现是特么的函数名写错。但是我很纳闷,为啥会这么个出错模式。 有人推荐我下了lw,lisp works。然后lisp works提示函数未找到。然后就会轻松知道原因了。 后来妮神给我讲,函数调用是根据名字来确定用哪个函数,而cl标准未规定函数调用的时候,是在参数计算前确定哪个函数还是在后,或者中间。 所以这个问题就导致了,sbcl和lw一样是先执行参数后确定函数的,因为可能参数里边会定义这个函数。(javascript也是这样的)sbcl执行参数发现参数不是list报错了,我测试的那个函数是匹配列表的,可以是cons所以不一定是列表,真是凑巧啊。而lw可能回溯回去 报了函数名不正确的错误。 群里另一个人好像用clisp的实现,是先确定函数然后计算参数的。 当时群里写过一个测试代码,杀叔让我写一个python版本的,我在函数里边用了global,然后python也就替换了。

Continue