微信分享常见问题
调试
前端打开debug模式,浏览器打开时在console里会打印微信分享初始化信息,在微信里会以alert形式出现。
常见问题
- 签名的时候注意大小写
- 签名时候用的url需要和当前位置的url保持一致
- 微信二次分享失败
微信在第二次分享的链接里增加了后缀,如?from=singlemessage&isappinstalled=1
,这里需要转义
1 | $.ajax({ |
前端打开debug模式,浏览器打开时在console里会打印微信分享初始化信息,在微信里会以alert形式出现。
?from=singlemessage&isappinstalled=1
,这里需要转义1 | $.ajax({ |
同一套代码,同一个数据源,不同的操作系统,在OSX
上数据提取编码正常,而Ubuntu
上拉取数据乱码,数据拉取代码如下。
1 |
|
检查了Redis
存储的数据都是UTF-8
之后,怀疑是不同OS的编码有所不同,所以对提取的数据指定了编码格式,即new String(data, "UTF8");
,解决了问题。
传统的依赖注入是XML,对我而言,可读性太差,太不美观,强烈地想换一个方式进行依赖注入,Groovy作为XML的替代方案,在Spring4之后被引入,是基于JVM的一门方言,具有较强的可读性,写更少的更易懂的脚本,完成同样的功能。
记录为iOS9上的APP支持Universal links遇到的一些问题。
在Web服务器上传apple-app-site-association文件
.json
后缀www.site.com
,那么必须通过https://www.site.com/apple-app-site-association
访问到该文件details
为列表,列表元素中的paths
是数组,且下标越小匹配优先级越高paths
可以使用*
匹配任何字符串,?
来匹配单个字符appID
格式为{teamId}.{bundleId}
1 | { |
应用增加applinks支持
测试效果
Safari端
可以长按链接,选择使用Web browser打开,或者使用Native APP打开,iOS会记录用户记录,下次用户点击链接,默认使用APP打开,反之,如果用户选择使用浏览器打开链接,下次点击链接默认用浏览器打开。
所以,Safari会根据用户最近行为决定如何打开Universal Links,记住用户习惯。
微信内置浏览器
不支持长按链接选择打开方式,默认直接使用APP打开。
引用
Mahout是用来进行机器学习和推荐算法的一个Java框架。
读取用户对电影评分的数据集,为ID为2的用户推荐3部电影。
1 | package com.mahout; |
好久没有碰Java系列,今天又是看了Mahout的示例,看起来很简单,结果自己试了下,发现要调整IDE,配置Maven,包括数据集文件路径的设置都要注意。
基于Hadoop的数据查询工具,可以使用类SQL进行数据查询。
真正装环境的坑还是很多的,开始分配的虚拟机磁盘空间太小了,基本运行不了,jdbc驱动版本不正确都会导致Hive客户端开启后时常崩溃,配置文件的一些常用选项需要了解,如果出现问题可以有一个解决思路,当然Google还是常用些,实在解决不了如很难想到是jdbc驱动的原因,我就下了一份源码,定位到报错,通过代码推测了发生问题的地方。
nikic介绍了如何向PHP添加新的语法特性,原文写的非常精彩,具体是添加in
语法功能,使最终实现:
1 | $words = ['hello', 'world', 'foo', 'bar']; |
我进行了一下实践,根据PHP7进行了些修改,具体记录下自己的实践过程和心得。
从Github上下载PHP7的源码,准备好PHP的开发编译环境,我是基于ubuntu,所以运行如下:
1 | $ apt-get -y install build-essential autoconf bison re2c |
PHP脚本运行经过3个主要阶段:
这个阶段是将源码根据规则分解成称为token
更小的单元,为后面的语法分析提供材料。
修改位于Zend/
目录的zend_language_scanner.l
,这个文件定义了词法记号规则,为了让PHP能识别in
作为关键词。
1 | <ST_IN_SCRIPTING>"in" { |
为了让Zend引擎能识别T_IN
这个记号,在zend_language_parser.y
中加入:
1 | %token T_IN "in (T_IN)" |
重新生成tokenizer
系列源文件
1 | $ cd ext/tokenizer |
向语法分析增加in
所应用的表达式规则,在zend_language_parser.y
加入:
1 | expr_without_variable: |
再设置in
的操作符优先级,在语法分析文件中找到以下行,并在行尾加入T_IN
:
1 | %nonassoc '<' T_IS_SMALLER_OR_EQUAL '>' T_IS_GREATER_OR_EQUAL |
最后在zend_vm_def.h
中添加具体的执行逻辑:
1 | ZEND_VM_HANDLER(173, ZEND_IN, CONST|TMPVAR|CV, CONST|TMPVAR|CV) |
在PHP源码根目录运行:
1 | $ ./sapi/cli/php ./Zend/zend_vm_gen.php |
zend_vm_gen.php
是根据zend_vm_def.h
中的定义生成zend_vm_*.*
系列的文件。
之后测试编译后的PHP
:
1 | $ ./sapi/cli/php -r 'var_dump("s" in "str");' |
会出现Segmentation fault
,原因是我之前在zend_language_parser.y
中加入的操作是zend_ast_create_binary_op
,所以在编译时会调用位于zend_opcode.c
的get_binary_op
方法,这个方法返回一个函数指针,用于处理expr in expr
这个操作两个参数的语句。
1 | binary_op_type op = get_binary_op(ast->attr); |
所以之后我在3处添加代码:
zend_opcode.c
中添加查询ZEND_IN
操作函数的代码
1 | ZEND_API binary_op_type get_binary_op(int opcode) |
zend_operators.c
中添加处理函数
1 | ZEND_API int ZEND_FASTCALL in_function(zval *result, zval *op1, zval *op2) |
zend_vm_def.h
中补上TODO
该做的处理逻辑
1 | // 我在系统里的最新操作号是173,根据实际为准 |
依旧是在PHP源码根目录下运行:
1 | $ ./sapi/cli/php ./Zend/zend_vm_gen.php |
现在再测试生成的php
,应该会满足:
1 | $ ./sapi/cli/php -r 'var_dump("s" in "str");' |
实际进行了一番操作之后,对于PHP
的运行机制会落实到更小的单位,从解释阶段到文件级别。PHP7
版本引入了ast
这个中间结构,比起nikic那个版本来说,需要修改更多文件,下一步要剖析一下ast
在PHP7
中的作用和在执行过程中的角色。
Update your browser to view this website correctly.&npsb;Update my browser now