2017年3月6日 星期一

[Line Backup] Line 對話紀錄免Root無痛轉移 v7.1.1

參考了 電腦王阿達分享的 [Android]LINE推出最新功能,讓您備份/還原聊天紀錄對話訊息

此版本在我手機(Device:HTC M9+ Line v7.1.1)並不work

於是參考了ASUS論壇,https://www.asus.com/zentalk/tw/thread-164392-1-1.html,走到降版的步驟就出現錯誤訊息[INSTALL_FAILED_PERMISSION_MODEL_DOWNGRADE]

終於翻到論壇的第十頁,貌似找到解答了,我把成功的command貼出:

First,一定要先依照阿達的分享將手機與電腦連結。
Second,就照ASUS論壇把ADB搞定吧~

【原手機步驟】
1. adb devices
--> 出現以連線的手機序號

2. adb shell content query --uri content://settings/secure --where "name=\'android_id\'"
-->Row: 0 _id=25, name=android_id, value=xxxxxxxxxxxxxxxx(請好好保存android_id)

3. adb shell pm uninstall -k jp.naver.line.android
-->Success
(移除原手機的line ?! 此時我的手機 ES應用分析器跑出來問要不要刪除line的相關檔案,別理他)

4. adb push LINEold.apk /sdcard/
--> 複製舊版apk到手機

5. adb shell pm install /sdcard/LINEold.apk
-->Success (Line降版,裝好後不要開)

6. adb backup -apk jp.naver.line.android
-->Now unlock your device and confirm the backup operation.
(手機畫面點"備份我的資料",等一下直接檢查電腦檔案夾的backup.ab檔案大小,1K就是失敗了,至少要來個10MB)

【新手機步驟(先移除任何版本LINE)】
1. adb install LINEold.apk
2. adb shell settings put secure android_id xxxxxxxxxxxxxxxx(第2步驟取的android_id共16碼)
3. adb restore backup.ab
(手機畫面點"還原我的資料")

馬上開新手機的Line絕對是不work的,此時不用擔心,到Play Store更新Line版本。


2011年8月24日 星期三

[ASP.NET] Import Excel with linqtoexcel

上篇文章比較了以NPOI and EPPlus匯出Excel的效能,接著就是要介紹Import Excel了,雖然NPOI也可以Import Excel2003/2007,但我認識了linqtoexcel後,就毅然決然的選用LinqToExcel為我的Import利器了。
LinqToExcel為32位元的dll,所以如果在64位元遇到complier的問題時,請參閱轉載自網路的排除方法。 還有注意事項,轉載自官網:
Target x86 Platform Linq to Excel requires any projects referencing it to be built against the x86 platform target. See this link for detailed information on setting the platform target to x86. Note this only applies to compiling the project on x64 computers.
.Net 4 When using Linq to Excel in a .Net 4 app, make sure to change the target framework from the default client profile to the full .Net 4 framework. (Properties -> Application -> Target framework) The client profile cannot compile .Net 3.5 dlls.
檢而言之,只能跑在x64,跟.Net framework 3.5。 接著用官網的sample code介紹這好用的工具。
var excel = new ExcelQueryFactory("excelFileName");
var oldCompanies = from c in repo.Worksheet("US Companies") //worksheet name = 'US Companies'
                   where c.LaunchDate < new DateTime(1900, 0, 0)
                   select c;
首先讀取名字為"US Companies"的工作表,如果無法確定上傳的檔案的名稱,最好傳入index即可。
接著<Company>則是有一個名叫Company的Class與Excel 的欄位都一模一樣, 這樣檔案就會乖乖的資料吃到Company的集合物件, 並可以用linq的手法去做資料篩選,一整個就是美妙。

不過如果Excel欄位與Class無法設定成一樣的,那還是有法可解:
var excel = new ExcelQueryFactory("excelFileName");
excel.AddMapping(x => x.State, "Providence"); //maps the "State" property to the "Providence" column

var indianaCompanies = from c in excel.Worksheet()
                       where c.State == "IN" && c.Employees > 500
                       select c;
使用AddMapping去指定欄位間的關係,Excel欄位 "Providence"去指定對應到Company的State的欄位。

2011年7月26日 星期二

[ASP.NET] Export Excel with NPOI and EPPlus

NPOI:使用於(Excel2003及之前的版本),可寫出Excel2003(xls),可讀Excel2003 (xls)/ Excel2007(xlsx)

官網:
System Requirement:
  • VS2005 or VS2008 with .NET 2.0 Runtime (SP1)
  • vs2003 with .NET 1.1
  • medium trust environment in ASP.NET

EPPlus:EPPlus is a .net library that reads and writes Excel 2007/2010 files using the Open Office Xml format (xlsx).

官網:http://epplus.codeplex.com/
System Requirements:
  • .Net Framwork 3.5 or higher

    NPOI vs. EPPlus:比較匯出大量資料的時間

    2011年7月19日 星期二

    [ASP.NET] 解決Oracle IN clause 超過1000個參數

    不管在SQL Plus或其他Tool,甚至ASP.NET中,只要出現以下錯誤訊息:
    ORA-01795 maximum number of expressions in a list is 1000

    不用懷疑,就是你的SQL中,IN的參數超過1000個了。

    最快的解決方法有兩種:
    1. OR
    2. Union

    OR Sample如下:
    select * from TestTable where ID in (1,2,3,4,...,1000)
    union all
    select * from TestTable where ID in (1001,1002,...)
    

    Union Sample如下:
    select * from TestTable where ID in (1,2,3,4,...,1000) or ID in (1001,1002,...,2000)
    


    在ASP.NET中,Sample如下(使用OR):

    strSQL = "select * from TestTable where {0} ";
    int limitCount = 900;
                    double dLoopCycle = (IDs.Count / limitCount);
                    int loopCycle = Convert.ToInt32(Math.Ceiling(dLoopCycle));
                    loopCycle = loopCycle == 0 ? 1 : loopCycle;
    
                    string strIDs = string.Empty;
                    string strTempSQL = string.Empty;
                    //more than 1000 parameter would raise error
                    for (int i = 0; i < loopCycle; i++)
                    {
                        int rangeIndex = (i * limitCount);
                        List tempList = IDs.GetRange(rangeIndex, Math.Min(limitCount, IDs.Count - rangeIndex));
    
                        strIDs = string.Join(",", tempList.ToArray());
                        if (i == 0)
                            strTempSQL = string.Format("ID in ({0})", strIDs);
                        else
                            strTempSQL += string.Format("or ID in ({0}) ", strIDs);
                    }
    
    strSQL = string.Format(strSQL, strTempSQL);
    

    [ASP.NET] 解決Linq Contain 參數超過2100的錯誤

    在Linq使用Contain時,必須注意參數的個數,限制為2100為上限,錯誤訊息如下:
    The incoming tabular data stream (TDS) remote procedure call (RPC) protocol stream is incorrect. Too many parameters were provided in this RPC request. The maximum is 2100.

    表示你踩到IN Parameter最多2100個的限制。

    以下為我的解決之道:

    double dLoopCycle = (containList.Count / 2000);
    int loopCycle = Convert.ToInt32(Math.Ceiling(dLoopCycle));
    loopCycle = loopCycle == 0 ? 1 : loopCycle;
    
    List result = new List();
    List tempResult = new List();
     //more than 2100 parameter would raise error
     for (int i = 0; i < loopCycle; i++)
     {
         int rangeIndex = (i * 2000);
         var tempList = containList.GetRange(rangeIndex, Math.Min(2000, containList.Count - rangeIndex));
    
         tempResult = (from r in DataContext.Test where tempList.Contain(r.ID) select r).ToList();
         result = result.Union(tempResult );
    }
    
    

    另外oracle的SQL也有IN Parameter不得超過1000個的限制,這個就會在後續的文章分享我的解決方式囉~~

    [ASP.NET] 解決Oracle IN clause 超過1000個參數

    2011年7月13日 星期三

    [ASP.NET] Nlog:記Log必備的好東西

    要瞭解Nlog初步認識一定必須先拜讀保哥的的大作,介紹好用函式庫:NLog - Advanced .NET Logging

    當然師傅引進門,詳細的設定就是要靠自己啦...
    就如保哥所說的,install之後就有完整的API文件跟範例,
    其實不外乎只要把 Nlog.config 設定好,就完成大半的工作了!!!

    我的設定主要:
    1.存成File的部分,七天回滾一次,自動刪除過期的Log,讓Disk不會被擠爆。
    2.寄出Mail的部分,集滿五個拉環才寄出,不會一個Message寄發信,讓我的信箱不被塞爆。

    首先附上我的Nlog.config

    
    
        
            
            
            
                
            
        
    
        
            
            
        
    
    


    2010年12月20日 星期一

    [Oracle]Update data from another Table

    Web系統不免會有由Excel Upload的資料去更新資料表的需求,當然如果Excel資料一筆一筆的對Table做更新是不符合效益,這將造成對database的transaction過多,而且因為目前需Update的資料表資料量相當大,所以採用的方法如下:
    1.Insert data in db temp table from excel data
    2.update data from temp table

    上述的從Temp table取用資料Update資料表,就切入本篇的主題,可用的方法有三:
    1.Update by sub-query
    2.Update table view
    3.Merge

    方法一:
    UPDATE bigTable b
       SET (col1,col2,col3) = (
           SELECT t.col1,t.col2,t.col3
             FROM tempTable t
            WHERE b.col = t.col)
    where exists(
           SELECT t.col1,t.col2,t.col3
             FROM tempTable t
            WHERE b.col = t.col);
    
    方法二:
    UPDATE (
    SELECT b.col1 as old_col1,
           b.col2 as old_col2,
           b.col3 as old_col3,
           t.col1 as new_col1,
           t.col2 as new_col2,
           t.col3 as new_col3 
      FROM bigTable b, tempTable t
     WHERE b.col = t.col)
       SET old_col1 = new_col1,
           old_col2 = new_col2,
           old_col3 = new_col3;
    

    方法三:
    MERGE INTO bigTable b
     USING (SELECT col1 , col2 , col3 , col
              tempTable t ) t
        ON ( b.col = t.col)
    WHEN matched THEN
    UPDATE
       SET old_col1 = new_col1,
           old_col2 = new_col2,
           old_col3 = new_col3;
    

    測試結果:
    方法一:140 sec
    方法二:1 sec
    方法三:未測

    透過方法二 明顯是效能最佳的解法,但若會被update的bigTable並非符合UK或PK的條件,將會產生"ORA-01779: cannot modify a column which maps to a non-key-preserved table"的錯誤,若你的table不適合建立UK或PK時,可透過hint的方式/*+ BYPASS_UJVC */來忽略UK的檢查。
    UPDATE (
    SELECT /*+ BYPASS_UJVC */ b.col1 as old_col1,
           b.col2 as old_col2,
           b.col3 as old_col3,
           t.col1 as new_col1,
           t.col2 as new_col2,
           t.col3 as new_col3 
      FROM bigTable b, tempTable t
     WHERE b.col = t.col)
       SET old_col1 = new_col1,
           old_col2 = new_col2,
           old_col3 = new_col3;
    

    參考網址:http://blog.csdn.net/yuhua3272004/archive/2008/08/06/2776121.aspx