//Word转HTML
$phpWord = \PhpOffice\PhpWord\IOFactory::load('./word/hello.docx');
$xmlWriter = \PhpOffice\PhpWord\IOFactory::createWriter($phpWord, "HTML");
$xmlWriter->save('./html/hello.html');
Mathpix收费了?快使用API吧,个月免费识别1000次!
最近,数学公式OCR神器Mathpix 开始收费,一个月只能免费用50次,再用就得5刀一月,小伙伴们顿时叫苦不迭。想想这种套路国内互联网公司不知道玩了多少次了,从滴滴打车到美团外卖再到共享单车,都是先培养消费习惯再收割一波韭菜。但是当初大家都只顾享受免费识别公式带来的快感,哪知由俭入奢易,由奢入俭难,现在再手敲公式真是痛苦不堪。
目前来看,由于需要联网识别,基本没有空子可钻。当然也不排除个别神人用大量邮箱来白嫖:如何看待 Mathpix 收费?www.zhihu.com
但是,Mathpix官网对于一些有能力的开发者还是开了一扇后门的:Mathpix OCRmathpix.com
从它提供的OCR API来看,一个月可以免费使用1000次!在之后一直到10万次都是0.004美元(约合0.028元)一次。对个人使用者而言,1000次已经基本够了。
首先需要登录平台:MathpixOCR logindashboard.mathpix.com
登录之后需要输入信用卡信息,完成账号激活。
激活后,将会显示API的id和key:
API官方文档:Mathpix API v3 Referencedocs.mathpix.com
Github上给出了具体示例:Mathpix/api-examplesgithub.com
以Python为例,只需要在mathpix.py中填写自己的id和key,再调用simple.py就能运行。从示例来看,它识别的是本地图片。我在它的基础上加入了识别剪贴板的代码,从而达成与Mathpix相似度为99%的使用体验。
import os
import base64
import requests
import json
from PIL import ImageGrab
#
# Common module for calling Mathpix OCR service from Python.
#
# N.B.: Set your credentials in environment variables APP_ID and APP_KEY,
# either once via setenv or on the command line as in
# APP_ID=my-id APP_KEY=my-key python3 simple.py
#
env = os.environ
default_headers = {
'app_id': env.get('APP_ID', '你的id'),
'app_key': env.get('APP_KEY', '你的key'),
'Content-type': 'application/json'
}
service = 'https://api.mathpix.com/v3/latex'
#
# Return the base64 encoding of an image with the given filename.
#
def image_uri(filename):
image_data = open(filename, "rb").read()
return "data:image/jpg;base64," + base64.b64encode(image_data).decode()
#
# Call the Mathpix service with the given arguments, headers, and timeout.
#
def latex(args, headers=default_headers, timeout=30):
r = requests.post(service,
data=json.dumps(args), headers=headers, timeout=timeout)
return json.loads(r.text)
def mathpix_clipboard(): # 识别剪贴板公式
im = ImageGrab.grabclipboard()
im.save('equa.png','PNG')
r = latex({
'src': image_uri("equa.png"),
'formats': ['latex_simplified']
})
print(r['latex_simplified'])
if __name__ == '__main__':
mathpix_clipboard()
PHP操作Excel
安装
composer require phpoffice/phpspreadsheet
简单使用
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
$spreadsheet = new Spreadsheet();
for($i=1;$i<=3;$i++)
{
if($i > 1)
{
$sheet = $spreadsheet->createSheet();
}
$spreadsheet->setActiveSheetIndex($i-1);
$sheet = $spreadsheet->getActiveSheet();
$sheet->setTitle('sheet_sheet'.$i);
$sheet->setCellValue('A1', 'Hello World !'.$i);
}
$writer = new Xlsx($spreadsheet);
$writer->save('./public/hello world.xlsx');
GridView直接更新数据,kartik\grid\EditableColumn用法 [ 2.0 版本 ]
本文转自:https://www.yiichina.com/tutorial/1110
<?php
use yii\helpers\Url;
use common\models\ProductCategory;
return [
[
'class' => 'kartik\grid\SerialColumn',
'width' => '30px',
],
[
//'class' => '\kartik\grid\DataColumn',
'attribute' => 'name',
'class' => '\kartik\grid\EditableColumn',
],
[
'class' => '\kartik\grid\DataColumn',
'attribute' => 'category.name',
],
[
'class' => '\kartik\grid\EditableColumn',
'attribute' => 'price',
],
'created_at:datetime',
[
'class' => 'kartik\grid\ActionColumn',
'dropdown' => false,
'vAlign' => 'middle',
'urlCreator' => function ($action, $model, $key, $index) {
return Url::to([$action, 'id' => $key]);
},
'header' => Yii::t('app', '操作'),
'viewOptions' => ['role' => 'modal-remote', 'title' => 'View', 'data-toggle' => 'tooltip'],
'updateOptions' => ['role' => 'modal-remote', 'title' => 'Update', 'data-toggle' => 'tooltip'],
'deleteOptions' => ['role' => 'modal-remote', 'title' => 'Delete',
'data-confirm' => false, 'data-method' => false,// for overide yii data api
'data-request-method' => 'post',
'data-toggle' => 'tooltip',
'data-confirm-title' => Yii::t('app', '操作确认'),
'data-confirm-message' => Yii::t('app', '你确定要删除这个选项吗?')],
],
];
在控制器index方法里加上一段
/**
* Lists all Product models.
* @return mixed
*/
public function actionIndex()
{
$searchModel = new ProductSearch();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
if ($this->isAjax && Yii::$app->request->post('hasEditable')) {
Yii::$app->response->format = Response::FORMAT_JSON;
$model = Product::findOne($this->post['editableKey']);
$out = ['output' => '', 'message' => ''];
$this->post[$model->formName()] = $this->post[$model->formName()][$this->post['editableIndex']];
if ($model->load($this->post)) {
// can save model or do something before saving model
if($model->save()) {
$output = '';
/*if (isset($this->post[$model->formName()]['price_cny'])) {
$output = Yii::$app->formatter->asDecimal($model->price, 2);
}*/
$out = ['output' => $output, 'message' => ''];
}else{
$out['message'] = $model->getErrors();
}
}else{
$out['message'] = $model->getErrors();
}
return $out;
}
return $this->render('index', [
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,
]);
}
如果需要做权限控制之类的,修改提交地址不想直接放在index方法,可以自定义提交地址,加上editableOptions参数即可
[
//'class' => '\kartik\grid\DataColumn',
'class' => '\kartik\grid\EditableColumn',
'attribute' => 'price',
'editableOptions'=> function ($model, $key, $index) {
return [
//'size'=>'sm',
'formOptions' => [
'method'=>'post',
'action' => ['editable']
]
];
}
],
资源站收录
如何从基于Web的cron作业创建和管理
You may try to use yii2tech/crontab
extension for this:
use yii2tech\crontab\CronJob;
use yii2tech\crontab\CronTab;
$cronJob = new CronJob();
$cronJob->min = '0';
$cronJob->hour = '0';
$cronJob->command = 'php /path/to/project/yii some-cron';
$cronTab = new CronTab();
$cronTab->setJobs([
$cronJob
]);
$cronTab->apply();
关于yii2-admin的菜单数据表配置
/**
* Configs
* Used to configure some values. To set config you can use [[\yii\base\Application::$params]]
*
* ```
* return [
*
* 'mdm.admin.configs' => [
* 'db' => 'customDb',
* 'menuTable' => '{{%admin_menu}}',
* 'cache' => [
* 'class' => 'yii\caching\DbCache',
* 'db' => ['dsn' => 'sqlite:@runtime/admin-cache.db'],
* ],
* ]
* ];
* ```
*
* or use [[\Yii::$container]]
*
* ```
* Yii::$container->set('mdm\admin\components\Configs',[
* 'db' => 'customDb',
* 'menuTable' => 'admin_menu',
* ]);
* ```
FTP可以连接但是无法获取目录的解决办法:无法打开传输通道
状态: 正在取得目录列表...
命令: CWD xinghun
响应: 250 OK.
Current directory is /
命令:
PWD 响应: 257 /www/xinghun is your currentlocation
命令: PASV
响应: 227
Entering Passive Mode(,18,)
命令: TYPE A
响应: 200
TYPE is now ASCII
命令: LIST
错误: 无法打开传输通道。
原因:由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。
错误: 无法取得目录列表
命令: PWD
总是出现以上这个字符,研究了2天,终于发现了,其他人都说要设置: 但是我无论怎么设置,都不起作用,还是一样的出现错误报告。
后来无意中发现了解决办法:
按照这个做法,站点管理器—选择站点—–高级—选择活动模式—–确定。
然后再开启,发现,呵呵呵,完美解决了!
如图:
极大似然估计
以前多次接触过极大似然估计,但一直都不太明白到底什么原理,最近在看贝叶斯分类,对极大似然估计有了新的认识,总结如下:
贝叶斯决策
首先来看贝叶斯分类,我们都知道经典的贝叶斯公式:
其中:p(w):为先验概率,表示每种类别分布的概率;:类条件概率,表示在某种类别前提下,某事发生的概率;而为后验概率,表示某事发生了,并且它属于某一类别的概率,有了这个后验概率,我们就可以对样本进行分类。后验概率越大,说明某事物属于这个类别的可能性越大,我们越有理由把它归到这个类别下。
我们来看一个直观的例子:已知:在夏季,某公园男性穿凉鞋的概率为1/2,女性穿凉鞋的概率为2/3,并且该公园中男女比例通常为2:1,问题:若你在公园中随机遇到一个穿凉鞋的人,请问他的性别为男性或女性的概率分别为多少?
从问题看,就是上面讲的,某事发生了,它属于某一类别的概率是多少?即后验概率。
原文链接:https://blog.csdn.net/zengxiantao1994/java/article/details/72787849
PHP常用人工智能库
1.NLPTools(http://php-nlp-tools.com/)
NLPTools是一个PHP自然语言处理库.能进行文本分级,聚类等操作.
2.Prediction Builder(https://github.com/denissimon/prediction-builder)
一个用PHP写成的机器学习预测库,使用了线性回归算法.
3.AIML(http://www.alicebot.org/aiml.html)
AIML是用于搭建聊天机器人平台的标记语言,可被PHP调用.
4.PHP Classifier(https://github.com/Dachande663/PHP-Classifier)
PHP朴素贝叶斯分类库.
5.PHP-FANN(https://github.com/bukka/php-fann)
PHP人工神经网络库.
6.ANN(http://ann.thwien.de/index.php?title=Main_Page)
PHP人工神经网络库.
7.PHP-ML(https://github.com/php-ai/php-ml)
PHP机器学习库,可进行支持向量机,神经网络等操作.