使用Phpword实现word转html

//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 OCR​mathpix.com

从它提供的OCR API来看,一个月可以免费使用1000次!在之后一直到10万次都是0.004美元(约合0.028元)一次。对个人使用者而言,1000次已经基本够了。

首先需要登录平台:MathpixOCR login​dashboard.mathpix.com

登录之后需要输入信用卡信息,完成账号激活。

激活后,将会显示API的id和key:

API官方文档:Mathpix API v3 Reference​docs.mathpix.com

Github上给出了具体示例:Mathpix/api-examples​github.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机器学习库,可进行支持向量机,神经网络等操作.