對於Java新手,要如何開發Android Bluetooth App?

  1. 要寫Java程式,包括Android,一定要先安裝JDK(Java Developement Kit)
    1) 中文教學:http://rx1226.pixnet.net/blog/post/284754793-%5Bandroid-studio%5D-1-1-修改sdk和jdk位置
    2
    ) 前提是先抓 Java SE Development Kit 8u101
    http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
  2. 再來要寫Android App的話,就是要裝Android的開發環境,就是Android studio,怎麼抓?
    google搜尋:android studio download/ install
    – 如果抓下來安裝完後,不會設定、不知道要做什麼
    google搜尋:android studio tutorial / android studio 教學
    範例:http://androidstation.pixnet.net/blog/post/261391402-android-studio入門教學一:安裝和設定
  3. 要注意一點,以前開發android app是用eclipse,近幾年才改成android studio,所以在google時,注意一下google到的開發環境是哪一個,有時候看起來很像
  4. 弄完android studio後,需要安裝sdk(Software developement kit)
    google搜尋:android studio sdk
    範例:http://www.codedata.com.tw/mobile/android-tutorial-the-1st-class-2-android-sdk
所有環境弄好後,也試著把別人的範例程式抓下來,卻不知道如何下手或改寫?
在此我建議可以先從基本元件開始熟悉,我的熟悉方式和流程大約是
  1. 先創一個File-> New project-> empty activity
    – 如果到這邊不知道怎麼做的話,google搜尋:android studio new project
  2. 創好後,瀏覽一下左邊的檔案列表
    MainActivity_java_-_GmailTest_-____Documents_AndroidProject_GmailTest_
    看一看裡面的檔案有哪些,Java資料夾內有MainActivity.java,其他不重要
    再來res資料夾(resource)內有drawable(放圖片的)、layout(App的畫面呈現)、這兩個資料夾最重要,其餘可以之後有用到在學即可
    所以在layout裡,可以看到activity_main.xml檔,他就是App的主畫面,點進去看可以看到
    activity_main_xml_-_GmailTest_-____Documents_AndroidProject_GmailTest_
    可以試著切換Text和Design兩種呈現方式,基本上一開始只需要用Design的模式去做就好,換過去Design後,可以看到你的app畫面出來了
  3. 燒進去手機實體看看
    google搜尋:android studio 燒入手機
    範例:http://chiachiku.pixnet.net/blog/post/60204745-30分鐘做出自己的android-app
    如果
    找不到手機裡的開發人員模式在哪裡
    google搜尋:你的手機品牌 型號 開發人員
    範例:zenfone selfie 開發人員
燒成功後,再來就是試著熟悉元件了,元件就是有Button(按鈕)、TextView(文字方塊)、ImageView(圖片方塊)、EditText(編輯文字方塊)等等,還有很多元件,
但我建議這四個先練習過一次,怎麼練習?
  1. google搜尋:android button 教學
    google搜尋:android textview 教學
    google搜尋:android imageview 教學
    google搜尋:android edittext 教學
  2. 同樣都是照著裡面的程式,先照著打,不要複製貼上
  3. 一樣燒進去手機跑跑看
  4. 以button為例,跑完後,好,開始看網站上的教學,看一下網站上是如何解釋button程式碼的,如果沒有解釋,那再google下一個button教學,多看三、四個教學後,會發現有些共通點,都是寫在MainActivity內的onCreate()裡
  5. 這時,google搜尋:android oncreate
  6. 可以查到android作業系統內是如何控制App的存亡
  7. 再來button程式碼內,也都可以看到onClick
    google搜尋:android button onclick
  8. 可以查到onclick是做什麼的,沒查到就再查別人的教學
  9. 以此類推,把Button, TextView, ImageView, EditText的基礎程式碼學完
再回去看你抓過的Android範例程式碼,會發現你已經看得懂部分程式碼的運作了
以這個google的技巧為基礎,慢慢找出範例程式碼內的運作方式
Android App難的地方在於除了程式語言之外,還有包含作業系統
所以稍微複雜一點的App會用到Thread的概念
google搜尋:Android thread 教學

舉個例子:
可以看到有三個thread:
  1. AcceptThread
  2. ConnectThread
  3. ConnectedThread
都是跟藍芽連接有關的thread,網頁裡介紹的很詳細,可以先試著把程式碼燒進去兩隻手機裡,試跑看看能不能動
能動就來看看我們想改什麼?
假如想要改變成 藍牙圖片分享器
那麼可以想像,
應該要把原本藍牙聊天室的textview和edittext 改成 imageview和選取圖片的button
這時,就可以google: android button 選圖片

Sending different data types and different ways to graylog server(part. 2)

 

5. 使用Graylog Collector sidecar收集 graylog server上的 log file資料 至 graylog GELF UDP input

Collector sidecar主要架構圖:

Graylog_Collector_Sidecar_—_Graylog_2_0_0_documentation

跟著http://docs.graylog.org/en/2.0/pages/collector_sidecar.html走 (windows 和 linux都有)

1) 安裝nxlog => 記得安裝完nxlog後,要先把nxlog service停下來,再改由graylog去控制nxlog

2) 安裝collector sidecar

3) 設定!!!(最麻煩的部分)

A. collector_sidecar.yml:

server_url: http://140.116.221.54:12900
node_id: graylog-collector-sidecar
collector_id: file:/etc/graylog/collector-sidecar/collector-id
tags:
    - linux
    - graylog
    - server
log_path: /var/log/graylog/collector-sidecar
update_interval: 10
log_rotation_time: 10
log_max_age: 10
backends:
    - name: nxlog
      enabled: true
      binary_path: /usr/bin/nxlog
      configuration_path: /etc/graylog/collector-sidecar/generated/nxlog.conf

– server_url要對到graylog server的port 12900,在System-> node-> REST API可看到該設多少

– node_id可隨意取,之後在graylog web抓到會顯示你這邊設定的node_id

– collector_id這個在安裝的時候,就會順便給,不需要動(除非安裝graylog collector的路徑有變更)

– tags 在graylog web會找你本地端這邊設定的tags 去對應到 web端設定的configurations的tags

– backends這邊我只試過nxlog來蒐集,在蒐集windows的log時,如果yml設定檔內有其他backend,就先都砍掉,只留nxlog

 

B. 上面設定完後,連接到graylog web介面-> System-> Collectors -> Manage configurations-> Create configuration->隨意取

– tag就填入剛剛在yml檔內設定的tags

– Configure Collector Outputs: 這邊所設定的Output,指的是 資料被蒐集的本地端所安裝的collector 要output到哪裡
當然是要output到graylog server的input囉,所以這邊設定完的output,別忘記也要到graylog web-> System-> Inputs去新增一個對應的input

– Configure Collector Inputs:
type有四種:
1| [NXLog] file input: 指的是 想被蒐集資料有安裝collector sidecar本地端的file
2| [NXLog] Windows Event log: Windows下的event log
3| [NXLog] UDP Syslog Listener: 還不是很懂QQ
4| [NXLog] TCP Syslog Listener: 還不是很懂QQ

Input的Forward to就是到上面所設定的Collector Outputs,也就是forward到graylog的input裡,
在collector這邊所設定的都會即時更新到 有安裝collector sidecar那端上,可以把web介面的collector設定想像成在本地端做設定的感覺,會比較好懂collector input和output

– Define Snippets

1| Backend目前好像只能選擇NXLog (?
2| Snippet就是寫上附加的資訊(外掛之類的訊息),會即時更新到 有安裝collector sidecar那端上
所以可以試試看在snippet加上 #hello 的字眼,然後到 有安裝collector sidecar那端上 查看collector_sidecar.yml檔有沒有被更改

 

設定完,”理論上”就會有資料上傳到graylog的input裡了

 

 

疑點解決:

如果設定完後,還是沒有資料進來怎麼辦?

1. 先檢查collector是否有成功安裝、連線:
Graylog_Web_Interface
這邊有出現,並且對應到正確的OS、collector id(可在collector-sidecar/collector-id內查看),就是有成功連線

在web collector頁面,按show message後沒有資料,就是configuration有出問題

 

2. 檢查兩端(web、有安裝sidecar那端)configuration的tags是否有相同對應:

兩端的tags一定要相同,有安裝sidecar那端的collector才抓得到configuration哦,
否則只是一個空的collector而沒有設定input和output,自然就不會有資料流動囉

*再真的沒有資料的話,可試試看把tags換掉

 

3. 檢查collector output是否有對應到graylog input的ip和port(重要)

graylog input的bind_address 和 collector output的server ip是要一樣的哦!!
port也要開同一個port,例如12210

 

4. 以上幾點都檢查完後,要檢查collector input是否有讀到,有一個最簡單的方法
在collecotor input設定一個[NXLog] file input,
path to logfile就設定隨便一個空的文件檔(e.g. hello.txt,自己創在桌面之類的)
設定完後,試著修改hello.txt,改完存檔後,再到collector按show message看是否有修改資料上傳

 

這邊有測試到一個情況是一個軟體把logfile都lock住,導致input讀不到,目前無解…

比較爛的方式就是複製出一份沒lock的,再上傳

對了! 在collector input的path to logfile的檔名可以設定用 XXX/*.log,就可以把XXX資料夾裡面的所有副檔名為log的都抓進去

colorful ‘ls’ command in mac terminal

看到Ubuntu的command line上的 ls 都很繽紛

很容易就可以看出資料夾與檔案的差別

就不用看得眼花撩亂

於是google一下發現有一篇超棒!

裡面還有一個網站是可以手選顏色在自動產生指令去修改顏色

先到 ~

ls -al

找到.bash_profile檔

vim /.bash_profile

在最下面加入

export CLICOLOR='true'

export LSCOLORS="gxfxcxdxcxegedabagacad"

畫面就票釀囉

 

分享一下現在我的bash_profile:

RongSonHo_—_vim____bash_profile_—_80×24

參考:

  1. mac 讓終端機ls有顏色: http://sodahau.logdown.com/posts/18879-mac-ls

How to set up graylog server on Ubuntu 14.04?

 

1. OpenSource 資料蒐集&分析平台比較:

https://www.evernote.com/l/AfBaqPuTRHBINLW7Fcafv2jffYx4WnTqau8

 

2. graylog簡介:
https://www.graylog.org/overview

 

3. 從零到架設

1) Java SE 8:
http://rongson.twbbs.org/wordpress/how-to-install-java-se-8-in-ubuntu-14-04/

2) MongoDB:
sudo apt-get update

sudo apt-get install mongod

* 檢查是否有執行: ps aux | grep mongod

3) ElasticSearch:
Ubuntu_installation_—_Graylog_2_0_0_documentation

* 檢查是否有執行: ps aux | grep elasticsearch

若沒有,就重開機:sudo reboot

4) Graylog:

檢查完前兩項mongodb, elasticsearch都有設定好且啟動後,再進行graylog安裝

Ubuntu_installation_—_Graylog_2_0_0_documentation

設定password_secret:`pwgen -N 1 -s 96` => 產生的亂碼複製到/etc/graylog/server/server.conf內的password_secret欄位

和root_password_sha2:echo -n yourpassword | shasum -a 256 =>  產生的亂碼複製到/etc/graylog/server/server.conf內的root_password_sha2欄位

 

*成功後,如何開啟graylog服務?

=> `sudo rm -f /etc/init/graylog-server.override`

=> `sudo start graylog-server`

*確認graylog server有否開啟服務?

=> ps aux | grep graylog

若沒有開啟,就是Java版本有問題,請更新到java se 8

Desktop_—_sinpao_graylog-server___etc_graylog_server_—_ssh_sinpao_140_116_221_54_-p_22_—_113×36

不能openjdk哦!

 

5) 設定graylog web interface:

看:http://docs.graylog.org/en/2.0/pages/configuration/web_interface.html#configuring-webif-nginx

一樣到/etc/graylog/server/server.conf裡修改參數即可(跟剛剛設定密碼一樣檔案)


1. web_enable =true

2. rest_listen_uri = http://YourServerIp:12900/  (不是127.0.0.1:12900)

3. web_listen_uri = http://YourServerIp:9000/   (不是127.0.0.1:9000)

4. web_enable_cors = false

5. web_enable_gzip = true

 

=> 設定完,即可用瀏覽器輸入 YourServerIp:9000 就進去囉

預設帳密是admin / admin

參考:

1. graylog doc – OS packages: http://docs.graylog.org/en/2.0/pages/installation/operating_system_packages.html

2. graylog doc – Ubuntu steps by steps: http://docs.graylog.org/en/2.0/pages/installation/os/ubuntu.html

 

Sending different data types and different ways to graylog server(part. 1)

1. 在terminal以curl指令傳送json格式單次封包 至GELP HTTP input

=> (port 設為 12202)

ex. curl -XPOST http://140.116.163.151:12202/gelf -d ‘{“short_message”:”trytryRS”}’

ex. curl -XPOST http://140.116.163.151:12202/gelf -d ‘{“short_message”:”trytryRS”, “host”:”rongson”, “facility”:”rongsons mac”, “_test”:”hello”}’

1Graylog_Web_Interface

 

2. 以tcp client傳送單次plaintext封包

=> (port 12203)

import java.io.*;
import java.net.*;

class TcpClient
{
    public static void main(String argv[]) throws Exception
    {
          String sentence;
          String modifiedSentence;
          BufferedReader inFromUser = new BufferedReader( new InputStreamReader(System.in));
          Socket clientSocket = new Socket("140.116.163.151", 12203);
          DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
          BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
          System.out.print("Input: ");
          sentence = inFromUser.readLine();
          outToServer.writeBytes(sentence + '\n');
          System.out.println("OVER");
          //modifiedSentence = inFromServer.readLine();
          //System.out.println("FROM SERVER: " + modifiedSentence);
          clientSocket.close();
    }
}

tcp

Graylog_Web_Interface

 

3. udp client傳送單次plaintext封包

=> (port 12204)

import java.io.*;
import java.net.*;
 
// 1. 本程式必須與 UdpServer.java 程式搭配執行,先執行 UdpServer 再執行本程式。
// 2. 本程式必須有一個參數,指定伺服器的 IP。
// 用法範例: java UdpClient 127.0.0.1
 
public class udpClient extends Thread {
    int port;            // port : 連接埠
    InetAddress server; // InetAddress 是 IP, 此處的 server 指的是伺服器 IP
    String msg;            // 欲傳送的訊息,每個 UdpClient 只能傳送一個訊息。
 
    public static void main(String args[]) throws Exception {
        for (int i=0; i<100; i++) {
            // 建立 UdpClient,設定傳送對象與傳送訊息。
            udpClient client = new udpClient(args[0], 12204, "UdpClient : "+i+"th message");
            client.run(); // 啟動 UdpClient 開始傳送。
        }
    }
 
    public udpClient(String pServer, int pPort, String pMsg) throws Exception {
        port = pPort;                             // 設定連接埠
        server = InetAddress.getByName(pServer); // 將伺服器網址轉換為 IP。
        msg = pMsg;                                 // 設定傳送訊息。
    }
    public void run() {
      try {
        byte buffer[] = msg.getBytes();                 // 將訊息字串 msg 轉換為位元串。
        // 封裝該位元串成為封包 DatagramPacket,同時指定傳送對象。
        DatagramPacket packet = new DatagramPacket(buffer, buffer.length, server, port); 
        DatagramSocket socket = new DatagramSocket();    // 建立傳送的 UDP Socket。
        socket.send(packet);                             // 傳送
        socket.close();                                 // 關閉 UDP socket.
      } catch (Exception e) { e.printStackTrace(); }    // 若有錯誤產生,列印函數呼叫堆疊。
    }
}

Graylog_Web_Interface

 

4. 以Java TCPClient 寫入Json格式 傳送到 graylog GELF TCP input

import java.io.*;
import java.net.*;
import org.json.*;

class TcpClientJson
{
    private String host;
    private int port;
    private Socket socket;
    private final String DEFAULT_HOST = "localhost";


    public void connect(String host, int port) throws IOException {
        this.host = host;
        this.port = port;
        socket = new Socket(host, port);
        System.out.println("Client has been connected..");
    }

    public JSONObject receiveJSON() throws IOException {
        InputStream in = socket.getInputStream();
        ObjectInputStream i = new ObjectInputStream(in);
        JSONObject line = null;
        try {
            line = (JSONObject) i.readObject();

        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
             e.printStackTrace();

        }
        return line;
    }
    public void sendJSON() throws IOException {
        JSONObject jsonObject2 = new JSONObject();
        jsonObject2.put("RS", "Hello Java Json");
        jsonObject2.put("host", "RS");
        jsonObject2.put("facility", "test");
        jsonObject2.put("_foo","bar");
        jsonObject2.put("short_message","hello");

        OutputStream out = socket.getOutputStream();
        DataOutputStream o = new DataOutputStream(out);        
        System.out.println("Hello sendJson");

        o.writeBytes(jsonObject2.toString()+'\0');
        System.out.println(jsonObject2.toString());

        out.flush();
        //System.out.println("Sent to server: " + " " + jsonObject2.get("key").toString());
    }

    public static void main(String argv[]) throws Exception
    {
      TcpClientJson client = new TcpClientJson();
        try{

            client.connect("140.116.221.54", 12299);
            // For JSON call sendJSON(JSON json) & receiveJSON();

            client.sendJSON();
            //client.receiveJSON();
        }
        catch (ConnectException e) {
            System.err.println(client.host + " connect refused");
            return;
        }

        catch(UnknownHostException e){
            System.err.println(client.host + " Unknown host");
            client.host = client.DEFAULT_HOST;
            return;
        }

        catch (NoRouteToHostException e) {
            System.err.println(client.host + " Unreachable");
            return;

        }

        catch (IllegalArgumentException e){
            System.err.println(client.host + " wrong port");
            return;
        }

        catch(IOException e){
            System.err.println(client.host + ' ' + e.getMessage());
            System.err.println(e);
        }
        finally {
            try {
                client.socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public static String getUserString(){
        BufferedReader inFromUser = new BufferedReader( new InputStreamReader(System.in));
        System.out.print("Input: ");
        String sentence="hello";
        try{
            sentence = inFromUser.readLine();
        }catch(IOException e){
            System.out.println(e);
        }
        return sentence;
    }
}

Graylog_Web_Interface

* 記得在java tcpclient端傳送前,要在結尾加入+’\0’,否則graylog gelf tcp input會收到流量,但不會顯示資料

參考:https://github.com/Graylog2/graylog2-server/issues/643

 

 

還有part.2
http://rongson.twbbs.org/wordpress/sending-differen…g-server(part-2)/

Using differant platforms and wordpress plugins to display codes

1. 試貼java: pastie
———–

2. 產生html原始碼:https://tohtml.com/java/


import java.util.Scanner;
import java.io.BufferedReader;

class Hello{
	private static String message;

	public static void main(String[] args){
		Scanner input = new Scanner(System.in);
		System.out.print("你素隨?: ");
		message = input.nextLine();
		String name= message;
		System.out.println("安捏! " + message + " 哩賀~~~~~");
		System.out.print(message +" 來跟大家說一句祝福的話吧: ");
		message = input.nextLine();
		System.out.println("yoyoyo, " + name + " 要跟大家說這些話,大家要認真聽哦!");
		System.out.println(": "+ message);
	}	
	
	public static void dosomething(){

	}
}

3. 換個, pastebin

4 . 再用個ideone

 

5. try內建外掛:Shortcodes Ultimate

 

6. try內建外掛:simple code highlighter

import java.util.Scanner;
import java.io.BufferedReader;

class Hello{
	private static String message;

	public static void main(String[] args){
		Scanner input = new Scanner(System.in);
		System.out.print("你素隨?: ");
		message = input.nextLine();
		String name= message;
		System.out.println("安捏! " + message + " 哩賀~~~~~");
		System.out.print(message +" 來跟大家說一句祝福的話吧: ");
		message = input.nextLine();
		System.out.println("yoyoyo, " + name + " 要跟大家說這些話,大家要認真聽哦!");
		System.out.println(": "+ message);
	}	
	
	public static void dosomething(){

	}
}

How to swtich between finder & terminal in Mac OS X?

有時候會在terminal下工作,切換到常用的資料夾時

不想用vim編輯時,就會想開finder,再用編輯器開啟檔案去做點事情

但開啟finder後,還要慢慢切到資料夾,超級麻煩!

 

1. 在terminal切好資料夾後,想開起finder直接到此資料夾:

=> open .

 

2. 在finder想切到terminal下工作:

=> 先開啟terminal,打好cd+space,再將finder的資料夾拖進去terminal,再按enter

 

App Icon素材下載

1. Noun Project: https://thenounproject.com/search/?q=park

黑白簡易的icon,適合做概念圖Noun_Project_Search

2. IconFinder: https://www.iconfinder.com

風格多樣,有彩色圖片,付費圖片頗多,但可勾選Free的搜尋

付費圖片會有陰影,所以不能直接抓圖

Document_icons_-_Download_29301_free__amp__premium_icons_on_Iconfinder

3. FlatIcon: http://www.flaticon.com

圖片風格多樣,大部分可以免費下載,

如果免費下載要做商業用途,記得通知作者、網站!

推~~~~佛心網站
Search_results_for_Document_-_Flaticon

4. easyicon: http://www.easyicon.net

很可愛的網站,可以選icon要什麼顏色的,超酷!

個人覺得很實用~~~

document_PNG、ICO、ICNS_Icons_search_and_download_easyicon_net

5. Premiumpixel: http://www.premiumpixels.com/page/1/?s=icon

圖片風格精緻,但大小不能調整,下載下來為一張圖片,須自行擷取小張圖

Search_Results_icon

參考:

1. icon 圖示免費下載!介面設計師用得到的9個免費圖庫:
http://www.playpcesor.com/2015/03/icon-free-download.html