動かざることバグの如し

近づきたいよ 君の理想に

Rubyは何故 if else ではなく if elsif なのか

背景

例のごとくツイッターしてたらこんなツイートが流れてきた。

これは他の言語やってて、そのあとにRubyやりだすと多くの人が疑問に浮かべる話だと思う。

実際、自分もJavascriptPHPJavaのあとにRuby触ったのでよくシンタックスエラーさせてた。

公式回答が

それに対してなんとRubyの生みの親ことMatzがリプライで回答していた。

冒頭の愚痴を投げていた人も恐縮していたが、当然だと思う(まさか拾われるとは思わない

つまりRubyでは文字数最短と発音のバランスを取った結果elsifになったというわけらしい

なんていうか、Rubyは他の言語と違って if に {} をブロックで囲まないので、else if の文法解釈ができないんだと思う。

実際Rubyは倒置ifといって val = 1 if 10 > 2 みたいな書き方もできてしまうし。。

実際以下のコードは正常に実行できるし、1が出力される。

if true
    puts 1
else if true
    puts 2
else if true
    puts 3
else
    puts 4
end end end

どう見ても最後のendが連続で続いているのがキモいが、インデントを直すと要は以下と同じである。

if true
  puts 1
else
  if true
    puts 2
  else
    if true
      puts 3
    else
      puts 4
    end
  end
end

2018年でも同じことをMatzは言っている。まぁPerlの流れは大きい気がする

要は慣れですかね???????(適当

ぶっちゃけIDE使ってると補完されるからそこまで気にならなくなるっていう

参考リンク

Vue.jsでページ内リンクを使うなら「vue-scrollto」を使え

結論

Vue.jsでページ内リンク(いわゆるアンカーリンク)を使いたいならvue-scrolltoを使ったほうが幸せになれる

そもそもアンカーリンクって何

アンカーリンク自体死語な気がするが、いわゆるページ内リンク

リンクをクリックすることで同じページ上の任意の場所へジャンプしてくれる機能がある。そのリンクがアンカーリンクってやつ

仕様的には「http://example.com#hoge」とやると

<div id="#hoge">
コンテンツ
</div>

までジャンプしてくれる

vue-scrolltoを使うメリット

もちろんアンカーリンク貼るだけならvue-scrolltoなくてもなんとかなるが、

  • スムーススクロールを簡単に設定できる(アニメーションを意識しなくて良い
  • offsetで任意のDOMの○px上/下へズラしてジャンプできる(offset機能
  • コールバックが実装できる

等がある。

インストール

普通にnpmインストールするだけ

npm install --save vue-scrollto
or
yarn add vue-scrollto

サンプル

一番シンプルな例

durationオプションを渡すことでゆっくりスクロールしたり、素早くスクロールできたりできる。

以下がoffset機能

コールバックの例

ちなみにオプションだが、

<button v-scroll-to="{ el: '#element', offset: 200 }">

のように個別に渡すこともできるし、以下のようにグローバルに設定することもできる

Vue.use(VueScrollTo, {
     offset: 200,
 })

他にもいくつかオプションがある。公式ドキュメントもまとまって見やすいので好感が持てる

書いてて思ったが、一番伝わるのは「ページの一番上に戻る」ボタンの実装といえば早い気がした。当然それもvue-scrolltoで実装できる

環境

  • Vue.js 2

Nuxt.jsで使うときの注意点

Nuxt.jsにも対応しており、nuxt-linkで移動できる

ただし、nuxt-linkは仕様上toのattributeが必須なので以下のように「#」を指定する必要がある。

<nuxt-link v-scroll-to="{ el: 'top'}" to="#">一番上に戻る</nuxt-link>

PHPで「Fatal error: Allowed memory size of」エラーを発生させる4行

昔のメモ整理してたら出てきたのでメモ

やり方

以下のコードを実行するとエラーになって実行が止まってしまう

<?php
$ary = [];
for ($i = 0; $i < count($ary); $i++) {
  $ary[$i] = "evil";
}
var_dump($ary);
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 134217736 bytes) in xxx.php

当時は別にFatal errorも狙って書いたわけではなくただのバグなのだが、エラーになる理由は簡単で、以下のコードでも同じエラーになるといえば察するはず

<?php
$ary = [];
for ($i = 0;; $i++) {
  $ary[$i] = "evil";
}
var_dump($ary);

つまり無限ループが発生してしまっていたわけ

なんでこんなコード書いてたんだろ。。

クリックイベントとかを無効化するJavascript

環境

他のブラウザは知らん(他人事

背景

絶対にニッチなニーズだが、特定のDOMの特定のイベントを削除したいとかスクロールイベントを無効化したい事があると思う(ない

JSはやはりなんでもありなので、なんとかなる

とりあえず動くコードよこせ

以下はスクロールイベントを無効化するコード

for (let el of getEventListeners(window)['scroll']) { window.removeEventListener('scroll',el.listener,el.useCapture); }

https://alvarotrigo.com/fullPage/examples/normalScroll.htmlのようなサイトで実行すると分かるが、スクロールによるJavaScriptが一切実行されなくなる。

以下は特定の要素のクリックを無効化する例

const elm = document.getElementById("bigCookie");
for (let el of getEventListeners(elm)['click']) { elm.removeEventListener('click', el.listener,el.useCapture); }

みんな大好き(?)クッキークリッカーのサイトで実行できる。見事にクッキーをクリックしてもカウントが回らなくなる。

AWS S3でディレクトリごとファイル一括削除する

やりたいこと

S3は各バケットディレクトリごとにネストしてファイルをアップロードすることができるが、逆にファイルを削除したいときもある。

で、面倒なのでディレクトリごとまるごとサクッと消し去りたい

コマンドで削除する方法

予め公式のawsコマンドをPCにインストールして認証を通しておく必要がある。

例えばmybucketバケットのhogehogeディレクトリを消したいとき

aws s3 rm s3://mybucket/hogehoge --recursive

--recursiveをつけるのがポイント

Rubyで削除する方法

公式ライブラリである、AWS SDK for Ruby V3を使う。これも認証情報は別に通しておく必要がある

Gemfileに

gem 'aws-sdk-s3'

でbundle installしておく

あとは以下

s3 = Aws::S3::Resource.new
folder = "hogehoge"
objects = s3.bucket("mybucket").objects({prefix: folder})
objects.batch_delete!

参考リンク