猫言猫语

严以律己·宽以待人·自强不息·知行合一

Ubuntu 18.04 安装 Docker 环境

| Ubuntu 18.04 安装 Docker 环境已关闭评论

snap install docker

配置文件位置是在

/var/snap/docker/current/config/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"log-level": "error",
"storage-driver": "aufs"
}

Ubuntu 安装 Valet

| Ubuntu 安装 Valet已关闭评论

sudo systemctl disable apache2
sudo apt-get install network-manager libnss3-tools jq xsel
composer global require cpriego/valet-linux
mkdir ~/Sites
~/.config/composer/vendor/bin/valet install
~/.config/composer/vendor/bin/valet park ~/Sites

macOS Mojave 手动安装 php-pecl-amqp

| macOS Mojave 手动安装 php-pecl-amqp已关闭评论

git clone https://github.com/pdezwart/php-amqp.git
cd php-amqp
phpize
./configure --with-librabbitmq-dir=/usr/local/Cellar/rabbitmq-c/0.9.0
make
make install
vi /usr/local/etc/php/7.3/conf.d/ext-amqp.ini
extension="amqp.so"

CentOS 7 下 NGINX Unit 快速体验

| CentOS 7 下 NGINX Unit 快速体验已关闭评论

vi /etc/yum.repos.d/unit.repo
[unit]
name=unit repo
baseurl=https://packages.nginx.org/unit/centos/$releasever/$basearch/
gpgcheck=0
enabled=1
yum install unit
yum install unit-php
systemctl restart unit
vi demo.json
{
"listeners": {
"*:8080": {
"application": "demo"
}g
},
"applications": {
"demo": {
"type": "php",
"processes": 20,
"root": "/home/www/demo/public",
"index": "index.php"
}
}
}
mkdir -p /home/www/demo/public
vi /home/www/demo/public/index.ph
<?php
phpinfo()
curl -X PUT -d @demo.json --unix-socket /run/control.unit.sock http://localhost/config/ 

使用 PHP/Java Bridge 在 Java 容器里运行 PHP

| 使用 PHP/Java Bridge 在 Java 容器里运行 PHP已关闭评论

一、下载

从 PHP/Java Bridge 的 sourceforge 首页下载 JavaBridgeTemplate721.war 文件。

https://sourceforge.net/projects/php-java-bridge/

二、安装

以 CentOS 7 为例

yum install tomcat
yum install php-cgi
setenfore 0

三、部署

把 JavaBridgeTemplate721.war 扔到 /var/lib/tomcat/webapps 目录,重启 tomcat

systemctl restart tomcat

四、配置

编辑 index.php,修改为

<?php
phpinfo();

五、测试

打开浏览器访问:http://localhost:8080/JavaBridgeTemplate721/

软件应用

避免 Supervisord 产生孤儿进程

| 避免 Supervisord 产生孤儿进程已关闭评论

使用 Supervisord start 的进程如果开启多进程,产生了一些子进程,当 stop 父进程的时候,父进程有可能比子进程更早地退出,就会导致子进程成为孤儿进程,脱离 Supervisord 管理。

[program:x] 段配置 stopasgroup 选项和 killasgroup 选项可以避免这一情况。

stopasgroup=true
killasgroup=true

在 MySQL 8.0 中创建 utf8mb4 编码的新数据库

| 在 MySQL 8.0 中创建 utf8mb4 编码的新数据库已关闭评论

这样就可以创建一个名为 helloworld 的数据库

create database helloworld default character set utf8mb4 collate utf8mb4_unicode_ci;
mysql> create database helloworld default character set utf8mb4 collate utf8mb4_unicode_ci;
Query OK, 1 row affected (0.04 sec)

从头编写 Linux RGB Led 驱动(一)

| 从头编写 Linux RGB Led 驱动(一)已关闭评论

我手里有一个山寨的三色二极管,大概长的是这样的模样,我要把它直接插到 RK3288 Linux 开发板上,然后通过内核模块来控制他,我希望它可以像交通灯那样工作,同时希望通过编写一个驱动程序来入门 Linux 内核模块,这将会是一系列的文章,但最终结果我也不知道能不能写完。

我使用的 kernel 版本是 4.4,使用的是 rockchip 在 github 上的官方下载地址:https://github.com/rockchip-linux/kernel,如果你使用的是其他开发板,也可以从自己的供应商软件仓库去下载内核,假设我们通过 git 把官方 kernel clone 到了 ~/kernel 目录下。

然后我们需要在 drivers 下新增一个名为 rgb_led 目录,并且新建必要的 Makefile 文件和 rgb_led.c 文件,文件内容如下:

obj-y                           += rgb_led.o
#include <linux/init.h>
#include <linux/module.h>
 
static int __init rgb_led_init(void) {
    printk(KERN_ALERT "init rgb led\n");
    return 0;
}
 
static void __exit rgb_led_exit(void) {
    printk(KERN_ALERT "exit rgb led\n");
}
 
MODULE_LICENSE("GPL");
 
module_init(rgb_led_init);
module_exit(rgb_led_exit);

我们还需要编辑 ~/kernel/drivers/Makefile 文件,在开始的地方添加一行

obj-y                           += rgb_led/

然后就可以编译并使用这个我们修改过的内核来启动,启动后我们就可以看到提示信息:

# dmesg | grep rgb
init rgb led

轻轻松松,这个内核模块已经开始工作了

FriendlyARM NanoPi A64 插公对公 USB

| FriendlyARM NanoPi A64 插公对公 USB已关闭评论

想用 sunxi-fel 刷机,还得用这种 usb 线,MicroUSB 线只能供电用

插之前

# lsusb
Bus 001 Device 002: ID 8087:8001 Intel Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 002 Device 003: ID 8087:0aa7 Intel Corp. 
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

插之后

# lsusb
Bus 001 Device 002: ID 8087:8001 Intel Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 002 Device 003: ID 8087:0aa7 Intel Corp. 
Bus 002 Device 005: ID 1f3a:efe8 Onda (unverified) V972 tablet in flashing mode
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

多了一行

Bus 002 Device 005: ID 1f3a:efe8 Onda (unverified) V972 tablet in flashing mode

PHP WebSocket Server Demo

| PHP WebSocket Server Demo已关闭评论

<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, "0.0.0.0", 9501);
socket_listen($socket, 5);
for(;;) {
    $client = socket_accept($socket);
    if (!pcntl_fork()) {
        $buffer = socket_read($client, 2048);
        $headers = explode("\r\n", $buffer);
        foreach($headers as $header) {
            if (strstr($header, "Sec-WebSocket-Key:")) {
                $key = trim(str_replace("Sec-WebSocket-Key:", "", $header));
                $accept = base64_encode(sha1($key . "258EAFA5-E914-47DA-95CA-C5AB0DC85B11", true));
            }
        }
 
        socket_write($client, "HTTP/1.1 101 Switching Protocols\r\n");
        socket_write($client, "Upgrade: websocket\r\n");
        socket_write($client, "Connection: Upgrade\r\n");
        socket_write($client, "Sec-WebSocket-Accept: $accept\r\n");
        socket_write($client, "\r\n");
 
        for ($i = 0;; $i++) {
            $buffer = socket_read($client, 2048);
            echo $buffer;
        }
        socket_close($client);
        exit(0);
    } else {
        socket_close($client);
    }
}
socket_close($socket);