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

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

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

治療費控除

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

その年(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 をつかったらぱっぱっぱ~~~ってかけそうだって思った。
投稿ポリシーとコメントポリシーを、それぞれ書いてある通りに定義すればいいだけだし、仕様を形にするのが簡単そうだ。

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