強欲で謙虚なツボツボ

趣味の読書の書の方

備忘録(Ruby)

Rspecのfill_in

フォームのテキストフィールドに値を挿入

<label for="name">氏名</label>
<input type="text" />
fill_in 'メールアドレス', with: '山田太郎' (ラベルの指定だと上手くいかないこともそこそこある)
fill_in 'name', with: '山田太郎' //(id指定の方が確実)

 

Rspecのselect

フォームのセレクトボックスで選択

<label for="prefecture">都道府県</label>
<select id="prefecture">
  <option value="1">北海道</option>
  <option value="2">岩手県</option>
  <option value="3">青森県</option>
</select>
select '北海道', from: '都道府県'
select '北海道', from: 'prefecture' #(id指定の方が確実)
find("#prefecture").find("option[value='1']").select_option #(一番確実)

 

Rspecのchoose

ラジオボタンをクリック

<label>
  <input id="gender_male" name="gender" type="radio" value="male">男性
</label>
<label>
  <input id="gender_female" name="gender" type="radio" value="female">女性
</label>
choose '男性'

 

Rspecのcheckとuncheck

チェックボタンをチェック

<label>利用規約</label>
  <input type="checkbox" id="rule" value="1" />
</label>
check '利用規約'
uncheck '利用規約'

 

routeでサブドメイン設定

Rails.application.routes.draw do
  constraints subdomain: 'admin' do
    resources :admin
  end
  constraints subdomain: '' do
    resources :user
  end
end

# admin.example.com/sign_inだと/admin/sign_in
# example.com/sign_inだと/user/sign_in
# みたいな感じ

備忘録(jQuery)

jQuery

not

取得する要素の除外条件

<p>aaa</p>
<p class="not">bbb</p>
<p>ccc</p>

const p = $('p').not('not')
console.log(p)
=> [<p>aaa</p>, <p>ccc</p>]

 

each

取得した要素の繰り返し処理

<p>aaa</p>
<p class="not">bbb</p>
<p>ccc</p>

$('p').not('not').each((index, element) => {
console.log(index, element)
}
=> 0 <p>aaa</p>
1 <p>bbb</p>

 

attr

要素の属性を操作する

<p>aaa</p>
<p class="not">bbb</p>
<p>ccc</p>

$('p').not('not').each((index, element) => {
$(element).attr('class', 'aiueo')
}
console.log($('p'))
=> [<p class="aiueo">aaa</p>, <p class="not">bbb</p>, <p class="aiueo">ccc</p>]

 

removeAttr

要素の属性を削除する

<p class="aiueo">aaa</p>
<p class="not">bbb</p>
<p class="aiueo">ccc</p>

$('.aiueo').each((index, element) => {
$(element).removeAttr('class')
}
console.log($('p'))
=> [<p>aaa</p>, <p class="not">bbb</p>, <p>ccc</p>]

備忘録(Python)

Python

String[i:j]

文字列を切り出す

word = "hello world"
word[2:6]
=> 'llo '
word[:3]
=> 'hel'
word[9:]
=> 'ld'
word[:]
=> 'hello world'
word[-5:-1]
=> 'world'
word[2:2]
=> ''

 

値 in List

Listが値を要素に含むかどうか

l = ['aaa', 'bbb']
'aaa' in l
=> True
'ccc' in l
=> False

 

List.extend(List)

Listを結合

l1 = ['aaa', 'bbb']
l2 = ['ccc', 'ddd']
l1.extend(l2)
print(l1)
=> ['aaa', 'bbb', 'ccc', 'ddd']

 

del List[i:j]

Listのインデックスが[i, j)の要素を削除

l = ['aaa', 'bbb', 'ccc']
del l[1:2]
print(l)
=> ['aaa', 'ccc']

備忘録(Ruby)

Ruby

params.require(:モデル).permit(:カラム)

Rails 4以降のストロングパラメータという新機能
フォームの入力などをPOSTで受け取る時のパラメータを制限するようなもので、予期せぬパラメータを受け取らないようなセキュリティとなる
controllerにて記述

# nameとemailを属性にもつUserモデルが定義済みだとする

# フォームで{ "name": "hoge"," email": "mail@mail.com", "password": "1234qwer" }がPOSTでsubmitされた場合

# その1: nameというパラメータしか受け取らない
def user_params
  params.require(:user).permit(:name)
end
=> {
  name: "hoge"
}

# その2: nameとemailというパラメータしか受け取らない
def user_params
  params.require(:user).permit(:name, :email)
end
=> {
  name: "hoge",
  email: "mail@mail.com"
}

備忘録(Ruby、Firebase CLI)

Ruby

&.

レシーバがnilの時にエラーでなくてnilを返す
present?とかでネストを増やさなくて良くなるから便利

x = nil
x.length
=> NoMethodError
x&.length
=> nil

Array.map

配列の各項に同様の処理をして返す

[1, 2, 3].map { |x| x * 2 }
=> [2, 4, 6]

Array.include? Array.exclude?

配列に含まれる(含まれない)場合はtrueを返す。そうでない場合はfalseを返す
!Array.include?とかは使いたくない

[1, 2, 3].include?(1)
=> true
[1, 2, 3].exclude?(4)
=> true

 

Firebase CLI

firebase.projects.list

ログイン中のアカウントが参加しているプロジェクト一覧
参照中のプロジェクトは(current)と表示される

firebase projects:list
=> Preparing the list of your Firebase projects
| Project Display Name | Project ID        | Project Number | Resource Location ID |
| test                 | id_test (current) | 111122223333   | asia-northeast1      |
| hoge                 | id_hoge           | 123456789012   | asia-northeast1      |

firebase.target

参照しているプロジェクトのIDを返す

firebase target
=> Resource targets for id_test

firebase use {Prohect ID}

参照するプロジェクトを変更する

firebase use id_hoge
=> Now using project id_hoge

firebase functions:config:set {config}

Firebase Cloud Functionsで使用される環境変数を設定する
実際functionsで使う時はfunctions.config()で取得できる

firebase functions:config:set api.key="apikey" server.host="localhost" server.port="8080"

firebase functions:config:get

Firebase Cloud Functionsの環境変数を取得する

firebase functions:config:get
=> {
    "api": {
        "key": "apikey"
    },
    "server": {
        "host": "localhost",
        "port": "8080",
    }
}

【環境構築】Ubuntuでもpyenvでpythonを扱いたい

概要

普段はmacを使用していてpythonはhomebrewによってインストールしたpyenvを用いて扱っている。macpythonをインストールする記事でも大抵はpyenvを紹介している。
windowsのPCからmacで作成したソースコードを操作することもしばしばあるので、同様の操作によって扱えるようにするためにpyenvをインストールする。

windowsUbuntu(WSL2)を使えるようにする手順は以下記事の下部に書いた。

taopo.hatenablog.com

 

手順

説明を省いた手順。手順の詳細が必要な場合はここから

# install pyenv
$ curl https://pyenv.run | bash

$ echo 'export PATH="$HOME/.pyenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(pyenv init --path)"' >> ~/.bash_profile
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
$ echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bash_profile

# WSL2でインストールしたUbuntuを使用している場合は、curlではなくwgetを使用するようにパッケージのソースコードに手を加える
$ vi ~/.plugins/python-build/bin/python-build
detect_http_client() {
  local client
  # for client in aria2c curl wget; do    この行をコメントアウト
  for client in aria2c wget curl; do      この行を追加
    if type "$client" &>/dev/null; then
      echo "$client"
      return
    fi
  done
  echo "error: please install \`aria2c\`, \`curl\`, or \`wget\` and try again" >&2
  return 1
}

# pyenvの依存関係を満足させる
$ sudo apt-get update; sudo apt-get install make build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm \
libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev

# install python by pyenv
$ pyenv install 3.9.9
$ pyenv local 3.9.9

 

pyenvをインストール

gitに公開されているので手順に従うのみ。
https://github.com/pyenv/pyenv#installation

Ubuntuなので、Automatic installerもしくはBasic GitHub Checkoutから好きな方を選べばよいと思う。僕はAutomatic installerにした。
https://github.com/pyenv/pyenv-installer

$ curl https://pyenv.run | bash

下記を.bashrc(.zshrc)に追記。

export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init --path)"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

 

pyenvの使い方はこちらを参照。
local, global, install, versions 辺りをよく使う。

github.com

 

pyenv install x.x.xを実行したときのエラー対応

pyenv install x.x.xを実行するとエラーが出て失敗するので以下の対応をしておく。

1つ目(おそらくWSL2でインストールしたUbuntuを使用している場合のみ)

WSL2でインストールしたUbuntuを使用している場合、pyenvでpythonをインストールする際のcurlが悪さをして上手くいかない。(以下のようにtimeoutして失敗します。)

f:id:taopo:20211222022418j:plain

wgetであれば通るということなので、pyenvのソースコードの一部差し換えを行う。

pyenvがインストールされた~/.pyenv内をdetect_http_clientで検索すると、plugins/python-build/bin/python-buildに該当箇所があるとわかるので、以下のように差し換える。

detect_http_client() {
  local client
  # for client in aria2c curl wget; do
  for client in aria2c wget curl; do
    if type "$client" &>/dev/null; then
      echo "$client"
      return
    fi
  done
  echo "error: please install \`aria2c\`, \`curl\`, or \`wget\` and try again" >&2
  return 1
}

こちらが参考になりました。WSLでのUbuntuに関する他の対応も書かれているので参考になる人が多そうです。

koideforest.hatenadiary.com

2つ目(依存パッケージをインストール)

次に依存関係が満たされていないとmake: command not foundのように失敗するのでmake等をインストールするが、pyenvが依存するパッケージは公式に明記されているのでこれに従ってインストールする。

$ sudo apt-get update; sudo apt-get install make build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm \
libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev

 

pythonをインストール

最後にpyenvを使ってpythonをインストールする。インストール可能なpythonのバージョンはpyenv install --listで確認できる。

$ pyenv versions
* system (set by /home/username/.pyenv/version)

$ pyenv install 3.9.9
Downloading Python-3.9.9.tar.xz...
-> https://www.python.org/ftp/python/3.9.9/Python-3.9.9.tar.xz
Installing Python-3.9.9...
Installed Python-3.9.9 to /home/username/.pyenv/versions/3.9.9

$ pyenv versions
* system (set by /home/username/.pyenv/version)
  3.9.9

$ pyenv local 3.9.9
$ pyenv versions
  system
* 3.9.9 (set by /mnt/c/Users/username/Program/salesman/.python-version)

$ python -V
Python 3.9.9

$ pip -V
pip 21.2.4 from /home/username/.pyenv/versions/3.9.9/lib/python3.9/site-packages/pip (python 3.9)

これにて完了。

【環境構築】Macでhomebrewでpyenvでpython3系(+ pyenvでの)

概要

タイトルそのまま。
最近pcを購入時に初期化したのでpythonを入れた。

 

順番

  1. homebrewでpyenvをインストール
  2. pyenvで好きなpythonのバージョンをインストール
  3. よく使うパッケージをインストール

 

1. homebrewでpyenvをインストール

とりあえず、現状を確認。
2系が入ってるけど使いづらいから3系がいい。

$ python --version
Python 2.7.16
$ which python
/usr/bin/python

パスを設定。これをするととpyenvでインストールしたpythonが使える。

$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
$ echo 'eval "$(pyenv init -)"' >> ~/.zshrc
~/.zshrc $ source ~/.zshrc

homebrewでpyenvをインストール。

$ brew install pyenv
$ pyenv -v
pyenv 2.2.2

 

2. pyenvでpythonをインストール

最新バージョンだとパッケージによってはまだ対応できてなかったりするので一応3.9にしておく。3.9がダメだったらpyenvで3.8にすればいい。

$ pyenv install 3.9.9
$ pyenv versions
* system (set by /Users/ユーザー/.pyenv/version)
  3.9.9
$ pyenv global 3.9.9
$ python --version
2.7.16 # あれ?????????

何か3.9.9になってないんだけど。
どうやらpyenvをインストールする際に自動でzshrcに追記されるものが追記できていなかった模様。

$ echo 'eval "$(pyenv init --path)"' >> ~/.zshrc $ python --version 3.9.9 # やったね!!!!!!! $ pip --version pip 21.4.4 # pipも使える

3. よく使うパッケージをインストール

とりあえずnumpy, pandas, jupyter notebookをpip install

$ pip install notebook numpy pandas
$ jupyter notebook

ここで、pythonでimport pandasを実行したらwarningが出ることがある。

/Users/ユーザー名/.pyenv/versions/3.9.9/lib/python3.9/site-packages/pandas/compat/__init__.py:124: UserWarning: Could not import the lzma module. Your installed Python is incomplete. Attempting to use lzma compression will result in a RuntimeError.warnings.warn(msg)

pyenvでpythonをインストールしているとこのwarningが出力されるということらしい。
対応方法はxzをインストール、もしくはpandasのバージョンを幾ばくか下げるといいとのこと。
ここではxsをインストールした後、pythonをインストールし直す方針を採用する。

$ brew intall xz
$ pyenv uninstall python 3.9.9
$ pyenv install python 3.9.9

出典: https://zenn.dev/grahamian/articles/f292163325653dbe2c42

 

終わり

これで終わり。
バージョンを変えたくなったらpyenvで違うバージョンをインストールしてglobalとかlocalに設定すればいい。