備忘録(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を用いて扱っている。macでpythonをインストールする記事でも大抵はpyenvを紹介している。
windowsのPCからmacで作成したソースコードを操作することもしばしばあるので、同様の操作によって扱えるようにするためにpyenvをインストールする。
windowsでUbuntu(WSL2)を使えるようにする手順は以下記事の下部に書いた。
手順
説明を省いた手順。手順の詳細が必要な場合はここから。
# 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)に追記。
pyenvの使い方はこちらを参照。
local, global, install, versions 辺りをよく使う。
pyenv install x.x.xを実行したときのエラー対応
pyenv install x.x.xを実行するとエラーが出て失敗するので以下の対応をしておく。
1つ目(おそらくWSL2でインストールしたUbuntuを使用している場合のみ)
WSL2でインストールしたUbuntuを使用している場合、pyenvでpythonをインストールする際のcurlが悪さをして上手くいかない。(以下のようにtimeoutして失敗します。)
wgetであれば通るということなので、pyenvのソースコードの一部差し換えを行う。
pyenvがインストールされた~/.pyenv内をdetect_http_clientで検索すると、plugins/python-build/bin/python-buildに該当箇所があるとわかるので、以下のように差し換える。
こちらが参考になりました。WSLでのUbuntuに関する他の対応も書かれているので参考になる人が多そうです。
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を入れた。
順番
- homebrewでpyenvをインストール
- pyenvで好きなpythonのバージョンをインストール
- よく使うパッケージをインストール
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を使ってみることにした。
購入物
適当に価格.comで一位だったやつを買った。
評判が一番いいのはSanDiskのエクストリームとかいうやつっぽい。
繋げてみる
届いたので早速PCに繋いでみる。
「USB外部物理ボリューム」とならない場合は、一度「消去」をやってからまた繋ぎ直すといいらしい。
Docker Imageの保存先を移そう
なんか色々とdockerでやるようになってから容量がイカれ始めた気がするので、まずはそれを解消するために、イメージの保存場所をSSD内に変更する。
ただ、Docker imageが全部消えてしまうのでそこはやり直さないといけない。
SSD内にdocker_imagesフォルダを作成して、Docker Imageの保存先を変更する。
Apply & Restartを押してしばらく待つと...
終わり
めでたく容量を空けることができました。
イメージやコンテナは全部消えてしまうので、また作り直さないといけないけどdockerならすぐにできるね。
はてなブログ(無料版)でGoogleアドセンスを利用してみたい
概要
いつも月間PVが10~20とかだったのに最近は300くらいあったりするし、広告とかやってみるか。
審査があるけど通るかは知らない。とりあえず審査に出すところまでをやってみる。
Googleアナリティクスは結構前に入れてみたが、色々みれてまあまあ面白いかったしアドセンスも面白いはず。
公式ヘルプ
公式は正義だ。
審査のコツとか申請してみたとかあるが、公式のヘルプページがあるからそれに従う。
プライバシーポリシー
このページはCookieを利用します的なやつだ。
適当に検索してよさそうなやつをコピペして作った。
無料ユーザーなので推奨されてるサイドバーへのリンク追加だけやった。
Googleアドセンス
公式ヘルプがとても丁寧です。
公式以上のものを書けないので補足だけ書きます。
アカウント取得
ページ右上のご利用開始をクリック。
サイトのURLは無料版なら「xxx.hatenablog.com」ですかね。僕は「taopo.hatenablog.com」です。
審査の申請
進むとGoogleアドセンスのホームが表示されます。
「お支払い」と「サイト」が必須になっているので入力します。
終わり
アドセンスの登録はそんなにやることなくて簡単だった。
調べながら1時間くらいで終わった。
申請通ったら面白いけど、1円でも出たら確定申告することが増えて面倒そうだからすぐやめるかも。
追記: 2日待ったら審査通ってました。
プライバシーポリシー
プライバシーポリシー
個人情報の利用目的
当ブログでは、お問い合わせや記事へのコメントの際、名前やメールアドレス等の個人情報を入力いただく場合がございます。
取得した個人情報は、お問い合わせに対する回答や必要な情報を電子メールなどをでご連絡する場合に利用させていただくものであり、これらの目的以外では利用いたしません。
広告について
当ブログでは、第三者配信の広告サービス(Googleアドセンス)を利用しており、ユーザーの興味に応じた商品やサービスの広告を表示するため、Cookieを使用しております。
Cookieを使用することで当サイトはお客様のコンピュータを識別できるようになりますが、お客様個人を特定できるものではありません。
Cookieを無効にする方法やGoogleアドセンスに関する詳細は「広告 – ポリシーと規約 – Google」をご確認ください。
アクセス解析ツールについて
当ブログでは、Googleによるアクセス解析ツール「Googleアナリティクス」を利用しています。このGoogleアナリティクスはトラフィックデータの収集のためにCookieを使用しております。トラフィックデータは匿名で収集されており、個人を特定するものではありません。
お問い合わせについて
お問い合わせは当ブログ著者のTwitterアカウントへのDMやリプライをご利用ください。
【selenium + headless-chrome + docker】動かしてみる
概要
webのスクレイピングなどの自動操作でchromeをseleniumで動かそうとしたけど、chromeのバージョンに合わせてドライバーを選ばないといけないからPCによって動かなかったりchromeの更新で動かなかくなったりする。
Dockerを使えばイメージを作成した時から環境が変わることもなくて、そういう面倒なことを解消できそうなのでやってみることにした。
サーバや仮想環境内でchromeとか動かせるのかと思っていたけど、調べてみるとheadless-chromeというのでブラウザーのUIを出さずに実行できるらしい。
やったこと
以下の記事を参考に(コピペ)して起動したdockerのコンテナ内でchromeを実行する。
記事ではubuntu16.04だったが18.04でやった。
あと、いろいろエラーが出たので対応した。
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 任意のイメージ名 .
どうやらpythonのdistutilsというモジュールがないらしいのでDockerfileに追記。
# apt-get update && \ の下 apt-get install -y python3 curl python3-distutils && \
再度docker buildをするとまたエラーが出た。
どうやらwgetというのがないらしいのでDockerfileに追記。
# apt-get update && \ の下 apt-get install -y wget && \
再度docker buildをするとまたエラーが出た。
どうやらunzipというのがないらしいのでDockerfileに追記。
# apt-get update && \ の下 apt-get install -y unzip && \
再度docker buildをするとまたエラーが出た。
どうやら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をするとイメージ生成が成功した。
最終的な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というのを作る。
# 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が動作していることがわかる。