SKAGEN Falster 2 を買ってみたあとのあれこれ

概要

  • SKAGEN Smartwatch Falster 2 を買いました
  • バッテリーの減りが異常に速いという問題に見舞われたのですが、 ファクトリーリセット後、充分に充電してから再セットアップ したら改善しました
  • 専用充電器の入手性が悪いですが、Fossil Generation4用の充電器で代用できるようです(未確認 代用できることを確認できました)

Falster 2について

タッチパネル式のスマートウォッチが欲しくなり、あんまりゴツくないやつを、と探していたところで、非常にシンプルで文字盤も小さめな SKAGEN Smartwatch Falster 2 を購入しました。

スペックとしてはあまり特記するようなものはなく、センサーとしては輝度調整のための照度センサーとモーションセンサー、心拍計があり、通信としてはBluetoothとWiFiが使えるようです。(セルラーやLTEは無し)

ソフトウェア的にも、ほぼ素の WearOS で、独自アプリといえばロゴ入りのWatchFaceくらい。ただこのWatchFace、シンプルで視認性もよく、常時画面ON設定でも、待機状態では輝度はそのままで表示を減らして電力消費を抑えてくれるので、気に入っています。

なお、工場出荷時状態では Android Wear 1.5 が入っているようですが、母艦スマートフォン側に最新のWearOSアプリを入れてペアリングすると、自動的にWearOS2.0にアップグレードされるようです。

バッテリーの減りが早すぎる

パッケージから取り出して説明書を見ると、充電が完了してからセットアップするように書いてありましたが、充電器にセットするとすぐに立ち上がり、「Tap to start」と表示されました。なので、すぐにスマートフォンにWearOSアプリを入れ、ペアリングとセットアップを行いました。

とりあえずデフォルト状態での使用感を見ようと、特に設定はいじらずその日は充電台に放置し、翌朝、バッテリー残量が100%になっているのを確認して装着、出勤しました。

1時間ほどの移動を経て、職場で時計を確認したところ、なんとバッテリー残量が50%を切っているではないですか。

その後も装着したまま、あまり触らないようにしていたのですが、1時間ほどでバッテリーセーブモードに落ち、間もなくシャットダウン。

翌日以降、通知を切ったり輝度を落としたり「常に画面表示」を無効化したり、ファクトリーリセットして再セットアップしてみたりといろいろやってみましたが、せいぜい4〜5時間程度しか持ちません。

母艦側のWearOSアプリで、時計上のアプリ毎のバッテリー消費を確認できるのですが、特にアプリをつかっているわけではなく、Bluetoothがだけがバッテリーを使っているような状況。

Webのレビュー記事などを見ると、特にヘビーな使い方をしなければだいたい24時間前後は持つという感じだったので、初期不良を疑いました。

理屈のよくわからない解決方法

日本にはユーザーが少ないようで日本語の情報もなく、reddit などの海外サイトを眺めていたのですが、どうもユーザーによって「半日も持たねーよ!」という人と「1日半くらい持つぞ」という人がいて、それぞれ設定も公開していますがあまり違いがないように見えました。

どうも釈然とせず、あれこれ見ていると、「ファクトリーリセットのあと、充電台にセットして24時間放置してから再セットアップしたら治った」というコメントが。

で、説明書の「充電を完了してから」という文言を思い出して、まさかと思い、ファクトリーリセット→一晩かけて充電→再セットアップとやってみたら、明らかに改善したのでした。

一応設定を書いておくと、
* 「常に画面表示」(AOD)有効
* 「傾けて画面をON」無効
* 「タップで復帰」無効
* 画面明るさ自動調整
* Wifi無効
* GPS有効
* 通知は電話、メール、Twitter、GoogleFitのみ有効
* その他はデフォルト設定

画面操作を頻繁にやったり心拍数計測すればまた違うでしょうが、これなら朝から帰宅までくらいは余裕で持ちそうです。

それにしても、これはどういうことなんでしょう。セットアップ時のバッテリー電圧を満充電状態として、それ以上充電しなくなってしまうとしか解釈できませんが…

これ、機種固有の性質なのかWearOSがそういうものなのかは不明ですが、redditではFossilの機種でも似たようなコメントを見かけたので、Fossil系ブランドのタッチパネル型スマートウォッチには共通するかもしれません。

ともあれ、日中は装着して過ごし、就寝時に充電、というスタイルなら充分実用に足る感じにはなったので、金ドブにならなくて安心しました。

充電器

旅行時などに備えスペアの充電器が欲しいと思ったのですが、この機種専用の充電器が、AmazonにもSKAGEN公式ショップにも見つからず難儀しました。

USのSKAGENショップでは売られていたのでなんとか入手できないものかと、Fossil日本法人 (SKAGEN日本サイトの運営元)に問い合わせたところ、Fossil Generation4用の充電器を勧められました。

一応発注してみましたので、本当に使えたかどうかは、後日こちらに追記したいと思います。

(2018/11/17追記) 実際に充電できることが確認できました。


WindowsでCDリッピングしてALACエンコードする環境を作る(メモ)

おニューのMBPにiTunes母艦を移行してしばらくたって、久々にCDを買ったとき、はたと気がつく。「MBP13″に光学ドライブついてないじゃねーか!」

だからと言って、そのためだけにWindows機にiTunes入れ直すのも業腹なので、他の手段でALACを作る環境を作ったのでメモ。

面倒なので日本語化とかはしてません。

Exact Audio Copy のインストール

エラー訂正とカスタマイズの細かさに定評のあるCDリッパー。CUE Sheet作れたりするのでなにかに使えるかもしれない。

http://www.exactaudiocopy.de/

こちらからダウンロードしてインストールする。ダウンロードボタン偽装広告が多いので注意だ。

QAACのインストール

EAPは公式にはALACには対応していないけど、外部エンコーダーを設定して呼び出せるので、CLIなエンコードツールさえあればどんなフォーマットでも出力できる。

ということでフリーのAAC/ALACエンコーダであるところのQAACエンコーダーをダウンロードする。

https://sites.google.com/site/qaacpage/home

インストーラのないポータブルアプリなので、解凍して「x64」以下のexeとdllを適当なフォルダへ放り込んでおく。

EACのエンコーダ設定

EACを起動し、メニューの「EAC」→「Encode option」を選択。

「Parameter passing scheme」を「User defined encoder」に設定。
「Program, including path」にQAACの qaac.exe の絶対パスを入力
「Additional command line options」に以下を入力

--alac -o %dest% --title "%title%" --artist "%artist%" --album "%albumtitle%" --comment "%comment%" --genre "%genre%" --date "%year%" --track "%tracknr%" --composer "%composer%" --artwork "%coverfile%" "%source%"

Player (VUPlayer) のインストールとGracenoteCDDBの有効化

とりあえずリッピングしてALAC作るだけなら上記でOKだけど、EACがメタデータを取ってくるCDDBは情報量がイマイチなので、うまく取れなかったときのためにGracenoteCDDBからデータを取れるCDプレーヤーアプリを入れておく。

http://www.vuplayer.com/

こちらから「Player」をダウンロードしてインストール。

一度、管理者モードで起動して、メニューから「File」→「Gracenote」→「Registration」
利用規約を確認してAgreeする。

さらに、メニューから「File」→「Option」で「Update cdplayer.ini automatically」にチェックを入れて「OK」をクリックする。

Playerからのメタデータ取得とEACへの連携

Playerを起動しCDを読み込むと、Gracenoteからメタデータを取得し、裏でcdplayer.iniに書き込む。ここで一旦Playerを終了する。

その後、EACのDatabaseメニューからcdplayer.iniを読み込む。


ニコニコ動画の再生トラブルがルータの設定で改善した話

ニコ動がまともに見られない→解決

去年の後半くらいから、自宅のPCでニコ動で以下のような現象が発生し、まともに動画が見られず困っていました。

  • 動画再生開始まで2~3分ほど待たされる
  • 再生中もしょっちゅう再生が途切れ、読み込み待ちになる
  • シークバーを動かすとフリーズする

全体的にはネットワークが遅い時のような挙動なのですが、他のサイトやYouTube、Amazonプライムビデオなどは普通に見られましたし、スピードテストサイトをいくつか試しても数十~百Mbps程度の通信速度で安定しているようでした。

で、いろいろ試してみたのですが、結論から言うと、ルータの設定の問題でした。
拙宅では無線LANルータとしてBuffaloのWZR-1750DHP2を利用しているのですが、このルータにある「アドバンスドQoS」という機能をオフにしたところ、劇的に改善したのでした。

アドバンスドQoSって?

製品紹介ページでは以下のように書かれています。

ネットワークの優先順位を設定して動画を快適視聴
複数のネットワーク機器でインターネットサービスなどを利用した場合、従来の無線LAN親機では、データが効率よく転送されず、動画や音声が停止してしまうことがありました。本製品は、通信の優先順位を設定する「アドバンスドQoS」機能を搭載。動画の利用が多い環境では、動画サービスを優先するなど「動画」「音声」「ゲーム」等をライフスタイルに合わせて優先度を設定できます。

通信の種類によって優先順位をつけ、優先順位の高い通信には広い帯域を確保する、ということのようです。具体的には、「動画」「会議」「ゲーム」「オーディオ」「ブラウジング」「ダウンロード」という種類ごとに優先度を決められるようになっています。
初期設定では「動画」が優先度最高、「ダウンロード」は他の種類に当てはまらない「その他」扱いとして、優先度は低となっていました。

実際の通信パケットに「動画」や「ゲーム」などラベルが付いてるわけでもありませんので、何かしらの条件を決めて、通信内容がその条件に当てはまるものを「動画」「ゲーム」などとラベリングしているのだと思われます。

具体的なラベリング条件は開示されていないので、以下は推測になりますが、ニコ動は現在の挙動からして、「シークバーの位置に応じて断片化した動画データを随時ダウンロードする」という仕様のように見えます。
レジューム機能で途中から再生される場合やシークバーで大きく飛ばした場合は、飛ばした部分含めてデータをダウンロードするのでは帯域の無駄でしょうから、納得できる挙動です。
ただ、こういう細切れでの通信が、アドバンスドQoS上では動画再生とはみなされず、「ダウンロード」扱いになっていたのではないかと思います。

家庭用ネットワーク機器の差別化機能について

最近は、固定回線を引くと大抵WifiルータやSTBなどが回線業者からレンタルされるので、家庭用ネットワーク機器メーカーは差別化に必死で、いろいろな独自機能をつけてきます。
しかし、こうした機能は、開発時点でのネットワークの使われ方を前提とし、「その時の使われ方では高効率・便利」というようなものになっているのが多いように見受けられます。
インターネットも日々増える通信量をさばくため、サービス、ネットワーク各事業者が効率化のために様々な仕組みを考案・実装していきますので、ある時点の仕様に依存した仕組みはすぐに適合しなくなるでしょう。

というわけで、規格化もされていない独自機能を下手に使うのはトラブルの元ですね、というお話でした。



Mastodonインスタンスたてました

とりあえずやってみたかったので、Mastodonインスタンスをシングルユーザモードで立ててみました。

shout_poor@social.noisyspot.jp

まだ何もしてないけど、一応forkしてから展開してるので、ぼちぼちとカスタマイズもしていきます。

構築した手順とかは色んな人が書いてますが、この辺参考にしてます。

Dockerで雑にMastodonを起動する方法
documentation/Running-Mastodon/Production-guide.md
小規模Mastodonインスタンスを運用するコツ

そのうち、私がやった手順とかまとめてあっちの方にまとめておきます。


*ネタバレ注意* シン・ゴジラにおける「現実対虚構」の意味と結果

シン・ゴジラを観たので感想です。ネタバレを多分に含みますのでご注意ください。ぜひ読む前に映画をご視聴ください!

続きを読む

本作品は、中盤、ゴジラが東京中枢へ到達し都市を火の海に沈めるシーンを境界として、その前後で明確に空気感が異なります。「現実対虚構(ニッポン対ゴジラ)」というのが本作品のキャッチコピーですが、これがメインテーマだとすると、この境界であるシーンで決着がついてしまっているのではないかと思いました。

前半での人間側の描写といえば、会議を重ねて時間を浪費する非効率な組織、有能な人材の発言を組織のメンツで封殺し、責任者は責任を取ることを恐れ、前例に縛られ決断を躊躇するかと思えば、根拠の無い楽観で判断を謝る、そういう「現実」です。「ブラック労働賛美」のような矢口と志村の会話も、前半で描かれたシーンですね。

また、前半では一般市民もわずかながら描写されます。政府に先んじて情報を拡散し、ゴジラ上陸後は逃げ惑う人、遠くからスマホで撮影する人、警察や消防の誘導で行儀よく避難する人…そういう人間たちが俯瞰で描かれています。かつての3.11を彷彿とさせるシーンもあり、ゴジラという大規模災害に対峙した東京の人々がどうなるのか、細かく丁寧にシミュレートされていたと思います。

そういう「現実」が、決死の抵抗むなしく(ここまでは、実在する兵器しか登場しません)、破壊されてしまうのです。米軍の空爆を切っ掛けに覚醒したゴジラの熱線で、都市は火の海に沈み、放射能で汚染され、政府の中枢である主要閣僚はまとめて死亡。「現実対虚構」は、ここで現実が敗北するという決着をみています。

では一敗地にまみれた「現実」が、このあと「虚構」に対し逆襲するのかといえば、さにあらず。

後半になると、前半であれだけ描写されていた「無能な人々」は完全に姿を消します。主人公である矢口と赤坂、巨災対のメンバーは言うに及ばず、多摩川防衛で惨敗を喫したに関わらずニヒルな笑みとともに作戦をまとめる自衛隊幹部、米国からの圧力に対して、第三国であるフランスを巻き込んで手練手管で渡り合う政治家、一度は外圧に屈するものの、自身が責任を取る覚悟とともに決断する首相代理、名前の無いモブに至るまで、各自の役割を強い意志とともに遂行する有能な人間ばかりが描かれます。

ゴジラに対抗するための兵器も、無人在来線爆弾のような、現実において兵器とは到底呼べないものが出てきます。

要するに、後半は人間側までもが虚構となるのです。虚構の日本人が創意工夫と努力で虚構のゴジラを封じ込める、「普通のヒロイック映画」となっている。「現実」は敗北したまま、「虚構」に上書きされてしまったのです。

挙句、ラストシーンの赤坂のセリフ「この国はスクラップ・ビルドによってのし上がってきた。大丈夫だ」ですよ。なんという絶望感でしょうか。

まあ、もうちょっと好意的に解釈すると、後半は「日本人がこうあってほしいと思う」日本の姿なのかなという気もします。核分裂機関を持ち、液体注入によって沈静化されるゴジラを、福島第一原発になぞらえて語る人も多いですが、こんなふうにわかりやすく無害化されてほしいと望む人は多いでしょう。ゴジラから放出された「未知の放射性元素」の半減期がやたら短いというご都合主義もそうです。また、矢口が「政治家の責任の取り方は自身の進退だ」というのも、日本人の多くが、かっこいいと思う政治家の信念でしょう。

現実の日本は一度破壊され、後半で描かれる日本は虚構であり願望、そう考えると、後半の諸々が腑に落ちる気がするのです。

まあそれはそれとして、個人的ハイライトシーンは「無人在来線爆弾、全機投入!」と、終始無表情だった尾藤ヒロミが、最後に安堵の笑みを浮かべたところでした。

隠す


転職して1ヶ月が経ちました

はじめに

学校卒業以来18年ちょい務めた会社を5月末に辞めまして、1ヶ月休養後7月から新たな会社でお世話になっております。このエントリでは、退職に至った経緯とか新しい職場はどうかといったあたりを、個人的な記録として主観100%で書いておこうと思います。

「やりたいことがあって転職しました!」みたいな希望に満ちたものでもなければ、前職のブラックさを強調するほどの怨念もありませんので、世にある転職エントリのような面白みはないかと思います。

あ、書いてる人は38歳独身男です。

前職を辞めるに至った経緯

前に勤務していた会社は、別に取り立ててブラックというわけでもなく、SIerと言われる会社の中では比較的マシな方だったんじゃないかなと思います。まあ、月の残業時間は恒常的に45hを超えていたので、ホワイトってわけでもありませんでしたが。

よく言われるのは、SEとしてキャリアアップするには、リーダーやってプロマネやって…みたいなステップを踏むのが当然というような感じで、年を食ってきて、若手や協力会社の人員のリーダーみたいなことをやって、常に妙な緊張を強いられる状態が続いていました。表向き大きな失敗をしたわけでもないですが、とにかく気が休まらない。性格的なものなのかもしれません。一方自分の作業はといえば、スケジュール引きと指示と上の報告(のための資料づくり)がほとんど。

コンピュータが好きなので、プログラミングしたり、いろいろ弄って使い方を憶えて、望む形に作っていくことをしたいんだなあと、それだけの「自分の希望」をはっきり言葉にするのに18年もかかってしまいました。

実は過去にも何度か上司に「辞める」という相談をしていたんですが、自分の希望をうまく説明できなくて説得されてしまっていたんですよね。

そんなことを考えて決意したのが、昨年の暮。その後、CodeIQにコードを載っけて、頂いたスカウトのうちの一つに乗っかったわけです。

転職してみて

転職先は、SESや派遣でエンジニアを出している小さい会社です。

最初の職場は数人規模のプロジェクトで、プロトタイプして作られたアプリケーションを、商用サービスに耐える形にするべく、いろいろ検討し構築しています。

今まで触ったことのないAWSのクラウドサービス群を頑張ってキャッチアップしつつ、何とか付いていってる感じですが、こういうサービスやソフトウェアを弄り倒しながら把握していくというのはとても楽しい仕事です。SCRUMっぽい運営がされていて、作業の目標も報告の仕方も明確で、前職に比べれば本当にストレスの少ない職場です。残業は若干ありますが、前職の半分くらい。

まあ、転職先の会社からSESとして入っているので、この辺はお客さんが変われば変わってくるのでしょうが、今度の会社では参加するプロジェクトやお客さんをある程度選ばせてもらえるので、非常に安心感があります。前職は基本、選択の自由はなかったですからね…

年収は下がりました。当面の額としてはそれほど大きい差ではないですが、前職でまっとうに管理職になった場合と比べると、将来込みではかなり大きい差になったと思います。私はすでに昇進を諦めていたので、あまり未練はありませんでしたが…

これから

ぶっちゃけ、将来のことはあまり考えていません。

65歳でリタイヤするとして、残り27年です。その間、淡々と今のように新しいことを吸収しつつ気楽にコンピュータいじりができたらいいなあ、くらいに考えていますが、体や脳みその老化具合によっては、それは許されないのかもしれません。そのときにどうするのか、そういう不安はあります。が、まあ考えてもしょうがないことは深く考えないようにします。

ストレスや残業が減って生まれた余裕で、コミュニティへの貢献をして名を売っていく、というのも、どこまで出来るかわかりませんが、少しずつやっていこうかなとも思っています。

あと、気が付くとすっかり無趣味な人間になっているので、また何か創作的なことをやりたいなあ。



Scala でソフトシンセ作ってみる その1 波形生成

まずは波形生成。アナログシンセでいうところのオシレータ(OSC)にあたります。

ソースコードはこちら。ひとまずデューティ比可変の矩形波と、正弦波、三角波に対応しています。

https://github.com/shout-poor/Synthcala/blob/master/Synthcala/src/jp/noisyspot/synth/gen/WaveGenerator.scala

Java だと、オシレータの抽象クラスを作って、波形別に実装クラスを作って、パラメータをメンバ変数に持たせて…とかやるんですが、ここでは関数型らしく、パラメータを与えると、「パラメータに応じた波形を生成する関数」を返してくれる高階関数として実装しました。

例えば正弦波の場合はこんな感じ。

  def sineWave(sampleRate: Double, tone: Double) = (z: Int) => {
    import scala.math._
    sin(pInWave(sampleRate, tone, z) * 2.0 * Pi)
  }

サンプルレートと周波数を渡してあげると、時間変数 z (サンプリングレートの逆数を単位とする変数)を引数とする関数が帰ってきます。その関数を、例えばRange.mapに与えてあげると、一定時間内での波形をサンプルのリストとして取得できます。

scala>  val sinConc=sineWave(100, 20) // サンプリングレート 100Hz, 音程20Hz
sinConc: Int => Double = <function1>

scala>  Range(0, 100).map(sinConc)
res0: scala.collection.immutable.IndexedSeq[Double] = Vector(0.0, 0.9510565162951535, 0.5877852522924732, -0.587785252292473, -0.9510565162951536, 0.0, 0.9510565162951535, 0.5877852522924736, -0.5877852522924734, -0.9510565162951536, 0.0, 0.9510565162951539, 0.5877852522924736, -0.5877852522924734, -0.9510565162951539, 0.0, 0.9510565162951539, 0.5877852522924736, -0.5877852522924734, -0.9510565162951539, 0.0, 0.9510565162951539, 0.5877852522924714, -0.5877852522924712, -0.9510565162951539, 0.0, 0.9510565162951539, 0.5877852522924714, -0.5877852522924712, -0.9510565162951539, 0.0, 0.9510565162951539, 0.5877852522924714, -0.5877852522924712, -0.9510565162951539, 0.0, 0.9510565162951539, 0.5877852522924714, -0.5877852522924712, -0.9510565162951539, 0.0, 0.9510565162951522, 0.58778525229247...

で、これらとは別に、モノラル音声を任意の定位でステレオの左右に振り分ける関数返す pan と、与えられた係数をかける関数を返す vol 関数を作成しました。これらで得られる関数を andThen で合成することにより、任意の定位、音量の音声波形を得る関数をクライアント側で作成できます。

クライアント側はこんな感じ。

// 音程440Hz、音量0.5、定位0.2 の矩形波関数
val sineConcrete = sineWave(FRAMES_PAR_SEC, 440.0) andThen vol(0.5) andThen pan(0.2)
val samples = Range(0, FRAMES_PAR_SEC).flatMap(sineConcrete)

pan で得られた関数の戻り値は、2ch分のサンプルを持つ Seq なので、先ほどと違って Range.flatMap で展開しています。

こんな風にしてえられた samples を、前回作成した OutDevice に出力すれば、めでたくパラメータ通りの音が鳴る、ということになります。

というところで今回は終了。次回はSMFライクなシーケンスデータで発音タイミングや音程を制御するあたりをやろうと思います。


Scala でソフトシンセ作ってみる その0

なんか前も同じようなこと書いた気もするけど、以前挫折したのをやり直したりしています。

とりあえず、今回は wav に吐いて終わりではなく、ちゃんと自力で音を出せるように、まずはデバイスへの出力クラスから作ってみました。

https://github.com/shout-poor/Synthcala/blob/master/Synthcala/src/jp/noisyspot/synth/out/OutDevice.scala

使う方はこんな感じ。 440Hz の矩形波を生成して出力するサンプルです。

https://github.com/shout-poor/Synthcala/blob/master/Synthcala/testrunner/OutDeviceTestRun.scala

ポイントとしては、

  • SourceDataLine#write は、内部バッファがいっぱいになると空きができるまでブロックするので、再生自体を別スレッドで処理するために Actor を継承。メッセージとして直接サンプルのリスト (Seq[Double]) を送信して使用する。
  • ソフトシンセの波形生成側で扱うサンプルは -1.0 ~ 1.0 の倍精度実数とし、本クラス内でデバイスに応じたバイト列に変換。(現時点では、符号付き 16bit / LittleEndian のみ実装)

基本的には Java の Audio API を使ってるだけなので、Scala らしいところはあんまりないかと思います。

次は波形生成と各種フィルタ/エフェクタの枠組みを作っていきます。