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);
}

}
}

外網連接路由器分配虛擬IP的FTP

大家好,這次要來分享外網連接路由器底下的FTP站台

在之前的文章中與大家分享了如何使用Windows系統來架設FTP站台,今天要來分享如何使用外網連接到自己架設的FTP站台

使用的環境是,windows 10 & ASUS RT-AC2400無線路由器

1.進入無線路由器的設定頁面

如果不知道該怎麼進入可以去cmd輸入ipconfig,假設該裝置的ip是192.168.1.11,那麼路由器的ip就是192.168.1.1

2.找到進階設定=>外部網路

3.點選”虛擬伺服器”,點選”開啟虛擬伺服器-ON”,點選”新增設定檔”

4.找到自訂設定=>服務名稱,點選”FTP Server”

5.找到自訂設定=>通訊協定,點選”BOTH”

6.此時外部通訊埠與內部通訊埠應該都自動設定好了

7.找到自訂設定=>本地IP位置,輸入該裝置的ip

8.完成

參考來源:ASUS官網

備份資料庫的小技巧

大家好,這次要來分享一個備份資料庫的小技巧

相信使用mysqldump來備份資料庫的使用者,很多人會使用當天的日期及時間來當檔名,這樣對於資料管理是有幫助的。

但是也會常遇到一個問題,假設備份資料庫的時間是AM09:30,系統判斷無法9前面的空白字元,這樣一來備份就會出問題。

這裡要來分享一個小技巧來解決這種冏況。

下面的方法是建立一個.bat檔來執行備份資料庫

1.新增一個bat檔==>編輯

2.編輯內容

echo off

echo %date%

echo %time%

set hour=%time: =0%
c:\AAA\mysqldump.exe -BBB -hCCC -pDDD EEE > c:\FFF\%date:~0,4%%date:~5,2%%date:~8,2%%hour:~0,2%%time:~3,2%%time~5,2%.sql

3.

AAA==>mysqldump的路徑
BBB==>username
CCC==>IP
DDD==>password
EEE==>資料庫名稱
FFF==>備份檔位置

參考來源:https://www.jb51.net/article/195100.htm

iPhone備份照片小技巧

大家好,這次要來分享一個iPhone備份照片到電腦的小技巧

使用的環境是,iOS 13及更新的版本,Windows 10

若,本機端的IP不是使用由ISP業者提供的固定IP,要先設定手機及本機端是在同一個網域

1.先在電腦端新增一個資料夾

2.右鍵=>內容=>共用=>共用=>下拉式選單選擇”Everyone”=>新增=>權限=>選擇”讀取/寫入”=>共用

3.控制台=>網路和網際網路=>網路和共用中心=>進階共用設定=>私人(目前設定檔)=>打開選項”開啟網路探索”及”開啟檔案及列表機共用”

4.控制台=>網路和網際網路=>網路和共用中心=>進階共用設定=>所有網路=>打開選項”開啟共用,只讓具有網路存取權的人員讀取和寫入公用資料夾中的檔案”及”關閉以密碼保護的共用”

5.找本機端的IP

6.點選iPhone”檔案”=>右上角一個圈圈裏面有三個點點=>連接伺服器=>輸入本機端的IP=>點選”訪客”

7.點選iPhone”照片”=>選擇要傳輸的照片=>點選左下角分享=>儲存到檔案=>點選剛連線的IP=>選擇剛設定的資料夾=>右上角儲存

8.完成

參考來源:https://www.kocpc.com.tw/archives/372935

使用BAT檔備份資料庫

大家好,這次要來分享如何使用BAT檔來進行資料庫的備份

使用的環境是,windows 10 & mysql資料庫

開始之前請先準備好mysqldump.exe這個檔案,如果使用的XAMPP這個軟體的話,可以去xampp\mysql\bin的資料夾底下去找

1.新增一個.bat檔

2.右鍵=>編輯

3.C:\mysqldump -u AAAAA -h 192.168.0.0 -pBBBBB XXXXX > D:\%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%.sql

C:\mysqldump<==這裡要輸入mysqldump.exe這個檔案的路徑

AAAAA<==這裡要輸入資料庫的username,本機端可以輸入root

192.168.0.0<==這裡要輸入ip,本機端輸入localhost or 127.0.0.1

BBBBB<==如果user有設密碼,在這輸入密碼,-p跟密碼之間不要有空格

D:\<==這裡輸入備份檔要儲存的路徑

%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%<==這裡可以輸入檔名,這裡使用的是使用日期及時間來當成檔名

用下面的案例來解釋,在cmt底下輸入date會出現==>現在日期是: 2134/07/29 週一

%date:~0,4%=>2134,在2134/07/29這一列資料從第0的位置擷取4個位置的資料

%date:~5,2%=>07,在2134/07/29這一列資料從第5的位置擷取2個位置的資料

%date:~8,2%=>29,在2134/07/29這一列資料從第8的位置擷取2個位置的資料

ps.2134/07/29,2這一欄的資料位置是第0個

參考來源:https://blog.miniasp.com/post/2009/11/03/How-to-get-system-date-time-in-batch-file-part-III

Windows FTP淺介

大家好,這次要來分享如何設定windows系統的FTP功能

使用的環境是,windows 10

1.在電腦新增一個資料夾

2.控制台=>程式與功能=>開啟或關閉windows功能

3.Internet Information Services=>FTP 伺服器=>將FTP 服務 及FTP 擴充性 都打開

4.Internet Information Services=>Web管理工具=>將IIS主控台打開

5.控制台=>系統管理工具=>打開Internet Information Services(IIS)管理員

6.左側欄位=>右鍵=>新增FTP站台

7.輸入想要設定的FTP站台名稱,實體路徑點選剛才新增的資料夾

8.IP位置輸入自己的IP,點選”沒有SSL(L)”欄位

9.點選”基本”,點選”指定的使用者”,下面的欄位輸入本機帳戶,點選”讀取”及”寫入”

10.控制台=>Windows Defender防火牆=>允許應用程式或功能通過Windows Defender防火牆=>變更設定=>將FTP伺服器”私人”及”公用”打開

11.開始=>設定=>帳戶=>家人與其他使用者=>將其他人新增至此電腦=>我沒有這位人員的登入資訊=>新增沒有Microsoft帳戶的使用者=>輸入相關資訊

12.Internet Information Services(IIS)管理員=>點選剛才新增的FTP站台=>FTP授權規則=>新增允許規則=>指定的使用者=>輸入剛才新增的使用者=>打開”讀取”及”寫入”

13.我的電腦=>實體路徑的資料夾=>右鍵.內容=>安全性=>編輯=>新增(D)=>輸入物件名稱來選取=>輸入剛才新增的使用者=>檢查名稱=>確定=>回到資料夾內容將剛才新增的使用者的權限.完全控制.允許

14.可用檔案總管的網址列或是瀏覽器的網址列輸入ftp://+IP,輸入帳號及密碼就可以開始使用了

參考來源:https://www.youtube.com/watch?v=ke3tnd73aUI

資料庫主從配置設定

大家好,這次要來分享關於資料庫主從複製的設定

使用的環境是,作業系統使用Ubuntu 20.10,資料庫使用Maribdb 10.3.25
先設定主(master)伺服器

第一步:先改設定檔

sudo vim /etc/mysql/mariadb.conf.d/50-server.cnf

1..找到這行,註解掉

bind-address = 127.0.0.1

2..找到這行,把後面的數字改掉,兩台(或多台)電腦記得不要設一樣就好
server-id = 1

3..找到這行,使其生效

log_bin = /var/log/mysql/mysql-bin.log

4..重啟maribdb

第二步:進入資料庫,設定有權限的使用者

1..進入資料庫,新增使用者
sudo mysql -u root -p
create user XXX;

2..給予使用者權限
grant replication slave on *.* to XXX@’%’ identified by ‘AAAA’;
3..查看master的狀態,並將file跟position的資料記下來
file:mysql-bin.000001
position:001
再來設定從(slave)伺服器

第三步:先改設定檔

sudo vim /etc/mysql/mariadb.conf.d/50-server.cnf

1..找到這行,註解掉

bind-address = 127.0.0.1

2.. 找到這行,把後面的數字改掉,兩台(或多台)電腦記得不要設一樣就好

server-id = 1

3..找到這行,使其生效
log_bin = /var/log/mysql/mysql-bin.log

4.設定連線資訊

change master to
master_host=’master IP’,
master_user=’XXX’,
master_password=’AAAA’,
master_log_file=’mysql-bin.000001′,
master_log_pos=001;

5..啟動slave
start slave;

6..檢查slave狀態
show slave status\G;

如果有顯示下面這行,代表連線成功,反之,有錯誤也會顯示
Slave_IO_State: Waiting for master to send event

參考來源:https://www.aiwalls.com/mysql/11/31676.html

Ubuntu系統(16.10),設定SoftRaid

大家好,這邊要為大家介紹在安裝ubuntu系統(16.10)的時候,設定raid 1的方法,要注意喔,不同版本的OS可能會有不同的步驟。

這裡安裝的步驟直接跳到partition disks (磁碟劃分)的部分。

1.Manual(手動)

2.選裝置代號sda=>yes=>回到sda下,選FREE SPACE(未使用空間)
=>Create a new partition(建立新分割區)=>輸入大小(記得留一些空間給swap設置)
=>Primary(主要)=>Beginning(開始位置)=>選Use as(用途)更改成physical volume for RAID
=>將Bootable flag: off(可開機設定:關)設定成on=>Done setting up the partition(分割區設定完成)
=>回到sda的另外一個FREE SPACE=> Create a new partition(建立新分割區)=>輸入大小(輸入剩餘空間)
=>Primary(主要)=>Beginning(開始位置)=>選Use as(用途)更改成physical volume for RAID
=>將Bootable flag: off維持原設定“關“=>Done setting up the partition(分割區設定完成)

3.選裝置代號sdb=>yes=>回到sda下,選FREE SPACE(未使用空間)
=>Create a new partition(建立新分割區)=>輸入大小(記得留一些空間給swap設置)
=>Primary(主要)=>Beginning(開始位置)=>選Use as(用途)更改成physical volume for RAID
=>將Bootable flag: off(可開機設定:關)設定成on=>Done setting up the partition(分割區設定完成)
=>回到sda的另外一個FREE SPACE=> Create a new partition(建立新分割區)=>輸入大小(輸入剩餘空間)
=>Primary(主要)=>Beginning(開始位置)=>選Use as(用途)更改成physical volume for RAID
=>將Bootable flag: off維持原設定“關“=>Done setting up the partition(分割區設定完成)

4.完成後,此時的sda跟sdb的配置應該要一樣。選擇Configure software RAID(設定軟體RAID)
=>YES=>Create MD device(建立MD裝置)=>RAID1=>Continue=> Continue=>用空白鍵選sda1跟
sdb1=>Create MD device(建立MD裝置)=>RAID1=>Continue=> Continue=>用空白鍵選sda2跟sdb2
=>Finish

5.選擇RAID1 device #0底下的#1空間=>Use as: do not use(用途:不使用)
更改成Ext4 journaling file system(Ext4日誌式檔案系統)=>Mount point:none(掛載點:無)
=>/ – the root file system(/ – root 系統檔案)=>Done setting up the partition(分割區設定完成)
=>RAID1 device #1底下的#1空間=>Use as: do not use(用途:不使用)更改成swap area(置換空間)
=>Done setting up the partition(分割區設定完成)=>Finish partitioning and write changes to disk(結
束磁碟分割作業並將寫入磁碟中)=>NO=>YES

6.然後就可繼續安裝流程,選擇要裝的套件之類。一直到最後要安裝grub開機管理程式時,選擇安裝在MBR上

參考來源:https://eric0806.blogspot.com/2014/06/install-ubuntu-server-use-softraid.html

1 2 3 4 5