大馬旅遊淺談(二)

大家好,今天要跟大家繼續來分享近日去馬來西亞的一些旅遊小心得。

這次是選擇搭乘華航飛吉隆坡,感覺還不錯,有很多電影、音樂、戲劇及小遊戲可以選擇,不知道其他航空公司是否有不一樣的選項。落地之後就要準備出關及拿行李,網路上有謠言傳道,海關人員會用消極的態度或藉機刁難來試圖得到額外的費用,本人沒有明顯遇到,接下來的過程還算順利,出了機場就見到來接機的友人。沿路上的風景以及移動的時間都會感覺到馬來西亞是個比台灣大很多的國家,在路上蠻常見到6人(或以上)座的車輛。這趟旅遊的第一站是位於吉隆坡會展中心(Kuala Lumpur Convention Center)底下的吉隆坡水族館(Aquaria KLCC),第一印象是,果然是首都,感覺很難停車,還好不是自駕,辛苦友人了。水族館裡面的動線、環境、展示的水中生物及生態都還不錯,老少咸宜。逛完之後前往第二站,就是我以為是在新加坡,其實是在馬來西亞的吉隆坡雙子星塔(Petronas Twin Towers),曾是世界最高的摩天大樓,目前則是世界上最高的雙棟大樓。這裡會有很多遊客在與雙峰塔合照,感覺夜間的風景更適合拍照。下一個地點是大概距離10分鐘車程的觀光小吃街-亞羅街(Jalan Alor),這裡也是人潮的聚集地,各種價格便宜的當地美食、水果,某些攤位看起來可能有衛生疑慮,但是當地的友人都說放心,不會有水土不服的問題。要提醒大家,不管去哪個國家,只要是人多的地方,注意身上的財物及隨身包包,以免掃興。

大馬旅遊淺談(一)

大家好,今天想要跟大家來分享近日去馬來西亞的一些旅遊小心得,內容怕太冗長,會分次向大家來做報告,謝謝大家。

這次去馬來西亞是八天七夜的行程,自由行,主要在吉隆坡、檳城還有蘭卡威旅遊。

D day:出發,停車,機場報到,登機,出海關,吉隆坡水族館 Aquaria KLCC,雙峰塔,亞羅街夜市,住宿(Espira Kinrara)

這不是清潔工第一次出國,卻是第一次參與大部分的流程(買機票、安排行程..),所以有點緊張,一直在做功課,然後整天窮擔心。首先的第一步建議大家先去檢查護照有沒有過期。再來就是買機票、安排住宿以及打包行李。總算在出發前總算順利完成大部份我可以做的事了。因為選擇開車前往機場,所以有做好提早出門的打算,那天是上午八點半的飛機,大概三點半出發前打去問,A停車場已經沒有停車位了,但是對方說可以去B停車場問問,於是打了電話過去問,對方只說目前還有,但無法保留。大概快五點到B停車場,蠻多車在排隊,還好有順利停進去,因為我的下一台車就無法用信用卡的優惠來停,只能現金停車。辦完手續(確認回國時間、上下車地點、聯絡方式)大概不到10分鐘就坐上接駁車,約5-10分鐘就到機場。司機是個年輕人,20出頭,我在想如果是我,這麼早就要開始工作或是到了早上五點還沒下班,或許我沒辦法保持這麼親切的態度,給個讚!雖然已經先在網路完成報到了,可是還是要去櫃台辦理手續,行李完成秤重後服務人員會跟你確認相關資訊然後在行李上貼票卡,在這個時候也會拿到實體的機票。再來就要出海關。現在蠻方便的,出關用機器辦理,準備好護照,照著機器的指示操作(護照打開到有照片及簽名那一面放在感應區,臉對著鏡頭),各項標示我覺得都蠻清楚的。下一步,找登機口,然後聽從指示分批上飛機。

待續…..

手動設定IP淺談

大家好,今天要跟大家淺談的題目是-手動設定IP。

大多數人在使用網路的時候,應該不會對於IP、DNS伺服器這些進階的設定這麼熟悉,如果有需要指定IP(固定IP)來解決生活或是工作上的狀況,那麼,該怎麼做呢?下面的範例是針對區域網路來做介紹。

作業系統:Windows 10 以上

ps 不論是使用有線或是無線的方式,設定都大同小異。

1.開始==>右鍵==>設定==>網路和網際網路==>乙太網路(or Wi-Fi)==>IP指派==>編輯==>下拉式選單==>手動==>IPV4==>關閉==>開啟

2.在”IP位址”下方的欄位輸入設定,例:192.168.1.10

3.在”子網路遮罩”下方的欄位輸入設定,例:255.255.255.0

4.在”閘道”下方的欄位輸入設定,例:192.168.1.1

5.在”慣用的DNS”下方的欄位輸入設定,例:192.168.1.2

6.在”其他DNS”下方的欄位輸入設定,例:192.168.1.254

7.儲存

參考網址:https://obsproject.com/

共用資料夾淺談

大家好,今天要跟大家來聊聊OS-Windows裡面的一項功能,共用資料夾。

假如在辦公室裏面,要傳檔案給同事,在相同的網路環境下,相信有很多人都會使用到”共用資料夾”這個功能,那麼,該如何設定呢?

1.點選要分享的資料夾,右鍵==>授與存取權給(G)==>特定人員。

2.點選中間的下拉式選單==>建立新使用者

3.管理其他帳戶==>在[電腦設定]中新增使用者

4.將其他人新增至此電腦==>我沒有這位人員的登入資訊==>新增沒有 Microsoft帳戶的使用者==>設定一組使用者帳號及密碼==>下一步==>回到步驟1

5.點選中間的下拉式選單==>點選剛剛新增的使用者==>共用==>完成

參考網址:https://support.microsoft.com/zh-hk/windows/%E5%9C%A8-windows-10-%E4%B8%AD%E9%80%8F%E9%81%8E%E7%B6%B2%E8%B7%AF%E5%85%B1%E7%94%A8%E6%AA%94%E6%A1%88-b58704b2-f53a-4b82-7bc1-80f9994725bf

OBS淺談

大家好,今天要跟大家介紹一款軟體,Open Broadcaster Software,比較常聽到的名稱是OBS。

OBS是由OBS Project開發,在官網上的介紹是用於影片錄製及直播,相信在很多平台例如YOUTUBE及FB都可以看到有多使用者利用直播來販賣商品或是玩遊戲與觀眾互動,甚至有些遊戲玩家會使用直播遊戲的方式以獲取遊戲中的獎勵,接下來跟大家分享如何在Facebook上做遊戲直播。

OBS版本:29.0.2(64-bit,windows)

1.打開OBS,在主畫面下方找到”來源”這個欄位的下方,點選”+”的符號,選擇視窗擷取,建立新來源==>視窗擷取==>確定,在”視窗”欄位選擇要直播的遊戲==>確定。

2.這個步驟要來示範如何在直播畫面中放置固定的圖片或LOGO,如果沒有這個需求,可以略過此步驟。在主畫面下方找到”來源”這個欄位的下方,點選”+”的符號,選擇圖片,建立新來源==>圖片==>確定,圖片檔案==>瀏覽==>選擇需要的圖檔。

3.這個時候OBS的主畫面上半部應該會有選定的遊戲視窗(以及圖片、LOGO),點選”來源”欄位裡面的”視窗擷取”或是”圖片”,可以看到OBS畫面中的遊戲視窗有出現紅色的框線,這個時候的狀態就是可以移動及調整所擷取的視窗大小,需要移動或調整圖片大小的方法相同。

4.打開FB,選擇”直播視訊”,選擇要發佈的位置(動態或是社團),開始直播==>選擇,找到”選擇視訊來源”的欄位,選擇串流軟體,成功後會出現串流金鑰。

5.回到OBS,在主畫面下方找到”控制項”這個欄位,點選”設定”,選擇”串流”,在”服務”的欄位選擇Facebook Live,”串流金鑰”的欄位輸入剛剛FB的串流金鑰。回到OBS主畫面之後在”控制項”這個欄位選擇”開始串流”。

6.回到FB,確認畫面有連結到遊戲視窗後,如果有需要輸入”標題”及”說明”,可以在這兩個欄位輸入文字敘述,點選開始直播。

參考網址:https://obsproject.com/

javaFX元件2-3事

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

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

Check_Order_Workers_Price();

});

參考資料:https://stackoverflow.com/questions/30160899/value-change-listener-for-javafxs-textfield

偵測TableView的資料列,當條件符合時改變字體顏色。

/*NOTE 字體變色*/
s03.setCellFactory(column -> {
return new TableCell() {
@Override
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty);

if(item == null || empty) {
setText(null);
setStyle(“”);
} else {
// Format date.
setText(item);
// Style all dates in March with a different color.
if(item.equals(“銷售”)) {
setTextFill(Color.GREEN);
// setStyle(“-fx-background-color: yellow”);
} else {
setTextFill(Color.RED);
}
}
}
};
});

偵測元件上的鍵盤動作
tf.setOnKeyPressed(new EventHandler<KeyEvent>() {

@Override

public void handle(KeyEvent event) {

if(event.getCode() == KeyCode.A){

// do something

}

}

});

tf.setOnKeyPressed(new EventHandler<KeyEvent>() {

@Override

public void handle(KeyEvent event) {

if(event.getCode() == KeyCode.A){

// do something

}

}

});

參考資料:http://www.javafxchina.net/blog/2015/09/javafx-key-event/

使用Eclipse開發Android相關設定問題!

2018年Android開發平台已經由Google自家的Android Studio為主,其他IDE如Eclipse跟NetBeans很難找到資源,這裡記錄這兩週在建置Eclipse FOR Android時遇到的點點滴滴。

首先是Android SDK開發套件,官方已不容易找到載點。

不容易找到載點

複習如何建立Eclipse for Android開發環境:

https://www.jianshu.com/p/c0c2f8a46cb0

SDK遇到閃退,解決連結:

http://yu0410aries.blogspot.tw/2013/06/sdk-manager.html

https://hk.saowen.com/a/26bf2c7dc7a0c320ea138042c8590ad40d6a4ffd12f115c039eb1afc55e61d5e

https://blog.csdn.net/fl1623863129/article/details/72199816

https://blog.csdn.net/xzlAwin/article/details/45959183

http://blog.xuite.net/free6d1823/blog/76401242-Eclipse+%E8%A3%9D%E5%AE%8C+ADT,+Window+%E5%BA%95%E4%B8%8B%E7%9C%8B%E4%B8%8D%E5%88%B0+Android+SDK+Manager

複習如何安裝SDK:

https://www.androidcentral.com/installing-android-sdk-windows-mac-and-linux-tutorial

http://www.tshopping.com.tw/thread-250607-1-1.html

http://learnexp.tw/%E3%80%90android%E3%80%91%E6%A8%A1%E6%93%AC%E5%99%A8eclipse%E5%AE%89%E8%A3%9D%E6%95%99%E5%AD%B8%E6%96%B0-%E5%BE%9E0%E5%88%B01/

http://www.laird.tw/2016/11/eclipse-android-with-os-x.html

SDK在Win10內的變數設定Path:

https://jingyan.baidu.com/article/15622f2434bc5cfdfcbea51c.html

Android SDK manager結構:

https://blog.csdn.net/u011026779/article/details/53178602

eclipse中graphical layout不顯示手機預覽窗口的問題解決方法(嘗試失敗未解決):

https://read01.com/zh-tw/PMdMzg.html#.WrrwPYhuaUl

https://ifun01.com/V9GPFOY.html

https://blog.csdn.net/myapplication/article/details/47128487

原文網址:https://read01.com/PMdMzg.html

關鍵解決方法:

發現了以元素’d:skin’ 開頭的無效內容。此處不應含有子元素。

http://mydebug.blogspot.tw/2016/01/httpwww.html

https://cnbin.github.io/blog/2016/06/12/da-kai-eclipsebao-cuo-:fa-xian-liao-yi-yuan-su-d-skin-kai-tou-de-wu-xiao-nei-rong-.-ci-chu-bu-ying-han-you-zi-yuan-su/

方法1: 在SDK Manager里删除Android-wear相关的image

方法2: 进入sdk目录下,把

..\android-sdk\system-images\android-22\android-wear\armeabi-v7a\devices.xml和..\android-sdk\system-images\android-22\android-wear\x86\devices.xml文件删除,再把sdk里面..\android-sdk\tools\lib\下的devices.xml拷贝到上述两个文件夹里,重启eclipse即可

adb server is out of date 啟動失敗:

https://blog.csdn.net/liranke/article/details/42524851

解决Android library project cannot be launched

https://blog.csdn.net/welovesunflower/article/details/7990952

解決Unable to build: the file dx.jar was not loaded from the SDK folder

https://blog.csdn.net/qq_32224139/article/details/69525946

https://stackoverflow.com/questions/43009679/unknown-error-unable-to-build-the-file-dx-jar-was-not-loaded-from-the-sdk-fold/43040723

對岸的問題小彙整:

https://blog.csdn.net/androiddevelop/article/details/8130416

https://www.jianshu.com/p/1cc1d2df7f95

Android ADT整合包下載(老舊版本啟動失敗):

http://forum.jeasy.info/viewtopic.php?f=61&t=1521

Eclipse自帶jre檔方法:

http://joerong666.iteye.com/blog/309911

關鍵:

在eclipse.c中,有查找shipped VM的代码,eclipse.exe会先查找有没有自带的JVM,有的话就用它启动:
  /* Find the Directory where the Eclipse program is installed. */
  programDir = getProgramDir();
  …
  
  /* If the user did not specify a VM to be used */
  if (vmName == NULL)
  {
  /* Determine which type of VM should be used. */
  vmName = ((debug needConsole) ? consoleVM : defaultVM);
  
  /* Try to find the VM shipped with eclipse. */
  shippedVM = malloc( (_tcslen( programDir ) + _tcslen( shippedVMDir ) + _tcslen( vmName ) + 10) * sizeof(_TCHAR) );
  _stprintf( shippedVM, _T_ECLIPSE(“%s%s%s”), programDir, shippedVMDir, vmName );
  JavaVM = findCommand( shippedVM );
  
  /* Format a message to indicate the default VM search path. */
  vmSearchPath = malloc( (_tcslen( pathMsg ) + _tcslen( shippedVM ) + _tcslen( vmName ) + 10) * sizeof(_TCHAR) );
  _stprintf( vmSearchPath, pathMsg, shippedVM, vmName );
  free( shippedVM );
  shippedVM = NULL;
  }
  
  eclipseWin.h
  _TCHAR* consoleVM   = _T(“java.exe”);
  _TCHAR* defaultVM   = _T(“javaw.exe”);
  _TCHAR* shippedVMDir = _T(“jre\\bin\\”);
  
  这样就可以通过自带JRE解决客户端库不完全的问题

舊版Java官方載點,需申請Oracle帳密:

http://www.oracle.com/technetwork/java/javase/archive-139210.html

Eclipse 自帶jre啟動運行測試

Eclipse 2016,2017,2018+自留存java 8皆成功啟動並可輸出apk於手機運行

自留存java7,9,10皆無法正常運作(找不到jre檔案)

交叉比對,java 7 x64版jre搭配2018版Eclipse啟動成功!

交叉比對,java 9 x64版jre搭配2018版Eclipse啟動成功!

交叉比對,java 10 x64版jre搭配2018版Eclipse啟動….無法重新安裝(系統玩壞了)….暫時擱置測試,待新版java或有空再測試。

Eclipse 2018+安裝java 10皆成功啟動並可輸出apk於手機運行

目前決定開發環境-沿用2018年版Eclipse+Java8+Android+Gluon(測試中)

Eclipse 2018+系統安裝java啟動運行測試

皆可正常運作,不分java版本

版權聲明:網路搜尋連結,供建立環境快速查找使用,因無個論壇帳號,故留存連結,如原作者有疑義,請mail給我將連結移除mail:gerry.aaa@yahoo.com.tw

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 TableViewCostumerSort extends Application {

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

private final ObservableList 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(
“firstName”));

TableColumn moneyCol = new TableColumn(“Money”);
moneyCol.setMinWidth(100);
moneyCol
.setCellValueFactory(new PropertyValueFactory(
“Money”));

TableColumn emailCol = new TableColumn(“Email”);
emailCol.setMinWidth(200);
emailCol.setCellValueFactory(new PropertyValueFactory(
“email”));

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

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

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

/*資料形式轉換*/
double r1_d = 0.0;
double r2_d = 0.0;
if (param.getComparator() != null) {
r1_d = Double.parseDouble(r1.getMoney().replaceAll(“,”, “”).trim());
r2_d = Double.parseDouble(r2.getMoney().replaceAll(“,”, “”).trim());
}

/*資料空值try-catch*/
String col_s = “”;
String _sort_s = “”;

try {
col_s = param.getSortOrder().get(0).getText();
_sort_s = param.getSortOrder().get(0).getSortType().toString();
} catch (java.lang.IndexOutOfBoundsException e) {
System.out.println(e);
}

/*設定選取Money欄位時動作*/
if (col_s.equals(“Money”) && !col_s.equals(“”)) {
if (_sort_s.equals(“ASCENDING”)) {
if (r1_d > r2_d) {
/* 0&-1是不排序1是排序 */
return 1;
} else if (r1_d < r2_d) {
/* 0&-1是不排序1是排序 */
return -1;
} else if (param.getComparator() == null) {
/* 0&-1是不排序1是排序 */
return 0;
} else {
/*預設判斷*/
return param.getComparator().compare(r1, r2);
}
} else if (_sort_s.equals("DESCENDING")) {
if (r1_d r2_d) {
/* 0&-1是不排序1是排序 */
return -1;
} else if (param.getComparator() == null) {
/* 0&-1是不排序1是排序 */
return 0;
} else {
/*預設判斷*/
return param.getComparator().compare(r1, r2);
}
} else {
/*預設判斷*/
return param.getComparator().compare(r1, r2);
}
} else {
try {
/*預設判斷*/
return param.getComparator().compare(r1, r2);
} catch (java.lang.NullPointerException e) {
/*排序*/
System.out.println(e);
return 0;
}
}

}
};

/*預設複寫狀態成立*/
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);
}

}
}

1 2 3 4 5