0%

從零開始安裝Linux好簡單,只要讓它噴錯誤噴個兩天就可以上手惹(X

抓取並編譯Linux kernel

企鵝?可以吃嗎?

抓取Kernel

到kernel.org去下載就可以惹

編譯Kernel

1
2
$ make menuconfig //內核設定,裡面有很多選項可以折騰
$ make -j4 //使用多線程去編譯,數字設定你cpu所擁有的線程數

之後就可以在arch/x86_64/boot/bzImage看到bzImage,我們在這裡可以先開機看看

1
$ qemu-system-x86_64 --kernel arch/x86_64/boot/bzImage

抓取並編譯busybox

什麼是busybox?顧名思義就是個很忙碌的盒子(X

抓取busybox

1
$ git clone git://busybox.net/busybox

編譯busybox

1
2
$ make deconfig //生成預設設定檔案
$ make menuconfig //設定

選上Busybox Settings —>Build Options的第一個選項Build BusyBox as a static binary(no shared libs)因為我們的Linux還沒有任何library,所以必須靜態連結,然後直接make下去吧

創建rootfs

我們現在要做一個只會在RAM中運行的Linux,這個Linux在運行時不訪問硬碟
首先在工作目錄下創建rootfs的資料夾

1
$ cp -r busybox3/_install/* $PWD

現在rootfs裡有了bin sbin usr目錄 好像還缺了什麼

1
mkdir proc mnt var tmp dev sys etc

同時在rootfs裡面還要有一個init文件,這個init文件可以是一個可執行檔,連結,或是一個shell script

1
$ ln -s bin/sh

新增dev下幾個必要的設備console,null,tty,tty1,tty2,tty3,tty4

1
2
3
4
5
6
7
8
cd dev
mknod console c 5 1
mknod null c 1 3
mknod tty c 5 0
mknod tty1 c 4 1
mknod tty2 c 4 2
mknod tty3 c 4 3
mknod tty4 c 4 4

這些tty是和用戶交互的終端
接下來要讓它自動掛載一些必要設備 在etc新增init.d資料夾,並新增名為rcS的檔案(記得chmod +x rcS)在裡面輸入以下腳本

1
2
3
4
5
6
7
8
9
10
11
#!/bin/sh

if [ -e /proc ] && ! [ -e /proc/mounts ]; then
mount -t proc proc /proc
fi

if [ -e /sys ] && ! [ -e /sys/kernel ] && grep -q sysfs /proc/filesystems; then
mount sysfs /sys -t sysfs
fi

exit 0

好了,一個運行在RAM的”基本”Linux就做好了,現在把它壓縮成鏡像吧

1
2
3
4
cd rootfs
find . | cpio -H newc -o > ../rootfs.img
cd ../
gzip rootfs.img -f

開機看看

1
qemu-system-x86_64 -kernel ./linux-4.15/arch/x86_64/boot/bzImage -initrd rootfs.img.gz -append "root=/dev/ram init=/init"

我們先從低維度往上推:
一維就是,一個點連接一條線
二維就是,一個點連結二條線
三維就是,一個點連結三條線
以此類推,四維就是一個點連結四條線
立方體
這,是個立方體.今天我們會覺得說:這是立方體,有啥問題嗎?
因為我們將三維的視角套用在這張圖上
如果有個在二維空間生活的人看到,它會跟你說:立方體的線沒有”全部”垂直
我們眼睛看到的,是三維立方體投射在二維平面的樣子,但是我們生活在三維空間,不知不覺,就把三維空間的視角帶進去了
現在,當成我們是二維人,以三維的視角看超立方體
超立方體
紅線和綠線並非垂直的

結論

就是因為是投影出來才會看起來怪怪的

蒙地卡羅方法簡介

隨機點10個點, 這些點可能在原湖內,也有可能在圓弧外,例如有10個點,會有7個點在圓內,機率是0.7
pi-1
如果將每個點看作有一定大小的面積的話,則點在圓弧內的概率可以接近途中圓弧的面積
所以只要將概率x4就可以得出近似圖形的面積.所以將概率x4就可以得出圖形面積
但是如何判斷一個點在圓弧內還是外?根據畢氏定理,x^2+y^2小於1在圓內,大於1在圓外
所以我們只要一直弄出亂數放置隨機點去統計,透過佔總點比例和生成範圍就可以求出pi了

上code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <stdlib.h>
#include <math.h>
using namespace std;

int main()
{
int a = 0;
int n = 30000;
double x, y, pi;
for(int i = 0; i < n; i++)
{
x = (double)rand()/RAND_MAX; //隨機生成x座標
y = (double)rand()/RAND_MAX; //隨機生成y座標
if (pow(x,2)+pow(y,2) <= 1) //如果x^2+y^2<=1計數器增加一次,共運行n次
{
a++;//如果在扇形之內增加一次
}
pi = 4* (double)a / (double)i; //計算出pi
cout << pi << endl; //輸出
}
return 0;

延伸思考

那我們要不要來看看蒙地卡羅方法求出的pi和真實的pi誤差值的變化?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <stdlib.h>
#include <math.h>
using namespace std;

int main()
{
int a = 0;
int n = 10000;
double x, y, pi,err;
for(int i = 0; i < n; i++)
{
x = (double)rand()/RAND_MAX; //隨機生成x座標
y = (double)rand()/RAND_MAX; //隨機生成y座標
if (pow(x,2)+pow(y,2) <= 1) //如果x^2+y^2<=1計數器增加一次,共運行n次
{
a++;//如果在扇形之內增加一次
}
pi = 4* (double)a / (double)i; //計算出pi
err = fabs(pi - M_PI);//計算誤差值
cout << err << endl; //輸出誤差值
}
return 0;
}

使用gnuplot繪製圖表

1
2
3
4
5
gnuplot> set xlabel "i" //設定x軸名稱為i
gnuplot> set ylabel "error" //設定y軸名稱為error
gnuplot> set logscale xy //設定雙對數座標軸
gnuplot> set yrange [1:0.00003] //設定y軸範圍1到0.00003
gnuplot> plot "pi.dat" with lines[1] //使用連線描圖

gnuplot

Docker的筆記

安裝(以Mint為例)

1
2
3
$ sudo apt update  
$ sudo apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

注意一下 我在網路上找到的方法是這樣子

1
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

可是這樣在我的Mint上面是會跳出錯誤的 於是在這裡使用手動修改/etc/apt/sources.list.d/official-package-repositories.list的方式 在這個檔案裡面插入這個

1
deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable

更新軟體源和安裝

1
2
$ sudo apt update
$ sudo apt install docker-ce

常用指令

查看已開啟的容器

1
docker ps

停止容器

1
docker stop 容器ID

移除容器

1
docker rm 容器ID

運行

1
docker run -p 主機PORT:容器PORT image-name

Dockerfile寫法

1
2
3
COPY . /app #複製當前目錄下的所有文件到容器的/app目錄
RUN node app.js #執行app.js
EXPOSE 3000 #同意外部連結容器的3000PORT

創建image

1
$ docker build -t image-name

我將電腦換成了Mint Linux這裡簡單介紹一下如何搬家

前置

首先一定要裝的Node.JS和hexo還有一些該裝的插件裝好
然後記得把/source資料夾和/themes裡面的主題整個複製出來
最後記得把git給設定好

最後

到最後,只要把它push上去就可以了

剛剛設定tags頁面時出了些問題,一直404,這裡寫一下解決方法
在命令列輸入

1
hexo new page tags

這時在source/tags會有index.md,打開來改成

1
2
3
4
5
---
title: tags
date: 2019-09-19 18:50:05
type: "tags"
---

接著在主題設定中的menu選項下把tags取消註解

1
2
3
4
5
6
7
8
menu:
home: /
#categories: /categories
#about: /about
archives: /archives
tags: /tags
#schedule: /schedule
#commonweal: /404.html

前幾天看到一個部落格,看到右下角有個用live2d做的小人很可愛於是去問了一下網站的主人,不過看起來他已經失蹤多時了…
我這幾天研究了一下live2d的原理,發現可能可以自己抽取,於是就開始動工了…
首先先打開他的原始碼然後ctrl+F搜尋model.json

1
2
3
4
5
<script type="text/javascript" src="https://cdn.jsdelivr.net/gh/Peins/Pic@1.1.1/live2d/js/live2d.js"></script>
<script type="text/javascript" src="https://cdn.jsdelivr.net/gh/Peins/Pic@1.1.1/live2d/js/message.js"></script>
<script type="text/javascript">
loadlive2d("live2d", "https://cdn.jsdelivr.net/gh/Peins/Pic@1.1.1/live2d/model/saber/saber.json");
</script>

發現惹程式碼就可以把它弄到自己的網頁上去了

1
2
3
4
5
6
7
8
9
10
C:\Users\Salt>ssh-keygen                                   # 產生金鑰
Generating public/private rsa key pair.
Enter file in which to save the key (C:\Users\Salt): # 金鑰存放的路徑,直接按 Enter

Created directory 'C:\Users\Salt\.ssh'.
Enter passphrase (empty for no passphrase): # 密碼,可設定可不設定,設定的話每次上傳會多需要輸入一次密碼

Enter same passphrase again: # 再輸入一次密碼

The key fingerprint is: # 之後會顯示你的 fingerprint,到這裡就完成 key 的產生了

輸入以下指令查看公鑰

1
2
C:\Users\Salt>type C:\Users\Salt\.ssh\id_rsa.pub #讀取公鑰
ssh-rsa ~一連串金鑰~

這裡 新增公鑰上去