PC上で快適にEPUB形式データを読む

iOSバイスをお持ちの方はiBooksという素晴らしい電子書籍リーダーアプリが標準でインストールされており、スクロール表示でWebページを見るように縦or横スクロールさせて電子書籍を読むことができてとても快適です。

Mac版も同様にスクロール表示機能があるかと思いきや、まだ未対応の状況です。

 

長らくMac環境でEPUB形式のデータをスクロール表示させるためのアプリなどを探していたのですが、ようやく最近見つけたアプリをご紹介します。

 

1. Readium

現時点ではこれが表示の滑らかさなどで一番良さそうなアプリです。

Readium - Chrome ウェブストア

 

使い方は下記がわかりやすそうでした。

gihyo.jp

 

ちなみに技術評論社電子書籍EPUB形式もあるためよく購入しています。

 

2. BiB/i

Readiumに比べて若干読み込みやスクロールがもっさりしていますが、

ローカルにブラウザ上で動作するので英語の電子書籍など読む場合はすぐGoogle翻訳使えるので便利です。

また、GitHub上にコードが公開されていました。

bibi.epub.link

 

3. Murasaki

OS XEPUBリーダとしてMac App Storeに有料公開されているアプリ。今回試してはいません。

そして開発は2015年で止まっている感じでした。

Murasaki — The Scroll-based EPUB Reader for OS X

Murasaki ver. 2.3をリリースしました — Genji App Blog

2017年の振り返り

今年はサービスで2つの大きな機能リリースと、2つのイベントでの発表を行いました。

大きめのリリースを2回経験したことで、最近は若干設計について議論していけるくらいのスキルが身について来たなと感じつつも、まだまだ足りないスキルとのギャップも感じさせられた1年でした。

ただ、ChefやDocker、Terraformといった領域にも触れることができ、Webエンジニアとしての深さや幅を広げることができた1年だったと思います。

凄いエンジニアに囲まれて色々と気持ちが焦ることもありますが、来年も自分のペースで学習しつつ、特に基礎的な知識については継続的にしっかりと固めて行きたいと考えています。

DockerについてLTした内容と細かい話

speakerdeck.com

ホスティング事業部内のホスtechMTG#3にてDockerについてLTしました
資料に入り切らなかった小ネタなどをここでは紹介。

LT資料の言い回しついての補足

specコンテナ:
コンテナ内でRSpecを実行してコードをテストするためのコンテナ

dbコンテナ:
RSpec実行コンテナと接続しているMySQLが起動されたコンテナ

参考資料

最近だとこの辺がDockerについて特集記事がありました
Software Design 2017年2月号
WEB+DB PRESS Vol.98

実際に使ったコマンド

資料では若干オプションなど省いてたので完全版

  • specコンテナ側の起動時
    • $ docker run -dit -v $(pwd)/spec/features:/tmp/muu/spec/features --link db spec bash
    • E2Eテストだけ外から変えられるように-vでホストPC側の一部をマウント
  • exit後にもっかい入る時
    • $docker run -it spec bash
    • -dでコンテナを起動している
    • exitした後、再度コンテナに入りたい時に

.dockerignore

コンテナ間通信についての資料とかは探せばたくさんあるけれども

最終的にはやっぱり公式っしょ
- Docker Engine ユーザガイド - コンテナ通信の理解

spec->dbコンテナのDB接続のため

Railsのconfig/database.ymlでは環境変数で与えられたhost名を使って接続するようにしているので、
specコンテナのDockerfile内でdbコンテナのipを環境変数(TEST_MYSQL_HOST)として与えておくことでちょっと楽した気分を味わいました。
docker-composeを使えばそういうことせずにspecコンテナ側のlocalhost:3306をdbコンテナ側の3306としてPort Forwardingの設定ができそうな気はしました。
あと、drone.ioの.drone.ymlはdocker-composeのsupersetのようなのでdocker-compose.ymlには使いまわせるのかな?というところまでで。 drone.io - Getting Startd

# Dockerfile
...
ENV TEST_MYSQL_HOST 172.17.0.2
# config/database.yml
common: &common
  adapter:   mysql2
  reconnect: false
  pool:      5
  strict:    false
  database: dbdbdb

...

test:
  <<: *common
  host: <%= ENV['TEST_MYSQL_HOST'] %>
  username: <%= ENV['TEST_MYSQL_USER'] %>
  password: <%= ENV['TEST_MYSQL_PASSWORD'] %>

JSON Schemaの書き方がわからないので調べた件について

現在RailsAPIサーバを開発しております。
WebでAPI開発について色々調べた結果、API開発にあたりJSON Schemaと言うものを設計しておくと色々捗るようなのですが、
初見では書き方・読み方がいまいちわからなかったので少しは読み書きできる程度に調べてみました。
なおyamljsonと混在してますが、僕はyamlで書く予定のためそうなってます。あしからず。

また、自分なりの解釈のため間違っている箇所が多々あると思いますが、やんわり教えてもらえると助かります。

公式 json-schema.org


- 最初に書くヘッダ的な数行 - idはこのリソースのURI

id: http://some.site.somewhere/entry-schema#
"$schema": http://json-schema.org/draft-04/hyper-schema
title: Product
description: A product from Acme's catalog
type: object
properties:


- typeがarrayの場合、次にitemsが続く

type: array
items:
  type: string


- itemsは下記のような要素を持てる(ここで全て網羅してません)

title:
type:
properties:


- typeがobjectの場合、次にpropertiesが続く

dimesions:
  type: object
    properties:
      length:
        type: number


- propertiesの後は任意の変数名が続く
- properties内はtypeがほぼ必須
- description:で説明が追加できる
- minimum: 0などの制約が追加できる

properties:
  options:
    description: about this option
    type: array
    minItems: 1
    items:
      type: string
    uniqueItems: true


- $ref:schema内の該当箇所を参照する
- required:で必須プロパティを指定できる
- oneOf: スキーマの配列であり、インスタンスはこれらのスキーマのうちの1つに対して有効である場合にのみ有効
- definitions: スキーマで使用されるインラインサブスキーマを定義できる標準化されたプレースホルダ

{
    "id": "http://some.site.somewhere/entry-schema#",
    "$schema": "http://json-schema.org/draft-04/schema#",
    "description": "schema for an fstab entry",
    "type": "object",
    "required": [ "storage" ],
    "properties": {
        "storage": {
            "type": "object",
            "oneOf": [
                { "$ref": "#/definitions/diskDevice" },
                { "$ref": "#/definitions/diskUUID" },
                { "$ref": "#/definitions/nfs" },
                { "$ref": "#/definitions/tmpfs" }
            ]
        }
    },
    "definitions": {
        "diskDevice": {},
        "diskUUID": {},
        "nfs": {},
        "tmpfs": {}
    }
}

ここ3ヶ月間のコードレビューでついたコメント集(PHP編)

なんとWeb業界に転職してはや5ヶ月目突入しました。
今回はサービスに配属されてからこの3ヶ月間のうちに自分が出したPRのコードへのコメントをまとめてみました。 タイトルの通り内容はPHPの書き方に絞っています。

  • nullの判定
    • $foo['bar'] === nullではなくempty($foo['bar']) または isset($foo['bar'])を使う
  • nullだったら代入させたいパターン
    • ついついif (empty($now)) {と書いちゃいがちだが、if使わなくても1 sentenseでいけるよってパターン
    • nullでない時は$nowの値がそのままとなる
>>> $now || $now = date('Ymd')
>>> $now
=> "20170202"
  • 文字列判定
    • strpos()よりpreg_match()
    • 正規表現を使うことになるが、より細かい判定基準で文字列一致を判定できる
  • 戻り値をbooleanで返す時
    • ついついif ($bar === '何か文字列') {とかで判定した結果をreturnしがちだけど 1 sentenseでいけるよってパタン2
    function foo() {
        return ($bar === '何か文字列');
    }
  • ヒアドキュメントを使う
  • __DIR__を使う
    • require __DIR__.'/../../Example.php'


一応前職でCをかじっていたいので基本中の基本では突っ込まれることはなく、
PHP特有の標準関数を使うことや、こういう書き方まで書いてOKみたいなラインについて理解が進んできました。
とはいってもまだまだなので日進月歩で学んでいきます。

ではまた何ヶ月か後にPHPRails編で。

Retry [Ruby on Rails Tutorial] with RSpecした時のメモ1

RSpecにて 名前の長さのvalidationテスト書くとき
modelでこう書いてる時に

 validates :name, presence: true, length: {maximum: 50}


user.errorsのname部分のエラーは

:name=>["is too long (maximum is 50 characters)"]

となってるので、includeでエラーの一部と一致させたいときは

    expect(user.errors[:name][0]).to include("too long")

こう([:name][0])書かないとsuccessされなかった

Macのショートカットキー翻訳スクリプト

Mac使ってますがショートカット記号の対応キーが全然覚えれないので ショートカット記号をキーボードのキー名に翻訳するスクリプトRubyで書いてみました。

gist.github.com

実行結果

$ruby coubou.rb
 ⌘:1, ⌃:2, ⌥:3, ⇧:4, ⇪:5, ⎋:6,
 Please input corresponding number & enter.
 Exit: ^c

# 数字キー(1〜6)を入力すると対応するショートカット記号を表示する。
# 例えば以下のような入力をしてEnter実行すると
 ⇧⇪⌥⌃K
# キー名にして出力される
 Shift + Caps Lock + Option + Control + K

最近はPHPばかり書いてたので、 RubyのSymbolに数値が使えないとかでハマったりしながらも、Rubyっぽい書き方で少しは書けたかなーと思います。 ただ、改行のためにやたらputs ''をたくさん書いてしまったけれど他に上手い書き方がありそうだ…。

参考

Macの特殊キー記号を覚えてしまおう! « TORQUES LABS

コードポイントから文字に変換するには (chr) | hydroculのメモ

Rubyでバッファリングなしのキー入力を試す - Programmer's Diary