ホーム » tarumi の投稿 (ページ 20)

作者アーカイブ: tarumi

久しぶりのCentOSとMySQL

久しぶりにCentOSにMySQLをインストール
CentOSのバージョンはCentOS7.2 1511
※1511とは201511版らしい
もちろん64bit
MySQLのバージョンは5.7.13-1

CentOSのインストール

インストーラーも大きくかわり何気無く最小構成でインストールしたらXがインストールされなかったので、改めてX Window Gnoneを選択してインストールする。

インストール直後はなぜか日本語入力が使えなかったので、アプリケーション→システムツール→設定→地域と言語に日本語(かな漢字)を追加
※なぜか、日本語入力のON/OFFはWindowsキー+スペーらしい

MYSQLのサイトより以下のファイルをダウンロード
mysql-5.7.13-1.el7.x86_64.rpm-bundle.tar
tarコマンドで解凍
[code]
tar xvf mysql-5.7.13-1.el7.x86_64.rpm-bundle.tar
[/code]
tarボールに含まれるファイル
[code]
mysql-community-client-5.7.13-1.el7.x86_64.rpm
mysql-community-common-5.7.13-1.el7.x86_64.rpm
mysql-community-devel-5.7.13-1.el7.x86_64.rpm
mysql-community-embedded-5.7.13-1.el7.x86_64.rpm
mysql-community-embedded-compat-5.7.13-1.el7.x86_64.rpm
mysql-community-embedded-devel-5.7.13-1.el7.x86_64.rpm
mysql-community-libs-5.7.13-1.el7.x86_64.rpm
mysql-community-libs-compat-5.7.13-1.el7.x86_64.rpm
mysql-community-minimal-debuginfo-5.7.13-1.el7.x86_64.rpm
mysql-community-server-5.7.13-1.el7.x86_64.rpm
mysql-community-server-minimal-5.7.13-1.el7.x86_64.rpm
mysql-community-test-5.7.13-1.el7.x86_64.rpm
[/code]
mysql-community-embedded*は組込用なのでインストールはしない。
mysql-community-libs-compat-5.7.13-1.el7.x86_64.rpmは過去バージョンとの互換性を提供するライブラリなので要インストール。

インストール前にMiraiDB関連のパッケージがインストールされていたら削除。
[code]
# yum list installed | grep maria
mariadb-libs.x86_64 1:5.5.47-1.el7_2 @updates
# yum remove mariadb-libs
[/code]

以下の順番でインストール
[code]
rpm -ivh mysql-community-common-5.7.13-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.13-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-compat-5.7.13-1.el7.x86_64.rpm
rpm -ivh mysql-community-devel-5.7.13-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-5.7.13-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-5.7.13-1.el7.x86_64.rpm
rpm -ivh mysql-community-minimal-debuginfo-5.7.13-1.el7.x86_64.rpm
[/code]

C# Chartコントロール

C# Chartコントロールについてわかりきったことや忘れやすいことのまとめ

Chart.Seriesはグラフ(データ)のコレクション
Chart.ChartAreasはXY軸や目盛りのコレクション

1つの棒グラフを表示
[code]
chart1.Series.Clear();
//グラフ1
Series series = new Series();
series.Color = Color.Red;
series.ChartType = SeriesChartType.Column;
series.Points.AddXY(1, 5);
series.Points.AddXY(2, 2);
series.Points.AddXY(3, 8);
chart1.Series.Add(series);
[/code]
棒グラフ1

複数のグラフを重ねて表示するときはChart.Seriesに追加

2種類の棒グラフを重ねて表示
[code]
chart1.Series.Clear();
//グラフ1
Series series = new Series();
series.Color = Color.Red;
series.ChartType = SeriesChartType.Column;
series.Points.AddXY(1, 5);
series.Points.AddXY(2, 2);
series.Points.AddXY(3, 8);
chart1.Series.Add(series);
//グラフ2
series = new Series();
series.Color = Color.Blue;
series.ChartType = SeriesChartType.Column;
series.Points.AddXY(1, 3);
series.Points.AddXY(2, 1);
series.Points.AddXY(3, 5);
chart1.Series.Add(series);
[/code]
棒グラフ

複数の棒グラフを表示すると重ならないように表示される。
重ねたいときはグラフ2をSeriesChartType.RangeColumnにしてグラフ幅を設定
[code]
chart1.Series.Clear();
//グラフ1
Series series = new Series();
series.Color = Color.Red;
series.ChartType = SeriesChartType.Column;
series.Points.AddXY(1, 5);
series.Points.AddXY(2, 2);
series.Points.AddXY(3, 8);
series["PointWidth"] = "0.8";
chart1.Series.Add(series);
//グラフ2
series = new Series();
series.Color = Color.Blue;
series.ChartType = SeriesChartType.RangeColumn;
series.Points.AddXY(1, 3);
series.Points.AddXY(2, 1);
series.Points.AddXY(3, 5);
series["PointWidth"] = "0.2";
chart1.Series.Add(series);
[/code]
棒グラフ3

グラフの説明(凡例)のテキストと表示、非表示は以下で設定
[code]
series.LegendText = "グラフ1";
series.IsVisibleInLegend = true;
[/code]

App.configに独自セクションを追加してHashTableで読み込む

stackoverflowさん、そのままです
app.configのconfigSectionsセクションに追加セクション(MajorCommands)を記載
[code]
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="MajorCommands" type="System.Configuration.DictionarySectionHandler" />
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<appSettings>
省略・・・
</appSettings>
<MajorCommands>
<add key="Standby" value="STBY"/>
<add key="Operate" value="OPER"/>
<add key="Remote" value="REMOTE"/>
<add key="Local" value="LOCAL"/>
<add key="Reset" value="*RST" />
</MajorCommands>
</configuration>
[/code]

C#ではConfigurationManagerのGetSectionでセクション以下をハッシュに読み込み
[code]
System.Collections.Hashtable nb = System.Configuration.ConfigurationManager.GetSection("MajorCommands") as System.Collections.Hashtable;
[/code]

PythonとQtでListView

VisualStudio等で開発しているとおなじみのListView

clip_8

これをQTで実現するにはQTreeViewを使用する。

QtデザイナでダイアログにTreeViewを配置して以下のコードを実装。

        model = QStandardItemModel(0,3)
        model.setHeaderData( 0, Qt.Horizontal, ('名称').decode('utf-8'))
        model.setHeaderData( 1, Qt.Horizontal, ('都道府県').decode('utf-8'))
        model.setHeaderData( 2, Qt.Horizontal, ('自治体').decode('utf-8'))

        self.ui.treeView.setRootIsDecorated(False)
        self.ui.treeView.setItemsExpandable(False)
        self.ui.treeView.setModel(model)
        # view.setUniformRowHeights(True)
        model.setItem( 0, 0, QStandardItem(("山田花子").decode('utf-8')))
        model.setItem( 0, 1, QStandardItem(("東京都").decode('utf-8')))
        model.setItem( 0, 2, QStandardItem(("豊島区").decode('utf-8')))
        model.setItem( 1, 0, QStandardItem(("斉藤淳").decode('utf-8')))
        model.setItem( 1, 1, QStandardItem(("埼玉県").decode('utf-8')))
        model.setItem( 1, 2, QStandardItem(("所沢市").decode('utf-8')))

clip_10

Python メモ

文字列に変換


[code]
str(変数)
[/code]

配列(リスト)


初期化


[code]
lists = []
list = ["taro","hanako"]
[/code]

追加


[code]
lists.append("saito")
[/code]

繰り返し


[code]
for l in lists:
print l
[/code]

よくあるインデックスをインクリメントしながらの繰り返し(idx=0から10)


[code]
for idx in Range(0, 10):
print idx
[/code]

PythonでQgsMapCanvasItemの派生クラスを作成

QgsMapCanvasItemとは

QgsMapCanvasItemはQgsMapCanvas上に固定表示されるクラス

QgsMapCanvasItemからさ区政されたクラスにはQgsPointRotationItem、QgsAnnotationItem、QgsVertexMarker がある。

QGISメニューの文字注記、HTMLアノテーション等が該当するクラス。

clip_7

QgsMapCanvasItemからの派生

今回はQgsMapCanvasItemから派生したCopyrightItemを作成して地図上にCopyrightを表示
ポイントとしては基底クラスであるQGraphicsItemのメンバー変数にDataに文字列「AnnotationItem」をセット
これがないと描画されない。
またメンバー関数paintを可変引数にすること。
QgsMapCanvasItemには引数が異なるpaint関数が存在する。
これに対応するために。

# -*- coding: utf-8 -*-
# Import the PyQt and QGIS libraries
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from qgis.core import *
from qgis.gui import *

class CopyrightItem(QgsMapCanvasItem): 
    def __init__(self, canvas): 
        QgsMapCanvasItem.__init__(self, canvas)
        self.center = QgsPoint(0, 0)
        self.size   = 100
        self.canvas = canvas
        super(CopyrightItem,self).setData(0,"AnnotationItem")

    def setCenter(self, center): 
        self.center = center

    def center(self):
        return self.center

    def setSize(self, size):
        self.size = size 

    def size(self):
        return self.size

    def boundingRect(self):
        return QRectF(self.center.x() - self.size/2, self.center.y() - self.size/2, self.center.x() + self.size/2, self.center.y() + self.size/2)

    def paint(self, painter, *args):
        painter.drawText(200,200, "CopyrightItem")

    def updatePosition(self):
        self.setCenter(self.center)



PythonとQtでダイアログ表示

Pythonを使ってQGISのプラグインを作るにあたり、QTダイアログについて調べる

QTデザイナを起動して「新規作成」→「Dialog without Buttons」を選択。
clip_2

ボタンを配置し、ui_sampleDlg.uiに保存。

clip_4

pyuic4を使用してuiファイルをPythonファイルに変換

pyuic4 ui_sampleDlg.ui -o ui_sampleDlg.py

※pyuic4.batを使うためにC:\OSGeo4W\binにPATHを通す。
環境変数PYTHONHOMEが設定されていなければpyuic4.batに以下の行を追加

SET PYTHONHOME=C:\OSgeo4w\apps\Python27

変換後のui_sampleDlg.py

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'ui_sampleDlg.ui'
#
# Created: Sat Apr 23 07:01:53 2016
#      by: PyQt4 UI code generator 4.11.3
#
# WARNING! All changes made in this file will be lost!

from PyQt4 import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName(_fromUtf8("Dialog"))
        Dialog.resize(400, 300)
        self.pushButton = QtGui.QPushButton(Dialog)
        self.pushButton.setGeometry(QtCore.QRect(300, 20, 75, 23))
        self.pushButton.setObjectName(_fromUtf8("pushButton"))

        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        Dialog.setWindowTitle(_translate("Dialog", "Dialog", None))
        self.pushButton.setText(_translate("Dialog", "PushButton", None))

作成したユーザーインターフェイスを呼び出すクラスをQDialogから派生して作成
クラス名はSampleDlg、ファイル名はSampleDlg.pyとする。
※ifaceは

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'DlgTest.ui'
#
# Created: Wed Apr 20 16:59:11 2016
#      by: PyQt4 UI code generator 4.11.3
#
# WARNING! All changes made in this file will be lost!

from PyQt4.QtCore import *
from PyQt4.QtGui import *
from qgis.core import *
from ui_sampleDlg import Ui_Dialog

class SampleDlg(QDialog):

    def __init__(self, iface):
        QDialog.__init__(self)
        self.iface = iface
        self.ui = Ui_Dialog()
        self.ui.setupUi(self)

プラグインからSampleDlgクラスの表示

from SampleDlg import SampleDlg
dlg = SampleDlg(self.iface)
dlg.show()
dlg.exec_() 

以上で正しく表示される

clip_5

次はボタンが押されたらダイアログを閉じるように設定

SampleDlgクラスでボタンのシグナル引っ掛けてダイアログのcloseを呼ぶ

class SampleDlg(QDialog):

    def __init__(self, iface):
        ・・・
        QObject.connect(self.ui.pushButton, SIGNAL("clicked()"), self.pushButton)

    @pyqtSlot()
    def pushButton(self):
        self.close()

以上で終了

QGIS(pythonでpostgresql)

以下はまんま「stackexchange」です。
忘れないようにコピー。
How to perform SQL queries and get results from QGIS python console?

8
down vote
accepted
1) With PyQt4.QtSql: Gary Sherman shows how to query a spatial table in Creating a PostgreSQL Connection From a QGIS Layer Datasource:

from PyQt4.QtSql import *
layer = iface.activeLayer()
uri = QgsDataSourceURI()
uri.setConnection(“localhost”, “5432”, “testpostgis”, “me”, “”)
uri.setDataSource(“public”, “teststrati”, “the_geom”)
# add the layer to the canvas
vlayer = QgsVectorLayer(uri.uri(), “tot”, “postgres”)
# now query the table
db = QSqlDatabase.addDatabase(“QPSQL”);
db.setDatabaseName(uri.database())
db.setPort(int(uri.port()))
db.setUserName(uri.username())
db.setPassword(uri.password())
db.open()
# query the table
query = db.exec_(“””select * from teststrati”””)
query.next()
query.value(0)
130
# etc read the documentation of QtSQL
And you can open all the other tables/views (spatial or non spatial) similarly:

db = QSqlDatabase.addDatabase(“QPSQL”)
db.setHostName(“localhost”)
db.setPort(5432)
# non spatial table or view
db.setDatabaseName(“people”)
db.setUserName(“me”)
db.setPassword(“”)
query = QSqlQuery(db)
query.exec_(“select * from people;”)
# etc.
2) Or you can use the standard Python module for PostgreSQL/PostGIS: Psycopg2:

import psycopg2
conn = psycopg2.connect(“dbname=’testpostgis’host=’localhost’ user=’me'”)
cur = conn.cursor()
sql = “””SELECT “DIP_DIR”,”DIP”, ST_AsGeoJSON(the_geom) from teststrati;”””
cur.execute(sql)
result = cur.fetchone()
print result
(130, 30, u'{“type”:”Point”,”coordinates”:[272070.600040999997873,155389.387920000008307]}’)
With a non spatial table or view and the result as a dictionary:

conn = psycopg2.connect(“dbname=’testpostgis’host=’localhost’ user=’me'”)
dict_cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
dict_cur.execute(“””SELECT * from people;”””)
rec = dict_cur.fetchone()
rec.keys()
[‘name’, ‘id’]
rec.values()
(‘Jon Doe’,1)
# etc read the documentation of the module

QGIS(Pythonでログ出力)

class HelloWorld:
    def __init__(self, iface):
        # Save reference to the QGIS interface
        self.iface = iface
        self.canvas = iface.mapCanvas()
        QgsMessageLog.logMessage("__init__", 'HelloWorld', QgsMessageLog.INFO)

QGISのログパネルに出力される
無題

QGIS3ではこんなかんじ

[code]
from qgis.core import Qgis, QgsMessageLog
import configparser
import os

#======================================================================
# ログクラス
#======================================================================
class Trace:
def __init__(self):
print(‘init’)
@staticmethod
def info(tag, msg):
QgsMessageLog.logMessage(msg, tag, Qgis.Info)

[/code]

QGISのログ(QgsDebugMsg)を有効にする

QGISのソースを確認すると「QgsDebugMsg」で多くのログが吐かれている。
これはQGISの内部の動作を追うには大変参考になる。
※レンダリング関係はデバッカーで追うのは大変。

実際にqgslogger.cppを確認すると下記の環境変数を設定する必要がある。
QGIS_DEBUG:1
QGIS_LOG_FILE:ログファイルのフルパス
※QGIS_DEBUG_FILEは不明

int QgsLogger::sDebugLevel = -999; // undefined value
int QgsLogger::sPrefixLength = -1;
QString QgsLogger::sFileFilter;
QString QgsLogger::sLogFile;
QTime QgsLogger::sTime;

void QgsLogger::init()
{
  if ( sDebugLevel != -999 )
    return;

  sTime.start();

  sLogFile = getenv( "QGIS_LOG_FILE" ) ? getenv( "QGIS_LOG_FILE" ) : "";
  sFileFilter = getenv( "QGIS_DEBUG_FILE" ) ? getenv( "QGIS_DEBUG_FILE" ) : "";
  sDebugLevel = getenv( "QGIS_DEBUG" ) ? atoi( getenv( "QGIS_DEBUG" ) ) :
#ifdef QGISDEBUG
                1
#else
                0
#endif
                ;

  sPrefixLength = sizeof( CMAKE_SOURCE_DIR );
  if ( CMAKE_SOURCE_DIR[sPrefixLength-1] == '/' )
    sPrefixLength++;
}

void QgsLogger::logMessageToFile( const QString& theMessage )
{
  if ( sLogFile.isEmpty() )
    return;

  //Maybe more efficient to keep the file open for the life of qgis...
  QFile file( sLogFile );
  if ( !file.open( QIODevice::Append ) )
    return;
  file.write( theMessage.toLocal8Bit().constData() );
  file.write( "\n" );
  file.close();
}

qgis起動バッチ(qgis.bat)に以下を記述してQGISを起動すると指定されたログが出力される

set QGIS_LOG_FILE=C:\QGIS\log.txt
set QGIS_DEBUG=1