Umi Uyuraのブログ

プログラミング関連の作業ログ

pylintで2スペースインデント用の設定

Pythonの標準的なコーディング規約であるPEP8では、インデントは4スペースと定められています。

PEP 8 -- Style Guide for Python Code | Python.org

個人的には、しばらくメインで書いていたJavaScriptを2スペースでやっていたこともあって、なんとなくPython書くときは2スペースインデントで書いているのですが、そうすると静的チェックで使っているpylintでいくつかエラーが発生してしまいます。

umi-uyura.hatenablog.com

そこで以下の点を変更することで、2スペース用の設定にすることができました。

[FORMAT]

...

# String used as indentation unit. This is usually "    " (4 spaces) or "\t" (1
# tab).
indent-string='  '

# Number of spaces of indent required inside a hanging  or continued line.
indent-after-paren=2

...

インデントを2スペースとする

2スペースのインデントで発生したエラーは、 Bad indentation. Found 2 spaces, expected 4 [bad-indentation] というものでした。

この場合は indent-string の設定を、デフォルトでは ' ' とスペース4つとなっているため、 ' ' とスペース2つにすることで、上記エラーにならないようになりました。

括弧に続く行のインデントも2スペースとする

indent-after-paren もデフォルトは 4 なのですが、そのままでは以下のように次の行に継続するような場合のインデントを2スペースにすると、 Wrong hanging indentation (add 2 spaces). [bad-continuation] という警告が出てしまいます。

my_list = [
  1, 2, 3,
  4, 5, 6,
]

そこで、ここも 2 を設定しておくことで、エラーとならなくなりました。

参考

gnupackでWindowsの環境変数PATHを引き継ぐ

gnupackを使いだして一つ困ったのは、Windows側で設定している環境変数PATHが引き継がれなかったことでした。

そのままだと、Windows側でも使うプログラムのPATHをCygwinEmacs上で再設定しなければならず、二重・三重の管理となってしまうので避けたいところ。

そこで調べてみたところ、解決方法を見つけたのでメモ。

対象

項目 バージョン
gnupack devel 13.06-2015.11.08

解決方法

\root\startup_config.ini 内で、PATHを設定設定している箇所があるのですが、その中で、最初に PATH = として既存のPATHをクリアしているような記述を発見。

 [Process Variable]
    CYGWIN_DIR = %ROOT_DIR%\app\cygwin\cygwin

    HOME      = %ROOT_DIR%\home
    TMP       = %TEMP%\gnupack
    TEMP      = %TMP%
    SHELL     = /bin/bash
    CYGWIN    = winsymlinks:lnk
    MAKE_MODE = unix
    TZ        = JST-9
    LANG      = ja_JP.utf8

    # PATH =          # ←この部分が既存の環境変数を消していたっぽい
    PATH = %PATH%;%EMACS_DIR%\bin
    PATH = %PATH%;%LOCAL_DIR%\bin
    PATH = %PATH%;%CYGWIN_DIR%\bin
    PATH = %PATH%;%ROOT_DIR%\app\script
    PATH = %PATH%;%ROOT_DIR%\app\vim
    PATH = %PATH%;%windir%\system32;%windir%;%windir%\system32\Wbem
    PATH = %PATH%;%WINDIR%\System32\WindowsPowerShell\v1.0

そこで、上記のように該当部分をコメントアウトすることで、既存のPATHも残るようになりました。

これにより、gnupackと共通で使いそうなものはWindows環境変数側に寄せることができるので、一元管理できて便利。

Robo 3T(旧Robomongo)でmLab(Heroku Add-on)につなぐ

オープンソースのMongoDBクライアントであるRobomongoをたまに使っていたのですが、いつの間にか高機能なMongoDB IDEのStudio 3T(旧MongoChef)の会社に買収されて、Robo 3Tという名前になっていました。

Robomongo is now Robo 3T, with MongoDB 3.4 support

というわけで、MongoDBのHerokuアドオンであるmLabにRobo 3Tでつないだ際のメモです。

確認環境

項目 バージョン等
OS Mac OS X 10.11.6
Robo 3T 1.1.1

mLabへの接続情報の確認

mLabへの接続情報は、環境変数 MONGODB_URI にあります。

プロジェクトフォルダにて以下のコマンドを叩くか、Heroku Dashboardから該当アプリのConfig Variablesから確認します。

$ heroku config:get MONGODB_URI -a <app name>

すると、以下の様な形式の文字列が取得できます。

mongodb://<user>:<password>@<host>:<port>/<database>

mLabへつなぐ

Robo 3Tを起動すると出て来るダイアログで「Create」を選択する。

f:id:umi-uyura:20171019235344p:plain

Connectionタブの以下の項目に、接続情報から以下のものを転記する。

  • Address: <host> : <port>

f:id:umi-uyura:20171019235405p:plain

Authenticationタブの以下の項目に、接続情報から以下のものを転記する。

  • Perform authenticationにチェックを入れる
  • Database: <database>
  • User Name: <user>
  • Password: <password>

f:id:umi-uyura:20171019235420p:plain

「Test」ボタンを押して、接続確認。

f:id:umi-uyura:20171019235437p:plain

「Connect」を押して接続。

f:id:umi-uyura:20171019235453p:plain

おわり

Robo 3Tもマルチプラットフォームで展開されているので、WindowsLinuxでも使えます。

DBeaverでHeroku Postgresにつなぐ

久々にHerokuを触ることになり、DBもHeroku Postgresなので、Windowsで使えるPostgreSQLGUIクライアントがないかと探していたところ、良さそうなものを発見。

DBeaver

PostgreSQL専用というわけではなく、MySQLSQLiteなどいろいろなデータベースをサポートしている上に、実はマルチプラットフォームで展開しているものでした。

で、いざHeroku Postgresにつなごうとしたところで、単純にDatabase Credentialsをコピペしただけでは繋がらなかったので、接続方法をメモ。

確認環境

項目 バージョン等
OS Windows 10 Pro
DBeaver 4.2.0

Heroku Postgresへの接続情報の確認

Heroku Postgresへの接続情報は、環境変数 HEROKU_POSTGRESQL_COLOR_URL (※ COLOR 部分はいろいろと変わる)にあります。

プロジェクトフォルダにて以下のコマンドを叩くか、Heroku Dashboardから該当アプリのConfig Variablesから確認します。

$ heroku config:get HEROKU_POSTGRESQL_COLOR_URL -a <app name>

すると、以下の様な形式の文字列が取得できます。

postgres://<user>:<password>@<host>:<port>/<database>

Heroku Postgresへつなぐ

左側に表示されるDatabase Navigator内で右クリックして「Create new connection type」、もしくはメニュー「Database」→「New Connection」を選ぶ。

f:id:umi-uyura:20171018235534p:plain

Select new connection type内で「PostgreSQL」を選択する。

f:id:umi-uyura:20171018235547p:plain

Generalタブ内で、先に調べた接続情報から以下のものを転記する。

  • host
  • port ※たぶんPostgreSQLのデフォルトポート 5432 が設定済
  • database
  • user
  • password

f:id:umi-uyura:20171018235600p:plain

Driver propertiesタブ内で「sslmode」に require と入力する。

f:id:umi-uyura:20171018235613p:plain

「Test Connection」で問題がなければ、あとは「Next」「Next」「Finish」でOK。

f:id:umi-uyura:20171018235625p:plain

Driver propertiesの「sslmode」の設定をしていないと、接続時にエラーになります。

ということが、Herokuドキュメントに書かれていました。

Connecting to Heroku Postgres Databases from Outside of Heroku | Heroku Dev Center

おわり

MacではPSequelをメインで使っていましたが、わりとDBeaverの使い勝手が良かったので、個人Macにも導入することにしました。

gnupackのCygwinを指定したディレクトリで開く

先日、 chereエクスプローラからCygwinを開く設定を付けましたが、Emacsで作業中にカレントディレクトリをCygwinで開きたい場合があり、その方法を調べてみました。

やり方

  1. クリップボードに、Cygwinを開きたい Windowsのパス を格納する。
  2. startup_cygwin.exeを実行する
$ cygpath -w "$(pwd)" | tr -d '\n' > /dev/clipboard && /root/startup_cygwin.exe 

Windowsclip コマンドでも良かったのですが、文字化けすることがあったので変更。

間に tr を入れているのは、 cygpath の出力結果に含まれる最後の改行があると、移動がおこなわれなかったためです。

この設定に気づいたきっかけ

gnupackの設定ファイルを眺めていたときに、Chdir_With_Clipboard という項目を発見。

もしかして、クリップボード上のパスへのディレクトリ移動フラグ?と気付いたのがきっかけで、それならこんなことできるかも?と試してみました。

/root/startup_config.ini

 [startup_cygwin.exe]
    Cmdline_Image        = "%term.exe%" -e "%bash.exe%"
    Application_Id       = Mintty
    Init_Current_Dir     = %HOME%
    Chdir_With_Clipboard = yes
    Synchronous_Run      = no
    Load_Private_Font    = yes
    Tune_Cygwin_Mount    = yes
    Tune_Cygwin_Profile  = yes
    Convert_Cygwin_Path  = yes

Emacsから呼び出す

Lispはよくわからないので、シェルスクリプト経由で開くことにしました。

こんな感じのスクリプトをPATHが通った場所に設置。

Open current directory in Cygwin

それをEmacsから呼び出す関数を用意して、適当なキーバインドを割り当て呼び出しています。

https://github.com/umi-uyura/dot.emacs.d-gnupack/blob/master/lisp/win-open-folder.el

(defun open-cygwin()
  "cyghere CURRENT-DIRECTORY"
  (interactive)
  (process-query-on-exit-flag (start-process-shell-command "open folder in Cygwin" nil "cyghere")))

参考

エクスプローラのコンテキストメニューからCygwinを起動する

エクスプローラで作業しているときに、あるフォルダをカレントディレクトリにしたCygwinプロンプトを開きたいときがあります。

Cygwinに含まれる chere というコマンドを使うことで、エクスプローラコンテキストメニューCygwinを追加することができました。

chereをインストール

setup.exeか、gnupackには標準で含まれている apt-cyg コマンドなどを使い、 chere コマンドをインストールします。

$ apt-cyg install chere

コンテキストメニューに追加

Cygwinプロンプトのショートカットを右クリックし、「管理者として実行」します。

起動したCygwinプロンプト内で、以下のように chere を実行します。

$ chere -i -cm1 -s bash -t mintty -e "Cygwin Here(&W)"
  • -1 を付けないと、.bashrcが読み込まれませんでした
  • -e の後ろは、コンテキストメニューに表示される文言です
  • デフォルトではアンインストーラを導入してくれますが、うまく動かなかったので、-m で不要にしました

コンテキストメニューの削除

アンインストーラは使えませんでしたが、

$ chere -u

コンテキストメニューが削除されます。

注意点

gnupackの場合、本来は startup_cygwin.exe で起動しているが、それを使っていないので、一部gnupackでカバーしている機能が使えないっぽいです。

参考

Cygwinの$PS1で関数を使うと構文エラーが発生した

個人Mac環境では、Bashプロンプトの表示をカスタマイズしています。

※これ自体はどなたかの設定をほぼ丸パクリさせていただいたものですが、入手元を失念してしまいました

dotfiles/bash_prompt

で、同じものをgnupackのCygwinでも使おうとしたところ、何やらエラーが発生。

command substitution: 行 1: 予期しないトークン `)' 周辺に構文エラーがあります
command substitution: 行 1: `prompt_git)'

f:id:umi-uyura:20170824234735p:plain

どうやらカレントディレクトリのGitステータスをプロンプトに表示する関数でエラーが発生しているもよう。

調べていると、同じ現象に対処された方を発見。

この記事を参考に、「 $''エスケープシーケンスを評価する」の方法を使い、

PS1+="\n" # Newline

となっていた箇所を

PS1+=$'\n' # Newline

に変更したところ、動くようになりました。

変更後のgnupack用の設定は以下のような感じ。

dotfiles-gnupack/bash_prompt

新しいLinuxの教科書

新しいLinuxの教科書