各种应用代理的配置

各种应用代理的配置

缘起

昨天因为要弄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,温度推到极致的状态。

C 语言练习记录

前言

本来想写一篇日志,后来发现没有什么可以写的,就简单记录一下C语言的几个小练习,准备一个系列教程。

代码

demo1

#include <stdio.h>

int main()
{
        char greetings[6] = { 'H', 'e', 'l', 'l', 'o','\0'};

        printf("Greeting Message: %s\n", greetings);
        return 0;
}

demo2

#include <stdio.h>
#include <string.h>

int main()
{
        char str1[12] = "Hello";
        char str2[12] = "world";
        char str3[12];
        int len;
        strcpy(str3,str1);
        printf("strcpy(str3,str1): %s\n", str3);

        strcat(str1, str2);
        printf("strcat(str1,str2): %s\n", str1);

        len = strlen(str1);
        printf("strlen(str1) : %d\n", len);
        return 0;
}

demo3.c

#include<stdio.h>
#include<string.h>

struct Books
{
        char title[50];
        char author[50];
        char subject[100];
        int book_id;
};

int main()
{
        struct Books Book1;
        struct Books Book2;

        /* Book1 details */
        strcpy( Book1.title, "C Programming");
        strcpy( Book1.author, "liweibin");
        strcpy( Book1.subject, "C Programming Tutorial");
        Book1.book_id = 6495407;

        /* Book2 details */
        strcpy( Book2.title, "python");
        strcpy( Book2.author, "liweibin");
        strcpy( Book2.subject, "python Programming Tutorial");
        Book1.book_id = 6495409;

        printf("Book 1 title: %s\n", Book1.title);
        printf("Book 1 author: %s\n", Book1.author);
        printf("Book 1 subject: %s\n", Book1.subject);
        printf("Book 1 book_id: %d\n", Book1.book_id);

        printf("Book 2 title: %s\n", Book2.title);
        printf("Book 2 author: %s\n", Book2.author);
        printf("Book 2 subject: %s\n", Book2.subject);
        printf("Book 2 book_id: %d\n", Book2.book_id);

        return 0;
}

demo4.c


#include <stdio.h>
#include <string.h>

struct Books
{
        char title[50];
        char author[50];
        char subject[100];
        int book_id;
};

/* Declaration of function */
void printBook( struct Books book );

int main()
{
        struct Books Book1;
        struct Books Book2;

        strcpy(Book1.title, "C Programming");
        strcpy(Book1.author, "jacky");
        strcpy(Book1.subject, "Tutorial");
        Book1.book_id = 655121;

        strcpy(Book2.title, "Python Programming");
        strcpy(Book2.author, "jacky");
        strcpy(Book2.subject, "Programming Tutorial");
        Book2.book_id = 655122;

        printBook( Book1 );
        printBook( Book2 );
        return 0 ;
}

void printBook( struct Books book)
{
        printf("Book title: %s\n", book.title);
        printf("Book author: %s\n", book.author);
        printf("Book subject: %s\n", book.subject);
        printf("Book book_id: %d\n", book.book_id);
}

demo5.c

#include <stdio.h>
#include <string.h>

struct Books
{
        char title[50];
        char author[50];
        char subject[50];
        int book_id;
};

void printBook( struct Books *book);
int main()
{
         struct Books Book1;
         struct Books Book2;

         strcpy(Book1.title, "C programming");
         strcpy(Book1.author, "jacky.li");
         strcpy(Book1.subject, "C Progarmming Tutorial");
         Book1.book_id = 654121;

         strcpy(Book2.title, "Python programming");
         strcpy(Book2.author, "jacky.li");
         strcpy(Book2.subject, "Python Progarmming Tutorial");
         Book2.book_id = 654122;

         printBook( &Book1);
         printBook( &Book2);

         return 0;
}
void printBook( struct Books *book)
{
        printf("Book title : %s\n", book->title);
        printf("Book author: %s\n", book->author);
        printf("Book subject: %s\n", book->subject);
        printf("Book book_id: %d\n", book->book_id);
}

demo6.c

#include <stdio.h>
#include <string.h>

union Data
{
        int i;
        float f;
        char str[20];
};

int main()
{
        union Data data;
        printf("Memory size occupied by data: %d\n", sizeof(data));
        return 0;
}

demo7.c

#include <stdio.h>
#include <string.h>

union Data
{
        int i;
        float f;
        char str[20];
};

int main()
{
        union Data data;
        data.i = 10;
        data.f = 220.5;
        strcpy( data.str, "C Programming");

        printf("data.i: %d\n", data.i);
        printf("data.f: %f\n", data.f);
        printf("data.str: %s\n", data.str);

        printf("Memory size occupied by data: %d\n", sizeof(data));
        return 0;
}

demo8.c


#include <stdio.h>
#include <string.h>

union Data
{
        int i;
        float f;
        char str[20];
};

int main()
{
        union Data data;
        data.i = 10;
        printf("data.i: %d\n", data.i);

        data.f = 220.5;
        printf("data.f: %f\n", data.f);

        strcpy( data.str, "C Programming");
        printf("data.str: %s\n", data.str);

        printf("Memory size occupied by data: %d\n", sizeof(data));
        return 0;
}

demo9.c

#include <stdio.h>
#include <string.h>

typedef struct Books
{
        char title[50];
        char author[50];
        char subject[100];
        int book_id;
} Book;

int main()
{
        Book book;
        strcpy( book.title, "C programming");
        strcpy( book.author, "Jacky.li");
        strcpy( book.subject, "progamming language");
        book.book_id = 9527;

        printf("书标题: %s\n", book.title);
        printf("书作者:%s\n", book.author);
        printf("书类目: %s\n", book.subject);
        printf("书ID: %d\n", book.book_id);

        return 0;
}

demo10.c

#include <stdio.h>

int main()
{
        int c;

        printf("Enter a value:");
        c = getchar();

        printf("\nYou entered: ");
        putchar(c);
        printf("\n");
        return 0;
}

demo11.c

#include <stdio.h>

int main()
{
        char str[100];
        char str2[100];

        printf("Enter a value:");
        gets(str);
        printf("Why?");
        gets(str2);

        printf("\nYou said: ");
        puts(str);
        puts(str2);
        return 0;
}

demo12.c


#include <stdio.h>

int main()
{
        char str[100];
        int i;

        printf("Enter a value: ");
        scanf("%s %d", str, &i);

        printf("\nYou entered: %s %d \n", str, i);
        return 0;
}

demo13.c

#include <stdio.h>

int main()
{
        FILE *fp = NULL;

        fp = fopen("/sys/class/thermal/thermal_zone0/temp", "r");
        fprintf(fp, "This is testing for fprintf...\n");
        fclose(fp);
}

demo14.c

#include <stdio.h>

int main()
{
        FILE *fp = NULL;
        char buff[255];

        fp = fopen("/sys/class/thermal/thermal_zone0/temp", "r");
        fscanf(fp, "%s", buff);
        printf("1: %s\n", buff);

        fgets(buff, 255, (FILE*)fp);
        printf("2: %s\n", buff);

        fgets(buff, 255, (FILE*)fp);
        printf("3: %s\n", buff);
        fclose(fp);
        return 0;
}

demo15.c

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

int main()
{
   FILE *fp2 = NULL;
   float temp, deg;
   int n;

   fp2 = fopen("/sys/class/thermal/thermal_zone0/temp", "r");
   n = fscanf(fp2, "%f", &deg);
   fclose(fp2);
   temp = deg / 1000;
   fputs(temp, fp);
   printf("Temp is: %f\n", temp);
   return 0;
}

demo16.c

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

int fibonaci(int i)
{
        if(i==0)
        {
                return 0;
        }
        if(i==1)
        {
                return 1;
        }
        return fibonaci(i-1) + fibonaci(i-2);
}

int main()
{
        FILE *fp2 = NULL;
        float temp, deg;
        int n;
        int i;
        fp2 = fopen("/sys/class/thermal/thermal_zone0/temp", "r");
        for (i=0; i<100;i++)
        {
                n = fscanf(fp2, "%f", &deg);
                temp = deg / 1000;
                printf("i: %d : %d : Temp: %f\t\n",i, fibonaci(i), temp);
        }
        fclose(fp2);
        return 0;
}

demo17.c

#include <stdio.h>
int main(int argc, char *argv[])
{
        if( argc == 2)
        {
                printf("The argument supplied is %s\n", argv[1]);
        }
        else if (argc > 2)
        {
                printf("Too many arguments supplied.\n");
        }
        else
        {
                printf("One argument expected.\n");
        }
}

demo18.c

#include <stdio.h>
void bubble_sort(int arr[],int len)
{
        int i, j, temp;
        for ( i = 0; i < len - 1; i++)
           for ( j=0; j < len - 1 - i; j++)
                   if ( arr[j] > arr[ j + 1 ])
                   {
                           temp = arr[j];
                           arr[j] = arr[j+1];
                           arr[j +1 ] = temp;
                   }
}

int main()
{
        int arr[] = { 22, 34, 3, 32, 82, 55,89, 50 ,34,37, 5, 65, 64, 35, 9 ,70};
        int len = (int) sizeof(arr) / sizeof(*arr);
        bubble_sort(arr, len);
        int i;
        for (i = 0; i < len; i++)
                printf("%d ", arr[i]);
                printf("\n");
        return 0;
}

demo19.c

#include <stdio.h>
void swap(int *a, int *b)
{
   int temp =  *a;
   *a = *b;
   *b = temp;
}

void selection_sort(int arr[], int len)
{
        int i,j;
        for ( i = 0; i < len - 1; i++ )
        {
                int min = i;
                for ( j = i + 1 ; j < len ; j++)
                        if ( arr[j] < arr[min])
                                min = j;
                swap(&arr[min], &arr[i]);
        }
}

int main()
{
        int arr[] = { 22, 34, 3, 32, 82, 55,89, 50 ,34,37, 5, 65, 64, 35, 9 ,70};
        int len = (int) sizeof(arr) / sizeof(*arr);
//      bubble_sort(arr, len);
        selection_sort(arr, len);
        int i;
        for (i = 0; i < len; i++)
                printf("%d ", arr[i]);
                printf("\n");
        return 0;
}

好了,就先来点儿基础的热热身。

树莓派串口驱动的情况

树莓派串口驱动详细

串口驱动现状

本来在树莓派上插入了一个sim800c的设备,但是这个产品带着一颗ch3401的芯片,在设备上用ls /dev/ttyUSB*竟然没有找到串口设备,内心想可能是没有驱动,于是到官方站点上下载了一下。

看更新时间是2018年3月,然后打开压缩包。

然后发现Readme里面已经告诉我们支持的内核只能是:

太老了。后来查资料发现好像这几款常见芯片已经被加入到Linux内核,早已经支持。抱着怀疑的态度查看了一下。

果然都支持了。
包括ch341, cp210x系列,pl2303, ftdi, 好吧,这下方便多了,以后在linux下做串口设备的调试就不要担心串口芯片不兼容了!
然后再通过lsusb和lsmod还有dmesg检查后发现,已经识别了。。

检查看看串口是否连上来出现一个/dev/ttyUSB0的设备:

这样才对么。我下面就可以用串口来获取一下sim800C的sim卡联网的状态信息了。

测试代码:

#!/usr/bin/env python3
import serial
import time
import operator
import os

time.sleep(2)
ser = serial.Serial('/dev/ttyUSB0', 115200)
print("串口初始化完成...")

if ser.isOpen == False:
    ser.open()
try:
    print('-'*60)
    print("初始化SIM800C")
    print("尝试测试SIM800C联网获取CCID信息...")
    time.sleep(2)
    i = 0
    while True:
        ser.write(str.encode("AT+CCID\r"))
        size = ser.inWaiting()
        if size != 0:
            response = ser.read(size)
            ccid = str(response,encoding="utf8")
            print(ccid)
        ser.write(str.encode("AT+CGMR\r"))
        size = ser.inWaiting()
        if size != 0:
            connection = ser.read(size)
            creg = str(connection, encoding="utf8")
            print(creg)
            time.sleep(1)
        ser.write(str.encode("AT+CSQ\r"))
        size = ser.inWaiting()
        if size != 0:
            csq = ser.read(size)
            csqstatus = str(csq, encoding="utf8")
            print(csqstatus)
            time.sleep(1)
        ser.write(str.encode("AT+CGACT=1\r"))
        size = ser.inWaiting()
        if size != 0:
            cgact = ser.read(size)
            cgactstatus = str(cgact, encoding="utf8")
            print(cgactstatus)
        else:
            ser.flushInput()
            time.sleep(1)
except KeyboardInterrupt:
    ser.close()

结果

今天就到这里,白了个白~

Debian 9 配置 DHCP 服务器

DHCP 很常见,自动分配 IP 地址子网掩码,默认网关等,还可以结合其他服务做远程无人值守安装服务器.

配置步骤

root@ns1:~# apt -y install isc-dhcp-server
root@ns1:~# vi /etc/default/isc-dhcp-server
# line 4: uncomment
DHCPDv4_CONF=/etc/dhcp/dhcpd.conf
# line 17,18: specify listening interfaces
# if not use IPv6, comment out it
INTERFACESv4="ens3"
INTERFACESv6="ens3"
root@ns1:~# vi /etc/dhcp/dhcpd.conf
# line 7: specify domain name
option domain-name "yoyojacky.com";
# line 8: specify nameserver's hostname or IP address
option domain-name-servers ns1.yoyojacky.com;
# line 21: uncomment
authoritative;
# add to the end
# specify network address and subnet-mask
subnet 10.0.0.0 netmask 255.255.255.0 {
     # specify default gateway
     option routers 10.0.0.1;
     # specify subnet-mask
     option subnet-mask 255.255.255.0;
     # specify the range of leased IP address
     range dynamic-bootp 10.0.0.200 10.0.0.254;
}
root@ns1:~# systemctl restart isc-dhcp-server 

基本上就搞定了,测试 linux 用 dhclient 获取一下,windows 用 ipconfig /release 和/renew.

How to add new desktop shortcut on Raspberry Pi

To add a new desktop shortcut in Raspbian, right click on the desktop and create new file with “desktop” extension, e.g. MyApp.desktop.

Once you’ve created the file, open it in text editor and add the following content

[Desktop Entry]
Name=App Name
Comment=Some comment
Icon=/usr/share/pixmaps/openbox.xpm
Exec=/usr/bin/myapp
Type=Application
Encoding=UTF-8
Terminal=false
Name – application name
Comment – you can put any comment you wish
Icon – path to icon file to be used for the shortcut
Exec – path to application executable

Save the file and you can use new shortcut to launch your application.

记一次怼SB的感慨!

今天我是出来怼某些蠢货的~ 我个人博客我怎么写我乐意~

每次我谈论树莓派都会遇到几个啥也不是的东西跳出来瞎逼逼, 我个人从总体使用过程中来看我更倾向于使用3B+, 我很在乎那一点点儿性能的提升,虽然我遇到很多工程师都会跳出来反驳说NanoPi性能超越树莓派,orangePi超越树莓派,说各种Pi的能力都很强大,但是我就是喜欢树莓派,大概是树莓派是我使用的第一个pi的版本吧,交点儿情怀税哈~

但是我很快就发现我喜欢树莓派的原因了,是互联网上铺天盖地的树莓派资料应接不暇,Maker创建自己的DIY项目,学生用树莓派做毕业设计, 工程师用树莓派做自动化管理设备,网络工程师用树莓派做流量监控设备,黑客用树莓派hack无线网络,航模爱好者用树莓派做数传+图传,艺术家用树莓派打造自己的Magic Mirror, 音乐爱好者用树莓派制作自己的打击垫儿和效果器, 油头宅男用树莓派打造自己的家庭媒体中心,仓鼠党用树莓派打造自己的家用NAS, 还有科技大牛用树莓派建立自己的科学运算集群和超牛逼的机器人, 我的小伙伴还用树莓派结合tensorflow制作自动学习避障小车DonkeyCar, 游戏爱好者不断用树莓派制作游戏机,不管是手持的还是街机,都有它小众的市场,树莓派基金会最想看到的还是我们用它来学习编程, 教育孩子接触和学习,但是我们已经玩儿得停不下来了,哎,还有太多的好玩儿的项目数也数不过来,这么多资源,就算是我按照他们的想法全部玩儿一遍,也够玩儿数月时间了,总结下来,就是海量的资料漫天飞舞。

也许,这就是吸引我的原因之一吧,但谁又知道是不是一种情结呢?

身边的很多小伙伴都有树莓派,遇到我给我说的第一句话就是:我到底能拿树莓派做什么?

每次我都无法回答, 因为可能因为他不懂linux,不懂硬件,更不了解GPIO能做什么。难道大家的创意都被扼杀了吗?

身边的大牛们一次次过来PK我:“你这个东西为什么不用STM32做?”“ 你这个项目我用arduino就实现了!” “我觉得lattepanda做起来会更高性能!”“ 你这个树莓派弱爆了,我都用nanoPi 实现了!”“ 我觉得你这个项目用香蕉派会更好!” “我用ESP32也能实现和你一样的功能!” “你觉得树莓派到底比arduino好在哪里?” 

这时候他们的表情都是:

每次遇到这个问题,我都只好笑笑:"因为我不会其他的板子”,“因为我没有其他的开发板” “因为我不懂STM32”,“因为我懒”,最后直接统一回复:因为我愿意~” 从此整个世界安静了, 都不用手起刀落。

当时我的内心活动可能是这样的:

刚开始:yyi.jpg

我深知1万小时定律,东一榔头西一棒子我真的搞不定,来不及学精那么多东西,只能笨鸟慢点儿飞,移山慢点儿挖, 看不惯的都给我闭上你们的嘴,别让我出来给你一顿怼, 二营长,你他娘的意大利炮呢!?!

!!!!!!!

也就这样吧,心里默念:仁慈的主啊,快来收了这群SB吧~

据说阿里云昨晚上又大面积故障了

早上起来发现朋友圈哀鸣遍野,仔细一看原来是阿里云大面积宕机了,吓得我赶紧起来看了看我的博客,好像还没有影响到...暗自庆幸!

看来阿里运维开年就知道年终奖已消失殆尽,今年的干劲儿也会受到影响吧?话说苦逼的运维一直是给开发背锅的....

凉凉....

 

 

 

 

 

 

记一次坑爹的grub修复

公司的路由盘存放着共享的数据,年前老板最后离开公司的时候来了把硬关机,直接拔电源的那种硬, 过完年回来就发现路由盘死了,上面的seafile系统瘫痪了。

Tater不在,只好自己硬上,修呗,检查发现每次开机map device table都找不到,起初以为硬盘坏了,烧录了一个USB启动盘,用了个软件叫: https://rufus.ie/

自己下载,然后各种安装添加ppa仓库,安装boot-repair工具,完全不好用。后来同事找到一篇帖子,需要修复EFI。。。

步骤如下:

尝试 EFI shell环境启动

开机总是停留在这里:


一般情况下进入 efi shell 后会显示 Device mapping table, 有时候会出现磁盘的信息,就是fs0,当出现的时候说明识别出了硬盘,但是无法引导。

在shell下面键入:

reconnect -r 

重新连接控制器,出现成功后再执行map看看是否有磁盘列出来。

如果这样列出,就可以确认磁盘没有问题了,问题出现在grub上,由于设备是X86_64架构,而且又是用了EFI的启动模式,初步估计问题出在了grub-efi上。

Ubuntu U盘PE,大白菜修复盘~

利用烧录工具烧录Ubuntu16.04 镜像到U盘,软件已经上面提到,简单粗暴,还很小巧。

选择设备镜像文件然后选择U盘设备信息。

一路默认即可。

 

速度很快,也就几分钟就可以完成了,插到PPC上,按下F7, 这个很坑爹的操作尝试了好几次,才找到相应的启动选项:

   

通过USB启动后尝试检查设备是否有问题,能够挂载和读取设备内容说明没有问题。

检查了/boot分区的启动信息,看不出哪里出问题了,有点儿犹豫问题所在,决定还是重新构建grub信息。

这是检查了/etc/fstab文件系统挂载配置文件,没有啥问题,确认是grub的问题了。


再次重启,进入live CD,选择 Try Ubuntu without installing 进入Live OS。
进入系统后打开终端(快捷键Ctrl+Alt+T)这个是最常用的开终端的方式。

先来查看系统分区情况:

sudo fdisk -l  
sudo blkid  
df -Th  
这个系统2块硬盘 /dev/sda ,两个分区,/dev/sda1 为 EFI 分区,/dev/sda2 为系统分区, /dev/sdb1 是存储数据的分区。

为chroot做准备:

1. 挂载分区

sudo mount /dev/sda2 /mnt  
sudo mount /dev/sda1 /mnt/boot/efi

2. 挂载虚拟文件系统

系统上的/dev   /proc  /sys /run  /dev/pts 这些是常见的虚拟文件系统,可以通过循环直接挂载到目标位置。

for i in /dev /dev/pts /proc /sys /run; do sudo mount -B $i /mnt$i; done

3. chroot 切换系统根目录

sudo chroot /mnt

4. 最关键的部分-修复引导信息

apt-get update
apt-get -y install grub-efi
grub-install --target=x86_64-efi --efi-directory=/boot/efi
update-grub

--target 指定系统结构
--efi-directory 指定 EFI 分区挂载点

update-grub 更新grub信息

Grub重新安装后,重启:

成功登陆,心里就想骂,这个EFI好鸡肋。

帮助参考文献

https://help.ubuntu.com/community/Grub2/Installing#via_ChRoot

转载记得标明出处,你妹的,打字很累的。白了个白。

新西兰之行

先来一张我在huka falls 拍的大头照吧!哈哈!适逢当地圣诞节来临之际的大狂欢,蹭了一点儿热度.

这个就是新西兰靠近奥克兰的huka falls,湖卡瀑布.我也不知道是不是这个湖卡,原名给你们了自己查.

出了湖卡瀑布,我们就去了汉密尔顿国家公园,这里终于有机会飞无人机了,但是还是因为我们停留时间太短而放弃飞行...因为新到手的无人机还真tm不太会飞.

路边的随意拍摄的小房子,呸,是小别墅!据说便宜的地方50万纽币就可以买下来了!

一路的蓝天白云让我突然觉得这个资本主义国家的天空也不尽然是全阴霾密布的,乌云过去还是有蓝天的,至少水是纯净的,天空是蓝色的,空气是清新的,通透的感觉,深呼吸都觉得是放纵自己,猛吸一口觉得要醉氧。我突然觉得我爱上了这个世界上偏远的南半球小国,至少爱上了这里的草原,如果未来爱上一匹野马,在这里是真的不怕没有草原,听导游说如果买了房子可以拥有这里999年的居住权,就觉得自己费尽心思在上海买的这套40年商住简直是鸡肋中的鸡肋!

虽然已经旅途过半,而且这次还没看到毛利战舞,没有喝到当地鲜醇爽口的啤酒,但是已经被这里的人文环境深深影响了..

还有美美的老婆陪着我,还是很开心哒!

l路边吃点儿汉堡

也许应该去这家

大家还是去了一家看上去人气稍微旺点儿的地方.随后就是一路颠簸来到霍比屯..

老婆很幸福的拿起了我的单反

被她姐姐抢了先,手机拍出了大片的效果...

这也是..

.

她自己这张是老姨夫的华为荣耀拍摄的...是不是活捉一个精灵?

转眼就踏上飞往皇后镇的飞机了...

说实话,我手机拍摄的照片太少,单反里面的照片还有43Gb,等我整理出来再展示出来吧!

今天又到周末了

讲真的,我有点儿感觉吃力了,太多的开发板要尝试,太多的文档要写,太多的想法要去实现,我还要赚钱,养家, 要为了孩子做准备。。妈蛋,鸭梨山大思密达!
时间如流水,钱财如粪土!
我要继续赚更多的粪土才能养育我播种的这片土地。。。
我的瓦利机器人要继续做起来了,我的烂尾项目都要好好的开始收尾了,不能再拖了~

这是第三次推倒重来了!!!希望以后不要再出现这种情况~

之前的博客因为阿里云 Centos 镜像的问题,彻底报废了,我在尝试挽救无数次未果的情况下,无奈全盘格式化, 重新来过了,之前的博客因为也咩有什么人看, 只是作为自己的一个个人记事本的平台在积累自己的知识, 后来发现,以前的博客平台各种系统层面的 Bug, 就是请出雍正爷也解决不了的"八阿哥", 于是一怒冲冠为红颜~其实是看着 debian9的系统感觉杠杠滴,所以决定换掉centos, 拥抱 debian~

 

继续阅读这是第三次推倒重来了!!!希望以后不要再出现这种情况~