脳汁portal

アメリカ在住(だった)新米エンジニアがその日学んだIT知識を書き綴るブログ

Rubyの後置ifで変数宣言して代入しても処理では使えない

なんか勘違いしてた
後置ifでなんらかの処理の結果がかえってきたら(nilじゃなかったら)さらにその返り値に対して処理をしたいとき、
後置ifで代入してそのまま処理すれば1行でいけると思いきやいけなかった

1. 後置ifの結果がfalseの場合は処理が呼ばれないのでOK(warningは出るけど)

> puts foo
Traceback (most recent call last):
        2: from /usr/local/bin/irb:11:in '<main>'
        1: from (irb):1
NameError (undefined local variable or method 'foo' for main:Object)

> puts foo if foo = nil
(irb):2: warning: found = in conditional, should be ==
=> nil

2. 後置ifの結果がtrueになる場合はダメ

> puts bar
Traceback (most recent call last):
        2: from /usr/local/bin/irb:11:in '<main>'
        1: from (irb):1
NameError (undefined local variable or method 'bar' for main:Object)

> puts bar if bar = 'hogehoge'
(irb):2: warning: found = in conditional, should be ==
Traceback (most recent call last):
        2: from /usr/local/bin/irb:11:in '<main>'
        1: from (irb):2
NameError (undefined local variable or method 'bar' for main:Object)

後置ifで先に判定してるからいけるかと思ったんだけど、式判定的には左から判定されるのでUndefinedエラーになってしまう

後置ifを使わなければいける

> puts foobar
Traceback (most recent call last):
        2: from /usr/local/bin/irb:11:in '<main>'
        1: from (irb):1
NameError (undefined local variable or method 'foobar' for main:Object)

> if foobar = 'hogehoge'
>   puts foobar
> end
(irb):2: warning: found = in conditional, should be ==
hogehoge
=> nil

Railsモデルまわり命名規則

命名規則

モデルファイル名

app/models/basic_user.rb

Table名

basic_users

Class名

BasicUser

Factoryファイル名

spec/factories/basic_users.rb

Factory テーブル名

factory :basic_user do

rspecファイル名

spec/models/basic_users_spec.rb

rspec FactoryBot呼び出し

let(:basic_user) { FactoryBot.build(:basic_user) }

ルール

複数形

table名
Factoryファイル名
rspecファイル名(+_spec)

キャメルケース

Class名

Vagrantで作成したVM環境にパスワード認証でsshログインする

まずはvagrant sshでログインする

# 設定変更
sudo vi /etc/ssh/sshd_config
### 以下のlineのnoをyesに変える ###
PasswordAuthentication no
### ここまで ###

# sshdのrestart
sudo systemctl restart sshd

これでteraterm等からパスワード認証でsshログインできるようになります

ubuntu16.04にrbenvでrubyをインストールする

# library install and update
sudo apt-get update
cd 
sudo apt-get install git build-essential libssl-dev libreadline-dev

vi ~/.profile
### 以下を末尾に追加 ###
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
### ここまで ###

source ~/.profile

# installできるversionのチェック
rbenv install --list

# install
rbenv install 2.5.1
rbenv rehash

# globalへの設定&確認
rbenv global 2.5.1
ruby -v

AWS EC2で”JavaScript heap out of memory”エラーが出たら

AWS EC2で”JavaScript heap out of memory”エラーが出たときの対処法です
主にt2.microとかメモリ容量の小さいインスタンスでnuxtとかnode使ってると出現する

こんなエラー

<--- Last few GCs --->

[5746:0x42f2e10]    11947 ms: Mark-sweep 101.0 (114.6) -> 100.2 (113.6) MB, 140.1 / 0.0 ms  (+ 0.3 ms in 1 steps since start of marking, biggest step 0.3 ms, walltime since start of marking 182 ms) (average mu = 0.294, current mu = 0.434) low memory notif[5746:0x42f2e10]    12099 ms: Mark-sweep 100.2 (113.6) -> 100.2 (113.6) MB, 152.0 / 0.0 ms  (average mu = 0.168, current mu = 0.000) low memory notification GC in old space requested

<--- JS stacktrace --->

==== JS stack trace =========================================

Security context: 0x1098ebb9e549 <JSObject>
    0: builtin exit frame: new ArrayBuffer(aka ArrayBuffer)(this=0x1ff267182801 <the_hole>,0x3c9d355d9001 <Number 6.41975e+06>,0x1ff267182801 <the_hole>)

    1: ConstructFrame [pc: 0x3e29d418d145]
    2: StubFrame [pc: 0x3e29d420b900]
    3: createUnsafeArrayBuffer(aka createUnsafeArrayBuffer) [0x3bbd5485d531] [buffer.js:119] [bytecode=0x365108798601 offset=25](this=0x1ff2671826f1 <undefined>,s...

FATAL ERROR: Committing semi space failed. Allocation failed - JavaScript heap out of memory
 1: 0x8c02c0 node::Abort() [node]
 2: 0x8c030c  [node]
 3: 0xad15de v8::Utils::ReportOOMFailure(v8::internal::Isolate*, char const*, bool) [node]
 4: 0xad1814 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, bool) [node]
 5: 0xebe752  [node]
 6: 0xecb0f2  [node]
 7: 0xecb2b4 v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [node]
 8: 0xecc7aa v8::internal::Heap::CollectAllAvailableGarbage(v8::internal::GarbageCollectionReason) [node]
 9: 0xae6cc5 v8::Isolate::LowMemoryNotification() [node]
10: 0x8bfdad node::ArrayBufferAllocator::Allocate(unsigned long) [node]
11: 0xfd88e3 v8::internal::JSArrayBuffer::SetupAllocatingData(v8::internal::Handle<v8::internal::JSArrayBuffer>, v8::internal::Isolate*, unsigned long, bool, v8::internal::SharedFlag) [node]
12: 0xb64514  [node]
13: 0xb664b3 v8::internal::Builtin_ArrayBufferConstructor(int, v8::internal::Object**, v8::internal::Isolate*) [node]
14: 0x3e29d41dc17d

対処法

sudo su
dd if=/dev/zero of=/swapfile bs=1M count=1024
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile

node.jsのインストール方法

# install ndenv
cd /usr/local/
git clone https://github.com/riywo/ndenv.git
chmod -R g+rwxXs /usr/local/ndenv/
mkdir /usr/local/ndenv/plugins
cd /usr/local/ndenv/plugins
git clone https://github.com/riywo/node-build.git
cat << "EOF" > /etc/profile.d/ndenv.sh
export NDENV_ROOT=/usr/local/ndenv
export PATH="$NDENV_ROOT/bin:$PATH"
eval "$(ndenv init -)"
EOF
source /etc/profile.d/ndenv.sh

# install node
ndenv install ${NODE_VERSION}
ndenv global ${NODE_VERSION}
ndenv rehash

Nuxt.jsで画像をwebpで圧縮する

library install

npm install --save gulp-webp

gulpfile.js

vi gulpfile.js

const webp = require('gulp-webp')

gulp.task('webp', function() {
  return gulp.src("./precompile/img/**/*.{svg,gif,png,jpg,jpeg}")
             .pipe(webp())
             .pipe(gulp.dest("./assets/img/"));
});

実行コマンド

gulp webp

流れとしてはprecompile/imgという名前の画像ファイル置き場を作成し、ここにjpgやpngやらの画像を配置する
gulp webpコマンドで上記の画像ファイルをwebpファイルに変換してassets/img以下に配置する
(その後は通常通りnuxt generateでdist以下に画像ファイルが配置される)