GitHubのMarkdownの目次を自動でつくるChrome Extensionを作った
GitHubのMarkdownに目次が欲しかった
Markdownが便利なのでよく使ってます。メモはKobitoで取り、はてなブログもMarkdownで書いています。GitHubではMarkdown以外にもOrgとかRestructured Textとか使えますが、一番使われてるのはMarkdownなのではないでしょうか。
ところがGitHubではMarkdownドキュメントの目次がデフォルトでは表示されてないため、長いドキュメントの場合読むのが不便でした。ユーザースクリプトでもよかったんですが、一度Chrome Extensionを作ってみたかったので作って公開しました。
3/27(金)に作り始めて3/29(日)に公開しました。
感想
TypeScript
先日作ったオープンなプルリクエストを表示するExpress.jsアプリにつづいてTypeScriptを使いました。といってもTSファイル2つしかないので、どちらかというとChromeとJQueryの型定義ファイルを使えて楽だったというのが大きいです。特に理由がない限りしばらくはAltJSとしてはTypeScriptを使おうと思います。
あともう慣れてしまったけど、tsdpmがずっと落ちているのが辛い。
Chrome Extensionのドキュメント
ぐぐるといろんな記事が出てきますが、古くなっているものが稀によくあるので注意したほうが良いと思います。今回だと無視URLリストを機能拡張のオプションページで指定できるんですが、これの保存にLocalStorage使えばOKみたいな記事が最初見つかったけど、もっと使いやすいstorage機能が標準であったのでそっちに途中から切り替えました(保存できる値がLocalStorageだと文字列だけだけどChrome storageは配列が使える)。
公式ドキュメントは便利だけど、APIドキュメントがDash対応してくれればもっと見やすいんだけどなあ。
小さいプロジェクトでgulp使わなくてよいのでは
今回はgulpを使ってTypeScriptのコンパイル、SourceMap追加、uglify、JadeからHTMLへの変換を行いました。まあ便利なんですが、それを実現するためにgulpを使い、利用するライブラリの使い方を調べるのは少々コスパが悪いかと感じました(今回のプロジェクトでは9つのライブラリを使ってます)。3日で作成から公開まで作れる程度のプロジェクトだったから特に感じたのかもしれません。それらパッケージがさらに別のパッケージに依存しているため、バージョンアップが止まった時の影響が大きいのも気になります。
Grunt/Gulpで憔悴したおっさんの話という記事が最近はてブで人気でしたが同じ気分で、次にJSプロジェクト作るときにはnpm run-script
を試してみます。express.jsとChrome Extensionのプロジェクト作るときはすでにgulpfile作ったのでgulp使うけど。
その他・BowerとかPrimerとか
Chrome ExtensionのContent ScriptモードからはCDNのJQuery使えなかったのでプロジェクト内にJQueryを取り込む必要があります。GitHubにJQueryを持ち込むのも嫌だったので、Bower使ってJQueryとPrimer(オプションページのCSS用)をプロジェクトに取り込んでみました。
Bowerはどう使うとnpmやgulpと連携しやすいのかよくわからなかったので、デフォルトの設定のままにライブラリをインストールし、gulpで必要なファイルだけコピーすることにしました。bower init
でbower.json
が作成できますが、package.json
の情報を見てくれてない?ぽくてよくわからなかった。
Chromeの拡張機能のオプションページ(chrome://extensions/から移動できる)は拡張ごとにわりとフリーダムなようだったので今回は最近GitHubが公開したPrimerを使ってみました。といってもフォームをいくつか使っただけで大した使い方したわけじゃないんですが。
DashでJava SE 8 日本語ドキュメントに対応させてみた
Java SE 日本語ドキュメントの置き場所を読んでいて気付いたのですが、いつの間にかJava SE 8の日本語ドキュメントが公開されていたのですね(リンクはAPIドキュメント)。現時点ではまだすべてのクラスが日本語化されてるわけではないようですが、よく調べるところを日本語で読めるのはありがたいものです。
ということでMacユーザーならきっとみんな使ってるAPIビューアDashでJava SE 8のドキュメントを見る方法の紹介です。なおJava APIドキュメントのライセンスで、インターネットでの再配布は許可されていないため、Docsetの再配布をする予定はありません。予めご了承ください(ライセンスにcan be redistributed internally
とあるので、作ったものを個人的にお渡しすることならできるようです)。
※この記事はJava SE 7編の続編です
必要なもの
- Xcode (docset変換アプリのビルド用)
手順
- 改造版javadocsetを取得、ビルド
- zip書庫になってるドキュメントをダウンロード
- docsetを作成
- Dashに取り込む
1. 改造版javadocsetを取得、ビルド
DashでAPIドキュメントを利用するには、専用のdocsetという形式に変換する必要があります。 Dash作者のGitHubのリポジトリにjavadocsetというJavadocをdocsetに変換するアプリがあるのですが、このアプリでは日本語のAPIドキュメントには対応してないため、改造したものを使います。
a. 日本語版対応javadocsetをダウンロード
私が作ったjavadocsetの改造版があるのでそれをcheckoutしてください.
git clone https://github.com/mtgto/javadocset.git
終わったらjavadocset/javadocset.xcodeprj
をXcodeで開きます.
b. ビルドする
MacアプリのビルドするだけならAppleのMac Developer Programへの登録は不要です.
XcodeのProduct
メニューからArchive
を選択します.
ビルドに成功するとOrganizer
が開くので、Export...
ボタンを押します.
Save Built Products
を選択し、適当なフォルダに保存します.
保存したフォルダのusr/local/bin/javadocset
というファイルをパスの通るところにコピーします.
2. zip書庫になってるドキュメントをダウンロードする
次に日本語版ドキュメントをダウンロードします.
http://www.oracle.com/technetwork/jp/java/java-sun-1440465-ja.html
執筆時点ではこのURLですが、将来変わっているかもしれません。そのときには冒頭の「Java SE 日本語ドキュメントの置き場所」を参考に探してください.
今回はJava SE 8用のドキュメントがほしいので8.zipをダウンロードします.
展開するとE54527_01
というフォルダが生成されます.
3. docsetを生成する
1.
で作ったjavadocset
を使ってDashが読めるdocset形式へ変換します.
コンソールで2.
で書庫を展開したフォルダに移動してから、
$ javadocset 'Java SE 8' api
のように実行すると、3分ほどで完了し、Java SE 8.docset
というフォルダが作成されます. Java SE 8.docset
のファイルサイズは281.9MBとなりました.
4. Dashに取り込む
あとは適当なフォルダにJava SE 8.docset
をコピーしてダブルクリックすればDashに取り込まれます.
以上で終わりです!ここまで読んでいただきありがとうございました.
znc (IRC proxy server) のSSLオレオレ証明書をMacにインストールする
大したことじゃないんだけど、解決するのに2時間くらいかかったからメモ。
背景
znc wikiの署名済みサーバ証明書のページにはちゃんとした証明書貰った場合の設定の仕方が書いてあって、そりゃそっちの方が正しいってのはわかるんだけど実験用サーバとかでHostsに適当な名前をつけて使いたいことがあった。 そのサーバにznc建ててSSL使おうと思ったんだけど、IRC Client(俺はTextual使ってる)とかweb adminがサーバ証明書おかしいぜ、っていちいち文句言うのなんとかしたかった。
TL;DR
自己署名証明書でもいいからSSLでznc使いたいならznc --makepem
で作成したpemに含まれる証明書をキーチェーンアクセスに追加すればよい。
試したこととかハマったこととか
- opensslで生成したcrtとかkeyをzncサーバにコピーして使う
- キーチェーンで生成したcrtとかpemをzncサーバにコピーして使う
→zncがpem読めないのか、TCPつないでもすぐ切れる
- chefのレシピ作成中のvagrantで
znc --makepem
で作成したpemを使ってたらCNがvagrant-centos65.vagrantup.com
とかになってた
→正しいホスト名にしてからpemつくろう
最終的にやったこと
- zncサーバに入って
znc --makepem
で秘密鍵兼証明書を作成 BEGIN CERTIFICATE
からEND CERTIFICATE
までの行をhogehoge.cert
に保存hogehoge.cert
をキーチェーンアクセスで開きホスト名が正しいことを確認して追加する
以上です。
夏コミで出す本のご紹介「ななかInside PRESS vol.5」3日目 8/17 (Sun) き36b
夏が暑くて本も厚い
前回の投稿が1月だったのにいつの間にやら夏本番!台風も来てましたが本番の天気はどうなることでしょうか。そこ、どっちみち中は暑いだろ、とか言わないように。
さて、なんだかんだで我々第七開発セクションのコミケ参加も五回目となります。まあ今回は初回以来の落選とあいなりまして、これで今回はゆっくりできる・・・と思ったのですが、@richmikanのまつらリッチ研究所さんのところで置かせていただけることにあいなりまして、めでたしめでたし。 今回も冬コミの紹介同様に各記事の紹介をしちゃいますので、参加する人もしない人も気になったら読んでみるといいよ。
各記事のご紹介
「Immutable Infrastructureの最適解を探る」 by いつもの戦犯 @tboffice
Immutable Infrastructure(略すとII)ってのは直訳すると不変なインフラ、つまり設定をあとでいじったりしない、というような意味です。当記事では前回冬コミで特集したChefを始めとしてAnsible、Serverspec、Docker、Cobbler、Serfといったツールの紹介と導入方法について触れています。 私個人はプログラマーとして作ったコードをインフラに載せるのが仕事なわけで、デプロイのスクリプト化(CapistranoとFabric)はやったことがありますが、それより下のレイヤー(ミドルウェアやOS)までコード化しないと大規模インフラを扱えないクなってきているわけでして。いやはやインフラの世界も流行の入れ替わり激しいものですね。
「恐怖 シェルショッカーの掟 ~Web アプリ早く作れぬ言語は rm -rf の巻~」 by 謎の救世主 @richmikan
個人的に一番面白かった記事。シェルスクリプトでWebのショッピングサイトを作る記事です。とか書いてもワケガワカラナイヨッて感じですが、要はショッピングサイトのCGI部分を*NIX標準コマンド+独自の便利シェルスクリプトの組み合わせることによって実現できることの説明をしています。コードはGitHubで公開&実際に稼働しているサーバーもあるので机上の空論ではありませんので念のため。
「解説 Socket.IO 1.0」 by @sisidovski
WebSocketが注目されていた時代に、プロトコル未対応のブラウザでも同じようなAPIで利用することができたnode.js用の双方向通信ライブラリSocket.IOは今年2014年の5月にリリースされました。1.0においてマルチプロセス環境でのスケーラビリティの向上やNode.js以外のプログラムからサーバへのイベント通知ができるようになったことをご存知でしょうか。 はい、私は全然知りませんでした。この記事ではそんな方にもう一度Socket.ioの重ねてきた進化を知るいい機会になるのではないでしょうか。
「バランス wii ボードで健康管理」 by @tkzwtks
プログラマーのダイエットは一味違います。Wii Fit UのバランスボードをBlueToothでPCに接続、通信内容をパースして最後はfitbit.comに送信するところまで作っちゃいます。 それ以外にも自転車の走行距離を自動計測したり食事の内容はEvernoteに保存したり、とどこまでもプログラマーらしさが光る内容となっています。実際にダイエットの効果があったのかはこの記事で確認してみてください。
「今すぐ試そう HTTP/2」 by @syu_cream
ここ1, 2年、GoogleのSPDYプロトコルをベースとした次期HTTPバージョンの仕様の策定、標準化が進んでいるHTTP/2。皆様も耳にしたり気が早い人は既にブラウザのオプションでHTTP/2を有効にしてTwitterやFacebookなどを使っているのではないでしょうか。 この記事では現行のv1.1の問題点の解説、2.0がそれをどう解決するのかの説明、そしてHTTP/2対応のサーバーやクライアントの使い方の紹介を行っています。ちなみにこの記事の執筆後にdraft14が公開されて、慌てて加筆してもらったのはここだけのはなし。
「風水プログラミング」 by @irimo_hot
中国4000年の歴史が産みだした気の流れを元にしたプログラミング環境の構築の紹介を行っています。そう、コンソールの入力待ちのときに$マークが表示されているのは風水によって金運をアップさせるためなんだよ、な、なんだってー?みたいな知識を得ることができます。 関係無いですが銀座にある弊社では机の上にいろんな私物をおいている人が多いですが、あれもひょっとしたら風水に基づくものだったりするんでしょうか。
「AWS をコード化する」 by @rosylilly
AWSの設定を試行錯誤した結果、再現できない状態になってしまって困ったことはないですか?かといってChefのクックブックは学習コスト高いし・・・みたいな。 当記事ではRoute 53(AWSのDNSサービス)を題材に、RubyによってDNSレコードの設定を例を交えながら解説します。例えば「Route 53がサービスのヘルスチェックを行い、サービスダウンと判定したらレコードを自動的に変更する」設定をRubyで書くことができることを説明しています。 DNSの設定って最初にやって後は放置、みたいなものだと思っていたのですが、Route53なら動的に切り替えられることを知っていれば「他のスクリプトと組み合わせればもっと面白いことができるのでは?」など新しい発想が出てくるきっかけにもなるかもしれませんね。
「できね!家庭用 3D プリンタ」 by おめが
「Up!Plus2」「SCOOVO C170」「Da Vinci」という3つの家庭用3Dプリンタ(といってもそれなりのお値段します)を半年間使ってみて分かった比較と必要な調節について解説しています。 魔術師でなくても空想具現化ができるのはありがたい時代になったものです。あとは空想の3Dモデリング化の技術の進歩の方をお願いしたいです。。。
というわけで
日曜日の三日目、き36b「松浦リッチ研究所」でお待ちしております。 B5で160ページってもうわけわからんな!おねだんは1,200円だそうです。既刊(前回+前々回)もあるだけ持っていきます。 ちなみに表紙の地球(?)はコードによって生み出される世界(=サーバー)を意味してるんだそうです。言われなきゃわからなかったけど可愛いから許しました。
そういえば私が今回の本のために書いた記事は諸事情でお蔵入りにしたので近いうちにこのブログで公開できればなあと思っています。
新年の挨拶と1年半ぶりにiOSアプリをバージョンアップした話
あけましておめでとうございます。コミケを見にきていただいた方はお疲れ様でした。
突然だがニコニコ実況っていうサービスが好きだ。日曜洋画劇場をニコニコ実況片手にみんなで見てる気分になるのが好きだった(最近は全く見なくなってしまった。理由は察してくれ)。ニコニコ実況っていうのは要はテレビ版のニコニコだ。俺の部屋のテレビとPCはそっぽ向くように置かれてるのでテレビ見てる時にパソコンを見るのが面倒だった。なのでiPhone版アプリを作った。
12月後半、あるきっかけで休日の3連休にがっつり改修を行い、iTunes Connectのホリデーが終わってすぐアプリ申請、大晦日にリリースされた。iPadで文字が小さくなってしまう問題があったりもしたが(修正版を申請したのでもう少しお待ちください)、概ねレビューを見ると好評のようでアップデート作業をやってよかったなと思っている。
最後に更新してから1年半以上経ったアップデートになったわけだが、最初はリファクタリングのつもりだったんだがこれから書く変更点のせいで結局ほとんど1から書き直すことになった。この文章を書く前は「こうしたほうがいい」とかいう話にしようかなとおもったんだけど正月だしお酒飲んでてめんどくさくなってきたのでただの列挙になってしまった。ここまで読んでる人がいたら申し訳ない。
覚えてる大きな変更点
ARC
それまでのアプリは非ARCコードで書かれていたので、ARC対応にした(アップデート前はiOS 4.3対応だったため)。retain
, release
, autorelease
, dealloc
書かなくてよくなったのはほんとうに有難い。やはり面倒なことは一つでも少ない方がいい。行も短くなるし。
CocoaPods
以前は対応しているライブラリも少なく使ってなかったのだが、最近はかなり揃っているので使うことにした。使っているライブラリは次の通り。
- AFNetworking
- CocoaLumberjack
- AFKissXMLRequestOperation
- SSKeychain
空っぽなプロジェクトにAFNetworkingを追加すると、出来上がるバイナリサイズが370KBほど増えたので結構怖いなと感じた。何でもかんでも追加するとファイルサイズがどんどんでかくなっていくので使用するライブラリは必要最小限にするようにしたほうがいい。
今はMac / iOSのアプリを一つのxcworkspaceで作ってるんだが、そういったPodfileの定義する方法の情報が見つからなくて辛かった。ごちゃごちゃいじってたらできたんだが、ここでは書かない。興味ある人はそのアプリをOSSで公開する予定なのでそれを待ってほしい。
Storyboard
チーム開発ではコンフリクト解消が困難になるので使わないほうがいいだろうが、個人開発では使ったほうがいいと思う。ビュー間の移動をSegueでコード無しで追加できるのは楽だ。ただiPadのビューが6つあるとThunderbolt Displayを使っていてもStoryboardの編集は狭くて使いづらいのである程度ビューが少ないアプリじゃないときついかもしれない。
あと慣れてないのも悪いんだが、Auto layoutにかなり苦しめられた。親画面からの相対位置で右寄せ、下寄せさせたいだけなのに何度もXcodeに怒られながら修正をする必要があった。たまに警告なしの状態にしてもビルド時に失敗したことがあったので、なんかバグが残ってる気がする。前のバネで指定する方式は楽だったなあ。
Localize
前はUIのローカライズをするときにはxibをロケールの数作って編集していた気がするんだが、今はxib/storyboardとstringsファイルに分けて後者だけを編集すればいいようになっている。便利だなと思う一方で、自動生成されるstringsをみてもどの位置の文字列かパッとわからないこともあって辛かった。今後xib/storyboardいじったときにstringsのアップデートで苦しめられそうな未来が予想できる。
あと前もあったんだが、Localizable.stringsを追加してもシミュレータでは追加が反映されるのに実機では反映されないことが起きた。Option押しながらクリーンをやったら反映されるようになったんだが、原因がはっきりせずにもやもやしたままだったりする。
iOS 7の全画面ビュー
iOS 7からステータスバーの裏もビューとして使われるようになった。そのためコメントが流れる領域とステータスバーが被ってしまい、ステータスバーがとても読みにくくなった。ぐぐると一枚ビューを置いてTop Layout Guideを使ってステータスバー分だけずらすように設定しておけばStoryboardだけでもステータスバーには被らないように出来た。
delegateからBlocksへ
今回のアプリだと例えば「HTTP API叩いて通信結果が成功したらビューを更新して失敗したらエラーダイアログだす」みたいな処理が多い。今までまずは成功、失敗呼び出しを定義したプロトコルを作り、delegateを登録し、ってことをやってたんだがこれをBlocks型に書き換えた。 Blocksにしたことで「成功と失敗処理が同一メソッド内にあるので見やすい」「プロトコルを定義する必要がない・名前を考える必要がない」という楽さを感じた。ちょっと変わったことをやろうとすると苦労することもあるが(例えばBlocksで再帰呼び出しをメモリリークしないように書く、とか)、ちょっとした通信処理とか書くときにはスッキリ書けるっていうだけでBlocksに変えてよかったなと思う。
終わりに
1年半ぶりのアップデートをやることでiOSの世界では1年半ってとても長いんだなというのを強く感じた。例えばNSArray, NSDictionaryなどのシンプルな糖衣構文や、上では書いてないがModulesも使うようになった。OSのメジャーバージョンも上がるのが早いし、開発者が追いついていくのもなかなか大変なものだ。それでも、いやだからこそiOSは新しいものが好きな開発者にとって楽しいプラットフォームなのかなと思ったのだった。
冬コミ 3日目 12/31 (Tue)に「ななかINSIDE PRESS vol.4」を出します(西し-35a)
冬だ!スノボだ!コミックマーケットだ!
夏コミの追い込みもいつのやら。早いもので冬コミの入稿が終わりました。今回で4回目のコミケ出展でございます。今年はもしかしたら会場には行けないかもしれないのですががが。
今回も記事8本、108ページとよくわからない分厚さになっております。メインテーマは「Chef!」ということで表紙もChefをイメージした女の子になっております(表紙は@ok__rayさんに描いてもらいました)。Chefでサーバを構築してみたはいいものの途中からめんどくさくなって手作業で設定してる人いませんか、後ろから包丁でXXXされちゃいますよ!(そんな設定はない)
内容も以前のようにプログラミング話ばかりではなく、幅広く取り上げております。詳細は第7開発セクションのサイトをどうぞ!
さて、今年の夏コミの紹介を書いた時のように今回も各記事の簡単な紹介をしますので、なんとなく読んだ気になってください。
各記事の紹介
(特集記事) わがままChefのおいしいrecipeの作り方 @gujauja & @suzuki_kenta
- 業務で実際にChefを使っている2人によるChefの入門記事です。数時間Chefを触っただけの私が理解に難しいなと思ったところには(強引に)解説を入れてもらっているのでつまづきにくい入門記事になっていればと思います。後半ではChef Solo + Knife Soloでユーザ作成、インストール、(パッケージとコマンドによるものの2種類)、ファイル作成、ロギングを行います。
DMM 3Dプリントで連装砲ちゃんを作る @Omegamega
- DMM 3Dプリントで自分でモデリングした連装砲ちゃん(ぜかましのそばにいるやつ)を作ってみたレポート。素材は石膏、ナイロン、アクリルの3つがあるんですね。失敗できない(いっこつくるのに3,000円とかかかる)のは怖いけど、専用の工具と膨大な時間を使わないと作れなかった3Dモデルの実体化ができるなんていい時代になったものです(※特許切れという意味で)。@Omegamegaのブログに写真や動画があるのでそちらもどうぞ。
MMDAI2/VPVM on Qt 開発戦記 @shimacpyon
525円とNexus7で"Oculus Rifts7" @binzume
- Oculus Riftというのはヘッドマウントディスプレイの一つなんですが、ジャイロが入ってるので首を傾ければ向いた方の映像が見えるってやつで、3DCGと組み合わせるとその世界にいるような感覚を体感できます(どれくらいやばいかはhttp://www.youtube.com/watch?v=GoQ0OXJCbaEこの動画を見ていただければわかるかと)。この記事ではジャイロ搭載のNexus 7を使うことでコードレスでHD画質のOculus Rift(みたいなもの)を作ってみたそうです。私も実際に見てみたんですが視界が追随してくるのはまじでヤバイです。
Blink(1)でウキウキウォッチング @tboffice
- Kickstarterから生まれた様々な色にひかるUSBデバイス「blink(1)」を何を間違えたのか10個も買ってしまったために何が何でも役立ててやろうとした人の記事です。1bitでは表現できないものということで、トイレの個室ごとの空き状態を表示したりしています。Blink(1)がそこまで強い光量を持ってるわけではないので、新着イベントよりも状態表示のほうが向いてそうです。
今から始めるMySQL Cluster入門 @kukishuzo
大炎上!在席監視 iBeacon @saiten
某リンゴの倒し方?俺知ってるよ! @inokinn
- この記事は自分の目で確認しよう!
ということで、12月31日、西し-35aでお待ちしております
一冊800円です。既刊ももっていきますよー。
歌舞伎座.tech#1で「sbtのマルチモジュールのビルドおそくね?」というLTをしてきました
一行でまとめ:マルチモジュール形式のsbtプロジェクトの場合にSNAPSHOTバージョンのライブラリを使っていると毎回ライブラリの解決してて遅くなるからHTTP Proxyとか使ってキャッシュしましょう。
id:yuto_sasaki に発表資料を見てもらったあとで、SNAPSHOTバージョンが悪いんじゃね?という助言を頂きました。ありがとうございます。
開場中にid:xuwei から補足を頂いてました。ありがとうございます:
#kbkz_tech SNAPSHOTになってると毎回見に行くのは、そういう仕様。 offlineというKey https://t.co/w1FIHkuSzR とかあるけど。あとそもそも毎回cleanとかしない限り、そっちの遅さより、コンパイル時間のほうが問題な気がするけど
— Kenji Yoshida (@xuwei_k) 2013, 9月 25
コンパイル時間を早くしたいのはもちろんなのですが、それにはハイスペックマシンを用意するくらいしか(ry