2018年 06月の投稿を表示しています

git で用済みのブランチをまるっと消す

普段の開発はもちろん、確認用!作業用!などとやったり放っておくと増えていくブランチを一掃する。

基本的には master をチェックアウトしてからやったほうがいい。
別のブランチから見たときに、あるブランチがマージされていないように見えることがあるので、基本的には master ブランチをチェックアウトしてからやったほうがよさそう。
それも組み込めないかなあ、、シェルスクリプトだなー

ローカル用

git branch --merged | grep -v '*' | grep -v 'master' | xargs git branch -D

リモート用

git branch -a --merged | grep remotes | grep -v HEAD | grep -v master | sed -e "s/remotes\/origin\///" | xargs git push --delete origin

マウスホバーでAjaxしてコンテンツを先読みキャッシュ

なんとなく思いついて、このブログに入れてみて機能の紹介。

link rel=prefetch

HTML の機能として、指定した URL の内容を先読みして、内容をキャッシュしておいてくれるものがあります。
詳しいことは MDN を見るとよいかとー。

rel="preload" によるコンテンツの先読み - HTML: HyperText Markup Language | MDN
Link prefetching FAQ - HTTP | MDN

preload と prefetch って??という場合にはこちらの記事もおすすめです。

Preload を用いたリソースプリローディングの最適化 | blog.jxck.io

なぜ onHover で prefetch ?

ちゃんと計測したことないのでわからないですけど、リンクをセカセカ、サササッ!とクリックすること、あまり無いですよね?読み物系ならとくに。

わずかにホバーする時間があってからクリックするのかなあと思ったので
じゃあそのタイミングで先読みしたら爆速 Web サイトが体験できるんじゃ?と思った次第です。

コード

// prefetch link
let prefetchTimers = {};
let prefetcedLinks = {};
document.querySelectorAll('a').forEach((element) => {
    element.addEventListener('mouseenter', (event) => {
        if (element.href.indexOf('#') !== -1 || element.href.indexOf('javascript:') !== -1) {
            return;
        }
        if (element.target === '_blank') {
            return;
        }
        if (prefetcedLinks[element.href] === true) {
            return;
        }
        prefetchTimers[element] = setTimeout(() => {
            const prefetchTag = document.createElement('link');
            prefetchTag.rel = 'prefetch';
            prefetchTag.href = element.href;
            document.head.appendChild(prefetchTag);
            prefetcedLinks[element.href] = true;
        }, 300);
    });

    element.addEventListener('mouseleave', (event) => {
        if (prefetchTimers[element] !== undefined) {
            clearTimeout(prefetchTimers[element]);
            delete prefetchTimers[element];
        }
    });
});

遷移先別に、ホバー用タイマーと読み込み有無を記録しています。
ホバーから外れるとタイマーを削除し、ホバーが外れずにタイマーが経過すると prefetch が登録されます。

爆速 web サイトは体験できるのか?

prefetch 無し

prefetch あり

1 秒ちょっとかかっていたのが 300ms ほどに収まるようになりました!すごい!

まとめ

prefetch で爆速 web 体験ができるかも。
結局作ってみた満足度が高いことが主になっているので、ガチプロダクトでやってくなら本当に効果あるの?その機能使われている?は別途ちゃんと計測しないとねーーー。
あとは prefetch すればギガ減るよね、というかスマホ対応できないなこれ。スマホ対応ってどうすんだろ。

工業的 Minecraft プレイ日記 #3 / TinkersConstruct を始める

ネザーにいくと見慣れないアーダイトという鉱石がありました。要求採掘レベルはコバルトです。
同時にコバルト鉱石もありました。こちらも要求採掘レベルはコバルトです。

…と、わけがわからなくなり wiki を見てみると、黒曜石の頭を持ったピッケルがその採掘レベルを持っているようです。

Material Stats | Tinkers' Construct Wiki | FANDOM powered by Wikia

というわけでコバルト、アーダイトを取り、最強のツールを作るために TinkersConstruct を始めます。

 

TinkersConstruct は各ツール(ピッケル、シャベル、斧、剣、弓、あるいは追加されるもの)について、部品ごとに作り、組み立て、拡張素材をつけることができます。

MOD 解説/Tinkers' Construct - Minecraft Japan Wiki - アットウィキ

 

部品の素材、拡張素材によって効果や耐久、採掘レベル、攻撃力、採掘スピードが変わるので、うまく組み合わせて行くことで最強に便利なツールもできます。
が、それはま追って。

 

まずは製錬炉を作ります。
Smelter を組み立て、コントローラーを使えるようにします。タンクも壁としてカウントされ、バケツで溶岩を入れることを忘れずに。中が 2x2 くらいあれば 1 段でもおけです。小さすぎると一度に溶かせる量が減って面倒です。
型を置く台 Casting Table を用意します。このときに下にホッパーおいたら、冷え固まったものが勝手にチェストへ流れるので便利。

配置を上から見ると、こういう感じ。

下段
 □ □ □ □
 □ ■ ■ □
 □ ■ ■ □
 □ □ □ □

上段
 □ ■ ■ □
 ■ □ □ ■
 ■ □ □ ☆
 □ ☆ ■ □

☆ = コントローラー、タンク

金型は金を使う必要がある。インゴットを置いて、インゴットの型を取ってみる。

鉄を溶かして、鉄インゴットを量産してみる。

ホッパーを下に置いた。これで金型に入れて固まったものは自動でチェストへ。

ここから黒曜石ツルハシを作っていくわけですが、
金属素材を使うには Smelter で溶かし、金属型あるいは使い捨ての粘土型に流し入れる必要があります。非金属素材、ようは木材や石は専用の作業台で作れます。

金属型をつくるには、丸石でツール素材を作り、そこに溶かした金を流し入れます。

今回はとりあえず黒曜石を掘ることができればよいので、ツルハシの頭だけ黒曜石、あとは適当に木や石で作ります。

各種作業台を用意して

木型を作り

石の部品を作り

金型を取る

あとは黒曜石を流しいれて、組み上げて…

完成!

これでコバルトとアーダイトが掘れるようになりした。

Mekanism の 3~5 倍化には対応していないので、製錬炉で地道に 2 倍にしていきます。

 

つづく。

セルフメディケーション税制とやらを調べたメモ

ドラッグストアにいったら「セルフメディケーション税制でうんたら〜〜〜〜」って書いてあってなんじゃそらってなったので調べた。

治療費控除

めっちゃ医療費かかったわーという人のための所得控除。たぶん。

その年(1 月 1 日から 12 月 31 日まで)の間に、自分か、生計を一緒にする配偶者や親族が、支払った医療費が対象。

対象者が支払った医療費から、保険による補助を引いて、さらに 10 万円を引いた金額に対して、所得控除ができる。

最大で 200 万円。
10 万円を引いているのは最低ラインのこと。

領収書、医療費控除の明細書、源泉徴収票を確定申告で提出すると控除できるみたい。

参考リンク、医療費控除、のページから具体例がいくつか書いてあって、出産、入院、歯の治療なども対象になるって。

セルフメディケーション税制

医療費控除の特例ってやつで、規模を小さくして、自分でやった分も控除します!というもの。

対象者は同じで、対象になる費用が、特定一般用医薬品等購入費、になっている。
購入費から 1 万 2 千円を引いて、最大で 8 万 8 千円を対象に、控除の申請できる。

特定一般用医薬品、要はドラッグストアで買える、一類二類三類とかってお薬その他だと思えば良い。

購入したときに、レシートに対象品です!と明記されるので、それでわかるはず。パッケージにも書いてあるそう。
ドラッグストアなら薬剤師さんがいる場合もあるので、その手の専門家に聞くのもよさそう。

あとこの控除を受けるためには、行政や保険組合が出している健康診断や検診、予防接種を受ける必要がある。

控除の申請には、セルフメディケーション税制の明細書と、健康診断やったぜ書みたいなものを出さないといけない。

そのほか、所得控除

所得控除は所得金額から一定額引いて、残った額に対して所得税をかけるよ!というもの。
保険に入ったり、扶養家族がいたりすると控除が増えてく。

自動でならないのもあるので、医療費控除のように確定申告だしたり、年末調整的なやつをちゃんとやったりしないといけない。

参考リンク

No.1120 医療費を支払ったとき(医療費控除)|国税庁

No.1129 特定一般用医薬品等購入費を支払ったとき(医療費控除の特例)【セルフメディケーション税制】|国税庁

所得金額から差し引かれる金額(所得控除)|国税庁

PHP で時間を固定した未来にしたりしたい

PHP で時間が絡むようなテストをしていてコケたりコケなかったりした。

具体的には、登録してから〇〇時間後にあるメソッドが呼ばれたら、ステータスを xx に変える、みたいなもの。

そんなときに使えるアイデアを3つ。

Carbon を使っている場合

Carbon なら setTestNow を使うと良い。
各テストで、好きなように setTestNow を書く。

Carbon::setTestNow(Carbon::parse('ここに時刻'));

特に時刻の希望がなく、現在時刻を固定したいだけならこれで。

Caron::setTestNow(Carbon::now());

それと tearDown で引数なしで呼べばよい(事故防止)

public function tearDown()
{
    parent::tearDown();
    Carbon::setTestNow();
}

Carbon - A simple PHP API extension for DateTime.

Chronos を使っている場合

Chronos にも Carbon と同様に setTestNow が用意されている。助かる〜。

使い方は Carbon のソレと一緒。

Chronos - 3.6

php-timecop を導入する

特に何も導入してなくて DateTime をもりもりやってたり、もはや date や time が乱立してたらこれしかお手軽な手は無いか。
PHP 拡張として動作して PHP が扱う時間をコントロールするツワモノ。

テスト用途だけじゃなくて、例えばあるページが未来ではどのように見えるかの動作確認用とか、プロダクション用途としても使える。(使ったことがある)

remi や brew pecl で配布されているので導入もお手軽。

GitHub - hnw/php-timecop: A PHP extension providing "time travel" capabilities inspired by ruby timecop gem

(余談だけど mac 上でやろうとしたら homebrew の php が core にくっついて拡張の類がなくなったので pecl から入れる必要があった)

ざっくりとはこんな感じ strtotime でもいい。

var_dump(date('Y-m-d H:i:s'));
sleep(3);
var_dump(date('Y-m-d H:i:s'));

timecop_freeze(new DateTime('2018-01-01 12:00:00'));

var_dump(date('Y-m-d H:i:s'));
sleep(3);
var_dump(date('Y-m-d H:i:s'));

timecop_return();

var_dump(date('Y-m-d H:i:s'));
sleep(3);
var_dump(date('Y-m-d H:i:s'));
string(19) "2018-06-14 12:05:05"
string(19) "2018-06-14 12:05:08"
string(19) "2018-01-01 12:00:00"
string(19) "2018-01-01 12:00:00"
string(19) "2018-06-14 12:05:11"
string(19) "2018-06-14 12:05:14"

そのほか

そもそもの設計として、外からオブジェクトをインジェクション出来るようにするほうが何かと便利っぽい。
とはいえ無理な状況ってあると思うので、そういうときにここで挙げたアイデア使えるんじゃないかな。timecopとかすごい。

工業的 Minecraft プレイ日記 #2 / 資源を集めたり拠点周辺を探索した

目次的なもの:
工業的 Minecraft プレイ日記 #0 / またもや工業生活を始める | ごみばこいん Blog


周辺をざっくり探索します。
Tinkers Construct の話は次にします。

Xaero's Minimap でマーカーを設定する

周辺を探索して、後で見る的なものをマーキングしました。

近くにゾンビスポナーがあったので、あとでトラップタワーか EnderIO の電力スポナーに使おうと思います。

また、近くに Roguelike Dungeons の施設がありました。
ここを少し探索します。

Roguelike Dungeons

中は階層構造になっていて、様々なところにチェストやスポナーが仕込まれています。

螺旋階段があるところで下の階層に降りていけます。
階層を降りるにつれて、よりスポナーの数が増えていて、かつ他 mod の影響下もしれませんが、エンチャントされた装備品もつけていました。

なんの準備もしていなかったので、二層目が限界です。
武器と防具を整えてまた来ます。

ちなみに、チェストの中はまあまあ微妙で、エンチャントがついた装備品や鉱石の類です。普通に掘って装備品作ったほうが早いのでは~~くらいの微妙さです。
偶然だと思うのですが The Ender が入っていました。序盤にこれはなかなか強い。しばらくメイン武器にします。

EnderZoo の土 mob

EnderZoo を入れていると、土をシャベル以外で壊したときにたまにびよ~~~んと飛んでくる mob が出現します。
意外と固いので、普通に作業しているときにこまるなあって感じです。

Ruins の謎オブジェクト

チェストも mob もいないので、ただの飾りでした。

浮島、Tinkers Construct のスライム島

上から青いスライムが落ちてきました。

Tinkers Construct のスライム島だと思います。
日本 wiki だとミニマップ系 mod に表示されないって書いてありますが Xaero's Minimap では出ています。

Thermal Cultivation のジョウロ


ジョウロを作りました。
作物は放置していても育ちますが、いま!すぐ!ほしい!というときに、成長を促すためのやつです。
ジョウロで水をすくって、ぶっかけます。

手動ではありますが、ぐいぐい育つので、しばらくパンが主食になります。
もみじ mod のスプリンクラーよりも早いですが、手動なのがネックですかねえ。自動で動かせないかな。

黒曜石を掘る

水をバケツにいれて、溶岩だまりにどばーっとぶっかけて Vein Miner の一括採掘機能をガシガシ掘ります。
すぐに掘り切れるので超便利。もちろん掘ったブロック数だけ耐久度も減ってます。

Storage Drawers の引き出しを作る

石や黒曜石など、大量にとってしまうものをしまう引き出しを作りました。
これらによってチェストが侵食されることがなくなりました。

ネザーにやってきました

とりあえず丸石で囲みました。奇遇にも近くに要塞っぽいものが見えます。
中をちょろっとだけ見ていきます。

しんでしまいました

GraveStone Mod のおかげで、死亡時のアイテムリストがみられるのと、その時の場所に墓石が出来て、アイテムを安全にしまっておいてくれます。
素手で壊すとアイテムが取り出せますが、飛び散るので注意って感じです。

帰ってきました

そこそこいろいろありました。
馬鎧は微妙ですね…レシピを見ると、鉱石に戻せるっぽいです。

ちなみにこれは Backpacks!で作ったバックパックにアイテムをしまっています。
追加でインベントリができるので便利。

authorization と authentication の話。そして Laravel の Gate の紹介をちらっと。

要するに、認証と認可は別物だよって話。

 

ざっくりとまとめると。

認証 Authentication
あなたは誰ですか
私は X というユーザです、パスワードはこれです
確認しました X で間違いないです

 

認可 Authorization
X です、管理画面を開きたいです
あなたは管理画面への"鍵"をもっていません、拒否します

 

もうちょい例。
世帯主じゃなくても、家の鍵を持っていれば家に入れる。=認可
世帯主かどうかは公的文書(住民票とか)で確認する。=認証

 

で、じゃあ Web ではどうやんねん、というと、
(例によってよく使うものだけ紹介)

CakePHP ならこのあたりにまとまってる。

認証 - 3.6

 

Laravel だと分かれてる。使う仕組みが違うので別項目になってるって。

Authentication - Laravel - The PHP Framework For Web Artisans
Authorization - Laravel - The PHP Framework For Web Artisans


Laravel の Gate の説明をちゃんと見てみたの初めてだけど Gate かっちょいいな、権限管理とか、できるできないみたいな話がわりかし簡単にかけそう。

できるできないはこういう風に AuthServiceProvider->boot に書いたり。

Gate::define('update-post' function ($user $post) {
    return $user->id == $post->user_id;
});

こういう形で クラス名 @ メソッド名 として外だししたり。

Gate::define('update-post' 'PostPolicy@update');
class PostPolicy
{
    public function update(User $user Post $post)
    {
        return $user->id == $post->user_id;
    }
}

でもって、定義した Gate は、コントローラーだったりモデルだったりで、こうやって使えるらしい。

if (Gate::forUser($user)->allows('update-post' $post)) {
    // The user can update the post...
}

あとは、ポリシーを定義することができて(↑にある PostPolicy@update という書き方で使えるものとは異なる)
Eloquant に対して view/create/update/delete がそれぞれ権限ありますか?というのをお手軽に内部でつないでくれるらしい。

たぶん実際のユースケース的にはいろいろ分割しやすいこの書き方がいいんじゃなかろうか。

AuthServiceProvider はこういう感じで

class AuthServiceProvider extends ServiceProvider
{
    protected $policies = [
        Post::class => PostPolicy::class,
    ];
...

ポリシークラスのほうはこんな感じ。

namespace App\Policies;

use App\User;
use App\Post;

class PostPolicy
{
    public function update(User $user Post $post)
    {
        return $user->id === $post->user_id;
    }
}

さっきの update とまったく同じなんだけど、こうすることで AuthServiceProvider が勝手に Post を監視してくれて PostPolicy に書かれている通り update 時のチェックを実行して true なら update ができる、というようなことをやってくれるんだそうだ。

便利~~~~。

 

例えば wordpress 的なものをイメージして、簡単にやってみると。

  • 投稿
    • 管理者でログインしていれば投稿の作成、編集、閲覧、公開設定にすることが可能
    • 編集者でログインしていれば投稿の作成、編集、閲覧、が可能。公開設定にはできない
    • ログインしていなければ投稿の閲覧が可能
  • コメント
    • 管理者でログインしていればコメントの作成、削除、公開されたコメントの閲覧、管理者向けコメントの閲覧が可能
    • それ以外は作成と、公開されたコメントの閲覧のみ可能

みたいなのも Gate をつかったらぱっぱっぱ~~~ってかけそうだって思った。
投稿ポリシーとコメントポリシーを、それぞれ書いてある通りに定義すればいいだけだし、仕様を形にするのが簡単そうだ。

んん~~~、使いどころがあれば使いたいなあ。