小样儿挺别致呀,写起来的感觉

安装nodejs,npm,npx

vscode 插件

1
ES7 React/Redux/GraphQL/React-Native snippets

如果网差,可能安装失败

1
2
3
4
5
6
npx create-react-app simple-react-web
cd simple-react-web
mv src src-bak
mkdir src
cd src
touch index.js
1
2
3
npm i classnames -S
npm i styled-components -S
npm install -S prop-types

index.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import React from 'react'
import ReactDOM from 'react-dom'

// const createApp = (props) => {
// return (
// <div>
// {/*sadasdasd */}
// <h1>Welcome {props.title}</h1>
// </div>
// )
// }

// const app = createApp({
// title: 'my react'
// })

const App = (props) => {
return (
<div>
{/*sadasdasd */}
<h1>Welcome {props.title}</h1>
<p> 写起来很别致呀{props.title}</p>
<p title={props.title}></p>
</div>
)
}


ReactDOM.render(
<App title='1901' />
,
document.querySelector('#root')
)

挺别致

阅读全文 »

阅读全文 »

1
enum Color {Red, Green, Blue}
1
2
3
4
5
6
var Color;
(function (Color) {
Color[Color["Red"] = 0] = "Red";
Color[Color["Green"] = 1] = "Green";
Color[Color["Blue"] = 2] = "Blue";
})(Color || (Color = {}));
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 声明
var color;
// 闭包实现enum的赋值
var setColorEnum = function (Color) {
Color[Color["Red"] = 0] = "Red";
Color[Color["Green"] = 1] = "Green";
Color[Color["Blue"] = 2] = "Blue";
}

// 调用闭包赋值 这里是分了两部,第一步判断Color是否存在,如果不存在将color声明为一个对象,对象的数值操作相当于引用操作,直接会改变原值,

if(Color || (Color = {})){
Color["Red"] = 0;
Color[Color["Red"]] = "Red";
}

由于php中直接声明的变量obj是obj,array是array。所以需要先创建一个enum类实现array接口这样就可以实现与上述代码相同的赋值行为。代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<?php

class enum implements ArrayAccess
{
private $container = array();
public function offsetSet($offset, $value)
{
if (is_null($offset)) {
$this->container[] = $value;
} else {
$this->container[$offset] = $value;
}
}
public function offsetExists($offset)
{
return isset($this->container[$offset]);
}
public function offsetUnset($offset)
{
unset($this->container[$offset]);
}
public function offsetGet($offset)
{
return isset($this->container[$offset]) ? $this->container[$offset] : null;
}
}

$Color;

(function ($Color) {
$Color[$Color->Red = 0] = "Red";
$Color[$Color->Green = 1] = "Green";
$Color[$Color->Blue = 2] = "Blue";
})(($Color = new enum()));

var_dump($Color);
var_dump($Color->Red);
var_dump($Color->Green);
var_dump($Color->Blue);
var_dump($Color[0]);
var_dump($Color[1]);
var_dump($Color[2]);

终端输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
object(enum)#2 (4) {
["container":"enum":private]=>
array(3) {
[0]=>
string(3) "Red"
[1]=>
string(5) "Green"
[2]=>
string(4) "Blue"
}
["Red"]=>
int(0)
["Green"]=>
int(1)
["Blue"]=>
int(2)
}
int(0)
int(1)
int(2)
string(3) "Red"
string(5) "Green"
string(4) "Blue"

流程分析

  • 获取所有好友列表
  • 便利列表获取好友信息
    • 单个好友发送信息
    • 单个好友分析性别,备注,是否是老师,进而生成对应的带昵称(老x,x老板,xx老师)的拜年信息
    • 单个好友发送多次拜年信息
  • end
阅读全文 »

bison

Bison 是一个通用解析器生成器,用于将无上下文的带注的语法转换为使用LALR(1) 解析器表的确定性 LR 或广义 LR (GLR) 解析器。作为实验功能,Bison 还可以生成IELR(1) 或规范 LR(1) 解析器表。精通 Bison 后,您可以使用它开发各种语言解析器,从简单的桌面计算器中使用的解析器到复杂的编程语言。

比森与Yacc是向上兼容的:所有正确编写的Yacc语法都应该与比森一起工作,没有变化。任何熟悉 Yacc 的人都应该能够使用比森,但没有什么麻烦。您需要精通 C 或C++编程才能使用 Bison。Java 也作为实验功能得到支持。

阅读全文 »

re2c 测试运行示例

1
2
3
4
5
6
$ ./integer 1024
decimal
$ ./integer sda
error
$ ./integer 0b10
binary

re2c

Re2c 是一个免费的开源词典生成器,适用于 C 和C++。其主要目标是生成与仔细优化的手写代码的速度相匹配或超过速度的快速词典。Re2c 使用有限状态机的直接编码,而不是表驱动的方法,并优化生成的代码。re2c 的另一个显著功能是异常灵活的用户界面:re2c 将接口代码的定义留给用户,而不是假设一个固定的程序模板。这为用户提供了为特定环境和输入模型自定义 lexer 的自由。Re2c 支持使用 POSIX 或最左侧贪婪语义的快速和轻量级子匹配提取。Re2c被许多其他项目使用(如php),旨在完全向后兼容。另一方面,它是一个研究项目和一个游乐场,在正式语法和自动机领域开发新的算法

阅读全文 »

起因:之前曾编译了一份php,在目录xxx.xxx.xx/下,由于文件夹名字冗余信息过度,该改名为xxx.xx/改名后运行执行php发现扩展没有被加载,执行php --ini 发现php.ini的加载路径为原来安装时的绝对路径并且为固定值

php编译安装默认设置php.ini的路径为PREFIX/lib即安装路径下的lib目录,也可以使用--with-config-file-path参数指定一个新的路径,这里测试一个指定的相对路径

1
./configure --prefix=/mnt/d/WorkSpace/hzj/php-src-p/php7.4.1output    --with-config-file-path="../"

编译完成后在/mnt/d/WorkSpace/hzj/php-src-p/php7.4.1output中创建一个php.ini,看是否可以加载

当目录为/mnt/d/WorkSpace/hzj/php-src-p/php7.4.1output/bin/php时,可以加载php.ini,其他目录则不可,所以说明两点,第一点是编写的相对路径生效了,第二点,生效的相对路径是对执行目录而言,而不是对执行文件而言。

1
2
3
4
5
h@Happy:/mnt/d/WorkSpace/hzj/php-src-p/php7.4.1output/bin$ ./php --ini
Configuration File (php.ini) Path: ../
Loaded Configuration File: /mnt/d/WorkSpace/hzj/php-src-p/php7.4.1output/php.ini
Scan for additional .ini files in: (none)
Additional .ini files parsed: (none)

这里开始查询源码文件夹下的的代码,首先搜索关键字符串Configuration File (php.ini) Path 查找到sapi\cli\php_cli.c文件中

1
2
3
4
5
zend_printf("Configuration File (php.ini) Path: %s\n", PHP_CONFIG_FILE_PATH);
zend_printf("Loaded Configuration File: %s\n", php_ini_opened_path ? php_ini_opened_path : "(none)");
zend_printf("Scan for additional .ini files in: %s\n", php_ini_scanned_path ? php_ini_scanned_path : "(none)");
zend_printf("Additional .ini files parsed: %s\n", php_ini_scanned_files ? php_ini_scanned_files : "(none)");
break;

查找变量PHP_CONFIG_FILE_PATHmain\build-defs.h

1
2
3
4
#define PHP_SYSCONFDIR          "/mnt/d/WorkSpace/hzj/php-src-p/php7.4.1output/etc"
#define PHP_LOCALSTATEDIR "/mnt/d/WorkSpace/hzj/php-src-p/php7.4.1output/var"
#define PHP_CONFIG_FILE_PATH "../"
#define PHP_CONFIG_FILE_SCAN_DIR ""

可见该文件为./configure生成的的相关宏,由于实及加载为php.ini,所以查询变量php_ini_opened_path

php_cli.c

1
2
3
4
5

PHPAPI extern char *php_ini_opened_path;
PHPAPI extern char *php_ini_scanned_path;
PHPAPI extern char *php_ini_scanned_files;

php_ini.c

1
PHPAPI char *php_ini_opened_path=NULL;

php_ini.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
if (fp) {
zend_file_handle fh;
zend_stream_init_fp(&fh, fp, filename);
RESET_ACTIVE_INI_HASH();

zend_parse_ini_file(&fh, 1, ZEND_INI_SCANNER_NORMAL, (zend_ini_parser_cb_t) php_ini_parser_cb, &configuration_hash);

{
zval tmp;

ZVAL_NEW_STR(&tmp, zend_string_init(fh.filename, strlen(fh.filename), 1));
zend_hash_str_update(&configuration_hash, "cfg_file_path", sizeof("cfg_file_path")-1, &tmp);
if (opened_path) {
zend_string_release_ex(opened_path, 0);
} else {
efree((char *)fh.filename);
}
php_ini_opened_path = zend_strndup(Z_STRVAL(tmp), Z_STRLEN(tmp));
}
}

此时已将追到了赋值所在

网上找了了一份获取文件执行路径的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include<string.h>
#include<unistd.h>

int main()
{
char szBuf[128];
char szPath[128];

memset(szBuf, 0x00, sizeof( szBuf));
memset( szPath, 0x00, sizeof(szPath));

getcwd(szBuf, sizeof(szBuf)-1);
printf("buf:%s\n", szBuf);

int ret = readlink("/proc/self/exe", szPath, sizeof(szPath)-1 );
printf("ret:%d\n", ret);
printf("path:%s\n", szPath);

return 0;
}

下一步尝试替换此处,使的php可以加载安装目录下相对路径中的php.ini

0%