CORDEA blog

Android application engineer

Mackerel Client 1.2 をリリースしました

この度、MackerelClient 1.2 をリリースしましたので、リリースノートに書かなかった諸々を書きます。
ちなみに 1.1 (2016年4月24日) 以来、2 年半ぶりの更新となります。

Get it on Google Play

反映されるのはもう少し後かもしれません
スクリーンショット等はそのうち更新します

github.com

リリース内容

  • アラート一覧にホスト名や監視設定の値を表示するようにした
  • アラートの取得、グラフの描画を早くした
  • デザイン修正
    • card 部分のスタイルをちょっと変えた
    • グラフ部分のスタイルをちょっと変えた
  • バグ修正
    • ドロワーの文字色がいつの間にか毒々しくなってたので直した (というか直った)
  • min sdk version: 19 -> 21
  • target sdk version 23 -> 28

内部的な変更

  • 264 files changed, 8403 insertions(+), 6158 deletions(-)
  • ktlint の導入
  • dagger の導入
  • databinding の導入
  • groupie の導入
  • parcelize の導入
  • AndroidX 対応
  • 諸々のバージョンアップ
    • kotlin 1.0.1 -> 1.2.71
    • realm 0.87.2 -> 5.1.0

大規模な設計の見直しが入っており、差分がかなり大きくなりました。
グラフの描画部分など、主機能については大きく書き直しています。
まだ完全ではありませんが、まぁまぁまともになってきています。


気が向いたら使ってみてください。

Hy と Python の version について

Hy の install 時に Python version で少し困ったりしたのでメモ

普通に Python 3.7.0 の環境で Hy を pip install して実行すると

ImportError: invalid flags 1531398560 in 'hy.core.language'

こうなったり、または一回は実行できるけど二度目は失敗する、みたいなことになる

Hy 0.14.0 は Python 3.7.0 に対応していないためにこのエラーは起きているようで
これより後に 3.7.0 対応が行われている

と言うわけで対応としては公式通り、基本的には

$ pip install hy

よりも

$ pip install git+https://github.com/hylang/hy.git

の方が良さげ

Spacemacs の install で嵌ったりした

最近 Lisp 方言を書く機会が多いので重い腰を上げて Emacs を入れました
といっても素の Emacs を育てるには Vim に染まりすぎたので
Spacemacs という Emacs の distribution に頼ることにしました

嵌ったところ

公式にしたがって ~/.emacs.d に clone したのですが

Error (use-package): org-projectile :config: Symbol's function definition is void "projectile-global-mode"

的なことを言われたり言われなかったり、mode がうまく切り替わらなかったりして嵌ってました

で、spacemacs 自体を develop に切り替えることでうまくいきました
予想ですが、この PR が関係してそうだなと

$ cd ~/.emacs.d
$ git checkout develop

このあと一応 dotspacemacs/install し直してます

その他

思ったより Spacemacs 良かったです
C-x C-c と C-g だけ覚えとけばなんとかなる

Docker で mediawiki 立てて oauth extension 入れるまで

前も似たようなこと書いた気がするけど...
検証用に local で一時的に立ててるものなので色々ご注意ください。

build

docker hub から引っ張ってくると mediawiki が古い (多分) ので公式 repository を clone して build します

$ git clone https://github.com/wikimedia/mediawiki-docker.git
$ docker build --rm -t mediawiki:latest mediawiki-docker/stable/

run

立てます、動けばいいので色々適当です

$ docker run -it -d -e MYSQL_ROOT_PASSWORD="root" --name mysql mysql
$ docker run -it -d -e MEDIAWIKI_DB_PASSWORD="root" -e MEDIAWIKI_DB_TYPE="mysql" -p 8080:80 --link mysql:mysql --name mediawiki mediawiki:latest

ここからは http://localhost:8080 にアクセスしつつ色々進めます。
途中に入れる db への接続先は

$ docker inspect -f '{{ .NetworkSettings.IPAddress }}' mysql

最後まで行くと LocalSettings.php 入れてねって言われます。

local settings

今回は oauth extension をとにかく早く動かしたかったので mail 系を全部無効にしました (しないと認証求められるので)

$wgEnableEmail = false;
$wgEnableUserEmail = false; # UPO

...

$wgEmailAuthentication = false;

入れます

$ docker cp ./LocalSettings.php mediawiki:/var/www/html/

oauth extension

OAuth extension を download してきます
ここら辺です

Download MediaWiki extension - MediaWiki

適当なところに copy して解凍します

$ docker cp ./OAuth-*.tar.gz mediawiki:/tmp/
$ docker exec mediawiki tar xzf /tmp/OAuth-*.tar.gz -C /var/www/html/extensions

LocalSettings.php に設定を追記して update します
とりあえず誰でも consumer を追加できるようにしたいのでそんな感じにします

$ docker exec mediawiki sh -c "echo \"wfLoadExtension( 'OAuth' );\" >> /var/www/html/LocalSettings.php"
$ docker exec mediawiki bash -c "echo $'\$wgGroupPermissions[\'user\'][\'mwoauthproposeconsumer\'] = true;' >> /var/www/html/LocalSettings.php"
$ docker exec mediawiki php /var/www/html/maintenance/update.php

consumer registration は http://localhost:8080/index.php/Special:OAuthConsumerRegistration

BitBucket で OAuth 1 での認証がうまく行かなかった話

結論

timestamp が float だった

経緯

私が作っている nim の oauth library を修正したところ
bitbucket の例がうまく動かなかった (というか bitbucket は多分ずいぶん昔から動いていなかった) ので調査していて分かったのでメモ

問題の切り分けに時間がかかった要因としては

の例は動いていた、という点があります。

概要

いくつかの bitbucket x oauth 1 の例から正常に動く以下の例を参考に

Bitbucket OAuth 1 Tutorial — Requests-OAuthlib 1.0.0 documentation

送られているヘッダーを見比べた結果

  • Requests-OAuthlib
 oauth_timestamp=\"1530407158\", 
  • oauth
oauth_timestamp=\"1530407309.0\", 

となっていて、ここが原因でした。
先ほどの Twitter 等のサービスは、timestamp が float でも受け入れていたということのようです。
わかれば単純ですけど、bitbucket は理由を返してくれないので何故こけてるのかが分からずかなり時間がかかりました...

Red で http request を行う方法

Red programming language で http request を行う方法がちょっと分かりづらかったのでメモ

GET

本当にシンプルな GET

>> read http://localhost:8080/api
== {{"status":"ok"}}

header の追加など必要な場合

>> write http://localhost:8080/api [GET [
    Accept: "application/json"
] ""]
== {{"status":"ok"}}

(読みやすいように実際の出力を一部修正してます)

POST

>> write http://localhost:8080/api [POST [
    Accept: "application/json"
] {{"data": "data"}}]
== {{"status":"ok"}}

Others

他は一緒です。
ただ、PATCH と DELETE は 0.6.3 時点で対応されていないのでご注意ください。

>> write http://localhost:8080/api [PUT [
    Accept: "application/json"
] ""]
== {{"status":"ok"}}
>> write http://localhost:8080/api [PATCH [
    Accept: "application/json"
] ""]
*** Internal Error: reserved for future use (or not yet implemented)
*** Where: write
*** Stack:  

>> write http://localhost:8080/api [DELETE [
    Accept: "application/json"
] ""]
*** Internal Error: reserved for future use (or not yet implemented)
*** Where: write
*** Stack:

refinement

read/write は refinement による挙動の違いがあります。

refinement の一覧はこの辺りで確認できます
read, write 共に binary, lines, info refinement が実装されてます
ちなみに write は append と part もエラー発生せずに通るのですが、みた感じ実装されてない気がします

binary

データを 16 進形式で返します

>> read/binary http://localhost:8080/api
== #{7B22737461747573223A226F6B227D}
lines

文字列を改行で区切って block で返します

>> read/lines http://localhost:8080/api
== ["text" "text" "text"]
info

名前の通り

>> info: read/info http://localhost:8080/api
== [200 #(
    X-Content-Type-Options: "nosniff"
    Server: "WEBrick...
>> print info
200 X-Content-Type-Options: "nosniff"
Server: "WEBrick/1.3.1 (Ruby/2.4.2/2017-09-14)"
Content-Length: "15"
Content-Type: "application/json"
Connection: "close"
Date: "Sun, 03 Dec 2017 09:47:41 GMT" {"status":"ok"}

詳しいことは実装見るのが一番早いので、simple-io あたりをご覧ください。

YAPC::Fukuoka 2017 HAKATA 前夜祭で LT してきました

最近 GitHub から緑が消え始めてて危機感しか感じません。

それはさておき、
YAPC::Fukuoka 2017 HAKATA に参加して来たのでその感想を書きます。

前夜祭

Possibility of terminal」 という題で Terminal (というか prompt) の可能性について話してきました。

speakerdeck.com

この手の話がどう受け止められるか (というか受けるのか) 分からなかったので結構心配なところはありましたが、
笑っていただけた部分もあったようで良かったです。

反省点は色々あるので、それは次の機会に改善します。

ちなみに普通に Terminal に表示するとこんな感じでした。

f:id:CORDEA:20170704091341p:plain

初参加だったので知り合いもいないし、Perl も知らないし福岡に住んでないし、なんで参加したのかよく分からない人間筆頭でしたが
発表したことである程度「なんか見たことある」人になっていたようで助かりました。

当日

会場がすごかった...

いくつか印象に残った Talk について。

ウェブセキュリティの最近の話題早分かり

脆弱性の紹介とデモの手際が良くて非常に面白かったです。
これだけでも福岡に行った甲斐あったなぁという感じでした。

はてなブログ最近の開発テクニックと最新の開発風景のご紹介

色々と感銘を受ける部分は多かったですが、
デザイナーとの開発のくだりがかなり良かったです。
デザイナーがデザイン周りのレイアウトとか組めたら良いよねって言うのは簡単なんですけど、
そこから先導入して行くのってとても体力が要るので、
言うだけで終わってたらダメだよなぁと感じた Talk でした。

あとコードレビューが遅い PR に未経験歓迎がつくの、なかなか良いですね。使っていきたい

The plan of Aniki 2.0

ORM にありがちな問題、よく分からないクエリ発行あたりはあるなぁ...って感想でした。
それに対する解決策としての Aniki 1.0 の特徴もなかなか良さそうに感じました。
Phantom Row Object, 面白そうですね。

終わりに

懇親会で YAPC 限定の Pawoo モバイルバッテリーいただきました。
ありがとうございました!

それと前夜祭含め、スタッフの皆さま、話していただいた皆さまありがとうございました。
とても楽しかったです!

来年までに Perl 力を高めておきたいと思います。