強欲で謙虚なツボツボ

趣味の読書の書の方

備忘録(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に設定すればいい。

【外付けSSD】MacでDockerイメージを外へ

概要

最近、容量の空きがあと僅かだから整理しろとかいうバッジ通知が頻繁に表示される。
他にも、容量不足だから強制終了させるアプリを選べとかもよく出てくる。
今まではなんとかやれていたけど、どうしても必要なものがあって無理になったから外付けSSDを使ってみることにした。

f:id:taopo:20211021151854p:plain

パンパンでやばい

 

購入物

適当に価格.comで一位だったやつを買った。

【価格.com】外付けSSD | 通販・価格比較・製品情報

評判が一番いいのはSanDiskのエクストリームとかいうやつっぽい。

 

繋げてみる

届いたので早速PCに繋いでみる。

f:id:taopo:20211021151936p:plain

1TB!!

「USB外部物理ボリューム」とならない場合は、一度「消去」をやってからまた繋ぎ直すといいらしい。

Docker Imageの保存先を移そう

なんか色々とdockerでやるようになってから容量がイカれ始めた気がするので、まずはそれを解消するために、イメージの保存場所をSSD内に変更する。
ただ、Docker imageが全部消えてしまうのでそこはやり直さないといけない。

SSD内にdocker_imagesフォルダを作成して、Docker Imageの保存先を変更する。

f:id:taopo:20211021160602p:plain

Preferences > Resources > Advanced > Disk image location

 

Apply & Restartを押してしばらく待つと...

f:id:taopo:20211021162707p:plain

容量が空いた!!

f:id:taopo:20211021162723p:plain

Docker imageの保存場所が作成されてる

 

終わり

めでたく容量を空けることができました。
イメージやコンテナは全部消えてしまうので、また作り直さないといけないけどdockerならすぐにできるね。

せっかく買ったし、外付けSSDUbuntuを入れるとか色々できたら楽しいかも。

はてなブログ(無料版)でGoogleアドセンスを利用してみたい

概要

いつも月間PVが10~20とかだったのに最近は300くらいあったりするし、広告とかやってみるか。
審査があるけど通るかは知らない。とりあえず審査に出すところまでをやってみる。
Googleアナリティクスは結構前に入れてみたが、色々みれてまあまあ面白いかったしアドセンスも面白いはず。

 

公式ヘルプ

公式は正義だ。
審査のコツとか申請してみたとかあるが、公式のヘルプページがあるからそれに従う。

help.hatenablog.com

 

プライバシーポリシー

このページはCookieを利用します的なやつだ。
適当に検索してよさそうなやつをコピペして作った。
無料ユーザーなので推奨されてるサイドバーへのリンク追加だけやった。

プライバシーポリシー - 強欲で謙虚なツボツボ

サイドバーにモジュールを設置する - はてなブログ ヘルプ 

f:id:taopo:20210920131151p:plain

プライバシーポリシーへのリンクをサイドバーに設置

 

Googleアドセンス

公式ヘルプがとても丁寧です。
公式以上のものを書けないので補足だけ書きます。

アカウント取得

ページ右上のご利用開始をクリック。
サイトのURLは無料版なら「xxx.hatenablog.com」ですかね。僕は「taopo.hatenablog.com」です。

Google AdSense - ウェブサイトを収益化

審査の申請

進むとGoogleアドセンスのホームが表示されます。
「お支払い」と「サイト」が必須になっているので入力します。

f:id:taopo:20210920132813p:plain

Googleアドセンスのホーム画面(ブックマークしておくといいかも)

f:id:taopo:20210920133905p:plain

設定したら審査中になった

 

終わり

アドセンスの登録はそんなにやることなくて簡単だった。
調べながら1時間くらいで終わった。
申請通ったら面白いけど、1円でも出たら確定申告することが増えて面倒そうだからすぐやめるかも。

追記: 2日待ったら審査通ってました。

プライバシーポリシー

プライバシーポリシー

個人情報の利用目的

当ブログでは、お問い合わせや記事へのコメントの際、名前やメールアドレス等の個人情報を入力いただく場合がございます。
取得した個人情報は、お問い合わせに対する回答や必要な情報を電子メールなどをでご連絡する場合に利用させていただくものであり、これらの目的以外では利用いたしません。

広告について

当ブログでは、第三者配信の広告サービス(Googleアドセンス)を利用しており、ユーザーの興味に応じた商品やサービスの広告を表示するため、Cookieを使用しております。
Cookieを使用することで当サイトはお客様のコンピュータを識別できるようになりますが、お客様個人を特定できるものではありません。

Cookieを無効にする方法やGoogleアドセンスに関する詳細は「広告 – ポリシーと規約 – Google」をご確認ください。

アクセス解析ツールについて

当ブログでは、Googleによるアクセス解析ツール「Googleアナリティクス」を利用しています。このGoogleアナリティクスはトラフィックデータの収集のためにCookieを使用しております。トラフィックデータは匿名で収集されており、個人を特定するものではありません。

 

お問い合わせについて

お問い合わせは当ブログ著者のTwitterアカウントへのDMやリプライをご利用ください。

ぢ (@pvYuWQykF52nTNy) | Twitter

【selenium + headless-chrome + docker】動かしてみる

概要

webのスクレイピングなどの自動操作でchromeseleniumで動かそうとしたけど、chromeのバージョンに合わせてドライバーを選ばないといけないからPCによって動かなかったりchromeの更新で動かなかくなったりする。
Dockerを使えばイメージを作成した時から環境が変わることもなくて、そういう面倒なことを解消できそうなのでやってみることにした。
サーバや仮想環境内でchromeとか動かせるのかと思っていたけど、調べてみるとheadless-chromeというのでブラウザーのUIを出さずに実行できるらしい。

developers.google.com

 

やったこと

  • Docker Desktop for Mac をインストール
  • Dockerfileを作成
  • コンテナ内で実行するpythonファイルを作成

以下の記事を参考に(コピペ)して起動したdockerのコンテナ内でchromeを実行する。
記事ではubuntu16.04だったが18.04でやった。
あと、いろいろエラーが出たので対応した。

qiita.com

 

Docker Desktop for Macをインストール

チップがintel製かApple製かで間違えないように。
「このMacについて」のプロセッサを見るとintelとか書いてある。
最近のだとApple製のM1チップというのが使われているらしい。

Install Docker Desktop on Mac | Docker Documentation

 

Dockerfileを作成(エラー対応)

適当なディレクトリを作成してDockerfileを記述。
まずは、上であげた参考記事のDockerfileをそのまま使う

From ubuntu18.0.4
# ... 略 ...
RUN groupadd -g 1000 developer && \
    useradd  -g      developer -G sudo -m -s /bin/bash 作成したいユーザー名 && \
    echo '作成したいユーザー名:そのパスワード' | chpasswd
# ... 略 ...
User 作成したいユーザー名
# ... 略 ...

dockerのイメージを作成するとエラーが出た。

docker build -t 任意のイメージ名 .

f:id:taopo:20210818134238p:plain

エラーログの上の方

f:id:taopo:20210818134352p:plain

エラーログの最後

どうやらpythonのdistutilsというモジュールがないらしいのでDockerfileに追記。

    # apt-get update && \ の下
    apt-get install -y python3 curl python3-distutils && \

再度docker buildをするとまたエラーが出た。

f:id:taopo:20210818134830p:plain

エラーログの最後

どうやらwgetというのがないらしいのでDockerfileに追記。

    # apt-get update && \ の下
    apt-get install -y wget && \

再度docker buildをするとまたエラーが出た。

f:id:taopo:20210818135100p:plain

エラーログの最後

どうやらunzipというのがないらしいのでDockerfileに追記。

    # apt-get update && \ の下
    apt-get install -y unzip && \

再度docker buildをするとまたエラーが出た。

f:id:taopo:20210818135234p:plain

エラーログの最後

どうやらchromeをインストールするのに必要なパッケージが足りていないらしいのでDockerfileに追記。

    # touch /etc/default/google-chrome && \ の上
    apt-get install -y libatk-bridge2.2-0 libatspi2.2-0 libgbm1 libgtk-3-0 libxkbcommon0 && \

再度docker buildをするとイメージ生成が成功した。

f:id:taopo:20210818135553p:plain

dockerイメージの生成に成功

最終的なDockerfile。不要なパッケージのインストールもあるかもしれない

FROM ubuntu:18.04

# Install.
RUN \
  apt-get update && \
  apt-get install -y wget && \
  apt-get install -y unzip && \
  apt-get install -y python3 curl python3-distutils && \
  curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py && \
  python3 get-pip.py && \
  pip install --upgrade pip && \
  pip install selenium && \
  pip install beautifulsoup4 && \
  apt-get install -y libfontconfig && \
  mkdir -p /home/root/src && cd $_ && \
  wget -q -O /tmp/chromedriver.zip http://chromedriver.storage.googleapis.com/`curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE`/chromedriver_linux64.zip && \
  unzip /tmp/chromedriver.zip chromedriver -d /usr/local/bin/ && \
  apt-get install -y libappindicator1 fonts-liberation libasound2 libnspr4 libnss3 libxss1 lsb-release xdg-utils && \
  apt-get install -y libatk-bridge2.0-0 libatspi2.0-0 libgbm1 libgtk-3-0 libxkbcommon0 && \
  touch /etc/default/google-chrome && \
  wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb && \
  dpkg -i google-chrome-stable_current_amd64.deb && \
  apt-get install -y fonts-migmix

RUN apt-get install -y sudo

# add sudo user
RUN groupadd -g 1000 developer && \
    useradd  -g      developer -G sudo -m -s /bin/bash 作成したいユーザー名 && \
    echo '作成したいユーザー名:作成したいパスワード' | chpasswd

RUN echo 'Defaults visiblepw'          >> /etc/sudoers
RUN echo '作成したいユーザー名 ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers

# Set japanese
RUN apt-get install -y language-pack-ja-base language-pack-ja
RUN locale-gen ja_JP.UTF-8

# Set environment variables.
ENV LANG ja_JP.UTF-8
ENV PYTHONIOENCODIND utf_8

USER 作成したいユーザー名

# Define default command.
CMD ["/bin/bash"]

 

コンテナ内で実行するpythonファイルを作成

適当にmain.pyというのを作る。

f:id:taopo:20210818140039p:plain

ファイルの場所(どこでもいい)
# main.py
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument('--headless')
options.add_argument('--disable-gpu')
driver = webdriver.Chrome(chrome_options=options)
driver.get('https://www.google.com')
print(driver.title)

これをdockerコンテナ内で実行するとhttps://www.google.comのタイトルタグ、つまりGoogleと表示されるはず。

さっき作成したイメージからコンテナを起動。

docker run --privileged -v "Dockerfileを作成したディレクトリのパス:/home/Dockerfileに記述した作成したいユーザー名" -ti 作成したイメージの名前

Dockerfileで作成したユーザー(今回はotam)があって、-vで指定したホスト側のディレクトリがボリュームされている。
そして、pythonファイルを実行するとGoogleと表示されるので正常にselenium + headless-chromeが動作していることがわかる。

f:id:taopo:20210818140718p:plain

main.pyを実行するとGoogleと表示される

 

終わりに

とりあえず良さそうで安心した。
次はログインとかCookieを保存してリクエスト結果を見たりしてみたい。