mutao.net

いわゆる雑記。

PageSpeed Insight API を使ってサイトのPerformanceを取得する。

やりたいこと(やりたかったこと)

PageSpeed Insight APIを使ってPerformanceを取得してリリースごとに劣化していないか確認したかった。

developers.google.com

実際にAPIを叩いてみる。

curlのサンプルがあるのですぐに叩ける。1秒間に複数回のリクエストをする場合は API Key が必要になるけど、基本的にいらないと思う。

curl https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url=https://mutaonet.hatenablog.com/

レスポンスの量が凄まじいので省略。

レスポンスの詳細は下記。curlを使わなくても簡単にリクエストできる。

developers.google.com

Performanceの結果は response → lighthouseResult → audits の中にある。

auditの中身は以下。大量にある。

resource-summary

no-document-write

screenshot-thumbnails

uses-optimized-images

first-meaningful-paint

render-blocking-resources

server-response-time

diagnostics

uses-long-cache-ttl

font-display

largest-contentful-paint-element

network-requests

estimated-input-latency

legacy-javascript

speed-index

unused-javascript

timing-budget

user-timings

unminified-javascript

first-cpu-idle

network-server-latency

first-contentful-paint-3g

unused-css-rules

performance-budget

critical-request-chains

long-tasks

interactive

max-potential-fid

dom-size

uses-rel-preconnect

uses-responsive-images

uses-passive-event-listeners

uses-text-compression

network-rtt

total-blocking-time

first-contentful-paint

redirects

cumulative-layout-shift

uses-webp-images

largest-contentful-paint

main-thread-tasks

large-javascript-libraries

offscreen-images

efficient-animated-content

non-composited-animations

unminified-css

layout-shift-elements

mainthread-work-breakdown

bootup-time

final-screenshot

total-byte-weight

third-party-summary

duplicated-javascript

uses-rel-preload

metrics

この key の中にまた階層構造があり、一体何を見ればよくわからない。

ここまでやったところで疲れて頓挫してしまった。

あとAPI の responce time も長いので debug にも根気がいる。

少しずつ進めていきたい。

PythonでWebAPIを作成してHerokuにデプロイするまで

何やったの

タイトルの通りにPythonの勉強の一環としてFlaskFWを使ってWEBAPI(仮)を作りました。

Herokuにデプロイしてアプリケーションを実行するまで結構詰まったので備忘録的に書きます。

作ったもの

https://commic-lover.herokuapp.com/

楽天BooksAPIを単にwarpして自分が好きなタイトルの漫画だけをJSON形式で返してくれるというもの。

楽天BooksAPIのレスポンスが遅いのでHerokuのdynoが休眠状態にあるかどうかにかかわらず遅い。

本当はAPIの実行結果をDBに蓄積していくまでやりたかったけどとりあえず目的は果たせた。

というかエラーページすら作っていないし、今月分の新刊情報しか持ってこれていないので作り込みが必要。

FlaskでAPI作成

これはqiitaの記事にも散々あるし公式のdocを眺めていれば作れるので割愛。

https://www.flaskapi.org/

一つ気をつけたいのがHerokuでサブディレクトリをデプロイするときはめんどくさいので全部ルートディレクトリに作成した方が簡単。

サブディレクトリを作成したい人はこちらの stack overflowの記事を参照。

https://stackoverflow.com/questions/7539382/how-can-i-deploy-push-only-a-subdirectory-of-my-git-repo-to-heroku/10648623#10648623

私はHerokuCLIを使わずにGUI上で全て完結させたかったのでやらなかった。

Herokuにデプロイ

Procfile

Procfileをルートディレクトに作成する。

https://devcenter.heroku.com/articles/python-gunicorn

Pythonの場合はgunicornを使うことが多いというか他の選択肢がdocになかったので従った。

web: gunicorn app:app

中身は至ってシンプル。ここで --chdir オプションでサブディレクトリに移動できたりもするらしい(未検証)。

requirement.txt

次に requirements.txtの作成。

pip freeze > requirements.txt

venvとか使っていないとpipで入れたモジュールが全て出力されてしまってPython触り立ての時は混乱した。

デプロイ

今回はGUIからやる。お手軽デプロイで時間短縮。

f:id:mutaonet:20201123165744p:plain

右上「 New」ボタンから「Create app」を選択。

f:id:mutaonet:20201123165733p:plain

好きなアプリケーション名を入力。Herokuの場合URLになる部分。

f:id:mutaonet:20201123165716p:plain

GitHubにPush済みなので connect to GitHub を選択。

リポジトリ名で検索できるので対象のリポジトリを選択する。

f:id:mutaonet:20201123165707p:plain

あとはデプロイしたいブランチ等を選択。

Enable Automatic Deploys を ONにしておくとGitHubにpushされる度にビルドとデプロイをしてくれるのでONにすると便利。

あとは、Buildを待つだけでデプロイ完了です。

https://{アプリケーション名}.herokuapp.com/

https://commic-lover.herokuapp.com/

LinuC Level1 102 合格体験記

LinuC Level1 102 取得しました。

これでLinuC level1 を取得したことになります。

勉強期間

1ヶ月ほど、101を受験したことによって慣れたのでこのくらいの期間で取得できたんだと思う。

勉強自体は平日1h休日2hくらいで見積もっている。もちろん仕事の事情だったりでさぼったりした日もあったので正味2週間ちょいと言う感じ

勉強方法はあずき本とping-tでほとんどping-t頼りだった。

やったのは主にコマ問、最強問題集の方は模試をずっとやっているだけ。

いくら模試をやってもレベル40(MAX)にはならなかった。このコンボって何で加算されているかわからない。

f:id:mutaonet:20201102175412p:plain

テストを受けてみて

102は入力問題は多いと聞いてコマンド問題ばかりやっていたけど大して出題されなかった。

入力問題全て落としても合格はできるんじゃないかなと思う。

そしてping-tほど難しい入力問題は出なかった。

選択式問題はping-tでやったこともないものがたくさん出てきた。

あずき本ベースで実際にLinux環境で色々といじってみた方がいいと思う。

難易度的には101の方が断然難しい、というか暗記量が少ない。

次の目標

もちろんLinuC level2を狙う予定。

その前にPython3エンジニア認定基礎試験に浮気したくなってきている。

いずれにせよなにかしらの資格の取得を狙っているので景気付けに大好きなヘンドリックスジンを買いました。 f:id:mutaonet:20201102180808j:plain

Amazon Linux Extras

Amazon Linux Extras

Q:Amazon Linux Extras とは何ですか?
Extras は、安定したオペレーティングシステムで新しいバージョンのアプリケーションソフトウェアを利用可能にする Amazon Linux 2 のメカニズムで、2023 年 6 月 30 日までサポートされます。Extras は、OS の安定性を確保しつつ、最新のソフトウェアを利用できるようにするうえで役立ちます。例えば、5 年間サポートされる安定したオペレーティングシステムに MariaDB の新しいバージョンをインストールすることができます。Extras の例には、Ansible 2.4.2、memcached 1.5、nginx 1.12、Postgresql 9.6、MariaDB 10.2、Go 1.9、Redis 4.0、R 3.4、Rust 1.22.1 などがあります。

引用元: https://aws.amazon.com/jp/amazon-linux-2/faqs/#Amazon_Linux_Extras

ということらしい。OSに合わせて安定稼働するミドルウェアなどなどをyumで入れるらしい。

なぜ調べた?

EC2インスタンスを立ててnginxを入れて色々とごにゃごにゃしようかなと思ったときに以下のエラー文にあったから。

$ sudo yum install nginx
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
パッケージ nginx は利用できません。
エラー: 何もしません


nginx is available in Amazon Linux Extra topic "nginx1"

To use, run
# sudo amazon-linux-extras install nginx1

Learn more at
https://aws.amazon.com/amazon-linux-2/faqs/#Amazon_Linux_Extras

特にバージョンに固執していないので今回はよかったけど、レガシーなシステムをAWSに移行するときとかにハマりそうな予感がしている。

もしかしたらAmazon Linux Extraを無視してforce install みたいなことができるかもしれないけど今回は調べてない。

実際入れてみる

$ sudo amazon-linux-extras install nginx1
(省略)
完了しました!
  0  ansible2                 available    \
        [ =2.4.2  =2.4.6  =2.8  =stable ]
  2  httpd_modules            available    [ =1.0  =stable ]
  3  memcached1.5             available    \
        [ =1.5.1  =1.5.16  =1.5.17 ]
  5  postgresql9.6            available    \
        [ =9.6.6  =9.6.8  =stable ]
  6  postgresql10             available    [ =10  =stable ]
  8  redis4.0                 available    \
        [ =4.0.5  =4.0.10  =stable ]
  9  R3.4                     available    [ =3.4.3  =stable ]
 10  rust1                    available    \
        [ =1.22.1  =1.26.0  =1.26.1  =1.27.2  =1.31.0  =1.38.0
          =stable ]
 11  vim                      available    [ =8.0  =stable ]
 15  php7.2                   available    \
        [ =7.2.0  =7.2.4  =7.2.5  =7.2.8  =7.2.11  =7.2.13  =7.2.14
          =7.2.16  =7.2.17  =7.2.19  =7.2.21  =7.2.22  =7.2.23
          =7.2.24  =7.2.26  =stable ]
 17  lamp-mariadb10.2-php7.2  available    \
        [ =10.2.10_7.2.0  =10.2.10_7.2.4  =10.2.10_7.2.5
          =10.2.10_7.2.8  =10.2.10_7.2.11  =10.2.10_7.2.13
          =10.2.10_7.2.14  =10.2.10_7.2.16  =10.2.10_7.2.17
          =10.2.10_7.2.19  =10.2.10_7.2.22  =10.2.10_7.2.23
          =10.2.10_7.2.24  =stable ]
 18  libreoffice              available    \
        [ =5.0.6.2_15  =5.3.6.1  =stable ]
 19  gimp                     available    [ =2.8.22 ]
 20  docker=latest            enabled      \
        [ =17.12.1  =18.03.1  =18.06.1  =18.09.9  =stable ]
 21  mate-desktop1.x          available    \
        [ =1.19.0  =1.20.0  =stable ]
 22  GraphicsMagick1.3        available    \
        [ =1.3.29  =1.3.32  =1.3.34  =stable ]
 23  tomcat8.5                available    \
        [ =8.5.31  =8.5.32  =8.5.38  =8.5.40  =8.5.42  =8.5.50
          =stable ]
 24  epel                     available    [ =7.11  =stable ]
 25  testing                  available    [ =1.0  =stable ]
 26  ecs                      available    [ =stable ]
 27  corretto8                available    \
        [ =1.8.0_192  =1.8.0_202  =1.8.0_212  =1.8.0_222  =1.8.0_232
          =1.8.0_242  =stable ]
 28  firecracker              available    [ =0.11  =stable ]
 29  golang1.11               available    \
        [ =1.11.3  =1.11.11  =1.11.13  =stable ]
 30  squid4                   available    [ =4  =stable ]
 31  php7.3                   available    \
        [ =7.3.2  =7.3.3  =7.3.4  =7.3.6  =7.3.8  =7.3.9  =7.3.10
          =7.3.11  =7.3.13  =stable ]
 32  lustre2.10               available    \
        [ =2.10.5  =2.10.8  =stable ]
 33  java-openjdk11           available    [ =11  =stable ]
 34  lynis                    available    [ =stable ]
 35  kernel-ng                available    [ =stable ]
 36  BCC                      available    [ =0.x  =stable ]
 37  mono                     available    [ =5.x  =stable ]
 38  nginx1=latest            enabled      [ =stable ]
 39  ruby2.6                  available    [ =2.6  =stable ]
 40  mock                     available    [ =stable ]
 41  postgresql11             available    [ =11  =stable ]
 42  php7.4                   available    [ =stable ]
 43  livepatch                available    [ =stable ]
 44  python3.8                available    [ =stable ]
 45  haproxy2                 available    [ =stable ]

nginx-latest というのが enabled になっているのでinstallされた模様。

他の available になっているのはAmazon Linux Extrasで提供されているものということだろうか。

jdkがきになる

jdkはやはりAmazon corretが入るのだろうか。多分そうだと思う。

$ sudo amazon-linux-extras install java-openjdk11
(省略)
 33  java-openjdk11=latest    enabled      [ =11  =stable ]
 34  lynis                    available    [ =stable ]
 35  kernel-ng                available    [ =stable ]
 36  BCC                      available    [ =0.x  =stable ]
 37  mono                     available    [ =5.x  =stable ]
 38  nginx1=latest            enabled      [ =stable ]
$ java --version
openjdk 11.0.7 2020-04-14 LTS
OpenJDK Runtime Environment 18.9 (build 11.0.7+10-LTS)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.7+10-LTS, mixed mode, sharing)

え?違うの?

corretto8というのがあったので入れてみた。

sudo amazon-linux-extras install corretto8
(省略)
 27  corretto8=latest         enabled      \
        [ =1.8.0_192  =1.8.0_202  =1.8.0_212  =1.8.0_222  =1.8.0_232
          =1.8.0_242  =stable ]
 28  firecracker              available    [ =0.11  =stable ]
 29  golang1.11               available    \
        [ =1.11.3  =1.11.11  =1.11.13  =stable ]

$ java -version
openjdk version "1.8.0_265"
OpenJDK Runtime Environment Corretto-8.265.01.1 (build 1.8.0_265-b01)
OpenJDK 64-Bit Server VM Corretto-8.265.01.1 (build 25.265-b01, mixed mode)

正解だったみたい。ただstableは 1.8系のよう。AWS lamdaのランタイムは11と聞いてたけどあれはcorettoじゃないのかな・・・?

ping-t

ping-tとは?

IT系の資格試験の勉強に役立つサイトで問題集を提供している。

CCNA/CCNP、LinuC、HTML5OSS-DB etc..

資格試験にはかなり役立つサイトなので重宝している。

一部無料だけど有料のプレミアムコンテンツを購入しないと全部の問題集は使えない。

LinuC101 は無料だけど、LinuC102はプレミアムコンテンツ扱いだったので1ヶ月分だけ購入した。

最近なんか変わった

結構チープな作りをしていたが、最近新システムというのがでてきた。 今風?なデザインに刷新されている。 f:id:mutaonet:20201018205643p:plain

旧システムは金・銀・銅のメダルでスコアを管理していて、問題を3回連続で正答すると金メダルになる。

一度でも間違うと金から銅メダルへと降格する。

新システムでは以下のようにスコアを管理している。

詳しくは知らないけど、スタンプを集めるとレベルが上がっていく感じになっている。

f:id:mutaonet:20201018205635p:plain

コンボというのがよくわからない。同じ問題を何回かクリアするとスタンプがもらえる?

スコアの管理方法は旧システムの方が分かりやすくていい。

新システムで初めから試験勉強するときは苦手分野がわかりにくいと思う。

LinuC 102 の勉強をしている最中だけど、苦手なインターネットの基礎分野をこれだと取りこぼしていたと思う。

まったく違う話

LinuCのバウチャーをping-tで購入していたら何故かプレミアムコンテンツ1ヶ月分がプレゼントされてきた。

バウチャーの購入だけが条件じゃない気がする。もしかしたら抽選?

Jsoup(メモ)

  • HTMLタグを削除したかった
  • Jsoup使えばかなり楽にいけることが判明
package module;

import org.jsoup.Jsoup;
import java.io.IOException;

public class HtmlParser {
    public static void main() throws IOException {
        // http://example.com/
        String html = "\n" +
                "<!doctype html>\n" +
                "<html>\n" +
                "<head>\n" +
                "    <title>Example Domain</title>\n" +
                "\n" +
                "    <meta charset=\"utf-8\" />\n" +
                "    <meta http-equiv=\"Content-type\" content=\"text/html; charset=utf-8\" />\n" +
                "    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n" +
                "    <style type=\"text/css\">\n" +
                "    body {\n" +
                "        background-color: #f0f0f2;\n" +
                "        margin: 0;\n" +
                "        padding: 0;\n" +
                "        font-family: -apple-system, system-ui, BlinkMacSystemFont, \"Segoe UI\", \"Open Sans\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n" +
                "        \n" +
                "    }\n" +
                "    div {\n" +
                "        width: 600px;\n" +
                "        margin: 5em auto;\n" +
                "        padding: 2em;\n" +
                "        background-color: #fdfdff;\n" +
                "        border-radius: 0.5em;\n" +
                "        box-shadow: 2px 3px 7px 2px rgba(0,0,0,0.02);\n" +
                "    }\n" +
                "    a:link, a:visited {\n" +
                "        color: #38488f;\n" +
                "        text-decoration: none;\n" +
                "    }\n" +
                "    @media (max-width: 700px) {\n" +
                "        div {\n" +
                "            margin: 0 auto;\n" +
                "            width: auto;\n" +
                "        }\n" +
                "    }\n" +
                "    </style>    \n" +
                "</head>\n" +
                "\n" +
                "<body>\n" +
                "<div>\n" +
                "    <h1>Example Domain</h1>\n" +
                "    <p>This domain is for use in illustrative examples in documents. You may use this\n" +
                "    domain in literature without prior coordination or asking for permission.</p>\n" +
                "    <p><a href=\"https://www.iana.org/domains/example\">More information...</a></p>\n" +
                "</div>\n" +
                "</body>\n" +
                "</html>\n";
        //System.out.println(html);
        System.out.println(Jsoup.parse(html).text());
    }
}

traceroute と tracepath

traceroute/traceroute6

traceroute と tracepath の違いがよくわからなかったのでメモ書き。

宛先アドレスまでの経路を確認できる。

なおtraceroute6はIPv6対応のコマンド。 -g オプションはない。

オプション 説明
-n 結果表示の形式をアドレスで表示。途中で到達したホスト名の名前解決をしないので表示が早くなる。
-p 使用するポート番号を指定
-g 使用するgatewayを指定
-T TCPを使用
-I ICMPを使用
traceroute -p 443 -n example.com
traceroute to example.com (93.184.216.34), 64 hops max, 52 byte packets
 1  XXXXXXXXX 7.401 ms  3.710 ms  2.990 ms
 2  153.153.224.244  9.576 ms  9.456 ms  12.821 ms
 3  153.153.224.157  10.585 ms  10.823 ms  10.101 ms
 4  118.23.39.65  11.832 ms  10.740 ms  14.740 ms
 5  153.146.147.13  12.326 ms  10.515 ms  12.819 ms
 6  122.1.245.185  15.555 ms
    118.23.168.137  14.818 ms  11.836 ms
 7  120.88.53.25  13.867 ms  16.458 ms
    120.88.53.21  16.787 ms
 8  129.250.3.34  17.236 ms  16.156 ms  17.477 ms
 9  129.250.3.193  125.385 ms  127.117 ms
    129.250.5.78  119.447 ms
10  129.250.4.107  124.336 ms
    129.250.3.175  119.893 ms  124.003 ms
11  128.241.4.218  132.632 ms  142.837 ms
    128.241.4.222  140.268 ms
12  152.195.85.133  125.230 ms  153.076 ms  121.937 ms

tracepath

宛先アドレスまでの経路と経路上のPathMTUを確認することができる。

オプション 説明
-n 結果表示の形式をアドレスで表示。途中で到達したホスト名の名前解決をしないので表示が早くなる。
-b ホスト名とIPアドレスの両方を表示
-l 初期パケットの長さを設定。 tracepathの場合は65535、tracepath6の場合は128000を設定
-m 最大ホップ数をmax_hopsに設定する。
-p ポートを指定する
$ tracepath -n example.com
 1?: [LOCALHOST]                                         pmtu 9001
 1:  172.31.16.1                                           0.200ms pmtu 1500
 1:  no reply
 2:  no reply
 3:  no reply
 4:  no reply
 5:  no reply

man コマンド一部抜粋

DESCRIPTION
       It traces path to destination discovering MTU along this path.  It uses UDP port port or some random port.  It is similar to traceroute, only does not require superuser privileges and has no fancy options.

       tracepath6 is good replacement for traceroute6 and classic example of application of Linux error queues.  The situation with IPv4 is worse, because commercial IP routers do not return enough information in
       ICMP error messages.  Probably, it will change, when they will be updated.  For now it uses Van Jacobson's trick, sweeping a range of UDP ports to maintain trace history.

tracerouteと違うのはスーパーユーザ権限を必要とせず、UDPportを使うというところ。あとは、MTUを確認できること。