ハイパーニートプログラマーへの道

頑張ったり頑張らなかったり

CrystalでMerge Sort

Crystal 0.20.0

こちらのRuby versionを参考にしました。

stackoverflow.com

def merge_sort(array)
  return array if array.size <= 1
  mid = (array.size / 2).round
  left, right = array[0...mid], array[mid..-1]
  merge(merge_sort(left), merge_sort(right))
end

def merge(left, right)
  res = [] of Int32
  until left.empty? || right.empty?
    if left.first <= right.first
      res.push(left.shift)
    else
      res.push(right.shift)
    end
  end
  res + left + right
end

もう一つ。上記のと変数名やメソッド名揃えてなくてアレですけど・・・。

これの元ネタはPython Algorithms, Listing 3-2

def mergesort2(seq)
  mid = (seq.size / 2).round
  lft, rgt = seq[0...mid], seq[mid..-1]
  lft = mergesort2(lft) if lft.size > 1
  rgt = mergesort2(rgt) if rgt.size > 1
  res = [] of Int32
  until lft.empty? || rgt.empty?
    if lft.first <= rgt.first
      res.push(lft.shift)
    else
      res.push(rgt.shift)
    end
  end
  return res + lft + rgt
end

crystal play上で実行してみます。

require "benchmark"
.
.
.
seq = [5,3,6,9,1,4,2,8,7]
Benchmark.bm do |x|
  x.report("merge_sort:") do
    p merge_sort(seq)
  end
  x.report("merge_sort2:") do
    p mergesort2(seq)
  end
end
                   user     system      total        real
merge_sort:  [1, 2, 3, 4, 5, 6, 7, 8, 9]
  0.000000   0.010000   0.010000 (  0.014788)
merge_sort2: [1, 2, 3, 4, 5, 6, 7, 8, 9]
  0.000000   0.010000   0.010000 (  0.011958)

いま気づいたけど、crystal playのログにめっちゃ警告でてるじゃあないですか・・・。

Warning: benchmarking without the `--release` flag won't yield useful results

Python Algorithms: Mastering Basic Algorithms in the Python Language

Python Algorithms: Mastering Basic Algorithms in the Python Language

Bootstrap4 Alpha3 - チェックボックスボタンがfocusedの時もoutlineなスタイルにする

な、何を言っているのかわからねーと思うが・・・

http://v4-alpha.getbootstrap.com/components/buttons/#checkbox-and-radio-buttons

上のリンクをチェックしていただけるとわかるかと思いますが、チェックボックスがボタン型になったボタングループを用意します。

ボタングループを用意

<div class="btn-group" data-toggle="buttons">
  <label class="btn btn-outline-success btn-block">
    <input type="checkbox" autocomplete="off"> Checkbox 2
  </label>
.
.
.
</div>

btn-groupクラスがあるdivに、data-toggle="buttons"を追加します。これでボタンがトグル可能になるわけです。buttonsが複数形であることに注意。

ボタンはbtn-outline-successでアウトラインスタイルに、btn-blockでブロック型にします。
注意としてはinput要素ではなくlabelのクラスに定義する点ですかね。

input要素はtype="checkbox"としておきます。

これだけでactive(checked)な場合は緑地に白字、そうでない場合はoutlineなスタイルになってくれるのですが、一つ問題があります。

focusが当たっている時は白地になってくれない

クリックしてactiveからnon-activeにした場合、フォーカスがかかっている状態では色が変わってくれません。フォーカスを外した時に初めて、白地のアウトラインスタイルになってくれます。
下のCodepenの例でいうと左側(または上側)のグループです。ちょっと試していただけると良いかと。

See the Pen Bootstrap4 Alpha3 - Keep non-active buttons with outline style when focused by Noriyo Akita (@noriyotcp) on CodePen.

さて、これをどうするかなと

続きを読む

【備忘録】【Ruby on Rails】MiniTestにおいて、ActionView::Template::Error: couldn't find file... と出るときは

Ruby on Rails Tutorialの4th Editionが出たので、アプリを作っていったのですが

www.railstutorial.org

time_ago_in_wordsを使用している箇所を、rails_best_practicesのNot user time_ago_in_wordsに倣って、rails_timeagoというgemを使うことにしました。

github.com

そこまでは良かったのですが、rails testが以下のようなエラーを吐いて軒並み落ちてしまいました。

ActionView::Template::Error: ActionView::Template::Error: couldn't find file 'rails-timeago' with type 'application/javascript'

テストにおいてrails-timeagoを見つけられてないみたいでしたので、Gemfileをこのように修正しました。

  • Before
group :development do
.
.
  gem 'rails-timeago', '~> 2.0'
end
  • After
group :development, :test do
.
.
  gem 'rails-timeago', '~> 2.0'
end

つまり:development groupから:development, :test groupに移してあげた、という基本中の基本みたいな話です・・・。

それでも落ちる場合はspringをいったん切ってみる、など

$ ps aux | grep spring
$ kill -9 PID

これで完全な対処になっているかどうかわかりませんが、備忘録として・・・。

ちなみにRails5.0.0で、cloud9上で開発しました。