7cc@はてなブログ

JavaScriptとかとか

.npmrcの設定はハイフン(-)かドット(.)か

デフォルトはハイフンです。なのになぜかドットでも npm init したときにはきちんと参照されます。
そのためかドットを使った .npmrc の紹介記事が散見されます。

<追記>
npm 公式でも ハイフンとドットが混在していました。統一したほうが良いのでは…?

</追記>

$ # npm config set init-license MIT ホントはこっち
$ npm config set init.license MIT
# .npmrc
# init-license=MIT
init.license=MIT

ハイフン・ドット両方ある場合には後のものが優先されます。

ドットを使った場合の問題点

npm init 以外では両者は別のものとして扱われます。
以下はドットのみ設定した場合です。

ターミナルからは npm config get で設定を確認できます。

$ npm config get init.license
MIT

$ npm config get init-license
ISC

ハイフンを使った init-license の方はデフォルトの設定が参照されていることが分かります。


また、.npmrc の設定はスクリプトから読み込むこともできますが、 こちらもドットがハイフンに変換されずにそのままになります。

.npmrc の読み込み方は

  • ~/.npm-init.js からは config.sources
  • 他のスクリプトからは require("npm").load((err, npm)=> console.log(npm.config.sources))

で出力結果はこのようになります。

config.sources =
  ...
  user: {
    ...
    data: {
      'init.license': 'MIT',    // ドットで設定したよ
      'init-version': '0.0.1',  // ハイフンで設定したよ
      color: 'always',
      ...
    }
  }

そのためユーザー設定を読み取る際にはドットとハイフン両方対応する必要があります。

実際に問題になるケースは限られると思いますが、 わざわざドットを使う理由がないのでハイフンを使いましょう。

Windowのコマンドラインでドライブ変更 (Git shell)

普通のコマンドプロンプトと、Git Shellとで書式が異なる。pushd c:/ なら両対応。

普通のコマンドライン

cd /d C:
pushd C:
c:

パスの最後に / or \ を入れても良い。

最後のドライブ名:のコマンドは他とは違う意味を持つ。完全にドライブ切り替えだけを行い、それぞれのドライブでパスを保存する。対して、他はカレントディレクトリを移動する。説明では分かりにくいが、試せばすぐに分かる。

Git Shell

最後に / or \ を必ず入れる。"C:"のみだと、違う場所に移動することがある。

cdにオプション/dは入れられない。

cd C:/
pushd C:/

ニコニコ動画で、ユーザーIDからニックネーム(ユーザーネーム)を取得する

ポイント

  • 公式のAPIが無い&公開されてはいないので、「マイページを直接叩くよりはマシ」という程度の認識で使う。
  • 確実に取得する方法はないので、ユーザーネーム取得に失敗した時のためにダミーテキストを用意してやると良い。 戻り値が空文字やnullでエラーにならないように。
  • メソッドは全てGET, パラメータはIDのみなので省略。
続きを読む

多次元配列の再帰の記述

追記: 2018年現在は一度flattenしてから処理するのが良いと思います。

記述の方法が、for-loopで書くと1通りだが、イテレートメソッドだと2通りある。
どちらでもよいのだけれど、混ざるので整理。

for-loopとイテレートは完全に同じではないが、その点は割愛します。

例えば以下のような配列をすべて処理したい場合

var array = [1, 2 , [3, [4], 5], 6]
var fn = console.log.bind(console)

for-loopでの再帰。(コード1

function forLoop(array, fn) {
  for (var i=0; i<array.length; i++) {
    Array.isArray(array[i]) ? forLoop(array[i], fn) : fn(array[i])
  }
}

イテレートでの再帰コード2
普通再帰はその関数自体を呼び出すので、その例に倣うとこちらの書き方になる。for-loopと同じ構造。

function eachOuter(array, fn) {
  array.forEach(function(e) {
    Array.isArray(e)? eachOuter(e, fn) : fn(e)
  })
}

しかし、イテレートの再帰はこうも書ける(コード3

function eachInner(array, fn) {
  array.forEach(function internal(e) {
    Array.isArray(e)? e.forEach(internal) : fn(e)
  })
}

配列を直接イテレートするならコード3の書き方になる。(コード4

// fnは外部で宣言してもよいし、直接書いてもよい
array.forEach(function internal(e) {
  Array.isArray(e)? e.forEach(internal) : fn(e)
})

こうしてみると、どちらをベースにするかで書き方が変わるようだ。

  • コード1をベース => コード2
  • コード4をベース => コード3