Rasberry pi 3 QT のエラー libegl warning dri2 failed to authenticate を解消しようとしたら、アプリが起動しない。

libegl warning dri2 failed to authenticate

 というエラーが QTアプリのコンパイル時に、毎回出ているので、

検索して対処してみました。

sudo apt-get install chromium-browser
LIBEGL=`sudo find /usr/lib/chromium-browser -name libEGL.so`
LIBGLES=`sudo find /usr/lib/chromium-browser -name libGLESv2.so`
sudo ln -sf $LIBEGL /usr/lib/arm-linux-gnueabihf/libEGL.so
sudo ln -sf $LIBEGL /usr/lib/arm-linux-gnueabihf/libEGL.so.1
sudo ln -sf $LIBGLES /usr/lib/arm-linux-gnueabihf/libGLESv2.so
sudo ln -sf $LIBGLES /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2

 しかし、これを実行したら、QTのアプリが起動しなくなった。

(正確には起動するが、フォームの中身が表示されない)

QTCreatorを起動しても、プロジェクトが開かない。

 

また検索して、

sudo ln -fs /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0 /usr/lib/arm-linux-gnueabihf/libEGL.so
sudo ln -fs /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0 /usr/lib/arm-linux-gnueabihf/libEGL.so.1
sudo ln -fs /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0 /usr/lib/arm-linux-gnueabihf/libGLESv2.so
sudo ln -fs /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0 /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2
sudo ldconfig

 

を実行したら直りました。

『libegl warning dri2 failed to authenticate』

に関しては放置することにしました。対処法をご存知の方は教えてください。

 

Rasberry Pi3 で GUIアプリを作成する② -環境構築 Windows10

Rasberry Pi3 上ですべて作成可能でしたが、

Webの検索等の利便性を考えて、Windows10上にもQTの開発環境を構築しました。

 

(Windows)Qtの開発環境を構築(Qtのインストール) - peanutice’s blog

↑ここを参考にインストールしましたが、なぜかコンパイルできません。

 

最終的にWDKをすべてアンインストールし、

windowsSDK 10.0.16299.15

にインストールしなおしたらビルドできるようになりました。

(非常にはまりました)

 

VisualStudio2017を使用しています。

QT Visual Studio Tools が必要です。

 

プロジェクトの場所を変更するとビルドできなくなりますが、

まだ追及していません。

対処法をご存知の方、教えてください。

 

今回は、GPIOの入出力以外のコーディングをWindows上で行うことにしました。

Rasberry Piへの移動は、手動でRasberryPi上のQTのプロジェクトにコピペしました。

 

 

 

Rasberry Pi3 で GUIアプリを作成する① -環境構築

Rasberry Pi3で GUIアプリを、という話になり、

調べて出てきたQTで作ることに決めました。

決め手はC++でできること。C++はあまりやったことがないので、

これを機会にマスターしたいと思います。

 

RasberryPiへのQTのインストールは簡単に終わりました。

 $ sudo apt-get install qt-sdk qtbase5-dev libgl1-mesa-dev

 

以下、下記のサイトより引用しました。

 

『メニューの [Tools]/[Options] を選択し、設定ダイアログを開きます。

[Build & Run][Compilers]タブを開き、コンパイラの設定を行います。[Add]ボタンを押してGCCを登録します。 C++ = /usr/bin/g++ 、 C = /usr/bin/gcc を指定します。ここまでできたら、右下の[Apply]ボタンを押します。

[Build & Run][Kits]タブを開き、赤い感嘆符と共に「Desktop (default)」というアイテムが表示されていると思いますので、これをクリックします。

次のように設定します。

  • Compiler: C = GCC
  • Compiler: C++ = GCC
  • Debugger = System GDB at /usr/bin/gdb
  • Qt Version = Qt 5.7.1 in PATH (qt5)

感嘆符が黄色になれば大丈夫です。これで[OK]を押して、ダイアログボックスを閉じます。』

 

https://qiita.com/soramimi_jp/items/b2b238d1537dbb99abea

ここを参考にして、完了。

 

しかし全てをRasberry Piでコーディングするのがつらかったので、

メインのWindows機にも環境を構築して、最終段階でRasberry Pi の方へ

移植する流れていきます。

ので、次回はWindowsでの環境構築です。

 

Windows10 リモートデスクトップで US配列に勝手に変わってしまった

あるWindows10PCにリモートデスクトップで接続して作業した後、

キーボード配列がUS配列に変わってしまっていると連絡が入りました。

私のPCはUS配列で使用しているので、なぜかそれがうつったようです。

 

設定からキーボードレイアウトを変更してもらおうとしましたが、

「地域と言語」→「日本語」→「オプション」と進んでも、

ハードウェア キーボードレイアウト の項目がありません。

 

・・・・・・管理者権限でログインしなおしてください。

管理者権限でないと、キーボードレイアウトの項目は表示されません。

 

 

そして、チェックすると。

キーボードレイアウトは「日本語」のままなのに、US配列になってしまっている・・・。

US配列に変更してログアウトすると、なぜか日本語配列になりました????

 

そこからもう一度日本語配列に戻すとなおりました。

意味はわかりません。

なんか、同じような記事を書いたことがあるような気がする。

VB.NET Excel 「外部データのフォーマットがただしくありません」

VB.NETでエクセルを開こうとするとエラー。

 

Provider=Microsoft.Jet.OLEDB.4.0

で エクセルの拡張子は.xls 「 Microsof Excel 5.0/95 ブック」

で保存していると、

「外部データのフォーマットが正しくありません」

とエラーが発生します。

Excel 97-2003ブック」で保存しなおすと解消します。

 

Provider=Microsoft.ACE.OLEDB.12.0

の場合はエラーにならずに開けるようです。

VB.NET で データテーブルをLINQ でソート Group By sum して合計する

LINQでソートしてみました

motoTable As DataTable には、DBから取得したデータが入っていることとします。

 

Dim query = From row In motoTable.AsEnumerable
Order By row("StaffCode"), row("WorkingDay")
Select row

Dim SortedTable As DataTable = query.CopyToDataTable()

 

これでSortedTable に ソート済みのデータが入ります。

 

 

次に Group By して Sumする場合。

 

Dim query = From row In motoTable.AsEnumerable
Group row By スタッフコード = row.Field(Of Integer)("スタッフコード")
   Into
    金額1合計 = Sum(row.Field(Of Decimal)("金額1")),
    金額2合計 = Sum(row.Field(Of Decimal)("金額2")),
    金額3合計= Sum(row.Field(Of Decimal)("金額3"))
  Order By スタッフコード
  Select New Object() {
     スタッフコード,
    金額1合計,
    金額2合計,
    金額3合計
     }


Dim sumtable As New DataTable("sumTable")
     sumtable.Columns.Add("スタッフコード", GetType(Integer))
     sumtable.Columns.Add("金額1合計", GetType(Decimal))
     sumtable.Columns.Add("金額2合計", GetType(Decimal))
     sumtable.Columns.Add("金額3合計", GetType(Decimal))

For Each row As Object() In query
     sumtable.Rows.Add(row)
Next row

VB.NET で MariaDB の blob にデータをインサート、セレクトする。1

会社で指紋照合システムを使用していますが、

現在は保存された指紋ファイルを照合に使っています。

 

セキュリティを考量し、ファイルのバイト配列をMariaDBにインサートし、

指紋チェック時に、DBに接続してバイナリで読みだして照合することにしました。

 

が、インサートしたデータを、VBで取得すると、

なぜかバイト配列の中身が、ASCIIコードになってしまっているのです。

 

もともとは 0,7 ~ → 48,55 ~

????? 何をやってもアスキーコードしか返ってきません。

どうしてでしょうか。

仕方がないので、数値に変換することにしました。

 

DBにインサートするサンプル ポイントを赤字で表示しています。

 

 '''ファイルをバイナリで読み込む

Private Function RaeadBinary(ByVal filePath As String) As Byte()
  Dim fs As New FileStream(filePath, FileMode.Open, FileAccess.Read)

  Dim fileSize As Integer = CInt(fs.Length) ' ファイルのサイズ
  Dim buf(fileSize - 1) As Byte ' データ格納用配列

  Dim readSize As Integer ' Readメソッドで読み込んだバイト数
  Dim remain As Integer = fileSize ' 読み込むべき残りのバイト数
  Dim bufPos As Integer = 0 ' データ格納用配列内の追加位置

  While remain > 0
    ' 1024Bytesずつ読み込む
    readSize = fs.Read(buf, bufPos, Math.Min(1024, remain))

    bufPos += readSize
    remain -= readSize
  End While
  Return buf
End Function

’’’読み取ったバイナリデータを16進表現に変換する
Private Function Get16Dump(ByVal val() As Byte) As String
  Dim s As String
  s = BitConverter.ToString(val)
  Return s
End Function

Public Function GetInsertValBinary16(ByVal filePath As String) As String
    Dim val() As Byte = Me.RaeadBinary(filePath)
    Dim StrVal16 As String = Get16Dump(val)

    Return StrVal16
End Function

 

'' '指紋データをDBにインサートする

Public Function InsertSimon(ByVal simonStr As String) As Boolean
  Try
      Dim sql As New System.Text.StringBuilder()
      sql.AppendLine("INSERT INTO ~ (")

  ・・・・・・・・・・・・・・・・・
       sql.AppendLine(")VALUES(")
       sql.AppendLine("@simdat,")
       sql.AppendLine("@created_at,")
       sql.AppendLine("@updated_at")
       sql.AppendLine(");")

      Dim myParams As New List(Of MySqlParameter)
      Dim myParam_simdat As New MySqlParameter("@simdat", MySqlDbType.Blob)
      Dim myParam_createdat As New MySqlParameter("@created_at", MySqlDbType.DateTime)
      Dim myParam_updatedat As New MySqlParameter("@updated_at", MySqlDbType.DateTime)

      myParam_simdat.Value = simonStr
      myParam_createdat.Value = DateTime.Now()
      myParam_updatedat.Value = DBNull.Value

      myParams.Add(myParam_simdat)
      myParams.Add(myParam_createdat)
      myParams.Add(myParam_updatedat)


      Dim result As Boolean = ExecuteSQLNonQuery(sql.ToString(), myParams)
      If result Then
           Return True
      Else
            Return False
      End If
      Return True
   Catch ex As Exception
      MessageBox.Show(ex.Message)
   Return False
End Try

End Function

 

'''SQLを実行するメソッド

Public Function ExecuteSQL(ByVal sql As String, Optional ByVal params As List(Of MySqlParameter) = Nothing) As DataTable
 Try
  Connect()
  Dim Table As New DataTable("Table")
  Dim cmd As New MySqlCommand(sql, _Connection)
  If Not params Is Nothing Then
    For Each p As MySqlParameter In params
     cmd.Parameters.Add(p)
    Next
  End If

  Dim DataAdapter As New MySqlDataAdapter(cmd)
  DataAdapter.Fill(Table)
  Return Table
 Catch ex As Exception
  MessageBox.Show(ex.Message)
  Return Nothing
 Finally
  Close()
 End Try
End Function

 

'''DBに接続するメソッド

Private Function Connect()
 Try
  Dim ConnectionString As String = ~
  _Connection = New MySqlConnection()
  _Connection.ConnectionString = ConnectionString
  _Connection.Open()
  Return True
 Catch ex As Exception
  MessageBox.Show(ex.Message)
  Return False
 End Try

End Function

'''DB接続を閉じる

Private Sub Close()
 Try
  _Connection.Close()
 Catch ex As Exception

  MessageBox.Show(ex.Message)

 End Try

 End Sub

'''登録ボタン

Private Sub RegistButton_Click(sender As Object, e As EventArgs) Handles RegistButton.Click

 Dim byteStr16 As String = rep.GetInsertValBinary16(_filePath)

 Dim result As Boolean = rep.Insert(byteStr16, SimonTable.Rows(i))

 


  If result = False Then
    MessageBox.Show("登録に失敗しました。", "ERROR",   MessageBoxButtons.OK, MessageBoxIcon.Error)
  End If


  MessageBox.Show("登録が完了しました。", "OK", MessageBoxButtons.OK,   MessageBoxIcon.Asterisk)

End Sub

 

取得して照合はまた次回にします。