Rubyと筋肉とギターとわたし

筋トレが仕事です

【Rails】tips: date_selectヘルパーメソッドでmonth_format_stringを使ってみる

どうもてぃ。

検索してもなかなか事例がなかったのと、rubydocやgithubソースコードを見てもわかりにくかったのでメモとして残す。

環境

% cat /etc/lsb-release
DISTRIB_ID=LinuxMint
DISTRIB_RELEASE=19.3
DISTRIB_CODENAME=tricia
DISTRIB_DESCRIPTION="Linux Mint 19.3 Tricia"

TL;DR

f.date_select :month, include_blank: true, month_format_string: "%{number} ヶ月" , discard_year: true, discard_day: true

simple_form_forを使う場合

  = f.input :month, as: :date, include_blank: true, month_format_string: "%{number} ヶ月", discard_year: true, discard_day: true

参考にした子たち

date_select | Railsドキュメント

rails/date_helper.rb at f33d52c95217212cbacc8d5e44b5a8e3cdc6f5b3 · rails/rails · GitHub

Method: ActionView::Helpers::DateHelper#date_select — Documentation for rails (4.1.7)

終わり

わかりにくすぎて、しかも例もなくて死ぬかと思った。

【Rails】webpackerでcocoonを導入する

どうもてぃ。

あまり有用な記事がなかったので書いときます。

環境

% cat /etc/lsb-release
DISTRIB_ID=LinuxMint
DISTRIB_RELEASE=19.3
DISTRIB_CODENAME=tricia
DISTRIB_DESCRIPTION="Linux Mint 19.3 Tricia"

公式みたら解決

やっぱ何を解決するにも公式ですよね。

「webpacker cocoon」って調べても、ファイルダウンロードしてwebpacker対応のディレクトリに配置して下さい…みたいな記事が多かったですが

手順

github.com

Gemfileに以下を追記

gem "cocoon"

その後以下のコマンドを実行

$ bundle install

$ yarn add @nathanvda/cocoon

終わったらapp/javascripts/packs/application.jsへ以下を追記

require("jquery")
require("@nathanvda/cocoon")

これで完了。

おわり

導入簡単すぎわろた。

あとはhas_manyのモデルでfields_forを使って大量にフォームを複製しデータを作り散らかしましょう。

以下参考

www.y-hakopro.com

以上です。

【メモ】Vue.js: v-modelを書き換える

f:id:rdwbocungelt5:20210310094421j:plain

どうもてぃ。

最近Vueのキャッチアップを始めました。

業務委託先で使ってるのと、直近でRailsに乗せるのをjQueryからVueに変えたいと個人的に思っていてタイミングが良かったので勉強してます。

v-model

まずはv-modelの書き方から。

<template>
  <div>
    <label for="title">v-model</label>
    <input type="text" id="title" v-model="model.title" />
    <p>{{model.title}}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      model: {
        title: ''
      }
    }
  }
}
</script>

はい。特に書くことはないです。

v-modelの仕様が気になる方は公式を確認してみて下さい。

jp.vuejs.org

v-bindとv-onを使って書き換える

<template>
  <div>
    <label for="title">v-model</label>
    <input
      type="text"
      id="title"
      :value="model.title"
      @input="model.title = $event.target.value"
    />
    <p>{{ model.title }}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      model: {
        title: ''
      }
    }
  }
}
</script>

v-model部分が:value="~~~"@input="~~~"に変わってます。

もうちょっとかえてみる。

<template>
  <div>
    <label for="title">v-model</label>
    <input
      type="text"
      id="title"
      :value="model.title"
      @input="changeTitle($event)"
    />
    <p>{{ model.title }}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      model: {
        title: ''
      }
    }
  },
  methods: {
    changeTitle(e) {
      this.model.title = e.target.value
    }
  }
}
</script>

こうするとよりわかりやすいな。

v-modelの便利さがわかる書き換えでしたとさ。

おわり

Vue初心者のしょうもないメモなので、生暖かい目で見守っていただけると幸いです。

【Golang】tips: 正規表現を使用せず文字列内の全ての半角スペースを削除する

f:id:rdwbocungelt5:20200720165613p:plain

備忘録・tipsとして。

TL; DR

str := " Hello World "

fmt.Println(strings.Replace(str, " ", "", -1))
fmt.Println(strings.ReplaceAll(str, " ", ""))

strings.Replaceの仕様

golang.org

  • 第一引数: 対象の文字列
  • 第二引数: 置換する文字
  • 第三引数: 置換後の文字
  • 第四引数: 置換する文字数(-1であれば全て)

strings.ReplaceAllは第四引数が不要で、defaultが全部対象。

正規表現はパフォーマンスが悪いらしいので使用はなるべく避けましょう。

【docker】gcloud auth configure-dockerを行うとdocker buildができなくなる

f:id:rdwbocungelt5:20180816164743p:plain

どうもてぃ。

前回の記事でgcloudコマンドをPython3.8に対応させました。

smot93516.hatenablog.jp

今回の問題は、GCRへイメージをpushするためgcloud auth configure-dockerで認証を行った後に起こったことです。

調査から解決まで一連の流れを書いていこうと思います。

環境

言語関係のバージョン管理はasdfを使用しています。

% cat /etc/lsb-release 
DISTRIB_ID=LinuxMint
DISTRIB_RELEASE=19.3
DISTRIB_CODENAME=tricia
DISTRIB_DESCRIPTION="Linux Mint 19.3 Tricia"

% docker-compose -v
docker-compose version 1.27.4, build 40524192

% docker -v
Docker version 19.03.6, build 369ce74a3c

エラー内容

% docker-compose build
postgres uses an image, skipping
redis uses an image, skipping
Building web

ERROR: gcloud failed to load: /tmp/_MEIKPCrAH/libssl.so.1.1: version `OPENSSL_1_1_1' not found (required by /home/motty/.asdf/installs/python/3.8.1/lib/python3.8/lib-dynload/_ssl.cpython-38-x86_64-linux-gnu.so)
    gcloud_main = _import_gcloud_main()
    import googlecloudsdk.gcloud_main
    from googlecloudsdk.api_lib.iamcredentials import util as iamcred_util
    from googlecloudsdk.api_lib.util import apis_internal
    from googlecloudsdk.core import properties
    from googlecloudsdk.core import config
    from oauth2client import client
    from oauth2client import transport
    import httplib2
    from httplib2.python3.httplib2 import *
    import ssl
    import _ssl             # if we can't import it, let the error propagate

This usually indicates corruption in your gcloud installation or problems with your Python interpreter.

Please verify that the following is the path to a working Python 2.7 or 3.5+ executable:
    /home/motty/.asdf/installs/python/3.8.1/bin/python3

If it is not, please set the CLOUDSDK_PYTHON environment variable to point to a working Python 2.7 or 3.5+ executable.

If you are still experiencing problems, please reinstall the Cloud SDK using the instructions here:
    https://cloud.google.com/sdk/
Traceback (most recent call last):
  File "docker/credentials/store.py", line 80, in _execute
  File "subprocess.py", line 411, in check_output
  File "subprocess.py", line 512, in run
subprocess.CalledProcessError: Command '['/usr/bin/docker-credential-gcloud', 'get']' returned non-zero exit status 1.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "docker/auth.py", line 264, in _resolve_authconfig_credstore
  File "docker/credentials/store.py", line 35, in get
  File "docker/credentials/store.py", line 93, in _execute
docker.credentials.errors.StoreError: Credentials store docker-credential-gcloud exited with "".

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "bin/docker-compose", line 3, in <module>
  File "compose/cli/main.py", line 67, in main
  File "compose/cli/main.py", line 126, in perform_command
  File "compose/cli/main.py", line 302, in build
  File "compose/project.py", line 468, in build
  File "compose/project.py", line 450, in build_service
  File "compose/service.py", line 1125, in build
  File "docker/api/build.py", line 261, in build
  File "docker/api/build.py", line 308, in _set_auth_headers
  File "docker/auth.py", line 311, in get_all_credentials
  File "docker/auth.py", line 281, in _resolve_authconfig_credstore
docker.errors.DockerException: Credentials store error: StoreError('Credentials store docker-credential-gcloud exited with "".')
[29221] Failed to execute script docker-compose

暫定的な解決策

GCRへイメージをあげるのはある程度期間が空くため、暫定的にgcloud auth configure-dockerした際$HOME/.docker/config.jsonに追記される部分を削除すればdocker buildは上手く行きます。

・
・
・
  },
  "HttpHeaders": {
    "User-Agent": "Docker-Client/19.03.6 (linux)"
  },
  "credHelpers": {
    "gcr.io": "gcloud",
    "us.gcr.io": "gcloud",
    "eu.gcr.io": "gcloud",
    "asia.gcr.io": "gcloud",
    "staging-k8s.gcr.io": "gcloud",
    "marketplace.gcr.io": "gcloud"
  }
}

credHelpers部分を削除します。これで一時的に解決できます。

この部分はgcloud auth configure-dockerを実行すれば再度同じものが追記されるので安心して下さい。

根本的な解決策

おそらくOSXwindowsユーザーは起きてないのではないかと思います。

自分の環境がUbuntuのため同じような現象に悩む人がいたようです。issueがありました。

github.com

要約すると...

  • gcloudのバージョンを297.0.1にダウングレードする
  • 環境変数CLOUDSDK_PYTHONを設定する
  • LD_LIBRARY_PATHを/usr/local/libに設定する

この三点です。

手順を下に記載します。

% sudo apt install google-cloud-sdk=297.0.1-0

% which python
# => /home/motty/.asdf/shims/python

% export CLOUDSDK_PYTHON=/home/motty/.asdf/shims/python

% export LD_LIBRARY_PATH=/usr/local/lib

これで無事docker buildが通るようになりました。

終わり

やったね。

追記

解決したかと思いきや、今の所ランダムで起きてます…どうしたらいいんだこれ…

何か解決策が出てきたらまた記事にしたいと思います。

てなわけで買って下さい。超おすすめの本たちです。 ↓

【gcloud】Python3.8に対応したgcloudコマンドをインストールしたい

どうもてぃ。

久々にブログ書きます。

以前インストールしたgcloudコマンドがpython 2.7に依存するもので、gcloudコマンドを使用するたび毎回pythonのバージョンを切り替えるのクソだるかったためバージョンアップしました。

環境

% lsb_release -a
No LSB modules are available.
Distributor ID: LinuxMint
Description:    Linux Mint 19.3 Tricia
Release:    19.3
Codename:   tricia

% python -V
Python 3.8.1

やったこと

とりあえず公式にのっとって再インストールする

cloud.google.com

初期化

インストールが一通り終わったのでgcloud init

% gcloud init
ERROR: gcloud failed to load: No module named '_sqlite3'
    gcloud_main = _import_gcloud_main()
    import googlecloudsdk.gcloud_main
    from googlecloudsdk.calliope import cli
    from googlecloudsdk.calliope import backend
    from googlecloudsdk.calliope import parser_extensions
    from googlecloudsdk.core.updater import update_manager
    from googlecloudsdk.core.updater import installers
    from googlecloudsdk.core.credentials import store
    from googlecloudsdk.core.credentials import creds as c_creds
    import sqlite3
    from sqlite3.dbapi2 import *
    from _sqlite3 import *

This usually indicates corruption in your gcloud installation or problems with your Python interpreter.

Please verify that the following is the path to a working Python 2.7 or 3.5+ executable:
    /home/motty/.asdf/installs/python/3.8.1/bin/python3

If it is not, please set the CLOUDSDK_PYTHON environment variable to point to a working Python 2.7 or 3.5+ executable.

If you are still experiencing problems, please reinstall the Cloud SDK using the instructions here:
    https://cloud.google.com/sdk/
~ 

ぱっとみsqlite3が入ってないから起こってるっぽい。

対応

確かpythonはその時の状態でビルドされるため、aptsqlite関連のパッケージをインストールしたとしてもpython自体に反映されないはず。

なので、念の為aptで入れた後、pythonをインストールし直す。

ちなみに自分は言語系はasdfで管理しています。

% sudo apt-get install libsqlite3-dev libbz2-dev libncurses5-dev libgdbm-dev liblzma-dev libssl-dev tcl-dev tk-dev libreadline-dev

% asdf uninstall python 3.8.1

% asdf install python 3.8.1

かんりょぉぉおおおおおおおおおおおおお

うまくいったぜ

% gcloud init

Welcome! This command will take you through the configuration of gcloud.

Settings from your current configuration [default] are:
core:
  account: hogehogehogehoge@hoge.com
  disable_usage_reporting: 'True'
  project: hogehogehoge

Pick configuration to use:
 [1] Re-initialize this configuration [default] with new settings 
 [2] Create a new configuration
Please enter your numeric choice:  

pythonのエラー関連は割りかしハマりますね。

とりあえずgcloudコマンドがアップグレード出来てよかった。

【備忘録】docker images noneなイメージを全て削除したい

f:id:rdwbocungelt5:20180816164743p:plain

TL;DR

% docker images | grep none | xargs docker rmi `awk '{ print $3 }'`

conflictが起きて削除できないとき

Error response from daemon: conflict: unable to delete 78ef4af0ce83 (must be forced) - image is referenced in multiple repositories

上みたいなエラーが出たときは、-fで強制的に削除してやりましょう

% docker images | grep none | xargs docker rmi -f `awk '{ print $3 }'`