みかづきメモ

学習したことのメモとか、日記とか、備忘録。

Perl の false を追いかける

Perl 触ってて例えば、下のようなコードがあって、 $r には何が入っているのかという問題。

sub is_even {
  $_[0] % 2 == 0;
}

my $r = is_even(1); # false

print $r としても何も表示されないので ''だと思っていたのだけれども、違っていた。
例えば以下のコードはすべて true として評価されるし、警告も出ない。

use feature qw/say/;
use strict;
use warnings;

my $r = 1 > 5; # false

if ($r eq '') {
  say 'empty string';
}

if ($r == 0) {
  say 'zero';
}

# こっちは警告だされる
# my $empty = '';
# say 'true 0' if $empty == 0;

調べてみると、 $r に入っている値は '' でもあるし、 0 でもある 特殊な値とのこと。
(Special False Value だとか、 Special Perl False Value だとか言われているみたい)。
文字列が欲しい場所では '' が返ってくるし、数値が欲しい場合は 0 がやってくる。 で、文字列と比較されようが、数値と比較されようが、警告が出ることもない。

どんな状態で Perl で保持されているかは、 XS 向けのデバッグライブラリで確認できる。

use Devel::Peek;

my $number  = 0;
my $double  = 0.0;
my $string  = '';
my $boolean = !!0;

# SV = Integer, NV = Double, PV = String
Dump(\$number);  # SV = 0
Dump(\$double);  # NV = 0
Dump(\$string);  # PV = ""\0
Dump(\$boolean); # SV = 0, NV = 0, PV = ""\0

ちなみに、この値が欲しければ !1 なり !!0 なりすれば得られる。

参考 :

Windows のコマンドプロンプトで D ドライブに移動したい

cd D: だとか cd /D: だとかで移動できるのかと思ったけど無理で、 D: と打てば移動できた

内容がない

Webpacker のプロダクション環境での assets:precompile でこける

Rails 5.1 以上、 Webpacker を導入した環境で、プロダクションビルドした際、 assets:precompile で結果が何も帰ってこなくなりました。

こんな感じ:

01:00 deploy:assets:precompile
    01 $HOME/.rbenv/bin/rbenv exec bundle exec rake assets:precompile
    01 Webpacker is installed 🎉 🍰
    01 Using /home/mikazuki/cancer/releases/20180114021630/config/webpacker.yml file for setting up webpack paths
    01 Compiling...

この状態でずーーーと止まってる感じ。
調べてみると、コンパイル中にメモリが足りなくなって死んでるとのこと。

ということで、 Webpacker が使えるメモリ容量を増やすことで解決しました。

@@ bin/webpack
-cmd = [ "#{NODE_MODULES_PATH}/.bin/webpack", "--config", WEBPACK_CONFIG ] + ARGV
+cmd = [ "node", "--max_old_space_size=4096", "#{NODE_MODULES_PATH}/.bin/webpack", "--config", WEBPACK_CONFIG ] + ARGV

( bin/webpack をいじって解決させたけど、これでいいのかは知らない)

参考:

vetur のフォーマッターのオプションを変えたい

どうせ次のプロジェクト始める際に忘れているだろうから、メモ。

VS Code で、 vetur 使うとき、フォーマッターの設定を変えたくなった。
(1行あたり80文字ではなく、120文字にしたかった)
そのときの方法。

  1. プロジェクトルートに .prettierrc を作る。
  2. printWidth: 120 と書く。

以上

Windows + Docker で、あるハズのファイルに No such file or directory を言われる

Windows + Docker で、 Docker イメージを作っているとき、
COPY で突っ込んだシェルスクリプトが、呼べないことがあった。
原因は改行コードで、 CRLF を LF にした上で送信すると、正常に実行された。

参考: