Write the Code. Change the World.

12月 04

记录一些问题

  1. 通过 docker-comppse.yml 配置多个服务(有 php,nginx,mysql 等),并运行。如果在 php 的 bash 中访问使用 nginx 或 mysql 这些服务呢。

当前,在项目中,无法通过 127.0.0.1 来连接 mysql 容器中的 mysql。可以通过修改 手动 修改 ip 的方式来搞定。

# 查看当前容器的 ip
ip addr

# php 和其他容器公用宿主机的 ip 修改项目中连接 mysql 的 ip 得到
172.19.0.1

docker php 安装 mysql_pdo 扩展

docker exec -it xxx bash

# 安装 pdo pdo_mysql 扩展
docker-php-ext-install pdo pdo_mysql

# 安装 mysqli 扩展
docker-php-ext-install mysqli

# 退出 重启 (xxx 容器 id)
exit
docker restart xxx

bash: ip: command not found

# 进入容器中
apt-get update

apt-get install -y iproute2

# 这个时候就有了
ip addr show

文章

https://www.jianshu.com/p/2217cfed29d7

https://blog.csdn.net/longfeng995/article/details/130704949

https://ricen.eu.org/index.php?control=doc&view=detail&id=326&i=1

阅读全文 >>

12月 01

常见命令一

# docker 信息
docker info
docker version

# 查看镜像
docker images

# 运行一个镜像
# --name 别名
# -p 端口映射( 宿主机端口:容器服务端口 )
# -d 以守护进程的方式运行(不加就会卡住占用窗口)
docker run --name my-nginx -d -p 80:80 nginx

# 查看活着的容器
docker ps

# 查看活所有容器
docker ps -a

# 停止容器
docker stop xxx

# 启动一个关闭的容器
docker start xxx

# 查看容器状态
docker stats

# 进入容器(以bash的形式进行交互模式)
docker exec -it xxx bash

# 退出容器(容器依然在运行)
exit

# 重启容器 (xxx 为容器 id 的前三个字符即可)
docker restart xxx

# 删除容器 (删除前需先停止)
docker rm xxx

# 删除镜像
docker rmi nginx

阅读全文 >>

11月 28

tauri 时间相关的处理。一般,找 tauri 的 api,就是找 rust 的。tauri 获取当前时间,获取时间戳。

https://docs.rs/chrono/0.4.26/chrono/#date-and-time

https://www.cnblogs.com/yjmyzz/p/event-with-tauri.html

获取当前年月日时分秒

use chrono::{DateTime, Local};

fn now_datetime() -> String {
  let datetime: DateTime<Local> = Local::now();
  let timestamp_str = datetime.format("%Y-%m-%d %H:%M:%S.%f").to_string();
  timestamp_str
}

需要在 Cargo.toml 中,加入以下配置。

[dependencies]
…
chrono = "0.4"

阅读全文 >>

11月 28

tauri dev 项目的时候,axios 是没有问题。当 build 后,安装使用,axios 就会出现问题。这个时候,需要给 axios 增加一个 adapter 就好。 当然 tauri 的 allowlist 的配置也是要好的。

https://github.com/persiliao/axios-tauri-api-adapter

操作

pnpm add axios-tauri-api-adapter

# 在封装 axios 的地方加入下边的配置
import axiosTauriApiAdapter from 'axios-tauri-api-adapter';

const defaultConfig: AxiosRequestConfig = {
  baseURL: VITE_APP_BASE_API,
  timeout: 20000,
  withCredentials: false,
  adapter: axiosTauriApiAdapter
}

然后修改 tauri.conf.json 文件。

  "tauri": {
    "allowlist": {
      "all": true,
      "http": {
        "all": true,
        "request": true,
        "scope": ["http://**", "https://**"]
      }
    }
  }

好了,再去打包就没问题了。

pnpm tauri build

阅读全文 >>

11月 27

将代码给到客户端的时候,有时候不想让源码被对方看到。就得使用加密的方式。这里尝试 Laravel Source Encrypter

https://github.com/SiavashBamshadnia/Laravel-Source-Encrypter

安装配置扩展

  1. 先去下载 phpbolt 扩展。对方提供了到 php8.2 的扩展,支持 win、linux、mac 的。

https://phpbolt.com/download-phpbolt/

打开上边的地址,输入您的 email 以及用户名,点击提交。他们会把文件下载链接发到邮箱里。下载出来就好。

  1. 安装 - 查看扩展的存放位置。 这里先尝试在 homestead 环境下安装。
# 查看 php 版本,了解当前的 php 版本信息 
php -v 

# 查看扩展的位置
php -i | grep extension_dir

# 这里是这样的
extension_dir => /usr/lib/php/20220829 => /usr/lib/php/20220829
sqlite3.extension_dir => no value => no value
  1. 安装 - 将 phpbolt.so 文件复制到该目录下。
# 在本地,将扩展文件放到映射的 code 目录下。方便移动。
cd /usr/lib/php/20220829
sudo mv ~/code/bolt.so ./
  1. 修改 php.ini 文件,重新启动。
php -i |grep php.ini
# 输出
# Loaded Configuration File => /etc/php/8.2/cli/php.ini

# vim 打开 php.ini 文件
sudo vim /etc/php/8.2/cli/php.ini
# 移动到末尾
GG
# i 进入编辑模式,加入下边的配置
extension=bolt.so

# 保存退出
:wq

# 重启 php-fpm
sudo /etc/init.d/php8.2-fpm restart

# 查看扩展
php -m | grep bolt

通过 php -m | grep bolt 的确是可以看见 bolt 扩展的存在。但是呢,如果通过 http 服务,访问获取 bolt,是没有看到 bolt 的信息的。这个时候,使用 bolt 的函数就会报错。如下。

Call to undefined function bolt_decrypt() in

其实, bolt 的扩展还没完。我们继续配置。

cd /etc/php/8.2/fpm/conf.d

sudo vim 20-bolt.ini

# 添加一下内容,保存退出
extension=bolt.so

# 重启
sudo /etc/init.d/php8.2-fpm restart

再看看 phpinfo 信息,这个时候就有了

安装和使用 Laravel-Source-Encrypter

扩展装好了,那么就要用在项目中。这里我新建一个新的 laravel 项目来搞。当前 laravel 版本是 laravel 10, php 版本是 8.2 。

composer create-project laravel/laravel bolt.com --prefer-dist

cd bolt.com

项目创建好了之后,就按照 https://github.com/SiavashBamshadnia/Laravel-Source-Encrypter 来就可以了。

最后,将打包好的文件(默认 encrypted 下的)替换掉之前的文件。

这样就可以了。

感觉还是蛮方便好用的。

加密后的代码,如下边这样的。

阅读全文 >>

11月 25

将 web 项目打包成桌面应用程序是一种常见的方式。用到的工具有 electron 和 tauri 等。这里使用 tauri。

准备工作

  1. 安装配置 tarui 环境。 https://tauri.app/zh-cn/v1/guides/getting-started/prerequisites
  2. 准备一个 web 项目。

tauri 是可以从零开始创建项目,然后去完善项目的。但是,有的时候,项目已经完成了,这个时候,就需要在项目中加入 tauri。然后再构建打包了。

阅读全文 >>

11月 25

工作和学习中,多显示器同时工作的情况是常态。那么在多个显示器之间来回切换应用是个很有效率的操作。 win 系统,默认就有这样的快捷键。mac,默认没有,得自己设置一下。 ### 操作

https://zhuanlan.zhihu.com/p/657556266

https://support.apple.com/zh-cn/HT201236

按照上边这个文章讲的来就可以搞定了。记得填入的文字一定不能错。 我的设定是这样子的。

# 移动到视网膜显示器(macbook pro 我放在左边) 
⇧ + ⌥ + ← 
# 移动到外接显示器(外接显示器,我放在右边) 
⇧ + ⌥ + →
# 全屏和退出全屏 
⌃ + ⌘ + f 

好,就这三个快捷键。

还是不够好啊。全屏状态下,快捷键失效是什么鬼。

最后

  • 在多个显示器间移动应用程序,win 的体验比 mac 好太多了。
  • 在单个显示器间切换桌面, mac 又比 win 好。

就这么明显的体验,官方咋就做不好呢。

阅读全文 >>

11月 24

用了 ts 的 vue3 项目,会经常遇到类型问题。组件问题也是类型问题的一种。这里简单总结一下写法。

组件类型声明

无论是第三方库,还是自定义组件,都可以通过这种方式来搞定。

这里分别以 element plus 中的组件和自定义组件为例。

# element plus 的 ElTable 组件
<template>
<el-table ref = "userTableRef">
    <el-table-column property="nickname" label="昵称" />
</el-table>
</template>

<script setup lang="ts">
import { ref } from 'vue'
import type { ElTable } from "element-plus";

const userTableRef = ref<InstanceType<typeof ElTable>>()
</script>

下边是自定义组件。

<template>
<MediaPlayer ref="mediaPlayer" />
</template>

<script setup lang="ts">
import { ref } from 'vue'
import MediaPlayer from '@/components/MediaPlayer/MediaPlayer.vue'

const mediaPlayer = ref<InstanceType<typeof MediaPlayer>>()
</script>

最后

定义好了类型后,代码提示就很友好了。

阅读全文 >>