iOS 9 Safari のユーザーエージェント - iPhone, iPad, iPod touch

iOS バージョン 9 系のユーザーエージェント一覧です。

iOS 9.0

// iPhone
Mozilla/5.0 (iPhone; CPU iPhone OS 9_0 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13A344 Safari/601.1

// iPad
Mozilla/5.0 (iPad; CPU OS 9_0 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13A344 Safari/601.1

iOS 9.0.1

// iPhone
Mozilla/5.0 (iPhone; CPU iPhone OS 9_0_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13A404 Safari/601.1

// iPad
Mozilla/5.0 (iPad; CPU OS 9_0_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13A404 Safari/601.1

iOS 9.1

// iPhone
Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1

iOS 9.3.5

// iPhone
Mozilla/5.0 (iPhone; CPU iPhone OS 9_3_5 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13G36 Safari/601.1

iOS 9 以外のユーザーエージェント

Python: Python の with と C# の using の違い

先日、友人から「Python の with って C# でいうとこの using なのかな!?」ってメッセージがきました。

気になったので試したところ、結果は using と同義ではないことがわかりました。

そもそも C# の `using` はオブジェクトの破棄を保証するもので、`using` を抜けるともう既にそのオブジェクトは破棄されています。

↑ は誤りです。ただしくは破棄を保証するものではなく下記の通りとなります。
(yuba さんご指摘ありがとうございました!)

そもそも C# の using は、オブジェクトを破棄する処理を呼び出すことを保証するものです。
他の用途としては当該オブジェクトのスコープ範囲を括ることも挙げられます。
したがって using を抜けるともう既にそのオブジェクトはスコープの範囲外となり、参照することはできません。

下記が using のサンプルです。

public void Anything() {
    using (FileStream fs = new FileStream("hoge.txt", FileMode.Read)) {
        // anything
    }
    // fs はもう破棄されている
}

using ステートメントを抜けるタイミングで Dispose が呼ばれます。
さらにスコープの範囲は using 内に留まります。

次に Python の with です。

Python 2.7 を主に使っているので 2 系のドキュメントから with の説明をかいつまんで拝借すると…

with 文は、 enter() メソッドがエラーなく終了した場合には exit() が常に呼ばれることを保証します。ですので、もしエラーがターゲットリストへの代入中にエラーが発生した場合には、これはそのスイートの中で発生したエラーと同じように扱われます。

引用: http://docs.python.jp/2/reference/compound_stmts.html#with

つまりは __enter__() メソッドがエラーなく終了した場合には __exit__() が常に呼ばれることを保証 するものなので using とは意味が違います。
具体的に下記に with のサンプルコードを示します。

// with-test.py
class WithTest:
    def __init__(self, hoge):
        print('__init__')
        self.hoge = hoge
    
    def printer(self):
        print(self.hoge)
    
    def __enter__(self):
        print('__enter__')
        return self
    
    def __exit__(self, type, value, traceback):
        print('__exit__')
    
    
with WithTest('test') as t:
    t.printer()

t.printer()

実行結果は以下の通り。

$ python with-test.py
__init__
__enter__
test
__exit__
test

何が保証されるか、そこに違いがありましたというお話でした。

Python: /usr/bin/env: python: No such file or directory 対処

とある Linux サーバー上で Python を実行しようとしたときに起きた問題。

$ ./hoge.py
: No such file or directory

↑ は Git から Linux 上に落とした Python コードを実行しようとしたところ発生したエラーです。

実際のエラー全文は下記です。

/usr/bin/env: python: No such file or directory

この Python ファイルがどんなものか調べてみます。

$ file hoge.py
hoge.py: Python script, ASCII text executable, with CRLF line terminators

改行コードが CRLF になっているので LF に変換しなければなりません。

幸い実行サーバーには vim が入っていたので :set fileformat=unix して解決。

sed の使い方を思い出さずに済みました。

CKEditor: 書式を無視してプレーンテキストで貼り付ける

CKEditor 4 系において、書式を無視してプレーンテキストでペーストする設定はないものかとドキュメントを漁っていたらありました。

CKEDITOR.config - CKEditor 4 Documentation

内容を引用すると…

forcePasteAsPlainText : Boolean

Whether to force all pasting operations to insert on plain text into the editor, loosing any formatting information possibly available in the source text.

Note: paste from word (dialog) is not affected by this configuration.

config.forcePasteAsPlainText = true;

Defaults to: false

これを使えばできそうだ。

CKEDITOR.on('instanceCreated', function(event) {
    var editor = event.editor,
    editor.on('configLoaded', function() {
        editor.config.forcePasteAsPlainText = true;
    });
});

↑のようにインスタンス作成時に設定を上書きして適用しました。

参考 URL

Vagrant AWS: The parameter groupName cannot be used with the parameter subnet の対処

Vagrant で EC2 を起動しようとしたときのエラーです。

確認環境

  • Mac OS X 10.9.5-x86_64
  • vagrant 1.6.5
  • vagrant-aws 0.5.0

Vagrantfileaws.security_groups["ssh-fixed", "test"] を設定しました。

// Vagrantfile
.
.
.
  config.vm.provider "aws" do |aws, override|
    aws.access_key_id     = AWS_ACCESS_KEY
    aws.secret_access_key = AWS_SECRET_KEY
    aws.keypair_name      = AWS_KEYPAIR_NAME

    aws.region            = "ap-northeast-1" # Tokyo
    aws.availability_zone = "ap-northeast-1c"
    aws.ami               = "ami-4985b048" # Amazon Linux AMI 2014.09.1 (HVM)
    aws.instance_type     = "t2.small"
    aws.tags              = {
        "Name" => "vagrant-aws" 
    }
    aws.security_groups   = ["ssh-fixed", "test"]
    aws.subnet_id         = AWS_SUBNET_ID

    override.ssh.username         = AWS_SSH_USERNAME
    override.ssh.private_key_path = AWS_SSH_KEY_PATH
  end
.
.
.

この設定で vagrant up する。

つづきをみる