2017年11月26日 星期日

讀台羅--台語學習的第一步

新台羅台語拼音是台語學習上好的入門教材,有程式好練習。因為佮英語發音相仝,學起來無困難。練習網路地址佇遮

2017年11月4日 星期六

google 指令碼編輯器無法度處理unicode第2字面的字

𨑨迌人這3字早就有法度佇各軟體處理了,包括gmail攏無問題。為著欲用程式發批,入去指令碼編輯器,𨑨迌人3字拍會出來,但是徒振動的時,"𨑨"煞加一个才會到"迌"。批發出去的時發批人𨑨迌人只有"𨑨"是亂碼,"迌人"是正常的。進一步查看unicode發現"迌"是佇第0字面,但是"𨑨"是第2字面的字,是毋是google猶無注意著較少用的漢字的問題?

2017年10月27日 星期五

司馬庫斯遊記

司馬庫斯是泰雅族原民部落,1979年才有電火,是上帝號名的部落。巨木林群離社區五里路遠,泰岡溪對面是新光部落。開車對內灣開始足足愛2點半鐘,in是實行共產生活的社區。嘛出名到外國去。

2017年10月8日 星期日

新台羅拼音符號-真正適合咱台灣學生使用的拼音方案

教育部幾冬前整合各種拼音方案做成台羅拼音,做為認證的唯一標準。台語網站嘛用台羅拼音標注。這是妥協之下的結果,毋過煞造成第一線教師教學和學生學習的困難。按怎講?因為咱學生攏有學英語,台羅拼音有差不多有7个是佮英語音標無仝的,學生欲學這種拼音定定拂毋著去,連老師三不五時嘛會出差錯。所以應該將遮仔會出差錯的符號改回佮英語仝款。若按呢學生根本無啥需要另外記無仝的符號,嘛袂定定拂毋著去。經過按呢的修改,大概愛另外學的符號只有3个爾爾。

2017年8月26日 星期六

來點名囉-點名程式android版本發佈試用

下跤是點名程式的原始碼,歡迎有趣味的人掠轉去研究。自由軟體上大精神是開放,完全無藏起來的想法。若干焦試用這个android apk,揤這个連結




package tw.cyc.grid4;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.app.FragmentTransaction;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.DisplayMetrics;
import android.util.Log;
import android.util.TypedValue;
import android.view.GestureDetector;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.AbsListView;
import android.widget.Adapter;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.GridView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.NumberPicker;
import android.widget.RadioGroup;
import android.widget.SimpleAdapter;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.IdentityHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.concurrent.ExecutionException;

public class MainActivity extends Activity implements NumberPicker.OnValueChangeListener {

    ArrayList<HashMap<String, Integer>> location = new ArrayList<HashMap<String, Integer>>();

    public int col = 4;
    public int pos = 0;
    public int num = 0;
    public int selected = 0;
    public int fontSize = 32;

    final int[] color = {Color.argb(255, 153, 51, 0), Color.argb(255, 153, 206, 255), Color.argb(255, 255, 153, 0), Color.argb(255, 194, 194, 214)};
    long startTime = 0;
    long lastClickTime = 0;
    final int CLICK_PERIOD = 400;
    GridView grid;
    static GridAdapter adapter;
    static SharedPreferences spref = null;
    static RadioGroup column;
    static EditText number ;
    static Spinner spinner;
    static RadioGroup direction;
    static String pack = "";
    static public boolean changed = false;
    private final static String MY_MESSAGE = "tw.cyc.sendmessage";
    int monitorWidth = 0;
    int monitorHeight = 0;

    public class GridAdapter extends SimpleAdapter {
        Context context = null;

        public GridAdapter(Context context, List<? extends Map<String, ?>> numbers,
                           int resource, String[] from, int[] to) {
            super(context, numbers, resource, from, to);
            this.context = context;
            monitorWidth = getResources().getDisplayMetrics().widthPixels;
            monitorHeight = getResources().getDisplayMetrics().heightPixels;
        }

        @Override        public View getView(int position, View convertView, ViewGroup parent) {
            convertView = LayoutInflater.from(context).inflate(R.layout.gridview_item, null);
            HashMap<String, Integer> theMap = (HashMap<String, Integer>) getItem(position);
            TextView main_text = (TextView) convertView.findViewById(R.id.main_text);
            TextView second_text = (TextView) convertView.findViewById(R.id.second_text);

            if (theMap.get("note") < 0) {  //note less 0 is virtual                main_text.setText("");
            }
            else if (theMap.get("note") > 0 && theMap.get("note") < 10) {
                main_text.setText("0".concat(theMap.get("note").toString()));
            }
            else {
                main_text.setText(theMap.get("note").toString());
            }
            main_text.setTextSize(fontSize);
            main_text.setTextColor(color[pos]);
            int rowHeight = 0;
            if (location.size()/col <= 10) {
                rowHeight = monitorHeight / ((location.size()/col + 4));
            }
            else rowHeight = monitorHeight / 14;
            ListView.LayoutParams param = new ListView.LayoutParams((int) ((monitorWidth - 100) / col), rowHeight);
            convertView.setLayoutParams(param);

            if (theMap.get("second") < 0) {
                second_text.setText("");
            }
            else if (theMap.get("second") == 0) {
                second_text.setText("");
            }
            else {
                main_text.setTextColor(Color.argb(255, 0, 153, 0));
                second_text.setText(" ".concat(theMap.get("second").toString()));
                second_text.setTextColor(Color.argb(255, 218, 179, 255));
                second_text.setTextSize(fontSize - 8);
            }

            return convertView;
        }

    }

    public int getVirtualNumber(ArrayList<HashMap<String, Integer>> location) {
        int virtualNumber = 0;
        for (int j=0; j<location.size(); j++) {
            if (location.get(j).get("second") < 0) {
                virtualNumber++ ;
            }
        }
        return virtualNumber;
    }

    public int randomSelect(View v) {    //no need to check transpose
        startTime = System.currentTimeMillis();
        if (startTime - lastClickTime < CLICK_PERIOD && lastClickView == v) {
            int realSize = location.size() - getVirtualNumber(location);
            if (realSize - selected == 0) {
                Toast.makeText(MainActivity.this, " 無免點囉!", Toast.LENGTH_SHORT).show();
                return 0;
            }
            int random = (new Random()).nextInt(realSize - selected);
            int count = 0;  //0 is most low value            for (int j=0; j<location.size(); j++) {
                if (location.get(j).get("second") == 0) {
                    if (count == random) {
                        selected = selected + 1;
                        location.get(j).put("second", Integer.valueOf(selected));
                        AlertDialog.Builder builder = new AlertDialog.Builder(this);
                        TextView msg = new TextView(this); msg.setTextSize(50);
                        msg.setTextColor(Color.RED);msg.setHeight(400);
                        msg.setText(location.get(j).get("note").toString());
                        msg.setGravity(Gravity.CENTER);
                        builder.setView(msg);
                        AlertDialog dialog = builder.create();
                        dialog.show();

                        WindowManager.LayoutParams params = dialog.getWindow().getAttributes();
                        params.width = monitorWidth / 3;
                        dialog.getWindow().setAttributes(params);

                        break;
                    }
                    else count++;
                }
            }
            adapter.notifyDataSetChanged();
            return random;
        }
        lastClickTime = startTime;
        lastClickView = v;
        return 0;
    }

   public int getTrow() {
       return ((int) (location.size()/col)) + 1;
   }

    @Override    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) { // 攔截返回鍵            AlertDialog adialog = new AlertDialog.Builder(this)
                    .setTitle("欲走矣嗎?")
                    .setPositiveButton("確定",
                            new DialogInterface.OnClickListener() {
                                @Override                                public void onClick(DialogInterface dialog, int which) {
                                    finish();
                                }
                            })
                    .setNegativeButton("取消",
                            new DialogInterface.OnClickListener() {
                                @Override                                public void onClick(DialogInterface dialog,
                                                    int which) {  }
                            }).show();
            adialog.getButton(DialogInterface.BUTTON_POSITIVE).setTextColor(Color.argb(255, 0, 153, 0));
            adialog.getButton(DialogInterface.BUTTON_POSITIVE).setTextSize(20);
            adialog.getButton(DialogInterface.BUTTON_NEGATIVE).setTextColor(Color.argb(255, 0, 0, 153));
            adialog.getButton(DialogInterface.BUTTON_NEGATIVE).setTextSize(20);
        }
        return true;
    }

    @Override    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        pack = getPackageName(); //backup for use after ending fragment        spref = getSharedPreferences("settings", Context.MODE_PRIVATE);
        if (spref.getInt("column",0) == R.id.three) { col = 3; }
        else if (spref.getInt("column", 0) == R.id.four) { col = 4; }
        else if (spref.getInt("column", 0) == R.id.five) { col = 5; }

        num = spref.getInt("number", 32);
        pos = spref.getInt("pos", 0);

        fontSize = fontSize - (col-3)*4; //袂用float運算??若無會當掉,但是模擬器袂。
        for (int j=0; j<num; j++) {
            HashMap<String, Integer> map = new HashMap<String, Integer>();
            map.put("note", new Integer(j+1));
            map.put("second", new Integer(0));
            location.add(j, map);
        }

        grid = (GridView) findViewById(R.id.grid);
        DisplayMetrics metrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(metrics);
        int height = metrics.heightPixels;
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(metrics.widthPixels, (int)(height*0.75));
        grid.setLayoutParams(params);

        grid.setNumColumns(col);

        if (spref.getInt("direction",0) == R.id.verticle) location = transpose(location, col);

        adapter = new GridAdapter(this.getBaseContext(), location, R.layout.gridview_item,
                new String[] {"note", "second"}, new int[] {R.id.main_text, R.id.second_text});

        grid.setAdapter(adapter);
        //grid.setOnTouchListener(new View.OnTouchListener() cannot handle position        grid.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            long startTime = 0;
            long lastClickTime = 0;
            final int CLICK_PERIOD = 400;

            int lastPos = 0;
            @Override            public void onItemClick(AdapterView parent, View view, int position, long s) {
                startTime = System.currentTimeMillis();

                if (startTime - lastClickTime < CLICK_PERIOD && position == lastPos) {
                    TextView main_text = (TextView) view.findViewById(R.id.main_text);
                    TextView second_text = (TextView) view.findViewById(R.id.second_text);

                    if (location.get(position).get("second") == -1) {
                        // just skip virtual item                    }

                    else if (location.get(position).get("second") == 0) {
                        selected ++;
                        location.get(position).put("second", Integer.valueOf(selected));
                    }

                    else  {
                        selected--;
                        for ( int j=0; j<location.size(); j++) {
                            if (location.get(j).get("second") > location.get(position).get("second")) {
                                location.get(j).put("second", location.get(j).get("second")-1);
                            }
                        }
                        location.get(position).put("second", Integer.valueOf(0));
                    }
                    adapter.notifyDataSetChanged();

                }

                lastClickTime = startTime;
                lastPos = position;
            }
        });
        registerReceiver(mBroadcast, new IntentFilter(MY_MESSAGE));
    }

    @Override    protected void onDestroy() {
        super.onDestroy();
        this.unregisterReceiver(this.mBroadcast);
    }

    static private BroadcastReceiver mBroadcast =  new BroadcastReceiver() {
        private final static String MY_MESSAGE = "tw.cyc.sendmessage";
        @Override        public void onReceive(Context mContext, Intent mIntent) {

            if(MY_MESSAGE.equals(mIntent.getAction())) {
                adapter.notifyDataSetChanged();
                Toast.makeText(mContext, "設定值變更了後APP愛重開才有作用。", Toast.LENGTH_LONG).show();
            }
        }
    };

    @Override    public boolean onCreateOptionsMenu(Menu menu) {
        //參數1:群組id, 參數2:itemId, 參數3:item順序, 參數4:item名稱        menu.add(Menu.NONE, 0, 0, "基本設定");
        menu.add(Menu.NONE, 2, 0, "臨時設定");
        menu.add(Menu.NONE, 1, 0, "使用說明");
        return super.onCreateOptionsMenu(menu);
    }

    public boolean onOptionsItemSelected(MenuItem item) {
        //依據itemId來判斷使用者點選哪一個item        switch(item.getItemId()) {
            case 0:
                FragmentTransaction ft = getFragmentManager().beginTransaction();
                MyDialogFragment frag = new MyDialogFragment();
                frag.show(ft, "tx");
                break;
            case 1:
                help();
                break;
            case 2:
                setNumber();
                break;
            default:
        }

        return super.onOptionsItemSelected(item);
    }

    public ArrayList<HashMap<String, Integer>> transpose(ArrayList<HashMap<String, Integer>> old, int column) {
        ArrayList<HashMap<String, Integer>> trans = new ArrayList<HashMap<String, Integer>>();
        int trow = (int) Math.ceil((double) old.size()/column);
        int moverableRow = (int) Math.ceil((double) old.size()/column) - 2;
        int newnum = old.size();
        int remainder = old.size() % column;    //remainder is 1  first        if ( remainder != 0 && (column - remainder - 1) <= moverableRow) {  //            newnum = num + (column-2 - (remainder-1));
        }
        if (newnum > num) {
            for (int j = 0; j < newnum; j++) {
                HashMap<String, Integer> temp = new HashMap<String, Integer>();
                temp.put("note", Integer.valueOf(trow * (j % column) + (j / column)));
                temp.put("second", Integer.valueOf(0));
                trans.add(j, temp);
                trans.get(j).put("note", Integer.valueOf(trans.get(j).get("note") + 1));
            }
        }
        else {
            int mustChCol = 0;  //zero is first            if (newnum % column == 0) mustChCol = 0;
            else mustChCol = newnum % column + 1;  //0 first            for (int j=0 ; j< newnum; j++) {
                HashMap<String, Integer> temp = new HashMap<String, Integer>();
                if (mustChCol != 0 && j%column >= mustChCol) {  //mustChCol is 0 first, j is 0 first                    //temp.put("note", Integer.valueOf(trow * (j % column) + (j / column) - (j % column - (mustChCol-1)  -  ));                    temp.put("note", Integer.valueOf(trow * (j % column) + (j / column) - (j % column - mustChCol) - 1));
                } else temp.put("note", Integer.valueOf(trow*(j % column) + (j / column)));
                temp.put("second", Integer.valueOf(0));
                trans.add(j, temp);
                trans.get(j).put("note", Integer.valueOf(trans.get(j).get("note") + 1));
            }
        }

        if (remainder > 0 && newnum > num) {
            for (int j = 1; j <= column-1 - remainder; j++) {
                int change = ((trow - 1) - j) * column + (column - 1);  // index 0 begin                trans.get(change).put("note", Integer.valueOf(-1));
                trans.get(change).put("second", Integer.valueOf(-1));
            }
        }

        return trans;
    }

View lastClickView = null;
    public void clear(View v) {
        startTime = System.currentTimeMillis();
        if (startTime - lastClickTime < CLICK_PERIOD && lastClickView == v) {
            for (int j=0; j<location.size(); j++) {  //check if cleared do nothing                if (location.get(j).get("second") > 0) {
                    AlertDialog adialog = new AlertDialog.Builder(this)
                            .setTitle("確定欲總清掉?")
                            .setPositiveButton("確定",
                                    new DialogInterface.OnClickListener() {
                                        @Override                                        public void onClick(DialogInterface dialog, int which) {
                                            selected = 0;
                                            for (int j = 0; j < location.size(); j++) {
                                                if (location.get(j).get("second") != -1)  // -1 is virtual , reserved                                                    location.get(j).put("second", Integer.valueOf(0));
                                            }
                                            adapter.notifyDataSetChanged();
                                        }
                                    })
                            .setNegativeButton("取消",
                                    new DialogInterface.OnClickListener() {
                                        @Override                                        public void onClick(DialogInterface dialog, int which) {
                                        }
                                    }).show();
                    adialog.getButton(DialogInterface.BUTTON_POSITIVE).setTextColor(Color.argb(255, 0, 153, 0));
                    adialog.getButton(DialogInterface.BUTTON_POSITIVE).setTextSize(20);
                    adialog.getButton(DialogInterface.BUTTON_NEGATIVE).setTextColor(Color.argb(255, 0, 0, 153));
                    adialog.getButton(DialogInterface.BUTTON_NEGATIVE).setTextSize(20);

                    break;
                }
            }
        }
        lastClickTime = startTime;
        lastClickView = v;

    }

    @Override    public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
        //Log.i("value is",""+newVal);
    }

    public void setNumber() {
        final Dialog d = new Dialog(MainActivity.this);
        d.setTitle("NumberPicker");
        d.setContentView(R.layout.dialogview);
        Button b1 = (Button) d.findViewById(R.id.button1);
        Button b2 = (Button) d.findViewById(R.id.button2);
        final NumberPicker np = (NumberPicker) d.findViewById(R.id.numberPicker1);
        np.setMaxValue(50); // max value 100        np.setMinValue(3);   // min value 0        np.setValue(30);
        np.setWrapSelectorWheel(false);
        np.setOnValueChangedListener(this);
        b1.setOnClickListener(new View.OnClickListener()
        {
            @Override            public void onClick(View v) {
                int num = np.getValue();
                location.clear();
                for (int j=0; j<num; j++) {
                    HashMap<String, Integer> map = new HashMap<String, Integer>();
                    map.put("note", new Integer(j+1));
                    map.put("second", new Integer(0));
                    location.add(j, map); selected = 0;
                }
                adapter.notifyDataSetChanged();
                d.dismiss();
            }
        });
        b2.setOnClickListener(new View.OnClickListener()
        {
            @Override            public void onClick(View v) {
                d.dismiss(); // dismiss the dialog            }
        });
        d.show();
    }

    public void help() {
        AlertDialog adialog = new AlertDialog.Builder(this)
                .setTitle("來點名囉--版權佮使用說明")
                .setMessage("1.連紲點才有作用,為防止無小心揤著。\n" +
                        "2.點了的閣點會取消,後壁的攏進一名。\n" +
                        "3.本軟體是自由軟體,歡迎散佈使用。\n" +
                        "4.軟體版本2017.08,適用 android4.3以上。\n" +
                        "台灣軟體自由協會。")
                .setPositiveButton("確定",
                        new DialogInterface.OnClickListener() {
                            @Override                            public void onClick(DialogInterface dialog, int which) {
                            }
                        }).show();

        adialog.getButton(DialogInterface.BUTTON_POSITIVE).setTextColor(Color.argb(255, 0, 153, 0));
        adialog.getButton(DialogInterface.BUTTON_POSITIVE).setTextSize(20);
    }


    public class MyDialogFragment extends DialogFragment {

        @Override        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setStyle(DialogFragment.STYLE_NORMAL, R.style.MY_DIALOG);
        }

        @Override        public void onPause() {
            Intent intent = new Intent();
            intent.setAction(MY_MESSAGE);
            sendBroadcast(intent);
            super.onPause();
        }


        @Override        public void onStart() {
            super.onStart();
            Dialog d = getDialog();
            if (d!=null){
                int width = ViewGroup.LayoutParams.MATCH_PARENT;
                int height = ViewGroup.LayoutParams.MATCH_PARENT;
                d.getWindow().setLayout(width, height);
            }
        }

        @Override        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            View root = inflater.inflate(R.layout.my_fragment, container, false);

            column = (RadioGroup) root.findViewById(R.id.column);
            column.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
                @Override                public void onCheckedChanged(RadioGroup group, int checkedId) {
                    spref.edit().putInt("column", checkedId).apply();
                    changed = true;
                }
            });
            column.check(spref.getInt("column", 0));

            number = (EditText) root.findViewById(R.id.number);
            number.setText(Integer.toString(spref.getInt("number", 0)));
            number.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    spref.edit().putInt("number", Integer.parseInt(number.getText().toString())).apply();
                    changed = true;
                }
            });

            spinner = (Spinner) root.findViewById(R.id.spinner);
            ArrayAdapter colorList = ArrayAdapter.createFromResource(root.getContext(),
                    R.array.color, android.R.layout.simple_dropdown_item_1line);
            spinner.setAdapter(colorList);
            spinner.setSelection(spref.getInt("pos", 0));
            spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                @Override                public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                    spref.edit().putInt("pos", position).apply();
                    changed = true;
                }
                @Override                public void onNothingSelected(AdapterView<?> parent) { }
            });

            direction = (RadioGroup) root.findViewById(R.id.direction);
            direction.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
                @Override                public void onCheckedChanged(RadioGroup group, int checkedId) {
                    spref.edit().putInt("direction", checkedId).apply();
                    changed = true;
                }
            });
            direction.check(spref.getInt("direction", 0));

            return root;
        }

    }

2017年7月10日 星期一

2017蔡琴台中演唱

頂個月月中的時蔡琴佇台中舉辦個人演唱會,地點選佇台中中興大學的惠蓀堂。也就是中興大學的大禮堂。規場人滿滿是無空位,台文詩一首記錄個人感受。

蔡琴演唱會
百萬精華演唱會 四個月前票先買
民歌時代聽蔡琴 惠蓀堂內憶往過
中興湖邊雺霧雨 增添詩意不忍回

2017年6月19日 星期一

蒜頭的國中-六嘉出業禮

這篇應該是第一篇加上台羅注音的台文詩,台羅音會曉的人愈來愈濟。毋過猶是無夠,昨昏200若个本土社團去行政院要求設立台語電視台,就是欲搶救冗欲死去的台語啦!蔡英文的民進黨政府加油!

2017年6月1日 星期四

台灣手機支付方案差不多完整囉

今仔日google的android pay出來囉,雖然是目前line pay,apple pay,samsung pay攏佇伊的頭前出來,但是我想android pay可能會是台灣上普遍的支付方案。理由真簡單,apple機仔台灣只佔15%至20%爾爾,samsung pay限定三星的機仔,只有android pay無遮仔問題,而且去燦坤攄android pay的時嘛是用samsung pay彼隻接收。line pay有1萬箍的限制,種種問題會造成android pay佇台灣時到是上普遍的支付方案!附圖是android pay佇北港燦坤完成支付的手機畫面。

2017年4月1日 星期六

嘉義縣深山林內的遊樂園-寒溪呢

坐落阿里山來吉佮梅山豐山村之間的”寒溪呢“,屬於梅山太和村。附近清水溪向雲林佮南投流去,我簡單用下跤華文詩說明大概情況。

佇macbook內裝硬碟裝arch linux

蘋果電腦好用無毌著,但是效能無蓋好。為著平常拍拍字看新聞爾根本無需要開macos,所以想辦法閣裝arch linux入去。作法真簡單,首先用Time machine備份mac系統,繼來將分區縮小,縮小了後有空間增加二个分區。分別是boot佮linux檔案系統。boot愛是fat32格式,linux愛用ext4。arch linux裝好了後重開機就有通選了。毌夠,可能這時陣macos 顛倒是開袂起來囉,因為進前動著macos的分區囉,只要開機的時揤command+R來回復就OK了。

2017年2月17日 星期五

一卡通佮悠遊卡雙卡NFC手機化

行動支付進入2017年,雖然完備矣煞嘛有無方便的所在。佇sim卡方面愛先換有nfc功能的卡,但是悠遊卡猶無法度像一卡通仝款直接OTA下載來用,愛先去中華電信換電信悠遊sim卡才有法度用喔!筆者就是前年先請一卡通,今仔日閣去換電信悠遊sim卡造成舊的一卡通無法度繼續用,只好請新的囉!

1. 去easy hami請手機用悠遊卡

2. 當然愛同意
3. 添個人資料
4. 送出了竟然就好勢了

5. 完成的畫面
6. 換請一卡通
 7. 離開easy hami入去一卡通網站
 8. 目前有2種卡好選,台南市民真好命直接用,一般人選普通卡
 9. 約定條款愛同意
 10. 添個人資料
 11. 繼續添
 12. 成功了,認證碼4碼送到手機了
 13. OTA記名完成
 14. 送出身份證正反面,用翕相的方式喔。
 15. 會當下載囉
 16. 選下載一卡通
 17. 繼續
 18. 認證碼添入去
 19. 下載中
 20. 完成了
 21. 會當用了
 22. 無半箍,愛去7-11全家等加值喔。
 23. easy hami顯示NFC一卡通已安裝
按呢就會當將這2張卡擲掉了,勞力!