JavaFX TableView自訂義排序-最後一列資料不納入排序判斷

package funcion;

import java.util.Comparator;

import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Insets;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.stage.Stage;
import javafx.util.Callback;

/**200921-GDK-tableview自訂義排序範例-數字格式化排序*/
public class TableViewLastColumNotSort extends Application {

private TableView<Person> table = new TableView<Person>();
private ExtraPerson extraPerson = new ExtraPerson(“Ninja Village”);

private final ObservableList<Person> data = FXCollections
.observableArrayList(
new Person(“Jacob”, “1,111”, “jacob.smith@example.com”),
new Person(“Isabella”, “1,123”,
“isabella.johnson@example.com”),
new Person(“Ethan”, “111”,
“ethan.williams@example.com”),
new Person(“Emma”, “222,222”, “emma.jones@example.com”),
new Person(“Michael”, “312”, “michael.brown@example.com”),
extraPerson);

public static void main(String[] args) {
launch(args);
}

@Override
public void start(Stage stage) {
Scene scene = new Scene(new Group());
stage.setTitle(“Table View Sample”);
stage.setWidth(450);
stage.setHeight(500);

final Label label = new Label(“Address Book”);
label.setFont(new Font(“Arial”, 20));

table.setEditable(true);

TableColumn firstNameCol = new TableColumn(“First Name”);
firstNameCol.setMinWidth(100);
firstNameCol
.setCellValueFactory(new PropertyValueFactory<Person, String>(
“firstName”));

TableColumn moneyCol = new TableColumn(“Money”);
moneyCol.setMinWidth(100);
moneyCol
.setCellValueFactory(new PropertyValueFactory<Person, String>(
“Money”));

TableColumn emailCol = new TableColumn(“Email”);
emailCol.setMinWidth(200);
emailCol.setCellValueFactory(new PropertyValueFactory<Person, String>(
“email”));

/**
* Adding comparator to extraPerson
* 覆寫sort判斷
*/

table.sortPolicyProperty().set(
new Callback<TableView<Person>, Boolean>() {

/*自動生成*/
@Override
public Boolean call(TableView<Person> param) {
Comparator<Person> comparator = new Comparator<Person>() {
@Override
public int compare(Person r1, Person r2) {

if (r1 == table.getItems().get(table.getItems().size()-1)) {
/* r1是最後一筆時正常派排序 */
return 1;
} else if (r2 == table.getItems().get(table.getItems().size()-1)) {
/* r2是最後一筆時不排序 */
return -1;
} else if (param.getComparator() == null) {
return 0;
} else {
return param.getComparator().compare(r1, r2);
}

}
};

/*預設複寫狀態成立*/
FXCollections.sort(table.getItems(), comparator);
return true;
}
});

table.setItems(data);
table.getColumns().addAll(firstNameCol, moneyCol, emailCol);
// table.getColumns().hashCode();
final VBox vbox = new VBox();
vbox.setSpacing(5);
vbox.setPadding(new Insets(10, 0, 0, 10));
vbox.getChildren().addAll(label, table);

((Group) scene.getRoot()).getChildren().addAll(vbox);

stage.setScene(scene);
stage.show();
}

public static class Person {

private final SimpleStringProperty firstName;
private final SimpleStringProperty money;
private final SimpleStringProperty email;

private Person(String fName, String money, String email) {
this.firstName = new SimpleStringProperty(fName);
this.money = new SimpleStringProperty(money);
this.email = new SimpleStringProperty(email);
}

public String getFirstName() {
return firstName.get();
}

public void setFirstName(String fName) {
firstName.set(fName);
}

public String getMoney() {
return money.get();
}

public void setMoney(String Money) {
money.set(Money);
}

public String getEmail() {
return email.get();
}

public void setEmail(String Email) {
email.set(Email);
}
}

public static class ExtraPerson extends Person {

private final SimpleStringProperty address;

private ExtraPerson(String address) {
super(“Itachi”, “333”, “leaf@village.ninja”);
this.address = new SimpleStringProperty(address);
}

public String getAddress() {
return address.get();
}

public void setAddress(String address) {
this.address.set(address);
}

}
}

Java限制TextField的方法

如何偵測TextField資料變動(應適用其他元件)

/*偵測<文字框>單價的狀況,當變動時啟動偵測機制來檢查金額差距*/
textPrice.textProperty().addListener((observable, oldValue, newValue) -> {
System.out.println(“textfield changed from ” + oldValue + ” to ” + newValue);

Check_Order_Workers_Price();

});

當使用JavaFX的TextField時如何限制使用者輸入的字數

/*限制帳號長度*/
tf_account_number.textProperty().addListener((observable, oldValue, newValue)->{
System.out.println(“tf_account_number運作中”);
if(newValue.length()>14){
tf_account_number.setText(oldValue);
}
});

 

資料伺服器基本硬體檢測要求

基本設定:

1.保固5年以上零配件

2.企業級硬碟*2

3.raid1*2+1備份

4.在線式UPS電力系統

5.每週執行一次所有硬碟raid1*2+1備份完整檢查

6.每天執行一次所有硬碟raid1*2+1備份快速檢查

7.每30分鐘執行一次所有硬碟raid1*2+1備份狀態檢查

8.如7出現異常,執行25min蜂鳴器警告,使用mail(有對外網路服務系統)通知工程人員

9.每月由MIS部門或斷點設計現場進行硬資料伺服器設定安全檢測

 

ubuntu純資料伺服器設定流程

相關:客製化ERP,客製化進銷存,客製化BOS機中央管理系統,純資料資料庫。

目的:用於封閉式區域網路,基本設定,防火牆後,通訊協定部分搭配防火牆設定,如無防火牆有對外需求,可進階設定建立伺服器網路相關限制。

使用版本:ubuntu 16.04 版本,技術支援至202104

適用系統:斷點設計2017年10月前專案,原mysql_2.6.*資料庫

效益:令舊式語法相容於新版本mysql系統及其支系

斷點設計,ubuntu 純資料伺服器設定流程
第一步:安裝 ubuntu 16.04 版本 下載位址: https://www.ubuntu-tw.org/modules/tinyd0/ 支援至 2021年 04 月 安裝至電腦 硬碟規劃:預設(新手用) 硬碟分割:預設(新手用)
第二步:安裝 mariaDB 參考資料: https://blog.gtwang.org/linux/centos-7-install-mariadb-mysql-server-tutorial/ https://www.phpini.com/linux/debian-ubuntu-install-mariadb-10-1
先更新 Linux 系統上的安裝套件(yum 或 apt-get) ubuntu 指令:sudo yum update 或 ubuntu 指令:sudo apt-get install yum
透過 yum安裝 MariaDB 伺服器 ubuntu 指令:sudo yum install mariadb-server
設定啟用 MariaDB 的 service(讓開機自動啟動): ubuntu 指令:sudo systemctl enable mariadb
立即啟動 MariaDB 的 service ubuntu 指令:sudo systemctl start mariadb
檢查 MariaDB 伺服器是否有正常啟動: ubuntu 指令:systemctl status mariaDB
使用 root 帳號登入 MariaDB 伺服器 ubuntu 指令:mysql -u root -p
二-1:如安裝完成無法進入,以本機端安全模式進入 警告碼:ERROR 1698 (28000)
參考資料: https://www.cnblogs.com/leolztang/p/5094930.html http://goodjack.blogspot.tw/2017/11/mariadb-error-1698-28000.html https://my.oschina.net/cimu/blog/365462
權限不足→以安全模式安啟 mysql/mariaDB 流程
1.關閉資料庫 mariaDB指令:sudo service mysql stop
2.安全模式啟動資料庫
mariaDB指令:sudo mysqld_safe –skip-grant-tables &
3.無須密碼進入 mysql mariaDB指令:mysql -u root
4.查看 user 表(使用者帳號) mariaDB指令:select user, plugin from mysql.user;
root 的 plugin 被修改成了 auth_socket,用密碼登錄的 plugin 應是 mysql_native_password 關於 auth_socket,官方说明: https://dev.mysql.com/doc/refman/5.7/en/socket-pluggableauthentication.html
5.1.調整方法 5.1.1 更新設定-設定 root 密碼為 0919- plugin 為 root mariaDB指令:update mysql.user set authentication_string=PASSWORD(‘0919′), plugin=’mysql_native_password’ where user=’root’;
刷新系統權限 mariaDB指令:flush privileges;
5.2.調整方法 5.2.1 更新指令 使用 mysql資料表 mariaDB指令:use mysql;
更新 root 密碼為 0919 mariaDB指令:update user set password=PASSWORD(“0919”) where User=’root’;
刷新系統權限 mariaDB指令:flush privileges;
6.離開資料庫 mariaDB指令一:exit mariaDB指令二:quit
7.重啟資料庫 mariaDB指令一:sudo /etc/init.d/mysql restart mariaDB指令二:sudo restart mysql mariaDB指令三:sudo service mysql restart
8.啟動資料庫: mariaDB指令一:sudo /etc/init.d/mysql start mariaDB指令二:sudo start mysql mariaDB指令三:sudo service mysql start
9.停止資料庫: mariaDB指令一:sudo /etc/init.d/mysql stop mariaDB指令二:sudo stop mysql mariaDB指令三:sudo service mysql stop
10.使用新密碼正常登入資料庫-帳號 root 密碼 0919 mariaDB指令:mysql -u root -p0919
二-1:資料庫無法遠端/外部訪問,設定外部 ip連線 預設的 MariaDB 只能從 localhost(127.0.0.1)連線,因為安全性的因素,通常 不建議隨便開放外面的存取 參考資料: http://mustgeorge.blogspot.tw/2011/11/mysql-error-1045-28000-usingpassword.html http://benjr.tw/97973 http://benjr.tw/98033
解決方法 1-必須設定參數 1.1.進入資料庫 mariaDB指令:mysql -uroot mysql -p0919
1.2.把所有資料庫(含其下的所有資料表),授權給 root,從 localhost 上來,密碼 為引號內數據 ‘0919’ mariaDB指令:GRANT all ON *.* TO root@’localhost’ IDENTIFIED BY ‘0919’;
1.3.刷新系統權限表 mariaDB指令:FLUSH PRIVILEGES;
1.4.顯示 root@、172.16.15.%、位址權限狀態 mariaDB指令:show grants for root@’172.16.15.%’;
1.5.新增使用者 user1 並授予本機端連線 mariaDB指令:CREATE USER user1@localhost IDENTIFIED BY ‘111111’;
1.5.新增使用者並授 user3 予’%’全部位址連線 mariaDB指令:CREATE USER user3@’%’ IDENTIFIED BY ‘111111’;
1.6.新增使用者 user2 並授予’172.16.15.%’限定位址連線%為無限制 mariaDB指令:CREATE USER user2@’172.16.15.%’ IDENTIFIED BY ‘111111’;
1.7.離開資料庫 mariaDB指令:quit
參考資料: http://benjr.tw/98033
補充資料參照: 管理權限
GRANT , SUPER , PROCESS , RELOAD , SHUTDOWN , SHOW DATABASES , LOCK TABLES , REFERENCES , REPLICATION CLIENT , REPLICATION SLAVE , CREATE USER 結構權限 CREATE , ALTER , INDEX , DROP , CREATE TEMPORARY TABLES , SHOW VIEW , CREATE ROUTINE , ALTER ROUTINE , EXECUTE , CREATE VIEW , EVENT , TIGGER 資料 權限 SELECT , INSERT , UPDATE , DELETE , FILE
(追加)給予 user1 資料庫 (user1Date ) 的全部權限 (ALL PRIVILEGES) mariaDB指令:grant all privileges on user1Data.* to user1@localhost ;
(追加)給予 user2 操作(select) 資料庫 (user1Data) 的權限 mariaDB指令:grant select on user1Data.* to user2@’172.16.15.%’;
(追加)建立帳號與給予權限的指令可以同時下的,如下所示 mariaDB 指令:grant all privileges on user1Data.* to user1@localhost identified by ‘your.password’ ;
參考資料:權限說明 https://dev.mysql.com/doc/refman/5.7/en/grant.html
解決方法 2-必須設定參數: 狀況:mariaDB 只監聽 127.0.0.1 參考資料: http://jiangbai333.github.io/2016/03/08/mysql%E5%BC%80%E5%90%AF %E8%BF%9C%E7%A8%8B%E8%AE%BF%E9%97%AE(%E6%97%A0%E5%BA%9F %E8%AF%9D)/ https://lipeng1943.com/blog/?p=207 https://hk.saowen.com/a/bc4640ec8cbcf3ff0effceddb656e597e99f3dcea1c9 d990034094e2897b7f48 https://zoco.me/post/centos7-mariadb-remote-access https://gwokae.mewggle.com/wordpress/2009/11/mysql%E8%B3%87%E6%96%99%E8%A1%A8%E3%80%81%E8%B3%87%E6%96%99% E5%BA%AB%E5%90%8D%E7%A8%B1%E5%8D %80%E5%88%86%E5%A4%A7%E5%B0%8F%E5%AF%AB%E7%9A %84%E8%A8%AD%E5%AE%9A/
查詢資料庫監聽 3306 狀況 ubuntu 指令:netstat -ano | grep 3306 顯示資料:表示只監聽 127.0.0.1 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN off(0.00/0/0)
訪問/etc/mysql/my.cnf 設定檔 ubuntu 指令:sudo vim /etc/mysql/my.cnf
注意!資料庫設定檔可能重定向,需參考原始 my.cnf 檔,修改正確檔案 訪問/etc/mysql/mysql.conf.d/mysqld.cnf 設定檔
ubuntu 指令:sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
設定資料表、資料庫名稱區分大小寫 參考資料: http://study27.blogspot.com/2014/08/mysql.html
文件指令: #任意行增加此指令 lower_case_table_names=1
指令筆記: lower_case_table_names=0 (Windows 預設) 資料表(table)及資料庫名稱(database names)一律用小寫存在磁碟中。比較(查詢) 時是區分大小寫(case sensitive)。
lower_case_table_names=1 資料表(table)及資料庫名稱(database names)一律用小寫存在磁碟中。比較時是 不區分大小寫(case insensitive)。MySql 轉換所有的資料表(table)、資料庫名稱 (database names)、表別名(table aliases)(註 1)為小寫來存取。所以實體檔案的 名稱必須全為小寫,否則會存取不到。
lower_case_table_names =2 (Mac OS X 預設) 資料表(table)、資料庫名稱(database names)儲存時磁碟的檔案區分大小寫。但 查詢比較時 MySQL 將查詢轉換成小寫,不是區分大小寫。但這個設定僅適用於不 區分大小寫的檔案系統。
註釋掉 skip-networking 選項來開啟遠程訪問 ubuntu 指令:grep -rn “skip-networking” *
註釋或設定 bind-address 項,該項表示運行哪些 IP 地址的機器連接,允許所有遠 程的機器連接 打開文檔/etc/mysql/mariadb.conf.d/50-server.cnf,註釋掉 bind-address 項
重新啟動資料庫:已完成安裝 mariaDB 並啟動遠端訪問資料庫
使用時發現[Err]1055 錯誤 MySql資料庫預設為 SET sql_mode = ‘ONLY_FULL_GROUP_BY’ 沒有使用群組函式的欄位,一定要全部出現在 GROUP BY 子句中,如果完反此規 定,即會出現 [Err] 1055 – Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 或 which is not in SELECT list; this is incompatible with DISTINCT 錯誤訊息 解決方式參考資料 https://stackoverflow.com/questions/28849293/how-to-make-sql-mode-noengine-substitution-permanent-in-mysql-my-cnf
https://op46.com/#/technique/9d356df3e82bfb349528808758a3d734.html http://www.codedata.com.tw/database/mysql-tutorial-4-expressionfunction/ http://www.ywnds.com/?p=8184 http://blog.elfjane.com/?p=277 https://blog.csdn.net/Inite/article/details/78087039 https://blog.csdn.net/S_gy_Zetrov/article/details/65937999 https://tjosm.com/5266/disable-strict-mode-mysql-5-7-ubuntu-16-04/
暫時性的處理,使用 MySql 語法 SET sql_mode=(SELECT REPLACE(@@sql_mode,’ONLY_FULL_GROUP_BY’,”)); 永久的處理方法,修改 MySql設定文件,my.ini(windows)或 my.cnf(linux)件 找到 sql_mode 中注释(去掉)only_full_group_by 或加上(BP-20170101 年前開發系統底層版本) ======文件內容==== #設定語法順序 [mysqld] sql_mode=NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION ======文件內容==== 查看 SQL_MODE 語法 SELECT @@sql_mode;
三:安裝安裝 Apach2 來建立網頁環境(使用 phpmyadmin 前置) 參考資料: https://www.howtoing.com/how-to-install-the-apache-web-server-on-ubuntu-1604 https://www.howtoing.com/how-to-install-linux-apache-mysql-php-lamp-stackonubuntu16-04/ https://magiclen.org/lamp/ http://www.arthurtoday.com/2010/04/lamp-server-apache-mysql-php.html https://linux.cn/article-7463-1.html https://blog.csdn.net/zhaihaifei/article/details/51659134 http://jsnwork.kiiuo.com/archives/2505/ubuntu-%E5%AE%89%E8%A3%9D-php7apache-mysqlmariadb-phpmyadmin http://foanwang.pixnet.net/blog/post/39951347-linux-lamp-phpmyadmin%E8%A8%AD%E5%AE%9A%E4%B9%8B%E4%BB%80%E9%BA%BC%E9%AC%BC %E5%95%8F%E9%A1%8C%E9%83%BD%E7%A2%B0%E5%88%B0%E4%BA%86-o
安裝 Apach2 刷新 apt-get ubuntu 指令:sudo apt-get update
安裝 Apach2 ubuntu 指令:sudo apt-get install apache2 開啟 apach2 ubuntu 指令:systemctl start apache2
關閉 apach2 ubuntu 指令:sudo systemctl stop apache2
重啟 apach2 ubuntu 指令:sudo systemctl restart apache2
系統檢查 Apach2 是否運作 ubuntu 指令:sudo systemctl status apache2
取得 IP位址 ubuntu 指令:hostname -I 在區網開啟瀏覽器輸入 IP 位址或本機端輸入 localhost 或 127.0.0.1 驗證
四:安裝 php&phpmyadmin 參考資料: https://linux.cn/article-7463-1.html http://jsnwork.kiiuo.com/archives/2505/ubuntu-%E5%AE%89%E8%A3%9D-php7apache-mysqlmariadb-phpmyadmin
phpadmin 必須在 php 環境下進行,故須先安裝 php
安裝 php7.0 ubuntu 指令:sudo apt install php7.0-mysql php7.0-curl php7.0-json php7.0-cgi php7.0 libapache2-mod-php7.0
創建一個簡單的 php頁面,並移動到 apache 檔案目錄下(/var/www/html) ubuntu 指令:sudo vim samplepage.php
vi 文件內容程式碼: <?php phpinfo(); ?>
移動到 apach 的文件目錄下 ubuntu 指令:sudo mv samplepage.php /var/www/html/
用瀏覽器訪問頁面,如成功可看見 php版本說明 “http://<IP 位址>/samplepage.php”
安裝 phpmyadmin,注意 phpmyadmin 預設是連線至 127.0.01或 localhost 本機端 ubuntu 指令:apt install phpmyadmin
進入 phpmyadmin 安裝設定,選擇 apache2
點擊確定來配置 phpmyadmin 管理的資料庫
指定 phpmyadmin 連線至資料庫的密碼
重複確認密碼
打開瀏覽器,輸入位址訪問 phpmyadmin
http://<Server_IP_OR_Host_Name>/phpmyadmin
如果無法登陸,檢查設定檔狀態 參考資料: https://blog.csdn.net/l6807718/article/details/51374915
建立/var/www/html 下的軟連接/重定向 ubuntu 指令:sudo ln -s /usr/share/phpmyadmin /var/www/html/phpmyadmin
修改 php 配置文件 ubuntu 指令:sudo vim /etc/php/7.0/apache2/php.ini 文件內容: display_errors = On(顯示錯誤日誌,出現兩次獲多次都要改) extension=php_mbstring.dll (開啟 mbstring)
提醒:vim 查詢指令:/XXX 向下查詢 /?向上查詢
重啟 apach ubuntu 指令:sudo /etc/init.d/apache2 restart
重點提示: 默認安裝 phpmyadmin 時會安裝 apache 和 php等相關程式,ubuntu16.04 會默認安 裝 php7.0,php7.0 沒有自帶 php-mbstring,php-gettext 文件包,所以會出錯。
五:ip 阻擋/基本防火牆設定 參考資料:http://s2.naes.tn.edu.tw/~kv/iptables.htm
觀察目前的設定-範例為全部通過 ubuntu 指令:iptables -L -n 回覆內容: Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
ubuntu 指令:iptables -t nat -L -n 回覆內容: Chain PREROUTING (policy ACCEPT) target prot opt source destination Chain POSTROUTING (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
來自 192.168.0.1 這個 IP 的封包都予以接受: ubuntu 指令:iptables -A INPUT -i eth0 -p tcp -s 192.168.0.1 -j ACCEPT
來自 192.168.1.0 這個 C Class 的網域的任何一部電腦,就予以接受! ubuntu 指令:iptables -A INPUT -i eth0 -p tcp -s 192.168.1.0/24 -j ACCEPT
192.168.1.25 的封包都給他丟棄去! ubuntu 指令:iptables -A INPUT -i eth0 -p tcp -s 192.168.1.25 -j DROP
192.168.0.24 這個 IP 的封包,想要到我的 137,138,139 埠口時,都接受 ubuntu 指令:iptables -A INPUT -i eth0 -p tcp -s 192.168.0.24/24 –dport 137:139j ACCEPT
設定區網固定 ip: 參考文件: http://n198862320.pixnet.net/blog/post/35199621-ubuntu%E8%A8%AD%E5%AE %9A%E5%9B%BA%E5%AE%9Aip%E6%96%B9%E6%B3%95 https://www.phpini.com/linux/ubuntu-setup-static-ip https://www.albert-yu.com/2018/01/ubuntu-16-04-%E8%A8%AD%E5%AE%9A %E5%9B%BA%E5%AE%9Aip/ https://blog.csdn.net/greyfreedom/article/details/41943713 http://52iot.net/tw/book/Linux/69.html
修改 interfaces 檔 ubuntu 指令:sudo vim /etc/network/interfaces
文件內容; auto lo # auto eth0 iface eth0 inet static # 固定 eth0 網卡 (靜態) IP address 192.168.1.100 # IP 位址 netmask 255.255.255.0 # 網路遮罩 gateway 192.168.1.1 # 預設閘道,對外網路由位址 dns-nameservers 168.95.1.1 #DNS 第一組 hinet dns-nameservers 8.8.8.8 #DNS 第二組 google ~ ~ ~
設定檔如果無效,可使用 ifconfig 手動設定 ubuntu 指令:sudo ifconfig eth0 192.168.1.100 netmask 255.255.255.0
單獨關閉網路卡 ubuntu 指令:ifconfig eth0 down
單獨開啟網路卡 ubuntu 指令:ifconfig eth0 up
設定完畢之後,重新啟動網路介面 ubuntu 指令:sudo /etc/init.d/network restart
重啟後檢查 IP是否正確 ubuntu 指令:sudo ifconfig eth0
檢查路由設定 ubuntu 指令:sudo route -n
測試路由之間連線 ubuntu 指令:sudo ping -c 3 <路由 IP>
提醒:範例為手動逐步安裝,可直接安裝 XAMAPP 等工具

mysql-2-3事

將資料中的所有空格移除-使用REPLACE來替換資料
SQL語法-將`order`表中的`products`欄位空格’ ‘以空”替代
UPDATE `order` SET `products`=REPLACE(`products`,’ ‘,”);
SQL語法-將`purchase`表中的`products`欄位空格’ ‘以空”替代
UPDATE `purchase` SET `products`=REPLACE(`products`,’ ‘,”);