我們搬家了!點此前往

2020年3月3日 星期二

解決zsh主題在tmux中無法正確顯示

 adding set -g default-terminal "xterm-256color" to ~/.tmux.conf resolved this.

https://github.com/romkatv/powerlevel10k/issues/446
閱讀更多 »

2020年1月12日 星期日

ssh 自動輸入OTP

作為一個普通高中生,需要連線到世界前20大的超算—臺灣杉上跑程式,也是合情合理的事。但是由於資安問題,需要輸入OTP(one-time password, OTP),開瀏覽器複製到終端機上真的是很麻煩,所以寫了以下腳本來自動輸入。

安裝需求套件

  • ga-cmd
    https://github.com/arcanericky/ga-cmd
    我們利用ga-cmd來獲取OTP,這個套件需要手動安裝並且手動配置。
    安裝完成後將金鑰寫在~/.ga-cmd
    格式如下:
    NAME=AUTH_KEY
    
    要手動刪除AUTH_KEY結尾的= 
  • sshpass
    用apt安裝即可
將以下腳本加入PATH指到的地方(以我的例子:~/.local/bin/ssh_otp)
記得存檔之後要 chmod +x <filename>

#!/bin/bash
host=$1
opt_name=$2
echo "please enter password for $host."
read -s password
otp=$(ga-cmd $opt_name)
export SSHPASS=${password}${otp}
sshpass -e ssh $host
接下來就可以用了
ssh_otp user@host OTP_NAME

閱讀更多 »

2019年12月30日 星期一

解決vim貼上跑版

貼上前輸入

:set paste
貼上完後輸入

:set nopaste
閱讀更多 »

2019年12月23日 星期一

解決compton陰影不適配問題

編輯
~/.config/compton.conf
加入以下行

shadow-exclude = [
    "argb",
    "_NET_WM_OPAQUE_REGION@:c",
    "! name~=''",
    "g:e:Xfce4-notifyd"
]
wintypes:
{

    menu          = { shadow = false; };
    dropdown_menu = { shadow = false; };
    popup_menu    = { shadow = false; };
};
閱讀更多 »

2019年7月19日 星期五

MediaStore.Images.Media.insertImage 的巨坑

如題
原始的分享功能會自動壓縮圖片50%,所以要自己寫個,避免被降低畫質


package club.chisc.fantasticfilterandroid;

import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.graphics.Bitmap;
import android.net.Uri;
import android.provider.MediaStore;
import android.util.Log;

import java.io.OutputStream;

import static android.provider.MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
import static androidx.constraintlayout.widget.Constraints.TAG;

public class HDMediaStore {
    public static String insertImage(ContentResolver cr, Bitmap source,
                                     String title, String description) {
        ContentValues values = new ContentValues();
        values.put(MediaStore.Images.Media.TITLE, title);
        values.put(MediaStore.Images.Media.DESCRIPTION, description);
        values.put(MediaStore.Images.Media.MIME_TYPE, "image/png");

        Uri url = null;
        String stringUrl = null;    /* value to be returned */

        try {
            url = cr.insert(EXTERNAL_CONTENT_URI, values);

            if (source != null) {
                OutputStream imageOut = cr.openOutputStream(url);
                try {
                    source.compress(Bitmap.CompressFormat.PNG, 100, imageOut);
                } finally {
                    imageOut.close();
                }

                long id = ContentUris.parseId(url);
                // Wait until MINI_KIND thumbnail is generated.
            } else {
                Log.e(TAG, "Failed to create thumbnail, removing original");
                cr.delete(url, null, null);
                url = null;
            }
        } catch (Exception e) {
            Log.e(TAG, "Failed to insert image", e);
            if (url != null) {
                cr.delete(url, null, null);
                url = null;
            }
        }

        if (url != null) {
            stringUrl = url.toString();
        }

        return stringUrl;
    }

}

閱讀更多 »

2019年6月8日 星期六

TensorFlow Android 初體驗

近期由於手上項目需要,摸索了一下Android以及TensorFlow-Android

代碼的部分跟python版本大同小異,下面附上代碼
首現是初始化,這部分應該沒啥問題

am = assetManager;
inferenceInterface = new TensorFlowInferenceInterface(am, MODEL_FILE);

接下來是圖片格式,Android中圖片的格式為Bitmap,須先轉為Float Array
這部分應該也沒啥問題,如果有需要可以包成函數

int w = bitmap.getWidth();
int h = bitmap.getHeight();
float[] floatValues = new float[w * h * 3];
int[] intValues = new int[w * h];
bitmap.getPixels(intValues, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight());
for (int i = 0; i < intValues.length; ++i) {
    final int val = intValues[i];
    floatValues[i * 3] = ((val >> 16) & 0xFF);
    floatValues[i * 3 + 1] = ((val >> 8) & 0xFF);
    floatValues[i * 3 + 2] = (val & 0xFF);
}

接下來就是處理的部份,並且把處理好的結果存到floatValues中 INPUT_NODE是輸入的節點名稱 可以有很多輸入跟輸出 這邊建議還是另外開個Array,因為有時候處理好的圖片大小會跟原本不一致,可能導致超過大小 不過官方的demo這樣寫,所以就沒另外改了

inferenceInterface.feed(INPUT_NODE, floatValues, 1, bitmap.getHeight(), bitmap.getWidth(), 3);
inferenceInterface.run(new String[]{OUTPUT_NODE}, true);
inferenceInterface.fetch(OUTPUT_NODE, floatValues);

到這裡基本就處理好了,只要在把Float Array轉int Array 再轉Bitmap

for (int i = 0; i < intValues.length; ++i) {
            intValues[i] =
                    0xFF000000
                            | (((int) (floatValues[i * 3])) << 16)
                            | (((int) (floatValues[i * 3 + 1])) << 8)
                            | ((int) (floatValues[i * 3 + 2]));
        }
Bitmap new_bitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.RGB_565);
new_bitmap.setPixels(intValues, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight());
閱讀更多 »

2019年5月14日 星期二

[TensorFlow] 解決CUDA內部錯誤

前些時間跑TensorFlow代碼的時候出現CUDNN_STATUS_INTERNAL_ERROR錯誤
據說會有此錯誤是因為顯存分配問題所導致的BUG,加上以下代碼即可:
config = tf.ConfigProto()
config.gpu_options.allow_growth = True
sess = tf.Session(graph=graph, config=config)
閱讀更多 »