網頁

2023年4月21日 星期五

Windows 11 下的 Python

 想要玩不同的套件,但是套件的 python 版本全都卡死,那就是之前在 gentoo 上的災難重演。

所以馬上想到了 virtual_env ,看了一下 windows 底下應該是用 conda 比較方便,所以就進了一段亂七八糟的砍掉重練試錯期。後來發現,直接裝 ANACONDA 其實蠻方便的,注意不要被 Windows 的自動應用程式執行別名搞到就好。

先安裝 anaconda3

>choco install anaconda3

然後建立一個 env 

conda create --name myenv python=3.11

然後把 cmder 的 task clone 一份出來修改,加入

cmd /k ""%ConEmuDir%\..\init.bat" " & C:\tools\Anaconda3\Scripts\activate.bat C:\tools\Anaconda3 && conda activate virtual_env_name && cd \the\path\you\want\to\go\


就可以繼續胡亂玩耍了

2019年10月16日 星期三

Raspberry Pi 4 超頻


超頻
/boot/config.txt
[pi4]
over_voltage=6
arm_freq=2147

看頻率
$ cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq
$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq
$ cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_min_freq
看溫度

vcgencmd measure_temp

2019年8月16日 星期五

Gentoo 解救中文 mount share

公司的 nas mount 完之後,變成全部亂碼,觀察了一下發現是沒設定 Locales 導致,所以: 修改 /etc/locale.gen
en_US.UTF-8 UTF-8
zh_TW.UTF-8 UTF-8
然後
locale-gen
eselect locale list
eselect locale set n
.bashrc 加入或修改
export LANG="en_US.UTF-8"
export LC_COLLATE="C"
不用 LANG="zh_TW.URF-8" 是因為中文化之後很多錯誤訊息會看不懂 lol 參考:Gentoo Wiki

Gentoo Linux 下用 Smbnetfs Mount CIFS

不想要直接在 fstab 裡面把一些私人的網方分享 mount 上來的做法:

emerge --ask net-fs/smbnetfs
mkdir ~/.smb
bunzip2 -c /usr/share/doc/smbnetfs-0.6.0/smbnetfs.conf.bz2 > ~/.smb/smbnetfs.conf
vim ~/.smb/smbnetfs.auth
chmod 600 ~/.smb/smbnetfs.auth
smbnetfs -o uid=你的uid,gid=你的gid,umask=0022 ~/mnt
使用方式
ls -al ~/mnt/SAMBAIP

當中 smbnetfs.auth 格式:
auth serverip username "PASSWORD"


參考

2018年3月2日 星期五

合併兩個 git repo 成為一個

假設現在有兩個 ProjectA 和 ProjectB ,希望他們變成一個 Project 裡面的子目錄

ProjectC/
     |- /ProjectA
     |- /ProjectB

做法:

  1. 先到 ProjectA/ProjectB 裡面建立子目錄,方便識別,叫做 PDA/PDB
    cd ProjectA
    mkdir ProjectA
    
    cd ProjectB
    mkdir ProjectB
    
  2. 用 git mv -k 把 * 都搬進 PDA/PDB 裡面,注意 dot 開頭的檔案 * 吃不到
    cd ProjectA
    git mv -k * ProjectA
    
    cd ProjectB
    git mv -k * ProjectB
  3. git commit 到 local repo 暫存著
    cd ProjectA
    git commit -m "合併 repo"
    
    cd ProjectB
    git commit -m "合併 repo"
  4. 到 ProjectC 目錄裡面用 git remote add 把 ProjectA , ProjectB 兩個 local repo 加進來
    
    cd ProjectC
    git remote add PDA ../ProjectA
    git remote add PDB ../ProjectB
    
  5. git checkout 到每個要處理的 branch ,例如 develop / master ,依次 pull 每個 repo branch
    git checkout master
    git pull PDA master
    git pull PDB master
    
    git checkout develop
    git pull PDA develop
    git pull PDB develop
  6. 用 git log 查看是否正確
    git log --oneline --graph --decorate --all
  7. git push
    git push

git sparse checkout

git clone -n git@git.example.com:Project/Demo.git
git config core.sparsecheckout true
echo "Path/You/Want/To/Checkout/" >> .git/info/sparse-checkout
git checkout develop

2016年11月30日 星期三

拆解 git 下的目錄成為新的 repo

Windows 系統要注意 / 方向。
git filter-branch -f --subdirectory-filter 這裡/是你/要拆/的/子目錄 -- --all
git remote -v
git remote set-url origin https://gitlab.example.com/Demo/DemoPoroject.Web.git
git remote -v
git push -u origin master
git remote set-url origin https://github.com/本來/的.來源.git
git pull
git reset origin/master --hard
然後重複以上動作即可。

Install GitLab on FreeBSD 10

網路上比較多看到的文章大概是:
Installing GitLab on FreeBSD 10
不過他是手動用 gem 裝,個人不是很喜歡這種方式,想到之前看 2016 June Status Report 好像依稀有看到 Bringing GitLab into the Ports Collection 就翻了一下,所以照著 pkg-message 裡面的指示文件設定,不過會卡一些小地方,記錄下來避免以後需要重新查。


首先,更新你的 ports tree
sudo portsnap fetch update
然後,進場安裝 gitlab
cd /usr/ports/www/gitlab
然後照著 文件 一步一步設定,大致上就能跑起來。 當中遇到幾個小問題: 現存 nginx 已經設定過,所以要自己生一組 vhost 設定檔,姑且叫他 gitlab.conf:
upstream gitlab-workhorse {
  server unix:/usr/local/www/gitlab/tmp/sockets/gitlab-workhorse.socket fail_timeout=0;
}

server {
        listen       80;
        server_name  你的DOMAIN;
        rewrite      ^ https://$server_name$request_uri? permanent;
}

server {
        listen       443;
        server_name  你的DOMAIN;
        server_tokens off;
        charset utf-8;

        error_log   /PATH_TO/nginx-error.log  info;
        access_log  /PATH_TO/nginx-access.log combined;

        ssl                  on;
        ssl_certificate      /PATH_TO/ssl.pem;
        ssl_certificate_key  /PATH_TO/ssl.key;

        location / {
          client_max_body_size 0;
          gzip off;

          ## https://github.com/gitlabhq/gitlabhq/issues/694
          ## Some requests take more than 30 seconds.
          proxy_read_timeout      300;
          proxy_connect_timeout   300;
          proxy_redirect          off;

          proxy_http_version 1.1;

          proxy_set_header    Host                $http_host;
          proxy_set_header    X-Real-IP           $remote_addr;
          proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
          proxy_set_header    X-Forwarded-Proto   $scheme;

          proxy_pass http://gitlab-workhorse;
        }

        error_page 404 /404.html;
        error_page 422 /422.html;
        error_page 500 /500.html;
        error_page 502 /502.html;
        error_page 503 /503.html;
        location ~ ^/(404|422|500|502|503)\.html$ {
          root /usr/local/www/gitlab/public;
          internal;
        }

}


然後把 nginx 重跑,記得先把 gitlab 跑起來
service gitlab start
然後可以注意一下 gitlab:check 裡面的問題,一一把它修復:
cd  /usr/local/www/gitlab
rake gitlab:check RAILS_ENV=production
當中我一直遇到 gitlab-shell 的問題
cd /usr/local/share/gitlab-shell/
./bin/check
發現說我 url 改錯了,所以,所以編輯一下
#不是 FQDN
gitlab_url: "http://localhost:8080"
http_settings:
  self_signed_cert: false
auth_file: "/PATH_TO_UR_SSH_AUTH_FILE/authorized_keys"
# File that contains the secret key for verifying access to GitLab.
# Default is .gitlab_shell_secret in the root directory.
# secret_file: "/home/git/gitlab-shell/.gitlab_shell_secret"
# Redis settings used for pushing commit notices to gitlab
redis:
  bin: /usr/bin/redis-cli
  database: 0
  socket: /var/run/redis/redis.sock # Comment out this line if you want to use TCP or Sentinel
  namespace: resque:gitlab
log_file: "/var/log/gitlab-shell/gitlab-shell.log"
log_level: INFO
audit_usernames: false
git_annex_enabled: false
要注意的是這個檔案的空白、tab 會影響 parse 正確性,不要亂加空白。 然後還是跑不起來,發現 /usr/local/share/gitlab-shell/lib 少了 gitlab_reference_counter.rb 補給他:
cd /usr/local/share/gitlab-shell/lib
fetch https://raw.githubusercontent.com/gitlabhq/gitlab-shell/master/lib/gitlab_reference_counter.rb
重啟一次 service ,搞定。 Note1. 為什麼不用 pkg ?因為腦闆說 redmine 吃了很多要特別設定的 plugin ,ruby pkg 下去會爛光光。懶得確認狀況,不然我最近犯懶都習慣 pkg 到底了 XD

2015年4月20日 星期一

合併多個 Subversion 成一個 Git

轉換成 Git 的方法可以看這篇,這篇其實是先轉成 git 後,然後用 git 合併起來

方法一:subtree add

git subtree add --prefix=DIR1 git://git.repo.1 master
git subtree add --prefix=DIR2 git://git.repo.2 master
git subtree add --prefix=DIR3 git://git.repo.3 master
git subtree add --prefix=DIR4 git://git.repo.4 master

這是最簡單快速的方法,如果不介意看到一個新增目錄的 commit 出現的話。

 參考:http://stackoverflow.com/questions/1425892/how-do-you-merge-two-git-repositories

方法二:cherry-pick

這個做法會改寫原來 repo 的歷史紀錄,所以先 clone 一份出來測試。
mkdir temp
cd temp
git svn clone svn://repo1/
git svn clone svn://repo2/
git clone /path/to/repo3
git clone /path/to/repo4
然後到每個 repo 裡去調整目錄,這裡最簡單的作法是把它搬到某個 dir 裡:
git filter-branch --index-filter 'git ls-files -s | perl -pe "s{\t\"?}{$&SUB_DIR/}" |GIT_INDEX_FILE=$GIT_INDEX_FILE.new git update-index --index-info && if test -f "$GIT_INDEX_FILE.new"; then mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE; fi' HEAD
參考:

轉移 Subversion 到 Git

準備

安裝 git svn
pkg install git-subversion-2.3.5

建立對應的使用者列表

在 svn project 目錄下,轉出 author.txt
svn log --xml | grep author | sort -u | perl -pe 's/.*>(.*?)<.*/$1 = /' > author.txt
把 author.txt 轉換成需要的格式如下:
john = john 
foo = foo 
kevin = kevin 
johnny = johnny 

轉換 svn 到 git repo

 git svn clone --trunk=/ --no-metadata --authors-file=author.txt svn://svn.my.doman/SVN-REPO-NAME NEW-GIT-REPO.git
這裡強烈建議!強烈建議!強烈建議! 不要過 http_dav_svn,就算沒跑 svnserve ,設定一下跑起來不過是五分鐘以內的事,可以省掉很多奇怪的問題,尤其是當你是陳年的 repo 不知道裡面塞了什麼鬼東西的時候。
接下來砍站,把整個 repo 抓下來:
 git svn fetch 
如果你不聽話或是情非得已過 http_mod_dav 然後出錯了,那就重複跑到結束吧。

刪除過大檔案


現在 svn 已經成功的轉成 git 了,在 NEW-GIT-REPO.git,要把它丟上 github 了嗎?
先別急,先砍一砍裡面太肥的檔案吧。
Github 目前是超過 50 MB 會跳警告,大於 100 MB 會跳錯誤。
所以參考官方網站的說明,用 BFG 來砍最簡單:

安裝 jre

pkg install openjdk8-jre-8.40.25_3

下載 bfg

fetch http://repo1.maven.org/maven2/com/madgag/bfg/1.12.3/bfg-1.12.3.jar
java -jar bfg-1.12.3.jar --strip-blobs-bigger-than 50M NEW-GIT-REPO.git/
git reflog expire --expire=now --all && git gc --prune=now --aggressive

塞上 github

去 github 上面把專案開好,然後照他給的下:
git remote add origin git@github.com:myORG/myProjectDir.git
git push -u origin master

萬一還是太大

如果你看到
Counting objects: 82461, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (29301/29301), done.
remote: fatal: pack exceeds maximum allowed size
error: pack-objects died of signal 132.00 GiB | 2.53 MiB/s
代表這一次的 commit 還是超過大小,只好拆開來塞:這裡有教你這麼做:
git push -u origin HEAD~1000:refs/heads/master
git push -u origin HEAD~500:master
git push -u origin master
不過我的 revision range 語法一直看不懂所以我改成
git push -u origin 某個commit的hash:refs/heads/master
git push -u origin 另外某個commit的hash:master
git push -u origin master
因為 git push 後面給某個 commit 的意思是,把這個 commit 之前都 commit,所以分開塞就可以啦。 至於怎麼找這段呢,就:
git log --pretty=oneline
萬一你發現,連塞一個 commit 都不行的話,那就恭喜你啦!!!那個 commit 太大啦.... 想辦法把那個 commit 分解一下吧....



 參考資料


2015年4月8日 星期三

DDNS on FreeBSD 10

最近種花電信在特價推 300M/100M ,於是弄了台 Brix GB-BXBT-1900 來玩,對於這種小板子就是無法抗拒。題外話,在台中丟的是 GB-BXi3H-4010 質感跟大小跟功能贏很多,當然比較貴一點點,不過有兩組 sodimm 跟 msata + HDD 還比較小台,唯一要注意的是沒有 D-SUB。

家裡用的就沒特別去申請固定 IP ,然後種花電信又老奸巨猾, 100M 以上的故意不給請 PPPOE 配發的偽固定 IP。沒關係,沒做啥大事業,用 no-ip 搞定,結果沒想到第二天就 GG 了,根本就不知道配去哪根電線桿了,於是只好來自幹吧。

目標:client 可以透過 bind 的 dynamic update 機制自動向 dns server 更新自己的 ip 。

參考來源

做法:

Server:


pkg install bind910
mkdir -p /usr/local/etc/namedb/keys
cd /usr/local/etc/namedb/keys
產生所需密鑰
dnssec-keygen -b 512 -a HMAC-SHA512 -v 2 -n HOST my.domain.
vim /usr/local/etc/namedb/named.conf
key my.domain. {
        algorithm "HMAC-SHA512";
        secret "COPY FROM PRIVATE KEY";
};

zone "my.domain" {
        type master;
        file "../dynamic/zone.fwd.my.domain";
        also-notify { SLAVE_DNS_IP;};
        allow-transfer { SLAVE_DNS_IP;};
        allow-update{
                key my.domain;
        };
};

Client:

pkg install bind-tools
把 Server 產的 Key 想辦法(用SCP)送回 client
vim update.sh
#!/bin/sh
MYNS="host.my.domain"
NSSERVER="ns.my.domain"
KEY="KeyPATH.private"
NOW_IP=`ifconfig tun0 | grep inet | cut -d ' ' -f 2`;
OLD_IP=`nslookup -type=a $MYNS | tail -n 3 | grep Address | cut -d ' ' -f 2`;

if [ $OLD_IP != $NOW_IP ]
then
echo "update IP: $NOW_IP to DDNS Server"
echo "server $NSSERVER " >> /tmp/.ddns.$$
echo "update delete $MYNS. A " >> /tmp/.ddns.$$
echo "update add $MYNS. 30 A $NOW_IP" >> /tmp/.ddns.$$
echo "" >> /tmp/.ddns.$$
nsupdate -k $KEY < /tmp/.ddns.$$
rm /tmp/.ddns.$$
fi
exit 0
然後 vim /etc/ppp/ppp.linkup 
HiNET:
  !bg /PATH_TO_THE_SCRIPT/updatens.sh
當中 HiNET 是 /etc/ppp/ppp.conf 裡面對應的 Label 搞定收工。