つよく、やさしく、泥臭く生きていくブログ

日常とポエムと、ときどき技術

あけましておめでとうございます。第2019回

あけましておめでとうございます。
1月1日0時からFGOイベントが始まって忙しいです。

いよいよ平成残すところわずかとなりましたがここで昨年を振り返りましょう。

1月

Kindle買ったんすね。結局あんまり使ってないな、、 確かこの辺で流行りに乗って仮想通貨ちょっと買ったんすよ(察し

2月

寝屋川ハーフマラソンを完走。 目標の2時間半切り達成できてよかった

3月

女の子と一緒にプリキュア映画見に行った

4月

仕事が激動でしたね。いや、やってる業務は変わらないんですけど。
チーム(実働4人)のリーダー的ポジションの人が異動になって自分がリーダーポジションになりました。
そして一人は別チームに持っていかれて実働3人になりました。 3人のうち一人は元リーダーの後任でやってきた人なので、まずその人にいろいろ教えたりできるところからやってもらったりっていうあたりで頭使いました。

5月

ゴールデンウィークにアマプラでふたりはプリキュアを全話見ました。改めてみると最高に最高で最高って感じでまさにレジェンドだった。

6月

地震ありましたねーびっくりしました。
なぜか毎日パスタを作ってました。 イタリアンのレシピ本買ったからね。

7月

このくらいだったかな、4月に来てたチームメンバーが別チームに持っていかれて、実働2人になりました。業務は変わっていません。むしろ増え気味です。

8月

富士山登った!ご来光見たよ。
いいもんですね。一生に一度は日本のてっぺん行くの良いと思いますよ。 めっちゃ寒かったね。

9月

台風でしたねーびっくりしました。
停電は1時間くらい×2回くらいだけだったんですけど、なぜかこんなときに冷蔵庫の扉が閉まりきってなくてね、次の日部屋がめっちゃ寒くて、「台風過ぎ去ったら急に冬が来たのか?」と思いました。

10月

女の子とプリキュア映画観に行きました。
いやこの映画最高だったんでみんな観てください。

11月

夜の公園でランニングと筋トレを始めました。なんとか継続しています。月火木だけやってます。コツはちょっとしかやらないこと。公園を一周して、鉄棒とぶら下がるやつで少しの筋トレ。最後に公園を一周しておしまい。 家を出てから家に戻ってくるまで30分くらいだけです。

12月

朝ごはん食べるのが習慣化してきました。良い生活をしている感が出て良いです。

今年もソラーレの定演が無事に終わった。
1stはつらいよ

IBEの演奏会聴いてすげーなーと思ってトランペット(2万くらい)をポチった。

といった感じ。

仕事面においては、リーダポジション&削られるチーム&新案件いろいろってな感じで、どうすりゃいいのかなーと悩む一年でした。
そろそろ慣れてきたので図太い神経で生きていきたい。

プライベートに関しては、まあ最近筋トレと朝ごはんの習慣が付いてこれは良い。 あとはもう少し人間面と技術面での向上というか、前向きになりたいっすね。

楽器に関しては、音を出す基礎をちゃんとするのと、スケール練習をしっかりやっていきたい

平成最後の平成31年頑張っていくぞ!

たくさんのWebページのSSL証明書の有効期限を確認する

ちょっと大量のドメインSSL証明書を確認する必要があった。

openssl コマンドで確認する

$ openssl s_client -connect example.com:443 -showcerts < /dev/null 2>/dev/null |  openssl x509 -dates -noout

各部分の説明

$ openssl s_client -connect ${domain}:443 -showcerts

このコマンドで、証明書情報とれる。
ただし、このコマンドだけでは接続中の状態になるので、 Ctrl + cとかで終わらせないと、次のパイプにつなげたときに上手くいかない。
ので、

< /dev/null 2>/dev/null 

を付けて、終わらす&エラー出力は不要なので捨てる。 これ分かるまでなんかうまいことできなくて詰まった。

 |  openssl x509 -dates -noout

さっきのをパイプで繋げて証明書の中身を見る。
-datesを付けると有効期限とかが出てくる。notAfter=hogehoge って感じで書かれてるのが、有効期限である。

perl で回す

さっきので1ドメイン分が取れるので、普通にシェルの for で回してもいいんだけど、出力を適当に加工したりするかもしれないので融通の利くperlで回す。

for my $domain ( @domain_list ) {
    my $result = check( $domain ) // 'error';
    print "$result : $domain \n";
}

sub check {
    my $domain = shift;
     my $command = "openssl s_client -connect ${domain}:443 -showcerts < /dev/null 2>/dev/null |  openssl x509 -dates -noout";
     my $result = `$command`;
     chomp $result;
 
     if ( $result =~ /notAfter=(.*)/  ) {
         return $1;
     }
}

参考

Perl で SSL 証明書の有効期限を取得する : あかぎメモ

OpenSSLをSSL/TLSクライアントとして使ってみる | Siguniang's Blog

postgresqlを使う

heroku でDB使うならとりあえずheroku postgresかなあというところで、さてpostgresはろくに触ったことがない。
とりあえずローカル環境にposgresを用意した。

これを参考 UbuntuでPostgreSQLをインストールからリモートアクセスまでの手順 - Qiita

  • Ubuntu環境
  • インストール
    $ sudo apt-get install postgresql
    postgresqlをインストールすると、heroku pg:psql -c "\d" とかできるようになった。
    もちろんテーブルとか作ってないので何か出るわけではない。
    ローカルでアプリの動作確認するにはローカルのposgre DBを用意する必要があるので次に進む。
  • postgres サーバ立ち上げ
    $ sudo service postgresql start
  • psql コマンドでpostgresのプロンプトに入る
    $ sudo -s
    # su - postgres
    postgres@VB:~$ psql
    postgresはRoleというものがあり、権限がなければ入れない。
    初期状態では postgres という名前が用意されている。(postgresをインストールするとpostgresユーザが作られる)
    postgres のパスワードが分らなかったのでroot経由で行った。

  • ロール確認・作成
    postgres=# \du
    postgres=# CREATE ROLE yukinea LOGIN CREATEDB PASSWORD 'hogehoge';

  • DB確認・作成
    postgres=# \l
    postgres=# CREATE DATABASE testdb OWNER yukinea;

  • 認証の設定
    $ sudo vim /etc/postgresql/9.3/main/pg_hba.conf
    こんな感じで これのpeer のところをtrustに変更した

# local   all             all                                     peer
local   all             all                                     trust
  • postgres再起動
    $ sudo service postgresql restart

  • 接続
    $ psql -U yukinea --dbname testdb --password

Mojolicious::LiteでLINEログイン

LINEログインしてプロフィール取るところまでできたので忘れないように書いておく。

LINEログインをして、ユーザのuserid、表示名、プロフィール画像を取得して、表示名と画像を表示するところまで。

Perl で Mojolicious::lite でheroku にデプロイしている。
もろもろチェックやなんやらは省略している。

  • 実質のファイルは

    • myapp.pl
    • templates/index.html.ep
    • templates/layouts/default.html.ep
    • cpanfile
      requires 'Mojolicious'; requires 'IO::Socket::SSL', '>=2.009';
    • app.psgi (空っぽ)
    • Procfile
      web: starman --preload-app --port $PORT myapp.pl psgi
  • プロフィールをとるまでは、こんな感じ。

    • ログイン認証させて認可コードを取得する
    • 認可コードを使ってアクセストークンを取得する
    • アクセストークンを使ってプロフィールを取得する
  • ログイン認証させるURLにはいくつかパラメータの指定が必要。 そのうち state は正しいアクセスかどうかを確認するのに使う。 ログイン認証するURLに含めたstateの値と、ログイン後に返ってくるstateの値が一致することを、こっちのアプリ側で検証してやらないといけない。もちろんアクセスごとにランダムな値を設定しないといけない。
    これって要するにMojoliciousのcsrf_tokenを使えばいいんじゃねということで使った。
    ログインボタンのURLに含めるstate=にはcsrf_tokenを入れる。
    csrf_tokenの検証は、普通なら元からあるメソッドでできるが、今回は直に、返ってきたstateの値とこっちのcsrf_tokenの値を比較した。

  • もろもろの値は環境変数に入れておく。heroku側で環境変数を設定する。

#!/usr/bin/env perl
use lib './lib';
use lib './local/lib/perl5';
use Mojolicious::Lite;
use Mojo::UserAgent;

helper is_ok_csrf_token => sub {
    my $self = shift;
    my $csrf_token = $self->session->{csrf_token};
    my $state = $self->param('state'); # csrf_token
    return 1 if $csrf_token eq $state;
    return;
};

helper get => sub {
    my ($self, $arg) = @_;
    my $url    = $arg->{'url'};
    my $header = $arg->{'header'};

    my $ua = Mojo::UserAgent->new();
    my $tx = $ua->get($url => $header);

    if ( my $res = $tx->success ) {
        return $res->json;
    }
};

helper post => sub {
    my ($self, $arg) = @_;
    my $url   = $arg->{'url'};
    my $param = $arg->{'param'};

    my $ua = Mojo::UserAgent->new();
    my $tx = $ua->post($url => form => $param);

    if ( my $res = $tx->success ) {
        return = $res->json;
    }
};

helper get_profile => sub {
    my $self = shift;

    my $access_token = $self->get_access_token;
    my $param = {Authorization => "Bearer $access_token"};
    my $url = 'https://api.line.me/v2/profile';

    my $result_hash = $self->get({
        url    => $url,
        header => $param,
    }) or return;

    return $result_hash;
};

helper get_profile => sub {
    my $self = shift;

    my $access_token = $self->get_access_token;
    my $param = {Authorization => "Bearer $access_token"};
    my $url = 'https://api.line.me/v2/profile';

    my $result_hash = $self->get({
        url    => $url,
        header => $param,
    }) or return;

    return $result_hash;
};

helper get_access_token => sub {
    my $self = shift;
    my $code = $self->param('code');

    my $token_url = 'https://api.line.me/oauth2/v2.1/token';
    my $post_param = {
        grant_type    => 'authorization_code',
        code          => $code,
        redirect_uri  => $ENV{CALL_BACK_URL},
        client_id     => $ENV{CHANNEL_ID},
        client_secret => $ENV{CHANNEL_SECRET},
    };

    my $result_hash = $self->post({
        url   => $token_url,
        param => $post_param,
    }) or return;

    my $access_token = $result_hash->{'access_token'};
    return $access_token if $access_token;
    return;
};

get '/' => sub {
    my $c = shift;

    if ( $c->param('code') && $c->is_ok_csrf_token ) {
        my $profile_hash = $c->get_profile;
        $c->stash('profile_hash' => $profile_hash);
    }

    $c->render(template => 'index');
};

app->secrets([$ENV{MOJO_SECRETS}]) if defined $ENV{MOJO_SECRETS};
app->start;
% layout 'default';
% title 'Welcome';
% my $profile_hash = stash('profile_hash');
<h1>LINE ログインテスト</h1>

<div>
  <a href="https://access.line.me/oauth2/v2.1/authorize?response_type=code&client_id=<%= $ENV{CHANNEL_ID} %>&redirect_uri=<%= $ENV{CALL_BACK_URL} %>&state=<%= csrf_token %>&scope=profile">
LINEでログインする
  </a>

</div>

<div>
    printデバッグ用<%= stash('message') %>
</div>
<% if ($profile_hash) { %>
<div>
  <p><%= $profile_hash->{'displayName'} %></p>
  <img src="<%= $profile_hash->{'pictureUrl'} %>">
</div>
<% } %>

herokuにMojolicious

LINEのbot作りたいと思って、オウム返しするものはこのサンプルコードをherokuにデプロイしてやればできた。
https://github.com/line/line-bot-sdk-perl/blob/master/eg/echo.psgi

前回記事のやり方で、

をおけばOKだった。

でもやっぱりMojoliciousが使いたいというわけで、この辺を見ていた。

Mojolicious::Liteで作ったアプリをHerokuで動かす | nqou.net

「heroku Mojolicious」とかでググるとだいたいこれと似たようなのがヒットするんだけど、どうにも上手くいかなかった。

デプロイしてOpenAppすると「Internal Server Error」の表示。
ログを見ると、「Can't use an undefined value as a subroutine reference at /app/vendor/perl/lib/site_perl/5.22.0/Plack/Util.pm line 145.」っていう表示。
いろいろ試した結果、上手くいった。

結論 Procfile ではなく procfile としていたせい。
頭大文字じゃないとダメっぽい。

とりあえずMojolicious::liteのデフォルトページが表示された。
Mojoliciousの環境さえできればこっちのもんですわ。

herokuにperlアプリをデプロイする

herokuにperlのアプリケーションをデプロイしたい。
herokuじゃない普通の環境であれば、cpanfile でcarton installするんだけど、herokuだとできない。
ブラウザ上のコンソールでちょっと頑張ったけど上手くいかない。
ウンウン悩んでたけど簡単にできる方法があった

あとは、デプロイ元のgithubリポジトリのトップ に適当なapp.psgi と、cpanfileを置いて、herokuでデプロイする。
すると 、デプロイ時に、cpanfileでcarton install したみたいに local ディレクトリが作られている。やったぜ。

Perlは母国語

post.tetsuji.jp

このあたり読んで触発されたので独り言を書く。

僕にとってPerlはプログラム言語の中では母国語なんですよね。なんなら日本語の次に読み書きできる言語といっても過言ではない。
Perlだったらとりあえず何とかできますって感じ。安心感もある。
まあ僕にとっては本当に謙遜でもなんでもなくPerlしかできないってレベルなんですけど。それも、日常会話は問題なくできるけど難しいことは分かんない☆ みたいな。
逆に言うと日常会話レベルなら大丈夫なので、ちょっとしたことはPerlでやりたい。
いいよねPerl。いい意味で適当に書けるし、linux上でだいたいすぐ使えるし。
ちょっとしたjavascript書いてても、「Perlで書きてえ、Perlだったらスラスラかけるのに」みたいなんよくある。
といってもPerlについてはまだまだちゃんと理解したほうがいいことが山ほどあるので、まだまだ付き合っていきたいって感じ。
あとなんか、会社のリポジトリには資産が積みあがってるけど、自分の力として資産が詰みあがってないなあという気持ち。

Perlが古いとか言われるのは、あ、はいそうですねとしか。日本語も古いですし。
Perlが読みにくいとか言われるのも、読みにくいコードは読みにくいですよ。
古文は読めないし、昭和時代の文章でも読みにくいでしょう。
現代語だって、訛りがきつかったら何言ってっか分かんないですし。早口とか、言葉足らずでも分からないのと一緒。
ちゃんと現代の標準語に近い感じで書けばそれなりに読みやすいですし。
誰に言われたか忘れたけど、「Perlは言語だから自然に読めるように書け」と教わりました。
言語なので、同じことを伝えるのにほんと色んな言い方ができるんですよPerlは。
って、Perl以外そんな知らんのに言うのどうなんかなって思わなくもない。

自分のプログラミング遍歴でも書こう。 遍歴っていうほどじゃないんですけど。

HSP

HSPってご存知ですか?僕もよく知りません。
初めてのプログラミングは中学生の時に出会ったHSPでした。
なんでこれを見つけたのかはさて覚えていませんが、当時は僕にとってフリーゲーム全盛期で、自分でも作れる何かを求めて見つけたんじゃないかなあと思います。
時系列の記憶が曖昧ですが、そのとき好きだったフリーゲームの作者さんが、HSPでゲームを作ってたのを覚えています。
変数とか条件分岐とか繰り返しとか、プログラミングのきほんはこれで学びました。
キー入力やクリック入力を取得できることを知って、家族共有PCでキーロガーを仕込みました。陰湿でしたね。
高専入学してからか見学のときか覚えていませんが、プログラミング部に見学に行ったときに「HSP触ってます」って言ったらキョトンとされたのを覚えています。軽くショックでした。

Pascal

教育用の言語?って聞きました。高専1年生でプログラミング基礎みたいなんで使いました。

C言語

高専2年からのプログラミングの授業で使いました。ポインタは分かったけどポインタのポインタが分かりませんでした。
多桁電卓のプログラムを作ったのを覚えています。それはそれで楽しかった。

アセンブリ言語機械語

なんかパチパチやりながら、メモリ番地を指定して、命令を指定して、値を指定して、みたいなやつ 実験でほんのちょっとだけ触った。機械ってすごいなって思いました。

なんか忘れたけどマイコンのやつ

なんか忘れたけどLチカするようなやつ

なんか忘れたけどいろいろ触らしてもらっていい環境だよ高専は(ステマ)

PHP

入社1年目
右も左もPHPSQLも分からないのに、PHPで作られた、なかなかレジェンドな社内基幹システムの軽い(当時としては重い)リファクタリングを命ぜられました。
PHPが分からないなりにプログラミングの基礎知識だけで乗り切りました。

Perl

入社2年目 俺たちのPerlはこれからだ!

Python

今年から。第二外国語