0%

Installation

1
2
3
sudo add-apt-repository ppa:wireguard/wireguard
sudo apt-get update
sudo apt-get install wireguard

Configuration

  1. 確認 kernel 版本非客制
    1
    2
    uname --kernel-release
    // check your kernel name without linode

如果執行完上面指令看到有其他非正規字眼像是 xxxxxx-linde152 之類的,你必須去 linode boot settings 的後台設定裡面去把改成 GRUB 2,不然會造成 wireguard 無法確認 kernel 版本會安裝執行失敗
參考這邊

改完重開之後會像再執行一次會變成像這樣 4.15.0-54-generic

  1. 按照正常安裝流程
  2. Key Generation
1
wg genkey | tee privatekey | wg pubkey > publickey
  1. 新建 server 端設定檔
    在這個位置建立一個檔案 /etc/wireguard/wg0.conf
1
2
3
4
5
6
7
8
9
10
11
12
[Interface]
Address = 10.66.66.1/24 // 通道連上之後的內網 ipv4 ip
Address = fd42:42:42::1/64 // 通道連上之後的內網 ipv6 ip
SaveConfig = true
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; ip6tables -A FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; ip6tables -D FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
ListenPort = 51820 // vpn listen port
PrivateKey = <server private key> // 填上前一個步驟產生的 private key

[Peer] // 設定可以連入的 client 資訊
PublicKey = <client public key>
AllowedIPs = 10.66.66.2/32, fd42:42:42::2/128 // client 會取到的 ip
  1. client 端設定檔
1
2
3
4
5
6
7
8
9
10
[Interface]
PrivateKey = <client private key>
Address = 10.66.66.2/24, fd42:42:42::2/64
DNS = 8.8.8.8, 1.1.1.1

[Peer]
PublicKey = <server public key>
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = <server ip>:<listenPort> // xxx.xxx.xxx.xxx:51820
PersistentKeepalive = 25
  1. Set Up Firewall Rules
1
2
3
4
5
sudo ufw allow 22/tcp
sudo ufw allow 51820/udp
sudo ufw enable

sudo ufw status verbose // for test
  1. Start the Wireguard Service
1
2
3
wg-quick up wg0
sudo systemctl enable wg-quick@wg0 //設定開機自動執行
sudo wg show

Introdution

This is helping you to install the latest CUDA 10.0 which released Sept. 2018 on Ubuntu 18.04 bionic

Step by step

At first you need a bionic ubuntu server and lets start it

  1. Install driver

    1
    2
    3
    sudo add-apt-repository ppa:graphics-drivers/ppa
    sudo apt-get update
    sudo apt-get install nvidia-396
  2. Install CUDA 10.0
    Download here

    1
    2
    3
    sudo dpkg -i 'cuda10.0.deb'
    sudo apt-get update
    sudo apt-get install cuda
  3. Test CUDA

    1
    2
    3
    cd /usr/local/cuda/samples/1_Utilities/deviceQuery
    sudo make
    ./deviceQuery
  4. Install cuDNN 7.3.1
    Download here
    (You need to register if you don’t have account)

    1
    2
    3
    sudo dpkg -i 'Your Runtime Library.deb'
    sudo dpkg -i 'Your Developer Library.deb'
    sudo dpkg -i 'Your Code Sample.deb'
  5. Test cdDNN

    1
    2
    3
    cd /usr/src/cudnn_samples_v7/mnistCUDNN
    sudo make
    ./mnistCuDNN

I got a error during “sudo make”

  1. One more thing
    There is a bug in cdDNN package
1
2
3
4
5
6
7
vim /usr/include/cudnn.h

//change this
#include "driver_types.h"

//to:
#include <driver_types.h>

And now you can repeat step 5.

All set!

BTW
It works on pytorch 0.4.1 with stable/linux/py3.6/cuda9.2
Download here

1
2
pip3 install http://download.pytorch.org/whl/cu92/torch-0.4.1-cp36-cp36m-linux_x86_64.whl
pip3 install torchvision

Ref

https://blog.csdn.net/junzia/article/details/80871145
https://medium.com/@afun/ubuntu-16-04-%E5%AE%89%E8%A3%9D-cuda-cudnn-nvidia-driver-%E7%9A%84%E8%B8%A9%E9%9B%B7%E5%BF%83%E5%BE%97-%E9%9D%9E%E5%AE%89%E8%A3%9D%E6%AD%A5%E9%A9%9F%E8%A9%B3%E8%A7%A3-b13121d95025

緣起

前幾天有位朋友來求救,使用多年的 mac 大頭貼裡面還有前女友照片怎麼辦啊~~
完全找不到地方刪除感覺會死人RRRRRR

於是平常正經的本 blog 就來寫一篇這個好了

作法

因為 mac 會把你用過的大頭貼圖片暫存在一個位置,以方便你下次又要用用過的圖片當圖示

通常系統會放在這個位置
~/Library/Containers/com.apple.ImageKit.RecentPictureService/Data/Library/Images/Recent Pictures/

但是因為這是隱藏資料夾
所以除非你會使用 command line
不然還是乖乖打開 finder 好了

打開後按下 cmd + shift + G
複製上面路徑貼上去 enter 就可以直達那個位置啦

後記

誠心建議各位還是找位不會計較你過去的女友比較好XD

The One More Thing

刪完記得要清空垃圾桶…

前情提要

平常都習慣 mac 上面做事,這幾天在某台新的 ubuntu 上面裝 pgcli 的時候遇到一個問題
用 pip 裝完 pgcli 之後跳出一個提示,意思是說你現在這個 pip v8.1.1 已經過時囉,現在最新的是 v18,建議你快點更新喔,後面還送你一串更新用的指令
用它送的指令更新下去…直接幫你把你的 pip 送上西天,會噴以下的訊息

1
2
3
4
Traceback (most recent call last):
File "/usr/bin/pip", line 9, in <module>
from pip import main
ImportError: cannot import name 'main'

解法

查了一輪大致上是因為新版的 pip v18,只支援 python3,python2 只能更新到 v9 的樣子
這真的蠢到我醉了,自己跳訊息出來炸掉自己是哪招…

以下一行解決

1
sudo python -m pip uninstall pip && sudo apt install python3-pip --reinstall

緣起

最近有一個案子必須先透過 API 取得資料後把資料經過重組塞進 local database
環境上使用的是 nodejs + postgres

過程

經過了兩次重構之後整理一下最後的做法

  1. Using request-promise lib

  2. Using pg-promise lib

作者本人有在 stackoverflow 提供一段範例可以參考

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
const pgp = require('pg-promise')({
/* initialization options */
capSQL: true // capitalize all generated SQL
});
const db = pgp(/*connection*/);

// our set of columns, to be created only once, and then shared/reused,
// to let it cache up its formatting templates for high performance:
const cs = new pgp.helpers.ColumnSet(['col_a', 'col_b'], {table: 'tmp'});

// data input values:
const values = [{col_a: 'a1', col_b: 'b1'}, {col_a: 'a2', col_b: 'b2'}];

// generating a multi-row insert query:
const query = pgp.helpers.insert(values, cs);
//=> INSERT INTO "tmp"("col_a","col_b") VALUES('a1','b1'),('a2','b2')

// executing the query:
db.none(query)
.then(data => {
// success;
})
.catch(error => {
// error;

  1. Using map to reformat objects in an array

這篇裡面的範例也可以參考一下,當然 var 在 es7 裡面已經被棄用,但以 map 來做集合操作仍然是相當實用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var kvArray = [{key: 1, value: 10}, 
{key: 2, value: 20},
{key: 3, value: 30}];

var reformattedArray = kvArray.map(obj =>{
var rObj = {};
rObj[obj.key] = obj.value;
return rObj;
});
// reformattedArray is now [{1: 10}, {2: 20}, {3: 30}],

// kvArray is still:
// [{key: 1, value: 10},
// {key: 2, value: 20},
// {key: 3, value: 30}]

One more thing

程式結束記得補上

1
pgp.end()

Intro

我們登入遠端伺服器每次都要打密碼其實又麻煩又不安全,有人提倡常常換密碼可以解決,但…這個在實質上的有用程度在這裡就不好說了。

Usage

言歸正傳,這邊要介紹一下如何使用 ssh key 來登入遠端伺服器

通常我們會透過指令產生 ssh key

1
ssh-keygen -t rsa

產生出來的 key 通常會在

1
~/.ssh/id_rsa.pub

只要把我們的 key 加入到伺服器的下面這個檔案裡面就能達成用 key 登入

1
~/.ssh/authorized_keys

所以我們可以用這個指令直接把 local 端的 ssh key 加進去 server 端的登入名單裡面

1
cat ~/.ssh/id_rsa.pub | ssh [user]@[server-host] "cat >> ~/.ssh/authorized_keys"

緣起

伺服器硬碟快爆掉了,所以找想找一下指令來做這件事,於是找到了這篇
Ubuntu 用 du 和 sort 指令找出大檔案

指令直接下

1
sudo du -h / | sort -h -r | more

/ 代表開始掃描的起點,如果想改變掃描的位置可以改這邊

其他大致上沒什麼需要修改的

all set

緣起

用 gitlab ci 也是一段時間,如果只是要進行一些簡單 test or deploy 之類的工作,用這個會比其他外部工具平台簡單一點,但是在版本不斷推進的同時會遇到了底下的問題

1
2
3
4
5
Running with gitlab-runner 10.5.0 (xxxxxxxx)
on ssh-xxxxxxxx (xxxxxxxxx)
Using SSH executor...
Running on xxxxxxxxxx via xxxxxxxxxx...
ERROR: Job failed: Process exited with: 1. Reason was: ()

看了很多文章,早期有一部分建議降版本到 gitlab-runner v1.8.6,的確是可以順利運行,但是到了 gitlab v10 之後似乎又炸裂了,於是這次好好想來解決一番。

解決方法

直接進入結論
用以下這行就可以解決

1
chsh username /bin/bash

就是讓這個 gitlab-runner 登入的帳號,預設要改成 bash (zsh 確定不行,其餘沒試過)

到這邊以為事件就這樣結束了,不過節外總會生枝

事件二

pipeline job 畫面又跑出這個東西

1
2
fatal: unable to access 'https://gitlab-ci-token:xxxxxxxxxxxxxxxxxxxx@git.example.com/group/project.git/': SSL certificate problem: self signed certificate
ERROR: Job failed: exit code 1

SSL certificate failing 似乎是 gitlab-runner 和 gitlab 到了某版之後出現的 bug,大致上建議的做法是先關掉 SSL 的驗證,等版本修復之後再打開了,解決方法是在 config.toml 裡面 runners 裡面加上這行

1
2
3
environment = ["GIT_SSL_NO_VERIFY=true"]
or
environment = ["GIT_SSL_NO_VERIFY=1"]

All set…

緣起

mysql 5.7 在功能與性能上都比 5.6 出色不少,但基於 percona 一直沒有更新的情況下我也沒有貿然升級,隨著前陣子 percona 釋出了 5.7 剛好最近又有了要使用 mysql 的機會,就想藉由這次機會順便升級 5.7

過程

在 OS 上面這台使用的是 Ubuntu 14.04,使用下面指令就能完成升級

1
2
3
sudo service mysql stop
sudo apt-get update
sudo apt-get install percona-server-server-5.7

等到跑完之後重啟 mysql 即可…

但是大家都知道事情通常都不會這麼順利,所以我在這邊發生了 mysql 啟動不了的悲劇GG

問題解決

因為重啟的時候有看到如下的訊息

1
no directory logging in with home=/ mysql

於是先使用這樣的做法

1
sudo usermod -d /var/lib/mysql/ mysql #這裡舉例使用預設路徑,有改路徑的記得跟著改

上面的作法等同於去修改 /etc/passwd 裡面 mysql 這個 user 的第六項資料,大致上是設定 mysql 這個 user 的家目錄的意思
想了解更多也可以參看一下這篇Ubuntu 平滑升级 MySQL 到 5.7

再重啟訊息不見了,但是依然失敗

再去 /etc/mysql/my.cnf 裡面確定一下

  1. datadir = (資料路徑)
  2. log_error= /var/log/mysql/error.log (log 有正確被寫入到預設位置)

檢查一下 log 之後發現錯誤訊息是
‘innodb_buffer_pool_populate’ 這個參數找不到

Google 查一下找到下面這篇說明
Changed in Percona Server 5.7
innodb_buffer_pool_populate server option and numa_interleave mysql_safe.sh option have been replaced by innodb_numa_interleave server option. Note that flush_caches option still remains.

於是乎把 innodb_buffer_pool_populate 取代成 innodb_numa_interleave 重啟 mysql 就成功啟動了,謝天謝地。

後記

最後執行一下

1
sudo mysql_upgrade -u root -p #更新一下數據

緣起

最近接到一個任務,是要把對外網站的一些安全漏洞補起來,而其中我拿到兩個 issue 要解:

  1. disable website directory listing
  2. mitigate Slow HTTP Dos Attack

拜請 Google 大神之後大致上看起來應該是不太難
主要參考了這兩篇:

  1. How do I disable directory browsing
  2. Apache 如何防護 Slow HTTP DOS 攻擊

實作第一個問題

基本上在 Apache 的環境下面就是兩個做法最普遍

  1. 在 .htaccess 裡面加上

    1
    Options -Indexes
  2. 在 virtualhost 資訊裡拿掉 Indexes

1
2
3
4
5
6
7
8
9
10
11
12
13
# before
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>

# after
<Directory /var/www/>
Options FollowSymLinks
AllowOverride None
Require all granted
</Directory>

然後重啟 Apache 就搞定了

實作第二個問題

在上面的文章裡面提供了三種方法

  1. mod_reqtimeout
  2. mod_qos
  3. mod_security

這三種我都試了一輪
1 最簡單
在 virtualhost 裡面直接加上去就行了

1
2
3
<IfModule mod_reqtimeout.c>
RequestReadTimeout header=20-40,MinRate=500 body=20-40,MinRate=500
</IfModule>

2 mod_qos 在 Apache 2.4 已經不支援了,所以不用玩了

3 的部分功能最多,做起來也最麻煩

1
sudo apt-get install libapache2-mod-security2

(如果你在這邊沒有遇到其他問題的話,事情其實也不難搞定,但是我在這邊遇到一連串問題搞了我非常多時間,解決的過程因為文獻被我搞丟了,所以請大家自求多福了XD)

弄好之後一樣把下面加進去 virtualhost 設定檔裡面重啟 Apache 就搞定

1
2
3
4
5
<IfModule mod_security2.c>
SecRule RESPONSE_STATUS "@streq 408" "phase:5,t:none,nolog,pass, setvar:ip.slow_dos_counter=+1, expirevar:ip.slow_dos_counter=60, id:'1234123456'"

SecRule IP:SLOW_DOS_COUNTER "@gt 5" "phase:1,t:none,log,drop, msg:'Client Connection Dropped due to high number of slow DoS alerts', id:'1234123457'"
</IfModule>

備註

最後附上一個測試 slow http dos attack 的工具
SlowHTTPTest