2015年8月27日 星期四

「Android 」android full screen

在onCreate中寫這二行

//Remove title bar
this.requestWindowFeature(Window.FEATURE_NO_TITLE);

//Remove notification bar
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
寫在setContentView上面


資料來源:

2015年8月26日 星期三

[swift]swift 筆記6 - enum

以下是一個基本的列舉範例

enum Operator
{
    case ADD
    case EDIT
    case DELETE
    case SELECT
}


你也可以一行寫完它




enum DataOperator
{
    case ADD,DELETE,EDIT,SELECT
}






使用方法
var Op = Operator.EDIT

以下是一個錯誤範例,swfit很嚴謹,在switch case的情況下,

你必須使用全部的列舉項目,不然就要加上default才行


//多重分支控制 (要嘛寫default 要嘛全部列舉選項都要寫)

switch Op{
    
case .ADD :
    break
    
case .DELETE:
    break

case .EDIT:
    break
    
}

以下二種寫法都是正確的


//多重分支控制 (要嘛寫default 要嘛全部列舉選項都要寫)

switch Op{
    
case .ADD :
    break
    
case .DELETE:
    break

case .EDIT:
    break
    
case .SELECT:
    break
}

//多重分支控制 (要嘛寫default 要嘛全部列舉選項都要寫)

switch Op{
    
case .ADD :
    break
    
case .DELETE:
    break

case .EDIT:
    break
    
default :
    break
}

亦可定在定亦列舉時給定參數


//聯合值
enum BarCode
{
    case QRCODE(String)
    case UPCA(Int,Int ,Int)
}

//定義一個變數barcode
var qr = BarCode.UPCA(12345, 22222, 9)
//判斷這一個列舉值
switch qr
{
case .QRCODE(let url) :
    print("網址\(url)")
    break
case .UPCA(let number , let indentifier , let check):
    print("系統號:\(number) 識別碼:\(indentifier)檢查:\(check)")
    break;
}


[C#] ping指定ip寫入log檔

最近做了一個小程式,每隔10秒用來ping某個指定IP確認網路穩定性,並將結果寫入txt做紀錄。



using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net.NetworkInformation;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace testNetwork
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        System.IO.StreamWriter file;
        bool run = false;
        private void button1_Click(object sender, EventArgs e)
        {
            file =new System.IO.StreamWriter("log.txt");
            run = true;
            backgroundWorker1.RunWorkerAsync();
           
        }

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            while (run)
            {
                PingIt();
                Thread.Sleep(10000);
            }
        
    
        }

        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            label1.Text = message;
        }
        string message;
        public void PingIt()
        {
           
            Ping p = new Ping();
            var ip = textBox1.Text;
            string time=DateTime.Now.ToString("h:mm:ss tt");
            PingReply r = p.Send(ip);
            if (r.Status == IPStatus.Success)
                message = string.Format("{1}  IP:{0} pint test ok!", ip, time);
            else
                message = string.Format("{1}  IP:{0} pint test failed!", ip, time);

            backgroundWorker1.ReportProgress(0);

            try
            {
                file.WriteLine(message);
            }
            catch
            {

            }
           
        }

        private void Form1_Load(object sender, EventArgs e)
        {


        }

        private void button2_Click(object sender, EventArgs e)
        {
            run = false;
            file.Flush();
            file.Close();
            
        }

    }
}

2015年8月23日 星期日

「分享」安平紀念幣

單一枚50大洋。




[Android] Ping整個區網所需時間


用10個Thread跑的結果

用單一個Thread跑的結果
比較一下,相差約10倍。Timeout指的是當回應時間大於timeout

則drop package,視為沒有回應,可依實際情況請整timeout,

timeout愈大,所花的時間也愈久,但太小的timeout在網路狀況

並不良好時,有可能會得不到需要較久回應時間的裝置。


2015年8月11日 星期二

[Android] get Target MAC Address

最近遇到一個問題,在區網中要連線數台裝置,需要知道MAC Address

做為識別(IP為DHCP派發),網路上查詢,JAVA並沒有提供此種連線

方式取得目地方的MAC Address,所幸網路上有神人分享讀取arp table

的方式,實作上也可行。



import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

import android.util.Log;

public class GetMACAddress{
 public String getMacFromArpCache(String ip) {
     if (ip == null)
         return null;
     BufferedReader br = null;
     try {
         br = new BufferedReader(new FileReader("/proc/net/arp"));
         String line;
         while ((line = br.readLine()) != null) {
             String[] splitted = line.split(" +");
             if (splitted != null && splitted.length >= 4 && ip.equals(splitted[0])) {
                 // Basic sanity check
                 String mac = splitted[3];
                 Log.d("go", "mac " +mac  +" ip "+ ip);
                 if (mac.matches("..:..:..:..:..:..")) {
                     return mac;
                 } else {
                     return null;
                 }
             }
         }
     } catch (Exception e) {
         e.printStackTrace();
     } finally {
         try {
             br.close();
         } catch (IOException e) {
             e.printStackTrace();
         }
     }
     return null;
 }
}


參考來源:

http://www.flattermann.net/2011/02/android-howto-find-the-hardware-mac-address-of-a-remote-host/

[分享] FT232R win7 x64 win10 x64 driver

最近遇到FT232R在win7 x64 及win10 上驅動裝上去會驚嘆號問題,

建議使用這一個驅動比較不會有問題。(裝完記得重開機)
































FT232R是一款 USB to serial UART interface


感謝肥佳洛大神相助


2015年8月10日 星期一

[智語] 不必凡事都爭個明白

很多時候,我們都會為了向他人證明自己,而不顧一切,

沖破理智,最終把自己弄得狼狽不堪,甚至讓自己陷入危境。

而事實上,我們有太多的事實是不用去證明的,你越是證明越會被懷疑。

只要是事實,只要是真理,時間自會給它一個公正的說明



資料來源:

http://big5.xuefo.net/nr/article25/245316.html

「Java」將字串格式IP轉換成數值格式

我們想將 192.168.1.100 轉換成一個整數值,可以透過下列程式碼


public int parseNumericAddress(String ipaddr) {

// Check if the string is valid

if (ipaddr == null || ipaddr.length() < 7 || ipaddr.length() > 15)
    return 0;

// Check the address string, should be n.n.n.n format

StringTokenizer token = new StringTokenizer(ipaddr, ".");
if (token.countTokens() != 4)
    return 0;

int ipInt = 0;

while (token.hasMoreTokens()) {

// Get the current token and convert to an integer value

String ipNum = token.nextToken();
try {

// Validate the current address part

int ipVal = Integer.valueOf(ipNum).intValue();
if (ipVal < 0 || ipVal > 255)
    return 0;

// Add to the integer address

ipInt = (ipInt << 8) + ipVal;
} catch (NumberFormatException ex) {
return 0;
}
}

// Return the integer address

return ipInt;
}

「Java」將數值IP轉成字串IP

當某些情況,我們取得的IP位置輸出是一個整數值,如下



WifiManager wifi_service = (WifiManager)getSystemService(WIFI_SERVICE);
 //取得wifi資訊
 WifiInfo wifiInfo = wifi_service.getConnectionInfo();
 //取得IP,會是一個數字
int ipAddress = wifiInfo.getIpAddress();

此時我們要將數值轉換成標準的IP格式,可以透過下列程式碼做轉換



 String ip = String.format("%d.%d.%d.%d",(ipAddress & 0xff),(ipAddress >> 8 & 0xff),(ipAddress >> 16 & 0xff),(ipAddress >> 24 & 0xff));

參考來源:

http://blog.johnsonlu.org/android%E5%8F%96%E5%BE%97wifi-ip/

[Java] Regux判定IP


public class JavaApplication37 {

    private Pattern pattern;
    private Matcher matcher;

    private static final String IPADDRESS_PATTERN = "^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\."
   + "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." + "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\."
   + "([01]?\\d\\d?|2[0-4]\\d|25[0-5])$";
    
    public JavaApplication37()
    {
        pattern = Pattern.compile(IPADDRESS_PATTERN);
    }
    public static void main(String[] args) {

        JavaApplication37 java7=new JavaApplication37();
        
        String testIP1="192.168.2.100";
        String testIP2="256.100.122.199";
        
       System.out.println("IP1 " +java7.validateIP(testIP1));
       System.out.println("IP2 " +java7.validateIP(testIP2));
    }

    public boolean validateIP(final String ip) {
  matcher = pattern.matcher(ip);
  return matcher.matches();
 }
}


輸出結果:

IP1 true
IP2 false

因為testIP2有一個值大於255, 並不合法。

「anduino」webduino 取得溫溼度





溫濕度傳感器有四隻針腳:

第一隻針腳為 v ( 接 3.3V ),

第二隻為 data ,

第三隻沒有作用,為 N/C,

第四隻為 GND,

但手上這個模組接出來只有3支腳,

由左而右是data  ,3.3 V,GND (-)



實際接線圖如下:

藍線為3.3V,接中間腳位。

綠線為10腳位,接S腳。

紅線為GND,接-腳。


















規格資料:


供電電壓: 3.3~5.5V DC

輸 出: 單匯流排數字信號

測量範圍: 濕度 20-90%RH, 溫度 0~50°C 

測量精度: 濕度+-5%RH, 溫度+-2°C

分 辨 率: 濕度1%RH, 溫度1°C 

長期穩定性: <±1%RH/年


接下來

1.引入相關的JavaScript以及WebCompoment (放在Head裡)

(溫濕度傳感器的 WebComponent 為:wa-dht.html。)


<script src="https://webduino.io/components/webcomponentsjs/webcomponents.js"></script>
<link rel='import' href='https://webduino.io/components/webduino/web-arduino.html' />
<link rel='import' href='https://webduino.io/components/webduino/wa-dht.html' />


2.在body中放入內容,show用來顯示資訊,底下則是webduino的必要程式碼


<div id="show"></div>

<web-arduino id='board' device="你的 device 名稱">
 <wa-dht id='dht' pin='10'></wa-dht>
</web-arduino>



3.加入JavaScript
 <script type="text/javascript">
         window.addEventListener('WebComponentsReady', function () {
         var board = document.getElementById('board');
         
         board.on('ready',function ready() {
           var dht = document.getElementById('dht'),
             show = document.getElementById('show');

           dht.read(function (evt) {
             show.innerHTML = new Date().toLocaleString() + "<br>溫度:" + evt.temperature + " ℃<br> 溼度:" + evt.humidity + " %";
           }, 1000);

           }, false);

       }, false);

        </script>
4.完整程式碼
<!DOCTYPE html>
<html>
    <head>
        <title>TODO supply a title</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <script src="https://webduino.io/components/webcomponentsjs/webcomponents.js"></script>
        <link rel='import' href='https://webduino.io/components/webduino/web-arduino.html' />
        <link rel='import' href='https://webduino.io/components/webduino/wa-dht.html' />
    </head>
    <body>
        <div id="show"></div><web-arduino id='board' device="device id">
        
        <wa-dht id='dht' pin='10'></wa-dht>
        
    </web-arduino>

         <script type="text/javascript">
         window.addEventListener('WebComponentsReady', function () {
         var board = document.getElementById('board');
         
         board.on('ready',function ready() {
           var dht = document.getElementById('dht'),
             show = document.getElementById('show');

           dht.read(function (evt) {
             show.innerHTML = new Date().toLocaleString() + "<br>溫度:" + evt.temperature + " ℃<br> 溼度:" + evt.humidity + " %";
           }, 1000);

           }, false);

       }, false);

        </script>
    
    </body>
</html>


執行結果














比對一下我家的溫溼度計


[小技巧] 台哥大的門號查詢PUK

俺的手機自己不小心輸入3次PIN碼鎖上,如下圖,

此時必須輸入PUK才能解鎖,每一張SIM卡都有自己

的PUK碼,此時若輸入10次錯誤的PUK,傳說此張SIM卡

立即報癈。



取得PUK有3種方式:

1. 打給客服 - 電話被鎖了,手邊沒有市話。

2. 台哥大網站 -

登入會員後- 》用戶服務 -?我的服務/優惠-》解卡密碼查詢 

解鎖後設定新的PIN碼即可。




2015年8月8日 星期六

[賣摳Soft] win98可以使用的VNC Server

對Win98 的印像,停留在國小時候,

想不到一路由win 3.1~ WIn 95 ~ Win 98 ~ Me ~ Xp ~W7 ~ W8~W8.1~W10,

沒想到還會有再次遇見98的機會,而且還一次好幾台。

win98真的是比較久遠的OS囉,找到手邊的幾套vnc server都不給安裝,跳出

請升級OS的訊息。

最後找到了tight VNC 1.3.10 可以安裝在98 SE。

下載頁面在這裡

http://www.tightvnc.com/download-old.php

TightVNC 1.3.10 for Windows supports all client and server versions of Microsoft Windows starting at Windows 95 and Windows NT 4 SP6. However, Windows Vista, Windows 7 and the corresponding server versions of Windows are supported with limitations (service mode is not supported on those systems). If you would like to run TightVNC inWindows Vista or Windows 7, consider downloading TightVNC 2.7.10 instead:

簡單翻譯一下,tight VNC 1.3.10支援win 95 , win NT 4 SP6 ,VIsta , 7也都是被支援的,

但在VIsta,Win 7 中功能有受到限制,建議在Vista , win7 改用2.7.10以後的版本


參考資料:

http://www.tightvnc.com/download-old.php

「名詞定義」DVI

DVI的英文全名為Digital Visual Interface,中文稱為「數位視訊介面」。

是一種視訊介面標準,設計的目標是透過數位化的傳送來強化個人電腦

顯示器的畫面品質。

DVI介面可以傳送未壓縮的數位視訊資料到顯示裝置。本規格部分相容於HDMI標準



DVI接頭除包含DVI標準所規定的數位信號腳位之外也可包含

傳統類比訊號(VGA)的腳位,此設計是為了維持DVI的通用性以

便不同形式的螢幕可以共用同一種連接線。隨著實作功能的不同,

DVI接頭被分成三種類型:

  • DVI-D(Digital數位訊號;single link或dual link)
  • DVI-A(Analog類比訊號)
  • DVI-I(Integrated混合式;數位及類比訊號皆可;single link或dual link)

此外,有實作出第二組DVI鍊路的接頭被稱為DVI-DL(dual link),以強調傳輸能力。



DVI最主要的兩個分類是「類比或數位」、「Single-link or Dual-link」,

我們一般常見的DVI頭多是「DVI-D Single-link」,也就是由上面數下來第三張圖,

這個接頭可以應付2.6百萬畫素,差不多是1920×1200含Full-HD以下的數位訊號

傳送需求,更明白的說市面上28吋以下有DVI插座的螢幕都可適用。

通常在這個解析度之上,較常見的是30吋螢幕2560×1600解析度(WQXGA)

才需要用到Dual-link,其接頭主要是多了第四排跟第五排的rgb針腳來應付較大的頻寬。



螢幕只有支援D-sub輸入時,才會用到只能傳送類比訊號的DVI-A,

不過通常是設計成一邊D-sub,一邊如第五張圖的轉接頭來串接顯示卡的

DVI埠與D-sub線,可以看得出有沒有支援類比訊號主要是差在左邊的那

四根針腳。至於DVI-I(Intergratred)是整合了類比與數位訊號的傳送,

DVI-I Dual-link 自然即為能應付所有訊號及頻寬需求的端子。


不要以為買一條DVI-I Dual-link就可以當作萬用DVI接頭

在顯示卡方面是沒這個問題的,它們一定是採DVI-I(dl)的母頭形式,

但螢幕端就不一定了, 因為大部份的螢幕都是用DVI-D(dl)插座,

多了那四根類比針腳是無法相容



參考來源:


[技術的原理, ]實現Http斷點續傳

斷點續傳的原理,其實HTTP協定內已經有了,視Browser支援與否。



首先我們要下載一個 http://192.168.1.203/test.7z

透過Chrome 開發人員工具來看一下,一般我們直接下載一個檔案

head內容是什麼。

Request Head

GET /test.7z HTTP/1.1 Host: 192.168.1.203 Connection: keep-alive Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36 Accept-Encoding: gzip, deflate, sdch Accept-Language: zh-TW,zh;q=0.8,en-US;q=0.6,en;q=0.4,zh-CN;q=0.2

Response Head

HTTP/1.1 200 OK Date: Tue, 07 Apr 2015 00:34:58 GMT Server: Apache/2.2.15 (Oracle) Last-Modified: Tue, 07 Apr 2015 00:33:02 GMT ETag: "1804d0-98e8754-513178ea80d56" Accept-Ranges: bytes Content-Length: 160335700 Connection: close Content-Type: text/plain; charset=UTF-8


首先我們發現到伺服器收到Requset之後,回應回來的狀態碼是 200,跟據WIKI上的解釋

200 OK  : 請求已成功,請求所希望的響應頭或資料體將隨此響應返回。

也就我們要下載的teset.7z 會整包下載回來,但這樣就無法達成續傳的要求。



查閱網路上資料,其實整包下載與"部份" 下載只差在Request Head 中需要多一行

Range: bytes 20-40

20-40指的是從第20個byte到40個byte (共21個)。

你可以用curl指令來測試伺服器是否支援 Range byte

範例如下,請將網址換成實際上用的URL



curl --silent --range 20-40 http://curl.haxx.se/docs/manpage.html | wc -c

以上述例子,如果輸出為21,表示伺服器支援,若回傳值為檔案完整大小,表示不支援。

若要開啟伺服器支援rangle byte,修改Apache 設定檔



  <Directory "/opt/local_htdocs">
       Options FollowSymLinks Indexes
       AllowOverride None
       Order allow,deny
       Allow from all
       Header set Accept-Ranges bytes
    </Directory>


參考來源:

http://www.unidata.ucar.edu/software/thredds/current/netcdf-java/reference/HTTPservice.html












[C#]使用dropbox API

C# 要連接Dropbox,須要透過 DropNet 這個第3方的專案,它的使用很方便。






一、載入DropNet套件

    1 開啟套件管理器主控台





































    2.輸入Install-Package DropNet


















二、進入Dropbox App 建立一個App

https://www.dropbox.com/developers/apps




 
建立一個Dropbox app , 名字的部份系統會檢查是否有人已用過相同的名字

我們需要的東西就是紅框框起來的







































1.需要使用已註冊過的DropBox應用竹桯式 App key , App secret,




























「swift」筆記5 - function

1.以下是一個function,傳入值為String (傳入名稱為message,

回傳值亦為String(->表示回傳值型態), func是關鍵字

func helloWorld(message : String) ->String
{
    return "\(message) Hello World"
}


//function call
var result1 = helloWorld("Eric")


回傳值為"Eric Hello World",\(變數名稱)  是用來做pattern String

2.以下是一個沒有回傳值的function


func printData(message:String)
{
    print(message)
}

printData("北七BLOG")


會印出北七BLOG,但不會回傳值。

3.多個參數的function


func helloWorl (message : String , who : String )  ->String
{
    return "\(who) say ... \(message)"
}

var result2 = helloWorl("你好", "bill")


輸出為 "bill say ... 你好"

4.多個回傳值的function


func comsitInformation(who : String , salary : Int , address : String ) ->(who  : String ,salary : Int ,address : String )
{
    var whoMsg = who + "你好"
    var curSalary = salary + 10000
    var result = (whoMsg,curSalary,address)
    
    return result
}

var result = comsitInformation("boy" , 100 , "高雄市前鎮區")

print(result.who)

輸出為"boy你好" ,它的會回傳是一個具名元組,可以用名稱取得內容。

EX: result.who、 result.salary、 result.address

5.function 亦支援overLoading

可以允許同名的function但參數型別、數量不同。


func helloWorld(message : String) ->String
{
    return "\(message) Hello World"
}
//overLoading
func helloWorld (message : String , who : String )  ->String
{
    return "\(who) say ... \(message)"
}

//function call
var result1 = helloWorld("Eric")

//call stong Typed function paramters
var result2 = helloWorld("你好", "bill")

6.變動參數長度,和JAVA的AsyncTask 輸入參數類似


func calc(values : Int...)->Int
{
   
    var myTOtal : Int = 0
    
    //走訪
    print("total:\(values.count)")
    for value in values
    {
        myTOtal += value
    }
    
    return myTOtal
}

var result3 = calc(10,20,55,55)

var result3 = calc(16,22)


7.function的參數預設的情況下是常數,不允許變更自身的值

//預設是常數,要改值要改成變數
func passingPocess(var #v1 : Int32 ,var  #v2 :Int32)
{
    v1 = v1 * 100
    v2 = v2 * 100
    
    print("new value: v1:\(v1) v2:\(v2)")
}

var lvar1 : Int32 = 100
var lvar2 : Int32 = 200

passingPocess(v1 : lvar1 , v2 :  lvar2)

如果你需要提供外部參數名,但是局部參數名已經定義好了,那麼你不需要寫兩次這些參數名。相反,只寫一次參數名,並用井字號(#)作為前綴就可以了。這告訴 Swift 使用這個參數名作為局部和外部參數名。

8.傳址參數

func passingPocess(inout #v1 : Int32 ,inout  #v2 :Int32)
{
    v1 = v1 * 100
    v2 = v2 * 100
}

passingPocess(v1 : &lvar1 , v2 :  &lvar2)
//call by referece inout
print("old value: lvar1:\(lvar1) lvar2:\(lvar2)")

9.定義函數型別(function當作一個Type)


func calc(values : Int...)->Int
{
   
    var myTOtal : Int = 0
    
    //走訪
    print("total:\(values.count)")
    for value in values
    {
        myTOtal += value
    }
    
    return myTOtal
}

var calProxy :(Int...) -> Int = calc

var returntotal = calProxy(1,2,3,4,5)

calProxy即為我們定義的函數型別

亦可寫的更加精簡

//不寫參數也可以
var calProxy2 = calc
var returntotal2 = calProxy2(1,2,3,4,5)

10.函式當成參數傳遞


func addTwoInts(a: Int, b: Int) -> Int {
    return a + b
}

var mathFunction: (Int, Int) -> Int = addTwoInts

func printMathResult(mathFunction: (Int, Int) -> Int, a: Int, b: Int) {
    println("Result: \(mathFunction(a, b))")
}
printMathResult(addTwoInts, 3, 5)
// prints "Result: 8」

參考來源:

http://tommy60703.gitbooks.io/swift-language-traditional-chinese/content/chapter2/06_Functions.html