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
出现了这个页面就成功了:
2020-4-2 周四
订阅 RSS
刚刚发现 RSS
这个神器
我用的是:InoReader
可以订阅 WordPress
:https://www.tabll.cn/feed
可以订阅 Confluence
:http://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在内的开发语言。
目前常用的库有:NLTK
,FoolNLTK
,HanLP
,pyhanlp
,Ansj
,THULAC
,结巴分词
,FNLP
,哈工大LTP
,中科院ICTCLAS分词
,GATE
,SnowNLP
,东北大学NiuTrans
,NLPIR
英文主要有:NLTK
,Genism
,TextBlob
,Stanford NLP
,Spacy
英文的开源 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], ',')