MetaPii 技術室

あなたの知恵と思いを検索するフラッシュメモアプリMetaPiiのエンジニアブログです。

PWAでmanifest.jsonが更新されない件 Chrome(developer tools)編

概要

検索してもなかなか出てこなかったので、
PWAでmanifest.jsonが更新されない場合のdeveloper tools設定方法についてメモしておきます。

1. Chromeのdeveloper toolsの一番右にある設定を開く

具体的には、「・・・」のところをクリックしてsettingを選択。

f:id:continue1:20191109101220p:plain
developer tools設定

2. Network欄にあるDisable Cacheにチェックを入れる

f:id:continue1:20191109101349p:plain
Disable cache

3.Chromeのリロード

これでOK。

自宅で速攻DNSサーバー構築 by Docker(Google Oauth対策)

概要

LAN内にDNSサーバーをさくっとたてます。by docker compose
iphoneから自宅(社内)に立てたWebサーバーを自分で作成したドメインIPアドレスではない)で見れたりできます。

1. git cloneでDockerfileをダウンロード

git clone https://github.com/S64/dockerfile-dns.git

2. DNSの設定を記載

cd dockerfile-dns
cp docker-compose.example.yml docker-compose.yml
vi docker-compose.yml

・docker-compose.yml
以下の部分に自分で決めたドメインとIPの対応を記載するだけでOK。素敵!

    extra_hosts:
      - "example.dev:93.184.216.34"
      - "oreore.com:192.168.0.201"

3.起動

追加したら

docker compose up -d

で起動

4.ルータの設定

最後にルータの設定でDNSをたてた自宅サーバーも名前解決先にできるようルーターの設定をいじります。

http://192.168.0.1

たいてい自宅とかでは上記のIPでルーターへアクセスできるはず。
アクセスしたらDHCPの設定欄でプライマリDNSに先程起動したDNSが起動しているサーバーのIPアドレスをセットする。

f:id:continue1:20191103202841p:plain
設定例

余談

なんのためにこれやったのか?
Google対策だよ!Googleログインする(Google Oauth)ためにはIPアドレスでリダイレクトURL設定ができないんですよ。
「xip.io」使う手もあるんですが、やっぱ外にあるのは気になっちゃうんですよ。

ルンバ i7 アプリ初期設定で無事ハマる

前置き

物理モジュールの世界でもハマりました。
挙句の果てに「えっ十何万も払ったのに初期不良?!」という自分のやり方がまずいのに他責なる疑いの心まで芽生えてしまった。
二度と繰り返してはいけない。
その誓いから記録に残します。

遭遇したエラー

  • アプリでrobotが最初から表示され、選択するも接続できない

  • アプリでルンバの追加を選択するも「モバイルがWifiにつながっていません」と怒られる。(めっちゃつないでますよ!)

正しい手順(順番が大事!)

もう一度言います。
「順番が大事!」

1)ルンバをホームベースに設置する
2)【!ここ重要!】 ルンバの電源を切っておく(再起動中などアクティブにさせてなければ電源OFFでなくても可)
3)携帯をWifiにつないでおく
4)アプリを立ち上げ、ルンバの追加を選択
5)アプリの指示に従う
  1. Wifiのパスワードなど入力
 2. ルンバの電源をいれてWifiモード立ち上げ
 3. 接続

参考にした記事

www.rentio.jp

irobot-homesupport-ja-jp.custhelp.com

  

Python Selenium Chrome セッション保持したまま デバッグ

ログイン後のサイトページでHTML解析やSeleniumの動作確認などサクサクやりたいって方向けです。
何回もログインするは面倒ですよね。

やり方

python

        import chromedriver_binary 
        from selenium import webdriver

        p_id = 1 ## 自由に決めてOK
        options = webdriver.ChromeOptions()
        options.add_argument('user-data-dir=./Chrome')  ## ここも自由に決めてOK
        options.add_argument('--profile-directory=Profile '+p_id)
        driver = webdriver.Chrome(options=options)
        driver.get(login_url)
        sleep(30)   ## これ書いておいて、sleepしている間に手でログインすればログインロジックすら不要になる
        driver.quit()

こうすることで実行フォルダに「Chrome」(user-data-dirで定義したフォルダ)が自動的作成されて、そこにブラウザセッションなどもろもろ保存される。
一回ログインすれば次回からログインなしで実行可能。

※ 金融などセキュリティの高いサイト(セッション保持期間が短いサイト)などはすぐにセッションきれるので要注意

HTML解析のポイント

ちょっと道は外れますが、余談コーナーです。 HTML解析についてだけではなくエンジニアリング全般にいえることですが、とにかく便利なコードをメモしてすぐ取り出せるようにしておくことがなによりも大切です。 それがあるかないかで開発スピードが段違いに差がつきます。

Googleで検索するという手もありますが、繰り返し使うようなコードには不向き。
だからいいと思ったものは自分の中に蓄積していくことが大切です。

課題

その便利なコードをどこにどうやって管理するか
メモ帳やGoogleスプレッドシートなどでは限界があるため、スニペット管理ツールを使うというのがベターでしょう。

そんな思いからエンジニア向けスニペット管理ツールMetaPiiを開発しました。

タグ管理(自動補完機能付)できてスニペット同士に関連性をもたせることもできます。
またそのスニペットに関する調査事項やレファレンスなども管理できるノート機能も便利です。
ぜひ一度使ってみてください。

www.metapii.com

Python Selenium 超速デバッグ by サイト側に迷惑かけないやり方

ログイン後のサイトページでHTML解析やSeleniumの動作確認などサクサクやりたいって方向けです。
やり方はいたってシンプルでローカルにHTMLファイルを保存してそれを読み込むだけ。
セッションを保持するやり方は今回対象外です。

やり方

1. 保存 (Chrome)

デバックしたWebページに手動でいく。
そのページでChromeブラウザの右上にあるメニューを開く

f:id:continue1:20191006101728p:plain
メニュー
上記メニューの「その他ツール」の中にある「ページを別名で保存」でローカルにファイルを落とす。

2. 読み込み

python

        url = "file:///Users/hoge/savedHtml/google_01.html"
        driver.get(url)
        driver.find_element_by_id('hoge')

これでおっけー

docker laravelのmysqlがUbuntuでこける件

浅はかなDocker知識が招いた泥試合の記録です。

環境

エラー内容

Initializing database
2019-09-15T13:33:50.756496-00:00 0 [Warning] [MY-011070] [Server] 'Disabling symbolic links using --skip-symbolic-links (or equivalent) is the default. Consider not using this option as it' is deprecated and will be removed in a future release.
2019-09-15T13:33:50.756598-00:00 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.0.17) initializing of server in progress as process 28
2019-09-15T13:33:50.758448-00:00 0 [ERROR] [MY-010187] [Server] Could not open file '/var/log/mysql/mysql-error.log' for error logging: Permission denied
2019-09-15T13:33:50.758811-00:00 0 [ERROR] [MY-013236] [Server] The designated data directory /var/lib/mysql/ is unusable. You can remove all files that the server added to it.
2019-09-15T13:33:50.758906-00:00 0 [ERROR] [MY-010119] [Server] Aborting
2019-09-15T13:33:50.760556-00:00 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.17)  MySQL Community Server - GPL.

原因

結局はファイルのowner問題です。特にエラーログまわり
いろいろ記事は探して以下は参考になったんですが、私の浅はかなLinuxの知識では問題の解決には至りませんでした。

qiita.com

解決策

以下2点行いました。

  1. データボリューム上にlogファイルをマウント
  2. ファイルのオーナーを起動時に変更する
0.準備
  • git clone
$ pwd
/home/dev/docker
$ git clone https://github.com/ucan-lab/docker-laravel.git
$ cd docker-laravel
1. データボリューム上にマウント
$ pwd
/home/dev/docker/docker-laravel
$ vi docker-compose.yml 
  • 変更前:docker-compose.yml
  db:
    image: mysql:8.0
    volumes:
      - db-store:/var/lib/mysql
      - ./logs:/var/log/mysql
      - ./docker/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
〜省略
volumes:
  db-store:
  redis-store:
  • 変更後:docker-compose.yml
    以下のように、image項目を削除し自分でbuildファイルを作成し実行できるようにします。
  db:
    build:
      context: "."
      dockerfile: DockerfileDB
    volumes:
      - db-store:/var/lib/mysql
      - db-log-store:/var/log/mysql
      - ./docker/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
〜省略
volumes:
  db-store:
  db-log-store:
  redis-store:
2.ファイルのオーナーを起動時に変更する
$ pwd
/home/dev/docker/docker-laravel
$ vi DockerfileDB
  • 新規作成:DockerfileDB
FROM mysql:8.0
RUN mkdir /var/log/mysql
RUN chown mysql:mysql /var/log/mysql 
起動確認
$ docker compose build
$ docker compose up -d 
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS                                NAMES
3249c67bc967        nginx:1.17-alpine   "nginx -g 'daemon of…"   4 seconds ago       Up 2 seconds               0.0.0.0:10080->80/tcp                myproject_web_1
1086fe08bbb6        mysql:8.0           "docker-entrypoint.s…"   11 seconds ago      Up 5 seconds               33060/tcp, 0.0.0.0:13307->3306/tcp   myproject_db-testing_1
473f6acf9f46        mailhog/mailhog     "MailHog"                11 seconds ago      Up 7 seconds               1025/tcp, 0.0.0.0:18025->8025/tcp    myproject_mail_1
8daae7ea27d4        redis:5.0-alpine    "docker-entrypoint.s…"   11 seconds ago      Up 8 seconds               6379/tcp                             myproject_redis_1
b74eeb2e0340        myproject_app       "docker-php-entrypoi…"   11 seconds ago      Up 3 seconds               9000/tcp, 0.0.0.0:18000->8000/tcp    myproject_app_1
34d77196f83a        node:12.8-alpine    "docker-entrypoint.s…"   11 seconds ago      Exited (0) 6 seconds ago                                        myproject_node_1
ecce1dc69755        myproject_db        "docker-entrypoint.s…"   11 seconds ago      Up 4 seconds               33060/tcp, 0.0.0.0:13306->3306/tcp   myproject_db_1

開発したサービス

このdocker構成を起点にエンジニア向けスニペット管理ツールMetaPiiを開発しました。
タグ管理(自動補完機能付)できてスニペット同士に関連性をもたせることもできます。
またそのスニペットに関する調査事項やレファレンスなども管理できるノート機能も便利です。 ぜひ一度使ってみてください。

www.metapii.com

その他参考記事

qiita.com

unix.stackexchange.com

2019年:IFTTTでGoogleSheetへの自動設定日付を自動フォーマットする

IFTTTでGoogleSpreadSheetへ何らかのデータの行を追加するとき、設定でCreatedAtやUpdateAtなどIFTTTが自動で追加時点の日付を入れていくれるのは便利だ。

 

だが、どうも一般的に期待されるフォーマットにならない問題がある。

 

 

そういうときはGoogle側でさくっとフォーマットの自動処理をGASでいれてしまうのが便利だ。

 

やりたいこと

↓ こういうのにする

f:id:continue1:20190316152241p:plain



ステップ1 IFTTT側の設定

今回は日付と時刻をいい感じするので、対応する CreatedAt を2つかいています。
 
{{CreatedAt}}|||{{CreatedAt}}|||{{TextField}}
 
そうすると以下のようにセットされます。

f:id:continue1:20190316152509p:plain

下記ステップ2以降でこの日付を上書き編集する処理を行います。
 

ステップ2 GoogleSpreadSheet側でやること

ツール>スクリプトエディタを選択し、Gas画面を開く。
 

 

ステップ3 GAS側の設定

(1) スクリプト作成

Gas画面にて下記のコードを挿入する。 
プロジェクト名はテキトーでいいです。
 
var sheet = SpreadsheetApp.getActiveSheet();
//最後の行を取得し、
function addDate() {
  setDate(1, "yyyy/M/d"); //1列目左記フォーマットに編集する
  setDate(2, "H:m:s");       //2列目左記フォーマットに編集する
}
function setDate(col, format) {
  var lastrow = sheet.getLastRow();
  if (sheet.getRange(lastrow, col).getValue() == "") 
    sheet.getRange(lastrow, col).setValue(formatDate(new Date(), format));
}
function formatDate(date, format) {
  return Utilities.formatDate(date, 'Asia/Tokyo', format)
}

(2) 編集許可

虫(バグ)マークの右横にあるリストから「addDate」を選択し、虫(バグ)マークの左横にある三角(実行)ボタンを押下する。
 

 
すると認証許可画面になるので、許可をする。
セキュティ警告画面になる場合は、グレー色の文字で見えづらいけど下らへんにある「詳細」とかっていうところを押して、それでも進むのか的なリンクをクリックしていくと期待した画面になる。
 
 

(3) トリガーセット

さっき作成したaddDate関数をいつ実行しますかっていう設定をします。

編集>現在のプロジェクトトリガーをセット。

 

 

トリガーセット画面に移ったら右下にあるトリガーを追加ボタンを押下し、

 

f:id:continue1:20190316160538p:plain

上記のようにセットし保存ボタンを押す。

 

ステップ4 それでどうなるの?

IFTTTからのSheetへ行が追加されると、トリガーが発動して、

期待した結果になると思います。

 

 

よいIFTTT生活を!