戦えプログラマン

いつだって戦いなのだ

Git Bash が node_modules を見つけられない問題

前提

  • node は coreybutler/nvm-windows でインストールした
  • npm install -g npx 済である
  • Git Bashnpx -v してみるとエラーが出る
  • Win標準のコマンドプロンプトではエラーが出ない

もちろんWin標準のコマンドプロンプトは使いたくないものとする。

発生したエラー

$ node -v
v10.7.0

$ npx -v
internal/modules/cjs/loader.js:583
    throw err;
    ^

Error: Cannot find module 'C:\Program Files\Git\node_modules\npx\index.js'
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:581:15)
    at Function.Module._load (internal/modules/cjs/loader.js:507:25)
    at Function.Module.runMain (internal/modules/cjs/loader.js:742:12)
    at startup (internal/bootstrap/node.js:266:19)
    at bootstrapNodeJSCore (internal/bootstrap/node.js:596:3)

対処

ないと言われている C:\Program Files\Git\node_modulesシンボリックリンクを張ってやる

  1. 管理者権限でコマンドプロンプトを起動する
  2. node のインストール場所を確認
  3. mklink
C:\Windows\system32>where node
X:\dev\nvm-suites\nodejs\node.exe

C:\Windows\system32>cd C:\Program Files\Git

C:\Program Files\Git>mklink /D node_modules X:\dev\nvm-suites\nodejs\node_modules
node_modules <<===>> X:\dev\nvm-suites\nodejs\node_modules のシンボリック リンクが作成されました

確認

$ npx -v
10.2.0

参考記事

https://github.com/yeoman/generator-webapp/issues/530#issuecomment-245902756

根本解決になってなくやや気持ち悪い。
なぜ C:\Program Files\Git\node_modules を最初に探しにいってしまうのか不明だが、
nvm でバージョン変えても動作しそうだし(シンボリックリンク先もnvmが作るシンボリックリンクなので)
まぁ動けば不満ないし、
これでいいやという気持ち。

dotenv で UnicodeDecodeError: 'cp932' codec can't decode byte 0x83 in position 13: illegal multibyte sequence

概要

テスト実行したら、dotenvがユニコード周りでエラーを吐く
つい先日まで動いてたはずなんだけど・・・

状況

Pipfile (抜粋)

[scripts]
test = "python -m unittest discover --locals -v -s ./test"

Git Bash

$ pipenv run test
Loading .env environment variables...
Traceback (most recent call last):
  File "c:\python3.6.5\lib\runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "c:\python3.6.5\lib\runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "C:\Python3.6.5\Scripts\pipenv.exe\__main__.py", line 9, in <module>
  File "c:\python3.6.5\lib\site-packages\pipenv\vendor\click\core.py", line 722, in __call__
    return self.main(*args, **kwargs)
  File "c:\python3.6.5\lib\site-packages\pipenv\vendor\click\core.py", line 697, in main
    rv = self.invoke(ctx)
  File "c:\python3.6.5\lib\site-packages\pipenv\vendor\click\core.py", line 1066, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "c:\python3.6.5\lib\site-packages\pipenv\vendor\click\core.py", line 895, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "c:\python3.6.5\lib\site-packages\pipenv\vendor\click\core.py", line 535, in invoke
    return callback(*args, **kwargs)
  File "c:\python3.6.5\lib\site-packages\pipenv\cli.py", line 701, in run
    do_run(command=command, args=args, three=three, python=python, pypi_mirror=pypi_mirror)
  File "c:\python3.6.5\lib\site-packages\pipenv\core.py", line 2245, in do_run
    load_dot_env()
  File "c:\python3.6.5\lib\site-packages\pipenv\core.py", line 145, in load_dot_env
    dotenv.load_dotenv(denv, override=True)
  File "c:\python3.6.5\lib\site-packages\pipenv\vendor\dotenv\main.py", line 257, in load_dotenv
    return DotEnv(f, verbose=verbose).set_as_environment_variables(override=override)
  File "c:\python3.6.5\lib\site-packages\pipenv\vendor\dotenv\main.py", line 94, in set_as_environment_variables
    for k, v in self.dict().items():
  File "c:\python3.6.5\lib\site-packages\pipenv\vendor\dotenv\main.py", line 73, in dict
    values = OrderedDict(self.parse())
  File "c:\python3.6.5\lib\site-packages\pipenv\vendor\dotenv\main.py", line 80, in parse
    for line in f:
UnicodeDecodeError: 'cp932' codec can't decode byte 0x83 in position 13: illegal multibyte sequence

原因

「.env」ファイル内に日本語を書き込んでいたことが原因だった。
各変数に丁寧にコメント書き足したら、それをdotenvが読み込めなくなってしまった、的な。

対処

「.env」ファイルから日本語行を削除。
コメントを書くなら、下記どっちかにする。

  • 「.env.example」ファイルのみにコメントを書く
  • dotenvファイルのコメントは全て英語で書く

Visual Studio Code の syntax highlight を操る

経緯

VSCodeの標準のThemeカラーのみでは物足りないことがあるかと思う

例えば、標準のDark+
とても好きなのだが、FunctionとVariableの色分けがないことが惜しい
そんな時に

settings.jsonに設定値を書き足す

"editor.tokenColorCustomizations": {
    "[Default Dark+]": {
        "textMateRules": [
            {
                "name": "Function, Special Method, Block Level, GitGutter changed",
                "scope": "entity.name.function, meta.function-call, support.function, keyword.other.special-method, meta.block-level, markup.changed.git_gutter",
                "settings": {
                    "fontStyle": "",
                    "foreground": "#CE6700"
                }
            },
        ]
    }
},

Tips

ここにテーマのデフォルト設定値が入ってるため、これを参考にキー名を探すとよい

C:\Users\${ユーザ名}\AppData\Local\Programs\Microsoft VS Code\resources\app\extensions\theme-defaults\themes

感想

自分でテーマ弄り始めると泥沼 & 他の環境でコードを書けない禁断症状に陥るので、用法用量を守っての使用を心掛けたい

JavaScriptの変数の型の調べ方

console.log(variable.constructor)

ChromeデベロッパーツールのConsoleで試してみる。

const hoge = $("div")
console.log(hoge.constructor)
// ƒ HTMLDivElement() { [native code] }

HTMLDivElement型だそうです。

いつ使う

  • JSDocやTypeScriptやFlowtypeに型を書きたい。
  • ライブラリからやってくる、よくわからん変数を調べたい。

そんなときに使う。

IDEA で Create New Project で sbt したら、srcディレクトリがない

しばらくサボってた忙しくて、久々にIDEA触ってみたら、なんかヘン。
f:id:arx0balest:20160815235153p:plain:w600

scala idea」でググって出てくる手順通りにIDEAでScalaプロジェクトを作ると、
なぜかsrcディレクトリが生成されない。

why?

1. SBT launcherの設定を確認。

  1. なんかヘンなプロジェクトを Close Project
  2. SBT launcher を正しく設定してやる。
    f:id:arx0balest:20160816000612p:plain:w600

2. Create New Project時の設定を確認。

  1. いつもの(Create New Project -> Scala -> SBT -> Next)
  2. なんか自動で作ってくれる感ある項目にチェック。
    f:id:arx0balest:20160816001109p:plain:w600
  3. Finish

3. 待つ!!!

特に初めてScalaプロジェクトを作成した時は、準備・生成が完了するまで時間が掛かる。
IDEAのステータスバーが空になるまで待つ。とにかく待つ。

qiita.com

うんまあとにかく待つんだ。
あわてちゃいけない。

で。

無事でけたもよう。
f:id:arx0balest:20160816002513p:plain:w600

∩( ・ω・)∩ ばんじゃーい

Cannot resolve symbol 'index' エラーの解決

(先の「無料でPlay2鯖を立てる」の続き。)

IntelliJ に sbt プロジェクトとしてインポートしてみた。
とりあえず適当にファイルを眺めてると・・・なんかエラーが起きてる。

「app\controllers\HomeController.scala」 で 「Cannot resolve symbol 'index'」

なんでチュートリ通りに作ってエラーが出るんだ・・・などと慌てない慌てない。
とりあえずググると、割と有名なエラーっぽい。

解決方法は諸説あるようだが、
「sbt pluginで、IDEA用プロジェクトとして作り直す」
というのが一番簡単そう。

1. 初期化

既にIntelliJにインポート済みの場合は、設定情報と中間ファイルを削除する。
「もう設定とか色々煮詰めてやり直したくない!」という場合は・・・
ご愁傷様。傷が浅い内に涙をのんでやり直しましょう。

「Close Project」して、プロジェクトルートディレクトリから、下記2ディレクトリを削除する。

  • .idea
  • target

2. 「sbt-idea」プラグインの導入

「project\plugins.sbt」の末尾に、下記を追加。

addSbtPlugin("com.github.mpeltonen" % "sbt-idea" % "1.6.0")

※そーす
GitHub - mpeltonen/sbt-idea: A simple-build-tool (sbt) plugin/processor for creating IntelliJ IDEA project files

3. 「sbt-idea」の実行

プロジェクトルートディレクトリにて、下記コマンドを実行。

sbt gen-idea

流れるCUIを見ながら待つ。ちょー待つ。
終わったら、「.idea」「.idea_modules」「target」ディレクトリが自動生成されてるはず。

4. IntelliJにインポート

あとはいつも通り(?)、sbtプロジェクトとしてインポートするだけ。

エラーを吐いてた「app\controllers\HomeController.scala」を見に行くと・・・
エラーがなくなってるはず。

5. ローカルでもPlayを動かしてみる

IntelliJの「SBT Console」を使う。

  • メニュー -> View -> Tool Windows -> SBT Console をクリック。
  • 「SBT Console」ウィンドウで、左端の緑の再生マークをクリック。
  • 「run」と入力して「Enter」。

またまた待って・・・

f:id:arx0balest:20160803003352p:plain:w400
キタワァ・*゚(n'∀')η゚*。・



ん?OpenShiftに立てた方と画面違くね・・・?(続く?)

無料でPlay2鯖を立てる(OpenShift + Scala + Play Framework)

「『OpenShift』に登録すると、
 タダでScala鯖が立って、
 git pushするだけでデプロイできちゃう!」

とかいう甘言に釣られて、思ったよりのたうち苦しんだので備忘録。
(※主にドキュメントを読まなかったせい)

こんな記事書いといて何だが、OpenShiftは割と公式ドキュメントが充実してるので、
英語がちゃんと読める人は公式読むことをオススメ。
用語とか「OpenShiftとは何ぞや」みたいな話は、
既にたくさん良い記事があるのでググってね!!

さー、IntelliJのインポート・ビルドが終わるのと、この記事書き終わるの、どっちが早いかな。

0. 前提環境

  • 開発環境 : Windows 7IntelliJ IDEA Community Edition (結局無料Win10スルーしちまった・・・)
  • OpenShift操作用コマンド(rhc)のインストール先 : Lubuntu (VMWare)

rhc用にrubyが必要で、ruby + win は相性悪いとよく聞くので、VM上に入れた。
「なんか軽いらしい」と適当に選んだディストリなので、rubyが動けば何でもよし。

1. OpenShift に登録する。

特に珍しいものもなく、ググれば記事出てくるし割愛。

2. Lubuntu に rhc をインストールする。

公式の通り
For Debian/Ubuntu | OpenShift Developers

(メモ)

vm@l-vm:~$ rhc setup
# (中略)
If you have your own OpenShift server, you can specify it now. Just hit enter to use the server for OpenShift Online:
openshift.redhat.com.
# 空Enterでよし
Enter the server hostname: |openshift.redhat.com| 

You can add more servers later using 'rhc server'.

# 登録済みのアカウントでログインする
Login to openshift.redhat.com: user@example.com
Password: ***

# 一定期間ログインしっぱなしにするみたいなやつ。yesなりお好きにしてEnter。
OpenShift can create and store a token on disk which allows to you to access the server without using your password. The key
is stored in your home directory and should be kept secret.  You can delete the key at any time by running 'rhc logout'.
Generate a token now? (yes|no) yes
Generating an authorization token for this client ... lasts about 1 month

Saving configuration to /home/vm/.openshift/express.conf ... done
# (略)

初めての接続だと、「sshキー登録する?」とも聞かれるので、これも「yes」でよい。
後からWebUIで簡単に追加・削除ができるので。 (https://openshift.redhat.com/app/console/settings
(「~/.ssh/」配下に鍵が存在すれば、デフォでそれが使われる。)

3. OpenShift に Play2 をデプロイ。

さあもうデプロイだよ!!

公式によると、雛形のカートリッジ使うのが手っ取り早いっぽい。
Free Play Framework Hosting | OpenShift QuickStart
ver.2.5.0とちょい古いのが残念だけど・・・まぁ2.5台だしいいか。

GitHub - tyrcho/openshift-cartridge-play2: Play2 In OpenShift as a cartridge

# WebUIでなく、コマンドで雛形を作る(結構待つ)
vm@l-vm:~$ rhc app create  playapp  http://cartreflect-claytondev.rhcloud.com/reflect?github=tyrcho/openshift-cartridge-play2&commit=play-2.5.0

# できあがったウェブサイトの確認 (※この時点でウェブサイトにブラウザアクセスすると500エラーで死んでるが気にしない)
vm@l-vm:~$ rhc apps
/var/lib/gems/2.3.0/gems/commander-4.2.1/lib/commander/user_interaction.rb:328: warning: constant ::TimeoutError is deprecated
playapp @ http://playapp-example.rhcloud.com/ (uuid: 000a000b0c000000b0000001)
-----------------------------------------------------------------------------------------
  Domain:     example
  Created:    11:07 PM
  Gears:      1 (defaults to small)
  Git URL:    ssh://000a000b0c000000b0000001@playapp-example.rhcloud.com/~/git/playapp.git/
  SSH:        000a000b0c000000b0000001@playapp-example.rhcloud.com
  Deployment: auto (on git push)

  github-play2-2.5.0 (Play Framework 2.5.0)
  -----------------------------------------
    From:    http://cartreflect-claytondev.rhcloud.com/reflect?github=tyrcho/openshift-cartridge-play2
    Website: https://github.com/tyrcho/openshift-cartridge-play2
    Gears:   1 small

You have access to 1 application.

# 鯖にsshログイン
vm@l-vm:~$ rhc ssh playapp

# 鯖の状態を確認してみる
[playapp-example.rhcloud.com 000a000b0c000000b0000001]\> gear status
Cart to get the status for?
1. play2-2.5.0
?  1
ATTR: quota_blocks=1048576
ATTR: quota_files=80000
CLIENT_RESULT: Application is either stopped or inaccessible

# ビルドして叩き起こす(かなり待つ)
[playapp-example.rhcloud.com 000a000b0c000000b0000001]\> gear build
[playapp-example.rhcloud.com 000a000b0c000000b0000001]\> gear start

# 鯖の状態を確認してみる
[playapp-example.rhcloud.com 000a000b0c000000b0000001]\> gear status
Cart to get the status for?
1. play2-2.5.0
?  1
ATTR: quota_blocks=1048576
ATTR: quota_files=80000
CLIENT_RESULT: Application is running

# ∩(・ω・)∩ばんじゃーい

WebUIで、鯖が起動してることを確認。
https://openshift.redhat.com/app/console/applications
f:id:arx0balest:20160802212644p:plain:w400

サイトのURLにアクセスすると・・・・・・・・・
f:id:arx0balest:20160802212039p:plain:w400
キタワー.:.。.:・゚(n'∀')η゚

4. 開発マシンにcloneする。

もう各所で目にしたが
ssh://000a000b0c000000b0000001@playapp-example.rhcloud.com/~/git/playapp.git/」
リポジトリ
sshなので接続には公開鍵の登録が必要。

公開鍵を登録する方法は、これまた公式を参考に。
Remote Connection (SSH) | OpenShift Developers

作った鍵を「settings」ページの「Add key」で登録。
Sign in to OpenShift Online | OpenShift Online by Red Hat

開発マシンで git clone(SourceTree経由でやったらエライ遅かったので、コマンドでのcloneをオススメする)

git clone ssh://000a000b0c000000b0000001@playapp-example.rhcloud.com/~/git/playapp.git/

host@Win-PC MINGW64 /d/Project/IdeaProjects/playapp (master)
$ git log --oneline
53f9610 Creating template

そんでローカルにできあがったリポジトリを、IntelliJにインポート(すごく待つ)

んで

これでようやく・・・ようやくスタートラインに・・・
立ててないんだよなぁ・・・

次はDBの作成・登録。(また後日)