VFP free table 語法

Free Table test 資料表 有三欄位 no name descrip
insert 資料
REPLACE no WITH "003″, name WITH "電腦", descrip WITH "3500″

或 SQL 語法
INSERT INTO test(no,name,discrip) VALUES ("003″,"電腦","35000″)

GO TOP Flag Table頂部
GO BOTTOM Flag Table最底部 (注意:最底部是EOF,但 BOTTOM 不會到EOF)
SKIP Flag 在 Table 依序下一筆
SKIP -1 Flag 在 Table 依序上一筆
RECNO() 顯示Flag 位置 MESSAGEBOX(RECNO())
GO n n:號碼 GO 跳到指定 FLAG
LOCAT FOR Name = "ccc" AND Descrip = "GGG" 尋找指定 table 欄位 (注意:需用EOF() 查詢 為 .T. 代表沒找到 )
DELETE 刪除
RECALL 刪除找回來
SET DELETED ON 不顯示被刪除 Flag

FreeTables 開啟流程
SELECT 0 #開工作區
USE Free.dbf #使用 Free.dbf
BROWSE #瀏覽
USE #關閉 DBF

開啟模擬 SQL DataBase 流程
OPEN DATABASE c:\vfp\Lesson5\mydatabase.dbc #開啟指定Database
SET DATABASE TO mydatabase #指定資料庫
SELECT 0 #開啟工作區
USE NotFree #指定 TABLE 如果有多個 DATABASE 為 MyDataBase!NotFree
BROWSE #瀏覽
USE #關閉TABLES
CLOSE DATABASE #關閉DATABASE

於主程式內登打
CLEAR ALL #先關閉 所有FORM
CLOSE ALL DATABASE #關閉資料庫
cd c:\vfp\lesson5
OPEN DATABASE Data1 #開啟資料區
SET DATABASE TO DATA1 #切換指定資料區,如有多個
SELECT 0 #自動編號
USE TABLE1 #開啟工作區
GO TOP #Flag 先第一筆
DO FORM FORM1 #開畫面 FORM1 在docment 內form的檔
=MESSAGEBOX("END")
CLOSE DATABASE ALL #強制關閉資料庫

FORM 屬性修改
在 Daocments Forms 開新 Form1 ,並 FORM 屬性修改
Windows Type 屬性改為 1-Modal #獨佔依序

於 form 中新增 Grid 表格
開第一個 button ,Caption : insert into 插入資料
GO TOP
IN EOF() &假如是空的話 ,我就坐下面動作
INSERT INTO tables (prno,prna) VALUES ("001″,"鍵盤1″)
INSERT INTO tables (prno,prna) VALUES ("002″,"鍵盤2″)
INSERT INTO tables (prno,prna) VALUES ("003″,"鍵盤3″)
INSERT INTO tables (prno,prna) VALUES ("004″,"鍵盤4″)
ThisForm.Refresh
ENDIF

#清空DATA
SELECT table1
USE
SELECT 0
USE TABLE1 EXCLUSIVE &用最大權限打開並獨佔
ZAP &徹底刪除
GO TOP &&固定指令 跳到 頭
thisform.grid1.recordsource ="table1″ &這個 FORM 的 grid1 來源為 table1
thisform.refresh &&固定指令 刷新

#SKIP BUTTON
SKIP
IF EOF() &以下是怕掉到資料底部的下一區為Ture 就 Flag 到底部
GOT BOTTOM
ENDIF
thisform.refresh

#FLAG 上一筆
SKIP -1
this
ThisForm.refresh

#recno butoon
MESSAGEBOX( RECNO() )

#GO 指定編號 BUTTON
LOCAL m.cNumber n.nNumber
m.cNumber = INPUTBOX("請輸入編號,"1″,0,’1′,’1′)
m.nNumber = VAL(m.cNumber) &ˊstring 轉數字
IF (n.nNumber<=0 ) OR (m.nNumber> RECCOUNT() ) && RECOUNT()總筆數
MESSAGEBOX("超出範圍")
ELSE
GO m.nNumber
thisform.refresh
ENDIF
GO. m.nNumber

# DO While Button
SELECT table1
DO WHILE !EOF()
ThisForm.Refresh
MESSAGEBOX(prno+prna)
SKIP
ENDDO

GO BOTTOM

#scan 迴圈
&&適用資料庫
SELECT table1
SCAN
thisform.ReFresh
MESSAGEBOX(prno+prna)
ENDSCAN

#set filter 過濾 Button
LOCAL m.cCond
m.cCord = set("Filter")
IF EMPTY(m.cCond) &&這是記憶在 tables 上
SET FILTER TO (prno >="002″) AND (prno<="003")
ELSE
SET FILTER TO
ENDIF

GOTOP &&<----必須要
thisform.refresh

#LOCATE 定位 Button
LOCAL m.cPrno

m.cPrno = INPUTBOX("輸入編號")
LOCATE FOR prno = m.cPrno && "=" 非完全比對
IF EOF()
MESSAGEBOX("沒有這邊號")
GO TOP
ENDIF

thisform.refresh

#LOCATE FOR 定位關鍵字 BUTTON
LOCAL m.cPrno
m.cPrno = INPUTBOX("請輸入編號")
LOCATE FOR ( m.cPrno $ Prno ) OR ( m.cPrno $ Prna )
IF EOF()
MESSAGEBOX("NO FIND")
GO TOP
ENDIF
thisfrom.refresh

#Relpace 修改
LOCAL x
x = INPUTBOX("輸入品名")
IF !EMPTY(x)
IF !eof()
replace prna WITH x
ENDIF
thisform.Refresh
ENDIF

#replace 整批修改 限定範圍
LOCAL x
*x="整批修改"
x=INPUTBOX("請輸入修改名")
replace prna WITH x FOR(prno >="005″)
thisform.Refresh
GO top

#Update SQL
UPDATE Table1 SET prna="SQL整批修改 " WHERE (prno>="005″)
THisform.Refresh

#Recall
IF !EOF()
RECALL
ENDIF
thisform.Refresh

#Append blank
LOCAL m.cPrno, cx
m.cPrno = INPUTBOX("產品編號")
m.cPrno = PADR(cPrno,10)

IF !EMPTY(cPrno)
LOCATE FOR prno ==m.cPrno
IF !EOF()
MESSAGEBOX("重復")
RETURN
ENDIF
ENDIF

APPEND BLANK
REPLACE prno WITH m.cPrno
thisform.Refresh

#inster into 新資料
LOCAL m.cPrno, cx
m.cPrno = INPUTBOX("產品編號")
m.cPrno = PADR(cPrno,10)

IF !EMPTY(cPrno)
LOCATE FOR prno ==m.cPrno
IF !EOF()
MESSAGEBOX("重復")
RETURN
ENDIF
ENDIF

APPEND BLANK
*REPLACE prno WITH m.cPrno
INSERT INTO table1 (prno) VALUES (m.cprno)
thisform.Refresh

#append 新資料
CREATE CURSOR prod2 (prno c(10), prna c(10))
INSERT INTO prod2 (prno,prna) values ("100″,"1001inter")
INSERT INTO prod2 (prno,prna) values ("101″,"1002inter")

BROWSE

SELECT table1
APPEND FROM DBF("prod2″)
MESSAGEBOX(DBF("prod2″))

USE IN prod2
thisform.Refresh

#inster into ARRAY 陣列
DIMENSION myiarray[2]

SELECT * FROM table1 WHERE prno="002″ INTO ARRAY myarray
MESSAGEBOX(myarray[1])
MESSAGEBOX(myarray[2])

SELECT table1

INSERT INTO table1 FROM ARRAY myarray
thisform.Refresh

#Inster into 物件
LOCAL m.oRecord

SELECT table1
SCATTER NAME m.oRecord

MESSAGEBOX(m.oRecord.prno)
MESSAGEBOX(m.oRecord.prna)

m.oRecord.prno="999″
m.oRecord.prna="999na"

SELECT table1

INSERT INTO table1 FROM NAME m.orecord
thisform.Refresh

#Inster into 變數
LOCAL m.prno, m.prna

m.prno="012″
m.prna="電線"

SELECT table1
INSERT INTO table1 FROM memvar
thisform.Refresh

#indwx 索引檔
LOCAL x
x=INPUTBOX("input")
x=VAL(x)
MESSAGEBOX(x)
SELECT table1
USE

SELECT 0
USE table1 EXCLUSIVE

&&以上sop 有關刪除

DELETE TAG ALL &&刪除所有索引

INDEX on prna TAG prna_index
INDEX on prno TAG prno_index && index on 用 prno tag 製作排名檔

*SET ORDER TO prna_index && set order to index 排名
SET ORDER TO x

GO top
thisform.grid1.RecordSource="table1″
thisform.Refresh

#set order to tag
LOCAL m.ctag

SELECT table1

m.ctag=tag()

IF EMPTY(m.ctag)
SET ORDER TO prno_index
MESSAGEBOX("sort_prno")
ELSE
SET ORDER TO prna_index
MESSAGEBOX("sort_prna")
ENDIF

GO top
thisform.Refresh

#seek index 定位
LOCAL m.cPrno

m.cPrno = inputbox("input prno")
m.cPrno = PADR(cPrno,10)

SELECT table1

SET ORDER TO PRNO_INDEX && PRNO

SEEK m.cPrno

IF EOF()
MESSAGEBOX("no find" + m.cPrno)
ELSE
messagebox("find " + m.cPrno)
ENDIF

thisform.Refresh

#seek()
LOCAL m.cPrno

m.cPrno = INPUTBOX("產品編號")
m.cPrno = PADR(cPrno,10)

SELECT table1

IF !SEEK(m.cPrno,"table1″,"Prno_index")
MESSAGEBOX("no find " + m.cPrno)
ELSE
MESSAGEBOX("find " + m.cPrno)
ENDIF

thisform.Refresh

#indexseek() 進階
LOCAL m.cPrno

m.cPrno = INPUTBOX("input Prno")
m.cPrno = PADR(cPrno,10)

&& .T. 索引後指標 會跟著移動
&& .F. 索引後指標 不會跟著移動

IF INDEXSEEK(m.cPrno,.F.,"table1″,"Prno_index")
MESSAGEBOX("找到" + m.cPrno)
ELSE
MESSAGEBOX("沒找到"+ m.cPrno)
ENDIF

IF EOF()
GO bottom
ENDIF

thisform.Refresh

發表於 未分類 | 發表迴響

Linux 修改 時間 和 時區

1. timedatectl list-timezone|grep Taipei
2. timedatectl set-timezone Asia/Taipei

或
date -s "20211031 1500″
hwclock-s

或
ntpdate watch.watch.stdtime.gov.tw; hwclock -w; hwclock

https://blog.gtwang.org/linux/centos-linux-change-system-timezone-command-tutorial/

發表於 未分類 | 發表迴響

win10 查看 wifi 已知密碼

netsh wlan show profile name=”您的Wi-Fi網路名稱” key=clear

發表於 未分類 | 發表迴響

ROS 國家別 Firewall address-list

https://mikrotikconfig.com/firewall/#address

https://www.ip2location.com/free/visitor-blocker

# 惡意 addrsss-list

https://raw.githubusercontent.com/ktsaou/blocklist-ipsets/master/firehol_level1.netset

172.16.0.0/12
10.0.0.0/8
192.168.0.0/16

發表於 ros | 發表迴響

外掛 ads block

https://blocklister.gefoo.org/

發表於 未分類 | 發表迴響

mikrotik-dhcp_alrt

發現第 2 DHCP SERVER 併發警告
ip-dhcpserver-alrt
填入原本 dhcp bridge mac address

:log info "Found rogue DHCP server at $[/system clock get date] $[/system clock get time] on interface bridgeLAN]"
#Email
/tool e-mail send to="toungcuu@gmail.com" subject="Found rogue DHCP server at $[/system clock get date] $[/system clock get time] on interface bridgeLAN"
#Telegram
/tool fetch url="https://api.telegram.org/bot1997621392:AAEAr1ScLkKELdyouwEmAb6NAiuRXxZf69k/sendMessage?chat_id=-487913599&text=Found rogue DHCP server at $[/system clock get date] $[/system clock get time] on interface bridgeLAN"

https://www.youtube.com/watch?v=pySxl30VrTQ

發表於 未分類 | 發表迴響

git

git
HEAD
一般指向一個 Branch 的最新一個 Commit,也是使用者目前所能看到的 Git 內容。新增的 Commit 必定接在目前 HEAD 後面。
Index
Commit 前的過渡區,告知 Git 哪些檔案需要包含在此次 Commit 內。

Reset
Soft
reset –soft [commit] #[單純移動 HEAD 與其 Branch] ,這個模式下的 reset,工作目錄跟暫存區的檔案都不會被丟掉,所以看起來就只有 HEAD 的移動而已。也因此,Commit 拆出來的檔案會直接放在暫存區。
Hard
reset –rard [commit] #[除了移動 HEAD 與其 Branch ,也將 Working Directory 與 Index 的內容移出。] 不管是工作目錄以及暫存區的檔案都會丟掉。
Mixed
reset [commit] # –mixed 是預設的參數,如果沒有特別加參數,git reset 指令將會使用 –mixed 模式。這個模式會把暫存區的檔案丟掉,但不會動到工作目錄的檔案,也就是說 Commit 拆出來的檔案會留在工作目錄,但不會留在暫存區。

Checkout
checkout 會檢查 sandbox 更改. 一旦checkout sandbox 會遺失,類 reset –hard (但 reset –hard 不會檢查sandbox 但會移動 Branch)
checkout 移動的是 HEAD 本身 如有設Branch 不會跟著移過去

常見 .gitignore

https://github.com/github/gitignore

如果想套用 .gitignore 的規則,就必須先使用 git rm –cached 指令把這些既得利益者請出 Git,移出 Git 控管之後,它就會開始會被忽略了。
git clean -fx #要一口氣清除那些已經被忽略的檔案

發表於 未分類 | 發表迴響

mysql 指令

練習網站

https://sqlzoo.net/wiki/SELECT_basics/zh

https://www.w3school.com.cn/sql/index.asp

https://www.w3schools.com/sql/default.asp

連接資料庫
mysql -u username DATABASES_NAME -P

顯示所有 MySQL 資料庫
SHOW DATABASES;

顯示該資料庫資料表
SHOW TABLES;

顯示系統狀態
SHOW status;

變數
show variables;
show variables like ‘%max%’

process
show processlist;

全部權限
show priviledges;

發表於 未分類 | 已標籤 | 發表迴響

docker 學習網站參考

https://www.runoob.com/docker/docker-container-usage.html

https://blog.clarence.tw/2019/09/10/docker-removing-containers-images-volumes-and-networks/

https://ithelp.ithome.com.tw/users/20102562/ironman/3746?page=3

——————————————————–
docker 如有非 root user 須執行 ,將 目前 user 加入 Docker 使用群 ,就可以使用 ,編輯 /etc/group ,username 加入 docker 那一行即可
或 sudo gpasswd -a myusername docker
——————————————————–
–ulimit 參數
範例: docker run –ulimit nofile=1024:1024 –rm debian ulimit -n
nofile 可以開啟檔案描述符號的最大數量
core 最大核心檔案的大小,以blocks為單位
cpu 指定CPU使用時間的上限,以秒為單位
data 處理程序最大數據塊的大小,以Kbyt為單
fsize 處理程序可以建立檔案的最大值,以blocks為單位
locks 能同時保持的檔案鎖的最大數量
memlock 最大可加鎖的記憶體大小,以Kby為單位
stack 分配執行緒堆疊的最大值,以kb單位
nproc 個使用者可建立的最大處理程序數
sigpending 使用者可獲得的最大實體記憶體
rss 可以在訊息佇列中分配的最大位元組
msgqueue 非特權使用者處理程序所能請求的即時優先順序的上限
nice 設定處理程序優先順序的nice值,nice值越高,優先順序越低
@注意:對root許可權的使用者來說,ulimit效果並不能全部生效。
——————————————————–
docker pull # 拉取 image
docker attach # 連接正執行的 image
docker version # 查看 docker 版本
docker inspect #查看詳細 image 內容
docker image ls # 查看正執行的 容器
docker image pull hello-world
docker container run hello-world
docker container ls
docker container kill ID
docker run -itd ubuntu /bin/bash
docker image build -t python3-app
———–Network
docker network ls
docker network rm Network-ID
docker network prune #kill all none network
—————docker compose
以 node.js+npl 例子
docker 單獨執行
docker run -it -rm -v \$PWD:/source -w /sorue node:14-alpine
以 compose 執行
vi docker-compose.yml 設定檔
#版本 3.8
version: "3.8″
#定義 server 區塊 , 一個 service 設定可以啟動多個 container
service:
npm:
image: node:14-alpine # pull Image 下來版本
stdin_open: true #指的是 -i , –interactive
tty: true # -t , –tty
working_dri: /source #-w 或 –workdir
volumes:
– .:/source

yml 定義好之後 , 執行作用跟 docker run -it -rm -v \$PWD:/source -w /sorue node:14-alpine 一樣
docker-compose run –rm npm npm -v
—————docker compose 多環境測試
#原本 docker 執行
docker run -it -v $PWD:/source -w /source php:7.1-alpine
vendorbin/phpunit
docker run -it -v $PWD:/source -w /source php:7.2-alpine
vendorbin/phpunit
docker run -it -v $PWD:/source -w /source php:7.3-alpine
vendorbin/phpunit
docker run -it -v $PWD:/source -w /source php:7.4-alpine
vendorbin/phpunit

改 docker-compose.yml
version: "3.8″
service:
php: &basic
image: phpL7.1-alpine
stdin_open: true
tty: true
working_dir: /source
volumes:
– .:/source
command: vendor/bin/phpunit
php72:
<<: *.basic
image: php7.2-alpine
php73:
<<: *.basic
image: php7.3-alpine
php74:
<<: *.basic
image: php7.4-alpine
php80:
<<: *.basic
image: php8.8.8beta4-alpine

按照 單一 container docker-compose 原本指令要這樣下
docker-compose run --rm php71
docker-compose run --rm php72
docker-compose run --rm php73
docker-compose run --rm php74
docker-compose run --rm php80

但 改用一個指令 docker-composer up 即可

發表於 docker | 發表迴響

mikrotik 多線回流

/ip firewall mangle
add action=accept chain=prerouting dst-address=192.168.1.0/24
src-address=192.168.1.0/24
add action=accept chain=prerouting dst-address-type=local
src-address=192.168.1.0/24
add action=mark-routing chain=prerouting new-routing-mark=to_Route2
passthrough=yes src-address=192.168.1.0/24

發表於 未分類 | 發表迴響