ためすう

Hugo のインストール、セットアップ

2020-10-24

やったこと

Hugo のインストール、セットアップをした時のメモを残します。

確認環境

$ hugo version
Hugo Static Site Generator v0.53/extended darwin/amd64 BuildDate: unknown

hugo インストール

$ brew install hugo

プロジェクトセット

$ hugo new site tech-blog

テーマ適用

ブログのテーマを適用します。

$ git submodule add https://github.com/qqhann/hugo-primer themes/hugo-primer
$ echo 'theme = "hugo-primer"' >> config.toml

記事投稿

$ hugo new post/my-first-post.md

サーバー起動

$ hugo server -D

jekyll から Hugo に移行させたのですが、記事のビルドのスピードが圧倒的に速くなりました。

rails runner を使ってみる (Rails)

2020-09-12

やったこと

runnerコマンドを使うと、非対話的にRailsの文脈でRubyのコードを実行することができます。たとえば次のようになります。

シェルのコマンドで、Rails のメソッドを使ってみます。

確認環境

$ ruby --version
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin17]

$ rails --version
Rails 6.0.3.2

調査

実行するコードをそのまま渡す

$ rails runner 'puts Rails.env'

出力

Running via Spring preloader in process 37027
development

外部ファイルを実行してみる

lib/hoge.rb

class Sample
  def self.hello
    puts 'called: hello'
    puts Rails.env
  end
end

Sample.hello

出力

$ rails runner lib/hoge.rb
Running via Spring preloader in process 38718
called: hello
development

参考

file を使ってみる (Unix)

2020-09-07

やったこと

ファイルの種類を識別するコマンドの file を使ってみます。

man file より抜粋

file tests each argument in an attempt to classify it.

調査

ファイルを用意する

a.php

<?php

echo 'hoge'

b.rb

class Sample
  def hoge
    p 'hoge'
  end
end

Sample.new.hoge

実行結果

$ file a.php
a.php: PHP script text, ASCII text

$ file b.rb
b.rb: Ruby module source text, ASCII text

php, ruby を識別することができました。

rspec で pending を使ってみる

2020-09-04

やったこと

rspec の pending を使ってみます。

確認環境

$ ruby --version
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin17]

$ rails --version
Rails 5.2.3

$ gem list | grep rspec-rails
rspec-rails (3.8.2)

調査

spec/models/task11_spec.rb

require 'rails_helper'

RSpec.describe Task, type: :model do
  it 'failedケース pendingあり' do
    pending('pending理由を何か書く')

    raise '例外発生1'
  end

  it 'successケース pendingなし' do
    expect(3 + 4).to eq 7
  end

  it 'successケース pendingあり' do
    pending('pending理由を何か書く')
  end
end

出力結果

$ bundle exec rspec spec/models/task11_spec.rb

Task
  failedケース pendingあり (PENDING: pending理由を何か書く)
  successケース pendingなし
  successケース pendingあり (FAILED - 1)

Pending: (Failures listed here are expected and do not affect your suite's status)

  1) Task failedケース pendingあり
     # pending理由を何か書く
     Failure/Error: raise '例外発生1'

     RuntimeError:
       例外発生1
     # ./spec/models/task11_spec.rb:7:in `block (2 levels) in <top (required)>'

Failures:

  1) Task successケース pendingあり FIXED
     Expected pending 'pending理由を何か書く' to fail. No error was raised.
     # ./spec/models/task11_spec.rb:14

Finished in 0.00317 seconds (files took 1.58 seconds to load)
3 examples, 1 failure, 1 pending

Failed examples:

rspec ./spec/models/task11_spec.rb:14 # Task successケース pendingあり

pending メソッドを使った場合、後続の処理でエラーが発生しないと

そのケースは失敗となります。(エラーが発生するのが正しいため)

rails-assets とサヨナラした話

2020-09-01

やったこと

rails-assets を利用しているシステムから、切り離した時の話です。

調査

rails-assets とは

The solution to assets management in Rails

js, css の依存関係について、gem を介して解決します。

しかし、rails-assets は近年のシステムでフロントエンド、バックエンドを明確に分けるという流れもあり、メンテナンスされない事が決まっていました。

そのような背景もあり、高頻度でサービスに繋がらなくなることありました。

GitHub の issues の例 サービスが落ちる度に、issue が立ち上がっています。

16.38.07.png

rails-assets の gem を自前でホスティングするように変更

rails-assets 経由で、ダウンロードできる gem が欲しかったのですが、

このサイトでは調べる事ができないようでした。

rails-assets を Gemfile に書いてインストールされているものを gem にすれば OK と思っていたのですが、それで正しいのか不安でした。

本家の rails-assets をローカルで gem を生成する事ができると分かりました。

なので、下記の2つの差分を見比べて、ソースコードに差異がなければ OK ということにします。

1.rails-assets から gem を生成したもの

2.rails-assets を Gemfile に書いてインストールされたもの

2.rails-assets を Gemfile に書いてインストールされたもの

は、既に持っているので、

1.rails-assets から gem を生成したもの を頑張って作ります。

rails-assets から gem を生成する

tenex/rails-assets: The solution to assets management in Rails

基本的には、上記の README.md を見ながらセットアップすればOKです。

ここで注意があります。

メンテナンスされてないため、Ruby, npm のバージョンが新しいと動きません。

ハマったところを書いておきます。必要なバージョンは頑張ってインストールします。

  • Ruby 2.2.3 (.ruby-version)
  • npm 6.14.4

また foreman と postgresql を動かしておく必要があります。

$ foreman start
$ postgres -D /usr/local/var/postgres

今回は select2 の gem を生成してみましょう。

$ bin/rake 'component:convert[select2,4.0.3]'

これで gem が生成されます。

public/gems/rails-assets-select2-4.0.3.gem

生成した gem を展開します

$ gem unpack public/gems/rails-assets-select2-4.0.3.gem

差分を比較する

差分を確認してみます。

$ diff -r {1. rails-assets から gem を生成したもの} {2. rails-assets を Gemfile に書いてインストールされたもの}

動作確認

  • GitHub のリポジトリを新設
  • bundle install して動作確認

これで rails-assets の gem を使ってる箇所を確認できれば、OKです。

gem を生成した後、ローカルの gem を bundle install できるようにする

ここはおまけなので、別記事で書きます。(多分)

最後に

こういう作業は、もうやりたくないですね。

参考

assign を使ってみる (C++)

2020-07-18

確認環境

$ g++ --version
g++ (Homebrew GCC 9.2.0) 9.2.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

調査

test.cpp

#include <bits/stdc++.h>
#include <cassert>
using namespace std;

int main() {
    vector<int> v;
    // 5個の要素を値10で埋める
    v.assign(5, 10);

    for (auto val : v) {
        cout << val << " ";
    }
    cout << endl;

    cout << "---" << endl;
    // 2個の要素に置き換える
    vector<int> before_v = {5, 4, 3, 2, 1};
    v.assign(before_v.begin(), before_v.begin() + 2);
    for (auto val : v) {
        cout << val << " ";
    }
    cout << endl;
}

出力結果

10 10 10 10 10
---
5 4

参考

gem を複数バージョンでテストするため、appraisal を使ってみる

2020-07-12

やったこと

例えば、ある gem で複数の Rails で動かすために、 複数バージョンでテスト (rspec) を実行したいとします。

そんな時に、この gem を使います。

今回は、下記でテスト (rspec) を実行できるようにします。

  • Rails 5.1.0
  • Rails 5.2.3
  • Rails 6.0.0

確認環境

$ ruby --version
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin17]

$ rails --version
Rails 5.2.3

調査

Github にある通りにセットアップしていきます。

Appraisals ファイルの準備

Appraisals

appraise "rails-5.1.0" do
  gem "rails", "5.1.0"
end

appraise "rails-5.2.3" do
  gem "rails", "5.2.3"
end

appraise "rails-6.0.0" do
  gem "rails", "6.0.0"
  gem "sqlite3", "~> 1.4"
end

インストール

Gemfile

group :development do
  # 省略...
  gem 'appraisal'
end

In your package's .gemspec 今回は Gemfile に書きました。

$ bundle install
$ bundle exec appraisal install

テストファイル用意

spec/models/task2_spec.rb

require 'rails_helper'

RSpec.describe Task, type: :model do
  it '計算1 should' do
    (1 + 2).should eq 3
  end

  it '計算2 expect' do
    expect(3 + 4).to eq 7
  end
end

テスト実行

$ RAILS_ENV=test bundle exec appraisal rspec spec/models/task2_spec.rb

これで、Appraisals ファイルに記述してある3種類の Rails バージョンで rspec が実行されます。

ラジアンと角度の変換をする (C++)

2020-07-11

確認環境

$ g++ --version
g++ (Homebrew GCC 9.2.0) 9.2.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

調査

test.cpp

#include <bits/stdc++.h>
using namespace std;

int main() {
    // degree -> radian
    double target_degree = 45;
    double radian = target_degree * M_PI / 180.0;
    printf("radian: %.10f\n", radian);

    // radian -> degree
    double degree = radian * 180.0 / M_PI;
    printf("degree: %.10f\n", degree);
}

出力結果

radian: 0.7853981634
degree: 45.0000000000

std::prev, std::next を使ってみる (C++)

2020-07-09

確認環境

$ g++ --version
g++ (Homebrew GCC 9.2.0) 9.2.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

調査

test.cpp

#include <bits/stdc++.h>
using namespace std;

int main() {
    vector<int> v = {5, 3, 2, 9, 8};

    auto iter = v.begin();
    cout << "begin(): " << *iter << endl;
    iter = next(iter);
    cout << "begin() + next1回: " << *iter << endl;
    iter = next(iter);
    cout << "begin() + next2回: " << *iter << endl;

    iter = prev(iter);
    cout << "begin() + next2回 + prev1回: " << *iter << endl;

    // この指定だと2回進む
    iter++;
    iter += 1;
    cout << "begin() + next2回 + prev1回 + 2回進む " << *iter << endl;
}

出力結果

begin(): 5
begin() + next1回: 3
begin() + next2回: 2
begin() + next2回 + prev1回: 3
begin() + next2回 + prev1回 + 2回進む 9

参考

vector::front, vector::back を使ってみる (C++)

2020-07-08

確認環境

$ g++ --version
g++ (Homebrew GCC 9.2.0) 9.2.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

調査

test.cpp

#include <bits/stdc++.h>
using namespace std;

int main() {
    vector<int> v = {5, 3, 2, 9, 8};

    cout << "v.front(): " << v.front() << endl;
    cout << "v.back(): " << v.back() << endl;

    // インデックス直接指定でもできる
    cout << "v[0]: " << v[0] << endl;
    cout << "v[v.size() - 1]: " << v[v.size() - 1] << endl;
}

出力結果

v.front(): 5
v.back(): 8
v[0]: 5
v[v.size() - 1]: 8

参考