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

2018年10月27日 星期六

181028--主日鳥瞰

這週進入的是<繁殖復活、升天、包羅萬有的基督作爲神國的發展>第二週


我因為沒有進入第一週:照着那給祖宗的應許繁殖復活的基督作長子,所以先到YouTube看了長老同工訓練的影片,得知這次國際場次的信息是講於非洲的衣索比亞首都,即聖經中所記載的埃提阿伯,特別的是從第一大點的出處可以看到是行傳13章,那時正是保羅與同伴到了埃提阿伯講了信息,23節講到關於大衛王:從這人的後裔中,神已經照著所應許的,給以色列帶來一位救主,就是耶穌。

讚美主,神乃是要將他的兒子賜給我們,我們知道約翰福音的經文:神愛世人,甚至將祂的獨生子賜給他們,叫一切信入祂的,不至滅亡,反得永遠的生命。但是行傳13章乃是要說基督作爲神的長子,爲着繁殖。


主繁殖的結果,我們乃是與主耶穌同作弟兄,他是長子,我們是眾子,今天我們都在模成兒子形象的過程中,也要看見祂就是那已經復活成爲神長子的一位,是我們的救主,也是那許多聖的、可靠的事物,藉著主這可靠的長子,赦罪已經傳給我們,並且藉着這一位,我們都得稱義了。


本週(第二週):使徒行傳的繼續----在人類歷史中活在神聖歷史裏


我們雖然生活在地上,有工作要做、有課業要忙,可能還有我們所追求的其他事務,我們要看見,人類的歷史總是能有故事、能有借鏡,但卻是虛空,唯有造天造地的神,祂旨意裡的神聖歷史,才是實際的!才是我們該在意的。

壹 使徒行傳啟示一班人作為行動的神,在人類歷史中活在神聖歷史裏;他們在生命、性情、彰顯和功用上(但不在神格上)成為神,為着擴展並建造召會,作基督團體的顯現。

摸著朱摩西弟兄講到這裡說道,人類的歷史就是那一尊人像,我們今天都蒙恩了,離開了人像,將來我們要成為砸碎人像的石頭。在使徒行傳中,使徒們已經接受了聖靈的澆灌,不再像以前那樣爭誰為大,乃是將福音傳開,今天我們得救了,也把主接進靈裡了,我們就能與主同工,一起活在神聖的歷史中,撰寫使徒行傳。

貳 使徒行傳這一卷書是沒有結束的,因為這卷書仍在繼續着,作為在人類歷史中的神聖歷史。

神聖的歷史不會終結,其中雖然開展的工作對於我們來說是仍需一段長時間才能完成的,但是我們前方的道路乃是傳揚基督,團體的事奉神、經歷並享受神,一直到國度,一直到新天新地、直到永遠。求主使我們能天天都能來寫神聖的歷史。
那麼,我們如何來寫神聖的歷史呢?

叁 神的話仍在擴長並繁增,作為使徒行傳的繼續。


主的話做為生命的種子灑進我們的心土,左們裡面可以擴展,可以長大、長處去,如此我們就能將神分賜給人 ! 叫神的話又能進入別人裡面,再擴展出去 ! 我們真的需要放膽講說神的話 ! 

肆 使徒行傳啟示一班人藉着呼求主的名,在人類歷史中活在神聖歷史裏,他們為主的名受苦,並在主的名,就是在耶穌的名裏說話。


我們要在主耶穌的名裏說話 !


伍 使徒行傳啟示一班人藉着作為一個身體而生活、行動並活動,在人類歷史中活在神聖歷史裏;他們作每一件事,都是在身體裏、藉着身體並為着身體。


我們若是離開身體,就無法寫神聖歷史使徒行傳讓我們看見身體;使徒行傳實際上乃是基督憑着那靈,在召會,就是祂的身體,祂的繁殖與複製裏的行動,大數的掃羅看見的大光,該給我們教訓與正確的看見,我們實在不能單獨,求主保守我們一直活在召會身體中。

陸 使徒行傳啟示一班人藉着棄絕己並憑另一個生命,就是基督這神聖的生命活着,而在人類歷史中活在神聖歷史裏;基督這團體的生活,乃是基督身體的實際。

這生命真的是寶貝,使徒乃是憑著這個生命勝過逼迫、恐嚇和監禁,這個生命對於我們的生活境遇該是真實又現實的,讓主真的與我們調和,在與主調和的生命裡生活行動,主來藉著我們行事為人就是寫神聖的歷史。

柒 使徒行傳啟示一班人藉着堅定持續的禱告並盡話語的職事,在人類歷史中活在神聖歷史裏;這就是活在使徒的職事裏,與作我們大祭司之基督天上的職事配合。

需要以禱告來回應主在天上的職事,靠禱告作人所無法作的,明白人所無法明白的,講說人所無法講說的,唯有禱告能使我們能盡話與的職事,家聚會中、小排中、主日聚會中的申言都需要禱告!

捌 使徒行傳啟示一班人在人類歷史中活在那見於詩篇六十八篇的神聖歷史裏;這詩篇給我們看見基督乃是神在地上行動的中心,也是神藉召會之活動的實際。

詩篇裡主說:傳好信息的婦女成了大群,主不僅要做我們的避風港,還要作福音的港口,我們則是福音船,帶著基督的富餘去找我們的小羊與福音朋友,如此主的生命就擴展,神聖的歷史就寫出來了 !




2018年10月25日 星期四

181025

今天下午結束了專題討論,我來到大同圖書館看了四本雜誌:行遍天下、Smart智富、食品工業、Career職場情報誌,按年齡層分享我所感觸的。

青年:
特別是為了將升高中的小妹,我看了關於職校的介紹,台灣餐旅科系最高學府--高雄餐旅大學五專部主任 屠國城先生指出,對於餐旅業有志者應於國中畢業即選讀相關職校,未來將更具競爭力。

另又介紹選讀五專優點:

⚫遵循五專學程,可在畢業後3年報考研究所,較一般高職生少等一年
  (五專畢業兩條路:二技或插大,大學從大二開始)(高職生還需讀四年大學)

⚫比大學部多培養人文美學、鄉土教材、餐飲服務、飲品調製、成本控制、規劃設計、
   溝通即創新能力、E化能力。

⚫畢業門檻使五專學生更有競爭力並具國際力。

⚫學費便宜。

關於學程與課程、畢業門檻仍需實證,但我們對於小妹的未來又多了點方向。


壯年:
這塊是關於財經投資的,看來是出了社會的人才有心思關心的。

這是2018/10月刊第242期,封面最是吸引我,說到一位奶爸的鍵盤投資法,他能連續三年都獲利100%。
子題:不相信分散佈局,發揮鍵盤科南精神,運用Google追蹤產業趨勢、透過臉書分析上市櫃公司老闆誠信,確認個股成長性、管理層專注於本業,選擇單壓一檔標的,花了12年賺到了4400萬台幣。

內容實在需要時間消化,但就著封面字句已能掌握重點,之後有空再來進修這塊領域。


老年:現在都怕冒犯長者,只能稱為銀髮族。

雜誌中提到,長者因肌少症會導致身體活動力下降,容易倦怠無力、跌倒骨折風險也提高,業者看出長者因空閒時間最多,最有閒情逸致享用茶點,便推出了富含蛋白質的營養補充零食,產品多為天然烘培的肉類零食,我想購買前仍需考慮那含量與添加物的問題,可以參考。另外也有推薦沖泡的營養奶昔。

對於原離糖尿病,書中指出低醣飲食是解答,其中提到了富含膳食纖維的昆布,也引出了下一個主題:促進長者腸道健康的議題,另人驚訝的是,可可製品對腸道、人體也有不少好處,值得研究、食用。

長者的照顧該全面且用心,使爸媽能老的健康開心。