2023年10月4日 星期三

解決 window OS 中java 原始碼,中文預設是Big5編碼,改utf-8亂碼問題

當javac 編譯 .java當時會使用OS預設的locale編碼,在台灣預設Big5也就是MS950,

但你如果把這檔案執行在非Big5如utf-8則會出現亂碼,

即使你把.java編碼一開始存成utf-8也無法改變這狀況,甚至javac會出現以下錯誤:

 unmappable character for encoding MS950

想解決這問題,請以下列步驟實行:

/*
  1.存檔字元集一開始就改utf-8,再打中文字,不然會亂碼
  2.存檔檔名為"TestChUTF8.java"
  3.javac 編譯請加上編譯參數 "-encoding UTF-8" 完整指令如下:
    javac -encoding UTF-8  TestChUTF8.java
  4.執行時請加上執行參數  "-Dfile.encoding=UTF-8" 完整指令如下:
    java -Dfile.encoding=UTF-8  TestChUTF8
    實驗結果:執行參數  "-Dfile.encoding=UTF-8" 可以不加,也可正常顯示
*/

public class TestChUTF8{
    public static void main(String[] args){
        System.out.println("哈哈中文^_^");
    }
}

2023年8月13日 星期日

SHA-1 指紋產生

指令如下: 

android studio 開發工具於安裝時會幫你自動產生一個 debug版本用sha-1指紋

故以下指令列出的是debug版本用sha-1指紋(如你沒有自行產生sha-1的話)

keytool -list -v -keystore "%USERPROFILE%\.android\debug.keystore" -alias androiddebugkey -storepass android -keypass android

重新產生SHA-1指令:

 keytool -genkey  -keystore "%USERPROFILE%\.android\debug.keystore" -alias androiddebugkey -storepass android -keypass android

2023年5月29日 星期一

Android — Gralde Plugin 4.0.0的功能 buildFeatures

 2023/05時試驗android時,產生了BuildConfig,binding物件找不到的錯誤,經查詢資料及實作,可用以下方式克服(如:cannot resolve symbol 'BuildConfig')

方式一:在build.gradle(Module:app)檔案加入以下選項:

android {
//.....
buildFeatures {
viewBinding true //建立View Binding物件取代findViewById()
buildConfig true //建立BuildConfig須加這設定
// dataBinding true //過期了目前併入viewBinding
aidl true //AIDL檔案,產生Binder class
renderScript true //決定是否支援renderScript
resValues true //決定注入客製變數是否進入R.java
shaders true //決定支援 shade AOT compilation
}

}
即使做了以上檔案修改,project設定不一定會自動生效:你最好做以下動作:
1.build.gradle----->Sync Now
2,選取android studio開發工具:
  File----->Invalide Caches----->勾選"clear Files","clear VCS"及"Delete embedded browser"
  最後按下"Invalidate and Restart" 按鈕
3.再選取android studio開發工具:
   Build------>clean Project 
4.最後再選取android studio開發工具:
    Build------>rebuild Project 
方式二:在gradle.properties檔案加入以下選項: (這是用在你不止一個模組時的起始設定)
android.defaults.buildfeatures.buildconfig=true
android.defaults.buildfeatures.aidl=true
android.defaults.buildfeatures.renderscript=true
android.defaults.buildfeatures.resvalues=true
android.defaults.buildfeatures.shaders=true
參考的官方網址(目前):
   https://developer.android.com/studio/releases/gradle-plugin?hl=zh-tw#buildFeatures 

2023年5月6日 星期六

android adb 使用規則:(version:2023/05/05)

 android adb 使用規則:

adb devices或 adb devices -l作用列出所有正在執行的虛擬機
  但早期如你要連虛擬機是執行以下文法:
  adb connect 虛擬機名:5555
  範例:
  adb connect emulator-5555:5555
  往往你用genymotion,bluestack等android模擬器都這樣做
  目前如你要使用 android studio開發工具附帶的模擬器連線需使用
  localhost
  指令如下:
  adb connect localhost:5555
  adb connect 127.0.0.1:5555
google官方虛擬機有兩個版本:
     google play及google api版
     但google play版沒開放root權限
 
要操作虛擬機須進入 虛擬機shell command mode
指令如下:
 adb -s 127.0.0.1:5555 shell
 但以上指令有時並不是以root權限執行,
 如要以root 權限執行(有時可執行)
 adb -s 127.0.0.1:5555 shell root    

linux 不確定目錄在哪可下pwd指令:
ls list列出目前目錄的全部

早期 adb一旦連線就只需針對特定機器動作
但目前adb指令即使只有一台模擬器也需使用  -s 參數指定模擬器,規則如下:
adb -s 模擬器名:port
window 目錄用 "\",有磁碟概念
unix-like 目錄用 "/",沒有磁碟概念

目前adb指令新增了root 參數,可讓adb操作重新啟動在root權限下
 範例如下:adb -s 127.0.0.1;5555 root
 
adb -s 模擬器名:port pull <要取檔案或目錄> [<放到哪個路徑>]: 拉檔案或目錄出來
  範例:
  adb -s 127.0.0.1:5555  pull /data/data/com.example.sharepreferences/shared_prefs/PREF_LOGIN.xml e:\kotlin
  要取檔案或目錄 /data/data/com.example.sharepreferences/shared_prefs/PREF_LOGIN.xml
  放到哪個路徑 e:\kotlin
adb -s 模擬器名:port push <檔案或目錄> <推到哪個路徑>: 推檔案或目錄進去

adb install <apk>: 安裝 apk,當已經安裝過舊版本的程式時,可以使用 -r 去覆蓋。

2023/05/05紀錄 database inspect改版放在 app inspecte功能下,如何進入選 android studio 的view功能再選Tool window下就有app inspect

sqlite3  執行在 adb 連線狀態下,因權限限制必須abd先限特定模擬主機,再於 android linux terminal mode下
   執行下列文法:
    sqlite3 /目錄/目標.db
   範例:
    sqlite3 /data/data/com.example.app/databases/rssitems.db 

參照官網:https://developer.android.com/studio/command-line/adb?hl=zh-tw

2023年4月21日 星期五

sevlet的filter繼承版本及使用規則

繼承版本

早期是繼承 interface的 javax.servlet.Filter

servlet 4.0規格

是建議繼承 abstract class的javax.servlet.http.HttpFilter

兩種Filter基本建立規則一樣 

(2023/04/21 Eclipse 在自動建servlet 4.0的filter時,有點小錯,

  會同時繼承 javax.servlet.Filter,javax.servlet.http.HttpFilter

  實際繼承一個就可)

使用規則

使用web.xml紀錄filter,依照filter定義在web.xml順序執行filter chain

使用annation則依照filter class的class name編碼順序執行

   如AFilter.class,BFilter.class,CFilter.class順序執行

(2023/04/21 web.xml及annotation同時存在,竟然執行兩次,web.xml先執行

在執行annotaion設定的Filter,但不知是bug,還是規範如此) 


Filter 每一個是各自獨立,故Filter chain必須做到無相依

   例思考問題:壓縮Filter及浮水印Filter有先後必須完成順序

             但Filter各自獨立,也沒有一定執行規則順序?

Servlet 2.4規格定義了<dispatcher>標籤

<filter>

<display-name>AFilter</display-name>

<filter-name>AFilter</filter-name>

<filter-class>com.lccnet.AFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>AFilter</filter-name>

<url-pattern>/*</url-pattern><!-- url-pattern 與 單一servlet-name二選一 -->

<dispatcher>REQUEST</dispatcher><!-- 沒dispatcher預設 REQUEST -->

<dispatcher>INCLUDE</dispatcher><!-- dispatcher只能最多四個 -->

<dispatcher>FORWARD</dispatcher>

<dispatcher>ERROR</dispatcher> 

</filter-mapping>

 

2021年11月23日 星期二

Python set 集合運算


x = {"apple", "banana", "cherry"}
y = {"google", "sun", "apple"}
#交集
#z = x.intersection(y)
z=x&y
print(z)
#差集
#z2 = x.difference(y)
z2=x-y
print(z2)
#對稱差
#z3 = x.symmetric_difference(y)
z3=x^y
print(z3)
#聯集
#z4=x.union(y)
z4=x|y
print(z4)

2021年5月11日 星期二

Lg4j2 for JAVA動態網頁基礎使用(無maven)

每個Level有對應的intLevel整數值,數值越小等級越高,數值越大等級越低。

LevelintValue用途
OFF 0不輸出任何日誌
FETAL100造成應用程式停止的日誌
ERROR     
200造成應用程式錯誤的日誌
WARN300可能導致錯誤的日誌
INFO400一般資訊的日誌
DEBUG500除錯資訊的日誌
TRACE600更細的除錯資訊,通常用來追蹤程式流程的日誌
ALLInteger.MAX_VALUE輸出所有日誌

Logger輸出的等級大於等於Logger設定的等級時才會輸出訊息。

 高---------------------------------------低
 FETAL > ERROR > WARN > INFO > DEBUG > TRACE

要使用Log4j2需四個項目:(tomcat須為含7以上)

一.下載 apache Log4j2

     https://logging.apache.org/log4j/2.x/download.html

二.設定使用log4j-api-2.xxx.jar及log4j-core-2.xxx.ja進classpath

    如在Eclipse IDE中須將上述的兩個jar放入

     (a).webapps--> builderPath-->Libraries-->classpath

          可消除編輯程式碼的錯誤

     (b).DynamicWebProject下的WEB-INF/lib目錄

          可消除執行程式碼的錯誤

三.建立Log4j2的參數檔,檔名為log4j2開頭,副檔名及格式可為".properties","xml',"json" 

    以下是log4j2.xml範例

     ==================================================================

 <?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">  
   <Appenders>  
      <Console name="Console" target="SYSTEM_OUT">  
           <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />  
      </Console>  
   </Appenders>  
   <Loggers>  
       <Root level="info">  
           <AppenderRef ref="Console" />  
        </Root>  
    </Loggers>  
</Configuration>

     ==================================================================

   Log4j2的參數檔,放置位置有src,classpath及WEB-INF三個地方,JSP DynamicWebProject

   我建議 WEB-INF/classes目錄

 四.Log4j2的servlet及jsp範例程式如下:

    ==================================================================

package com.lccnet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
/**
 * Servlet implementation class Servlet1
 */
@WebServlet("/Servlet1")
public class Servlet1 extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public Servlet1() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        response.getWriter().append("Served at: ").append(request.getContextPath());
        Logger log = LogManager.getLogger(this.getClass());
        log.info("Show INFO message");
        log.warn("Show WARN message");
        log.error("Show ERROR message");
        log.fatal("Show FATAL message");
        /*
         * 高---------------------------------------低
         * FETAL > ERROR > WARN > INFO > DEBUG > TRACE
         * */

    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}
 

    ==================================================================

    ==================================================================

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="org.apache.logging.log4j.Logger,org.apache.logging.log4j.LogManager"%>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
Hello World!
<%
Logger log = LogManager.getLogger(this.getClass());
log.info("Show INFO message");
log.warn("Show WARN message");
log.error("Show ERROR message");
log.fatal("Show FATAL message");
%>
</body>
</html>

    ==================================================================