2019年10月12日 星期六

RecoTrans0095T

資通電0095T軍事訓練役--專題開發參考資料

1、Defining the actionBar



2、webView 錯誤net::ERR_CLEARTEXT_NOT_PERMITTED 
自己是改用https就可以了

3、調用google翻譯

(未成功版本)

(成功版本)

4、解析網頁(爬蟲)
(未成功)

5、google translate API官網
https://cloud.google.com/translate/pricing#projects_charged

6、爬蟲測試(python--bs4)
# -*- coding: utf-8 -*-
"""
Created on Tue Oct 15 08:41:13 2019

@author: iws01
"""

import requests
from bs4 import BeautifulSoup

# 下載網頁內容
r = requests.get('https://translate.google.com/m?hl=en&sl=zh-TW&tl=en&ie=UTF-8&prev=_m&q=%E4%BD%A0%E5%A5%BD')

# 確認是否下載成功
if r.status_code == requests.codes.ok:
  # 以 BeautifulSoup 解析 HTML 程式碼
  soup = BeautifulSoup(r.text, 'html.parser')
  #print(soup.prettify())
  t_string=soup.find('div',class_="t0")
  print(t_string.text)

#print(title_tag.string)

"""
  # 以 CSS 的 class 抓出各類頭條新聞
  stories = soup.find_all('a', class_='story-title')
  for s in stories:
    # 新聞標題
    print("標題:" + s.text)
    # 新聞網址
    print("網址:" + s.get('href'))
 
"""

7、爬蟲(jsoup)
https://aboullaite.me/jsoup-html-parser-tutorial-examples/
https://www.tutorialspoint.com/jsoup/jsoup_use_selector.htm

8、連線問題(Network Security Configuration、NetworkOnMainThreadException)
https://codelabs.developers.google.com/codelabs/android-network-security-config/#3

https://bibby1101.pixnet.net/blog/post/47753182-%E3%80%8Aandroid%E3%80%8Bandroid.os.networkonmainthreadexception-%E9%8C%AF%E8%AA%A4


2019年9月29日 星期日

機器學習環境建置

一、一般電腦建置(通常有gpu)



安裝anaconda:https://repo.continuum.io/archive/



二、如果電腦太爛只有cpu,就不用安裝cuda、cudnn


依序安裝https://www.itread01.com/content/1542619084.html

import tensorflow 之後

出現wrapt問題可以參考https://github.com/tensorflow/tensorflow/issues/30191
移除wrapt,指令conda remove wrapt,之後再接著安裝tf

出現ImportError: DLL load failed with error
可能是win_amd64.whl檔案缺失
可以參考https://stackoverflow.com/questions/52092810/tensorflow-error-dll-load-failed-the-specified-procedure-could-not-be-found
下載檔案至正確位置安裝,接著再安裝tf


pip test 指令pip -V
tf test 指令python-->import tensorflow as tf-->tf.__version__

2019年6月29日 星期六

Android App開發兩年的心路歷程 (翻譯文1/3)

自行中譯:Android App開發兩年的心路歷程(2014-2016)
原文網址:https://blog.aritraroy.in/what-my-2-years-of-android-development-have-taught-me-the-hard-way-52b495ba5c51

筆者在 StackOverflow的連結:https://stackoverflow.com/users/2858654/aritra-roy
筆者在 Github的連結:https://github.com/aritraroy

以下是筆者提供的18個開發要點。

1、先學會站在巨人的肩膀上
起初,我對開源函式庫有不好的成見,我認為我需要的東西就該自己寫,這實在是糟糕的想法。
何不運用他人以寫好且正確的方法呢?這樣能省下許多時間。何不運用他人以寫好且正確的方法呢?這樣能省下許多時間。
你不必自己將連網函式(Retrofit)的功能實作出來 ! 更多好用的函式庫

2、明智的選擇函式庫
不要盲目使用github上的免費資源,確認該api的星星顆數,以及作者是否有其他作品,
時間允許的話,請深入其程式碼自行理解,確認此函式庫值不值得引用。

3、坐下、喝杯咖啡、研讀更多程式碼
多觀摩,然後自己練習編寫,如果你沒有這樣做,就從今天開始吧。
你今天能寫出來的程式,只歸功於你曾經看過或學過的程式碼,
你只是將你已經會的重組起來而已。
唯有閱讀、學習他人作品,你才能成長、自我提升。
android完全是個開放的平台,請常到github上看看別人實作好的框架。

精選函式庫清單:https://snowdream.github.io/awesome-android/
精選開源APP清單:https://github.com/pcqpcq/open-source-android-apps

4、千萬注意程式編寫原則
簡短、乾淨、易於閱讀是最高指導原則,別讓你的同事在看完你的程式之後,
不願跟你講話。

官方教學文章:JavaCodeStylePrigect&CodeGuidelines

5、你需要妨駭措施 !
ProGuard不僅優化你的程式,還會混淆你的程式以達保護之效。

更高的保護機制DexGuard

6、使用正確的專案結構
你將感謝自己從一開始就以正確的結構實作你的專案。

MVP(Model-View-Presenter)結構是公認最好管理的結構,
且富有彈性,易於多人共同開發。


連結附註:
範例程式細節指南androidmvp範例Mosby安卓結構藍圖


文章1/3的部分至此,後續敬請期待~

2019年4月18日 星期四

近年app商業模式簡述

模式一:單純出售模式
開發者製作App,透過App StoreGoogle Play銷售給消費者。在這種模式中,以App對特定族群的絕對實用性為重點,透過正確的宣傳方式去讓有需要的人得知此資訊,雖然銷售量有限,但是因為單價夠高,整體銷售額仍可觀。且因為單價高,之後還有打折促銷的空間,進一步吸引價格敏感的消費者搶便宜。

模式二:廣告模式
此一模式的獲利主要就是靠廣告,因此要盡可能沖高App下載量,所以如果可以結合消費者有需要的服務例如資訊或情報,一來需求已經存在,二來廣告媒合效果也會更明顯。

模式三:收入組合模式
類似以特價商品吸引消費者到賣場消費,同時有機會購買其他的東西提高營業額的道理。而在App的領域中,特價商品甚至價格可以是零元,只是為了壤使用者瀏覽到其他商品。

模式四:持續推出更新附屬功能模式
這裡指的是除了主程式之外,持續推出可以額外付費下載的附屬功能像是遊戲的新場景或是拍照軟體的新濾鏡效果、相片拼貼等,讓收入可以持續增長。同樣的也可以讓主程式的費用是零元,或是運用收入組合模式的心理效果。




模式五:訂閱模式
顧名思義,只要消費者持續使用,隨著時間流逝就要定期付出費用。這種模式的變形也許綁的不一定是時間,而是使用量。

模式六:二次運用模式
同樣的產品或服務,有沒有可能經過重新組合或篩選之後,變成另一款產品?真實生活中最典型的例子就是漫畫雜誌定期會把其中的連載集中再推出單行本,因此賣雜誌時賺一次,賣單行本時又賺一次。而這種模式在App領域除了內容之外,也可以成為持續推出更新附屬功能模式的變形。

模式七:平臺媒合模式
媒合在地商家與當地的消費者。對於商家來說,平臺媒合模式比起單純的投放廣告也許更加精准,因此甚至願意投資更多的預算。

模式八:授權模式
內容與資訊不一定要由開發者自己產生或者只能使用開源的內容,也可以以取得授權的方式與其他企業、app合作。

手機取代桌上型電腦已成趨勢


        腦雖然藉著各家作業系統,對使用者已經很好上手了,
但是許多人在工作中少有接觸電腦的機會,所以對電腦一竅不通,
隨著手機製作技術的演進,越來越便宜、普及,甚至以其方便的特性,
許多不會用電腦的民眾,直接跳過電腦這個重要的科技產物,直接迎接手機。
如今手機也蓬勃發展,不僅取代電腦,更早早取代了傳統鬧鐘、相機、
電視、隨身聽這些日常用品,並且只要有零碎時間,都能取出手機獲取知識、享受娛樂。
在硬體可應付的範圍內,手機的存在意味著電腦產業的衰頹,更有多篇文章指出,
智慧型手機的易用性、安全性、材料成本、投入資金皆勝過傳統電腦,
行動設備生態系的興起,正不斷侵蝕著電腦產業
為手機與電腦歷年銷量圖。
手機之所以有如此多樣的功能,其中一個重要功臣即為應用軟體,
應用軟體提供使用者簡單易懂的介面使用這些功能,我們難以衡量人類在
手機上到底花了多少時間,但是瀏覽量與廣告收益可以幫助我們看出應用軟體(手機)
對世界的影響。手機軟體中常常出現煩人的廣告,無疑的,透過刊登廣告獲利是
業者獲利的方式,我們也從相關網站調查到了對本專題有幫助的圖表。最常將廣告
放置於app中的方法即是透過Google Admob的元件,根據Google Admob報表,
透過行動廣告效益衡量指標可以算出預設一日的廣告撥放請求數是10,000,則一日
預估營收可達150美元[3],年營收逾5500美元,而近年火紅的app Instagram2017年的
廣告營收可達2.39億美元(超過前者4萬倍,每日在Instagram上的廣告被播放次數
可想而知是龐大的,顯然,用戶在該app上花費的時間也是非常龐大的
為甚麼Instagram能賺那麼多錢?我們是著分析它與一般app的不同,與當紅的抖音相似,
它們的特性是提供用戶一個創作平台,可以分享短片或照片,已將傳統的社交軟體
導向更能展現用戶特色的創作平台,他們亦在頁面中穿插著廣告(賣家亦可註冊
帳號發布商品照片,並可以付費增加廣告觸及率),藉著使用者龐大的瀏覽量獲取
可觀的利益。

2019年4月16日 星期二

Android studio--如何用mapView畫出多個點?

1.以MainActivity.class implements OnMapReadyCallback為背景,使用locaJSONS中的資料去繪製。
private List<LocaJSON> locaJSONS;
MapView mapView;
private GoogleMap mGoogleMap;
private static final String MAP_VIEW_BUNDLE_KEY = "MapViewBundleKey";
private int jlength;
private LatLng[] latLng;

2.onCreate中

    mapView = findViewById(R.id.mapView);
     Bundle mapViewBundle = null;
     if (savedInstanceState != null) {
         mapViewBundle = savedInstanceState.getBundle(MAP_VIEW_BUNDLE_KEY);
     }

     mapView.onCreate(mapViewBundle);
     mapView.getMapAsync(LocaDetail.this);   //初始化,自動執行onMapReady

3.若是要將繪圖實作在onclick中,記得要在資料取得後再行繪圖(初始化),否則會出錯。

4.自動複寫的方法(必須使用)
@Override
public void onMapReady(GoogleMap googleMap) {     //相關功能設定
    mGoogleMap=googleMap;
    mGoogleMap.setMinZoomPreference(12);
    mGoogleMap.setIndoorEnabled(true);
    UiSettings uiSettings = mGoogleMap.getUiSettings();
    uiSettings.setIndoorLevelPickerEnabled(true);
    uiSettings.setMyLocationButtonEnabled(true);
    uiSettings.setMapToolbarEnabled(true);
    uiSettings.setCompassEnabled(true);
    uiSettings.setZoomControlsEnabled(true);

    drawMap(mGoogleMap);     //以下實作繪圖的程式。

}

5.private void drawMap(GoogleMap mGoogleMap) {       //參數必須為onMapReady中處理好的mGoogleMap
        double[][] jjss = new double[jlength][2];
        Log.d("資料數 ", String.valueOf(jlength));

        for(int i = 0 ; i < jlength ; i++) {
            LocaJSON jj = locaJSONS.get(i);

            double l_la = 0;double l_lo=0;
            try
            {
                NumberFormat ddf1= NumberFormat.getNumberInstance();        //將字串(locaJSONS的資料)轉為double型態
                ddf1.setMaximumFractionDigits(5);

                l_la =ddf1.parse(jj.getLatitude()).doubleValue();
                l_lo =ddf1.parse(jj.getLongitude()).doubleValue();
                jjss[i][0]=l_la;
                jjss[i][1]=l_lo;


            }
            catch (ParseException e) {
                e.printStackTrace();
            }

        }
        latLng = new LatLng[jlength];
        for(int i=0;i<jlength;i++){
            Log.d("LOCAddf ",i+" : "+jjss[i][0]+" : "+jjss[i][1]);

            latLng[i] = new LatLng(jjss[i][0], jjss[i][1]);           //位置資訊打包

            MarkerOptions markerOptions = new MarkerOptions().position(latLng[i]);
            mGoogleMap.addMarker(markerOptions);                  //加入繪製

        }

        mGoogleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng[0],18)); //鏡頭以第一點為主
    }

6.必須實作的生命週期相關方法
@Override
protected void onResume() {
    super.onResume();
    mapView.onResume();
}

@Override
protected void onPause() {
    mapView.onPause();
    super.onPause();
}

@Override
protected void onDestroy() {
    mapView.onDestroy();
    super.onDestroy();
}

@Override
public void onLowMemory() {
    super.onLowMemory();
    mapView.onLowMemory();
}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    mapView.onSaveInstanceState(outState);
}

7.

Android studio--如何將字串資料存入JSONArray?

1.資料儲存於String json;

2.建立獨立物件類別LocaJSON.class,內含三種建構子形式,以及setter&getter方法(自己寫!)。
屬性依照自己所需編寫,下面只是舉例。


public class LocaJSON {

     String username;     
     String userid;     
     String longitude;     
     String latitude;     
     String date;     
     String time;     
     String massage;     
     String ap_ip;     
     String ap_ssid;     
     String ap_rssi;
    public LocaJSON(String username, String userid, String longitude, String latitude, String date, String time, String massage, String ap_ip, String ap_ssid, String ap_rssi) {
        this.username = username;        
        this.userid = userid;        
        this.longitude = longitude;       
        this.latitude = latitude;        
        this.date = date;        
        this.time = time;        
        this.massage = massage;       
        this.ap_ip = ap_ip;        
        this.ap_ssid = ap_ssid;        
        this.ap_rssi = ap_rssi;    }

    public LocaJSON() {
    }

    public LocaJSON(JSONObject jsonObject) {
        try {
            username=jsonObject.getString("username");            
            userid=jsonObject.getString("userid");            
            longitude=jsonObject.getString("longitude");            
            latitude=jsonObject.getString("latitude");            
            date=jsonObject.getString("date");           
            time=jsonObject.getString("time");            
            massage=jsonObject.getString("m_code");            
            ap_ip=jsonObject.getString("ap_ip");           
            ap_ssid=jsonObject.getString("ap_ssid");            
            ap_rssi=jsonObject.getString("ap_rssi");        
        } catch (JSONException e) {
            e.printStackTrace();        }

    }

3.藉由以下程式即可將字串轉存至JSONArray

locaJSONS = new ArrayList<>();
try{
    JSONArray jsonArray =new JSONArray(json);    
    jlength=jsonArray.length();    
    Log.d("資料數f ", String.valueOf(jlength));    
    for (int i = 0; i < jlength; i++) {
        JSONObject jsonObject = jsonArray.getJSONObject(i);        
        LocaJSON locaJSON = new LocaJSON(jsonObject);        
        locaJSONS.add(locaJSON);    
    }
    
}catch (JSONException e){
    Log.d("Fail 3",e.toString());
}

4.資料已存入locaJSONS中,可供運用。

如何從MySQL讀取資料至Android studio?

1.因為Android studio 沒有與MYSQL的協定,我們無法直接從MYSQL抓資料到APP中。
2.需要透過PHP的網頁程式先抓取 MYSQL在phpMyAdmin網頁管理介面的資料。
3.在自設伺服器上放上該功能網頁程式。

<?php

header("refresh:60;url=get_mysql_5D.php");  //每分鐘重整一次
$mysqli = new mysqli('localhost', '使用者名稱', '密碼', 'DB名稱');//登入phpMyAdmin

mysqli_set_charset($mysqli, "UTF8");  //使中文能正確存取
date_default_timezone_set("Asia/Shanghai");  //設定時區
//echo "目前時間為 " . (int)date("H"). ":". (int)date("i"). "<br>";
        //echo (int)date('Y') ."-" .(int)date('n')."-" . (int)date('j');//今日日期
        //echo (int)date('Y') ."-" .(int)date('n')."-" . ((int)date('j')-2);//前日日期
$nOfD=0;     //計數器
if($_GET['string1']){        //獲取拜訪者傳入變數後的處理
}
if($_GET['string2']){
}

//$sql = "SELECT * FROM 資料表名稱 ORDER BY id ASC LIMIT 1";//取第一行資料
//$sql = "SELECT * FROM 資料表名稱 where 欄位名稱=你要的值";//取最全部資料
$sql = "SELECT * FROM 資料表名稱 where (欄位名稱甲 LIKE '你要的值' OR 欄位名稱甲 is null) AND (欄位名稱乙 LIKE '你要的值' OR 欄位名稱乙 is null) ";     //條件選取


if (!$result = $mysqli->query($sql)) {        //印出錯誤訊息
    // Oh no! The query failed. 
    echo "Sorry, the website is experiencing problems.";

    // Again, do not do this on a public site, but we'll show you how
    // to get the error information
    echo "Error: Our query failed to execute and here is why: \n";
    echo "Query: " . $sql . "\n";
    echo "Errno: " . $mysqli->errno . "\n";
    echo "Error: " . $mysqli->error . "\n";
    exit;
}
else if ($result->num_rows === 0) {                 //印出錯誤訊息
    // Oh, no rows! Sometimes that's expected and okay, sometimes
    // it is not. You decide. In this case, maybe actor_id was too
    // large? 
    echo "We could not find any data, sorry about that. Please try again.";
    exit;
}

if ($result = $mysqli->query($sql)) {
 /*echo '<table border="0" cellspacing="2" cellpadding="2">      //用漂亮格式印出
      <tr> 
          <td> <font face="Arial">欄位名稱甲</font> </td> 
          <td> <font face="Arial">欄位名稱乙</font> </td> 
          <td> <font face="Arial">欄位名稱丙</font> </td>
      </tr>';*/
$data =array();
$nOfD=0;

    while ($row = $result->fetch_assoc()) {      //存取各欄位數值(放進$row)
        /*$field1name = $row['欄位名稱甲'];
        $field2name = $row["欄位名稱乙"];
        $field3name = $row["欄位名稱丙"];
       */

        //echo '<b>'.$field1name.$field2name.'</b><br />';     //用漂亮格式印出
/*echo '<tr> 
                  <td>'.$field1name.'</td> 
                  <td>'.$field2name.'</td> 
                  <td>'.$field3name.'</td>
              </tr>';*/

array_push($data,array('username'=>$row['username'],'userid'=>$row['userid'],'longitude'=>$row['longitude'],'latitude'=>$row['latitude'],'date'=>$row['date'],'time'=>$row['time'],'m_code'=>$row['m_code'],'ap_ip'=>$row['ap_ip'],'ap_ssid'=>$row['ap_ssid'],'ap_rssi'=>$row['ap_rssi']));
//存入陣列$data

$nOfD++;
    }
for($i=0;$i<$nOfD;$i++){               //將陣列轉為urlencode,為使中文編碼正確顯示
foreach ( $data[$i] as $key => $value ) { 
$data[$i][$key]= urlencode ( $value ); 

}

echo urldecode (json_encode ( $data )) ;      //將陣列轉為JSON格式資料並印出,以便日後運用

/*freeresultset*/                //釋放記憶體
$result->free();

}

/*echo strcoll("Hello World!","Hello World!");
echo "<br>";
//字串比較
*/
?>

4.android studio 中抓取該網頁之echo,也就是該網頁之body。

try{ 
      URL url = new URL("localhost/get_mysql_Data.php); //放置於主機的功能網頁網址
      urlConn = (HttpURLConnection) url.openConnection();
      urlConn.setRequestMethod("POST");
      urlConn.connect();
      is = urlConn.getInputStream();
}catch (Exception e){ 
      Log.d("Fail 1",e.toString()); //印出錯誤訊息
}
try{ 
      BufferedReader reader = new BufferedReader(new InputStreamReader(is,"UTF-8"));
      StringBuilder stringBuilder = new StringBuilder(); 
      while ((line=reader.readLine())!=null){ 
                stringBuilder.append(line+"\n");
      }
      is.close();
      tvdata.setText(stringBuilder.toString()); //將所得結果印出
}catch (Exception e){ 
      Log.d("Fail 2",e.toString());
}

5.網址後綴變數格式
URL url = new URL("網址?string1="+變數A+"&string2="+ 變數B);