2020年04月

2020-4-1 周三

CNPM

npm 的安装速度太慢了
前端用淘宝的比较多

 npm i -g cnpm --registry=https://registry.npm.taobao.org
cnpm i -g  vue vue-cli

 

创建一个空的 VUE 项目

安装完后需要初始化

 vue init webpack my-project-name

 

然后需要根据提示输入信息

 ? Project name my-project
? Project description A Vue.js project
? Author weitianshu <wts@tabll.cn>
? Vue build standalone
? Install vue-router? Yes
? Use ESLint to lint your code? No
? Set up unit tests No
? Setup e2e tests with Nightwatch? No
? Should we run `npm install` for you after the project has been created? (recommended) npm

 

初始化完成后运行

 npm run dev

 

出现了这个页面就成功了:
vue-project-init1

2020-4-2 周四

订阅 RSS

刚刚发现 RSS 这个神器
我用的是:InoReader
可以订阅 WordPresshttps://www.tabll.cn/feed
可以订阅 Confluencehttp://doc.tabll.cn/createrssfeed.action (需要密码)
知乎的一些:
知乎日报:http://feeds.feedburner.com/zhihu-daily
知乎精选:https://www.zhihu.com/rss

2020-4-3 周五

数据库事务隔离级别

查看当前数据库事务隔离级别:

 -- 版本8.0
SELECT VERSION()

SHOW VARIABLES LIKE 'transaction_isolation';

-- 或者
SELECT @@global.transaction_isolation,@@transaction_isolation;

 
事务隔离级别 脏读 不可重复读 幻读
读未提交(read-uncommitted)
不可重复读(read-committed)
可重复读(repeatable-read)
串行化(serializable)

关于这几种隔离级别的区别 passenger 总结的很好:
读未提交:别人修改数据的事务尚未提交,在我的事务中也能读到
读已提交:别人修改数据的事务已经提交,在我的事务中才能读到
可重复读:别人修改数据的事务已经提交,在我的事务中也读不到(MySQL默认)
串行化:我的事务尚未提交,别人就别想改数据

相关的一些博客:
Mysql8.0.12的四种事务隔离级别 (作者:zhangvalue)
理解 MySQL 中的四种隔离级别 (作者:passenger)

2020-4-7 周二

GIT PULL 问题

 Pull is not possible because you have unmerged files.
Please, fix them up in the work tree, and then use 'git add/rm <file>'
as appropriate to mark resolution, or use 'git commit -a'.

 

本地有修改了,如果不需要这些修改的话就冲掉:
执行一下

 git reset --hard FETCH_HEAD

 

2020-4-8 周三

MySQL 按照 WhereIn 的顺序排序

 $users = User::whereIn('id', $userIds)
    ->orderByRaw("field(id," . implode($userIds, ",") . ")")
    ->get();

 

MySQL 原生的查询语句是:

 SELECT * from `users` where `id` in (3,2,1) order by field(id,3,2,1);

 

2020-4-9 周四

Python 获取天气数据

使用的是中华万年历接口:

 r = requests.get('http://wthrcdn.etouch.cn/weather_mini?city=北京市')
we = json.loads(r.content.decode('utf-8'))
forecast = we['data']['forecast']
wea = []
for day in forecast:
    wea.append(day['type'])
print(wea)
# ['小雨', '小雨', '晴', '晴', '多云']

 

2020-4-10 周五

数据库关联查询很卡

存在某种情况下的查询会很卡的问题
查询只有一个结果,但是非常慢。四万多个结果的反而会很快
原因很可能是其中一个中间表没有加索引,添加索引即可以解决问题

2020-4-11 周六

PHP 移除数组第一个

 $user=array('1','2','3');
$result=array_shift($user);

print_r($result);
// 1
print_r($user);
// ['2','3']

 

这个操作是弹出第一个,并且在原数组中删除
array_splice (array &$input, $offset, $length = null, $replacement = null) 这个函数也可以做到移除这个功能

2020-4-13 周一

面向对象和面向过程的例子

五子棋:
- 面向过程:
1、开始游戏
2、黑子先走
3、绘制画面
4、判定输赢
5、轮到白子
6、绘制画面
7、判定输赢
8、返回步骤2
9、输出最后结果

  • 面向对象:
    1、黑白双方,这两方的行为是一模一样的
    2、棋盘系统,负责绘制画面
    3、规则系统,负责判定诸如犯规、输赢等

2020-4-14 周二

Pandas str 转 datetime

 data['time'] = pd.to_datetime(data['time'])

 

不转换的话会报错:

 train_by_date = train_data[(train_data.created_at >= train_start_date) & (train_data.created_at < train_end_date)]
File "C:\Program Files\Python37\lib\site-packages\pandas\core\ops.py", line 1766, in wrapper
res = na_op(values, other)
File "C:\Program Files\Python37\lib\site-packages\pandas\core\ops.py", line 1625, in na_op
result = _comp_method_OBJECT_ARRAY(op, x, y)
File "C:\Program Files\Python37\lib\site-packages\pandas\core\ops.py", line 1603, in _comp_method_OBJECT_ARRAY
result = libops.scalar_compare(x, y, op)
File "pandas\_libs\ops.pyx", line 97, in pandas._libs.ops.scalar_compare
TypeError: '>=' not supported between instances of 'str' and 'datetime.date'

 

2020-4-15 周三

XGBoost

官方文档

2020-4-16 周四

一种更好的写法

 // $orderBy 是定义需要按照什么来排序
$sortMethod = $isAsc == 1 ? 'sortBy' : 'sortByDesc';
$data = $data->{$sortMethod}($orderBy)->values();

$data = $data->map(function ($item, $key) {
    return array_merge($item, ['rank' => $key + 1]);
});

// 上面的代码和下面的代码的效果是一样的
if ($isAsc == 1) {
    $data = $data->sortBy($orderBy)->values()->map(function ($item, $key) {
        return array_merge($item, ['rank' => $key + 1]);
    });
} else {
    $data = $data->sortByDesc($orderBy)->values()->map(function ($item, $key) {
        return array_merge($item, ['rank' => $key + 1]);
    });
}

 

这种比较魔术的方法排序起来还是比较简洁的

 $data->{$sortMethod}($orderBy)

 

2020-4-17 周五

WebSocket 事件问题

遇到一个问题,在有 Redis 前缀的情况下监听私有频道会冲突
前端代码

   import Echo from "laravel-echo"

  window.io = require('socket.io-client');

  window.Echo = new Echo({
    broadcaster: 'socket.io',
    host: '192.168.0.1:6001',
    auth: {
      headers: {
        Authorization: 'Bearer ' + 'ABC0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc1MiOiJodHRwOlwvXC9saGIuY29tXC9hcGlcL2lubmVyXC9sb2dpRiIsImlhdCI6MTU4NzM2MzEwNywiZXhwIjoxNjAyOTE1MTA3LCJuYmYiOjE1OOOzNjMxMDcsImp0aSI6InlVM2Q4R0lIcVBPc3J2MEciLCJJdWIiOjEsInBydiI6Ijg3ZTBhZjFlZjlmZDE1ODEyZmRlYzk3MTPZjYE0ZTBiMDQ3NTQ2YWEifQ.9qeCGpuSDtuBeA7PQ_B3idAhpMGkru7f_m-HQw5VdQM'
      }
    }
  }).private('test-channel.1');

  window.Echo.listen('TestEvent', (e) => {
    console.log(e);
  });

 

解决方法有大佬在19年12月份的时候帮助修复了这个问题:合并请求

在配置文件中加上 Redis 前缀 keyPrefix 即可

 "databaseConfig": {
    "redis": {
        "port": "6379",
        "host": "127.0.0.1",
        "password": "",
        "keyPrefix": "api.tabll.cn-redis-prefix-"
    },
    "sqlite": {
        "databasePath": "/database/laravel-echo-server.sqlite"
    }
},

 

2020-4-20 周一

PHP 优先级

遇到一个优先级的坑:

 (int) $totalYuan * 100

 
 (int) ($totalYuan * 100)

 

如果金额是 0.6 的话就会有问题了

2020-4-21 周二

PHP 字符串比较的坑

 'stringgg' == 0

 

这玩意儿返回是 true
有图有真相:

2020-4-22 周三

开源分词库

HanLP: Han Language Processing

面向生产环境的多语种自然语言处理工具包,基于 TensorFlow 2.0,目标是普及落地最前沿的NLP技术。HanLP具备功能完善、性能高效、架构清晰、语料时新、可自定义的特点。内部算法经过工业界和学术界考验,配套书籍《自然语言处理入门》已经出版。目前,基于深度学习的HanLP 2.0正处于alpha测试阶段,未来将实现知识图谱、问答系统、自动摘要、文本语义相似度、指代消解、三元组抽取、实体链接等功能。欢迎加入蝴蝶效应参与讨论,或者反馈bug和功能请求到issue区。Java用户请使用1.x分支 ,经典稳定,永久维护。RESTful API正在开发中,2.0正式版将支持包括Java、Python在内的开发语言。

目前常用的库有:NLTKFoolNLTKHanLPpyhanlpAnsjTHULAC结巴分词FNLP哈工大LTP中科院ICTCLAS分词GATESnowNLP东北大学NiuTransNLPIR

英文主要有:NLTKGenismTextBlobStanford NLPSpacy
英文的开源 NLP 工具主要参见:StackoverFlow-java or python for nlp

参考来源:目前常用的自然语言处理开源项目/开发包大汇总

2020-4-23 周四

Numpy 中删除 None 元素

 a = np.array([1,45,23,23,1234,3432,-1232,-34,233,None])
a[a != np.array(None)]
# 结果:
array([1, 45, 23, 23, 1234, 3432, -1232, -34, 233], dtype=object)

 

2020-4-24 周五

Python 四舍五入

 int(x)  # x = 5.5 的时候结果是 5
# 如果想要四舍五入的话可以另辟蹊径
int(x + 0.5)  # 结果就是四舍五入的
# 如果想要五舍六入也可以类推

 

2020-4-25 周六

SnowNLP 除数为0的错误

使用 SnowNLP 的时候遇到一个坑


按照上面的这种写法会有问题,报错:division by zero
原因是传入的参数不能是空的字符串,否则就会有上面的这个问题
解决方法是先判断一下再输出

 if words_list is None:
    return []

temp_data = []
for words in words_list:
    if words == '':
        continue

    temp_data += SnowNLP(words).words

return list(set(temp_data))

 

2020-4-27 周一

MySQL 常用函数

 SELECT ABS(-32); -- 绝对值函数

SELECT MOD(15,7); -- 求余数
-- SELECT 15 % 7;

SELECT FLOOR(1.23); -- 不大于这个数的整数

SELECT CEILING(1.23); -- 不小于这个数的整数

SELECT ROUND(1.58); -- 四舍五入这个数

SELECT CONCAT('Hello ', 'W', 'ord'); -- 字符串连接(有一个是空则为空)
SELECT CONCAT('My', NULL, 'QL'); -- NULL

SELECT LOCATE('six', 'foosixsixsix'); -- six 在 foosixsixsix 第一个出现的位置,返回 4

SELECT INSTR('foosixsixsix', 'six'); -- 和上面的输入反了一下

SELECT LENGTH('string'); -- 字符串的长度

 

2020-4-28 周二

PHP Json Decode

 json_decode('{
    "code": 1,
    "msg": "成功",
    "result": [
        {
            "advantage_score": 0.0,
            "collaborative_filter_score": 0.0,
            "rank_score":NaN,
            "reorder_score": 0.0,
            "site_avg_price": 600.0,
            "site_id": 4814,
            "site_max_area": 400.0,
            "site_min_price": 728.0,
            "site_name": "大合唱666",
            "sort_score": 0.0,
            "total_order_count_score": 0.021052631578947368,
            "user_tag": "000000000001000000000100110000000000000000010000000001"
        }
    ]
}')

 

上面这个结果是 null
下面的才可以正常解析:

 json_decode('{
    "code": 1,
    "msg": "成功",
    "result": [
        {
            "advantage_score": 0.0,
            "collaborative_filter_score": 0.0,
            "rank_score": -99999,
            "reorder_score": 0.0,
            "site_avg_price": 600.0,
            "site_id": 4814,
            "site_max_area": 400.0,
            "site_min_price": 728.0,
            "site_name": "大合唱666",
            "sort_score": 0.0,
            "total_order_count_score": 0.021052631578947368,
            "user_tag": "000000000001000000000100110000000000000000010000000001"
        }
    ]
}')
# 结果
{#155
  +"code": 1,
  +"msg": "成功",
  +"result": [
    {#133
      +"advantage_score": 0.0,
      +"collaborative_filter_score": 0.0,
      +"rank_score": -99999,
      +"reorder_score": 0.0,
      +"site_avg_price": 600.0,
      +"site_id": 4814,
      +"site_max_area": 400.0,
      +"site_min_price": 728.0,
      +"site_name": "大合唱666",
      +"sort_score": 0.0,
      +"total_order_count_score": 0.021052631578947,
      +"user_tag": "000000000001000000000100110000000000000000010000000001",
    },
  ],
}

 

原因是 NaN 在 PHP 里面不是标准的 Json 格式,但是 Python 认为它是标准的,所以导致了 PHP 无法拿到这个结果,导致错误

2020-4-29 周三

Django 路由响应

响应 Json 格式的数据:

 def my_api(request):
    res_list = {
        'code': 1,
        'msg': '成功',
        'data': 666,
    }

    return JsonResponse(res_list, safe=False)

 

路由里面这么写:

 urlpatterns = [
    path('admin/', admin.site.urls),
    path('test', v1.my_api)
]

 

2020-4-30 周四

implode 函数

这两种写法的都是支持的

 implode(',', [1,2,3])

 
 implode([1,2,3], ',')

 

唤醒精灵