PHPアプリケーションをHerokuにデプロイするときに”ERROR: Couldn’t parse ‘composer.lock’; it must be a valid lock”エラー

PHPアプリケーションをHerokuにデプロイしようと思い、

git push heroku master

としたところ

-----> PHP app detected
-----> Bootstrapping...
-----> Installing platform packages...
 ! ERROR: Couldn't parse 'composer.lock'; it must be a valid lock
  file generated by Composer. Run 'composer update', add/commit
  the change, then push again.
 ! Push rejected, failed to compile PHP app.
 ! Push failed

となりデプロイが失敗。

composer.lockは存在しており、指示通りcomposer updateをしてcomposer.jsoncomposer.lockを更新したうえでデプロイしても同じエラーが発生しました。

php – Heroku ERROR: Failed parsing composer.lock; it must be non-empty and valid JSON – Stack Overflow

より

composer self-updateでcomposer自体を更新し、composer updateしたうえで、デプロイすることでエラーが出なくなりデプロイできました。

phpMyAdminでDATETIME型が「BLOB」と表示される

  • PHP5.6
  • Apache 2.2
  • MySQL 5.6

をソースからビルドし

  • phpMyAdmin4.6.4

を設置・設定したうえで、DATETIME型を含むテーブルを作りデータを投入後、phpMyAdminから内容を確認すると、

DATETIME型がBlog表示

と表示されてしまいました。

MySQLコマンドでのSELECTやMySQL Workbenchを使って確認したところ、日付として表示されており問題がない状況。

調べたところ、

php – phpMyAdmin: Date Fields Display as BLOB – Stack Overflow

が見つかり、phpinfo()でPHPのMySQLモジュールに何が使われているのか確認したところ、mysqlモジュールが使われていました。
そこで、mysqliモジュールを使うようにビルドしなおしたところ、

DATETIME型が正常に表示

と正常に表示されるようになりました。

curl経由で実行するシェルスクリプトで標準入力を使いたい

症状

.gitconfigはGitで管理しておいて、git config user.name/user.emailは管理したくない | misty-magic.h
にある

GIT_CONFIG_LOCAL=~/.gitconfig.local
if [ ! -e $GIT_CONFIG_LOCAL ]; then
  echo -n "git config user.email?> "
  read GIT_AUTHOR_EMAIL

  echo -n "git config user.name?> "
  read GIT_AUTHOR_NAME

  cat < $GIT_CONFIG_LOCAL
[user]
  name = $GIT_AUTHOR_NAME
  email = $GIT_AUTHOR_EMAIL
EOF
fi

を含んだコードをgithubに保存し、

以下のような、よくあるcurlを使った呼び出し方

curl https://raw.githubusercontent.com/mistymagich/dotfiles/master/install.sh | bash

をすると、標準入力部分で入力待ちにならず、そのままエラー終了(終了コードが1)してしまう。

解決

linux – Execute bash script from URL – Stack Overflow

より、呼び出し方を変える

bash <(curl -s https://raw.githubusercontent.com/mistymagich/dotfiles/master/install.sh)

※"<"と"("を離すとbashの構文エラーになるので注意

.gitconfigはGitで管理しておいて、git config user.name/user.emailは管理したくない

Gitを使う上で、git config user.name/user.emailの設定は必要。そして.gitconfigなどのdotfilesをgithubで管理したいけど、git config user.name/user.emailはそこに記載したくない。
ということで、gitconfigのincludeを使って別ファイルにしました。

Gitで管理する.gitconfigには

[include]
  path = ~/.gitconfig.local

としておいて、dotfileの展開スクリプト内で

GIT_CONFIG_LOCAL=~/.gitconfig.local
if [ ! -e $GIT_CONFIG_LOCAL ]; then
  echo -n "git config user.email?> "
  read GIT_AUTHOR_EMAIL

  echo -n "git config user.name?> "
  read GIT_AUTHOR_NAME

  cat < $GIT_CONFIG_LOCAL
[user]
  name = $GIT_AUTHOR_NAME
  email = $GIT_AUTHOR_EMAIL
EOF
fi

とすることで、展開スクリプト実行中にプロンプトを出して、user.name/user.emailを入力させました。

実際のdotfileの展開スクリプト

参考

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」の「受信パケット」に対応する値