Go言語のデバッガをMacのIntelliJ IDEA CEで使う

  • IntelliJ IDEAのGo言語プラグインをインストールするとdelveというデバッガもインストールされます
  • デバッガのように他のプログラムにアクセスするプログラムは安全なものではないため,delveを実行する際にパスワードの入力を求められます
  • 証明書を作ってデバッガに登録しておくことでパスワードの入力を省略することができます
  • ただし,IntelliJ IDEAのGo言語プラグインを普通にインストールするだけでは証明書が登録されていません
  • brew install go-delve/delve/delve でdelveをインストールすると証明書の作成から登録まで自動でやってくれる(ただしインストール時にパスワードの入力を求められる)ので,IntelliJ IDEAのGo言語プラグイン用のdelveをbrewでインストールしたdelveに置き換えると簡単です
  • Go言語プラグイン用のdelveの配置場所は ~/Library/Application\ Support/IdeaIC2016.3/Go/lib/dlv/mac です
  • デバッガを起動する際は Run → Debug... の次に "Build main.go and run" を選ぶ必要があります。"go run main.go" を選んでしまうとデバッガが起動しません
  • brew info delve で確認できますが,brew経由でインストールしたdelveをアンインストールするときには dlv-cert という証明書を削除しておきましょう

参考

ascii.jp

qiita.com

www.indetail.co.jp

みんなのGo言語[現場で使える実践テクニック]

みんなのGo言語[現場で使える実践テクニック]

パワーポイントの発表者ツールを無効にする (PowerPoint 2016 for Mac)

問題

プロジェクターなどのセカンドディスプレイを接続していると,以下のどれを選んでも発表者ツールが有効になってしまう。

f:id:kujira16:20170112105202p:plain

解決方法

環境設定 → スライドショー → 「〜発表者ツールを常に起動する」のチェックを外す。

f:id:kujira16:20170112105327p:plain

f:id:kujira16:20170112105330p:plain

感想

どこかで設定が変更できるはずだとは思っていたけど,まさか環境設定から変更ができるとは思っていなくて解決までに時間がかかった

Preztoのforkを探してみる

github.com

Preztoはzshの設定ファイルの詰め合わせで,よく書かれた便利な設定をプラグイン機構によって手軽に導入することが出来ます。

私は数ヶ月前にzshの設定ファイルを作り直したときにPreztoを導入しました。とても便利です。

kujira16.hateblo.jp

残念なことに,ここ10ヶ月ほどmasterブランチの更新が無く,先行きが不透明なのでforkを探してみました。

ただ,Preztoはforkが非常に多く,Web上ではforkの一覧を見ることは出来ません(forkして自分の設定ファイルをアップロードしている人が多いためだと思われます)。

f:id:kujira16:20161230005957p:plain

そこで,GitHubAPIを利用して⭐の多いリポジトリを探してみました。

GitHubAPIを使う。

forkの一覧を取得するAPIの説明は以下のページに載っています。

https://developer.github.com/v3/repos/forks/

curl https://api.github.com/repos/sorin-ionescu/prezto/forks のようにすればデータを取得できそうです。

ただ curl -I としてレスポンスヘッダを見てみると Link が付いていることからも分かるように,GitHubAPIにはページネーションが設定されています。すべてのデータを取得するためにはリクエストパラメータを変えて何度かデータを取得する必要があります。

さらに X-RateLimit-Limit というヘッダが付いていることからも分かるように,GitHubAPIは認証なしで利用できる回数に制限があります。先ほどの Link ヘッダによると105回ほどAPIを利用する必要があるのですが,X-RateLimit-Limit ヘッダによれば認証なしでは60回しかAPIを利用できないようです。この制限については以下のページで説明があります。

https://developer.github.com/v3/#rate-limiting

認証の方法については上記のページの Authentication の節で説明があります。アクセストークンを取得してリクエストヘッダかリクエストパラメータに付与すれば良いことがわかります。必要なアクセストークンは以下のページで取得できます。

https://github.com/settings/tokens

クローラを作る

forkしたリポジトリを全件取得するために以下のようなクローラを作りました(実際にはJupyter Notebook上で実行しました)。

HTTPリクエストの処理にはrequestsを使いました。認証のためのOAuthトークンを付けるために requests.getheaders オプション,Link ヘッダをたどるために resp.links,レスポンスの内容をJSONとして取り出すために resp.json() を使っています。

ダウンロードしたデータの保存にはLevelDBを使いました。LevelDBはサーバーを用意することなく使えるKVSで,高度なことをしなければ Get, Put, Delete, RangeIter だけ覚えておけばそれなりに使えます。ただ byte以外のオブジェクトはkeyにもvalueにも受け付けてくれないので,strならencodeしたり,それ以外のオブジェクトならpickleでダンプしておく必要があります。

import leveldb
import requests
import pickle

def download(db, url, headers):
    try:
        resp_byte = db.Get(url.encode('UTF-8'))
        # LevelDBに保存されていたときはそれを利用
        return pickle.loads(resp_byte)
    except KeyError:
        # LevelDBに保存されていなかったときはダウンロードして保存
        resp = requests.get(url, headers=headers)
        db.Put(url.encode('UTF-8'), pickle.dumps(resp))
        return resp

db = leveldb.LevelDB('forks.leveldb')
# 以下のURLから取得したトークン
# https://github.com/settings/tokens
token = 'XXXXXXXXXX'
# https://developer.github.com/v3/#authentication
headers = {'Authorization': 'token ' + token}
# https://developer.github.com/v3/repos/forks/
url = 'https://api.github.com/repos/sorin-ionescu/prezto/forks'
resp = download(db, url, headers)
while 'next' in resp.links:
    url = resp.links['next']['url']
    resp = download(db, url, headers)

for key, value in db.RangeIter():
    resp = pickle.loads(value)
    for repos in resp.json():
        star = repos['stargazers_count']
        if star >= 5:
            print(star, repos['full_name'])

リクエストとリクエストの間には特に時間間隔を空けていないのですが,前述の通りリクエスト回数に制限が設けてあるので,それさえ守っておけばいいのかなと思っています。

結果

forkの中で5件以上スターがついているリポジトリは今日の時点で以下のものだけです。

full_name
31 zsh-users/prezto
61 paradox460/prezto
9 hackreactor-labs/prezto
6 loranger/prezto

最近のコミットがあるのは zsh-users のものだけでした。

結論

それなりに活発なforkは以下のリポジトリです。

github.com

本家の状況によってはこちらに乗り換えることも検討します。