sprite 发布的文章

Tensorflow-lite

https://tensorflow.google.cn/lite/guide/build_cmake?hl=zh-cn

Download git - tensorflow

cd ~
mkdir tflite-micro
cd tflite-micro

git clone https://github.com/tensorflow/tensorflow

cd tensorflow

Install deps

  • Ubuntu
sudo apt-get update
sudo apt-get install git build-essential cmake python3 python3-pip
  • macos
brew install git cmake python

Download & instal Bazel

  • 安装 Bazelisk(自动管理 Bazel 版本)
curl -L https://github.com/bazelbuild/bazelisk/releases/download/v1.17.0/bazelisk-linux-amd64 -o /usr/local/bin/bazel
chmod +x /usr/local/bin/bazel
  • [推荐] 手动管理版本

首先进入 tensorflow 目录 查看 .bazelversion

7.4.1

比如 目录配置是 7.4.1 那么,就打开 bazel - git https://github.com/bazelbuild/bazel/releases 找到对应的版本,如

  • macos

https://github.com/bazelbuild/bazel/releases/download/7.4.1/bazel-7.4.1-darwin-arm64

  • linux

https://github.com/bazelbuild/bazel/releases/download/7.4.1/bazel-7.4.1-linux-x86_64


tflite-micro

1. download tflite-micro

git clone https://github.com/tensorflow/tflite-micro
cd tflite-micro

2. download the suitable version of bazel

cat .bazelversion

# result like 7.0.0

go to https://github.com/bazelbuild/bazel/releases

and download the bazel binary package

mkdir ~/tools/bazel/7.0.0
cd ~/tools/bazel/7.0.0

wget https://github.com/bazelbuild/bazel/releases/download/7.0.0/bazel-7.0.0-linux-x86_64

chmod +x bazel-7.0.0-linux-x86_64
# create link
ln -s bazel-7.0.0-linux-x86_64 bazel

set the env

vi ~/.bashrc

or

vi ~/.zshrc # macos
# bazel_env_start
export PATH="~/tools/bazel/7.0.0:$PATH"
# bazel_env_end

flush the rcfile

# bash
source ~/.bashrc

# zsh
source ~/.zshrc

Now the env setting is done.

check the version of cmd bazel

bazel --version

# terminal shows below
bazel 7.0.0

Spark是用于分布式数据管理和处理系统,源于google的mapreduce系统以及开源社区Hadoop,并对其做了诸多补充和升级,譬如采用内存来管理数据,大幅度提高了响应速度,更适合现代的各类分布式数据场景,如实时大数据交互、人工智能、空间数据处理等

以下是在本机创建用于验证和个人部署spark的简要步骤:

macOS

brew install apache-spark

安装完成后,spark会将安装在 /opt/homebrew/Cellar/apache-spark/$version 下,比如4.0.1 就在 /opt/homebrew/Cellar/apache-spark/4.0.1

我们将路径输出到环境变量中,编辑 vi ~/.zshrc,不用zsh的需要编辑其他rc文件

在后面添加

# spark_env_start
export SPARK_DIR="/opt/homebrew/Cellar/apache-spark/4.0.1"
export PATH="$SPARK_DIR/bin:$SPARK_DIR/libexec/sbin:$PATH"
# spark_env_end

编辑完成后重新打开terminal 或者 source ~/.zshrc 完成安装和环境配置

Ubuntu

安装JDK, ...

建议使用Scala 3.x,相应的jdk版本建议使用11,如果安装Scala 2.x的话 需要安装jdk@8

sudo apt install default-jdk

安装others

ubuntu

sudo apt install scala -y

安装spark

首先打开spark官网下载页 https://dlcdn.apache.org/spark/

选择一个版本,比如 3.5.7

复制对应的下载地址,如 https://dlcdn.apache.org/spark/spark-3.5.7/pyspark-3.5.7.tar.gz

创建一个目录,比如 ~/spark

mkdir -p ~/spark
cd ~/spark

下载

wget https://dlcdn.apache.org/spark/spark-3.5.7/spark-3.5.7-bin-hadoop3.tgz

解压并进入文件夹

tar -xf spark-3.5.7-bin-hadoop3.tgz -C ./
cd spark-3.5.7-bin-hadoop3
ll #查看目录 是否有 bin sbin

total 96
drwxr-xr-x 1 shezw shezw   170 Sep 18 04:52 ./
drwxr-xr-x 1 shezw shezw   100 Oct  5 15:27 ../
-rw-r--r-- 1 shezw shezw 22916 Sep 18 04:52 LICENSE
-rw-r--r-- 1 shezw shezw 57842 Sep 18 04:52 NOTICE
drwxr-xr-x 1 shezw shezw     6 Sep 18 04:52 R/
-rw-r--r-- 1 shezw shezw  4605 Sep 18 04:52 README.md
-rw-r--r-- 1 shezw shezw   166 Sep 18 04:52 RELEASE
drwxr-xr-x 1 shezw shezw   748 Sep 18 04:52 bin/
drwxr-xr-x 1 shezw shezw   288 Sep 18 04:52 conf/
drwxr-xr-x 1 shezw shezw    68 Sep 18 04:52 data/
drwxr-xr-x 1 shezw shezw    14 Sep 18 04:52 examples/
drwxr-xr-x 1 shezw shezw 13296 Sep 18 04:52 jars/
drwxr-xr-x 1 shezw shezw    32 Sep 18 04:52 kubernetes/
drwxr-xr-x 1 shezw shezw  2402 Sep 18 04:52 licenses/
drwxr-xr-x 1 shezw shezw   338 Sep 18 04:52 python/
drwxr-xr-x 1 shezw shezw  1030 Sep 18 04:52 sbin/
drwxr-xr-x 1 shezw shezw    56 Sep 18 04:52 yarn/

其中 bin, sbin是存放 可执行与服务启动文件的目录,需要配置到系统环境变量中,使用pwd获取到当前目录,如 /home/shezw/spark/spark-3.5.7-bin-hadoop3

编辑 vi ~/.bashrc 在最后添加

# spark_env_start
export SPARK_DIR="/home/shezw/spark/spark-3.5.7-bin-hadoop3"
export PATH="$SPARK_DIR/bin:$SPARK_DIR/sbin:$PATH"
# spark_env_end

编辑完成后重新打开terminal 或者 source ~/.zshrc 完成安装和环境配置


使用 start, stop来开启和关闭spark

start-master.sh
stop-master.sh

启动完成后,可以通过

localhost:8080 来访问spark的web页面,其中也会显示服务的端口号,一般是7077

今天中午和好朋友讨论一个话题,引申出来一个问题

目标是想出来的还是做出来的?

一个很自然的结论是 “目标当然是想出来的”

但是我持不同观点,因为我认为想出来的,只能算想法,想法和目标有着巨大的差别。而从想法到目标,要的是不断做,并且做明白的过程。

在朋友的追问下,我总算集中精力拆解了这个抽象又反常规的观点。

  1. 目标是什么?他是实物还是一个概念

目标是人对于理想预期(结果)的一种描述,不是结果本身

  1. 目标既然是一个概念,那他和想法有没有什么异同?

目标和想法是不同的,想法包含目标,但目标有更多限制条件

举个例子 我的目标是考90分 (可能是目标) 我想当美国总统 (大概率是想法)

  1. 怎么更加明确的界定目标和想法的不同?

目标不应该是一个毫无依据的想法,所以他需要思考和论证,否则就不是目标了,而是空想。 我们将“目标”二字拆解,目之所及,标的所在,达成目标是需要途径的,而不是“盲目”空想。

所以,想法和目标一个重要区别是是否具备实现途径,不具备的时候是想法,具备的时候是目标。

  1. 为什么目标需要在做的过程中获得,而不是一开始就想好?

在上一个问题中,我们已经知道目标需要思考和论证,那是否在做之前就可以论证清楚呢? 在纯粹的思维问题中,这是可以的,但在复杂的社会活动中,这是不现实的。 因为思维可以解决向内求证,但只有实践才能够向外求证,这是达成目标实现途径验证的必要方式。

  1. 先想还是先做?从想法到实现还是从路径到结果?

既然我们已经知道,目标需要在做的过程中不断确认,那我们是否可以不想太多干就完了?

不能,没有目标的执行,是盲目、是消耗

那我现在没有合适的目标,难道要等到想好了再行动吗?

是,但不完全是,不去实践就很难从外部获取信息和完善内部的认知,所以即使没有合适的目标,也需要动起来,但要朝着一个适合自己或自己感兴趣的方向努力

  1. 总结

忽略外部情况和实践的想法不能成为目标,只会成为空想

想要实现目标,就要结合内外条件,找到合适的途径并不断的调整和修正目标与路线,才能真正到达彼岸。

如果处于迷雾当中,我们要尽快动起来,在不断摸索的过程中,找到自己的目标

1. 安装 Conda

如果你还没有安装 Conda,可以通过以下两种方式之一进行安装:

Anaconda:一个包含 Conda、Python 和许多常用数据科学库的发行版。你可以从 Anaconda 官网 下载并安装它。

Miniconda:一个更轻量级的发行版,只包含 Conda 和必要的 Python 组件,你可以使用 Conda 安装其他库。可以从 Miniconda 官网 下载并安装它。

2. 创建新的 Conda 环境

为了隔离项目依赖,最好为每个项目创建一个新的 Conda 环境。使用以下命令创建一个新的环境:

conda create -n my_ml_env python=3.12

这里 my_ml_env 是你为环境起的名字,python=3.12 指定了 Python 的版本。你可以根据需要选择不同的 Python 版本。

3. 激活环境

创建环境后,使用以下命令激活环境:

conda activate my_ml_env

4. 安装机器学习库

在激活的环境中,你可以安装所需的机器学习库。Conda 允许你从 Anaconda 仓库安装库,这些库已经为科学计算进行了优化。以下是一些常用的机器学习库:

NumPy:基础数学库。 Pandas:数据分析库。 Matplotlib:绘图库。 Scikit-learn:机器学习库。 TensorFlow 或 PyTorch:深度学习库。 安装这些库的命令如下:

conda install numpy pandas matplotlib scikit-learn
conda install tensorflow  # 或者 conda install pytorch

5. 管理环境

查看所有环境:

conda env list

退出环境:

conda deactivate

删除环境:

conda env remove -n my_ml_env
  1. 更新和升级 更新环境中的所有包:
conda update --all

升级 Conda:

conda update conda

6. 使用 YML 文件管理环境

Conda 允许你使用 YML 文件来管理环境,这样可以更容易地复制和共享环境配置。创建一个 YML 文件,例如 environment.yml,并添加以下内容:

name: my_ml_env
dependencies:
  - python=3.8
  - numpy
  - pandas
  - matplotlib
  - scikit-learn
  - tensorflow
  - jupyter

然后,使用以下命令创建环境:

conda env create -f environment.yml

这将根据 YML 文件中的依赖关系创建环境。

通过这些步骤,你可以使用 Conda 为机器学习项目创建一个完整的开发环境,包括必要的库和工具。Conda 的强大之处在于其能够管理复杂的依赖关系,并且可以轻松地在不同环境之间切换。

patch libs

ref

    1. install patch-package
npm i patch-package --save-dev
    1. modify the source code in third party libs
    1. generate the .patch
npx patch-package @mantine/core
✔ Created file patches/@mantine+core+7.2.2.patch

remove old source and reinstall

rm -rf node_modules/@mantine/core
bun install 
// npm install

jest

jest can not found canvas

npm i jest-canvas-mock --dev

and add 'canvas' : 'jest-canvas-mock' to moduleNameMapper in jest.config.js.

jest css, svg ...

module.exports = {
    "roots": [
        "<rootDir>",
        "/Users/shezw/dev/web/react/easyvgl-editor"
    ],
    "modulePaths": [
        "<rootDir>",
        "/Users/shezw/dev/web/react/easyvgl-editor"
    ],
    // "moduleDirectories": [
        // "node_modules"
    // ],
    moduleNameMapper: {
        'canvas':'jest-canvas-mock',
        "@mantine/core/styles.css": "<rootDir>/node_modules/@mantine/core/esm/index.css",
        // "@mantine/core/(.*).css": "<rootDir>/node_modules/@mantine/core/esm/$1.css",
    },
    transform: {
        "^.+\\.[t|j]sx?$": "babel-jest",
        "^.+\\App.css$": "jest-transform-css",
        ".+\\.(styl|less|sass|scss|png|jpg|ttf|woff|woff2|svg)$": "jest-transform-stub"
    },
}

jest test throw case

Use a clouse function wrap the test case and check if the result throw an Error.

test('Convert Color to RGBA', ()=>{

    const { toRGBA } = colorConvertor();

    expect( ()=>{ toRGBA("#333444",1000) } ).toThrow(RangeError);
    expect( ()=>{ toRGBA("#333444",-1) } ).toThrow(RangeError);
    expect( ()=>{ toRGBA("#331",50) } ).toThrow(Error);

    expect( toRGBA('#ff3366',100) ).toBe('ff3366ff');
})

jest wrong environment

    The error below may be caused by using the wrong test environment, see https://jestjs.io/docs/configuration#testenvironment-string.
    Consider using the "jsdom" test environment.

https://jestjs.io/docs/configuration#testenvironment-string

https://jestjs.io/docs/tutorial-react

npm install --save-dev jest babel-jest @babel/preset-env @babel/preset-react react-test-renderer

Jest test fails with "window is not defined"

add globals window to jest.config.js

module.exports = {
    globals: {
        "window": {}
    }
}

TypeError: Cannot read properties of undefined (reading 'html')

npm install --dev jest-environment-jsdom

jsdom environment

    The error below may be caused by using the wrong test environment, see https://jestjs.io/docs/configuration#testenvironment-string.
    Consider using the "jsdom" test environment.

    ReferenceError: document is not defined
/**
 * @jest-environment jsdom
 */
import '../jest.mock'
import React from 'react';
import {cleanup, render, screen} from '@testing-library/react';
import App from './App';


afterEach(cleanup);
test('Render App', () => {
    // ...
}

Class constructor Stage cannot be invoked without 'new'

use ts-jest instead of jest


TypeError: window.matchMedia is not a function

https://jestjs.io/docs/manual-mocks#mocking-methods-which-are-not-implemented-in-jsdom

src/jest.mock.js

Object.defineProperty(window, 'matchMedia', {
    writable: true,
    value: jest.fn().mockImplementation(query => ({
        matches: false,
        media: query,
        onchange: null,
        addListener: jest.fn(), // deprecated
        removeListener: jest.fn(), // deprecated
        addEventListener: jest.fn(),
        removeEventListener: jest.fn(),
        dispatchEvent: jest.fn(),
    })),
});

xx.test.tsx

import '../jest.mock'

git log --all -- ${dirname}

# choose the COMMIT_TAG that removed the folder 

git checkout ${COMMIT_TAG}^ ${pathtodir}${dirname}

# 重置当前分支的 HEAD 指针到指定的提交
git reset ${COMMIT_TAG} -- ${pathtodir}${dirname}


git revert  -n ${COMMIT_TAG}
git commit -m "revert this commit"

Sometimes, we need to run a script to modify saveral files at once.

We can use xargs on shell tube.

ls | xargs echo 

As the command before, xargs run echo and use the result from ls.

this example shows how to use xargs modify all index.html that change *.js to *.js?ver=xxx

verStr="1.0.0"

# set version for  .css .js files
find -name "index.html" | xargs -i cp {} {}.bak 

find -name "index.html" | xargs sed -i 's@\.js.*\"@.js?ver='${verStr}'\"@g'

# reset files
# find -name "index.html" | xargs -i mv {}.bak {} 

在进行嵌入式开发的时候,文件传输是比较麻烦的 在调试过程中,最方便的方式是使用nfs进行文件目录共享 记录一下在设备和ubuntu之间共享的方法

在ubuntu上开启nfs共享

1. 安装和开启nfs-server服务

sudo apt install nfs-kernel-server

2. 配置共享文件目录

此时可以创建一个新目录 或者使用 开发目录来进行共享,这里以 /home/my/dev 为例

sudo vi /etc/exports

添加

/home/my/dev  192.168.*(rw,sync,no_root_squash)

如果出现Protocol not supported 可以在 /etc/default/nfs-kernel-server末尾添加

PRCNFSDORTS="--nfs-version 2,3,4 --debug --syslog"

3. 刷新服务

sudo systemctl restart nfs-server.service

4. 检查状态

sudo exportfs -v

前言

最近打算用树莓派做为智能显示驱动来搭配手头的一台咖啡机来实现一个真正的智能咖啡机,但是搭配ubuntu一类操作系统开机速度太慢了,找了很久也没有发现可以在数秒之内开机的树莓派映像,所以一直在寻找如何能够构建一个最小的操作系统。

buildroot

问题记录

  1. 直接使用buildroot官方版本的 defconfig文件 无法打开显卡驱动 系统大小约100M 可以通过fbdev的驱动显示画面,但是没有gpu的情况下,整个画面性能非常糟糕。 此时,尝试使用weston+drm+egl的方式,失败报错。 ls /dev/dri 无法找到节点 尝试使用insmod 加载 drm.ko 等模块,无效 经过比较 buildroot的defconfg和 raspberry git上提供的不一样,改用树莓派提供的buildroot

  2. 使用raspberry提供的buildroot版本依然不能打开 drm 此时显卡驱动是以模块形式编译需要通过模块加载启动

    modprobe i2c_brcmstb
    modprobe vc4
    modprobe v3d
    modprobe snd_soc_hdmi_codec
  3. 成功加载drm和 v3d v4c后 ,运行weston

    [00:24:19.786] warning: no input devices on entering Weston. Possible causes:
         - no permissions to read /dev/input/event*
         - seats misconfigured (Weston backend option 'seat', udev device property ID_SEAT)

驱动解决后,无法创建gl context

libGL: Can't open configuration file /etc/drirc: No such file or directory.
libGL: Can't open configuration file /root/.drirc: No such file or directory.