読者です 読者をやめる 読者になる 読者になる

JavaScript, Node.js を始める

JavaScript

JavaScript 熱の高まりというか、やっぱり使えたらいろいろ便利そうだな*1と思い、昨年末あたりから少しずつ調べたりまとめたりしていたので、こちらにも書いておこう。

Node.js をインストール

公式サイトからインストールしてもいいけれど、入れ直したりバージョンを上げたりをやりやすくするためツール経由で入れるほうがよさそうなので nodebrew を使う。

curl でインストール。

$ curl -L git.io/nodebrew | perl - setup

PATH を通しておく。

$ export PATH=$HOME/.nodebrew/current/bin:$PATH

nodebrew 使い方

バイナリを入れるやり方でいいと思う。

# すでにインストールしていた場合
$ nodebrew selfupdate

# インストール可能なバージョンを列挙する
$ nodebrew ls-remote

# バイナリを入れる場合
$ nodebrew install-binary <version>
# ソースからコンパイルする場合
$ nodebrew install <version>

とりあえず stable を指定したら v7.2.1 が入った。

# <version> の代わりに stable や latest という指定が可能
$ nodebrew install-binary stable

# インストール済のバージョンを表示
$ nodebrew ls

# 使用するバージョンを指定
$ nodebrew use stable

# アンインストールする場合
$ nodebrew uninstall <version>

パッケージマネージャ npm について

Node.js をインストールすると npm コマンドが使えるようになる。パッケージマネージャと書いたけれど、備えている機能はもう少し幅広いようだ。

Node.js で開発する、プロジェクトを作るには以下のコマンドから始める。

$ npm init

プロジェクト名とか作者名とかいろいろ質問されるのでそれに答えていくとそれらの情報を含んだ package.json が作成される。

npm init の際にオプション --yes をつけると全てデフォルトで進めてくれる。

package.json にはインストールしたパッケージの情報を記載しておけば、そのプロダクトを別な環境でインストールする際に npm install とするだけで依存するパッケージをインストールしてくれる。

link

npm でパッケージをインストール

npm install <package_name> でインストールする。

オプション --save or --save-dev をつけるとインストールと同時に package.json にも記載される。

--save は実行時に必要なパッケージとして "dependencies:" に記載される。

--save-dev は開発時に必要なパッケージとして "devDependencies:" に記載される。

$ npm install <package_name> --save
$ npm install <package_name> --save-dev

オプション

  • npm inpm install と等価
  • -D--save-dev と等価
  • -S--save と等価
  • -g--global と等価

以下のようにも書ける

$ npm i -D <package_name>

link

インストールしたパッケージを確認する

# ローカルのパッケージを確認
$ npm list # or ls
# グローバルのパッケージを確認
$ npm list --global # or -g

ただ、上記のコマンドだと大量のパッケージが表示されるので以下のようにオプションを指定するのがよい。

$ npm list --depth=0

パッケージのインストール先

ローカルにインストールするとプロジェクトディレクトリ内の node_modules/ に入る。

グローバルにインストールすると <prefix>/lib/node_modules/ に入る。 <prefix> を確認するコマンドは以下の通り。

$ npm config get prefix

ローカルにインストールしたパッケージを使うために PATH を通す。

$ export PATH=$(npm bin):$PATH

その他

インストールしたパッケージのアップデート

この記事が参考になりそう。まだ必要に迫られていないので試したりしていない。

インストールするパッケージのバージョンを指定

package.json にはそのパッケージのバージョン番号も指定される。書式については以下の記事が参考になる。

ローカルのパッケージを Git の管理対象から除外

.gitignorenode_modules/ と書いておこう。

*1:GoogleAppsScript とか Electron とかを用いて生活および仕事のタスクを処理する便利な何かを作れるのではないか的な

fish を導入

fish shell

(last update: 2017/02/21)

少し気になっていたモダンなシェル fish 、実家の兄も使っていていろいろ見せてもらったらやっぱり便利そうだったので導入してみた。

MacPorts でインストール。Homebrew 派の人は $ brew install fish で。

$ sudo port install fish
$ fish_config # ブラウザで設定画面が開く

fish をデフォルトのシェルに設定する。まず fish がインストールされているパスを確認して、 /etc/shells を編集する。その上で、 chsh コマンドで切り替えれば OK

$ which fish # -> /opt/local/bin/fish
$ sudo emacs /etc/shells # 上記 fish のパスを追加
$ chsh -s /opt/local/bin/fish

プラグインのインストール

oh-my-fish のメンテナの方が作っているというプラグインマネージャ fisherman をインストール

$ curl -Lo ~/.config/fish/functions/fisher.fish --create-dirs git.io/fisherman

peco 関連のプラグインをインストール。 peco 自体は以前に go get でインストールしていた。

$ fisher omf/plugin-peco
$ fisher yoshiori/fish-peco_select_ghq_repository

fish-peco_select_ghq_repositoryghq で管理しているレポジトリを peco で検索して cd する拡張。 C-r でのヒストリ検索に peco を使うように、ghq のやつは C-o にそれぞれ設定しておく。

function fish_user_key_bindings
  bind \cr peco_select_history
  bind \co peco_select_ghq_repository
end

参考

fish-mode をインストール

Emacs で fish スクリプト(設定)を編集するための fish-mode をインストールする。 ~/.emacs.d/Cask(depends-on "fish-mode") を追加して以下のように実行すれば OK.

$ cd ~/.emacs.d/
$ cask install

設定ファイルは zshbash とはことなり .fishrc ではなく ~/.config/fish/config.fish となる。

PATH の設定

.zshrc とは構文が異なる。以下のような感じ。

# PATH
set -x PATH /opt/local/bin /opt/local/sbin $PATH
set -x PATH $HOME/bin $HOME/.cask/bin $HOME/py35/bin $PATH

# Go
set -x GOROOT (go env GOROOT)
set -x GOPATH $HOME/go
set -x PATH $GOPATH/bin $GOROOT/bin $PATH

# nodebrew
set -x PATH $HOME/.nodebrew/current/bin $PATH

alias の設定など

alias は zsh と同じ書式でもいけるという話もあったかもしれない。

# alias
alias rm "rm -i"
alias cp "cp -i"
alias mv "mv -i"
alias mkdir "mkdir -p"

alias find "gfind"
alias xargs "gxargs"

# alias for git
alias gst "git status"
alias gdif "git diff"
alias gdifc "git diff --cached"

# alias for Mac
alias ql "qlmanage -p $argv[1]"

# user defined functions
function cd
  builtin cd $argv
  ls -a
end

function fish_user_key_bindings
  bind \cr peco_select_history
end

補完候補の拡充

以下のコマンドで man などから補完候補を追加してくれるそうな。頼もしい話である。

$ fish_update_completions

現時点の config.fish

Good Bye, 2016

log

年末年始ということで実家に帰省している。毎年同じことを書いていると思うが、 2016 年もあっという間に過ぎていったように感じている。

学生時代に家庭教師のアルバイトで関わった生徒さんから年賀状をもらって嬉しかったのが 2016 年の 1 月で、そこからいろいろやっていたらもう 12 月。はー、速い。 結局その生徒さんには年賀状は返信して「今度食事でも」と伝えたのだけれど、結局連絡先がわからなくて連絡しないままになっていた。 12 月に入ってから手紙を書いたけれど、「もう知らね」と言われてもまぁ仕方ない。もうちょっと早めにアクションすべきだったな。

速い?早い?

関係ないけれど「時間が経つのがはやい」というときに「早い」か「速い」のどちらなのか、いつも迷う。時間が過ぎていくスピードのことを言うのだから「速い」ではないかと思っていたが、必ずしもそう考える人だけではないようだ。

この説明で納得しかけたけれども、時間の進むスピードが変化したわけではないということは十分承知の上で、「はやい、と感じる」ということを言っているのでやはり「速い」で間違ってはいないような気もする。

振り返り

  • 昨年から取り組み始めたとあることは細々と続けられている。まだ実を結んではいないが、いずれよい結果に繋げられると思う。
  • 軽い運動(腕立て伏せとスクワットなど)をする習慣もだいぶ定着してきた。

  • 英語の勉強はあまり進んでいなかった。最後に受けた TOEIC で 820 点くらい取れて嬉しかったのだけれど、確認したら 2014 年の話だった。寝る前に DUO 3.0 を開いて例文をシャドウイングすることを毎日の習慣にしたい。

  • 数学の勉強(確率、微分積分線形代数など)はあまり進められなかった。

  • Python はあまり書かなかったのでだいぶ忘れてしまった。

  • 夏頃に支出管理シートを作るため GoogleAppsScript (JavaScript) を(自分にしては)たくさん書いた。 TypeScript を使ってみたいと思いつつ環境構築の段階で躓いている。
  • Go を使ってみようと思ったのはいつからだったっけ。夏の前くらいかな?「スターティング Go 言語」を枕元に置いてちょいちょい読んだり、 A Tour of GoGo by Example を写経してみたりしたけれど、ちゃんと書くことなく時間が過ぎていった。 12 月下旬に仕事で使えそうなツールを思いつき、 Go で書いてみた。 100 行くらい。今後はもっと使えるようになりたい。

  • blog を全然書かなくなった。 Markdown で書けるようにとはてなダイアリーからはてなブログへ移行したのだけれど、あまり書かないままだった。

  • これからはもっと気軽に駄文を書き散らかしていきたい。何か書いていないと、文章を書く力が落ちると実感し始めた。他の人はどうか知らないが、少なくとも自分に限ってはそのように感じている。

そういや、 Markdown で改行のために行末にスペースを 2 つ入れる仕様って結構一般的な話なの?兄と話していて聞いたんだけど全然知らなかった。 Emacs で保存時に行末のスペースを削除する設定にしているので、全然使えないというか、相容れない感じがする。

;; 保存時に行末のスペースを削除
(add-hook 'before-save-hook 'delete-trailing-whitespace)

スターティングGo言語

スターティングGo言語

161128 近況

log

本当にあっという間に 1 日が終わり、1 週間が過ぎて、気づけばもう 11 月末。いやー、速いね。

2016 年のうちにもう少し進歩しているつもりだったような気がするのだけれども、何を言ってもカレンダーは後ろには戻らないので今日から残り 1 ヶ月ちょっとをしっかり過ごしていきたい。

食生活の乱れ

寒くなってくると食事の選択に影響が出る。朝起きた直後に冷蔵庫から出したばかりの冷たいヨーグルトをガツガツ食べる気になるかと言われるとならないし、フルーツグラノーラとかミューズリーとかのシリアル系も同じく冷蔵庫から出したばかりの冷たい豆乳とか牛乳とかをかけることになり、それらを食べられるときと食べるきになれないときがある。

まぁ、パンとかを常備しておいてトーストするなりして温かいものとセットにすればいいのかもしれないけれど。

Golang

結局全然書いていない。会社で使っている Python の小さなスクリプトなどを置き換えていくところからやっていこうかなと思っていたはずなのだけれど、着手できていない。その置き換えはこのままやらない気もする。

ただ Go 自体への興味関心は相変わらずあるので、少しずつ勉強を進めていくと思う。10 月くらいには Go by Example を写経したりしていたのでまたその辺からやっていこうかな。自分で書かないとすぐ忘れる。

支出管理シート

Google Apps Script で書いているやつ。もう少し入力の手間を減らす仕組みを作りたい。カード払いの明細 CSV データを貼り付けて既存の入力データとの差分というか、入力漏れを教えてくれるようなものがあったらいいなと漠然と考えているところ。

アマチュアだからこそ、素の JavaScript を書くのではなく TypeScript とか静的型付けの言語を使ったほうがよりよいものを作れるようになるのではないだろうかということを最近考えたりする。Go に興味を持ち始めたのもそういう動機が根底にあったのかもしれない。

GAS を TypeScript で開発するやり方もあるようなのだけれど、如何せん色々と環境を整える必要がありそうで少々敷居が高いと感じており、まだ踏み出せないでいる。というか時間を捻出できていない。

結局、何をするにしても必要なのは時間と集中力と体力なんだよな。

バール

先日の福島沖あたりでの地震はけっこう長い時間揺れていたので少し怖かった。 地震が起きて、ドアがぶっ壊れて外に出られなくなるかもしれないので、バールを買った。軍手よりも丈夫らしいので革手袋も。

バクマ 六角鶴首バール 19×900mm

バクマ 六角鶴首バール 19×900mm

concurrent and parallel

memo

すぐ忘れるのでメモ

concurrent 並行

複数の動作が順不同もしくは同時に動作する

concurrent の意味 - 英和辞典 Weblio 辞書

parallel 並列

複数の動作が物理的な時間として同時に動く 物理的に複数のコアなどが必要

parallel の意味 - 英和辞典 Weblio 辞書

see also

支出管理シート カードの引落予定を自動入力

支出管理シート

カードでの支出を expences シートに入力すると、次回ブックを開いたとき(もしくはリロードしたとき)に creditcard シートに自動で集計結果が入力される。

https://gyazo.com/d88e352cac05880ce1d6ba54bdd87962


これを transactions シートにも転記されるようにした。こちらも反映されるのは次回ブックを開いたとき(もしくはリロードしたとき)。

https://gyazo.com/b64eb6eea5910673f5a10b61917a95ad


少しずつ手間がかからないようになってきた。楽しい。

収支管理シートを作っていて JavaScript 書いた

log 支出管理シート GoogleAppsScript
  • Google Spreadsheet で作っている収支状況管理シートが一応形になった。
  • 8 月上旬に実家に帰省していた際に 2 日ほど集中して作業して、その後しばらく放置状態となっていたが、先週半ばから少しずつ取り組んでいた。
  • クレジットカードの支出を集計して表示するあたりが一つの山で、金曜の夜から昨日の夜までほぼずっと取り組んでようやくできた。
  • 収支管理シートは 2 年ほど前にも作って実家と自分とでそれぞれ運用していたが、手入力で同じ情報を複数箇所に記入する必要があったり、少々手間がかかるものだった。
  • というのも、できるだけスプレッドシートの標準の関数を使って処理しようとしていたので、どうも「無理やり感」があるというか、スプレッドシートをいじくるのが好きで得意な人向けのものになってしまっていた気がする。
  • そして僕も母も色々他にもやることあるし収支管理シートのことだけに専念できるわけではないので、キッチリ運用というのが難しくなってきていた。
  • また、 MVC じゃないけれど元データとビューの分離というか、データベース的発想が自分の中に少し定着してきたのもある。
  • 会社で Excel を触っていても思うのだが、最終的に見たい結果(表など)を直接作りこむのではなく、データはデータとして表の形で持っておいて、そのデータを読み込む形で(関数なりマクロなりを用いて)見たい結果を生成する、というやり方の方がメンテナンス性および拡張性が優れていることが多い。
  • なので、できるだけ手動で入力する箇所を最小限にして、それでいて見たい結果を手軽にみることができるように、という考えのもと、作りなおした次第。
  • Google Spreadsheet は JavaScript で処理を記述できるので色々調べながら自動化したい機能を書いていった。
  • 実家で書いたのが大体 300 行くらいで、今現在はトータル約 800 行くらい。 JavaScript をこんなに書いたのは初めての経験。
  • 実家では Google Apps Script のオンラインエディタで書いていて、途中で Ctrl-/ で語句補完が効くことを知ってこれは便利と思っていたが、こちらに戻ってから Visual Studio Code を使って書くようにしたら JS についてはかなり親切に補完が効くし関数の定義箇所、参照箇所へのジャンプもできるしで、効率が 2 倍くらいになった気がする。
  • 実家でも VS Code を使っていればよかったと思うくらい。

トリックアート

log

先日母が言っていたものと同じ絵かもしれない。すごい技術だな。

160723 土曜 疲れ

log
  • 身体が重く、活動する気になれなかった。
  • 先週はちょっと無理しすぎたかもしれない。
  • ゆっくり寝よう。

160715 金曜 シンガポールへ

log
  • 木曜の夜の便でシンガポールへ。
  • 昨年 10 月末以来、 2 回目。
  • 空港内のレストランはやや高い上に、混んでいるか、居酒屋的か、がっつり系(すき焼き等)か、という感じで一人でサクッと食事するという目的に合致しそうなお店があまりない。
  • 3F の奥にある Pronto でパスタとジュースで済ませる。
  • 空港で購入したものとしては機内用のスリッパとマスク。
  • 出発ゲートそばのベンチでは、背中合わせに設置されている 2 台のベンチの間にポールが立っていて、そこに USB の給電ポートがついていた。
  • これは助かるね。こういうのは誰が発案しているのだろう。海外の空港の事例などを参考にしているのだろうか。
  • 機内では寝たり起きたりで、あまりまとまった睡眠は取れなかった。
  • 窓側の席だったのでできるだけトイレに立つことがないよう、水分の摂取には気をつけた。
    • 何か飲むとすぐにトイレに行きたくなるので。
  • 途中で同じ並びの人が二人とも席を立ったタイミングで自分も一回トイレに行っておいた。
  • 東京からシンガポールの所要時間はだいたい 6 時間くらい。
  • まぁ寝たり起きたりしているうちに着いたので、そこまで大変ではなかった。