読者です 読者をやめる 読者になる 読者になる

三角Validator

△をバリデートするブログ

Logitech Bluetooth Illuminated Keyboard K810 US配列買った

f:id:lepton9:20161126123921j:plain

これまでのあらすじ

  • MacWindows共にApple Wireless Keyboard*1を使って入力していた。
  • Apple Wireless Keyboardの浅い打鍵感が好きだった。
  • でも電池の入れ替え面倒だった。
  • WindowsならWindows用のキーボードが使いたかった。
  • コードは邪魔だからワイヤレスのキーボードが使いたかった。
  • US配列が好きだった。
  • テンキーはいらなかった。
  • AltキーはSpaceキーの直ぐ左についていて欲しかった。

そして見つけたのがK810(US配列)だった。

*1:Magic Keyboardの一個前のやつ

続きを読む

Amazon Route 53 + namecheapで運用する独自ドメインメール

スマホの契約をキャリアからMVNOに移行しようと思っていて、そうするとキャリアメールが使えなくなるから、せっかくなら独自ドメインでメールを運用してみようと思った。

独自ドメインメールの運用に必要な作業としては大きく3つがある。

独自ドメインに関しては、Amazon Route 53のレジストラ機能を使って取得したものがあるのでそれを使おうと思う。その流れでDNSもRoute 53を使うことにする。問題はメールサーバー。 個人のメール用途程度でメールサーバーを自分で立てるのはちょっと仰々しいし、セキュリティに配慮したりスパムメール対策もあったりで面倒くさそう。だからメールサーバーをホスティングしてくれるサービスを使うことにした。

メールサーバーの比較

今回メールサーバーに求めるものとして

  • 安い。月100円前後くらい
  • 2段階認証がある

を条件にした。なぜ無料ではない条件にしたかというと、無料サービスはいつ有料になるかわからないから。Google AppsOutlookの前例があるし…。

いろいろ調べた結果、namecheapというドメインレジストラが扱っているメールサービスを使ってみることにした。というかこれくらいしか丁度いいプランやってるとこ見つけられなかった。他にいいところあったら教えてほしいくらい。

Namecheap.com • Cheap Domain Name Registration & Web Hosting

続きを読む

ストリームからBPMを計算する。RxJSを使って

ボタンを叩くタイミングからBPMを検出して設定してくれる、いわゆるタップテンポ機能。 シーケンサーサンプラーなどに搭載されていて、最近はブラウザ上で確認できるサービスもいくつかある。

続きを読む

Ansible GalaxyにGitBucketのroleを登録した

社内のsvn環境をgitに移行しようと思ってGitBucketの環境をansibleで構築してたのだけど、ふとAnsible Galaxyを見たらGitBucketのroleはまだ無かったし折角なので登録してみた。

https://galaxy.ansible.com/list#/roles/2155

これ。

githubにあるgitbucketリポジトリインストールスクリプトが置いてあるので、基本的にはこのスクリプトをansibleのyaml記法に書き換えて作った。UbuntuCentOSで起動することを確認している。

続きを読む

MacBook Pro Retina買ってからやったこと (2014年版 開発環境+DTM環境編)

MacBook Pro 15-inch, Mid 2009からMacBook Pro Retina 13-inch, Late 2013に乗り換えた。 次に買い換えるとき絶対忘れるので何をしたか残しておこうと思った。 古い方のmacbookにはいらないものがたくさん入ってそうだったのと、新しい方は256GBのSSDで容量節約したかったので今回は移行アシスタントは使わず、人力でがんばった。

続きを読む

コーディングを支える技術、読んだ

流行りの技術や特定の言語によらないプログラミングの学び方を学ぶ本。構成がよく考えられていて首尾一貫しているので自然に頭に入ってくるし楽しく読むことができた。少し感想を書きたい。

名前というものがある

名前を使う前までは番号を使ってたんだけど、人間は番号だけ見ても何のことかわからないしすぐ忘れちゃう。だから番号に対応するオブジェクトに名前をつけてあげたらわかりやすくて便利になった。とても便利でよかったんだけど、名前とオブジェクト対応表が一つだけだと、うっかり同じ名前を使ってしまうと競合して壊れるから注意して憶えておく必要がある。人間は無意識に記憶を改竄したりするし、ずっと対応表について思いを馳せていることはできない。じゃあどうしたかというとそこでスコープというものが産まれた。

こんな感じで人がいろいろ工夫して言語が進化していく過程が書かれている。普段考えもしない細部にも歴史がある。

多重継承に対する言語間の違い

多重継承には複数の親クラスの間で同じ名前のメソッドがあったとき、どちらを優先するかという問題がある。僕はc#メインで使っているので、多重継承禁止*1するのがすっきりしてていいと思ってた。でも果敢にも多重継承できるようにしちゃって、やっぱり結構苦労していたりする言語とか、moduleのみmix-inを可能にしたrubyとか、scalaなんかは初期からtraitがあったりする。それぞれの言語の実装の違いが簡潔にまとめられていてとてもわかりやすいと思った。

コラム

コラムがいくつかあって、その中でも

  • 理解を確認するためにはまずアウトプット
  • 何を学べがよいかがわからない理由
  • 具体的な知識と抽象的な知識
  • 噛み砕く
  • 必要なところからかじる
  • おおまかにつかんで徐々に詳細化する
  • 端から順番に写経する

このあたりなんだけど、なかなかこういう技術の学び方って文章化されにくいし、初心者の人はこのコラムだけ読んでもかなり参考になると思う。

僕は去年、応用情報技術者試験を受けていたのだけれど、その試験用に勉強した、こういうものがある、そういうものもある、みたいな広く薄い知識に、歴史という重みを与えてくれたのがこの本だった。海苔だけだったのに海苔に餅が包まれて質量あるし砂糖醤油で食べると美味しいみたいな感じです。もっと早く読めばよかった。

こちらに補足記事が載っているので全部読みましょう。

*1:interface除く

httpまたはhttpsでのアクセスを強制するカスタムフィルター

httpsでしかアクセスさせたくないページの場合、そのページのアクションメソッドに [RequireHttps]属性を付けると、httpでアクセスしたとき自動時にhttpsにリダイレクトさせることができます。

でもその逆、httpsでアクセスしたときにhttpにリダイレクトさせるような属性は用意されていません。なので自分で作る必要があります。

これ既に作っていた人がいて、それがこちらの記事。消えちゃってるのでInternetArchiveとGistの直リンク。

このカスタムフィルター属性結構良いと思うのですが、2点おしいところがあります。

  1. SSLSSLページで異なるドメイン*1やポートを使用している場合対応できない*2
  2. クエリストリングやアンカー(#)を引き継いでリダイレクトできない*3

1は開発サイトとかでありがち。

その辺を考慮して少し修正した対応版作りました。

using System.Web.Mvc;
 
namespace Utils.Filter
{
    public enum Scheme
    {
        Ignore,
        Http,
        Https,
    }
 
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
    public class RequireHttpSchemeAttribute
        : FilterAttribute, IAuthorizationFilter
    {
        private readonly Scheme scheme;
 
        public RequireHttpSchemeAttribute(Scheme scheme)
        {
            this.scheme = scheme;
        }
 
        public void OnAuthorization(AuthorizationContext filterContext)
        {
            if ((scheme == Scheme.Https) && !filterContext.HttpContext.Request.IsSecureConnection)
            {
                filterContext.Result = GetResult(filterContext, "https://localhost:1443");
            }
            else if ((scheme == Scheme.Http) && filterContext.HttpContext.Request.IsSecureConnection)
            {
                filterContext.Result = GetResult(filterContext, "http://localhost:1180");
            }
        }
 
        private static RedirectResult GetResult(AuthorizationContext filterContext, string baseUrl)
        {
            var uri = new Uri(baseUrl);
 
            return new RedirectResult(uri.GetLeftPart(UriPartial.Authority) + filterContext.HttpContext.Request.RawUrl);
        }
    }
}

URLベタ書きの部分は普通はWeb.configとかに記述してあると思うからそれを使いましょう。

使い方

こんな感じです。

[RequireHttpScheme(Scheme.Http)]
public virtual ActionResult HttpOnly()
{
    return View();
}

これはhttpsでアクセスされた場合、httpにリダイレクトする。

[RequireHttpScheme(Scheme.Https)]
public virtual ActionResult HttpsOnly()
{
    return View();
}

これはhttpでアクセスされた場合、httpsにリダイレクトする。

[RequireHttpScheme(Scheme.Https)]
public class AlmostSecureController : Controller
{
    public virtual ActionResult HttpsOnly()
    {
        return View();
    }

    [RequireHttpScheme(Scheme.Ignore)]
    public virtual ActionResult DoesntMatter()
    {
        return View();
    }
}

これはコントローラー自体に属性が付いていますので、このコントローラー内の全てのアクションメソッドでhttpsでのアクセスを強制しようとしています。しかし例外として特定のアクションメソッドにはリダイレクト処理をさせたくないという場合があります。
そういうときに例外にしたいアクションメソッドにScheme.Ignoreを設定したRequireHttpScheme属性を付けてあげると、そのアクションメソッドでは何も起きなくなります。*4 一つのコントローラー内に沢山アクションメソッドがある場合に便利かもしれませんね。

*1:IPも

*2:これはRequireHttps属性も対応してない

*3:UrlBuilder.Pathにクエリストリング以下を設定するとランタイムエラーになる

*4:でもこういう場合は往々にしてこのメソッドだけhttpアクセスを強制させたかったりするので、Scheme.IgnoreじゃなくてScheme.httpを設定することになると思う