wordpressを続ける理由

ちょいと整理。

メリット

・ドメインを取る、証明書を取る、AWSを使う、GAを入れるなどいろんなことをする必要があるので勉強になる

・テーマのアレンジなどカスタマイズの幅が広い

デメリット

・1年目で月100円くらい、2年目以降から1000円程度になりそうなのでお金がかかる

・第二のモチベであるアクセス数を確認するのがいちいちGAを見に行くのでしんどい

・URLの埋め込みが「自分の書いた記事」しかできない

 1年後ははてブにしようかなぁ。。

sendgridとredashとseleniumでメルマガの配信リスト作成を自動化した話

実現したい動き

  • redashでメルマガ配信対象者の氏名を抽出し、CSVとしてダウンロードする
  • sendgridでCSVから配信リストを作成する

実装

  • redashはクエリを指定周期で実行させることができる。今回は週1で配信リストを作りたいとのことなので、実行がseleniumの実行タイミングと被らないように「24時間おき」(ほんとうは3日おきくらいが良かったが、指定が面倒臭いので)にクエリを更新してもらう。
  • redashはCSVダウンロードのAPIを持っているので、該当のクエリのキーからダウンロードするためのURLを取得する。
  • seleniumのスクリプトを作成する

流れ

redashのAPIを叩く

sendgridにログインする

必要項目を入力し、CSVをアップロードする

今回はCSVのアップロードの自動化を初めてやったが、以下のように簡単にできた。

driver.find_element(:id, 'アップロードフィールドのid').send_keys("ローカルのCSVファイルパス")

結果

配信リストの自動化は完成したが、これをサーバーに上げない限りはマシンに依存的である。しばらくはラズパイで起動させておけばおkだが、今後要検討。。

macとherokuにおける「This version of ChromeDriver only supports Chrome version ○○」の解決方法について

エラー

Selenium::WebDriver::Error::SessionNotCreatedError: session not created: This version of ChromeDriver only supports Chrome version 76

原因

chromeとchromedriverのバージョンがあっていないために発生している

$ google-chrome --version 
Google Chrome 75.0.3770.142 unknown

$ chromedriver -v 
 ChromeDriver 76.0.3809.68 

対応

macのローカル環境の場合

環境

macOS Mojave 10.14.5

  • Chromeを更新する

「Google Chromeについて」を開くと勝手に更新される

  • chromedriverを更新する(再インストールする)
$ brew cask uninstall chromedriver
$ brew cask install chromedriver

これでChromeとchromedriverが最新のバージョンで統一されるので動作する

もしかすると、それぞれの最新版リリースのタイミングが合っていないとバージョンが揃わない場合があるが、その場合は環境変数にchromedriverのバージョンを指定する方法があるので、以下を参照のこと

heroku環境の場合

heroku上のChromeとchromedriverは「Buildpacks」によってデプロイ時にインストールされる

また、chromedriverの方がバージョンのアップが早いので、環境変数にてバージョンを指定する方法がある

Configuring the downloaded version of chromedriver.
By default, this buildpack will download the latest release, which is provided by Google.
You can control the specific version by setting the CHROMEDRIVER_VERSION variable to an explicit version e.g. 2.39.

https://github.com/heroku/heroku-buildpack-chromedriver#configuring-the-downloaded-version-of-chromedriver

とはいえ、いずれはバージョンが揃うので急ぎでなければ待ちもアリ

[ポートフォリオ]自転車の自動予約システム

もともとはgithubに書いていましたが、こちらでも。

目次

  • 作成の経緯と成果
  • アプリについての説明
  • 今後の開発予定

作成の経緯と成果

作成の経緯

  • 「コミュニティサイクル」という自転車のレンタルサービスを利用して通勤をしているが、毎朝自転車をレンタルするたびにアプリを操作するのが面倒だった
  • 自転車が置いてあるポートに自転車がないことが多々あり、最寄りのポート以外のポートの自転車の残数状況を確認し、予約できなかった時にどこにいけばいいのかを知りたかった
  • 自動予約を最寄りのポートにセットしているが、これが失敗した時にその通知メールが欲しかったのと、他のポートに自転車がある場合はその通知メールから自転車を予約できるようにしたかった
    *コミュニティサイクルについて
    https://docomo-cycle.jp/

成果

  • 自転車のレンタル作業を自動化させることで、毎朝自転車を借りるたびにアプリを操作する手間をなくすことができた
  • 周辺のポートの自転車の残数状況を平日7:00~10:00の間記録し、自転車の予約を確実に行える時間を分析するためのデータを揃えることができた(分析はこれから。少なくとも1ヶ月はデータを溜めたいのと、天気によって残数が大きく異なるのでデータに天気の情報も入れたい)
  • 最寄りのポートで自転車の自動予約ができなかった時には周辺の自転車ポートの空き自転車状況と、該当のポートへの予約を行うためのURLを載せたメールを送ることによって、自転車の再予約の手間を軽減することができた

アプリについての説明

全体像

Untitled_New_Diagram_-_Cacoo

自動予約について

  • 指定した時間に、指定したポートに対して自動予約を行う機能

動き

  • seleniumとheadlessモードのchromeでブラウザを操作して、コミュニティサイクルのページにアクセスし、予約を行う処理をrake taskにまとめている
  • heroku scheduler(cronのようなもの)が実行時間になると上記のrake taskを実行する

周辺ポートの予約状況調査について

  • seleniumとheadlessモードのchromeでブラウザを操作して、コミュニティサイクルのページからポート名と自転車残数を取得する処理をrake taskにまとめている
  • heroku scheduler(cronのようなもの)が実行時間になると上記のrake taskを実行する

予約失敗メールからの空きポートへの予約について

  • 上記の自動予約が失敗するとgmailに他のポートの自転車の空き状況と、予約のためのURLが記載してあるメールが飛んでくる

  • 予約可能ポートあり
周辺の予約可能ポート一覧です_-_sloth1990nori_gmail_com_-_Gmail
  • 予約可能ポートなし
予約可能な自転車はありませんでした_-_sloth1990nori_gmail_com_-_Gmail

今後の開発予定

  • 取得している周辺ポートの自転車残数状況を画面で見られるようにする
  • 画面から任意のポートに予約を行えるようにする
  • APIを使って自転車残数データに天気情報を入れる

homebrewでchromedriverのバージョンアップ方法

環境

mac

homebrew

バージョンアップのコマンドは存在しないので、削除して再度イントールする

  • 削除する
$ brew cask uninstall chromedriver
==> Uninstalling Cask chromedriver
==> Unlinking Binary '/usr/local/bin/chromedriver'.
==> Purging files for version 74.0.3729.6 of Cask chromedriver

これでバージョン74は削除された

  • 再インストールする
$ brew cask install chromedriver
==> Satisfying dependencies
==> Downloading https://chromedriver.storage.googleapis.com/76.0.3809.68/chromedriver_mac64.zip
######################################################################## 100.0%
==> Verifying SHA-256 checksum for Cask 'chromedriver'.
==> Installing Cask chromedriver
==> Linking Binary 'chromedriver' to '/usr/local/bin/chromedriver'.
🍺  chromedriver was successfully installed!

以上で最新(記事作成時点)のバージョン76がインストールされた

ELBによるSSLの仕組み

仕組み

ELB内に証明書を配置することによって、結果的にクライアントとEC2がSSLで通信できるということ

引用:https://recipe.kc-cloud.jp/archives/11084

ELB内に証明書を配置するメリット

  • EC2内に証明書を設置してWEBサーバーの設定をして、、、などの面倒臭い手順がいらない
  • Certificate Managerを使えば証明書が無料であるし、更新も自動で行ってくれる
  • 設定が簡単

ELBを使ったSSL化の手順

こちらにて。。

「Search Regex」を使ってwordpressDB内の「http://~」の値「https://~」に置換する際はドメイン全てを入力すること

「Search Regex」の使い方

参考:https://re-means.com/search-regex-how-to-globally-replace-the-image-url-to-https-from-http/

なぜ「http://~」ではなく、ドメインを全てを入力するのか

例えば外部のリンクなどでhttpsに対応していないサイトがあった場合、ドメイン全てを入力せずに置換すると無効なリンクになってしまうから

wordpress内に別のwordpressを設置する

wordpressを入れ子にして、コンテンツを管理する方法について

手順

Mysqlにスキーマを作成し、wordpressからのアクセスユーザーに全権限を与える

mysqlにログインして、以下のコマンドでDBを作成する

create schema DB名;
grant ALL on 上で設定したDB名.* to 'wordpress'@'localhost';

wordpress内にディレクトリを作成して、そこにwordpressをインストールする

インストールする際のDBは上記で作成したDBにする

以上で作業完了

複数人でwordpressを管理する際のlinuxサーバー設定について

やりたいこと

  • 複数人でwordpressを管理するために、「wordpress」ディレクトリ配下のファイルを複数人で触りたい
  • ユーザーの種類はsshユーザーとsftpユーザーを用意する
  • root権限は渡さない

行う設定

  • 各ユーザーをwordpressディレクトリを所有するユーザーのグループに入れる
  • 各ユーザーが作成したディレクトリやファイルのグループを「wordpressディレクトリを所有するユーザー」にするためにsgidを設定する
  • 各ユーザーが作成したディレクトリやファイルの権限を775に固定するためにumaskを設定する
  • sftpユーザーのためにumaskを設定する

各ユーザーをwordpressディレクトリを所有するユーザーのグループに入れる

  • 「wordpress」ディレクトリのグループを確認する
  • グループ一覧を確認する
cat /etc/group
  • ユーザーをグループに追加する
gpasswd -a USER GROUP

各ユーザーが作成したディレクトリやファイルのグループを「wordpressディレクトリを所有するユーザー」にするためにsgidを設定する

  • SGIDとは

Set Group ID
先ほどもお伝えしたが「SGID」とは「Set Group ID」の略だ。グループに対して設定される特殊パーミッションになっている。
ポイントは次の通りだ。
・ファイルにSGIDが適応されていた場合、そのグループの権限でファイルが実行される
・ディレクトリにSGIDを指定しておくと、ディレクトリ内部で作成されたファイルは全てディレクトリのSGIDで指定したグループが割り振られる
ファイルのグループIDが統一される。
グループでファイルを共有する場合、専用のSGIDなディレクトリを作成しておいて、そのなかでファイルをやりとりすれば、グループ事でシームレスなファイル共有が可能となる。

引用:https://eng-entrance.com/linux-permission-sgid

  • 「wordpress」ディレクトリ配下にsgidと権限を設定する
chmod -R 2775 wordpress

各ユーザーが作成したディレクトリやファイルの権限を775に固定するためにumaskを設定する

sshユーザーのためのumask設定

  • /etc/profileを以下のようにする
# userid199以上はumaskを002とする
if [ $UID -gt 199 ] && [ "`id -gn`" = "`id -un`" ]; then
    umask 002
else
    umask 022
fi

sftpユーザーのためのumask設定

  • sftpユーザーを「sftp-user」グループにまとめる
  • /etc/ssh/sshd_configを以下のようにする
Subsystem sftp internal-sftp -u 002

Match Group sftp-user
ForceCommand internal-sftp -u 002
  • sshdの再起動
service sshd restart

参考:http://x68000.q-e-d.net/~68user/unix/pickup?umask