PeaceJetのブログ

金融系の社内エンジニアをやりながら、マーケティングやデータ分析などもやっています。

【Ruby on Rails】MaterializeのChips(Tags)で結構ハマったはなし

Materialize Chips

タグ機能の実装について、いろいろと試行錯誤しています。
その中で、Materializeを使用させていただいているのですが、標準のタグ機能だと結構ややこしい処理をしないと値を取ってこれなかったのでメモします。

※注意:返却される値が、配列に格納されたハッシュですので、そのような機能を実装しているのでしたら、Materializeのタグ機能を余すところなく使えると思います。
例としては以下のようなものです。

[
  {tag: "テスト"},
  {tag: "テスト"}
]

Chips

htmlを書いていきます。

<div class="chips chips-initial chips-placeholder">
</div>
<%= f.input_field :tag_list, id: :tag_list %>

javascriptも、必要に応じて取捨選択し書いていきます。

$('.chips').material_chip();
$('.chips-initial').material_chip({
  data: [{
    tag: 'Apple',
  }, {
    tag: 'Microsoft',
  }, {
    tag: 'Google',
  }],
});
$('.chips-placeholder').material_chip({
  placeholder: 'Enter a tag',
  secondaryPlaceholder: '+Tag',
});
$('.chips-autocomplete').material_chip({
  autocompleteOptions: {
    data: {
      'Apple': null,
      'Microsoft': null,
      'Google': null
    },
    limit: Infinity,
    minLength: 1
  }
});

以下のように記述すると、カンマ区切りの値を得ることができます。
「テスト,テスト」のような感じです。

$('.chips').on('chip.add chip.delete', function(e, chip){
  var x = $('.chips').material_chip('data');
  var z = [];
  $.each(x, function(index, elem) { z.push(elem.tag) });
  $("#tag_list").val(z)
})

もっと、高レイヤーでのやり方があれば良いのですが見当たらず・・・。

The Site of Materialize

materializecss.com

【Ruby on Rails】Acts_as_Taggable_onで結構ハマったはなし

最近、Ruby on Railsを使用したWebアプリケーションの開発を行っております。

その中で、タグ機能を実装するためにActs_as_Taggable_onというGemパッケージを使用したのですが、結構ハマってしまったので共有します。
もし、的外れなことを言っているなと思った方がいれば指摘していただけると助かります。

環境は以下のとおりです。

名称 バージョン
Windows 10
Ruby 2.2.6
Rails 5.1.4

そのいち

マイグレーションが通らない。

StandardError: An error has occurred, this and all later migrations canceled:

Directly inheriting from ActiveRecord::Migration is not supported. Please specify the Rails release the migration was written for:

class RolifyCreateRoles < ActiveRecord::Migration[4.2]
/Users/brandoncordell/Code/dsk_group/db/migrate/20170307143104_rolify_create_roles.rb:1:in `'
/Users/brandoncordell/Code/dsk_group/bin/rails:9:in `require'
/Users/brandoncordell/Code/dsk_group/bin/rails:9:in `'
/Users/brandoncordell/Code/dsk_group/bin/spring:15:in `'
bin/rails:4:in `load'
bin/rails:4:in `

'
StandardError: Directly inheriting from ActiveRecord::Migration is not supported. Please specify the Rails release the migration was written for:

class RolifyCreateRoles < ActiveRecord::Migration[4.2]
/Users/brandoncordell/Code/dsk_group/db/migrate/20170307143104_rolify_create_roles.rb:1:in `'
/Users/brandoncordell/Code/dsk_group/bin/rails:9:in `require'
/Users/brandoncordell/Code/dsk_group/bin/rails:9:in `'
/Users/brandoncordell/Code/dsk_group/bin/spring:15:in `'
bin/rails:4:in `load'
bin/rails:4:in `

'
Tasks: TOP => db:migrate
(See full trace by running task with --trace)

上記のようなエラーです。
意味的には、ActiveRecord::Migrationから直接継承することはサポートされていませんので、Railsバージョンが指定されたマイグレーションファイルを書いてくおくんさい。
ということだと思います。

したがって、以下のように修正しました。

#修正前
Class RolifyCreateRoles < ActiveRecord::Migration
end
#修正後
Class RolifyCreateRoles < ActiveRecord::Migration[5.0]
end

以下のサイトを参考にしました。
github.com

そのに

これもまた、マイグレーション作業時のエラーです。

igrating to AddMissingUniqueIndices (**************)
== AddMissingUniqueIndices: migrating ========================================

    • add_index(:tags, :name, {:unique=>true})

PG::UniqueViolation: ERROR: could not create unique index "index_tags_on_name"
DETAIL: Key (name)=(???) is duplicated.
: CREATE UNIQUE INDEX "index_tags_on_name" ON "tags" ("name")
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:

上記のようなエラーです。
私のログが残っていないので、引用させていただきました。
マイグレーションスクリプトの中に、2度、同じカラムを追加をする項目があるようで、それが悪さをしているようです。
「すでにカラムが存在していますので作ることができません」というエラー内容なので、マイグレーションスクリプトの該当部分をコメントアウトすることで解消できました。

そのさん

これが、どうにもならないエラーでした。

NoMethodError (super: no superclass method `quote_value' for #
Did you mean? quote_bound_value):

tackeyy.com
このコミュニティーの会話の中で、gemパッケージの最新版を使ってみては?という流れなのですが、Rubyのバージョンをイジれないので良い案がないかといった会話がありました。
しかし、その後に続く人がおらず、おそらく解決策がないんだろうなぁということで完全にお手上げ状態になっていまいました。

-gem 'acts-as-taggable-on', '~> 4.0'
 +gem 'acts-as-taggable-on', github: 'mbleigh/acts-as-taggable-on', branch: 'master'

以下の記事を参考にさせていただきました。
tackeyy.com

ここで注意なのは、最新版のgemパッケージは、Rubyバージョンが2.2.7以上でないと動作しないということです。

> bundle install

上記コマンドを実行すると、Rubyのバージョンを変更してくださいと警告が出て落ちます。

結果的に、Rubyのバージョンを上げることにしました。

Ruby 2.2.6 から 2.3.3 へバージョン変更。
現状では 2.5 まであるのですが、大幅なバージョンアップによってもたらされるリスクを避けたかったので、2.3にしましたといったら怒られると思いますが、スピードを優先したいという思いがあり苦肉の策として採用しました。
開発環境を作り直すハメになるとは思わなかったのですが、いい勉強になりました。

結論

Rubyのバージョンは、2.2.7以上を使うようにしましょう。

【Ruby on Rails】SQLite3::SQLException: duplicate column nameと出た場合の対処法

deviseを使っている時に出たエラーでして、以下のようなメッセージがひょうじされました。

SQLite3::SQLException: duplicate column name: username: ALTER TABLE "users" ADD "username" varchar

これは、既に username を設定しているのに、さらに付け足そうとしているから出るものです。
マイグレーションファイルを変更しましょう。

class AddPasswordDigesToUsers < ActiveRecord::Migration[5.0]
  def change
    add_column :users, :username, :string
  end
end

上記のファイルを以下の様に変更します。

class AddPasswordDigesToUsers < ActiveRecord::Migration[5.0]
  def change
  end
end

続いて、bundle exec rake rails db:migrate または、rails db:migrateを実行します。

【VBA】セルが空白かどうかを正確に判定する

VBAでセルが空白かどうかを正確に判定する

VBAでは、空白であることを以下のようにすることが一般的かもしれません。

If Cells(1,1) = "" Then
    Debug.Print("空白です")
Else
    Debug.Print("空白ではありません")
End If

しかし、これでは漏れが出来ることがあります。

代表的な例としては、数式が入力されていた場合はセルが空白ではないと判定されてしまいます。

そこで、以下のように判定することで空白セルを漏れなく判定することができるようになります。

If Not xWs.Cells(1, 1).HasFormula Then
    If xWs.Cells(1, 1).Value = "" Then
        Debug.Print("空白です")
    else
        Debug.Print("空白ではありません")
    End If
else
    Debug.Print("数式が入力されています")
End If

このほか、セルの値がエラー値が返ってくる場合などがありますが、ここでは省略します。

Nature Remoが届いたのでレビューします。

こんにちは、PeaceJetです。

この度、NatureRemoが家に届いたのでレビューしてみたいと思います。

前回の記事では、センサーの不具合が発見されたということで発売を見送るということでした。
peacejet.hatenablog.com

ところが、後日、不具合の原因を突き止め改良版を販売するとのお知らせがありました。
そこで、さっそく注文をしてみました。
10月発売ということで、wktkしながら待っていたのですが、昨日無事到着しました。

配送

自社での配送ではなく、Amazonの倉庫を借りているのか定かではありませんが、配送はAmazonからの発送となっていました。

開封

まずは、箱の前景からです。


次は、箱の背面です。


裏面には、「スマートエアコンで快適な生活を」と書かれているとおり、本体でのエアコン操作が主なミッションとなっているようです。

内箱

内箱は以下のように、ロゴが刻印されていました。

Amazonのフラストレーションフリーパッケージのような薄手のボール紙で作られていてエコな感じがあります。
これも、この会社が掲げるビジョンが背景になっているのかもしれないですね。

2011年3月、東南アジアの僻地にある炭鉱を小型セスナ機で訪問した。そこで空から見た景色は今でも鮮明に記憶している。大自然の中にひっそりとたたずむ小さな街並み、その横にある地面を剥ぎ取ったような石炭鉱山の情景。想像を超える巨大な掘削・輸送機、炭鉱の現場で巨大な機材と奮闘する炭鉱夫。その景色を見た時に大きな違和感を感じたのをよく覚えている。ホテルに戻ると福島原発事故のニュースが届いた。当たり前のように使っていた電気、それを支えてきた中央集権的な原子力発電や石炭火力発電の歪みを目の当たりにして、分散化電源の普及を支える事業を立ち上げたいと思った(Founder and CEO / 塩出 晴海)。

nature.global

箱出し


箱から、パーツなどを取り出したところです。

  • 両面テープ
  • USBケーブル
  • USB電源プラグ
  • 本体
  • 説明書

以上の構成でした。
USBケーブルは意外と長く、1.5メートルくらいあって壁などに設置する際にはちょうどいい長さと思います。
ただ、両面テープの粘着がイマイチでした。
壁に貼り付けたところ、自重で落下してしまったのです。
そこで、ニトムズのはがせる両面テープに張り替えたところ落下の被害は減りました。

両面テープを貼り付け。


上記は、はじめから付属していた3Mの両面テープを貼り付けたところです。

これまで、様々なブログなどで言われていたとおりエアコンを操作することがミッションとなっているようです。

セットアップ

本体を操作するのは、スマホから専用のアプリを介して行います。
セットアップは非常に簡単で、アプリをダウンロードし、電源プラグにさしたUSBケーブルを本体と接続すると、本体が点滅し始めます。
その後は、アプリの案内にしたがって家庭用のWi-Fiの情報を入力すると完了します。

登録

シーリングライトのリモコンを登録してみました。

壁への取り付け

サルバドール・ダリが好きなので、ポストカードを飾っています。
本体の大きさはポストカードよりも小さく小ぶりです。

感想

Wi-Fi接続時だけでなく、4G回線からでも使うことが出来るので外出先から操作することが出来ます。
ですので、家に着く直前に暖房入れたり、部屋の明かりを点けたりと様々に応用する事ができます。
それから、赤外線のパワーが強いように感じます。
たしか、3方向に赤外線を飛ばすようになっていたかと思いますが、対象機器の裏側にRemo本体が居ても十分にリモコンとして機能します。

改善してほしい点

そもそも、スタートアップから始まったものだし、これからというところもあるのでしょうけれども。
クラウドへ接続が出来ませんでした」というメッセージが出て、リモコンとして機能しなくなりました。
リセットして、再度、登録などをやりなおしを行いました。

今後

今後は、API公開など開発への夢が広がります。
続報などありましたら、またブログに書くかもしれません。

ここまで読んでいただき、ありがとうございました。

【JQuery】全てのセレクトボックスが選択されているか判定する。

複数のセレクトボックス

セレクトボックスが複数ある場合で、少なくともどれか一つの値が選択されているかどうかを調べてみたいと思います。

おそらく、何種類かやり方はあるかと思っているのですが・・・。

2つの配列を作成して判定したいと思います。

<div id="select">
  <div id="SelectWrapFirst">
    <select name="first">
      <option value="">選択してください</option>
      <option value="aaa_1">aaa_1</option>
      <option value="aaa_2">aaa_2</option>
      <option value="aaa_3">aaa_3</option>
    </select>
  </div>
  <div id="SelectWrapSecond">
    <select name="second">
      <option value="">選択してください</option>
      <option value="bbb_1">bbb_1</option>
      <option value="bbb_2">bbb_2</option>
    </select>
  </div>
  <div id="SelectWrapThird">
    <select name="third">
      <option value="">選択してください</option>
      <option value="ccc_1">ccc_1</option>
      <option value="ccc_2">ccc_2</option>
    </select>
  </div>
</div>
<div>
  <button type="button" name="button">確認</button>
</div>
$(fucntion() {

  //ボタンを押して確認するようにしています。
  $('button[name="button"]').on("click", function() {
    
    //要素を入れる配列:myArray    
    var myArray = new Array();
    $("#select option:selected").map(function () {
      myArray.push($(this).val());
    });
    
    var x = new Array();
    for (var i in myArray) {
      if (myArray[i] !== "") x.push(myArray[i]);
    }
    //空文字を削除した新たな配列:x

    //$.isEmptyObject
    if ($.isEmptyObject(x) === false) {
      //なにか処理を書く。
      console.log("少なくても一つは、選択されています。")
    }

  myArray = [];

  });

});

Nature Remo 再販決定

I注目していた「Nature Remo」が再販されることになったようです。


10月を目標に調整しているとのこと。

nature.global

peacejet.hatenablog.com