PyQtで仮想デスクトップ全体にわたるウィンドウを作成

マルチディスプレイでデスクトップを表示している状態で、PyQtでそれらを覆うウィンドウを作成する

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QDesktopWidget

if __name__ == '__main__':
    app = QApplication(sys.argv)

    w = QWidget()

    desktopWidget = QDesktopWidget()
    w.move(desktopWidget.x(), desktopWidget.y())
    w.resize(desktopWidget.width(), desktopWidget.height())

    w.show()

    sys.exit(app.exec_())

参考

広告

GitHubに登録しているSSH公開鍵のURL

https://github.com/settings/keys に登録しているSSH Keysは

https://github.com/USERNAME.keys で取得できる

$ wget https://github.com/USERNAME.keys
$ cat USERNAME.keys
ssh-rsa XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX....
ssh-rsa XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX....

都度保存しているテキストファイルからauthorized_keys転記していたので地味に助かりました。

参考

GitHubに登録してある公開鍵をauthorized_keysに追加するコマンド – Qiita

Ubuntu 14.04, Ubuntu 16.04上のsnmpwalk,snmptranslateでエラーが出力される

症状

Ubuntu 14.04上からYAMAHA RTX810の情報をSNMPを通して取得するために、
zabbixでRTX-810をSNMPv2で監視する方法 – Ogalogを参考に

apt-get install snmp snmp-mibs-downloader
wget http://www.rtpro.yamaha.co.jp/RT/docs/mib/yamaha-private-mib.tar.gz
tar xvzf yamaha-private-mib.tar.gz -C /usr/share/snmp/mibs
sed -ibak "s/mibs :/mibs all/" /etc/snmp/snmp.conf

としたのち、値が取れるか確認するために、以下のコマンドを実行したところ1

snmpwalk -v 2c -c public XXX.XXX.XXX.XXX  YAMAHA-RT-INTERFACES::yrIfPpInUcastPkts.4

以下のようなエラーが標準エラーに出力された。

Bad operator (INTEGER): At line 73 in /usr/share/mibs/ietf/SNMPv2-PDU
Unlinked OID in IPATM-IPMC-MIB: marsMIB ::= { mib-2 57 }
Undefined identifier: mib-2 near line 18 of /usr/share/mibs/ietf/IPATM-IPMC-MIB
Expected "::=" (RFC5644): At line 493 in /usr/share/mibs/iana/IANA-IPPM-METRICS-REGISTRY-MIB
Expected "{" (EOF): At line 651 in /usr/share/mibs/iana/IANA-IPPM-METRICS-REGISTRY-MIB
Bad object identifier: At line 651 in /usr/share/mibs/iana/IANA-IPPM-METRICS-REGISTRY-MIB
Bad parse of OBJECT-IDENTITY: At line 651 in /usr/share/mibs/iana/IANA-IPPM-METRICS-REGISTRY-MIB
.1.3.6.1.4.1.1182.2.3.9.1.11.4 = Counter32: 482448610

また、

snmptranslate .1.3.6.1.4.1.1182.2.3.9.1.11.4

としたところ、

Bad operator (INTEGER): At line 73 in /usr/share/mibs/ietf/SNMPv2-PDU
Unlinked OID in IPATM-IPMC-MIB: marsMIB ::= { mib-2 57 }
Undefined identifier: mib-2 near line 18 of /usr/share/mibs/ietf/IPATM-IPMC-MIB
Expected "::=" (RFC5644): At line 493 in /usr/share/mibs/iana/IANA-IPPM-METRICS-REGISTRY-MIB
Expected "{" (EOF): At line 651 in /usr/share/mibs/iana/IANA-IPPM-METRICS-REGISTRY-MIB
Bad object identifier: At line 651 in /usr/share/mibs/iana/IANA-IPPM-METRICS-REGISTRY-MIB
Bad parse of OBJECT-IDENTITY: At line 651 in /usr/share/mibs/iana/IANA-IPPM-METRICS-REGISTRY-MIB
YAMAHA-RT-INTERFACES::yrIfPpInUcastPkts.4

と同じエラーが出力された。

対応

How to fix net-snmp / snmpwalk errors [Linux consulting & more in Mantova]より、

エラーになっているMIBファイルを入れ替える(SNMPv2-PDUとIPATM-IPMC-MIBはリンク先の著者が元のファイルから変更したものを使用していることに注意)

sudo wget http://www.iana.org/assignments/ianaippmmetricsregistry-mib/ianaippmmetricsregistry-mib -O /usr/share/mibs/iana/IANA-IPPM-METRICS-REGISTRY-MIB
sudo wget http://pastebin.com/raw.php?i=p3QyuXzZ -O /usr/share/mibs/ietf/SNMPv2-PDU
sudo wget http://pastebin.com/raw.php?i=gG7j8nyk -O /usr/share/mibs/ietf/IPATM-IPMC-MIB

その他

  • Vagrant上で動作確認(使用box: ubuntu/trusty64, ubuntu/xenial64
  • YAMAHAのprivate MIBを導入しなくても、 /etc/snmp/snmp.confのmibsオプションをallに設定するだけで同じ現象が発生する。

  1. SNMP v2cを使用。XXX.XXX.XXX.XXXはRTX810のIPアドレス。RTX810側はsnmpの利用許可設定済み(snmpv2c host)。OIDはRTX810のコマンド「show status pp 1」の「受信パケット」に対応する値 

vagrantのshell provisionerにrun: “always”オプションを使うことでvagrant upするたびにdocker-composeを実行させる

開発環境をVagrantDocker(docker-compose)で構築したのですが、毎回コンテナを起動するために

  1. vagrant up
  2. SSHでゲストOSにログイン
  3. ゲストOS上でdocker-compose up

という手順を踏んでいました。

VagrantとDockerを使ったPHP実行環境を生成するサービス:PHPDocker.io – PHP and Docker development environment generator で生成されるVagrantfileを見ると、以下の方法でdocker-composeを起動させていました。

    # Bring up containers
    config.vm.provision "shell", run: "always", inline: "cd /home/docker/sample/phpdocker && docker-compose up -d 1>&2"

runオプションはProvisionerの共通オプションで、デフォルトでは最初のvagrant upでのみprovisionerが実行されますが、alwaysを指定することで、vagrant up, vagrant reloadのたびに実行されるようになります。

実際には以下のようにして使っています。

冒頭の3.のdocker-compose upはserver.shというスクリプトに書いてserver.sh upとして使っていました。

#!/bin/bash -eu

PWD=$(cd $(dirname $0); pwd)
PROJNAME=sampleproject

ARGS=
if [ $# -eq 0 ];then
    ARGS="up -d"
else
    ARGS=$@
fi

cd $PWD && docker-compose -p $PROJNAME $ARGS

Vagrantfileに以下の内容を追加しました。

  config.vm.provision "shell", run: "always", inline: "[ -f /home/vagrant/sampleproject/server.sh ] && /home/vagrant/sampleproject/server.sh"

プライベートGyazoサービスの構築

スクリーンショットをサーバにアップロードしてURLで共有できるGyazoというサービスがあります。
このOpen Source ClientのコードがGitHubにあるので、これでプライベートGyazoサービスを構築します。

今回の構成は

  • クライアント
    • Windows 10
    • gyazo/Gyazowinをもとにアップロード先URLを変更したものを作成
  • サーバー
    • Ubuntu 14.04
    • gyazo/GyazoのServerにあるRubyスクリプトを使う
    • Gyazoサーバプログラムはインストールから動作までDocker内で行う
    • アップロードされた画像、プログラム内部で利用するデータベースのような動的生成されるデータはdockerのマウント機能を使ってサーバ上に保存する

という形にしました。

サーバー側

必要なもの

  • Docker (記事執筆時に利用したのは1.7.1)
  • サービス用のドメイン

ドメインは http://~ でアクセスできるようにDNSで関連付けておいてください。

今回はgyazo.example.jpとしました。

  1. Gyazo用のディレクトリを作成
    mkdir gyazo
    cd gyazo
    
  2. Dockerfileを作成

    11行目の[SERVERDOMAIN]はサービス用のドメインに置き換えてください。

    例)

    RUN sed -i -e "s/gyazo.com/gyazo.example.jp\/data/" /usr/local/apache2/htdocs/upload.cgi
    
  3. イメージを作成

    docker buildでイメージを作成します。イメージにgyazoという名前を付けます。

    docker build --rm -t gyazo .
    
  4. gyazoイメージからgyazoという名前でコンテナを起動する
    docker run -d -p 80:80 --name gyazo -v `pwd`/data:/usr/local/apache2/htdocs/data -v `pwd`/db:/usr/local/apache2/htdocs/db gyazo
    
  5. http://gyazo.example.jp にアクセスして動作を確認

    「It’s works」がでればOK。

    Itsworks

クライアント側

必要なもの

  • Visual Studio 2015 Community (本記事ではインストール時に既定でインストールしています)
  1. ソースコードの取得

    gyazo/Gyazowinからソースコードをクローン、またはダウンロードします。今回はZIPでダウンロードしました。

  2. ZIPを展開して中にある、「gyazowin.sln」をダブルクリックで開く

    gyazowin.slnはVisual Studio 2015よりも古いフォーマットのファイルのため、アップグレード警告が表示されます。そのままアップグレードします。
    またVC++の開発環境がない場合、ここで追加インストールのウィザードが始まるのでインストールしたのち、gyazowin.slnを開きなおします。

    Upgrade_1Upgrade_2Upgrade_3

    InstallVC_2
    InstallVC_3

  3. コードの編集

    gyazowinはスクリーンショット画像をgyazoに送信する機能を持っていますが、送信先はソースコードにハードコーティングされているため、そこを今回用意したサーバへ変更します。

    gyazowin.cppの794行目のupload.gyazo.comgyazo.example.jpに変更します。

    Diff_gyazowin

  4. ビルドの実行

    1. メニュー「ビルド」の下にあるソリューション構成を「Debug」から「Release」に変更する
      Build Settings
    2. メニュー「ビルド」→「ソリューションのビルド」でビルドを実行

    正常に終了すれば、Releaseディレクトリが作成され、中にgyazowin.exeが生成されます。

  5. 実行確認

    1. gyazowin.exeを実行する
    2. カーソルが十字になる
    3. スクリーンショットを撮りたい範囲の左上をクリックしたまま、右下までドラッグ
    4. 指を話すと、スクリーンショットがgyazo.example.jpにアップロードされたのち、アップロード先URLで既定のブラウザが起動される。
      Gyazowinフォルダのエクスプローラをスクリーンショットしたもの
    5. サーバのdockerを起動したディレクトリの直下にdataディレクトリが作成され、そこにアップロードされた画像が配置する
      server_upload_images

備考

参考

KnowledgeをHerokuで動かす

Qiita:Teamのような情報共有ツールで社内LANのような限定的に使うことができるものを探していたところ、Knowledgeを見つけました。

そこで、ためしに、Heroku上で動かしてみました。
作業環境はLinux (Ubuntu 14.04)で行っています。

なお、公式でDeploy to Heroku Buttonに対応しているため、下記の手順を行わなくても、GitHub上のsupport-project/knowledgeの「Deploy to Heroku」を押下するとデプロイ~PostgreSQLアドオンの追加まで行ってくれます。

インストールから起動まで

  1. Herokuアカウントの作成

    Herokuアカウントを持っていない場合は、Sign Upでアカウントを作成します。

  2. JREのインストール

    KnowlegeをHerokuにデプロイする際にJavaが必要なため、作業環境にJREをインストールしておきます。

    $ sudo apt-get install -y default-jre
    
  3. Herokuのコマンドラインツールのインストールとログイン

    Heroku Toolbeltをインストールします。サイト上で、「Debian/Ubuntu」を選択すると表示されるコマンドを実行します。

    $ wget -O- https://toolbelt.heroku.com/install-ubuntu.sh | sh
    

    つぎにHerokuにログインします。

    $ heroku login
    
  4. Herokuアプリの作成

    作業用ディレクトリを作成します。

    $ mkdir knowledge
    $ cd knowledge
    

    アプリ名をsample-knowlegeとしてHerokuアプリを作成します。(アプリ名は適宜変更します)

    $ heroku create sample-knowlege
    
  5. Knowledgeのダウンロード

    KnowledgeはJavaのWAR形式で提供されているので、それをダウンロードします。

    ダウンロードはこちらから Releases support-project/knowledge

    執筆時点での最新バージョン1.3.1を使います。

    $ wget https://github.com/support-project/knowledge/releases/download/v1.3.1/knowledge.war
    
  6. WARをHeroku上で動かすために、Heroku ToolbeltのWARデプロイプラグインを追加する

    WARデプロイについて – WAR Deployment | Heroku Dev Center
    WARデプロイプラグインについて – heroku/heroku-deploy

    $ heroku plugins:install https://github.com/heroku/heroku-deploy
    
  7. knowledge.warをHerokuにデプロイ
    $ heroku deploy:war --war knowledge.war --app sample-knowlege
    

    アクセス先URLの確認

    $ heroku apps:info sample-knowlege
    === sample-knowlege
    Dynos:         web: 1
    :
    :
    :
    :
    Web URL:       https://sample-knowlege.herokuapp.com/
    
  8. URLでアクセス

    https://sample-knowlege.herokuapp.com/ にアクセスします。

    Topページ

    ログインはドキュメントKnowledge – Free knowledge base systemより

    ID:admin、パスワード:admin123

    でできます。

DBをPostgreSQLに変更する

KnowledgeのDBはデフォルトでは、組み込みのH2 Databaseを使用しているため、デプロイしなおすとデータが消えます。
永続化するためにデータベースをPostgreSQLに変更します。

  1. HerokuにPostgrSQLのアドオンを追加
    $ heroku addons:create heroku-postgresql --app sample-knowlege
    
  2. JDBC用のURL情報を取得

    KnowledgeにPostgreSQLの接続情報を設定するためにJDBC情報を取得します。
    Connecting to Relational Databases on Heroku with Java | Heroku Dev Centerより

    $ heroku run echo \$JDBC_DATABASE_URL --app sample-knowlege
    Running echo $JDBC_DATABASE_URL on sample-knowlege... up, run.2571
    jdbc:postgresql://ec2-WW-XX-YY-ZZ.compute-1.amazonaws.com:5432/XXXXXXXXXX?user=XXXXXXXXX&password=XXXXXXXXXXXXX&sslmode=require
    
  3. KnowledgeにPostgreSQLの接続情報を登録

    adminでログインしたのち、「システム設定」→「データベースの接続先変更」に以下の情報を入力して「保存」ボタンを押下します。

    driverClass: org.h2.Driver # 選択済みの状態
    URL: 先ほどの手順で取得したJDBCの接続URL
    user:先ほどの手順で取得したJDBCの接続URLにあるuser=の値
    password:先ほどの手順で取得したJDBCの接続URLにあるpassword=の値
    schema:先ほどの手順で取得したJDBCの接続URLにある:5432/と?の間の文字列
    max connection: 0 # そのまま
    auto commit: false # そのまま
    

    DB接続情報入力

  4. 組み込みDBの内容をPostgreSQLにコピー

    先の手順で登録に成功すると、「保存」ボタンの横に「組み込みDBで保存したデータをカスタム設定のDBにコピー」ボタンが現れるので、それを押下してデータをコピーします。

  5. 接続先をPostgreSQLに切り替える

    「driverClass」を「org.h2.Driver」から「org.postgresql.Driver」に変更して「保存」ボタンを押下します。

    ※なお、デプロイしなおすと、DB接続設定がクリアされるため、再度同じ内容を入力して切り替える必要があります。(その際は「組み込みDBで保存したデータをカスタム設定のDBにコピー」は実行しないこと)

その他

  • PostgreSQLの接続情報を登録した際、誤った情報を登録してしまい、Server Errorになった

    Server ErrorになるとTopページは表示されますが、ログインなどができなくなってしまいます。再度、デプロイすることでログインできます。その際組み込みDBに登録している内容はクリアされます。

  • PostgreSQLの内容を見るには

    https://postgres.heroku.com/databases では中身を確認できないため、コマンドラインツール(psqlなど)、WEBツール(phpPgAdminなど)・GUIツールなどで見る必要があります。