うっかりエンジニアのメモ

未来の自分に宛てたメモ

AdobeCCはデジハリで買うと最安。しかも即利用開始できる

趣味で同人誌や動画の制作をしているので前からAdobe CS4を使ってきたのだけど、さすがに古すぎて動作が厳しくなってきた。 そこでAdobeCCが必要になった、が、まともに買うと年6万円。合法的に安く調達する方法を調べた。

まとめ

デジハリで「Adobeマスター講座[ソフト付属]」を契約すると、AdobeCCを29800円(税込)で12ヶ月間利用できる。 AdobeCCシリアルコードは申込完了後、メールアドレス宛に即時発行されるので、すぐに利用開始できる。

Adobe Creative Cloud 基礎講座 | Web、CG、映像、アプリ、造形はデジハリの通信講座

なぜデジハリなのか

この記事を読んでいる人なら、デジハリ/ヒューマンアカデミー/アドバン あたりを比較検討中だと思う。 価格差からアドバンがまず候補から外れて、デジハリヒューマンアカデミーになる。 デジハリは最近Adobe講座の仕組みをリニューアルして、AdobeCCのシリアルコードを即時発行できるようになった。

f:id:entropiajp:20180116164051p:plain

僕の場合、30日の試用期間が切れていた and すぐに使い始めたかったので、デジハリの即時発行は大変素晴らしかった。 実際、申込みボタン押して30秒でシリアルコードが届いた。

FAQ

商用利用OKなのか?

OK

卒業後(受講期間終了後)も利用できるのか?

できる。が、12ヶ月経過後も利用するなら再びAdobeCCライセンス付きの講座を受講するか、あるいはAdobeCC通常版を別途契約する必要がある

アカデミック版ではなく通常版のセールでこのくらい安くならないか?

ならないっぽい。直近だと2017年7月頃にAmazon Prime Dayで44%OFFの33432円まで実績*1があるようだけど、それでも29800円には到達しない。

こやさんが2016年買ってよかったもの、後悔したもの、活動まとめ

社会人になると1年があっという間に過ぎていきます。

  • 買ってよかったもの
  • 買って後悔したもの
  • 活動まとめ
    • WHITE-LIPS「誓いの言葉」をピアノで演奏してみた
    • Zektbach「The Sealer ~ア・ミリアとミリアの民~」をピアノで演奏してみた
    • 28歳SEが星野源『恋』(TV size) をピアノで演奏してみた
  • 最後に

例によってAmazonで買えるものはアフィリエイトを貼っています。気になったら是非。

Predawn Absence

アコースティックギター、時にテレキャスターを担ぐ女性シンガーソングライターです。 ほとんどの曲が英詞なんですが、彼女の楽曲の世界観と魅力的なヴォイスには、やはり英詞がよく合います。 品川のグローリアチャペルという教会であったライブが本当に神懸かりだったので、とにかく一聴していただきたく。

年の瀬にレコ発ライブも行けたし、今後も応援していきたいです。

KOKIA moment

何年かぶりに「音楽を聴いて泣く」という体験をしたCDという意味で、このアルバムとの、そしてKOKIAとの出会いは2016年の特筆すべき出来事です。 リードトラックの「moment 〜私は生きる〜」の、心に迫る感じはそう簡単に味わえるものじゃないと思います。

辛かったことは忘れればいいと言うけど 未来は全てを抱きしめてゆくことで 輝きを増すこと 私は知ってる 失ってものがあるなら それにも増す愛で生きよう

この強さ。このしたたかさ。これからもライブに行きたいです。

四月は君の嘘

奔放なヴァイオリニストである宮園かをり。周りを振り回しつつ、圧倒的なセンスと才能で黙らせる… ヒロインと主人公との距離感の変化も楽しかったけど、奔放そうに見えて実は繊細なgiftedが大好物な自分には最高でした。年末年始で最終巻まで読むぞ!

SONY ワイヤレスノイズキャンセリングステレオヘッドセット MDR-EX31BN

遮音性が気に入ってもともとetymotic researchのイヤホンを使っていたのだけど、年末にフリンジが耳に残って取れなくなって耳鼻科行くという恐怖体験(大げさ)をして、フリンジが入り過ぎずそれでいて周りの音はある程度カットしてくれるイヤホンを探してました。 これはいいですね。移動中だったり仕事中に聞くんで音質なんかこだわっても仕方ないしでbluetoothイヤホンにしたけど、bluetoothイヤホンの意外なまでの取り回しの良さに気づけたし、いい出会いでした。カラーバリエーションに赤があるのもイイね。

TSdrena 覗き見防止プライバシーフィルター

MacBook Pro Late2013 - Late2015で覗き見防止フィルターはこれが決定版では。シール不要で、ディスプレイの縁に安定して置けるので綺麗に使えます。

MIDWEC ケーブル付き モバイルバッテリー 10000mAh

なぜかモバイルバッテリーって分厚いのが多いですよね。うっすいモバイルバッテリーを探してました。これは最高です。2.0A出力の口もあり、充電のスピードも問題ないです。

君が望む永遠

もう2001年のゲームか…。名作でした。紹介してくれた友人ありがとう。
私は遥推しです。

救命センター当直日誌

現役の救急救命センターの医師によるエッセイ。フィクションの体ですが、筆者の実務経験に裏打ちされた臨場感ある筆致で、サクサク読めます。
救急救命センターの出来事なので、人の生死も当然ありうる場のですが、そういった場だからこそ、患者の家族をはじめとした周りの人たちの人間性がよく出るんですね。
主人公の医師が措置の終わった後、一息ついている時に研修医とやりとりをする場面があります。そこで交わされる会話から筆者の人間へのまなざしが垣間見える所に、この本の良さがあります。

MOTHERHOUSE バッグ Antique Slim Business

shop.mother-house.jp

同じブランドの麻のバッグを使っていて、汚れが目立ってメンテに出すことになり代わりに買ったバッグ。これが本当にいいブラウンの色合いで… 中のポケット類もスマホや小物を入れるためによく考えられた設計になっていて、長くメンテしながら使っていきたいなぁと思っています。

三千櫻

michizakura.jp

甘めの日本酒が好きで、と近所の酒屋に相談したらこれをお勧めされて、以来、宅飲みではこれを買って行くようにしてます。 岐阜県中津川市の小さな酒造が作っているとても美味しいお酒です。

買って後悔したモノ

Playstation VR

とにかく酔った。VRの面白さに辿り着く前に、生理的なストレスに圧倒されて終了。 来年出るエースコンバット7のVRコンテンツまで寝かせておきます。

スプラトゥーン(買ったの2015年だけど)

めちゃくちゃプレイした。したけど。 正直、後半の方イライラした記憶しかなくて、総プレイ時間のうち1000時間くらいは無駄としか言いようがなかった。 長時間プレイしたけど、それはゲームの面白さから来るものではなくて、このゲーム(のガチマッチ)が本質的に持つ"ギャンブル性"によるものだと、自分は理解しています。

Splatoonスプラトゥーン)』は当社の開発チームの若い力を集結してできたもの

2015年10月29日(木) 経営方針説明会 / 2016年3月期 第2四半期決算説明会 - 質疑応答

とのことだけど、小学生から任天堂のゲームをやってきて、こんなにイライラしたことはなかったので(※よくイライラすると言われるスマブラはあまりやったことない)、このようなイライラするデザインのゲームが今後も出されるなら、自分と今後の任天堂のゲームはもう相性悪いんだろうだなという結論。

Apple Watch Series 2

www.apple.com

Genius Barの店員は商品知識がないなら正直に「わかりません」と言おう
顧客に嘘を吐くのはやめて。以上。

活動まとめ

2016年はピアノアレンジ動画を3作アップできました。

WHITE-LIPS「誓いの言葉」をピアノで演奏してみた

2000年代のエロゲの曲です。近未来SF×サン・テグジュペリという奇特な世界観を持ち、絵本のような穏やかな雰囲気の中、後半は怒涛のSFが展開されます。そのED曲がこの「誓いの言葉」なんですが、私は初回プレイ時、ボロ泣きでこのEDを迎えました。全く個人的な思い出として、大学生の頃、山形に免許合宿に行く時にノートPCを持っていってこのゲームを毎晩プレイしていたので、この旋律を聞くと懐かしさでむずがゆくなります。

Zektbach「The Sealer ~ア・ミリアとミリアの民~」をピアノで演奏してみた

soundcloudの自分のアカウント見返していたら、なんとこのプレビュー版が2012年にアップロードされていました。。

真面目に耳コピしてアレンジして熱心に練習したのに、面倒くさがって動画に残さずにいたらいつのまにかアレンジ忘れてる…みたいな悲しいことが去年何回かあったので、ちゃんと動画にしよう!と意気込んでアップロードしたのがこのア・ミリアでした。 ニコニコ動画のコメにあった「こやさんのおかげでゼクトが好きなりました」というコメが本当に嬉しかったです。そうやって好きの幅を広げてくれる出会いって実はあまりないんで、きっかけになれて嬉しいです。サンホラ好きは、ゼクト好きになる素質があると思います!

28歳SEが星野源『恋』(TV size) をピアノで演奏してみた

プロの独身なんで。
年末でクッソ忙しい時期だったんですが、毎週逃げ恥見ていて、本当にいい曲だったので弾きました。実際アレンジしようとすると、POPなだけでなくおしゃれで楽しい曲でした。
それにしても星野源、マルチだなぁ…

最後に

今年は、長年付き合いがあった人から不意打ちで瘴気の篭った言葉を当てられることが多く、なかなか気が滅入りがちでしたが、その一方でより深まった縁もあって救われる場面が印象的な年でした。モノに関しては、なかなかいい出会いが多かったように思えます。
来年も良いご縁と恵まれますように。あと音楽面でも新しい方向に踏み出してみようかと思っています。

良いお年を!

Ubuntu 14.04 + Apache 2.4 + Python 3.5.1 で Flask動作環境を構築する

OSインストール直後の状態からflaskの動作確認まで。

環境

コマンド実行

# use japan mirror server
sudo sed -i'~' -E "s@http://(..\.)?(archive|security)\.ubuntu\.com/ubuntu@http://ftp.jaist.ac.jp/pub/Linux/ubuntu@g" /etc/apt/sources.list

# update installed package
sudo apt upgrade
sudo apt update

# install apache2
sudo apt install apache2

# install python 3.5.1
sudo apt install -y build-essential
sudo apt-get -y build-dep python3.4
mkdir downloads
cd downloads
wget https://www.python.org/ftp/python/3.5.1/Python-3.5.1.tgz
tar -zxvf Python-3.5.1.tgz
cd Python-3.5.1
./configure --enable-shared --prefix=/opt/python-3.5.1
make
sudo make install
echo "/opt/python-3.5.1/lib" | sudo tee /etc/ld.so.conf
sudo /sbin/ldconfig

# create virtualenv & install mod_wsgi
cd ~
/opt/python-3.5.1/bin/python3 -m venv example-env
. example-env/bin/activate
pip install -U pip
pip install mod_wsgi-httpd
pip install mod_wsgi

# install flask
pip install flask

ファイル作成

/etc/apache2/mods-available/wsgi_express.conf

WSGIPythonHome /home/vagrant/example-env
WSGISocketPrefix /var/run/wsgi

/etc/apache2/mods-available/wsgi_express.load

LoadModule wsgi_module /home/vagrant/example-env/lib/python3.5/site-packages/mod_wsgi_packages/httpd/modules/mod_wsgi-py35.cpython-35m-x86_64-linux-gnu.so

/etc/apache2/sites-available/example-site.conf

<VirtualHost *:80>

    WSGIDaemonProcess example-site user=www-data group=www-data threads=5 python-path=/home/vagrant/example-env/lib/python3.5/site-packages
    WSGIScriptAlias / /var/www/example-site/app.wsgi
    WSGIScriptReloading On

    <Directory /var/www/example-site>
        WSGIProcessGroup example-site
        WSGIApplicationGroup %{GLOBAL}
        Order deny,allow
        Allow from all
    </Directory>
</VirtualHost>

/var/www/example-site/app.py

# -*- coding:utf-8 -*-
from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return 'completed!'

if __name__ == '__main__':
    app.run()

/var/www/example-site/app.wsgi

import sys, os
sys.path.append('/var/www/example-site')

from app import app as application

コマンド実行

sudo a2enmod wsgi_express
sudo a2dissite 000-default
sudo a2ensite example-site
sudo service apache2 reload

テスト

ブラウザに completed! と表示されればOK

参考

2015年まとめ

社会人になってからは毎年あっという間に過ぎていますが、やはり今年もせわしく一年が過ぎ去ってしまいました。 入社して3年近くが過ぎ、ブログのタイトルにある技術支援部署も、来月から異動で離れることになりました。 諸先輩方、大変お世話になりました。新卒で最初に配属された部署が、技術的に尖った先輩がいる環境で良かったです。 (この会社でそういう環境に居られたのは、なかなか運が良かったと思います)

今年勉強したもの

その割に記事が全然書けてませんね…反省します。

resultoon

ひそかにGitHubで10 starsを獲得する目標があり、9月頃に公開したアプリケーションで達成することができて良かったです。

entropiajp/resultoon · GitHub

任天堂のゲームソフト「スプラトゥーン」の戦績を記録するアプリです。HDMIキャプチャの入力を元に画像認識で各種情報を読み取るので、ユーザ入力0でプレイしてるだけで勝手に記録されて便利です。ちょうどエンジニア界隈でスプラトゥーンが流行っていたこともあり、多くの人に知ってもらうことができました。

学生時代の私のネット上の活動といえば、耳コピして演奏した動画を投稿したり、ピアノアレンジの楽譜を起こしたりすることでした。

趣味のアプリではありますが、こうしてエンジニアの人々の目に留まったことで「ピアノを弾く人」から「エンジニア」に一歩衣替えできた気分になり、とても嬉しいのです。

ただし、あまりにスプラトゥーンにはまりすぎて、resultoonを作れたことは良かったのですが、正直、学習はおろそかになってしまいました。。 費やした時間を考えると暗澹たる気持ちになりますが、行けるところまで行ったのでもう悔いはありません。

f:id:entropiajp:20151231233855p:plain

抱負

来年はいよいよ現場で仕事することになります。
今まで培ったことも下地にしつつ、いい意味でまた新入社員のような緊張感を持って、現場の仕事に馴染んでいきたいと思います。
年末年始はこたつでAWSの勉強するぞーー

それでは皆さま良いお年を。

MonsterTV X3A(SK-MVX3A)でSplatoon録画環境を構築する

スプラトゥーンにガチハマリしているので、対戦の様子を録画したくなってきました。 デスクトップのWinマシンでWii Uの映像を録画(キャプチャ)する環境を構築する手順をまとめておきます。所要時間は30分位。

PCI-express接続のキャプチャボードを使用するので、ノートPCでは実現できません。あしからず。

流れ

  • 各種ハードウェア購入
  • 設置
  • Wii U画面解像度設定
  • ドライバ・動作確認用アプリインストール
  • (最低限の)動作確認
  • アマレコTVインストール

マシン環境

項目 内容
MB ASUS P8h77?
CPU Intel Haswell Core i7
memory 16GB
storage システム: SSD データ: HDD
OS Windows 7 64bit

各種ハードウェア購入

合わせて1万円くらいです。

設置・配線

MonsterTV X3AをPCI Expressのレーンに差し込みます。
WiiUから分配器に入力し、2つの出力端子をテレビとMonster X3Aに接続します。

※我が家ではもともとテレビでプレイしていたので、そうでない場合は読み替えてください。

Wii U画面解像度設定

Wii Uの画面解像度を 720p に変更します。
これに気づかなくて1時間消えました。皆様お気をつけ下さい。

ドライバ・動作確認用アプリインストール

ダウンロード|地デジチューナーやビデオキャプチャなどパソコン周辺機器の製造・販売ならエスケイネット

キャプチャボード開発元の上記ページからMonster X3A用のアプリとドライバをそれぞれダウンロードして適宜readmeにしたがってインストールします。

(最低限の)動作確認

開発元提供の視聴録画アプリで、Wii Uの画面をキャプチャできるかどうか確認します。

ただし、このアプリはあくまで動作確認用に留めます。私の環境では15分に1度程度、画面の横方向に乱れが発生する場合があり、ゲームプレイに支障をきたすためです。実際のプレイ・録画には後述の「アマレコTV」というアプリを使います。 (あと開発元提供アプリは起動時にWindows Aeroがいちいち無効化されるのも煩わしいです)

アマレコTVインストール

アマレコTV公式ホームページ から アマレコTVをダウンロード・インストールします。

Ctrl+Sでスクリーンショット、Ctrl+Zで録画開始できます。これらのショートカットは他のアプリをアクティブにしている状態でも効くので、とっさに画像をキャプチャするのがとても楽です。

イカ、よろしく~

Timezone情報の有無によるJackson Deserializerの挙動変化でハマる

timezoneに想いを馳せる1日となりました。

環境

REST APIサーバ + JavaScript MVWフレームワーク構成のWebアプリです。

サーバサイド

クライアントサイド

  • AngularJS 1.3.14

状況

ユーザがアプリの画面で入力した日時を、json形式でAPIサーバに送信するような状況です。

前置き: Date and Time API(JSR310)とは

Java SE 8から導入された日付・時刻を扱うAPIです。

アプリが動作するのがJava8ということもあり、ここではJava8以前からある java.util.Date は使いたくないので、日付・時刻はすべてこのJSR310で定義されたクラスのオブジェクトとして扱うことにします。

ということで、ユーザが入力した日時はサーバサイドで以下のいずれかのクラスにマッピングされることになります。

JacksonでJSR310のクラスにデシリアライズするには

サーバサイドはJavaなので、JavaJSONパーサライブラリが必要です。上で書いたとおり、ここでは定番のjacksonを使うことにしました。

サーバサイド

依存関係に com.fasterxml.jackson.datatype:jackson-datatype-jsr310 を追加します。jacksonのcoreライブラリにはJSR310のクラスのパーサは実装されていないため、この追加モジュールを加える必要があります。

Jackson support for Java 8 Date & Time API data types is automatically registered when Java 8 is used and jackson-datatype-jsr310 is on the classpath. Joda-Time support is registered as well when jackson-datatype-joda is part of your project dependencies.

引用: Latest Jackson integration improvements in Spring

私はビルドシステムとしてGradleを使っているので、以下の記述をbuild.gradleのdependenciesに追加します。

compile("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.5.1")

日付情報を受け取るクラスを決める

先に書いたとおり、JSR310には日時を表現する3つのクラスがあります。

  • java.time.LocalDateTime
  • java.time.ZonedDateTime
  • java.time.OffsetDateTime

今回

  • DB(MySQL)に datetime 型で日付を格納している
  • ORマッパー(Doma)がデフォルトで、MySQLdatetime 型のカラムを LocalDateTimeマッピングする

ということで、 LocalDateTime クラスとしてユーザの入力した日時を受け取ることにします。

問題発生

ユーザが入力した日時データをPOSTすると、サーバ側のアプリ上で例外が発生してアプリが停止しました。

原因

jacksonの LocalDateTimeDeserializer ではデシリアライズできないフォーマットでjsonが送られてきたことが原因でした。

何が起きていたのか

たとえば「2015年1月1日0時0分0秒」という日時データをjsonで送るとき、サーバ側には

{date: "2015-01-01T00:00:00.000Z"}

のようなフォーマットの文字列で送られていました。
このTやらZやらが謎です。ということでぐぐると、ISO-8601形式を知りました。

ISO-8601形式

詳しくはWikipedia先生をどうぞ。

ISO 8601 - Wikipedia

中ほどを見ていくとありました

  • 日付と時刻の間にTを挟んで表記する
  • 時刻の末尾にZを加える事で協定標準時(UTC)を表現できる

さらに調べると、JavaScriptにはまんま toISOString() 関数がありました。

Date.prototype.toISOString() - JavaScript | MDN

toISOString(new Date()) みたいなことをすると、確かにISO-8601形式で日時が表示されました。

Jackson Deserializerでデシリアライズ可能なフォーマット

JacksonでjsonをLocalDateTimeにマッピングする時に使われるDeserializerは LocalDateTimeDeserializerクラス です。このクラスがデシリアライズ可能なフォーマットがわかれば良いと思い、とりあえずソースコードを見ていたら、ありました。

jackson-datatype-jsr310/LocalDateTimeDeserializer.java at master · FasterXML/jackson-datatype-jsr310

    private LocalDateTimeDeserializer() {
        this(DateTimeFormatter.ISO_LOCAL_DATE_TIME);
    }

コンストラクタの引数 DateTimeFormatter.ISO_LOCAL_DATE_TIME がめちゃくちゃ怪しいですね。

この時点でうすうす原因に気づいた感じがしてきましたが DateTimeFormatter.ISO_LOCAL_DATE_TIME はJSR310のクラスなのでリファレンスを読んでみると

フォーマッタ 説明
ISO_LOCAL_DATE_TIME ISOローカル日付および時間 '2011-12-03T10:15:30'

DateTimeFormatter (Java Platform SE 8 )より引用

Zがない

LocalDateTimeDeserializerは文字通りローカルな時刻(=タイムゾーンを持たない時刻)を扱うので、ケツZなぞ知らん、というわけです。

例外発生までの流れ

ユーザが日付を入力する
-> Dateオブジェクトが作られる
-> DateオブジェクトをPOSTする時、Angular内部で toISOString() 関数によりISO-8601形式に変換される(たぶん)
-> ケツZがついたフォーマットでPOSTされる
-> LocalDateTimeDeserializerからみたらデシリアライズできないケツZ
-> \(^o^)/

解決策の前に前提条件

  • JavaScriptのDateオブジェクトをAngularJSで送信しようとすると、ISO-8601形式で送信される
  • jacksonの LocalDateTimeDeserializer ではISO-8601形式の文字列をデシリアライズできない

解決策

クライアントかサーバか、どちらかで頑張るということになります。。。

解決策1: clientで日時のフォーマットを整形してから送信する

AngularJSなら、dateフィルタに処理させる。

$filter('date')(new Date(), "yyyy-MM-dd'T'HH:mm:ss")

これでDateオブジェクトのケツZが除かれた状態で送信されるので、何の問題もなくLocalDateTimeDeserializerでデシリアライズできます。ただし、この対処はタイムゾーンなしデータへの変換作業をclient側に寄せています。この方法ではすべての箇所で変換してから送らないといけないのでだるいです。

解決策2: serverでZonedDateTime型にデシリアライズする

ZonedDateTimeに対応したDeserializerである InstantDeserializerタイムゾーン情報付きのISO-8601形式のフォーマットをデシリアライズすることができます。 なので、ユーザの入力を一旦ZonedDateTime型で受け取り、内部でLocalDateTime型に変換します。 DBに格納する前にZonedDateTime型のオブジェクトをLocalDateTime型のオブジェクトに変換すればOKです。 幸い、それ用のAPIが用意されていました。( ZonedDateTime#toLocalDateTime() )

まとめ

解決策2を採用して、めでたく日時情報をやりとりできるようになりました。おしまい。

参考

sublime text 3をWindowsにインストールしたらやること

Markdownとpythonソースコードの編集に利用することを想定しています。

  • package control
  • package
  • font
  • key bindings

package control

なにはともあれ、package controlをインストール

Installation - Package Control

package

下記パッケージをインストール

パッケージ名 機能
Anaconda Pythonの自動補完、lint、pep8警告表示
IMESupport Windows環境下で日本語入力したときのインライン入力窓の位置を正しくする
Markdown Extended markdown中に書かれたソースコードのsyntaxhighlighting
Monokai Extended markdown文書のsyntaxhighlighting
OmniMarkupPreviewer markdown文書をCtrl+Alt+Oでブラウザプレビューできるようにする
Package Control パッケージ管理ツール
Table Editor markdownでテーブルを簡単に記述できるようにする
Theme - itg.flat フラットなsublime textテーマ

Anaconda settings

Anacondaのpep8警告表示を利用するための設定。 Preferences > Package Settings > Anaconda > Settings - Userで開かれる Anaconda.sublime-settings を以下のようにする。

{
    "python_interpreter": "C:/Python27/python.exe",
    "pep8_max_line_length": 99,
    "anaconda_linter_mark_style": "none",
}

1行当たりの文字数制限を99文字にしているのは私の好み。(あと最近はpep8の制限が緩和されたらしい)
3つ目の設定で、pep8警告が控えめな表示になる。(デフォルトは行全体が枠で囲まれる)

OmniMarkupPreview settings

デフォルトのmarkdown文書のブラウザプレビュー時のフォントが美しくないので、cssをいじる。
Preferences > Browse Packages... で開かれるExplorerのウィンドウで C:\...\OmniMarkupPreviewer\public\github.css を開く。
私はメイリオConsolasが好きなので、以下のように編集する。

  • 1行目付近の body のfont-family指定に Meiryo を追加する
  • 334行目付近の .markdown-body code, .markdown-body tt のstyleに font-family: Consolas を追加する
  • 349行目付近の .markdown-body .highlight pre, .markdown-body pre のstyleに font-family: Consolas を追加する

font

Ricty Diminishedを13ptで使う。

yascentur/RictyDiminished

Preferences > Settings - Userで開かれる Preferences.sublime-settings に下記を追加する。

{
    "font_face": "Ricty Diminished",
    "font_size": 13.5,
}

key bindings

Sublime TextはデフォルトではCtrl+Tabの挙動が直感と異なる。
(右のタブに移動してほしいが、「開いた順にタブを移動」する)

これを直感通りに変更したい。Preferences > Key Bindings - Userで開かれるファイルに下記を追加する。

[
    { "keys": ["ctrl+tab"], "command": "next_view" },
    { "keys": ["ctrl+shift+tab"], "command": "prev_view" },
]

参考