2018年10月30日 星期二

【Linux】建立軟連結



$ls / -la
drwxr-xr-x  23 root      root  4096  六  10 22:45 .
drwxr-xr-x  23 root      root  4096  六  10 22:45 ..
drwxr-xr-x   2 root      root  4096  九   8 22:21 bin
drwxr-xr-x   3 root      root  2560  一   1  1970 boot
drwxr-xr-x  16 root      root  3580  十  30 21:34 dev
drwxr-xr-x 131 root      root 12288  十  30 23:30 etc
drwxr-xr-x   5 root      root  4096  十  30 23:23 home
drwxr-xr-x  17 root      root  4096  七   1 17:43 lib
drwx------   2 root      root 16384  三  14  2018 lost+found
drwxrwxrwx   5 root      root  4096  九  20 00:00 media
drwxr-xr-x   2 root      root  4096  三  14  2018 mnt
drwxr-xr-x  16 pi        pi    4096  六  10 23:02 mystic
drwxr-xr-x   9 root      root  4096  九   4 00:29 opt
dr-xr-xr-x 172 root      root     0  一   1  1970 proc
drwx------  14 root      root  4096  十  30 22:45 root
drwxr-xr-x  33 root      root  1100  十  30 23:00 run
drwxr-xr-x   2 root      root 12288  九   8 22:21 sbin
drwxr-xr-x   3 root      root  4096  四  25  2018 srv
drwxr-xr-x   3 ftp-admin ftp   4096  十  30 21:35 storage
dr-xr-xr-x  12 root      root     0  十  30 21:25 sys
drwxrwxrwt  14 root      root  4096  十  30 23:45 tmp
drwxr-xr-x  11 root      root  4096  三  14  2018 usr
drwxr-xr-x  12 root      root  4096  四  25  2018 var


$ln -s /storage storage



$ls ~ -la
lrwxrwxrwx  1 pi   pi       8  十  30 23:49 storage -> /storage

2018年10月25日 星期四

【DOS】如何得知BAT檔目錄位置當以系統管理員開啟時


這幾天再嘗試寫DOS的批次檔,因為要將此目錄的檔案移至Program File,
需要以系統管理員開啟,結果不管呼叫的是%CD%還是pwd,都顯示目前位置在C:\Windows\system32,這樣要copy檔案時還要回來找原本目錄的位置。

test.bat
pwd
echo %CD%
pause


一般使用者開啟
C:\Users\vincent\Desktop>pwd
C:\Users\vincent\Desktop

C:\Users\vincent\Desktop>echo C:\Users\vincent\Desktop
C:\Users\vincent\Desktop

C:\Users\vincent\Desktop>pause
請按任意鍵繼續 . . .

系統管理員開啟
C:\Windows\system32>pwd
C:\Windows\system32

C:\Windows\system32>echo C:\Windows\system32
C:\Windows\system32

C:\Windows\system32>pause
請按任意鍵繼續 . . .


解決


test2.bat
SET LOCAL_PATH="%~dp0"

echo %LOCAL_PATH%

一般使用者開啟
C:\Users\vincent\Desktop>SET LOCAL_PATH="C:\Users\vincent\Desktop\"

C:\Users\vincent\Desktop>echo "C:\Users\vincent\Desktop\"
"C:\Users\vincent\Desktop\"

C:\Users\vincent\Desktop>pause
請按任意鍵繼續 . . .

系統管理員開啟
C:\Windows\system32>SET LOCAL_PATH="C:\Users\vincent\Desktop\"

C:\Windows\system32>echo "C:\Users\vincent\Desktop\"
"C:\Users\vincent\Desktop\"

C:\Windows\system32>pause
請按任意鍵繼續 . . .

參考資料

2018年10月20日 星期六

【Android】Android Studio拋錯llvm-rs-cc is missing



Android Studio拋錯

java.lang.IllegalStateException: llvm-rs-cc is missing
Caused by: java.lang.IllegalStateException: llvm-rs-cc is missing
at com.android.builder.core.AndroidBuilder.compileAllRenderscriptFiles(AndroidBuilder.java:1194)
at com.android.build.gradle.tasks.RenderscriptCompile.taskAction(RenderscriptCompile.java:206)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:46)
at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:39)
at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:26)
at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:788)
at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:755)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$1.run(ExecuteActionsTaskExecuter.java:124)
at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:199)
at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:110)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:113)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:95)
... 108 more

解決

  1. 刪除SDK目錄下的build-tools
  2. 開啟SDK Manager,重新下載Android SDK build-tools

參考

2018年10月14日 星期日

【Java】使用Cipher實現字串加密/解密



程式碼:CipherAdaptor.java
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.Provider;
import java.util.Base64;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.CipherSpi;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

public class CipherAdaptor{
private Base64.Decoder decoder=Base64.getDecoder();
private Base64.Encoder encoder=Base64.getEncoder();
    private final SecretKey secretKey;
    private final String algorithm,charset;
    private Cipher cipher;
    CipherAdaptor(String algorithm,SecretKey secretKey,String charset) throws NoSuchPaddingException, NoSuchAlgorithmException {
    encoder=encoder.withoutPadding();//設定Base64的解碼規則:編碼器省略末段的'='字符(如果有的話)。
    this.secretKey=secretKey;
        this.algorithm=algorithm;
        this.charset=charset;
        cipher=Cipher.getInstance(algorithm);//定義Cipher所使用的演算法
     
    }
/*
 * 明文:訊息
 * 密文:明文經過加密所產生的信息被稱為密文
 *
 */
    String encrypt(String str) throws Exception {
//    將明文轉換成位元組陣列
        byte[] executed=encrypt(str.getBytes(charset));
     
//    將已加密的位元組陣列使用Base64表示,因為輸出的位元組值不一定在字碼表內,
//        Base64可以將原始資料轉換為字串,提供後續使用的方便性。
        return encoder.encodeToString(executed);
    }

    byte[] encrypt(byte[] raw) throws Exception {
//    將位元組陣列編碼成Base64格式
        return execute(raw,Cipher.ENCRYPT_MODE,secretKey);
    }

    String decrypt(String str) throws Exception {
//    將密文解碼成位元組陣列
        byte[] CryptedBytes=decoder.decode(str);
     
        return new String(decrypt(CryptedBytes),charset);
    }

    byte[] decrypt(byte[] raw) throws Exception {
//    將已加密的位元組解密成位元組
        return execute(raw,Cipher.DECRYPT_MODE,secretKey);
    }

    String getAlgorithm(){
        return cipher.getAlgorithm();
    }

    private byte[] execute(byte[] raw,int mode,SecretKey secretKey) throws InvalidKeyException, BadPaddingException, IllegalBlockSizeException{
        cipher.init(mode,secretKey);//初始化Cipher
        return cipher.doFinal(raw);//加密(Cipher.ENCRYPT_MODE)/解密(DECRYPT_MODE)
    }
 
    static SecretKey Str2Key(String str,String algorithm) throws UnsupportedEncodingException {
//    將字串轉換成位元組陣列
    byte[] byte_key=str.getBytes("UTF-8");
   
//    將位元組轉成SecretKey
        return new SecretKeySpec(byte_key,0,byte_key.length,algorithm);
    }
 

}

2018年10月10日 星期三

【Java】Base64編碼與解碼


程式碼:
package ciphertest;

import com.sun.org.apache.xml.internal.security.exceptions.Base64DecodingException;
import com.sun.org.apache.xml.internal.security.utils.Base64;
import java.util.Scanner;

public class Base64_Test {

    public static void main(String[] args) {
        Scanner src = new Scanner(System.in);
        while (true) {
            System.out.print("mode:");
            String mode = src.nextLine();
            if (mode.equals("x")) {
                System.exit(0);
            }

            System.out.print("input:");
            String contain = src.nextLine();

            if (mode.equals("e")) {
                System.out.println(encode(contain));
            } else if (mode.equals("d")) {
                try {
                    System.out.println(decode(contain));
                } catch (Base64DecodingException e) {
                    System.err.println(e.getMessage());
                }
            }

        }
    }

    static String encode(String msg) {
        byte[] bytes_str = msg.getBytes();
        return Base64.encode(bytes_str);
    }

    static String decode(String msg) throws Base64DecodingException {
        return new String(Base64.decode(msg));
    }
}



執行


Console
mode:e
input:Hello!! I am Vincent Yeh.
SGVsbG8hISBJIGFtIFZpbmNlbnQgWWVoLg==
mode:d
input:SGVsbG8hISBJIGFtIFZpbmNlbnQgWWVoLg==
Hello!! I am Vincent Yeh. mode:x

參考資料

2018年10月4日 星期四

【Linux】使用telnet開啟ptt.cc出現亂碼




使用linux的telnet指令連接批踢踢(ptt.cc)時出現亂碼,可能是因為Linux式使用UTF-8編碼的關係。