htsign's blog

ノンジャンルで書くつもりだけど技術系が多いんじゃないかと思います

以後は特に指定のない限りJSはES6記法で書いていこうと思います。

Intlオブジェクトというものを知りました。
国際化表記における各種変換を取りまとめるそこそこ大規模なオブジェクトらしい。

Collator DateTimeFormat NumberFormatの3つのサブオブジェクトを持つ模様。
それぞれインスタンス化して使用するっぽい。

(() => {
  let localeOption = { style: "currency", currency: "jpy" };
  let locale = new Intl.NumberFormat("ja-JP", localeOption);
  console.log(locale.format(1234500)); // => ¥1,234,500
})();

便利。

第二引数のoptionにcurrencyDisplayを指定すると表記方法が変わるっぽい。
currencyDisplay: "symbol"がデフォルトで、他にcodenameがあるらしい。
symbolの場合の記号が半角とか全角とか、その辺は実装依存っぽい。

とか思ってたら

Number#toLocaleStringとか、他の代表的なオブジェクトにメソッドとして同等機能が提供されていた。
newはオーバーヘッドも大きいし*1、特別な理由がない限りは基本こっちですね。

*1:実測はしていませんが

グローバルIPアドレスを得る

今まではipifyを使っていました。

> Invoke-WebRequest api.ipify.org | Write-Host
125.203.***.***

非常にシンプルで使用制限もなく応答速度も問題なくて重宝していました。


これで終わりでいいんですが、みんな大好きStackOverflowのとあるスレッドで有用なやり取りがあったので。
Getting my public IP via API - Stack Overflow

どうやらipinfo.ioというのがあるようで、「1日1000リクエストまで」という制限があるようですが*1柔軟性が高いです。
オプションを何もつけなければJSONでデータが返ってきます。

> Invoke-WebRequest ipinfo.io | Write-Host
{
  "ip": "125.203.***.***",
  "hostname": "i125-203-(中略).ap.plala.or.jp",
  "city": "",
  "region": "",
  "country": "JP",
  "loc": "35.***,139.***",
  "org": "AS4713 NTT Communications Corporation"
}

まぁ使い方は公式サイトにでかでかと書かれてるのでわざわざここで説明するまでもないんですが、JSONのプロパティがオプション名になってます。

> Invoke-WebRequest ipinfo.io/ip | Write-Host
125.203.***.***

> Invoke-WebRequest ipinfo.io/country | Write-Host
JP


特に凝ったことするのでなければipify, ちょっと別の情報も使いたいってときはipinfo.ioって具合に使い分けましょうかね。

*1:無料プランでの話なので、有料プランを選べばもちろん制限は緩くなります。

OSXのバージョンを確認する方法

ただ単に今駆動しているOSXのバージョンを確認するだけなら

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.10.5
BuildVersion:   14F1605

で終わりです。

今回はとあるパーティションにインストールされているOSXのバージョンを外部から確認する方法です。
ある方から起動できなくなったHDDにインストールしたOSXのバージョンを確認してほしい、との依頼があったために調べて知った方法です。
要するに一部のLinuxディストリで言うcat /etc/*-releaseのようなものです。

まずは目的のパーティションに移動します。

$ cd /Volumes/Machintosh\ HD/

その上で、そのパーティション上の/System/Library/CoreServices/の中にあるSystemVersion.plistにバージョン情報が書かれています。

$ cat System/Library/CoreServices/SystemVersion.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>ProductBuildVersion</key>
        <string>14F1605</string>
        <key>ProductCopyright</key>
        <string>1983-2016 Apple Inc.</string>
        <key>ProductName</key>
        <string>Mac OS X</string>
        <key>ProductUserVisibleVersion</key>
        <string>10.10.5</string>
        <key>ProductVersion</key>
        <string>10.10.5</string>
</dict>
</plist>

ちなみに、ここのXMLを書き換えることで「このMacについて」で表示されるバージョン情報を偽装することができるようです。

参考: Tutorial: Change the OS X Version by modifying systemversion.plist

久しぶりにPC周りのお買い物

ついに買いました。TLCSSD
nttxstore.jp

思えばSLCで容量40GBしかないのを買って、MLCだけど容量60GBしかないのを買って、MLCで容量120GBのを買って、MLCで256GBのを買って、今度のやつで5枚目です。
SandForce製とかいう0Fill, 1Fill以外まるで速度の出ないゴミみたいなコントローラ載っけてたのもありました。今は外付けケースに入れてポータブルになってますが使ってません。

Steamのゲームをいくつか置いとくだけなので、そこそこの容量とそこそこの読み込み速度があれば役に立ってくれると信じてる。

ベンチマークスコア

f:id:htsign:20160108012118p:plain
公称値はSeqRead 540MB/s SeqWrite 470MB/sなので、書き込みはともかく読み込みはまずまずの速度じゃないかと思います。
他所のレビューではスコアがもう少しよかったので、単純にSBチップやSATAケーブルがアレだったかも。
ケーブルくらいは近いうちに買い替えます。

Microsoft Edge (Windows 10 Mobile) のUser-Agent

なかなかすごいことになっています。
どこかの記事(確かスラド辺り)で読んだことありますが、WebKitと同じ挙動を示すようにしたとかなんとか。

Lumia 950で確認しました。

Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; Microsoft; Lumia 950) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Mobile Safari/537.36 Edge/13.10586

例えば以下のような条件判定に一致するようになります。

var ua = navigator.userAgent.toLowerCase(), cond;

cond = /android/.test(ua) && /mobile/.test(ua);
console.log("Android : " + cond); // "Android : true"

cond = /safari/.test(ua);
console.log("Safari : " + cond);  // "Safari : true"

Linux; U;が入っていないのが救いですね。
参照: 滅び行くAndroid 標準ブラウザをサポート外にして悩みの種をなくす話 - Qiita


User-Agentでブラウザの判断をせざるを得ない現状も個人的にはどうかと思います。
本当であれば機能面で分けるべきなんですよね。

console.log("Legacy IE : " + (/*@cc_on ! @*/false));

var webkitKeys = Object.keys(window).filter(function(e){
  return window.hasOwnProperty(e) && e.indexOf("webkit") !== -1;
});
console.log("WebKit : " + (webkitKeys.length > 0));

まぁこれはこれで穴がありますが…。