久しぶりの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]

複数のグラフを重ねて表示するときは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]

グラフの説明(凡例)のテキストと表示、非表示は以下で設定
[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
これを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')))
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アノテーション等が該当するクラス。
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」を選択。

ボタンを配置し、ui_sampleDlg.uiに保存。
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_()
以上で正しく表示される
次はボタンが押されたらダイアログを閉じるように設定
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)
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






