wiringPi updated to 2.52 for the Raspberry Pi 4B

前言

不知道你卖树莓派4B了么?不知道你们是否尝试在树莓派4b上用wiringpi的库,反正是官方的不好用。
那么你该怎么办?

场景展示

  • 如果你用sudo apt -y install wiringpi, 然后执行gpio readall的时候,提示你OPPS, the libararies is fucked.
    那么你就赶紧卸载掉吧!

    sudo apt -y purge wiringpi
    hash -r 

    下载软件包并且安装

    cd /tmp
    wget https://project-downloads.drogon.net/wiringpi-latest.deb
    sudo dpkg -i wiringpi-latest.deb

    检查:

    gpio readall 
    gpio -v 

    正常显示

各种应用代理的配置

各种应用代理的配置

缘起

昨天因为要弄jetson nano的环境,好多资源要扶墙,所以正好也整理了一下,在不同的应用上添加代理的方法:

APT

全局代理

在Ubuntu系统中,使用代理有一种通用方式:系统设置 –> 网络 –> 网络代理 –> 应用到整个系统,这里设置的代理是全局代理,整个系统都会走这个代理设置。但一般我们不会这样使用,我们需要对我们指定的工具或软件设置代理。

APT代理

apt-get工具可以使用-o参数来使用配置字符串,或使用-c参数使用指定配置文件。

APT工具集使用的默认配置文件是/etc/apt/apt.conf,打开后发现文件默认是空文件。但是当我们设置了全局代理后,文件的内容变为:

Acquire::http::proxy "http://192.168.3.3:1080/";
Acquire::https::proxy "https://192.168.3.3:1080/";

这里稍微解释一下,这里的代理服务器是我跑了shadowsocks的一台主机,1080是这台主机开放的端口。记得在shadowsocks上开允许局域网接入。
如果只是偶尔用一次:

sudo apt-get -o Acquire::http::proxy="http://192.168.3.3:1080/" update

当然,如果你用man查看过还会发现-c选项

使用-c选项

创建个人配置文件~/apt_proxy.conf,

Acquire::http::proxy "http://192.168.3.3:1080/";
Acquire::https::proxy "https://192.168.3.3:1080/";

使用命令:

sudo apt-get -c ~/apt_proxy.conf update
  1. 如果我们设置了环境变量APT_CONFIG, 那么apt工具也将使用APT_CONFIG指向的配置文件。
    export APT_CONFIG=~/apt_proxy.conf
    sudo apt-get update

    这是软件包安装使用代理,那么还有使用wget下载有时候也要用。

    wget使用代理

    为wget使用代理,直接修改/etc/wgetrc,也可以在主目录下创建.wgetrc,并编辑相应内容。
    将/etc/wgetrc中与proxy有关的几行复制到~/.wgetrc,然后填写代理的地址和端口

    https_proxy = http://192.168.3.3:1080/
    http_proxy = http://192.168.3.3:1080/
    use_proxy = on

    这里 use_proxy = on 开启了代理,如果不想使用代理,每次都修改此文件未免麻烦,我们可以在命令中使用-Y参数来临时设置:

-Y, --proxy=on/off           打开或关闭代理

使用-e参数

wget本身没有专门设置代理的命令行参数,但是有一个"-e"参数,可以在命令行上指定一个原本出现在".wgetrc"中的设置。于是可以变相在命令行上指定代理:

-e, --execute=COMMAND   执行`.wgetrc'格式的命令

例如:

wget -c -r -np -k -L -p -e "http_proxy=http://192.168.3.3:1080" http://www.kernel.org/latest_version

临时使用代理下载比较方便。

git 使用代理

设置代理

git config --global https.proxy http://192.168.3.3:1080
git config --global https.proxy https://192.168.3.3:1080

取消设置

git config --global --unset http.proxy
git config --global --unset https.proxy

socks5

git config --global http.proxy 'socks5://192.168.3.3:1080'
git config --global https.proxy 'socks5://192.168.3.3:1080'

单一定向

只对github.com

git config --global http.https://github.com.proxy socks5://192.168.3.3:1080

取消代理

git config --global --unset http.https://github.com.proxy

目前用到这些,先记录下来,以后有别的再继续补充。
另外,还有个taskset比较好用,可以将任务绑定到CPU执行。
例如: omxplayer -o local xxx.mp4 播放一个影片,产生了一个进程,用ps aux |grep omxplayer发现其pid为40945
那么可以让单个cpu专门处理视频的解码和播放或者让1核,2核,3核工作,留一个核干别的。

taskset -cp 1,2,3 40945

意思就是让这个播放的进程可以使用1,2,3核, 通过htop就可以看到工作效果了。

Jetson Nano 配置小记

Jetson Nano 配置小记

要测试jetson nano的温度曲线,要推高温度,想试试它跑神经网络的时候的温度。
参考:https://github.com/dusty-nv/jetson-inference/blob/master/docs/building-repo-2.md?tdsourcetag=s_pctim_aiomsg

配置步骤

  1. 下载镜像:
    https://developer.download.nvidia.cn/assets/embedded/downloads/jetson-nano-sd-card-image/r32.1.1-2019-05-31/jetson-nano-sd-r32.1.1-2019-05-31.zip
  2. 解压并烧录到TF卡,然后启动
  3. 启动后联网更新系统:
    sudo apt-get update
    sudo apt-get -y upgrade 
    sudo apt-get -y install git cmake
  4. 克隆jetson-inference仓库
    clone https://github.com/dusty-nv/jetson-inference
    cd jetson-inference
    git submodule update --init

    Python开发包

    此项目的Python功能是通过Python扩展模块实现的,这些模块使用Python C API提供对本机C ++代码的绑定。在配置项目时,repo会搜索在系统上安装了开发包的Python版本,然后为每个Python版本(例如Python 2.7,3.6和3.7)构建绑定。它还将为已安装的numpy版本构建numpy绑定。

默认情况下,Ubuntu自带与libpython-dev和python-numpy包预装了(这是Python 2.7版)。虽然Python 3.6解释器是由Ubuntu预先安装的,但是Python 3.6开发包(libpython3-dev)并python3-numpy没有。使用Python C API构建绑定需要这些开发包。

因此,如果希望项目为Python 3.6创建绑定,需要继续安装如下内容;

sudo apt-get install libpython3-dev python3-numpy

使用CMake进行配置

接下来,在项目中创建一个构建目录并运行cmake以配置构建。当cmake运行时,脚本启动(CMakePreBuild.sh),它会自动安装任何需要的依赖和下载DNN模型。模型需要自己选择一下,默认也可以,这里要配置git代理,wget代理,apt代理,反正你如果不能扶墙而出,那么基本上玩儿不了了。很多东西都在墙外,扶墙小技巧自己百度吧。

cd jetson-inference   
mkdir build
cd build
cmake ../

下载模型

repo带有许多预先训练好的网络,您可以选择通过Model Downloader工具(download-models.sh)下载和安装。
默认情况下,并非最初选择下载所有模型以节省磁盘空间。
您可以选择所需的模型,或稍后再次运行该工具以再次下载更多模型。

最初配置repo时,cmake会自动为您运行下载工具:
如果无法扶墙获取资源,就会看到如下图片:

而正常扶墙出去后,获取资料为:

然后选择好以后,就开始各种安装,这时候可以去喝杯咖啡,小憩一会儿。
注意:对于无法连接Box.com下载模型的用户,此处提供镜像:

https://github.com/dusty-nv/jetson-inference/releases

要稍后再次运行Model Downloader工具,您可以使用以下命令:

cd jetson-inference / tools 
./download-models.sh

安装PyTorch

如果您正在使用JetPack 4.2或更新版本,现在将运行另一个工具,如果您想在本教程后面的传输学习中重新训练网络,可以选择在Jetson上安装PyTorch 。此步骤是可选的,如果需要,请选择要安装的Python 2.7和/或Python 3.6的PyTorch软件包版本,然后单击Enter以继续。否则,保持选项未选中,它将跳过PyTorch的安装。

我选择了python3.6,继续安装
注意:自动PyTorch安装工具需要JetPack 4.2或更高版本。
对于其他版本,请参阅http://eLinux.org/Jetson_Zoo从源代码构建。
如果您决定在其他时间安装PyTorch,也可以稍后再次运行此工具:

cd jetson-inference / build 
./install-pytorch.sh

运行这些命令将提示您使用与上面相同的对话框。

最后一步:编译项目

确保您仍在jetson-inference/build上面步骤#3中创建的目录中。
然后运行,make然后sudo make install构建库,Python扩展绑定和代码示例:

cd jetson-inference/build
make
sudo make install

根据体系结构,项目将构建为aarch64或者armhf,具有以下目录结构:

|-build
\aarch64 (64-bit)
\bin where the sample binaries are built to
\include where the headers reside
\lib where the libraries are build to
\armhf (32-bit)
\bin where the sample binaries are built to
\include where the headers reside
\lib where the libraries are build to

基本上到这里就安装的差不多了, 下一篇文章讲一下怎么燃烧jetson nano,温度推到极致的状态。

树莓派安装google拼音和录屏软件

今天在树莓派使用过程中要用到中文,以前都是全英文操作,现在突然要用中文,措手不及,赶紧装个软件。

  • 命令方式非常简单,打开一个终端然后输入:
    sudo apt-get install fcitx fcitx-googlepinyin fcitx-module-cloudpinyin fcitx-sunpinyin
    sudo reboot
    接着就可以看到桌面菜单上的键盘图标了,右击选择google输入法就好了。
    因为要做个视频,所以希望录下来桌面的操作情况,本来想用VNC,然后再电脑上录制,但是觉得直接在树莓派上录像也不是没有软件,遂尝试之。
    GOOGLE后发现各种软件太多了。
    这里逐一列出5个,共勉。

    Kazam

    Kazam可从Ubuntu存储库获得,支持ARM和PowerPC设备以及32位和64位,是一种高效的桌面视频捕获工具。
    Kazam能够录制全屏,所有桌面屏幕,单个窗口和桌面区域,还可以从扬声器和麦克风中捕获音频。

  • 安装方法:
    sudo apt-get install kazam

    然后kazam -f 试试,需要桌面环境才可以用。然而并不好用。
    继续尝试换了一个:

    Vokoscreen

    名字真TM怪,倭寇屏。。vokoscreen,发音难道是: "哇靠死可rain?" ????
    说明一下,这个是我用过的最好用的录屏软件没有之一。。。
    凭借简单的用户界面和丰富的功能,Vokoscreen是Linux的另一种屏幕录制选项。
    能够录制和流式传输您的桌面,您将需要一个高端游戏装备,以获得高清流媒体的好处。
    通过GitHub可以通过添加PPA通过命令行安装Vokoscreen。

  • 安装方法:
    sudo add-apt-repository ppa:vokoscreen-dev/vokoscreen
    sudo apt-get update
    sudo apt-get install vokoscreen

    Vokoscreen一旦安装完成就可以立即使用了。可以从整个桌面,窗口,区域或指针周围的指定放大率进行录制。
    这对于特写视频录制非常有用。可以选择视频和音频编解码器,同时还可以更改音频驱动程序,视频格式和帧速率。
    还可以在屏幕录制中包含网络摄像头中的素材,易于使用的按钮让您可以录制,停止,暂停和播放屏幕截图。
    唯一的缺陷是:需要密切关注文件大小!Vokoscreen总体上来说是一款非常方便的屏幕录制工具,易于设置和使用,老李在这里强烈
    最后一个是我不想尝试的,你们如果尝试了请告诉我好用不。

    SimpleScreenRecorder

    它可能称自己为“简单”,但这个应用程序实际上比这里列出的其他一些功能更多。
    启动后,您将看到一个屏幕,有很多选项。这些包括预期的全屏录制,录制选择,跟随光标,以及录制视频游戏录制GL的选项。
    为了节省时间,你还可以创建适合不同屏幕录制任务的配置文件。还可以录制音频,并通过“ 继续”按钮找到的后续屏幕更改视频类型。
    准备就绪后,点击开始录制 - 默认情况下,生成的视频将保存在你当前用户的主目录中。
    同样,如果您使用的是基于Ubuntu的发行版,则需要先安装PPA存储库,然后才能安装Simple Screen Recorder。

    sudo add-apt-repository ppa:maarten-baert/simplescreenrecorder
    sudo apt-get update
    sudo apt-get install simplescreenrecorder

    如果您正在运行64位系统并想要记录32位OpenGL应用程序,请安装:

    sudo apt-get install simplescreenrecorder-lib:i386

  • 差点儿忘记一个,老牌子的屏幕录制工具

    RecordMyDesktop

    适用于Linux的原始屏幕捕获工具RecordMyDesktop几乎可以在任何系统上运行,包括Raspberry Pi。
    虽然您可以通过命令行使用基本版本,但使用以下命令安装:

    sudo apt-get install recordmydesktop

    还可以使用该工具选择两个GUI前端,gtk-recordmydesktop和qt-recordmydesktop。

    安装完成后,这个简单的工具在高级菜单中提供了一些附加选项,以及选择整个窗口或仅选择部分的功能
    请记住在捕获后给它时间对视频进行编码。
    视频将输出到当前用户的主目录。

    结束语

    好了,到这里应该你已经有了自己的选择,那么就这样吧,我是骑驴玩儿漂移,青山常在,绿水长流,白了个白~

C 标准库 –

简介

math.h 头文件定义了各种数学函数和一个宏。在这个库中所有可用的功能都带有一个 double 类型的参数,且都返回 double 类型的结果。

库宏

下面是这个库中定义的唯一的一个宏:
| 序号 || 宏 & 描述
| 1 || HUGE_VAL

当函数的结果不可以表示为浮点数时。如果是因为结果的幅度太大以致于无法表示,则函数会设置 errno 为 ERANGE 来表示范围错误,并返回一个由宏 HUGE_VAL 或者它的否定(- HUGE_VAL)命名的一个特定的很大的值。

如果结果的幅度太小,则会返回零值。在这种情况下,error 可能会被设置为 ERANGE,也有可能不会被设置为 ERANGE。

库函数

下面列出了头文件 math.h 中定义的函数:

double acos(double x)
返回以弧度表示的 x 的反余弦。
double asin(double x)
返回以弧度表示的 x 的反正弦。
double atan(double x)
返回以弧度表示的 x 的反正切。
double atan2(double y, double x)
返回以弧度表示的 y/x 的反正切。y 和 x 的值的符号决定了正确的象限。
double cos(double x)
返回弧度角 x 的余弦。
double cosh(double x)
返回 x 的双曲余弦。
double sin(double x)
返回弧度角 x 的正弦。
double sinh(double x)
返回 x 的双曲正弦。
double tanh(double x)
返回 x 的双曲正切。
double exp(double x)
返回 e 的 x 次幂的值。
double frexp(double x, int *exponent)
把浮点数 x 分解成尾数和指数。返回值是尾数,并将指数存入 exponent 中。所得的值是 x = mantissa * 2 ^ exponent。
double ldexp(double x, int exponent)
返回 x 乘以 2 的 exponent 次幂。
double log(double x)
返回 x 的自然对数(基数为 e 的对数)。
double log10(double x)
返回 x 的常用对数(基数为 10 的对数)。
double modf(double x, double *integer)
返回值为小数部分(小数点后的部分),并设置 integer 为整数部分。
double pow(double x, double y)
返回 x 的 y 次幂。
double sqrt(double x)
返回 x 的平方根。
double ceil(double x)
返回大于或等于 x 的最小的整数值。
double fabs(double x)
返回 x 的绝对值。
double floor(double x)
返回小于或等于 x 的最大的整数值。
double fmod(double x, double y)
返回 x 除以 y 的余数。

5个猴子分桃子-C语言练习

题目:海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子平均分为五份,多了一个,这只 猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了 一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的, 问海滩上原来最少有多少个桃子?


#include<stdio.h>
#include<stdlib.h>
int main()
{
    int x
    ,i=0,j=1;
    while(i<5){
        x=4*j;
        for(i=0;i<5;i++)
        {
            if(x%4!=0){break;}
            x=(x/4)*5+1;
        }
        j++;
    }
    printf("%d\n",x);

    return 0;
}
```
编译后执行:

电话加密-C语言

题目:某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下: 每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。

程序源代码:

#include <stdio.h>

int main()
{
    int a,i,aa[4],t;
    printf("请输入四位数字:");
    scanf("%d",&a);
    aa[0]=a%10;
    aa[1]=a%100/10;
    aa[2]=a%1000/100;
    aa[3]=a/1000;
    for(i=0;i<=3;i++)
    {
        aa[i]+=5;
        aa[i]%=10;
    }
    for(i=0;i<=3/2;i++)
    {
        t=aa[i];
        aa[i]=aa[3-i];
        aa[3-i]=t;
    }
    printf("加密后的数字:");
    for(i=3;i>=0;i--)
        printf("%d",aa[i]);
    printf("\n");
}

猜谜游戏-C语言

猜谜游戏

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void caizi(void)
{
    int n;
    char begin;
    int count = 1;
    srand((int)time(NULL));
    int m = (rand() % 100) + 1;
    puts("游戏开始,请输入数字:");
    while (1)
    {
        scanf("%d", &n);
        if (n == m)
        {
            printf("猜中了,使用了 %d 次!\n", count);
            if (count == 1)
            {
                printf("你是神级人物了!膜拜\n");
                getchar();
                printf("你已经达到最高级别,还需要玩吗?Y/N \n");
                scanf("%c", &begin);
                if (begin == 'Y' || begin == 'y')      //重复玩的一个嵌套循环
                {
                    caizi();
                }
                else
                {
                    printf("谢谢,再见!\n");
                }
            }
            else if (count <= 5)
            {
                printf("你是王级人物了!非常赞\n");
                getchar();
                printf("需要挑战最高级别不?Y/N \n");
                scanf("%c", &begin);
                if (begin == 'Y' || begin == 'y')
                {
                    caizi();
                }
                else
                {
                    printf("谢谢,再见!\n");
                }
            }
            else if (count <= 10)
            {
                printf("你是大师级人物了!狂赞\n");
                getchar();
                printf("需要挑战最高级别不?Y/N \n");
                scanf("%c", &begin);
                if (begin == 'Y' || begin == 'y')
                {
                    caizi();
                }
                else
                {
                    printf("谢谢,再见!\n");
                }
            }
            else if (count <= 15)
            {
                printf("你是钻石级人物了!怒赞\n");
                getchar();
                printf("需要挑战最高级别不?Y/N \n");
                scanf("%c", &begin);
                if (begin == 'Y' || begin == 'y')
                {
                    caizi();
                }
                else
                {
                    printf("谢谢,再见!\n");
                }
            }
            else
            {
                getchar();
                printf("你的技术还有待提高哦!重玩? Y/N\n");
                scanf("%c",&begin);
                if (begin == 'Y' || begin == 'y')
                {
                    caizi();
                }
                else
                {
                    printf("谢谢,再见!\n");
                }
            }
            break;
        }
        else if (n < m)
        {
            puts("太小了!");
            puts("重新输入:");
        }
        else
        {
            puts("太大了!");
            puts("重新输入:");
        }
        count++;//计数器

    }
}

int main(void)
{

    caizi();
    system("pause");
    return 0;
}

C语言-输入存储例子

题目:从键盘输入一些字符,逐个把它们送到磁盘上去,直到输入一个#为止。

#include<stdio.h>
#include<stdlib.h>
int main()
{
    FILE*fp=NULL;
    char filename[25];
    char ch;
    printf("输入你要保存到的文件的名称:\n");
    gets(filename);
    if((fp=fopen(filename,"w"))==NULL)
    {
        printf("error: cannot open file!\n");
        exit(0);
    }
    printf("现在你可以输入你要保存的一些字符,以#结束:\n");
    getchar();
    while((ch=getchar())!='#'){
        fputc(ch,fp);
    }
    fclose(fp);
    system("pause");
    return 0;
}
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main()
{
    FILE *fp;
    char in;
    fp = fopen("test.txt","w");
    printf("请输入一个字符串(以!结束):\n");
    while((in=getchar()) != '!')
    {
        if(in <='z' && in >= 'a')
        {
            in -= 32;
        }
        fputc(in,fp);
    }
    fclose(fp);
    return 0;
}

C 语言经典100例-7

题目:输出特殊图案,请在c环境中运行,看一看,Very Beautiful!

程序分析:字符共有256个。不同字符,图形不一样。

#include<stdio.h>
int main()
{
    char a=176,b=219;
    printf("%c%c%c%c%c\n",b,a,a,a,b);
    printf("%c%c%c%c%c\n",a,b,a,b,a);
    printf("%c%c%c%c%c\n",a,a,b,a,a);
    printf("%c%c%c%c%c\n",a,b,a,b,a);
    printf("%c%c%c%c%c\n",b,a,a,a,b);
    return 0;
}

还可以这样:

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

int main(void)
{
    int i,j;
    SetConsoleOutputCP(437);
    char a=176,b=219;
    for(i=0;i<5;i++)
    {
        for(j=0;j<5;j++)
        {
            if(i==j||(i+j+1)==5)
                printf("%c",b);
            else
                printf("%c%c",a,a);
        }
        printf("\n");
    }
}