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



2018年12月23日 星期日

時區問題(by browser)

這次的專案跨了兩個以上的時區
以哪一個國家做基準時間都不合適
解決之道就是.....在資料庫資料的create & modify 時間用System.DateTime.UtcNow取代System.DateTime.Now,
那怎麼在客戶端讓不同時區的人看到「應該」呈現的時間呢?
這時就要靠「Date.getTimezoneOffset」函數了
參考以下的機制
-----------------------------------------------
renderer: function (value, metaData, record, row, col, store, gridView) {
                                        //return Ext.util.Format.date(value, 'Y/m/d h:i:s A');
                                        if (value == null) return "";
                                        let adjDate = Ext.Date.add(new Date(value), Ext.Date.MINUTE, new Date().getTimezoneOffset() * -1);
                                        return Ext.util.Format.date(adjDate, 'd/m/Y h:i:s A');

                                    }
=============================================
 其中的「new Date().getTimezoneOffset()」在我國(台灣)顯示的是-480,也就是我這裡的時間減掉480分鐘就是UTC時間,所以要用-1乘上去加回來(這時候,ExtJs的Date函數就很好用了)
把UTC時間加上getTimezoneOffset就會得到瀏覽器的時區時間了

那瀏覽器的時區什麼時候決定的?實驗(用firefox)的結果是打開時決定的,所以你要執行這函數前一刻改系統時間是看不出效果的

 以上,一起加油吧


2018年11月16日 星期五

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

參考:
https://stackoverflow.com/questions/12424263/how-to-close-modal-window-extjs-when-clicking-on-mask
我個人是比較喜歡寫在"initComponent"之後的寫法
======================
     initComponent: function () {
        ...
         ...
        
        me.callParent(arguments);
        me.mon(Ext.getBody(), 'click', function(el, e){
            alert('click outside!!');
        }, me, { delegate: '.x-mask' });
    }
=====================
大家加油吧

2018年10月31日 星期三

從reporting service(SSRS)產生的pdf報表有空白頁,怎麼刪除啊?

最直覺的方式或許是直接在產生的pdf檔下手,
不過這樣可能會砍到不該砍的頁面
那就換個方式--從report generation下手,
賓果!!
把握一個大原則: (Body Width + Left margin + Right margin) <= (Page width)
這樣就不會出這個也癢,出那個也癢了
參考出處:
https://social.technet.microsoft.com/Forums/en-US/4eca11b3-f646-4245-a930-27a1e27302e1/ssrs-2005-extra-blank-page-problem-after-exporting-to-pdf?forum=sqlreportingservices
大家加油了!!

2018年9月29日 星期六

版本控制軟體 tortoiseSVN 在commit變更時,出現unable to create pristine install stream”如何是好?

在重灌系統,複製了專案及repository目錄,裝完了tortoiseSVN後,試著把異動的檔案做commit時
除了會先遭遇要在repository目錄的db資料夾中,要再次建立「txn-protorevs」及「transactions」資料夾外,還會遭遇「unable to create pristine install stream」,真的是一波三折
重灌就是這樣,好在tortoiseSVN有解了--用clean up就是了:
參考: http://www.cnblogs.com/kukudelaomao/p/7443167.html
三個clean up
clean up working copy status
Vacuum pristine copies
Include externals
都要打勾

P.S. "tortoise"與"turtle"都是龜,差別是「tortoise」是陸龜,而「turtle」是海龜

2018年7月25日 星期三

SQL server 2012/2014複本之發行與訂閱補充事項

這方面的細步很多人討論了,
本次施作參考這裡 : 快速逐步的實作SQL Server之主從複寫機制
 今天不講這些細節,主要是在作業中、後遇到的一兩個狀況:
1.如果是改了主機名稱:
在「新增訂閱」時卻出現找不到SQL server,出現以下訊息:
Replication Error: SQL Server replication requires the actual server name to make a connection to the server  (錯誤:18482:無法連線到伺服器'訂閱者',因'這台SQL'未定義為遠端伺服器!) 的訊息


很怪耶,明明SQL Server Management Studio連得到訂閱者啊,怎麼會出現這問題?
因為我們把主機改了,連帶的sql serve中的相關系統資料也要改才會正確,
怎麼改?
先用「SELECT * FROM sys.servers 」及「SELECT @@SERVERNAME」檢查訂閱者SQL server是不是出現舊的主機名稱
然後用以下的方式改到新的主機名稱
=========================
sp_dropserver '舊主機名稱';
GO
sp_addserver '新主機名稱', local;
GO
=========================
記得下完上述指令後重啟動SQL server的服務,再用「SELECT @@SERVERNAME 」「SELECT * FROM sys.servers」檢查值是否正確,
再回到新增訂閱精靈連看看,就應該可以了
上述相關資訊參考以下連結::
這裡  及 這裡

2.終於把訂閱者做好也同步好了,這次我是用「交易式發行集」,結果訂閱端會出現些現象
  A:沒有pk的table沒被同步過去,. .B.trigger物件沒被同步過去,合理的,因為真的只是要「交易」同步去訂閱者SQL server上,
 如果要把目前(發行者)DB中的trigger找出來呢?
請用以下指令:
======================================
SELECT
    sysobjects.name AS trigger_name
    --,USER_NAME(sysobjects.uid) AS trigger_owner
    --,s.name AS table_schema
    --,OBJECT_NAME(parent_obj) AS table_name
    --,OBJECTPROPERTY( id, 'ExecIsUpdateTrigger') AS isupdate
    --,OBJECTPROPERTY( id, 'ExecIsDeleteTrigger') AS isdelete
    --,OBJECTPROPERTY( id, 'ExecIsInsertTrigger') AS isinsert
    --,OBJECTPROPERTY( id, 'ExecIsAfterTrigger') AS isafter
    --,OBJECTPROPERTY( id, 'ExecIsInsteadOfTrigger') AS isinsteadof
    --,OBJECTPROPERTY(id, 'ExecIsTriggerDisabled') AS [disabled]
FROM sysobjects
/*
INNER JOIN sysusers
    ON sysobjects.uid = sysusers.uid
*/ 
INNER JOIN sys.tables t
    ON sysobjects.parent_obj = t.object_id

INNER JOIN sys.schemas s
    ON t.schema_id = s.schema_id
WHERE sysobjects.type = 'TR'
EXCEPT
SELECT OBJECT_NAME(parent_id) as Table_Name FROM sys.triggers
=====================================
上述的指令參考這裡的討論

------------這次的施作意外收獲真不少--------------