顯示具有 未分類 標籤的文章。 顯示所有文章
顯示具有 未分類 標籤的文章。 顯示所有文章

2020年2月20日 星期四

IntelliJ IDEA 創建 Servlet 並整合 Thymeleaf


1.File -> New -> Project

下面的 web.xml 看要不要產生,後面也還可以改
如果要 thymeleaf,就可以勾 thymeleaf,子選項都不用勾


2.產生後,加入 servlet 的 jar 檔

路徑選 tomcat 路徑下的 bin,抓 servlet-api 或整個資料夾都選


3.File -> Project Structure

如果一開始沒有選 web.xml,可在這裡加入


4.新增 Servlet

舊版的 IntelliJ 不一定會取 Create New Servlet,可能是 New Servlet 而已
如果是用 @WebServlet,要注意預設屬性是 name,但大部分是用 urlPatterns


5.Run -> Edit Configurations

Server 活頁標籤 Application server 要選中 tomcat 的路徑
下面還有 After launch,表示啟動後用什麼瀏覽器打開
Http port 寫你想要的 port

Deployment 的紅框部份的 context 是瀏覽器上要用到的路徑,假設寫 /test,那瀏覽器就要打
http://localhost:8080/test/index.html
又如果是寫 /,那就打
http://localhost:8080/index.html

※如果是 社區版,可以在 File >> Settings >> Plugins,搜尋 smart tomcat 來安裝
Deployment Directory 寫 jsp 的資料夾路徑,一定要有路徑,否則啟動不起來,亂指定沒關係,只差在顯示不了 jsp 的畫面而已
.配合 maven 或 gradle 就可啟動伺服器了,但 gradle 加入 servlet 時,用 providedCompile 時,必需再增加 id 'war',如下:
plugins {
    id 'java'
    id 'war'
}

.社區版也沒有用滑鼠點一點就有 Servlet 可用,只能自己寫了,要對 servlet 熟一點而已


※Thymeleaf


※如果一開始有勾 thymeleaf,且有寫代碼,那啟動伺服器時會報找不到 thymeleaf 的錯,要照這張圖的設定就可以了


※MyServlet.java

@WebServlet("*.do")
public class MyServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        response.setContentType("text/html;charset=UTF-8");
        //request.getRequestDispatcher("/WEB-INF/templates/welcome.html").forward(request, response);
    
        WebContext ctx = new WebContext(request, response, request.getServletContext(),
                request.getLocale());
        ctx.setVariable("now", LocalDateTime.now().toString());
    
        var templateResolver = new ServletContextTemplateResolver(request.getServletContext());
        templateResolver.setPrefix("/WEB-INF/templates/");
        templateResolver.setSuffix(".html");
    
        TemplateEngine templateEngine = new TemplateEngine();
        templateEngine.setTemplateResolver(templateResolver);
        templateEngine.process("hi", ctx, response.getWriter()); // 找 /WEB-INF/templates/hi.html
    }
}



※hi.html

<!doctype html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Thymeleaf Demo</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</head>
<body>
    <p th:text="#{xxx.ooo}">default text</p>
    <p>Date : <span th:text="${now}">no data</span></p>
</body>
</html>


※hi_en.properties

xxx.ooo=Hello! Thymeleaf!


git 專案

2019年9月13日 星期五

telegram BotAPI

安裝好 telegram 後,開啟 https://core.telegram.org/bots 文檔

開啟你的 telegram,然後點紅框的連結,即可加入 BotFather
指令查詢:輸入 /start 或 /help 會出現可以打得指令
/newbot 新增一個 bot

出現 Alright, a new bot. How are we going to call it? Please choose a name for your bot. 後
為你的 bot 取一個名字

取好後,會出現
Good. Now let's choose a username for your bot. It must end in `bot`. Like this, for example: TetrisBot or tetris_bot.

再取一個使用者名稱,一定要 bot 結尾
這個地方我試了好幾個名稱都不行

不行的訊息:
Sorry, this username is already taken. Please try something different.

成功後,會出現 Done! Congratulations on your new bot. You will find it at 開頭的
同時 telegram 也會增加一個 bot
Use this token to access the HTTP API 是取得的 token




可以使用 /token 和 /revoke 重新產生 token 和註消 token

如果按了清螢幕,所以看不到 token 了,還可以用 /mybots
然後點擊你取的 username,再點擊 API Token 即可

開啟群組:

/setjoingroups
@你的 username
然後開啟或關閉
這個功能能讓你的 bot 加入其他的群組
然後在 xxxbot 隨便打幾個字,然後新建群組後,將 xxxbot 加進去就可以對這個群發送訊息了




https://api.telegram.org/bot{你的 token}/getUpdates 可以取得你向你的 bot 發訊息的 json 內容
其中 id 表示此群的 id,如果有加入群組,每個群組的 id 會不一樣

加入群組:
創一個群組後,將機器人加入,並發訊息,然後在上面的網址 getUpdates 裡會有 id


使用 java 11 發送訊息:

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class TestTelegram {
    private final String TELEGRAM_TOKEN = "你的 token";
    private final String CHAT_ID = "你的群組 id 或機器人 id";
    private final String TEXT = "要發送的訊息";

    public static void main(String[] args) throws Exception {
        TestTelegram telegram = new TestTelegram();
        HttpClient client = HttpClient.newBuilder().build();
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(
                        "https://api.telegram.org/bot" + telegram.TELEGRAM_TOKEN +
                                "/sendMessage")
                )
                .header("Content-Type", "application/x-www-form-urlencoded")
                .POST(HttpRequest.BodyPublishers.ofString("chat_id=" + telegram.CHAT_ID + "&text=" + telegram.TEXT))
                .build();

        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        System.out.println(response.statusCode());
    }
}




使用 apache 發送訊息:
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost("https://api.telegram.org/bot" + 得到的 token +
"/sendMessage");

httpPost.addHeader("Content-Type", "application/x-www-form-urlencoded");
List<NameValuePair> urlParameters = new ArrayList<>();
urlParameters.add(new BasicNameValuePair("chat_id", CHAT_ID));
urlParameters.add(new BasicNameValuePair("text", TEXT));
httpPost.setEntity(new UrlEncodedFormEntity(urlParameters));

CloseableHttpResponse execute = httpClient.execute(httpPost);
execute.close();

2018年5月3日 星期四

Visual Studio Code 設定


※紅框可以設定顯視相關;綠框設定快速鍵



※文字字型大小


左邊是預設值,不能改,只能覆蓋,使用右邊來覆蓋



※快速鍵


由於本人使用 Eclipse 已經習慣了,所以列出幾個常用的快速鍵
Move Line Up:Alt+Up
Move Line Down:Alt+Down
以上兩個內鍵就已經是這樣子了

Copy Line Up:Ctrl+Alt+Up
Copy Line Down:Ctrl+Alt+Down
Delete Line:Ctrl+d
Format Document:Ctrl+Shift+f
Transform to Uppercase:Ctrl+Shift+x
Transform to Lowercase:Ctrl+Shift+y



2017年12月15日 星期五

Windows 批次檔-迴圈、if

※迴圈

help for 看文檔
在批次檔裡變數用兩個 %;cmd只要一個 % 即可
變數名有區分大小寫,其他沒有
如果批次檔沒有寫好,會閃一下就結束了


※檔案(不加參數)

@echo off
::列出當前路徑的所有檔案名稱,只有檔名
::for %%i in (*) do echo %%i
for %%i in (*) do (
    echo %%i
)
    
echo.
echo.
    
::列出指定路徑下的所有副檔名為txt的檔案名稱,路徑+檔名
for %%j in ("C:\Program Files\Java\jdk1.8.0_121\*.txt") do echo %%j
pause

※如有多個指令要操作,可像此例用「( )」包起來

※do 後面不能換行,至少要有「(」


※目錄(/d):directory

@echo off
::列出當前路徑的所有目錄名稱,只有目錄名稱
for /d %%i in (*) do echo %%i
    
echo.
echo.
    
::列出指定路徑的所有目錄名稱為j開頭的,路徑+目錄名
for /d %%j in ("C:\Program Files\Java\jdk1.8.0_121\j*") do echo %%j
pause




※遞迴(/r):recursive

@echo off
::列出當前路徑的所有檔案名稱,路徑+檔名
for /r %%i in (*) do echo %%i
    
echo.
echo.
    
::列出當前路徑的所有目錄名稱,路徑+目錄名且以\.結尾
for /r %%j in (.) do echo %%j
    
echo.
echo.
    
::列出指定路徑下的所有副檔名為txt的檔案名稱,路徑+檔名
for /r "C:\Program Files\Java\jdk1.8.0_121" %%k in (*.txt) do echo %%k
pause

※檔案和目錄都只有操作一層而已,但用遞迴可以從最外層到最裡層拆開


※列出(/L):list

@echo off
::列出-5到100,每次增加5的數字
for /L %%i in (-5,5,100) do echo %%i
    
echo.
echo.
    
::新增xxx1~xxx3的目錄
for /L %%j in (1,1,3) do mkdir xxx%%j && echo 新建xxx%%j目錄成功
pause

※第一和第三個參數是開始和結束,中間是增加或減少,顯示出來的是數字

※L 最好用大寫,避免混淆



※檔案內容(/f)

一行一行的抓取檔案內容,要注意 delims 的預設是空格、換行
( )裡有三種 1.檔名  2.命令(用`包起來)  3.字串(用"包起來)

※test.txt

aaa,
bbb,
ccc,
ddd,
eee,
fff,
ggg,
hhh,
iii,
jjj,



※test2.txt

kkk,
lll,
mmm,
nnn,
ooo




::基本款,多檔用空格隔開
for /f %%i in (test.txt test2.txt) do echo %%i
    
::直接寫字串,但我不知道怎麼寫換行
for /f %%i in ("abcde") do echo %%i
    
::如果檔名有空格,必須用"包起來,但會被誤認為字串,所以前面加上 usebackq 即可
for /f usebackq %%i in (test.txt "test 2.txt") do echo %%i
    
::使用命令時也一樣,一定會有空格,所以也要加上 usebackq
for /f usebackq %%i in (`type test.txt`) do echo %%i
    
::換行改成用,,這樣就不是預設的空格、換行了
for /f "delims=," %%i in (test.txt test2.txt) do echo %%i
    
::每個檔案忽略前三行
for /f "skip=3" %%i in (test.txt test2.txt) do echo %%i
    
::可以混合使用
for /f "delims=,skip=3" %%i in (test.txt test2.txt) do echo %%i
    
::忽略 f 開頭
for /f "eol=f" %%i in (test.txt test2.txt) do echo %%i
    
::特殊語法
for /f %%i in (test.txt test2.txt) do echo %%~di%%i

※特殊語法可參考文檔



※tokens

行中的內容

※test3.txt

a b c d e f g h i j
k l m n o p q r s t


::取2到5個(注意預設是以空格換行區分第幾個),2到5有4個變數,直接用即可,不用宣告
for /f "tokens=2-5" %%i in (test3.txt) do echo %%i %%j %%k %%l
    
::取第2個之後,%%j表示第3個到最後
for /f "tokens=2*" %%i in (test3.txt) do echo %%i %%j
    
::取2和4,然後7到9,所以有5個變數
for /f "tokens=2,4,7-9" %%i in (test3.txt) do echo %%i %%j %%k %%l %%m

※變數宣告為%%i,注意後面是依序的,如%%i、%%j、%%k…
又如果是宣告為%%a,那後面自然就是%%b、%%c…

※變數不一定要拿來用,也不一定要先印 i 才能印 j,隨自己需求



※if


@echo off
setlocal
    
set a=apple
set b=banana
    
if /i "%a%" == "APPLE" (
    echo is apple
) else (
    echo is not apple
)
    
if not "%b%" == "banana" (
    echo is not banana
) else (
    echo is other
)
    
endlocal
pause

※/i 是忽略大小寫,注意繁中版的文檔寫錯了;not 可判斷相反的情形

※/i 和 not 都不是必要的

※判斷除了上面 2 種以外,還有 6 種
equ:equals,等於,等同此例的 ==
neq:not equals,不等於,等同此例的 not ==
lss:less,小於
leq:less equals,小於等於
gtr:greater,大於
geq:greater equals,大於等於


※exist

@echo off
setlocal
    
if exist "x.txt" (
    echo o
) else (
    echo x
)
    
endlocal
pause

※判斷本路徑下有沒有 x.txt 這支檔案或目錄


※迴圈裡判斷檔案

@echo off
setlocal
    
for %%i in (*) do (
    ::if exist "fileName" (
    if "%%i" == "fileName" (
        echo o
    ) else (
        echo x
    )
)
    
endlocal
pause

※如果在迴圈裡判斷,不要用 exist,它只要路徑下有,所有迴圈都會認為是有,除非剛好此路徑下只有一支檔案


※迴圈裡判斷目錄

@echo off
setlocal
    
for /d %%i in (*) do (
    ::if exist "folderName" (
    if "%%i" == "folderName" (
        echo o
    ) else (
        echo x
    )
)
    
endlocal
pause

※同樣的,也不要在裡面判斷目錄,它只要路徑下有這個目錄,所有迴圈都會認為是有,除非剛好此路徑下只有一個目錄


※判斷變數

@echo off
setlocal
    
set a=aaa
if defined a (
    echo have a
)
    
endlocal
pause

※使用 defined 判斷有沒有變數

2017年12月14日 星期四

Windows 批次檔-一般命令

可用 「help 命令名稱」看教學


※echo

echo:顯示目前是關閉或開啟
echo xxx:印出xxx
echo.:印出空行,文檔沒有
echo off:關閉左邊的 "C:\USERS\USER>"
echo on:與 echo off 相反
@echo off:和 echo off 一樣,但連本身這一行都不顯示,執行批次才看得出來





第一行可看出有沒有@的差別


※rem

註解,網路上有人也可用「::」,文檔並沒有說明,但我試的結果是可以的
注意,要寫在最前面才行


※pause

螢幕暫停,讓使用者按任意鍵繼續


※call

呼叫另外一支批次檔


※set

針對變數增刪改查,但批次檔一關閉就沒了
增:set a=apple,設定 a 是 apple
刪:set a=,設定為空就是刪除
改:set a=apples,key一樣,value不同就會修改了
查:set,1.什麼都不用加就能查看全部的變數  2.set a 為查看 a 開頭的變數

set a=apple
如果要用 echo 顯示,就要用%將變數包起來,注意「=」的前後不可空

使用 echo 時,內鍵命令也可用 %包起來,如 date、cd、windir、systemroot…等


※setlocal、endlocal


這兩個命令包起來的變數是區域變數

※setVar.cmd

@echo off
echo -----setVar.cmd start-----
set b=banana
    
setlocal
set c=cat
echo %b%,%c%
endlocal
    
echo %b%,%c%
echo -----setVar.cmd end-----
pause



※setVar2.cmd

@echo off
echo -----setVar2.cmd start-----
echo %b%,%c%
call setVar.cmd
echo %b%,%c%
echo -----setVar2.cmd end-----
pause


倒數第二行的 setVar2.cmd end 可看出 banana 是抓的到的,但區域變數 cat 抓不到


2017年11月28日 星期二

Shell script 快速入門

第一行是 #!/bin/bash/
bin/bash 是大部人用的,也是預設的 shell,可看 /etc/passwd 的最後一個欄位


※參數

假設檔名叫 xxx.sh,下 xxx.sh aa bb
$#:表示有幾個參數,此例為 2
$0:xxx.sh,也就是檔名
$1:aa
$2:bb
一直到$9,10以上要用 {} 包起來,如 ${12}
$*:表示所有參數,整個參數是一個整體,如"$1 $2 $3",參數和參數之間用空隔隔開
$@:也表示所有參數,但每個參數是分開的,如 "$1" "2" "$3",參數和參數之間用空隔隔開
以上兩個需視情況用「"」包起來使用
$$:processID,ps -aux 可查看
$?:讀取上一行指令有沒有錯誤,沒錯回傳0,否則回傳錯誤代碼,最多255,如果超過255,那就是除 256 的餘數
man bash ,搜尋  ^exit status

※test.sh
#!/bin/bash
echo $#
echo $@
echo $0
echo $1
echo $$
echo $?
#echo xxx "aaa" "bbb"

xxx(){
    echo $1 $2
}
xxx "aaa" "bbb"

※./test.sh a b cccc de 結果為
4
a b cccc de
test.sh
a
547
0
aaa bbb

※./和sh可執行shell,但./需要w權限


※變數

a=apple(=前後不可有空格,字串有空格時,用「'」或「"」包起來)
echo $a 印出a變數
export aaa 將aaa變數提升為系統變數
source xxx 因為提升為系統變數後,要重登入才有效,懶得重登入就可用這個指令
unset xxx 刪除xxx變數

「`」鍵盤左上角下來一格的按鍵,可用這個包指令,然後串接字符串
如:echo xxx `date` ooo


四則運算(+-*/%)和test

$a+$b 用 $(( 和 )) 包起來,然後裡面的$可有可無-> $((a+b))
無法用小數點

${#a}:長度
${a:2}:最前面扣2長
${a:2:4}:最前面扣2長後,取4長
${a#a*c}:從前面開始刪除abc,刪一次(勉強)
${a##a*c}:從前面開始刪除abc,(貪婪)
${a%a*c}:從後面開始刪除abc,刪一次(勉強)
${a%%a*c}:從後面開始刪除abc,(貪婪)


test

-f -d -r -w -x
test -f $f && echo "is a file" || echo "isn't a file"
&& || 為三元運算子


[]

1.前後必需空格
2.變數要用「"」包起來
[ "$a" == '5' ] && echo "yes" || "no"
== != -eq -ne -gt -ge -lt -le


※條件

if

read xxx

if [ "$xxx" == '1' ]; then
elif []; then
else
fi

/proc/cpuinfo
/proc/meminfo

-a 且
-o 或

if [ "$xxx" == 'a' -o "$xxx" == 'd' -o "$xxx" == 'xx' ]


case

read n
case "$n" in
'a') echo 'aaa';;
'b') echo 'bbb';;
  *) echo '***';;
esac


※陣列

xxx=("aaa" "bbb" "ccc")
echo length:${#xxx[@]}
for((i=0; i<${#xxx[@]}; i++)); do
      echo ${xxx[i]}
done

※迴圈

while

while 條件; do

done;

while [ "$i" -le 10 ]; do
  echo "$i"
  i=$((i+1))
done


until

#觀念和 while 相反,判斷式為 true 時停止
until 條件; do

done;

until [ "$i" -gt 10 ]; do
  echo "$i"
  i=$((i+1))
done

for

for (()); do
  內容
done;

for ((i=0;i<10;i++)) do
  echo "$i"
done

for in

for x in aaa bbb ccc; do
  echo "$x"
done

2017年11月27日 星期一

linux 用戶指令快速入門

※一般命令

echo xxx && ooo
ls  -l    --all = -a    --human-readable = -h  --inode = -i,看多檔用空隔隔開
pwd
whoami
cd
tree
date '+%Y/%m/%d %H:%M:%S',%a %b %Z
cal
mkdir
rmdir:刪除空目錄
cp --recursive = -r   --interactive = -i:windows為 xcopy /E /H 
mv --interactive = -i:windows為 move
rm --recursive = -r   --interactive = -i:
      windows 分兩步,為 [del|erase] /S /Q bbb && [rmdir|rd] /S /Q bbb 
touch xxx.txt,windows 為 type nul > xxx.txt
man: see also -> man [number] command
cat --number = -n
tac
tty
history    !!:上一個命令     !c:最接近c開頭命令    !號碼
file 查看是什麼檔案
more
less

grep,過濾結果,windows 有類似的,如 netstat -ano |find ":80"
-A -B -C 還蠻好用的
cat xxx.txt |grep abc -A 5:表示找xxx.txt裡有abc這行和之後的5行,找到多個會用「--」隔開
-B:之後
-C:前後,可以不打-C,直接打數字即可

|
head -行數,預設 10 行
tail -行數 --follow = -f:f 不能和 -行數一起使用,功能是畫面停住,等待新的訊息進來,然後顯示,Ctrl + c 可離開
ln


※vim

visual(視覺的) improved(改進過的),因為原本是 vi,改進過後是 vim
man vi 可查參數,再按 h 可查文檔

命令模式

剪下:[number]D
複製:[number]yy,yank 為使勁拉的意思
貼上:[number]p
刪除:[number]dd
上一次修改:u
下一次修改:Ctrl + r
上一頁:Ctrl + b (before)
下一頁:Ctrl + f (after)
到某一行:ngg 或打「:」加行數

切換成編輯模式:a、i、o、A、I、O
切換成搜尋取代模式::、/、?


編輯模式

回命令模式:Esc


搜尋取代模式

:

數字:跳到某一行
set nu:顯示行號,如果想一進去就有行號,可用臨時的 vi -c "set nu" 檔名,或用永遠的方法,在 ~裡,創建 .vimrc 或 .virc 檔案,將 set nu 打進去存檔,這樣以後開所有檔都有行號了,是針對當前使用者的設定,vi 開頭的用 vi; vim 開頭的 用 vim,當然也可以兩個檔案都打
set nonu
set ignorecase:預設搜尋、取代時,是有分大小寫的,可打上這個命令來忽略大小寫
set noignorecase
set nohl:no high light,搜尋完後,下次進去,預設會高亮,可用這個指令
w
q
q!

取代,如「1,$s/xxx/ooo/gci」,第一行到最後一行,將 xxx 取代成 ooo
    「.,$s/xxx/ooo/gci」:目前行到最後一行
    「%s/xxx/ooo/gci」:第一行到最後一行,和 1,$s 一樣
g 為全部取代,沒加只取代一個
c 為檢查,會有 y/n/a/q/l/^E/^Y 的提示,yn就不說了
    a 表示目前到之後都取代
    q 表示不取代,並且直接離開
    l 表示取代目前這一個,並且直接離開
    ^E 表示跳上一頁
    ^Y 表示跳下一頁
    但 ^E 和 ^Y 我不知道要怎麼按
i 為不區分大小寫,也可用 上面的 set ignorecase

:2,10y:複製 2~10 行
:2,10d:剪下 2~10 行
:2,10y co 15:複製 2~10 行並貼到 15 行
:2,10y m 15:剪下 2~10 行並貼到 15 行

/

尋找,如「/xxx」,搜尋 xxx,然後使用 n|N可往下往上搜尋
搜尋完整單字,如 do、doc、dock,使用 /do 時,三個都會找到
可用 /\<do\>,使用「<」「>」包起來,但要用跳脫字元「\」就可以找完整的單字
又如果下/\<[dD]o\>,那會找 do 和 Do

?

同 / 的尋找,但一開始是下往上尋找,一樣用n|N找


回命令模式:Esc

多檔編輯

vim -o,水平,使用 Ctrl + w 後,按左或右切換
vim -O,垂直,使用 Ctrl + w 後,按上或下切換
vim -p 檔一 檔二,命令模式使用 :tabn 或 :tabp 切換
vim 檔一 檔二,命令模式使用「:sp 檔名」,然後使用 Ctrl + w ,上或下切換


※alias

alias vim='vim --cmd "set nu"',但登出後就沒了
將上一行打在 ~/.bashrc 裡,然後使用 source ~/.bashrc 或者下次登入就會生效了
unalias 為相反的命令

/etc/profile 全域環境變數     ~/.bash_profile 使用者環境變數
/etc/bashrc 全域 bash shell    ~/.bashrc 使用者 bash shell


※標準輸出入、標準錯誤輸出

< 檔案
<< 文字結束
>、1>
>>、1>>
2>、>&
2>>、>>&
&>

wc < /etc/passwd 行、單字、容量
wc < test1 >> test2


※搜尋

which:查尋環境變數的可執行程序,結果只有路徑
whereis:自訂的資料庫,結果有可執行命令 設定檔 手冊
locate:自訂的資料庫(var/lib/mlocate),比 whereis 更詳細,模糊查尋
find:最後的絕招, find /home -name xxx
find 後面接要搜尋的路徑,不打就是當前的路徑
-atime
-mtime 3 前三天的那一天,檔案內容有被修改過的
  +3 3天之外
  -3 3天之內
-ctime

-user 帳號名
-group 用戶組
-nouser 不屬於任何用戶
-nogroup 不屬於任何用戶組

-name 檔名或目錄名,可用通配符,但要用「'」包起來,如 '*bru*'
-iname 檔名或目錄名(不分大小寫)

-type f,查找檔案,l、d為連結和目錄
-size +100k:大於等於100K的文件
-perm +7000:找特殊權限
-exec 找到後執行命令,一直找到「;」之前
{}:會被替換當前的檔名
\:每個系統的「;」有可能有不同的意義,所以加上這個跳脫字元
例:
find -name 'test[34]' -exec sed -i 's/aaa/zzz/g' {} \;
sed 指令說明
find 指令說明

搜檔案內容
find /etc -name "*.text" -exec grep -H "xxx" {} \; 在 /etc 下搜尋 .text 結尾的檔案,內容含有 xxx的,--with-filename = -H 為列出路徑


※ls -l  的訊息

drwx-w--wx 2 bruce root 4096

d、-、l 目錄 檔案 連結

rw-r-x-wx
三個一組,分別表示權限,擁有者 群組 其他

目錄
r:查看目錄內容
w:增刪改
x:進入目錄

檔案
r:查看檔案內容
w:增刪改
x:執行

2 為檔案數量,目錄至少有.和..,不包括子目錄;檔案一定是 1
擁有者是誰
群組名
檔案大小(Byte)
Mtime
檔名

除了 root 外,擁有者、群組、其他人只能有一個角色
例如有一個使用者,是 A 檔的擁有者也是群組,此時若擁有者的權限不足,並不會抓群組的權限

※mtime、ctime、atime 區別

mtime:檔案內容最後被修改的時間,ls -l
ctime:檔案的內容、屬性最後被修改的時間,如修改權限、修改擁有者、改檔名,ls -cl
atime:最後被讀取的時間,vi 開啟就會讀到了,但 echo 不會讀到,ls -ul,但在安裝作業系統時可以選擇不要更新 atime,可以增進效能


※su、su -、sudo

su:切換成 root,shell 不切換
su -:切換成 root,shell 也切換
以上兩個後面如果接使用者,就會切換到那個使用者,輸入的密碼為切換帳號的密碼

sudo:臨時切換成 root,必需先設定 /etc/sudoers,可用 vi /etc/sudoers 或者 visudo 編輯,
輸入的密碼為自己的密碼

帳號     來源主機名稱=(可切換的身份)     能下什麼指令(絕對路徑)
root ALL=(ALL) NOPASSWD: ALL
root 這個帳號從任何主機連進來都可用現在的設定,可切換任何身份執行任何命令
其中(ALL) 和 NOPASSWD: 可以不寫
(ALL) 表示切換哪個帳號的身份,不寫就是 root,ALL 表示任何帳號
NOPASSWD: 注意最後有個冒號,不寫預設是要打密碼的,打登入時的密碼,不是切換誰的密碼

xxx 192.168.0.1=(ooo) /aaa/bbb,/aaa/ccc
xxx 這個帳號從 192.168.0.1 這台主機連進來可用現在的設定,可切換成 ooo 
這個帳號,執行 /aaa/bbb 和 /aaa/ccc 這兩支程式

%zzz ALL=(ALL) ALL
加上「%」就變成群組了
zzz這個群組從任何主機連進來都可用現在的設定,可切換任何身份執行任何命令

sudo 指令說明



※背起來

rsync -avzhpr

a --archive
v --verbose
z --compress
h --human-readable
p --perms:preserve permissions
r --recursive


tar -zxvf -cvf

c --create
z --gunzip
x --extract
v --verbose
f --file

.tar.gz -> zxvf
.tar -> xvf
cvf -> 打包

rpm -ivh -Uvh -qa -e

i --info
h --hash
U --upgrade
q --query
a --all
e:erase,御載

rpm -Uvh
rpm -qa |grep httpd

rpm 必須自己解決依賴關係


yum [-y] [install | remove | update | search | list | list installed]

search:列出伺服器上可貨下載的
list:列出伺服器上可供下載和已安裝的
list installed:列出已安裝的
update:更新某個套件,如果後面不加套件,會整個系統更新

yum 底層還是 rpm,但會幫我們解決依賴關係



編譯

下載源碼後,如 nginx,然後 wget xxx 並解壓後進目錄
./configure --prefix=/xxx/ooo
make && make install
以上三步搞定,但有時候第一步有依賴問題會報錯,根據報錯的訊息下載,然後再重做一次,只要有錯就得重做
※「./」開頭是一定要加的,通常環境變數不會有設定你下載的路徑,在 linux 裡,只要是執行檔就是綠色的,執行時環境變數沒有時,就要加「./」,表示當前層
但有六個目錄例外:
bin
usr/bin
usr/local/bin

sbin
usr/sbin
usr/local/sbin

有錯時,如沒有 pcre,那就在下載時,後面加上 -devel,是 develop 的簡寫,通常開發會比較多東西
yum -y install pcre-devel

搞定後,去 --prefix 的目錄查看



2017年8月3日 星期四

IntelliJ IDEA 設定

以 2017.2.1 版本為例,以下都是以File-->Settings...進入的畫面

編碼:



※搜尋「encoding」,將編碼改為 UTF-8,這一版只有 FIle Encodings 和 SSH Terminal 需要改


字型:


※本人就愛「Consolas」


外觀主題:





快速鍵:


※直接套用個人愛用的快速鍵


Content Assist:


※Content Assist 在Eclipse 通常都是 Alt + /,而 IntelliJ 不叫Content Assist,叫 Basic Completion,預設是 Ctrl + Space

※IntelliJ 按下按鍵打字後,會自動幫我們按下 Basic Completion,但預設第一個字是有分大小寫的,如不想分可以在最上面的 Case sensitive completion (預設是 First letter) 改成 None

※如果不喜歡使用 Ctrl + Space,可以如下設定

※設定完後,上一張圖片的 Code Completion 的 Ctrl + Space 也自動會改掉

※改完後,最上面的 Keymap,我原本是選 Eclipse,會變成 Eclipse copy 1 (因為修改了原本的),想刪除可以按旁邊的齒輪圖示,裡面有選項 (但刪除了,快速鍵也沒了)


debug 時查看集合的 table


取消勾選 enable alternative view for collections classes



main 方法和 syso:


※psvm 是取最前面的字,也可以在中間的綠框改成自己喜歡的;右下的綠框是打好自己設定的字後,按下什麼按鍵會變成 Template text 裡的文字

※syso 變成 sout 了

※可以改成 syso,output 下面還有一個 plain,裡面也有一些好用的快速鍵


import:


※上面的表示 class 有幾個一樣就 import xxx.ooo.*

※下面表示 name 有幾個一樣就 import static xxx.ooo.*



Emmet:


※表示按下什麼按鍵會變成 HTML,如下:
html>head>title+script^body>div#ddd+span.sss
--------------------------------------------
<html>
    <head>
        <title></title>
        <script></script>
    </head>
    
    <body>
        <div id="ddd"></div>
        <span class="sss"></span>
    </body>
</html>

※第一行按下 tab 後,就會變成虛線下的 HTML 了

※tab 只會執行鼠標前面的部分,所以一定是將鼠標放在最後面



自動出現返回值:

Alt+Shift+L
搜尋 Introduce Variable 可改


固定開新視窗:

如果想開啟兩個以上的專案,每次都會出現一個訊息,問你是要在這個視窗替換掉原本的專案,或是開一個新的視窗,這很煩啊!通常都是開新視窗,可以如下設定




新增 Maven、Gradle 專案:

File --> New --> Project...

maven:



gradle:


再下一步,和 maven 一樣,都要設定 GroupId、ArtifactId、Version,只是 gradle 叫 Group、Name、Version



然後會自動將相關的檔案生成,其中有一支檔案叫 build.gradle,裡面有 dependencies,將紅框的部分貼下去,就會生成左下綠框的 jar檔

紅框要去哪複製?和 maven 一樣,都是 MVN Repository

※紅框的部分可以發現有 7 種,其中是 maven 和 gradle


※使用變數

def springVersion = '4.3.11.RELEASE'
    
dependencies {
    // compile "org.springframework:spring-core:${springVersion}"
    // compile "org.springframework:spring-context:${springVersion}"
    compile group: 'org.springframework', name: 'spring-core', version: "${springVersion}"
    compile group: 'org.springframework', name: 'spring-context', version: "${springVersion}"
}

※有以上兩種寫法,要注意「'」和「"」



※增加 Tomcat

File-->Settings 後,如下操作:






※先選左邊的 + 號

※綠框要選自行下載的 Tomcat




這邊預設是 /,如果有打什麼,上一頁的網址列會自動變化,啟動伺服器要用這個網址列訪問



成功後,會發現有剛剛自己的別名



※增加 Tomcat jar 檔



左邊的 + 號是視別用的名稱,右邊的 + 號是裡面放的 jar 檔



※增加 web.xml


File --> Project Structure 後,如下操作:





※新建 Servlet 專案

File -> New -> Project


※看需不需要 web.xml,可以勾或不勾

※ Tomcat 的設定和上面一樣

※Servlet 範例


@WebServlet("/xxx")
public class TestController extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=UTF-8");
        resp.getWriter().println("<h1>Hello! Servlet</h1>");
    }
}

※ jsp 範例


<%@ page contentType="text/html;charset=UTF-8" %>
<html>
<head>
    <title>我是標題</title>
</head>
<body>
<a href="<%=application.getContextPath()%>/xxx">go</a>
</body>
</html>

2017年6月22日 星期四

電腦小算盤 (標準) 的使用

※灰底的使用



※開啟電腦的小算盤後,左邊的圖右邊拉大一點,會變成右邊的圖

※拉大後,兩個橘框會變成「歷程記錄」和「記憶」兩個頁籤

※綠框、C和CE的差別:
假設打了2+678,如下圖


刪除(以下的刪除不包括記憶體刪除):
按綠框(有些版本是向左的箭頭圖)會刪除8,再按一次會刪除7,依此類推
而按「CE」鍵會一次清除678,變成中間的圖
按「C」鍵會回復什麼都還沒輸入的狀態



※M+、M-、MC、MR、MS 的使用

M = Memory
MC = Memory Clean ,清除記憶體
MR = Memory Recall ,叫出記憶體的數字
MS :使用當前數字取代記憶體的數字

要注意一開始,「MC」「MR」是灰色(disabled)的,如果不是灰色的,表示有上次計算的記錄


※假設 (3 + 2) x (4 + 5)
1.得到 5 後,按「M+」,右邊的「記憶」頁籤會顯示
2.得到 9 後,按「*(乘號)」鍵
3.按「MR」會將記憶體的值叫出來,也就是 5,這是按「=」即可
4.按「MC」清除記憶體

※假設 (2 x 3) + (4 x 5) - (6 x 7)
1.得到 6 後,按「M+」,右邊的「記憶」頁籤會顯示 6
2.得到 20 後,按「M+」,右邊的「記憶」頁籤會顯示 26
3.得到 42 後,按「M-」,也就是26 + (-42) 的意思
4.按「MR」取得結果
5.按「MC」清除記憶體

2017年3月15日 星期三

Linux 的連結和 Windows 的 mklink

不管是Linux 還 Windows ,連結檔的容量都是很小的

Linux

ln [-s] 已有的檔案或目錄名稱 檔案或目錄名稱

硬連結

    語法:ln <目的> <來源>
    1.將一個檔案硬連結和多個檔案以後,假設是5個,刪除其中1~4個不會影響本來的檔案
    2.只能是同一個檔案系統
    3.inode 一樣
    4.只能操作檔案
    5.ls -l 查看時,第一個並不是L,是-

軟連結

    語法:ln -s <目的> <來源>
    1.目的檔案若被刪除,則來源會出現錯誤
    2.可跨越不同的檔案系統
    3.inode 不同
    4.ls -l 查看時,是 L
    5.-s = --symbolic

還有一個參數 f,意思是如果目的檔已經有了,會先刪除再新增



Windows

以下是用Windows 7 的實驗,必需有管理的權限來操作,而且來源的檔案或目錄不可存在
mklink [/H /S /J] 檔案或目錄名稱 已有的檔案或目錄名稱

先切換到想連結的地方,然後如下操作

硬連結(Hard)

    語法:mklink -h <來源> <目的>
    1.只對檔案有效,如果目的為目錄,會出現「存取被拒」
    2.也只能在同個槽才行,如 C 槽不能到 D 槽

軟連結(Symbolic/Soft)

    語法:
        針對檔案:mklink <來源> <目的>,如果目的為目錄會成功,但沒作用,無意義
        針對目錄:mklink -d <來源> <目的>,如果目的為檔案會成功,但點下去會報錯,無意義

NTFS 連結(Junction)

    故名思義,檔案系統是NTFS才可使用,在X槽按右鍵-->屬性的一般活頁標籤可看到
    但只能使用在目錄
    語法:mklink -j <來源> <目的>,目的為檔案會成功,但點下去會報錯,無意義

軟連結的目錄和 NTFS 連結的差異

1.右鍵屬性時,軟連結會多一個 Shortcut 的活頁標籤

2.使用 dir 指令時,軟連結是<SYMLINK>,NTFS 連結是<JUNCTION>

3.複製時不同,將這兩個連結複製到其他的目錄後
    .軟連結只有原本的目錄才可以連
    .NTFS 連結無法複製,複製完後到目的資料夾貼上時,沒有作用

4.移動時不同,將這兩個連結剪下到其他的目錄貼上後
    .軟連結真的會移動,也可連結
    .NTFS 連結會複製一份到新的目錄,原本的還可以連結,但複製後的不行
    ※注意 NTFS 連結還會將原本目錄的所有檔案、目錄全部移動到新的目錄,造成原本的目錄 是空的情形,此時所有連結裡面都是空的



2016年8月30日 星期二

Eclipse 和 Android Studio 的快速鍵和一些好用的功能

由於版本的不同,快速鍵不一定就是下面寫的按法,所以我將Command打上,
如果有衝突,不一定優先權一定是Eclipse比較高,如Ctrl+Alt+Del,此時會打不出來,這時就可以設定別的快速鍵

※Eclipse

Window-->Preferences-->General-->Keys

※也可以在綠框搜尋「keys」

※Scheme是Default的,待會下面打的快速鍵是針對這裡打出來的

※橘框可以裡面的文字,通通都可以搜尋,和Android Studio不一樣

※在藍框將滑鼠游標放進去,然後打裡想打的快速鍵即可

※以下列出常用快速鍵,「:」左邊是圖的Command

快速完成

Content Assist:Alt+/
Window-->Preferences-->Java-->Editor-->Content Assist
在右邊的紅框裡,預設是「.」,只要打裡面的按鍵,也會跳出Content Assist

整行往上複製,可選多行

Duplicate Lines:Ctrl+Alt+Up

整行往下複製,可選多行

Copy Lines:Ctrl+Alt+Down

整行往上移動,可選多行

Move Lines Up:Alt+Up

整行往下移動,可選多行

Move Lines Down:Alt+Down

游標的上一行多一個空行

Insert Line Above Current Line:Ctrl+Shift+Enter

游標的下一行多一個空行

Insert Line Below Current Line:Shift+Enter

游標反白的部分變大寫

To Upper Case:Ctrl+Shift+X

游標反白的部分變小寫

To Lower Case:Ctrl+Shift+Y

刪除行,可選多行

Delete Line:Ctrl+D

需要Import的Import,不需要的移除,有兩個以上可Import的會跳出視窗供選擇

Organize Imports:Ctrl+Shift+O

到指定的行數

Go to Line:Ctrl+L

游標在括號 (花括、角括、圓括) 使用,游標會跳到[開始 | 結束]

Go to Matching Bracket:Ctrl+Shift+P

單行[移除]註解,也可以選多行,不管是java、javascript、HTML、XML都可以

Toggle Comment:Ctrl+Shift+C

上一個呼叫的程式碼

Backward History:Alt+Left

下一個呼叫的程式碼

Forward History:Alt+Right

排版

Format:Ctrl+Shift+F

整體重命名

Rename:Alt+Shift+R

自動增加[全域 | 區域]變數

在沒有變數名的地方按Ctrl+2後,右下角出現提示
全域變數
Quick Assist - Assign to field:Ctrl+2, F
區域變數
Quick Assist - Assign to local variable:Ctrl+2, L


這樣子的快速鍵就差不多了,其他建議用滑鼠去按,如下:
按右鍵

字型、文字大小

※右邊的Text Font最上面是Basic

顯示行號

打程式碼的左邊那一條按右鍵可顯示行號,會自動將下選的路徑打勾

程式碼的task

預設有FIXME、XXX、TODO 3種,而且預設一定要大寫,程式碼的右邊才會出現藍色的

看上圖就知道還可以增加,修改優先權、區分大小寫
FIXME:寫錯了
XXX:寫了,但可以寫的更好
TODO:還沒寫

搜尋所有專案的task可以用Window-->Show View-->Other...,然後在General下有個Tasks

優先權是High的會有紅色的驚嘆號
Path是專案名稱+package名稱
Resource是檔案名稱

內鍵的快速功能

打main就會出現下面的效果,${cursor}表示打完後游標出現的位置

按右邊的New按鈕可以自定
這是我自定的,打insert就會出現下面的字串,綠框還有很多${}這樣的東西,我只會${cursor}而已



※Android Studio

File-->Settings-->Keymap

※Keymaps是Default的,待會下面打的快速鍵是針對這裡打出來的

※對要設定的快速鍵按兩下會出現提示,第一個是鍵盤快速鍵、第二個是滑鼠快速鍵、第三個是縮寫

滑鼠快速鍵有:左鍵、中鍵、右鍵、滾輪向上、滾輪向下5種,要在滑鼠圖示地方按才可以,按兩個鍵以上看來是沒有用的

縮寫用法是設定完後,在程式碼區按兩下Shift,會跳出一個視窗,將剛剛設定的文字打在裡面就會搜尋到,這時在按下去就可以了

※注意搜尋時,只會搜尋左邊的文字

※以下列出常用快速鍵

快速完成

如下圖Ctrl+Space和Ctrl+Shift+Space
打字打到一半按Ctrl+Space,預設是有分大小寫的,我的2.1.3版預設是First letter
First letter:第一個字區分大小寫
All:全部區分大小寫
None:不分大小寫
改成None就和Eclipse一樣了

整行往下複製,可選多行

Duplicate Line or Block:Ctrl+D
選多行時,要把每一個都拖到,這點和Eclipse不同,且複製的點是在最後一行的最後面

整行往上移動,可選多行

Move Line Up:Alt+Shift+Up

整行往下移動,可選多行

Move Line Down:Alt+Shift+Down

游標的上一行多一個空行

Start New Line Before Current:Ctrl+Alt+Enter

游標的下一行多一個空行

Start New Line:Shift+Enter

游標反白的部分變[大|小]寫

Ctrl+Shift+U

刪除行,可選多行

Delete Line:Ctrl+Y

單一Import,有兩個以上可Import的會跳出視窗供選擇

Alt+Enter
如果將整個單字打完,不會幫你import,就會出現紅線上的提示
如果用選的,會幫你import(要選對哦)

import沒幫我們排版,可以用下面的排版Ctrl+Alt+L,但如果用Ctrl+Alt+O,排版只會針對import的部分和將沒用到的import拿掉


到指定的行數

Line...:Ctrl+G

游標在括號(花括、角括、圓括)使用,游標會跳到[開始 | 結束]

MoveCaret to Matching Brace:Ctrl+Shift+M

單行[移除]註解,也可以選多行,不管是java、XML都可以

Comment with Line Comment:Ctrl+/

上一個呼叫的程式碼

Ctrl+Alt+Left(沒Ctrl是上一頁)
我試的結果無效,但按上面的按鈕卻可以,如果一定要用就改快速鍵吧!

下一個呼叫的程式碼

Ctrl+Alt+Right(沒Ctrl是下一頁)
我試的結果無效,但按上面的按鈕卻可以,如果一定要用就改快速鍵吧!

排版

Reformat Code:Ctrl+Alt+L

整體重命名

Rename...:Shift+F6

誰呼叫我,在方法名稱上按才有用

Call Hierarchy:Ctrl+Alt+H

看整個階層,包括父類、子類

Type Hierarchy:Ctrl+H

自動增加[全域 | 區域]變數

搜尋Assign可找到兩個Assign Shortcut...,預設都沒有快速鍵,但按了以後,還要點左邊的圖示,太慢了,不建議使用


這樣子的快速鍵就差不多了,其他建議用滑鼠去按,如下:
按右鍵Generate...快速鍵是Alt+Ins
這時就有很多常用的功能

顯示行號


※雖然用下圖的就可以顯示,但重啟Android Studio後,又不見了,這時可以用上圖的方法

字型、文字大小
預設的Default無法改,所以要複製一份出來,按Save As...,然後隨便打個字,就可以改了
Primary font是字型,用Eclipse時,大部分的人都喜歡用Consolas

TODO、FIXME

 點進去還可以改一些設定


※上圖是所有預設AndroidComments的效果
打開TODO,如果沒有,這種活頁標籤都是開View-->Tool Window
只會看到TODO和FIXME

※和Eclipse不一樣的地方是,只會找自己的專案,還有大小寫都可以,且沒有XXX

內鍵的快速功能

右邊有教學,關鍵字會閃,可惜我沒看到自定的功能