2019年11月1日 星期五

[iOS]iOS 13.2 upgrade exception: hotspot sharing can not connect to the Internet solution

Mobile phone model: iPhone SE
iOS version: 13.2
Post-upgrade problem: hotspot connection is normal, but can't connect to the Internet
Actual solution date: 2019/10/31

Solution:
(1) Take the author's mobile phone as an example, iPhone SE is hotspot (AP-iSE), internal IP address 172.20.10.1
(2) Take the Android mobile phone as an example. To connect to the hotspot AP-iSE, in addition to inputting [hot password], add the [Advanced option], set the [DHCP] change to [Manual], and set the IP address. For 172.20.10.x (x can be set to 3 ~ 14 one of the numbers)
(3) After the setting is completed, close [WiFi], turn on [WiFi], select [hot spot], and then click [Connect]
(4) You're done, the hotspot connection is normal, and the connection is normal.

2019年10月31日 星期四

[iOS] iOS 13.2 升級異常:熱點分享無法連線上網的解決方法

手機機型:iPhone SE
iOS 版本:13.2
升級後問題:熱點連線正常,但是無法連線上網
實測解決日期:2019/10/31

解決方法:
(1) 以筆者手機為例,iPhone SE 為熱點 (AP-iSE),內部 IP 位址 172.20.10.1
(2) 以 Android 手機為例,欲連結熱點 AP-iSE 時,除了輸入【熱點密碼】外,再增加設定【進階選項】,將【DHCP】變更設定為【手動】,將 IP 位址設定為 172.20.10.x (x 可以設定為 3 ~ 14 其中一個數字)
(3) 設定完成後,關閉【WiFi】,開啟【WiFi】,選擇【熱點】,再點選【連線】
(4) 大功告成, 熱點連線正常,連線上網正常。

2014年4月10日 星期四

【智力測驗】燃繩計時

題目:(本題是史丹佛大學博士班的考題,5分鐘的答題限制。)

這兒有兩條繩子。兩條繩子各是不同長短,和不同的材質。
兩條繩子都能從一頭燒到另一頭,實實在在的燒上一個小時。

這兩條繩子燃燒的速度,不是均勻的,可能開頭燒很快,後段慢慢燒;
也可能快慢不均的燒下去。總之,它們耗去一小時來燃燒。
現在,你有這兩條繩子,和一個打火機。請你測量出45分鐘。
解決方法僅僅要燒繩子,不必動用剪刀或其他尺等測量工具。

PS:
1. 若5分鐘內解出來,恭喜你已經有念史丹佛的資質
2. 若10分鐘內解出來,表示你比一般人優秀
3. 若20分鐘內解出來,表示還算正常
4. 若苦思1小時仍然不解,請立即放棄作答,以免走火入魔,導致自絕筋脈,氣絕身亡,三思,三思 !!










解答:
1. 同時燒第 1 條的兩頭及第 2 條的一頭
2. 當第 1 條全部燒完時,代表已過了 30 分鐘。

3. 這時也開始燒第 2 條的另一頭。
4. 當第 2 條燃燒完畢後,代表已過了 45 分鐘!!

【智力測驗】找燈泡的對應開關

題目:

有 A、B 兩個房間,沒有相通;
 A 房間有三個開關
 B 房間有三個燈泡
當然啦,三個開關分別連接三個燈泡。


請問:
            只能進去 
A、B 兩個房間各一次,
   
該如何做就可以知道那一個開關連接那一個燈泡?










解答:

1. 進入【A 房間】
2. 【ON】【1號】開關,約10秒後,【OFF】【1號】開關
3. 【ON】【2號】開關
4. 進入【B 房間】
5. 【亮】的燈泡就是對應【2號】開關
6. 再用手觸摸另外兩個【暗】的燈泡,【微燙】的燈泡就是對應【1號】開關,另外一個就是對應【3號】開關

2014年4月9日 星期三

【智力測驗】猜猜這五個人的職業?

題目:

一夫,二郎,三吉,四祥,五平五個人,是青梅竹馬好朋友,如今長大成人, 各自當上麵包店老闆,理髮師,肉店老闆,菸酒經銷商和公司職員。 

提示:

1. 麵包店老闆不是三吉,也不是四祥。
2. 菸酒經銷商不是四祥也不是一夫。
3. 此外,三吉和五平住在同一棟公寓,隔壁是公司職員的家。
4. 三吉娶理髮師的女兒時,二郎是他們的媒人。
5. 一夫和三吉有空時,就和肉店老闆,麵包店老闆打牌。
6. 而且,每隔十天,四祥和五平一定要到理髮店修個臉。
7.但是,公司職員則一向自己刮鬍子,從來不到理髮店去。


請問:這五個人的職業?






解答:
   一夫(理髮師)
   二郎(公司職員)
   三吉(菸酒經銷商)
   四祥(肉店老闆)
   五平(麵包店老闆)

【智力測驗】如何以最少測量次數來找出8顆球內最輕的那一顆球?

題目:
有8顆球,其中7重量一樣,只有1較輕;用一個天平來測量。(註:每次測量時天平兩邊擺放球的數量不限制)

請問如何以最少測量次數來找出最輕的那一顆球?




解答:兩次

說明:

【第一次】天平左右兩邊各放 3 顆
   
 (a) 如果平衡時,【第二次】就拿【剩下】的兩顆來秤,輕的那顆】就是。

 (b) 如果不平衡時,【第二次】就拿【輕的那邊】任何兩顆來秤

      (b-1) 如果平衡時,【剩下的那顆】就是。

      (b-2) 如果不平衡時,【輕的那顆】就是。

2012年5月30日 星期三

[Android]取得手機螢幕大小 (Display Metrics)




<GetDisplayMetrics.java>
   1: package com.android.getdisplaymetrics;
   2:  
   3: import android.app.Activity;
   4: import android.os.Bundle;
   5: import android.util.DisplayMetrics;
   6: import android.view.View;
   7: import android.view.View.OnClickListener;
   8: import android.widget.Button;
   9: import android.widget.TextView;
  10:  
  11: public class GetDisplayMetrics extends Activity {
  12:  
  13:     private TextView textviewDisplayMetrics;
  14:     private Button btnRun, btnExit;
  15:     
  16:     @Override
  17:     public void onCreate(Bundle savedInstanceState) {
  18:         super.onCreate(savedInstanceState);
  19:         setContentView(R.layout.main);
  20:         findViews();
  21:         setButtonListeners();
  22:     }
  23:     
  24:     private void findViews() {
  25:         textviewDisplayMetrics = (TextView) findViewById(R.id.displaymetricsTextView);
  26:         btnRun = (Button) findViewById(R.id.runBtn);
  27:         btnExit = (Button) findViewById(R.id.exitBtn);
  28:     }
  29:     
  30:     private void setButtonListeners() {
  31:  
  32:         btnRun.setOnClickListener(new OnClickListener(){
  33:         // 取得手機螢幕大小
  34:             public void onClick(View v) {
  35:                  getDisplayMetrics();
  36:             }
  37:         });
  38:         
  39:         btnExit.setOnClickListener(new OnClickListener(){
  40:         // 執行 【離開】
  41:             public void onClick(View v) {
  42:                 android.os.Process.killProcess(android.os.Process.myPid());
  43:             }
  44:         });
  45:     }
  46:     
  47:     private void getDisplayMetrics() {
  48:        // 取得手機螢幕大小
  49:         DisplayMetrics dm = new DisplayMetrics();
  50:         this.getWindowManager().getDefaultDisplay().getMetrics(dm);
  51:         textviewDisplayMetrics.setText(    getString(R.string.strDisplayMetrics)+
  52:                                         dm.widthPixels + " * " + dm.heightPixels);        
  53:     }
  54:     
  55: }

<main.xml>
   1: <?xml version="1.0" encoding="utf-8"?>
   2: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   3:     android:layout_width="fill_parent"
   4:     android:layout_height="fill_parent"
   5:     android:orientation="vertical" >
   6:  
   7:     <TextView
   8:         android:id="@+id/displaymetricsTextView"
   9:         android:layout_width="fill_parent"
  10:         android:layout_height="wrap_content"
  11:         android:text="@string/strDisplayMetrics" />
  12:  
  13:     <LinearLayout
  14:         android:layout_width="match_parent"
  15:         android:layout_height="wrap_content" >
  16:  
  17:         <Button
  18:             android:id="@+id/runBtn"
  19:             android:layout_width="wrap_content"
  20:             android:layout_height="wrap_content"
  21:             android:text="@string/strExecute" />
  22:  
  23:         <Button
  24:             android:id="@+id/exitBtn"
  25:             android:layout_width="wrap_content"
  26:             android:layout_height="wrap_content"
  27:             android:text="@string/strExit" />
  28:  
  29:     </LinearLayout>
  30:  
  31: </LinearLayout>

<strings.xml>
   1: <?xml version="1.0" encoding="utf-8"?>
   2: <resources>
   3:  
   4:     <string name="hello">Hello World, GetDisplayMetrics!</string>
   5:     <string name="app_name">GetDisplayMetrics</string>
   6:     <string name="strDisplayMetrics">手機螢幕大小:</string>
   7:     <string name="strExecute">取得手機螢幕大小</string>
   8:     <string name="strExit">離開</string>
   9:  
  10: </resources>

2012年5月21日 星期一

[Android]利用 Paint 指令繪製 Android 機器人


<DrawAndroid.java>
   1: package com.android.drawandroid;
   2:  
   3: import android.app.Activity;
   4: import android.os.Bundle;
   5: import android.view.Window;
   6: import android.view.WindowManager;
   7:  
   8: public class DrawAndroid extends Activity {
   9:  
  10:     private DrawAndroidView drawAndroidView = null;
  11:   
  12:     @Override
  13:     public void onCreate(Bundle  savedInstanceState) { 
  14:         super.onCreate(savedInstanceState);
  15:         
  16:         // 移除應用程式的標題
  17:         requestWindowFeature(Window.FEATURE_NO_TITLE);
  18:         
  19:         // 設定視窗屬性為全螢幕
  20:         getWindow().setFlags(    WindowManager.LayoutParams.FLAG_FULLSCREEN,
  21:                                 WindowManager.LayoutParams.FLAG_FULLSCREEN);
  22:         
  23:         drawAndroidView = new DrawAndroidView(this);
  24:         
  25:         setContentView(drawAndroidView);
  26:     }
  27: }

<DrawAndroidView.java>


自定義字體下載點: DroidLogo-Bold.ttf 


   1: package com.android.drawandroid;
   2:  
   3: import android.content.Context;
   4: import android.graphics.Canvas;
   5: import android.graphics.Color;
   6: import android.graphics.Paint;
   7: import android.graphics.RectF;
   8: import android.graphics.Typeface;
   9: import android.view.View;
  10:  
  11: public class DrawAndroidView extends View {
  12:     
  13:     Typeface font;
  14:     Paint paint, paint_eye;
  15:       
  16:     public DrawAndroidView(Context context) {
  17:         super(context);
  18:     }
  19:  
  20:     public void  onDraw(Canvas canvas) {
  21:         super.onDraw(canvas);
  22:         DrawCircle(canvas);
  23:         DrawRect(canvas);
  24:         DrawLine(canvas);
  25:         DrawText(canvas);
  26:     }
  27:     
  28:     private void DrawCircle(Canvas canvas) {
  29:         // 畫頭
  30:         paint = new Paint();
  31:         // 設置為true可消除邊緣效果 
  32:         paint.setAntiAlias(true);
  33:         // 設定畫筆顏色
  34:         paint.setColor(Color.GREEN);
  35:         // 於畫布上繪製【頭部】    
  36:         RectF rectF = new RectF(70,40,250,180);
  37:         canvas.drawArc(rectF, 180, 180, true, paint);
  38:         
  39:         // 畫眼睛
  40:         paint_eye = new  Paint();
  41:         // 設置為true可消除邊緣效果 
  42:         paint_eye.setAntiAlias(true);
  43:         // 設定畫筆顏色
  44:         paint_eye.setColor(Color.WHITE);
  45:         // 於畫布上繪製【眼腈】
  46:         canvas.drawCircle(120, 77, 8, paint_eye);
  47:         canvas.drawCircle(200, 77, 8, paint_eye);
  48:     }
  49:     
  50:     private void DrawRect(Canvas canvas) {
  51:         paint = new Paint();
  52:         // 設置為true可消除邊緣效果 
  53:         paint.setAntiAlias(true);
  54:         // 設定畫筆顏色
  55:         paint.setColor(Color.GREEN);
  56:         // 設置矩形區域
  57:         RectF rectF1 = new RectF(20,105,60,280);    // 左手
  58:         RectF rectF2 = new RectF(260,105,300,280);    // 右手
  59:         RectF rectF3 = new RectF(70,120,250,350);    // 身體
  60:         RectF rectF4 = new RectF(100,320,140,430);    // 左腳
  61:         RectF rectF5 = new RectF(180,320,220,430);    // 右腳
  62:         // 於畫布上繪製圓角矩形
  63:         canvas.drawRoundRect(rectF1, 20, 20, paint);
  64:         canvas.drawRoundRect(rectF2, 20, 20, paint);
  65:         canvas.drawRoundRect(rectF3, 20, 20, paint);
  66:         canvas.drawRoundRect(rectF4, 20, 20, paint);
  67:         canvas.drawRoundRect(rectF5, 20, 20, paint);
  68:     }
  69:     
  70:     
  71:     private void DrawLine(Canvas canvas) {
  72:         paint = new Paint();
  73:         // 設置為true可消除邊緣效果 
  74:         paint.setAntiAlias(true);
  75:         // 設定畫筆顏色
  76:         paint.setColor(Color.GREEN);
  77:         // 設定畫筆的粗細
  78:         paint.setStrokeWidth(12);
  79:         // 於畫布上繪製【頭頂兩支角】
  80:         canvas.drawLine(70,28,100,63, paint);
  81:         canvas.drawLine(215,63,250,28, paint);
  82:     }
  83:     
  84:     private void DrawText(Canvas canvas) {
  85:         paint = new Paint();
  86:         // 讀取自定義字體
  87:         font = Typeface.createFromAsset(getContext().getAssets(),"fonts/DroidLogo-Bold.ttf");
  88:         // 設定字體
  89:         paint.setTypeface(font);
  90:         // 設置為true可消除邊緣效果 
  91:         paint.setAntiAlias(true);
  92:         // 設定畫筆顏色
  93:         paint.setColor(Color.WHITE);
  94:         // 設定字體大小
  95:         paint.setTextSize(30);
  96:         // 於畫布上繪製【ANDROID 文字】
  97:         canvas.drawText("ANDROID", 85, 230, paint);
  98:     }
  99: }

2012年5月7日 星期一

[Android]AppWidget 呼叫 Activity, then Activity 傳送資料給 AppWidget

步驟一:新增 AppWidget至首頁畫面



步驟二:點選 Appwidget 內的文字,以啟動另一個 Activity

步驟三:選擇其中一個項目

步驟四:將選擇的項目資料顯示於 AppWidget

步驟五:移除 AppWidget

<AppWidgetInvokeActivity.java>
   1: package com.android.appwidgetinvokeactivity;
   2:  
   3: import android.app.PendingIntent;
   4: import android.app.Service;
   5: import android.appwidget.AppWidgetManager;
   6: import android.appwidget.AppWidgetProvider;
   7: import android.content.ComponentName;
   8: import android.content.Context;
   9: import android.content.Intent;
  10: import android.os.IBinder;
  11: import android.widget.RemoteViews;
  12:  
  13: public class AppWidgetInvokeActivity extends AppWidgetProvider {
  14:  
  15:     @Override
  16:     public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
  17:         super.onUpdate(context, appWidgetManager, appWidgetIds);
  18:         
  19:         // Start UpdateService Service 
  20:         context.startService(new Intent(context, UpdateService.class));
  21:         
  22:         int appWidgetId = appWidgetIds[0];
  23:         Intent configIntent = new Intent(context, MyActivity.class);
  24:         PendingIntent configPendingIntent = PendingIntent.getActivity(context, 0, configIntent, 0);
  25:         RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widgetlayout);
  26:         remoteViews.setOnClickPendingIntent(R.id.resultTextView, configPendingIntent);
  27:         appWidgetManager.updateAppWidget(appWidgetId, remoteViews);
  28:     }
  29:     
  30:     
  31:     @Override
  32:     public void onDisabled(Context context) {
  33:     // 處理 AppWidget onDisabled 事件
  34:     // 當最後一個  AppWidget 被刪除時,會執行 onDisabled
  35:         
  36:         super.onDisabled(context);
  37:        
  38:         // 停止 UpdateService 服務
  39:         context.stopService(new Intent(context, UpdateService.class));
  40:         
  41:         android.os.Process.killProcess(android.os.Process.myPid());
  42:     }
  43:  
  44:     
  45:     public static class UpdateService extends Service {
  46:  
  47:         @Override
  48:         public IBinder onBind(Intent intent) {
  49:             // TODO Auto-generated method stub
  50:             return null;
  51:         }
  52:  
  53:         @Override
  54:         public void onStart(Intent intent, int startId) {
  55:             super.onStart(intent, startId);
  56:             
  57:             // 將 MyActivity 設定的 selectedItem 值,更新 AppWidget 內容值
  58:             RemoteViews updateViews = new RemoteViews(this.getPackageName(), R.layout.widgetlayout);
  59:             updateViews.setTextViewText(R.id.resultTextView, "點選這裡選擇設定項目"+"\n"+MyActivity.selectedItem);
  60:             ComponentName thisWidget = new ComponentName(this, AppWidgetInvokeActivity.class);
  61:             AppWidgetManager manager = AppWidgetManager.getInstance(this);
  62:             manager.updateAppWidget(thisWidget, updateViews);
  63:         }
  64:     }
  65:          
  66: }

<MyActivity.java>
   1: package com.android.appwidgetinvokeactivity;
   2:  
   3: import android.app.Activity;
   4: import android.content.Context;
   5: import android.content.Intent;
   6: import android.os.Bundle;
   7: import android.view.View;
   8: import android.widget.AdapterView;
   9: import android.widget.ArrayAdapter;
  10: import android.widget.ListAdapter;
  11: import android.widget.ListView;
  12: import android.widget.AdapterView.OnItemClickListener;
  13:  
  14: public class MyActivity extends Activity {
  15:     
  16:     public static String selectedItem = "";
  17:     ListView listviewSourceFrom;
  18:     ListAdapter laSingleChoice;
  19:     static final String[] mSourceFrom = new String[] {  "選擇項目-1",
  20:                                                         "選擇項目-2",
  21:                                                         "選擇項目-3" };
  22:     
  23:     
  24:     @Override
  25:     protected void onCreate(Bundle savedInstanceState) {
  26:         super.onCreate(savedInstanceState);
  27:         setContentView(R.layout.myactivitylayout);
  28:         findViews();
  29:         setListviewControls();
  30:         setListviewListener();
  31:     }
  32:     
  33:     private void findViews() {
  34:         listviewSourceFrom = (ListView) findViewById(R.id.sourcefromListview);
  35:     }
  36:     
  37:     private void setListviewControls() {
  38:         laSingleChoice = new ArrayAdapter<String>(    this,
  39:                                                 android.R.layout.simple_list_item_single_choice,
  40:                                                 mSourceFrom);
  41:         listviewSourceFrom.setAdapter(laSingleChoice);
  42:         listviewSourceFrom.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
  43:     }
  44:     
  45:     private void setListviewListener() {
  46:         listviewSourceFrom.setOnItemClickListener(new OnItemClickListener() {  
  47:             public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
  48:                 selectedItem = "選擇了第 "+String.valueOf(arg2+1)+" 個項目";
  49:                 final Context context = MyActivity.this;
  50:                 context.startService(new Intent(context, AppWidgetInvokeActivity.UpdateService.class));
  51:                 Intent resultValue = new Intent();
  52:                 setResult(RESULT_OK, resultValue);
  53:                 finish();
  54:             }
  55:         });  
  56:     }
  57:  
  58: }

<widgetlayout.xml>
   1: <?xml version="1.0" encoding="utf-8"?>
   2: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   3:     android:layout_width="wrap_content"
   4:     android:layout_height="wrap_content"
   5:     android:gravity="center"
   6:     android:orientation="vertical" >
   7:  
   8:     <TextView
   9:         android:id="@+id/resultTextView"
  10:         android:layout_width="match_parent"
  11:         android:layout_height="match_parent"
  12:         android:background="@drawable/widget"
  13:         android:gravity="center"
  14:         android:text="@string/app_name"
  15:         android:textColor="@android:color/black"
  16:         android:textSize="12dp"
  17:         android:typeface="serif" />
  18:  
  19: </LinearLayout>

<myactivitylayout.xml>
   1: <?xml version="1.0" encoding="utf-8"?>
   2: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   3:     android:id="@+id/LinearLayout1"
   4:     android:layout_width="match_parent"
   5:     android:layout_height="match_parent" >
   6:  
   7:     <ListView
   8:         android:id="@+id/sourcefromListview"
   9:         android:layout_width="match_parent"
  10:         android:layout_height="wrap_content"
  11:         android:drawSelectorOnTop="true" >
  12:  
  13:     </ListView>
  14:  
  15: </LinearLayout>

<appwidget.xml>

   1: <?xml version="1.0" encoding="utf-8"?>
   2: <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
   3:         android:initialLayout="@layout/widgetlayout"
   4:         android:minWidth="176dp"
   5:         android:minHeight="72dp" >
   6:  
   7: </appwidget-provider> 

<AndroidManifest.xml>
   1: <?xml version="1.0" encoding="utf-8"?>
   2: <manifest xmlns:android="http://schemas.android.com/apk/res/android"
   3:     package="com.android.appwidgetinvokeactivity"
   4:     android:versionCode="1"
   5:     android:versionName="1.0" >
   6:  
   7:     <uses-sdk android:minSdkVersion="8" />
   8:  
   9:     <application
  10:         android:icon="@drawable/ic_launcher"
  11:         android:label="@string/app_name" >
  12:         <receiver android:name="AppWidgetInvokeActivity" android:label="@string/app_name">
  13:             <intent-filter>
  14:                 <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
  15:             </intent-filter>
  16:             <meta-data android:resource="@xml/appwidget" android:name="android.appwidget.provider"/>
  17:         </receiver>
  18:         <service android:name="AppWidgetInvokeActivity$UpdateService"/>
  19:         <activity android:name="MyActivity">
  20:             <intent-filter>
  21:                 <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
  22:             </intent-filter>
  23:         </activity>
  24:     </application>
  25:  
  26: </manifest>