stylesheet

2019-12-18

今日はSNSアカウントの収集日

I don't give a fuck about your Instagram

ロシアからアカウント乗っ取りということで久々にログイン。
パスワード変更とプライバシー設定の見直しをしておいた。

8年ぶりの休眠ユーザーの召喚に成功するとは、流石の運営。
今月のアクティブユーザー一人増えたね。

大統領選中にトランプとのツーショット写真をシェアしてたと思うと、そのままにしておいたほうが良かったかもしれない。

2019-12-11

LightDMでlibvert-qemuアカウントを表示しない

LightDMのログインスクリーンでシステムアカウントのlibvert-qemuが表示されて目障り。
いつまでたっても修正される気配がないので、設定を追加して対処する。

作業を行う環境は以下の通り。
elementary固有の現象なのか、それともubuntuにも発生するのか。

$ cat /etc/lsb-release

DISTRIB_ID=elementary
DISTRIB_RELEASE=5.1
DISTRIB_CODENAME=hera
DISTRIB_DESCRIPTION="elementary OS 5.1 Hera"

SystemAccount=trueを記述した設定ファイルを作成する。

$ sudo emacs /var/lib/AccountsService/users/libvirt-qemu

[User]
SystemAccount=true

accounts-daemonサービスをリスタートするか単純にシステムを再起動する。

$ sudo service accounts-daemon restart 

以上。

2019-11-06

GRUB2 タイムアウト時のデフォルトを最後に選択した項目にする

GRUB_DEFAULTsavedへ変更、GRUB_SAVEDEFAULT=trueはなければ追加する。
$ sudo nano /etc/default/grub

  GRUB_DEFAULT=saved
  GRUB_SAVEDEFAULT=true

$ sudo update-grub

デュアルブートでWindowsも使用する人に便利。
大型アップデートで何度も再起動が必要な時に威力を発揮する。

2019-09-12

TCSUNBOW SSD N4 240GB M.2 2242 を購入

M.2 2242 SATA 6G/sのSSD。旧Thinkpad等に使える2242サイズの変態用。

お客様のハードディスクをアップグレードする時が来ました
その通りです。これはストレージのトレンドと未来の形です!

等、ふざけた商品説明が並ぶ格安中華品。

ちゃんとしたパッケージ入りで3年保証との記載はあるが、ウェブサイトwww.tcsunbow.cnは既にコンテンツなし。保証を受ける場合は記載の住所に殴り込む必要があるか。

取付用のネジ付属。

当然のようにチップを隠すようにシールが貼られている。使用チップは公言していない。

裏面にはチップなし。2019年6月製造だろうか。結構最近まで製造されていたようだ。

記載を信じるならば、Silicon Motion製SSDコントローラーSM2258XTとTOSHIBA製の3D NANDが使用されている。NANDのほうにはTH58TFと記載されているようにも見えるが、老眼が進んでよく見えない...。

Thinkpad T440pに取り付けると特に問題なく認識された。こちらのディスクにはLinuxをインストールする予定。

速度控えめ、発熱多め。
3年保証はともかくとして、初期不良の交換は受け付けてもらえるだろうし、Amazonで3000円強の値段で購入できることを考えるとそう悪いものでもない。

2019-08-06

Echo Show 5 ファーストインプレ

Amazonのいつものセールで購入したのでメモ。Amazon Music Unlimited 6ヶ月が付いて5,980円にて購入。定価は9,980円のようだ。

以下、主なスペック。

  • ディスプレイ: 5.5インチ (960×480)
  • プロセッサ: MediaTek MT 8163
  • スピーカー: 1.65インチ 4W
  • カメラ: 1メガピクセル
  • ポート/ボタン: マイク/カメラのオン/オフボタン、カメラカバー、音量ボタン、3.5ミリステレオジャック、Micro USB電源ポート、電源ポート
  • ワイヤレス: Wi-Fi (802.11a/b/g/n/ac)、Bluetooth
  • サイズ: 148×86×73ミリ、410グラム

ハードウェア的には1万円以下で販売されているような格安タブレットと同等かそれ以下の性能。バッテリーを省略している分だけ割高とも言える。

2週間ほどの使用で一度、何を言っても「わかりません」と返すようにバグったので、ファクトリーリセットを行った。Alexaアプリに関してもそれなりに不具合などあるので、トラブルフリーと言うわけでもなさそう。

付属品はACアダプターと薄っぺらいマニュアル。

12V 1.25AのACアダプター。USBアダプターのような見た目だが昔ながらのDCジャック。

上部はカメラシャッター、音量アップ、音量ダウン、ミュートボタンが並ぶ。小さな穴は集音マイク。
マイクはもう少し頑張ってほしかった。 少し離れると大声で呼びかけないと認識に失敗することが多くなる。卓上使用なら問題ないが、リビングでテレビ横に設置の場合は覚悟が必要。

物理的にカメラを遮るカメラシャッターは最近の流行り。ボタンを指でスライドさせる簡素な造り。
アレクサでは操作できない...。いや、アレクサに覗かれる心配は無用。

背面には電源ポート、マイクロUSB端子、3.5mmオーディオ出力端子が並ぶ。マイクロUSBは電源用ではないとのこと。

macアドレスは化粧箱の底面に記載。WiFiネットワークへの接続をmacアドレスで制限している場合に便利。
デバイス側にセキュリティはないに等しい。万全を期すため、侵入を防ぐ強固なネットワークやスマートキーによる入退室記録を備えた遮音防音ブースを用意して挑みたい。

一見するとネット部分から音が出る無指向性スピーカー風デザインだが、 本当のスピーカーは4Wものが下向きに配置されている。接地面に音を反射させて拡散させる仕組み。
わざとらしい低音を奏でる小さなスピーカーだが、BGM用としては十分とも言える。

5.5インチ (960×480)のタッチスクリーンディスプレイ。映り込みは半端ないが、使用中はそれほど気になるものでもない。

全般的なフィーリングは、まさしく格安中華タブレットそのものといったもの。値段なりの性能、値段なりの外観。ソフトウェアに関しても、過剰な期待は裏切られる。そもそもスマートスピーカー自体、世代を重ねてきたとは言え未だ家電レベルには達しておらず、使い続けるには広い心と忍耐が試され、利用者側の学習も必要。

製品としては、安定のAmazon品質。 『多少の不満はあるが我慢すれば使える。安いので我慢。』だ。 ただし、スマートスピーカーを試してみたい向きにはそれなりにおすすめできる商品。最悪、デジタル時計にはなるのでまったくの無駄とはなりにくいはず。

2019-06-25

OnePlus3T (A3010) の通話録音機能を有効化

Android 9ベースのOxygenOS 9.0.3でも機能したのでやり方をメモしておく。

$ settings put global op_voice_recording_supported_by_mcc 1
adb接続などでop_voice_recording_supported_by_mccフラグをOnにする

フラグを立てると"電話"アプリの設定にCall Record項目が表示される。

Call Record設定に入って通話録音の設定を行う。すべての通話を自動で録音するよう設定した。
この状態で電話を受けると自動で通話録音が開始された。当然、切ると録音終了。

録音した内容は"レコーダー"アプリで再生できる。
端末スピーカーでの通話は、受話・送話ともに正常に記録されていた。

再起動するとフラグがリセットされるので、起動時に毎回行う必要がある。
init.rcで行ってもよいが、よりカジュアルな方法としてMacroDoroidというアプリでマクロを作成した。

以上。
下手なアプリをインストールするよりよっぽど安定して使える。

2018-12-22

自転車タイヤ交換 SCHWALBE KOJAK

寒いのでお部屋遊びが捗るわ。

20インチミニベロ、ルック車のタイヤを交換。
銘柄はSCHWALBEのKOJAK
ブラックフライデーセール時にCRCで購入したもの。届くまで3週間程かかった。

Schwalbe Kojak。白いホイール、黒いタイヤ、クリアキャップのミスマッチ。

SCHWALBE KOJAK

Size:ETRTO 35-406 (20 x 1.35 Inch)
Typ:Wired
Compound:SpeedGrip
Execution:RaceGuard
Color:Black
Skin:Lite
Weight:285 g (10 oz)
Pressure:4.00 - 6.50 Bar (55 - 95 psi)
Maximum load:70 kg
EPI:67
Profil:HS385
Article number:11100063.02
EAN:4026495853811
Tube:6, 6A

合わせてチューブもSCHWALBEのものに交換。
米式バルブ。 28-406 (20 x 1.10)から40-406 (20 x 1.50)サイズまで適合するようだ。

SCHEWALBE AV6

Marking:AV 6
Article number:10413310
Version:STANDARD
Weight:95g
Valve:AV
Valve length:40

取り外したKendaの臭うタイヤ。

もともと装着されていたものはKENDA 32-406 (20 x 1.25)なので一段太いものとなる。

また、空気圧はKENDAのものが2.8-4.5BARなので、1.5倍近く圧を掛けることが可能。 (もっとも、所有している空気入れでは5BAR以上入れると接続部からエア漏れしてしまうが)

ダサさ3割増しのトレードオフとして、お尻への負荷は程々に、楽に速度が出るようになることを希望。
寒いから乗らんけど。

2018-12-01

2018年度のAndroidアプリ開発に関して その2

久々にAndroidアプリを製作してみたら、太古の時代とはいろいろと状況が変わっていた話のその2。
今度は、大幅にパワーアップしたPlay Consoleに関して気になった機能を挙げていく。

App Signing (アプリの署名)

サーバー側でアプリへ署名を行う仕組み。
アップロードキーで署名してパッケージをアップロードするとサーバー側で配布用の鍵で署名し直してくれる。

厳重管理の配布用鍵を共有する必要がなくなるので運用が楽になる。組織にもよるが、アップロードキーはgitへ含めてしまって問題ないように思える。

Android App Bundle (アーティファクトライブラリ)

aab。以前のapkに変わるもの。

aabでアップロードすると、Google Play側で各端末に最適化(不要なリソースを削る等)したapkを生成してくれるので、ユーザーのダウンロードサイズを抑えることができる。 アプリの分割配信にも対応。

apkやaab等をまとめてアーティファクトと呼称するようになったようだ。また、(aabから生成したものではない)以前の形式のapkを、ユニバーサルAPKと呼ぶようになった。

リリース前レポート

テスト端末を使用した自動化された受入テスト(品質テスト)が行える。

Firebase Test Labの機能が一部取り込まれたようだ。Robo Scriptにも対応している。

アプリのリリース

トラック(配布チャンネル)が「内部テスト版トラック」「クローズドトラック(アルファ版)」「オープントラック(ベータ版)」「製品版トラック」の4つに整理された。

段階的に公開範囲を広げていくリリースシナリオに沿ったもののようだ。初版リリース前なら「内部テスト版トラック」を作成することで、ストア表示の確認にも使える。

ストア掲載情報のテスト機能

ストア表示のプレビュー機能が搭載されたか誤解したがそうではなく、ストア掲載情報に関してのA/Bテストが行える。(50%のユーザーに対しては別パターンの画像を表示等)
アプリのA/Bテストですらないので開発者が気にする類ではない。広告屋によるマーケティング担当に向けた機能。

以上、気になった機能を挙げてみた。

外部サービスが必要であったものもPlayコンソールで行えるようになっており、企業による本格的な開発におけるリリース管理全般に使えるような改善が行われている。
QAやマーケ担当に向けた機能が充実しており、以前は開発者が使うものといったイメージを持っていたが認識を改めたいと思う。

また、逆説的にそういった機能が必要となる程、今のアプリは多様な人材が必要で、組織立って多大なコストをかけて行う重いビジネスとなってしまったのだと感じてしまう。

戦略会議で意見表明するマーケティング担当

QAチームによる最終品質チェックの様子

2018-11-18

Kensington Orbit Trackball with Scroll Ring (K72337) の分解整備

Kensington製のスクロール機能付きトラックボール製品。私の記憶が正しければ、5年以上前に購入したもの。

同社トラックボールシリーズの中では下位グレードに位置するもので、比較的安価に入手できる。
特徴的なスクロール機構で根強い人気があるのか、2018年の現在でも未だにカタログ落ちせずに新品入手可能。かなりのロングセラー製品。

https://www.kensington.com/p/products/control/trackballs/Orbit-Trackball-with-Scroll-Ring/
  • 製品のコンセプト - 良い
  • 操作性 - 左右対称デザインで利き手側のクリックが難有
  • 外観 - 値段なり
  • 品質 - クリックがしょぼい
  • 価格 - ニッチな製品なので妥当

そんな製品であるが、ラップトップPCを主に使うようになったこと、クリックの切れが悪く下品で大きな音がすることから長らくジャンク箱入りしていた。

その後、環境の変化もあり、思い立って再度使い始めた。
机が散らかっている時にも省スペース据え置きで使えるトラックボールはやはり便利ではある。

しばらくそのまま使用していたが、やはりこのクリックでは快適に使用することが難しい。
そのため、分解整備を実施することとし、同時にクリック感やクリック音の改善ができればと思う。

2018-11-10

Androidアプリ開発の状況 (2018年度)

久々にAndroidアプリを製作してみたら、Lollipop時代とはいろいろと状況が変わっていたのでメモ。
以下、2018年版としてプラットフォームやよく使われるライブラリ等を表にしてみた。

2018年度Android開発

2014年頃
(Kitkat/Lollipop辺りまで)
2018年現在
(Nougat/Oreo/Pie)
備考
最低対応バージョン
(推奨)
Gingerbread
(API9)
Lollipop
(API21)
言語 Java6 Java8
Kotlin
Java8はAndroid7.0(API24)とそれ以前とで対応状況が異なる
DEXコンパイラ DX D8 Android Studio 3.1からD8がデフォルト
コード圧縮 ProGuard ProGuard
R8
次期バージョンのAndroid Studio 3.3からR8がデフォルトになる
デザイン Holo
Material
Material フラットデザイン2.0やMaterialTheming
ランチャーアイコン Bitmap画像 Vector画像 API25でRoundIcon
API26からAdaptiveIcons追加
基本レイアウト Relative Constraint
コンポーネント Support Library Jetpack JetpackでSupport LibraryとArchitecture Componentsが統合された
アーキテクチャ MVP MVVM Android Archtecture Components (AAC)のViewModel + DataBindingでMVVM
開発プラットフォーム Fabric Firebase Twitter社のFabricはGoogleへ売却された
ビューインジェクション Butterknife - DataBindingで代用
DI Guice Dagger2
イベント駆動 EventBus RxAndroid ViewModel + LiveDataだけで十分かも
HTTP通信 Volley Retrofit2
OkHttp3
画像ロード Volley Picasso
Glide
ラムダ式 Retrolambda - API24で不要

雑感

アーキテクチャ的に近年はMVVMがトレンドのようで、ViewModel + DataBinding + LiveDataあたりを組み合わせて実装する。

Kotlinに関してはクリエーターやデベロッパー色の強い開発者を中心に普及が進んでいるようだ。
ただ、SDKバージョンをAPI24まで上げるとJava8の多くの機能が使用できるので、Kotlinへのモチベーションは個人的にさがっている。

AndroidOSは毎年新しいメジャーバージョンがリリースされているが、Marshmallowあたりから個人的にはどうでも良くなってきた感がある。
最低SDKバージョンはLollipop(API21)が推奨されているようで普及率は85%となる。Java8の対応状況を考えるとNougat(API24)まで上げたいが、普及率は37.1%と苦しいところ。

尚、Nougatからがサポート中の現行バージョンとなり、Marshmallowまでは旧バージョン扱いとなっている。

参考リンク

2018-09-01

ちょっとした確認用にpythonでhttpサーバーを起動

Pythonモジュールの実行で済むわけですが...

Python2.x
$ python -m SimpleHTTPServer
Python3.x
$ python3 -m http.server

これすら覚えられずに毎回検索しているわけで...

$ touch ~/.local/bin/httpserv
$ chmod +x ~/.local/bin/httpserv
$ $EDITOR ~/.local/bin/httpserv
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Usage: httpserv [PORT=8000]

import sys
try:
    # py2
    import SimpleHTTPServer
    SimpleHTTPServer.test()
except ImportError:
    # py3
    import http.server
    if sys.argv[1:]:
        port = int(sys.argv[1])
    else:
        port = 8000
    http.server.test(port=port)

コマンド化すると補間も効くので大丈夫だろうと言うことです。

2018-08-25

HerokuのDocker Deployで機械学習APIを5ステップで作成

HerokuでDockerが使えるようになっていたので、遅まきながら、機械学習を使ったAPIを5ステップで作成してみた。

STEP1: 事前準備

herokuへサインアップし、APPを作成。
また、herokuコマンドとdockerをインストールして使えるようにしておく。

STEP2: サンプルコードを入手

heroku公式のminicondaイメージのサンプルコードがあるので、コレをベースに使用。

$ git clone https://github.com/heroku-examples/python-miniconda.git

ざっと中身を確認すると、

  • python 2.7
  • miniconda環境構築済み (condaコマンドが使える)
  • scikit-learn導入済み
  • webフレームワークはflask
  • gunicornでwsgi
  • ポート番号は環境変数PORTで指定

となっていた。

STEP3: APIを実装

heroku用だろうと特に変わることはないので、いつものようにサクッと実装する。

開発中にライブラリを追加した場合は、Dockerfileへの反映も忘れずに。

pandas等condaで追加するもの -> Dockerfile内のconda installに追記
pipでインストールするもの -> requirements.txt

STEP4: ローカルで動作チェック

Dockerコンテナを起動して動作を確認する。

引数指定がめんどうなので、docker-compose.ymlを作成してdocker-composeを使用することにする。

# docker-compose.yml
version: "2"
services:
  app:
    build: .
    ports:
      - "8100:8100"
    environment:
      PORT: "8100"

コンテナ起動とブラウザで動作チェック。

$ docker-compose up
$ xdg-open http://localhost:8100

STEP5: herokuへデプロイ

ここからがherokuで行う操作となるが、いくつかコマンドを打つだけで本番反映まで行える。素晴らしい。

$ heroku login
Email: nobody@somewhere.com
Password: ********
$ heroku container:login
$ heroku container:push web -a アプリ名
$ heroku container:release web -a アプリ名

以上で完了。

終わり

Heroku の Docker Registry & Runtime (Docker Deploy)は、ほぼストレスフリーで簡単に使用できる完成度の高いプラットフォームと思う。

詰まったところといえば、サンプルコードのREADME.md記載の手順が少し古かったところぐらい。
container-registry用のpluginをインストールするよう書かれていたが、現在は不要。

作ったもの

結局、何を作ったかというとIPO銘柄の初値予想APIを作った。
過去のIPOデータを学習させてRidge回帰で暴騰率を予測させている。スコア的には残念だが、雰囲気はでていると思う。

ブラウザの場合は、http://ipo-cal.herokuapp.comへアクセスするとGUIで試せる。

API本体はhttp://ipo-cal.herokuapp.com/api/predictで公開している。
curlだと以下のように呼び出す。

$ curl -X POST \
  -H "Content-type: application/json" \
  -d '[{"code":"4385", "market":3, "sector":25, "price": 3000.0, "fund":122142.9, "kobo":18159.5, "uri":22554.8}]' \
  http://ipo-cal.herokuapp.com/api/predict

{"data":[{"code":"4385","inflation":189.6046720498996,"price":5700,"rank":3}],"status":"success"}

json文字列をhttp://ipo-cal.herokuapp.com/api/predictへpostするだけでOK。
配列にして一度に50件までまとめて実行できる。

レスポンスはJsendに概ね準拠している。

レスポンスがなかなか返ってこない時は、サーバーがスリープしている。コンテナが起動するまでしばらくかかるので、10秒ほど待機してからリトライしてみて欲しい。

2018-08-03

arm64版armbianでpuppeteerを使う

puppetterはnodejsからheadless-chromeを使用するためのライブラリ。
こちらもarm64環境では素直に動かなかったのでメモ。

環境

  • Orange Pi Win Plus
  • ARMBIAN 5.41 stable Ubuntu 16.04.5 LTS 3.10.107-pine64
  • nodejs v8.11.3

問題点

  • npmインストール時にchromeバイナリが自動ダウンロードされるがarm64版ではないので起動しない。
  • 手動でarm64版をダウンロードして置き換えようにも、そもそもarm64版のスナップショットは公式で提供されていない。
  • armbian(ubuntu)がarm64版のchromiumを提供しているが少しバージョンが古い。Chromium 68.0.3440.75
  • 最新のpuppeteer v1.6.1が対応するchromeはChromium 69.0.3494.0 (r575458)。
  • chromiumのような大きなアプリケーションをセルフビルドするのは嫌だ。

対処

  • 古いのを承知でaptパッケージのchromium-browserをインストール。
  • 対応chromeのバージョンが近いpuppetter v1.4.0で妥協。
  • aptパッケージのchromiumを使う。(executablePath/usr/bin/chromium-browserを指定)
$ sudo apt install chromium-browser
$ npm install puppeteer@1.4.0 
const puppeteer = require('puppeteer')

(async () => {
    const browser = await puppeteer.launch({
      executablePath: '/usr/bin/chromium-browser'
    })
    ...
})()

以上の対処で今回のケースでは一応動作した。
早くarm64もメジャーなアーキテクチャになって欲しいところ。