Daisuke's TechBlog

日々の仕事で得た技術的なことを書いてきます

Laravelでデータベース接続のリトライ

2017/12/26追記

業務で組み込んでみましたが、他と組み合わせるとうまく動かず。。 もし、解決策が分かったら更新します。。


久々の投稿です。あまり情報が載ってなかったので。。

目的

LaravelでDB接続リトライを指定回数行えるようにしたい

背景

今度お仕事でLaravelというPHPフレームワークを使うことになりました。
要望として、DB接続ができなかった場合に何回かリトライして欲しいとのことでした。

本題

いろいろ試行錯誤はしましたが、結論だけ書きます。
Laravelにはファサードという仕組みがあります。
ファサード 5.5 Laravel

公式サイトによると、「db」という文字列をファサードを利用して設定することにより、
DatabaseManagerクラスの差し替えが可能らしい。
ファサード 5.5 Laravel

さらに、実際にDB接続を失敗させてみたExceptionのスタックトレースを見ると、
DatabaseManager#__call というメソッドがreadのときもwriteのときも呼ばれている模様。

overrideしてこのメソッドでリトライしてあげれば良さげ。
(ここはちょっと自信ありません。試してみた結果だし、アンスコ2個付いてるメソッド名だし。。(でもpublicだし))

で書いたclassがこちら。

<?php

namespace App;

use Exception;
use Illuminate\Database\DatabaseManager;
use Illuminate\Support\Facades\Log;

class DBManager extends DatabaseManager
{

    function __call($method, $parameters)
    {
        $i = 0;
        while (true) {
            try {
                $i++;
                return parent::__call($method, $parameters);
            } catch (Exception $e) {
                Log::warning("Connection failed...");
                if ( $i >= 3 ) {
                    throw $e;
                }
                Log::warning("Retry!");
            }
        }
        return null;
    }
}

(3ってマジックナンバーだけどお仕事の時はちゃんとconfigから読むようにしますよ。)

まだクラスを作っただけなのでLaravelとは関連付けられてません。
今回は AppServiceProvider#register にて関連付け(差し替え)を行いました。

    public function register()
    {
        $this->app->singleton('db', function ($app) {
            return new DBManager($app, $app['db.factory']);
        });

    }

singletonというメソッド指定はLaravel内部でそういう指定の仕方をしているため。
(ここも公式ドキュメントに載せてほしいなあ。。) github.com

DB接続を失敗させてみます。 ※今回はDebugBarで確認しています。 f:id:hiromitsu-daisuke:20171125202559p:plain

ちゃんとリトライするようになりました。

まとめ

本当にこれで正しいのか分からないのでツッコミ待ちですが、
一旦はこれで要件は満たせそうです。

cssフィルター

cssで画像にいろいろ効果が与えられるcssフィルターを試してみました。
現在、ブラウザプレフィックスが必要な状況ですが、簡単に効果が適用できます。

See the Pen mERXqe by HIROMITSU Daisuke (@daisuke718) on CodePen.

画像はレナさんを使わせてもらいました。
SIDBAというものがあるらしく、そちらのものを利用させてもらっています。

フォントアイコン

フォントアイコンについて勉強(?)してみた。
Font AwesomeとGoogle Material Icons (Font) を試しました。

fontawesome.io

design.google.com

実行例

以下実行例です。
サイズと色変えられるようにしておきました。
「!important」をつけないとGoogle Material Iconsの方はサイズが変わらなかったです。
これはライブラリ側でサイズ指定されてて、そっちが優先されるからっぽいです。

See the Pen font-icon by HIROMITSU Daisuke (@daisuke718) on CodePen.

仕掛け

それぞれlinkタグでcssを読み込んでいます。

  • Font Awesome
<link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet">
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">

フォントの調べ方

Font Awesomeはclass指定、Google Material Iconsはタグ内のテキストで表示するアイコン(文字)を選べる。 (個人的にはGoogleの方はどうやって動いてるか気になった。。どうやってるんだ)

  • Font Awesome
    Cheat Sheetというのがあり、このページにアイコンとそれに対応するclassが一覧されている fontawesome.io
  • Google Material Icons
    こっちはページで欲しいアイコンをクリックして一番右の「ICON FONT」をクリックするとテキストが分かる。
    タグはなんでも良いみたい。
    design.google.com

まとめ

大きさとか色とかcssで自在なので、ダウンロードボタンとかのちょっとしたものに使えそうですね。

以上です。

CSSアニメーション基礎編を勉強してみた

CSSアニメーションについて勉強したのでまとめ。

Mozillaさんがまとめてくれてたのでこれに従って勉強しました。

developer.mozilla.org

以下、見出しはMozillaの記事に合わせてます。

文字列がブラウザのウィンドウを横切る

以下のようなことが分かりました。

  • @keyframe XXXという行でアニメーションに名前をつけて、
    animation-nameでそれを使うとアニメーションしてくれる模様
  • keyframe内のfrom, toでアニメーション前後のcssが定義できる模様

ほぼそのままですがコード書いてみました。

See the Pen CSS Animation - slidein(from right to left) by HIROMITSU Daisuke (@daisuke718) on CodePen.

ちなみに最初keyframe内のwidth指定いらないんじゃないかと思ったんですが、必要でした。
100%だとfromのタイミングで画面外に出られずに文字列が縦に並んだ状態になってしまいます。

キーフレームを追加する

これ、MozillaのCodePenの内容は間違いでした。
パーセントはkeyframe内に書くと以下のように途中で大きくなって終わるに従って元のサイズに戻ってくれます。

See the Pen CSS Animation - slidein(from right to left) by HIROMITSU Daisuke (@daisuke718) on CodePen.

アニメーションを繰り返す

上記にanimation-iteration-count: infinite;を加えただけで永遠に繰り返してくれます。

See the Pen CSS Animation - slidein(from right to left) + font-size change + infinite loop by HIROMITSU Daisuke (@daisuke718) on CodePen.

前後に移動させる

これも上記にanimation-direction: alternate;を加えるだけです。
スライドインとスライドアウトを繰り返すようになりましたね!

See the Pen CSS Animation - slidein(from right to left) + font-size change + infinite loop + alternate by HIROMITSU Daisuke (@daisuke718) on CodePen.

まとめ

あとjsでアニメーションイベント拾うとかありますけど、それはまたの機会に。
繰り返しとか逆再生とか意外と簡単にできていい感じです。
今回のを応用するとスライドインだけでなく他にもいろいろできそうですね。
左から右へのスライドインもやってみようかと思ったけど難しかったのでこれもまたの機会に。

追随あれこれ

Webページで部品を追随させるようにするcssの書き方集。 昔は結構苦労した気がするけど、CSS3だと結構楽に書けるようになってる(・∀・)イイネ!!

  • position: fixedを使った方法
  • position: stickyを使った方法
  • FlexBoxを使った方法

他にもあるかもしれないけど、今回はこの3つについてそれぞれ見ていきます。

position: fixedを使った方法

これはCSS3以前の従来の書き方と思います。
HTML部品を固定させますが、top, leftなどで位置の指定が必要になります。
position: relative等を駆使すれば指定しなくて良いやり方もあった気がしますが、、
面倒なので割愛しますw

↓スクロールしてみてください。 followがスクロールに追随します。

See the Pen Scroll Follow 1 by HIROMITSU Daisuke (@daisuke718) on CodePen.

position: stickyを使った方法

画面の上にぴたっと張り付いてスクロールします。
親要素が画面内にいる間だけ追随してきます。
スマホサイトなどのトップバーなどに使われるようです。
この方法ですが、残念ながら現在Chromeではサポートされてません><
Firefoxなどで見てもらうと追随が確認できると思います。

ブラウザサポート状況:
Can I use... Support tables for HTML5, CSS3, etc

See the Pen Scroll Follow 2( sticky ) by HIROMITSU Daisuke (@daisuke718) on CodePen.

FlexBox を使った方法

モダンな書き方がこれみたいです。
こちらはどのブラウザでも動く模様。
HTMLもシンプルで、上記position: fixedの改良版と言った感じです。
追随を実現させるために使いましたが、Flexboxはそのためだけの機能では無いようです。
結構奥深そうなので、フロントエンジニアの方は勉強しておいた方がいいかも。

See the Pen Scroll Follow 3( FlexBox ) by HIROMITSU Daisuke (@daisuke718) on CodePen.

まとめ

最初にも書きましたが、昔はjsとかHTMLの工夫とかで苦労して書いてたのが簡単に書けるようになっててすごく良い。
stickyとFlexboxは用途によって使い分けすると良いかなという感じです。
ただ、position: stickyがChromeで動かないのが痛い。 Chromeさん対応待ってます!!

vimで定義元ジャンプしたいときはctags

先日、仕事でちょっとしたコード解析をしなければいけなくなりました。
わざわざIDEとかまで使って環境構築までしたくないなあと思い、
vimでやってみようと思いました。(vim使いなので)

そしたらすぐ見つかりました。
しかもすごい簡単。ほんとにこういうちょっとした時用のものを見つけました。
ctagsというコマンドです。

Ctags - Wikipedia

vimのコマンドというよりはコードベース走査のコマンドみたいですね。
(vim以外でも使える模様)

使い方も簡単で、

$ cd <プロジェクトルート>
$ ctags -R

とするだけ。
実行すると、カレントディレクトリにtagsというファイルができるので、
あとはvim等のエディタにこれを認識させれば定義元ジャンプができるようになります。

vimの場合、デフォルトでカレントディレクトリのtagsファイルを読みこんで認識するようになっているようです。
vimでのタグジャンプは、対象のメソッドやクラス名にカーソルを合わせておいて、「Ctrl+]」でできます。

以上です。

アンケートアプリのご紹介

今回はアンケートアプリのご紹介をします。
ちょっとしたお小遣い稼ぎができるのでオススメです。
なお、僕がandroidユーザのため、androidアプリのみの紹介になります。

ご紹介するのは次の3つです。
いずれも、一定の頻度で選択式の簡単なアンケートが来ます。

  • Google アンケートモニター
  • スマートアンサー
  • TesTee
Googleアンケートモニター

Get it on Google Play

Googleさんのアンケートです。
報酬としては、Google Playのクレジットがもらえます。
僕の場合、8ヶ月くらいで1300円分くらい貯まりました。

スマートアンサー

Get it on Google Play

アプリのクオリティがすごい!
さすがコロプラさんという感じです。
始めたばかりですが、回答していて心地良いです。

TesTee

Get it on Google Play

2者択一形式で5問1セットで1日3セット程度来ます。
このアプリも始めたばかりです。簡単で良い。

以上です。(ステマみたいになってしまった;;)