cssアニメーションとjsの同期

この記事はMojirageアドベントカレンダーの21日目の記事です。
matatsuna.hatenablog.com

cssのアニメーション

cssにはアニメーションがあります
詳しくはQiitaとかで
qiita.com

cssアニメーションとjsとの同期

ビジュアル的なカウントダウンするバーみたいなものをjsからリアルタイムに動かすのは少しコスト面から望ましくないです
そこで今回はcssアニメーションとjsの同期の方法を紹介します
挙動としては、「5秒間のアニメーションを流し終わったら処理をする/5秒間のうちにキャンセルされたら破棄する」です
流れは

  • jsでcssアニメーションを発火する
  • 発火したとき、終わるときのしてほしい挙動をsetTimeoutに仕掛ける
  • 時間が来る前にキャンセルされたらclearTimeoutする

ソースコード

mojirageでは「マウスが上がって5秒(任意)経ったら平均化を実行する」としているのでその例を紹介します
HTML側

<div id="line" class="line"></div>

CSS

.line {
    position: absolute;
    top: 0px;
    width: 100%;
    height: 5px;
    background: #17cddd;
}
.fullwidth {
    animation-name: anime1;
    animation-duration: 2s;
    animation-timing-function: linear;
    animation-iteration-count: 1;
    animation-direction: normal;
}
@keyframes anime1 {
    0% {
      width: 100%;
      height: 5px;
      background-color: #17cddd;
    }
    100% {
      width: 0%;
      height: 5px;
      background-color: #17cddd;
    }
}

JavaScript

mouseDown() {
    if (this.splitSetTimeout != null) {//もし仕掛けられていたら
        var line = document.getElementById("line");//lineのdomを取得
        line.className = "line";//元に戻す
        clearTimeout(this.splitSetTimeout);//仕掛けを破棄する
        this.splitSetTimeout = null;
   }
}
mouseUp() {
    const splitTime = this.userConfig.splitTime * 1000;//ミリ秒に変換する
    if (this.splitSetTimeout === null) {//もし仕掛けてなければ
        var line = document.getElementById("line");//lineのdomを取得
        line.className = "line fullwidth";//クラスを追加
        line.style.animationDuration = splitTime + "ms";//発火するまでのミリ秒を設定
        this.splitSetTimeout = setTimeout(() => {//setTimeoutを仕掛けて入れる
           //時間が経ったら動かすプログラム
        }, splitTime);//発火するまでのミリ秒を設定
    }
}

lineのdomを変数に入れてた方がいいですね

これで、cssのアニメーションと連動させてjsを動かすことが簡単にできると思います

imagemagickでsvg to png

この記事はMojirageアドベントカレンダーの20日目の記事です。
matatsuna.hatenablog.com

imagemagickとは

imagemagickは画像に関わる様々なことができるコンソールで動かすプログラムです
www.imagemagick.org
色んな所で使われてます
しかし、少し変わったことが最近あります
バージョン6までは convert なのですが、バージョン7からは magick に変わってるのでググる時に注意です

svg to png

作ったsvgファイルをどうにかして画像にしようとしたのですが、一番簡単なのはimagemagickでした

> magick -density 100 hoge.svg hoge.png
  • densityで画質の調整することができます

参考サイト

www.imagemagick.org

PHPでGoogleログイン機能

この記事はMojirageアドベントカレンダーの19日目の記事です。
matatsuna.hatenablog.com

Googleログイン機能

よくWebサービスであるgoogleのログインの実装の仕方です
gyazo.com

Google consoleでkeyを発行する

https://console.cloud.google.com/?hl=ja
APIとサービス」の認証情報を作成すれば、クライアントIDが取得できます
制限などはお好きに
今回はGmailのアドレスとユーザー名を取得するだけなので特別なAPIの有効化はいりません

indexとcallback

index.php

<?php
$AUTH_URL = 'https://accounts.google.com/o/oauth2/auth';
$params = array(
  'client_id' => $CONSUMER_KEY,
  'redirect_uri' => 'http://~~~~~~~~~~~~~~~~~~~~~~~/callback.php',
  'scope' => 'profile email',
  'response_type' => 'code',
  'access_type' => 'offline'
);
header("Location: " . $AUTH_URL. '?' . http_build_query($params));

callback.php

<?php
$TOKEN_URL = 'https://accounts.google.com/o/oauth2/token';
$INFO_URL = 'https://www.googleapis.com/oauth2/v1/userinfo';
$APP_URL = $_GET["state"];
$params = array(
    'code' => $_GET['code'],
    'grant_type' => 'authorization_code',
    'redirect_uri' => 'http://~~~~~~~~~~~~~~~~~~~~~~~~/callback.php',
    'client_id' => $CONSUMER_KEY,
    'client_secret' => $CONSUMER_SECRET,
);
$options = array('http' => array(
    'method' => 'POST',
    'content' => http_build_query($params)
));
$res = file_get_contents($TOKEN_URL, false, stream_context_create($options));
$token = json_decode($res, true);
if (isset($token['error'])) {
    echo 'エラー発生';
    exit;
}
$access_token = $token['access_token'];
$params = array('access_token' => $access_token);
$res = file_get_contents($INFO_URL . '?' . http_build_query($params));
$res = json_decode($res, true);
var_dump($res);
//    $res["email"] email
//    $res["name"] ユーザー名

これで取得できます
ただし、ローカル環境でする場合127.0.0.1ではなくてlocalhostじゃないとエラー吐くようです