2018年5月26日土曜日

2018年版Vue.jsでのオブジェクトと配列操作ベストプラクティス

はじめに

基本的に Vue は子要素の代入演算子は感知しません。
しかし、Array は公式が公表している、ラップした変更検知メソッドを利用して、操作をすればやりたい事はほぼ全て実現できるでしょう。
これらはAirbnb lint ruleから得られた経験から来た知見です。結構使いやすい。
; セミコロンを末尾に付けたくない人も多いと思いますが、そこはruleを上書きすればまぁ良いでしょう。
push や pop 程度など、まぁ知ってるでしょうていう軽いのは省いています。

ゴール

コンポーネントとストアの記法の統一

配列辺

規定回数繰り返す

よく見るairbnb lintで怒られるコード
for (let i=0;i<5;i++) {
    print(i)
}
改善。これはとても見やすいですね。
[...Array(5)].forEach((_, i) => { console.log(i) })
ちなみにこれは動きません。
Array(5).forEach((_, i) => { console.log(i) })

配列の特定インデックスの値を書き換える

リアクティブにならなくて辛いやつ
a = [{a:1},{b:2}]
a[1].b = 10
リアクティブで嬉しいやつ。
a = [{a:1},{b:2}]
a = a.splice(1, 1, {b:10})

軽く解説

spliceはまず開始indexを指定して、そこから何個取り除くのかを指定し、最後に指定した箇所に挿入する要素を渡せます。これはリアクティブでとても嬉しい。
あと、何個取り除くかの個数を0にすれば、単純に要素の挿入になり、とても良い感じです。
また、第3引数を入れなければ、普通に要素削除にもなります。
途中の要素挿入、追加、削除はspliceとりあえず使えばとても統一感が出そうな気がしますね。

computedやgetterの際のみ、特定要素を追加したい

data() {
    return {
        a: [
            { name: '田中', age: 18 },
            { name: '小林', age: 18 },
        ],
    }
},
これはとても悲しい例ですね。getterで副作用を発生させている。
store の getter でも this.a ならず、state.a バージョンを見たことあります。
computed: {
    personList() {
        this.a.forEach(item => {
            item.isMinority = item.age < 20
        })
        return this.a
    },
},
改善。map最高!
computed: {
    personList() {
        return this.a.map(item => ({ ...item, isMinority: item.age < 20 }))
    },
},

foreach

まぁ、よくみるやつ
const a = [1,2,3]
for (const i in a) {
    console.log(i, a[i])
}

for (const i of a) {
    console.log(i)
}
lintで叱られないし、配列っぽくてこっちのが良い気がする
const a = [1,2,3]
a.forEach((value, i) => {
    console.log(i, value)
})

a.forEach(value => {
    console.log(value)
})

break foreach

皆さんこういうのやりたいですよね
const a = [44,99,55,33]

for (i of a) {
    if (i === 55) break
    console.log(i)
}
これでどうでしょか。some最高!
const a = [44,99,55,33]

a.some(i => {
    if (i === 55) return true
    console.log(i)
})

配列から特定の値を検索して、それの値を変えたい

よくみるやつ。リアクティブにならなくてとてもかなしい。Vue.set使えばいけるけど、storeだと使えないので、記法を統一したいですよね。
const a = [44,99,55,33]

for (i in a) {
    if (a[i] === 55) {
        a[i] = 4649
        break
    }
}
これはどうでしょうか。
const a = [44,99,55,33]

const key = a.findIndex(i => i === 55)
if (key !== -1) {
    a.splice(key, 1, 4649)
}

オブジェクト辺

プロパティを上書き・追加する

リアクティブじゃなくてとても悲しいやつ
let a = {
    name: '田中',
    age: 18,
}

a.age = 20
これはリアクティブでとても嬉しい
let a = {
    name: '田中',
    age: 18,
}

a = { ...a, age: 20 }

プロパティを削除する

リアクティブじゃなくて悲しいやつ
let a = {
    name: '田中',
    type: 'スーパーマン',
    age: 18,
}

delete(a.age)
リアクティブで嬉しいやつ。
let a = {
    name: '田中',
    type: 'スーパーマン',
    age: 18,
}

let clone = { ...a }
delete(clone.age)
a = clone

最後に

如何だったでしょうか?
統一された良いコードを頑張って作っていきましょう!

2018年5月23日水曜日

Rails 5.xxでBootswatchを利用

前置き

製作中のWebサイトを、とりあえずいい感じのレイアウトにして、完成形のイメージにする為に、よく Bootstrap が使われています。
Bootswatch は Bootstrap のテーマで、やっぱりいい感じのレイアウトがまとまっています。
Screen Shot 2014-05-28 at 11.34.34.png
Screen Shot 2014-05-28 at 11.35.03.png
この中のテーマの1つを Rails 5で利用する方法をメモします。

Gemfile

gem 'twitter-bootswatch-rails', '~> 3.1.1'
gem 'twitter-bootswatch-rails-helpers'
gem 'execjs'
gem 'less-rails'

インストール

テーマを適応させます。
今回は lumen というテーマを選択しました。
テーマに関してはこちらから自由に選べます。
rails g bootswatch:install lumen
rails g bootswatch:import lumen
rails g bootswatch:layout lumen

Stylesheet

application.css を編集します。
lumen のところは選択したテーマ名を入力。
app/assets/stylesheet/application.css
/*
 *= require_self
 *= require lumen/loader
 *= require lumen/bootswatch
*/

Javascript

application.js を編集します。
lumen のところは選択したテーマ名を入力。
app/assets/javascript/application.js
//= require jquery
//= require jquery_ujs
//= require lumen/loader
//= require lumen/bootswatch

使い方

以上で使えるようになると思います。
使い方としては、bootswatchのサイトから、各テーマのページに移って、そこに記載してあるパーツひとつひとつにマウスオーバーすると、コードが表示されるようになるので、それを利用したらいいかと思います。
Screen Shot 2014-05-28 at 11.50.59.png
Screen Shot 2014-05-28 at 11.51.07.png

詳細

その他、設定に関する詳細は、以下を見るといいかと思います。
https://github.com/scottvrosenthal/twitter-bootswatch-rails

参考

2018年度版 CentOS7の設定

変更点

  • カーネル3.10系の採用
  • デフォルトで選択されているインストールが『最小限のインストール』になった。そのままインストールすると、ifconfigコマンド(ip aで代用可)すら入っていない。
  • デスクトップはGNOMEがメインになった(KDEも選択可能)。
  • systemd採用で起動処理が速くなった(sysvinitやupstart等の置き換え)
  • firewallの設定はfirewall-cmd、firewall-configになった。これらのコマンドの後ろでiptablesが設定される。
  • 古いハードウェアがサポート外になった。100MbpsのNICや3wareの古いRAIDカード等。smartarray P400等もサポート外になったので、ヤフオクで安く買っても使えないと思います。
  • デフォルトのファイルシステムがXFSになった。ext4やBtrfsも選択可能。
  • ブートローダがGRUB2へ。/boot/grub/menu.confを直に書き換えちゃダメ。
  • 仮想化周りが最新のものに置き換わった。
  • ruby2.0、python2.7.5、openjdk7、gcc-4.8.x
  • samba4.1(samba大好きなので書きました。ADに参加できたりします。)
  • Apache2.4、MariaDB5.5、PostgreSQL9.2(MySQL ServerはMariaDBに置き換えられたが、mysql用に書かれたプログラムは利用可能。

2018年度版GCEでのWebサイト開発(執筆中)

Google Cloud EngineでのWebサイト開発について、執筆をしたい。

以下を利用予定。

  • Ruby on Rails
  • Bootstrap 4
  • AMP
  • React