2020年10月11日 星期日

for xamarin android : how to play sound file (mp3)

 1.檔案一定是要mp3格式(wav檔不行)

2.檔案請放在「Resources」之下,本例為了跟其他資源區分,放在Resources/raw之下,

(有a1.mp3,a2.mp3....)

3.play sound的語法
A.用MediaPlayer:

var  player =MediaPlayer.Create(ApplicationContext,Resource.Raw.a1);
  player.Start();

B.用RingToneManager:

var uriString="android.resource://" + your_package_name + "/" +Resource.Raw.a1;

var uri=Android.Net.Uri.Parse(uriString);

Ringtone r = RingtoneManager.GetRingtone(ApplicationContext, uri);
r.Play();

----------------------------------------------------

以上,大家加油了!!

2020年10月1日 星期四

xamarin: enable & receive UDP broadcast (Android 11 嘛會通哦)

 AndroidManifest.xml

----------------------------------

...

...

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

 <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />

<uses-permission android:name="android.permission.INTERNET" />

<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />

-----------------------------------

in android app Activity c# :

---------------------------------

          var wifiManager = (WifiManager)GetSystemService(Context.WifiService);

            MulticastLock mLock = wifiManager.CreateMulticastLock("lock");

            mLock.Acquire();

            using (var udpClient = new UdpClient(你要聆聽的port number)) {

                var asyncResult = udpClient.BeginReceive(null, null);

                var timeToWait = TimeSpan.FromSeconds(30);//30秒,超過就結束

                asyncResult.AsyncWaitHandle.WaitOne(timeToWait);

                if (asyncResult.IsCompleted) {

                    IPEndPoint remoteEP = null;

                    byte[] receivedData = udpClient.EndReceive(asyncResult, ref remoteEP);

                    string msg = System.Text.Encoding.UTF8.GetString(receivedData);

                    Console.WriteLine($"get end point message:{msg}");

                    mLock.Release();

                } else {

                    mLock.Release(); 

                    Console.WriteLine("UDP failed!!!!!!");

                }

            }

--------------------------------

參考 : 這裡

以上,希望對你有幫助


2020年9月30日 星期三

for extjs 4 & 6 , 去背的window

 一如文件「Extjs4 ,如何偵測是否點在pop up window 的外面

一樣,可以考慮在window的mask再加工

如果是全域設定,就直接改 .x-mask css就可以了

但是如果是各別的window (彈吧七彩霓虹window )

就要在show / close事件中加減cls了

----css --------------------------

.seemsNoWinMask.x-mask {

            filter: alpha(opacity=0);

            opacity: .0;

            background:white !important; 

    }

-----ext js 4------------------------------------

let win = Ext.create('Ext.window.Window', {

                    listeners: {

                        show: function (win) {

                            if (this.modal) {

                                var dom = Ext.dom.Query.select('.x-mask');

                                var el = Ext.get(dom[0]);

                                el.addCls('seemsNoWinMask');

                            }

                        },

                        close: function (win) {

                            if (this.modal) {

                                var dom = Ext.dom.Query.select('.x-mask');

                                var el = Ext.get(dom[0]);

                                el.removeCls('seemsNoWinMask');

                            }

                        }

                    },

......

....

-----------------------------------------------------

extjs 6.2 

--------------------------------------------

listeners: {

                show: function (win) {

                    if (this.modal) {

                        var dom = Ext.dom.Query.select('.x-mask');

                        for (var i = 0; i < dom.length; i++) {

                            Ext.get(dom[i]).addCls('seemsNoWinMask');

                        }

                    }


                },

                close: function (win) {

                    if (me.modal) {


                        var dom = Ext.dom.Query.select('.x-mask');

                        for (var i = 0; i < dom.length; i++) {

                            Ext.get(dom[i]).removeCls('seemsNoWinMask');

                        }

                    }

                    

                }

}

...

...

--------------------------------------

以上

(2020了,我還在寫extjs .....)

2020年9月26日 星期六

for extjs 6.2 :如何做個去邊的textfield ?

 之所以會想用這個去邊的textfield,

是因為在某次實作時,要實作一個很類似chrome的search textfield,又內含清空及搜尋的buttons

但又不想繼承field類別(好啦,我承認懶得試這方式),所以要用組裝的方式來做這東西

要把border去除一下,

(以下是extjs 6.2 )

----先準備一個css----------------------

.x-form-textfield-noborder .x-form-trigger-wrap-default {

    border-width: 0px;

    border-style: solid;

    border-color: #d0d0d0;

}

------------------------------------------

那麼,那個要套用css的texfield就是會像以下的例子

......................................

        //...外面包他的container

 {

                            xtype: 'container',

                            width: 170,

                            height: 25,

                            margin: '20 0 0 10',

                            //textfield去邊,要用外層的container做框來包textfield & buttons.

                            style: {

                                borderColor: 'lightgray',

                                borderStyle: 'solid',

                                borderWidth: '1px'

                            },

                            layout: {

                                align: 'stretch',

                                type: 'hbox'

                            },

                            items: [

            //-------------------重點來了---------------------------

           {

                            margin: '20 0 0 20',

                            xtype: 'textfield',

                            cls: 'x-form-textfield-noborder',


             },  //之下,是兩個button

                         {

                                    xtype: 'button',

                                    style: {

                                        background: 'white',

                                        borderRadius: '0px',

                                        borderStyle: 'solid',

                                        marginRight: '3px',

                                        marginTop: '1px',

                                        marginBottom: '1px',

                                        borderColor: '#d0d0d0;',

                                        borderWidth: '0px'


                                    },

                                    height: 16,

                                    width: 16,

                                    icon: './images/icon2del.gif'

                                },

                                {

                                    xtype: 'button',

                                    style: {

                                        background: 'white',

                                        borderRadius: '0px',

                                        borderStyle: 'solid',

                                        marginLeft: '3px',

                                        marginTop: '1px',

                                        marginBottom: '1px',

                                        borderColor: '#d0d0d0;',

                                        borderWidth: '0px'

                                    },

                                    height: 18,

                                    minWidth:20,

                                    icon:'./images/search18x18.png'

                                }

                     ]

            } 

--------------------------------

當然,如果這個欄位只是display only的話,那就用displayfield

尤其是在layout type是table的情況之下,xtype:'label'通常怎麼喬margin & padding都沒用的情況之下

那就用displayfield或是這個去框的textfield吧

參考:

https://blog.csdn.net/onightfalls/article/details/78601091

https://stackoverflow.com/questions/29987504/extjs-displayfield-with-same-style-as-textfield


以上

2020年9月6日 星期日

for ReactJs : axios回傳的response值是 「undefined」!?

 實驗預期對的東西,是必須的,

然而,實驗"錯誤狀況"有無落實,更是一個系統良窳之所在

一般在react js用到axios都是用 promise的寫法:

 axios.get(url,body,header.....).then(response=>......).catch(error=>);

但是如果上述的url錯誤,或是權限問題,造成錯誤

執行上述的結果通常是「response is undefined」,更別就在then(....)裡做resp.data.....解析

就這樣丟出一個 「undefined」錯誤,誰看得懂啊

如何是好?

 如果,不要用要axios預設的包裝機制--我們把http狀態解釋權拿回來,會不會好一點?

是的,axios也有想到這點,所以有了這個設定參數「validateStatus:false」

奪回解釋權,axios負責傳送接收,接下來就是我們事了

-------以下雖然是用saga,但基本工作原理是一樣的------

--以udemy 課程「React-The complete Guide」 sample code : buger app為例-----

export function* doFetchOrderProcessBySaga(action) {

  yield put(actions.doBeginFetchOrders());

  /*

  const authState = yield select((state) => state.auth);

  const token = authState.token;

  const userId = authState.userId;

  */

  //let's finish above 3 command in one line

  const { token, userId } = yield select((state) => state.auth);

  const queryParam =

    "?auth=" + token + '&orderBy="userId"&equalTo="' + userId + '"';

  try {

    const resp = yield axios.get("/orders.json" + queryParam, {

      validateStatus: false

    });

    //if hoc/withErrorHandler instead of "withErrorHandler_class"

    //please DO NOT return by 「yield put(actions.fetchOrdersSeccess([]));」,or users can not see the error message &  Modal

    //(don't ask me  why)

    // if (!resp || resp === undefined) {

    //   yield put(actions.fetchOrdersFailed("return undefined.please check URL"));

    //   return;

    // }

    if (resp.status !== 200) {

      yield put(

        actions.fetchOrdersFailed(

          "ERROR:" + resp.status + " " + resp.statusText

        )

      );

      return;

    }


    let orderTmp = [];

    for (let key in resp.data) {

      orderTmp.push({

        ...resp.data[key],

        id: key

      });

    }


    yield put(actions.fetchOrdersSeccess(orderTmp));

  } catch (err) {

    yield put(actions.fetchOrdersFailed(err.message));

  }

}

-------------------------------------------

驗證:


切到"orders"單元,在orders.js初次render時下載訂單資訊為例.

如果是正常的話,是如以下畫面

現在,到firebase realtime database  ,去修改api權限一下

(改完了別忘了「發布」才會生效)
之後,我們在react js app 切到別單元再進到Orders這裡,出現了權限問題
(應該的,不出現error才該打屁股了)

這樣,是不是明確多了?

參考連結:
https://stackoverflow.com/questions/54185997/how-to-get-axios-error-response-into-the-redux-saga-catch-method?rq=1

https://stackoverflow.com/questions/48298890/axios-how-to-get-error-response-even-when-api-return-404-error-in-try-catch-fi

https://github.com/redux-saga/redux-saga/issues/1730

http://codestudyblog.com/questions/sf/0421204826.html

以上,大家加油了




2020年4月6日 星期一

for java : pdfbox,為什麼文件呼叫了.load之後頁數一直都是0!?

pdfbox-2.0.19不錯用,大家最常用的是pdf to image這類需求
可是今天試了居然頁數是 0 !?
是這樣寫的
-------------------------------
PDDocument document=new PDDocument();
document.load(new File("E:\\download\\xxxx.pdf"));
PDFRenderer renderer = new PDFRenderer(document);
var pageCount=document.getNumberOfPages();  <--居然是「永遠的0」.....
for(var i=0;i<pageCount;i++){
    BufferedImage image = renderer.renderImage(i);
    ImageIO.write(image, "JPEG", new File("E:\\download\\pdf_"+i+".jpg"));
}
-------------------------------
厚,你嘛幫幫忙,load函數不是這樣用的啦
正確的寫法是這樣的
-----------------------------------
PDDocument document  = PDDocument.load(new File("e:\\download\\xxx.pdf"));
...
...
...
-----------------------------
這樣getNumberOfPages就會是正確的了

居家辦公很悶的,鬧個笑話給各位PG笑一下吧

2020年4月3日 星期五

for java,值為string type的 enum 類別

一般如果是用string做值的enum,比較直接是寫在interface
---------------------
 interface PlayserStatus {
    public final static String PLAY="play";
    public final static String STOP="stop";
}

class Player {
   String  _status;
   Player(String status){
       _status=status;
   }
....
....
}
然後再用
  var player=new Player(PlayserStatus.PLAY);

---------------------
問題是這樣就無法限制Player的建構元一定是要在PLAY/STOP這樣的範圍,太危險了
所以還是enum寫法比較安全
--------------.
enum  PlayerStatus {
     AXN_INIT("init"),
     AXN_PLAY("Play"),
     AXN_PAUSE("Pause"),
     AXN_FINISH("Finshed");

    private final String value;
    private PlayerStatus(String s) {
        value = s;
    }
    public String toString(){
        return value;
    }

}
class Player {
    private  PlayerStatus xntStatus;
    public Player(PlayerStatus status) {
        xntStatus=status;
    }
    @Override    public void setStatus(PlayerStatus s) {
        xntStatus=s;
    }
    @Override    public String getStatus() {
        return xntStatus.toString();
    }
}
....
...
 public void main(String[] args){
  ...  
   ...
   ...
   var player=new Player(PlayerStatus.AXN_INIT);
   System.out.println("status is "+player.getStatus());
   player.setStatus(PlayerStatus.AXN_PLAY);
   System.out.println("status is "+player.getStatus());
   ....
 }
----------------------------------------------------
這樣就可以更具體限制了
有關java enum 類型的更完整的介紹,請參考以下更精闢的好文
https://tpu.thinkpower.com.tw/tpu/articleDetails/1432

同場加映!!
如果是要切換狀態時的行為,不是在player裡大改, 而是由playerStatus決定呢?
------------原班人馬,加個狀態表------------------------------
//先定義行為
interface PlayerIsDoing{
  void doing();
}
class InitPlayer implements PlayerIsDoing{
    public void doing(){
        System.out.println("Doing Init Now");
    }
}
class PlayingPlayer implements PlayerIsDoing{
    public void doing(){
        System.out.println("Playing Now");
    }
}
//再定義行為對映表,順便了解一下直接給值的HashMap的寫法
class HtLolder{
  static PlayerIsDoing p1=new InitPlayer();
  static PlayerIsDoing p2=new  PlayingPlayer();
  static Map<String,PlayerIsDoing> ht=new HashMap<String,PlayerIsDoing>(){
      {
          put("init",p1);
          put("Play",p2);
      }
    };
 }
//改一下enum類別
enum  PlayerStatus {
      
      AXN_INIT("init"),
      AXN_PLAY("Play");
      Map<String,PlayerIsDoing>  ht=HtLolder.ht;
     private final String value;
     private PlayerStatus(String s) {
         value = s;
     }
     public String toString(){
         return value;
     }
     //重點來了!!
     public  void doPlaying(){
         ht.get(value).doing(); <-----------
     }

 }
class Player implements PlayerAction{
    private  PlayerStatus xntStatus;
    public Player(PlayerStatus status) {
        xntStatus=status;
    }
    @Override    public void setStatus(PlayerStatus s) {
        xntStatus=s;
    }
    @Override    public String getStatus() {
        xntStatus.doPlaying();<-----------
        return xntStatus.toString();
    }
}

//it's show time!!
public static void main(String[] args) throws IOException {
    var player=new Player(PlayerStatus.AXN_INIT);
    System.out.println("status is "+player.getStatus());
    player.setStatus(PlayerStatus.AXN_PLAY);
    System.out.println("status is "+player.getStatus());
    ...
    ....
}
--------------------------------------------------------------
這樣,有新行為,player不用改(小改啦),把新行為放在PlayerStatus跟行為對映表所在的套件中
會比較靈活些吧
大家加油吧!!



2020年4月2日 星期四

for ms-sql , 16進制字串轉int, 中文字to byte array,to int.....轉換

先講x0ab1234這類的資料轉int怎麼做吧

----------------
declare @R01 int ;
...
...
set @R01=convert(int, convert(varbinary,'0xE000',1));
--------------------------
其中,這個convert(varbinary,'要轉換的16進制字串',1)格式問題
請參考文件

https://docs.microsoft.com/zh-tw/sql/t-sql/functions/cast-and-convert-transact-sql?redirectedfrom=MSDN&view=sql-server-ver15

再來說中文字hi-byte low-byte怎麼轉成unicode整數
------------------------
declare @TestString nvarchar(1);
set @TestString='你'
print
sys.fn_varbintohexstr(substring(cast(@TestString as varbinary(2)),2,1))
 +replace(sys.fn_varbintohexstr(substring(cast(@TestString as varbinary(2)),1,1)),'0x','')
--顯示為"0x4f60"
--再套用 上例「convert(int.....)」

set @R01=convert(int,convert(varbinary, sys.fn_varbintohexstr(substring(cast(@TestString as varbinary(2)),2,1))+replace(sys.fn_varbintohexstr(substring(cast(@TestString as varbinary(2)),1,1)),'0x',''),1));

--R01為20320
----------------------------------------
驗證方式
請到「字碼查詢」
https://www.cns11643.gov.tw/search.jsp?ID=7&SN=&lang=tw
輸入4F60看看是不是得到「你」字

以上,大家加油了!!