2019年12月30日 星期一

查詢最近一次資料庫被「還原」的時間

---script as below---
WITH MostRecentRestore AS
(
SELECT
RowNum = ROW_NUMBER() OVER (PARTITION BY RH.Destination_database_name ORDER BY RH.Restore_Date DESC),
RH.Restore_date,
BS.[database_name] as Source_Database,
RH.Destination_Database_Name,
BS.Backup_Start_Date,
BS.Backup_Finish_Date,
CASE WHEN RH.restore_type = 'D' THEN 'Database'
  WHEN RH.restore_type = 'F' THEN 'File'
  WHEN RH.restore_type = 'G' THEN 'Filegroup'
  WHEN RH.restore_type = 'I' THEN 'Differential'
  WHEN RH.restore_type = 'L' THEN 'Log'
  WHEN RH.restore_type = 'V' THEN 'Verifyonly'
  WHEN RH.restore_type = 'R' THEN 'Revert'
  ELSE RH.restore_type
END AS Restore_Type,
RH.[Replace],
RH.[Recovery],
RH.Restore_Date AS Restored_On,
BMF.physical_device_name AS Restored_From,
RF.destination_phys_name AS Current_DB_File_Location,
RH.user_name AS Restored_By,
BS.machine_name,
BS.Server_Name
FROM msdb.dbo.RestoreHistory RH
INNER JOIN msdb.dbo.BackupSet BS ON RH.backup_set_id = BS.backup_set_id
INNER JOIN msdb.dbo.restorefile RF ON RH.Restore_History_id = RF.Restore_History_id
INNER JOIN msdb.dbo.Backupmediafamily BMF ON bs.media_set_id = bmf.media_set_id
)
SELECT *
FROM MostRecentRestore
WHERE [RowNum] = 1 AND destination_database_name = '那個資料庫名稱'
-------------------------
參考
https://dba.stackexchange.com/questions/33703/how-to-query-last-restore-date-in-sql-server/33705

2019年10月9日 星期三

for Xamarin IOS project,在VS2019 build時發生找不到檔案的錯誤

時光荏苒,從第一次在2016年用Xamarin寫ios的應用到現在已經從vs2017到vs2019 了(下文的vs2017 & vs2019都是在windows之中,不是在mac上面的)
之前在ipad上面的app一年以來都好好的,最近因為系統加了些欄位
只好重啟專案,連帶地,開發環境也「被升級」--從vs2017升到VS2019才能用圖形設計介面去拖拉修改xib檔
Xib檔可以在vs2019裡改,可是在build時就會出錯,迫於時間緊迫,只好分頭進行--改xib檔在vs2019,而build在vs2017裡進行,然後進行社內布署,先給他們用(很好笑,我知道,但事情就是這樣解決了)

現在終於有時間來看一下之前在vs2019開啟vs2017 xamarin 方案後build的錯誤及解決之道
build時錯誤訊息如下
----------------------------------------------------------------
錯誤 System.IO.FileNotFoundException: Could not find file "/Users/john/Library/Caches/Xamarin/mtbs/builds/xoxoxoxoApp/一個很長的id/obj/iPhone/Debug/actool/bundle/??????????????????60x60@2x.png"
File name: '/Users/john/Library/Caches/Xamarin/mtbs/builds/xoxoxoxoApp/一個很長的id/obj/iPhone/Debug/actool/bundle/??????????????????60x60@2x.png'
  at System.IO.FileStream..ctor (System.String path, System.IO.FileMode mode, System.IO.FileAccess access, System.IO.FileShare share, System.Int32 bufferSize, System.Boolean anonymous, System.IO.FileOptions options) [0x00259] in /Users/builder/jenkins/workspace/build-package-osx-mono/2019-06/external/bockbuild/builds/mono-x64/mcs/class/corlib/System.IO/FileStream.cs:274
  at System.IO.FileStream..ctor (System.String path, System.IO.FileMode mode, System.IO.FileAccess access, System.IO.FileShare share, System.Int32 bufferSize, System.IO.FileOptions options) [0x00000] in /Users/builder/jenkins/workspace/build-package-osx-mono/2019-06/external/bockbuild/builds/mono-x64/mcs/class/corlib/System.IO/FileStream.cs:106
....
.......
---------------------------------------------------------------
看到????就應該猜出是中文的東西了,打開info.plist檔,看到有檔案的變數應該就是「XSLaunchImageAssets」 & 「XSAppIconAssets」了
(value分別是「Resources/媒體.xcassets/Launch 影像.launchimage」 & 「Resources/媒體.xcassets/應用程式圖示.appiconset」)

既問題錯在這,那就...來人啊,把這兩個設定屬性都給殺了
然後就build成功了,YA~
是啊,build成功了,可是之前的icon就不見了,app佈署到平板去之後,只留下一個unknow的icon,
這樣能「祭孤」嗎?當然不行.

來吧,先去方案總管視窗,找一下「資產目錄」節點,雖然我知道在vs2017內應該是有子目錄,可是在vs2019因為mac & 這裡的改版之故,「資產目錄」那個節點下面是空的,所以請用滑鼠在「資產目錄」節點點右鍵,「新增一個資產目錄」,預設值就是「Assets」,create後,檔案系統就會在專案的目錄下建立一個"Assets.xcassets"資料夾,

回到vs2019的開發環境,double click「資產目錄」->「Assets」節點,左側會出現「AppIcons」,
double click 它,系統會出現各種尺寸icon檔的對應設定介面給你選
(現在請別再把png放在中文路徑了,建議是直接把之前icon png檔放在 AppIcons.appiconset目錄再選取比較快)

設定好AppIcons之後,別忘了到info.plist把「XSAppIconAssets」變數加上去,值是「Assets.xcassets/AppIcons.appiconset」
plist檔改好,Assets.xcaseets檔也設定好了,那就存檔,重新build,佈署
這樣,你的app的icon就會出現在你的設備上了



下次,不知道又是什麼時候要大改版了,希望是很久以後的事了,
大家加油吧

(相關討論請參考這裡)

2019年9月18日 星期三

for Extjs4 如何讓表單檢查是否有異動時跳過某些欄位

有時表單總是會有些參考/暫時性的欄位,如一個做為「輸出至xxx印表機」的下拉選項
而這欄位是不會存入,照理說在檢查是否異動時也應該被忽略
以前比較笨的寫法是一個一個欄位去檢查有沒有dirty
有了Extjs4真的方便多了,
----------------範例---------
    {
                                    itemId: 'cbxPrintTo',
                                    xtype: 'combobox',
                                    fieldLabel:'請選擇輸出目的',
                                    isDirty: function () {
                                        return false;
                                    },
                                    queryMode: 'local',
                                    valueField: 'AttrCode',
                                    displayField: 'AttrName',
                                    height: 20
}
------------------------------
這樣,在getForm().isDirty()時,這欄位總是傳回無異動的狀態,
如同被忽略/排除不計一般
出處在這裡
(哎,真是的,系統都快寫完了才知道這招......)

2019年8月31日 星期六

c# client <--->QTcpSocket server 中文亂碼解決之道

又是個轉碼的問題,很簡單,怎麼來就怎麼去
-----QT端(先不管.h檔中的宣告),readyRead event slot---------------
void MainWindow::onReadyRead()
{
    QTcpSocket* sender = static_cast<QTcpSocket*>(QObject::sender());
    //從client讀入字串,因為是utf8碼,所以要用fromUtf8轉換
    QByteArray datas = sender->readAll();
    QString msgTxt=QString::fromUtf8(datas); 
    qDebug()<<"msg from client"<<msgTxt;

    //回應給client
    QString  msg2Reply("收到");
    sender->write(msg2Reply.toUtf8());
}
---------------------------------------------------------------
-----C# socket client------------------------------------------
 Socket sender = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);
 sender.SendTimeout = 60;
 sender.Connect(remoteIP);
 //轉成utf8碼,送到Qt socket server 
 string msg2Send =("Qt5.12真好用!!");
 byte[] msg = System.Text.Encoding.GetEncoding("utf-8").GetBytes(msg2Send);
 int bytesSent = sender.Send(msg);

  //讀取QtSocket server的傳回值,用utf8碼轉成字串
 byte[] bytes = new byte[1024];
 int bytesRec = sender.Receive(bytes);
 string returnMsg = Encoding.UTF8.GetString(bytes, 0, bytesRec);
 sender.Shutdown(SocketShutdown.Both);
 sender.Close();
-------------------------------------------------

以上,大家加油了




2019年8月20日 星期二

for Extjs4,只列出異動列的異動欄位及資料

有時,你真的不必把所有的資料都帶回去server處理,只要列舉有異動到的列,甚至只要異動到的欄位,
如下
-----------------------------------------------------
 for (var i = 0; i < someStore.getModifiedRecords().length; i++) {
      let change=someStore.getModifiedRecords()[i].getChanges();
     //change裡的資料是 key:資料欄位,value:新值的map/object/ {..... }型態
      ..
      ...
 }
------------------------------------------
很實用的
大家一起加油吧

2019年7月18日 星期四

壓縮 disk image的好工具--pishrink

玩pi的朋友應該多少有點經驗--dd了整張sd的image,結果找不到同樣大小的sd卡restore回去
(明明號稱16G,有的就是只有15.5,有的就是15.9)
總不能每次都多買同型的卡幾張備用吧
最好是能shrink一下,這樣放在其他大媒體區也比較好收藏
這時候就要用pishrink工具了
詳細請參考這裡
經驗之談:
第一:我是在Ubuntu中安裝的,要做這動作的話,就要把img檔從其他網路資料夾中複製過來才能作業(既然是copy past,就真的要等ubuntu copy完才行)
第二:別忘了「 -s 」參數 ex:「pishrink -s src.img dst.img」
(原則上ubuntu的image可以直接在src.img中作業--也就是直接用「sudo pishrink.sh xxx.img 」就可以了,而NOOB就一定要在檔案外--新檔作業,所以保險起見,就用另存新檔的方式作業)


玩看看吧

update: 在壓完了image之後,日後在pi上面一定會需要再擴展大小的,這時請用「raspi-config --expand-rootfs」(jess/strech...)把其他磁區擴大到其sd上面的空間



2019年7月15日 星期一

for ubuntu,要用ssh連進去時,遇到connection reset.....

明明已經裝了openssh-server,也設好防火牆了
還是一直遇到connection reset by xxx.xxx.xxx. port...的訊息
這時要到那台ubuntu做openssh-server重組態指令
參考這裡

---------------------------------------------
rm /etc/ssh/ssh_host_*
dpkg-reconfigure openssh-server
---------------------------------
這行指令下去後,再出現產生RSA 、ECDSA 、ED25519等key的訊息才是成功的
這時就可以再試著ssh進去看看了

2019年7月10日 星期三

for linux,明明有安裝python3了,怎麼會還出現「/usr/bin/env: ‘python’: No such file or directory」錯誤訊息無法執行.py檔呢?

明明有安裝python3了,怎麼會還出現「/usr/bin/env: ‘python’: No such file or directory」錯誤訊息無法執行.py檔呢?
很多人有很多種做法,我是用這式方
-----------------------------------------
You can try the command line tool update-alternatives.
$ sudo update-alternatives --config python
If you get the error "no alternatives for python" then set up an alternative yourself with the following command:
$ sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 10
Change the path /usr/bin/python3 to your desired python version accordingly.
-----------------------------------------
來源參考這裡 的最終一PO

就將,一起加油吧

2019年7月9日 星期二

for c# asp.net IIS,上傳大檔遇到「HTTP 錯誤 413.1 - Request Entity Too Large」

系統跟人一樣,做人成功大家就愛找你吐苦水,系統好用大家都把東西往上傳
居然要上傳40幾mega的文件檔,
結果系統傳回 「HTTP 錯誤 413.1 - Request Entity Too Large」錯誤訊息
如何是好?
這時,有兩個東西要調整,一個是IIS,一個是web.config
就IIS而言,要改「uploadReadAheadSize」,參考 這裡
Configuration Editor很難找嗎?就是把 IIS的 default website console首頁的功能檢視方式改用「詳細資料」排列方式,再用「編輯」這個關鍵字在上面的篩選器列就可以找到「設定編輯器」
進入configure Editor後再從上方的combbox下拉區段切換到「system.webserver/systemRuntime」就可以輸入uploadReadAheadSize了
就web.config而言
除了改「maxRequestLength」這個設定值之外還不夠,
請到「system.webServer」這個段落,設定「maxAllowedContentLength」
-----example,其中的「1073741824」指的是1G的大小,出處在此------------
<system.webServer>
...
...
  <security>
   <requestFiltering>
    <requestLimits maxAllowedContentLength="1073741824" />
   </requestFiltering>  
   </security>
...
</system.webServer>
-------------------------------------------
改好,存檔
打完,收工 ...
(別說這個老梗你也知道啊!!)

2019年7月8日 星期一

for rapberrypi ,做完了rpi-update 重開機後,HDMI螢幕一片漆黑

參考
https://codefaq.org/raspberrypi/how-to-fixed-hdmi-no-signal-on-raspberry-pi-3/
要改boot.txt的地方有三處
...
disable_overscan=1
...
hdmi_force_hotplug=1
...
config_hdmi_boost=4
....

有的莓友可能漏寫到,猜想可能是改版之故
沒辦法,pi一直在改版

以上,大家加油了



2019年6月28日 星期五

for Pi : 錯誤 GStreamer-CRITICAL **: gst_element_set_state: assertion 'GST_IS_ELEMENT (element)' failed

 GStreamer-CRITICAL **: gst_element_set_state: assertion 'GST_IS_ELEMENT (element)' failed
這只是很單純的plug-in沒安裝的問題,
那就是要一個一個plug-in安裝的指令下達才行,
從什麼地方看出來?
先用「sudo apt-get install gstreamer1*」來看,它須要哪些套件
---------
Reading package lists... Done Building dependency tree Reading state information... Done Note, selecting 'gstreamer1.0-videosink' for glob 'gstreamer1*' ...
...
....
-------------------------------------


沒安裝,對吧,那我就一個一個裝,先裝「gstreamer1.0-videosink」
--------------------------
sudo apt-get install gstreamer1.0-videosink
Reading package lists... Done
Building dependency tree
Reading state information... Done
Package gstreamer1.0-videosink is a virtual package provided by:
  gstreamer1.0-x 1.10.4-1+deb9u1
  gstreamer1.0-plugins-good 1.10.4-1
  gstreamer1.0-plugins-bad 1.10.4-1
  gstreamer1.0-dvswitch 0.1.1-1
You should explicitly select one to install.
---------------------------
是的,它說了,你要explicitly select one to install,
所以老老實實地apt-get install gstreamer1.0-x 1.10.4-1+deb9u1 gstreamer1.0-plugins-good .....
都裝完後
再回去跑gstreamer,就不會出現
「GStreamer-CRITICAL **: gst_element_set_state: assertion 'GST_IS_ELEMENT (element)' failed」
錯誤訊息了
(那就剩下畫質的問題要解決了,這又是另一個故事了)

大家加油吧



2019年6月3日 星期一

c#丟中文字到wxSocket Server變亂碼!?

wxWidget架構事實上是很好用了,wxSocket也包很好,
不過從c# client connect wxSocket Server收到後,卻變成了亂碼
(在已經中文化zh_TW.UTF-8的pi3 linux之下)....
-----c# socket client---------------
               IPAddress ipAddress = System.Net.IPAddress.Parse("wxSocketsServer所在的IP");
                IPEndPoint remoteIP = new IPEndPoint(ipAddress, 3000);

                // Create a TCP/IP  socket.
                Socket sender = new Socket(AddressFamily.InterNetwork,
                    SocketType.Stream, ProtocolType.Tcp);
                sender.SendTimeout = 60000;
                try {
                    sender.Connect(remoteIP);
                    string msg2Send ="中文測試";
                    byte[] msg =  Encoding.ASCII.GetBytes(msg2Send);
                    // Send the data through the socket.
                    int bytesSent = sender.Send(msg);
                    byte[] bytes = new byte[1024];
                    int bytesRec = sender.Receive(bytes);
                    string returnMsg = Encoding.ASCII.GetString(bytes, 0, bytesRec);
                    // Release the socket.
                    sender.Shutdown(SocketShutdown.Both);
                    sender.Close();
                } catch (Exception expConn) {
                      ExceptionLog.log(expConn, expConn.Message);
                 
                }

------------------------------------
-------wxSoekct Server--------
void MyFrame::OnSocketEvent(wxSocketEvent& event)
{
wxSocketBase *sock = event.GetSocket();
// Process the event
switch(event.GetSocketEvent())
{
case wxSOCKET_INPUT:
{
char buf[10];
// Read the data
sock->Read(buf, sizeof(buf));
// Write back a OK msg to client
                      std::string msgOK("SOCKET RCV OK");
                     sock->Write(msgOK.c_str(),msgOK.length());  // We are done with the socket, destroy it
sock->Destroy();
break;
}
case wxSOCKET_LOST:
{
sock->Destroy();
break;
}
    }
}
---------------------------
結果在wxSocket的socket read buf出現中文亂碼!!好像很難解決的樣子說....


Take easy 啦,不必想太多上面的c# client改一下
byte[] msg =  Encoding.ASCII.GetBytes(msg2Send); 
改為
byte[] msg =  System.Text.Encoding.GetEncoding("utf-8").GetBytes(msg2Send);
wxSocket server read到buffer的資料就會是正確的中文了
不用base64啦,就是這麼簡單
大家加油吧

2019年5月25日 星期六

for C++,交互參考,明明都已經有include了,編譯時還是出現「does not name a type」錯誤訊息

類別相互在定義時互相參考是常有的事
fiile A.h
---------------
#include "B.h"
class A{
    public:
   private:
       B* m_pB;
}
file B.h
-------------------
#include "A.h"
class B{
    public:
    private:
       A* m_pA;
}
------先不管A.cpp & B.cpp---
build 一下,會發生「A does not name a type」的錯誤訊息

這時,只要在A.h 中,先在class A的定義前加上 「class B;」這樣就可以了
---------A.h----
include "B.h"
class B;
 class A{
   public:
   private:
     B* m_pA;
}
----------------
(本例是互相參考,所以B.h也要加上 「class A;」這行)

詳細請參考這裡 「'XX' does not name a type 和 field 'XX' has incomplete type - 兩個 C++ 編譯錯誤及解決辦法
大家加油囉

2019年4月30日 星期二

明明PI已經開了samba,為什麼win10連不進去,一直出現密碼錯誤?

win10連不進去,可是mac OSX登的進去,那就是作業系統的問題
這是請用指令「Secpol.msc」由「本機安全性原則」->「本機原則」-> 「安全性選項」,右側列出的「網路安全性LAN Manager 驗證等級」點進去,選「只傳送NTMv2回應,拒絕LM和NTLM」這一項
再登入看看這時win10就可以登入了,
更多,請看https://superuser.com/questions/1125438/windows-10-password-error-with-samba-share
大家加油囉!!

2019年4月28日 星期日

in linux ,apt安裝的小工具/指令


想要用關鍵字查套件的話,可以用以下的指令
「sudo aptitude search 關鍵字」
什麼!?沒這指令!? 那你還不快去用「sudo apt-get install aptitude」給他裝起來用看看?
另外一個會用到的查詢套件版本指令是「sudo apt-cache policy 套件名稱」
如,想在安裝codeblocks之前先查詢版本等資訊時,用一下「sudo apt-cache policy codeblocks 」
就會得到以下的資訊
----------------------------------------
codeblocks:
  Installed: (none) <--如果這裡有安裝的話,會出現你已安裝的版本番號
  Candidate: 17.12.rpi1
  Version table:
 *** 17.12.rpi1 500
        500 http://archive.raspberrypi.org/debian stretch/main armhf Packages
        100 /var/lib/dpkg/status
     16.01+dfsg-2 500
        500 http://raspbian.raspberrypi.org/raspbian stretch/main armhf Packages
-----------------------------------------------
更多apt指令參數,請參考:
https://www.computerhope.com/unix/apt-get.htm