clion只支持cmake.

当然cmake语法是很重要的了.

直接写CMakeLists.txt.

但用clion导入原有makefile工程是有技巧的,不然没法补全,没法build.

File->
New CMake project from sources->
Import as CMake project->
Import as new Cmake project

会生成导入了各种.cpp/.h的基础CMakeLists.txt,并且可以直接在ide build/debug等

然后基于CMakeLists.txt做自己的修改,比如so库,生成bin等等.

Read More

2020

一切的艰难困苦,不再言表.

这里代表了我曾经前进的方向,我希望我能坚持.

不再设具体目标, 能写来若干文字已不易.

只愿命运温和待我.

产品

以后多谢谢产品性质的文章,锻炼产品思维,练练文笔,都有好处。

Read More

为啥需要autoload

autoload就是代替手动的include/require:

self::$loader = $loader = new \Composer\Autoload\ClassLoader();

执行上面的时候,自动调用1个方法来require.

具体地,通过spl_autoload_register将想要调用的函数注册到1个队列里, 系统会执行队列的所有注册回调,去加载真正的类文件.

spl_autoload_register(array('ComposerAutoloaderInit063adac3dfb9af8e4cef0fc21a448d00', 'loadClassLoader')

上面是loadCloassLoader:

就是3个要素:

1 类名
2 对应的文件名
3 require的动作
    if ('Composer\Autoload\ClassLoader' === $class) {
        require __DIR__ . '/ClassLoader.php';
    }

composer实现

上面其实就是整个composer自动加载的第1个类,是个statis变量, 位于auload_real.php:

self::$loader = $loader = new \Composer\Autoload\ClassLoader();

这个loader是一开始就会调用的

//index.php
require __DIR__.'/../vendor/autoload.php';
//autoload.php
require_once __DIR__ . '/composer/autoload_real.php';
return ComposerAutoloaderInit063adac3dfb9af8e4cef0fc21a448d00::getLoader();

//autoload_real.php
//getLoader:
public static function getLoader()
{
        if (null !== self::$loader) {
            return self::$loader;
        }

        spl_autoload_register(array('ComposerAutoloaderInit063adac3dfb9af8e4cef0fc21a448d00', 'loadClassLoader'), true, true);
        self::$loader = $loader = new \Composer\Autoload\ClassLoader();
        spl_autoload_unregister(array('ComposerAutoloaderInit063adac3dfb9af8e4cef0fc21a448d00', 'loadClassLoader'));

        $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
        if ($useStaticLoader) {
            require_once __DIR__ . '/autoload_static.php';

            call_user_func(\Composer\Autoload\ComposerStaticInit063adac3dfb9af8e4cef0fc21a448d00::getInitializer($loader));
        } else {
            $map = require __DIR__ . '/autoload_namespaces.php';
            foreach ($map as $namespace => $path) {
                $loader->set($namespace, $path);
            }

            $map = require __DIR__ . '/autoload_psr4.php';
            foreach ($map as $namespace => $path) {
                $loader->setPsr4($namespace, $path);
            }

            $classMap = require __DIR__ . '/autoload_classmap.php';
            if ($classMap) {
                $loader->addClassMap($classMap);
            }
        }

        //核心require在这里.
        $loader->register(true);

        if ($useStaticLoader) {
            $includeFiles = Composer\Autoload\ComposerStaticInit063adac3dfb9af8e4cef0fc21a448d00::$files;
        } else {
            $includeFiles = require __DIR__ . '/autoload_files.php';
        }
        foreach ($includeFiles as $fileIdentifier => $file) {
            composerRequire063adac3dfb9af8e4cef0fc21a448d00($fileIdentifier, $file);
        }

        return $loader;
    }
}

register:

spl_autoload_register(array($this, 'loadClass'), true, $prepend);

loadClass:

    public function loadClass($class)
    {
        if ($file = $this->findFile($class)) {
            includeFile($file);

            return true;
        }
    }

loadClass函数就是实现上面核心三点.

composer都干了啥

可以看到vendor/composer多了很多自动生成的文件:

├── autoload_classmap.php
├── autoload_files.php
├── autoload_namespaces.php
├── autoload_psr4.php
├── autoload_real.php
├── autoload_static.php
├── ClassLoader.php
├── installed.json
└── LICENSE

整个跟composer包里的配置是相关的,把composer.json和子包里的composer.json与autoload相关的json设置都导入到了上面的几个文件(php)里:

    "autoload": {
        "files": [
            "app/helpers.php"
        ],
        "classmap": [
            "database/seeds",
            "database/factories"
        ],
        "psr-4": {
            "Zhiyi\\Plus\\": "app/"
        }
    },

一共4种模式: https://my.oschina.net/sallency/blog/893518https://my.oschina.net/sallency/blog/893518

只有有个困惑composer dump-autoload不知道干嘛的,现在很清楚了,就是在autoload规则发生变化后,自动生成composer下新的映射php文件

Read More

electron不能再wsl下跑,还是只能windows下安装node.js

electron 安装

就按文档来好了,分发打包用electron-forge,记得都全局安装.yarn安装不上就换npm就好

electron-vue

这个算是最佳工程实践了

但是依赖vue-cli 2,安装个全局的.

https://github.com/SimulatedGREG/electron-vue

node-hid

node-hid是node.js访问usb的包,肯定依赖libusb这样的底层c/c++库,node下编译工具是node-gyp.

这货又依赖各种windows-build-tool: 看node-gyp文档:https://github.com/nodejs/node-gyp

期间还需要用python2,于是用conda创建环境,遇到了个问题无法activate,输入命令:

conda init powershell
conda create python=python2.7 name=py27
conda activate py27

usb

上面那个只能针对hid设备.

node.js封装的libusb才是最好用的

yarn add usb

Read More