Githubでのコントリビュートの仕方

 先日、最近お気に入りのサービスであるHyper.shのコマンドラインツールにバグを見つけたので、修正してプルリクを投げた。Githubで。これを振り返って、Githubでのコントリビュートの仕方をざっくりと書いておく。

 前準備として、Githubアカウントを持っていて、Githubのデスクトップアプリも入れておく。

・フォークする
コントリビュートしたいライブラリのGithubページをブラウザで開く。右上にForkというボタンがあるのでクリック。それでフォークが行われる。ここでのフォークとは、自分のリポジトリにそれがコピーされるということ。


 自分のGithubページにいけば、フォークされたライブラリが確認できる。


・自分のローカル環境に、ライブラリのファイル一連を落とす
 デスクトップのGithubアプリを開いてクローンする。


 クローンしたら、バグの箇所を直す。そして自分のところにコミットにして、Githubサーバと同期をとる。

・プルリクエストを投げる
 再びブラウザに戻って、プルリクエストを作る。


 なにをしたかをタイトルにつけて、詳細を本文に書く。今回は本文にはどういう環境、状況でバグが出て、それに対してどう修正を行ったかを書いた。
 テストの実行云々はCIが組まれていれば、プルリクエストを投げた時に自動で行われるのでこまごまと書く必要はない。
 

 ここまでやったらあとは向こうのリアクションを待つ。向こうにも都合があるかもしれんので、マージされるとは限らない。
 あとライブラリによってはコントリビュートにルールが設けてあったりする。コード修正の時のコーディング規約とか。そこらはルールに従って臨機応変に。
comment: 0

Python: Githubでライブラリを公開する - オープンソースを作るその1

 プログラミングである程度基礎を覚えたら、そこから上のレベルアップ方法として、実際にコードを書くためにオープンソースに関わることが推奨されていたりする。ここで有名なライブラリにコミットするのもありだが、自分で書いたものをオープンソースソフトウェアとして立ち上げてしまうのもいいだろう。有名なライブラリはコミットのルールなどがあることを考えると多少敷居が高い。自作ならルールは自分で決められる。というわけで、自作のライブラリをオープンソースとして公開して、いろんな人に使ってもらえるようにブラッシュアップしていく方法の一つを記事にしていこうと思う。

 初回はまず、Githubで公開することから。
 今は多くのオープンソースがGithubで公開されている。ほかのCIサービスなどとも連携できるので、Githubにしておけばとりあえずいいんじゃない?と思う。そういうわけでGithubで公開する方法を説明する。ちなみにぼくの開発環境がWindowsなので、説明もその環境で。あとライブラリはPythonのものとしてやっていく。もうライブラリのコードは用意してある仮定でやっていく。

 最初に、Githubのデスクトップアプリを落としてきてインストール。「Github デスクトップ」で検索すれば出てくる。あとGithubのWebサイトで会員登録を済ませて、アプリケーションにアカウントを設定しておく。



 インストールしたアプリを起動して、ウィンドウ内左上にある「+」マークをクリックしてプロジェクトのディレクトリを作成する。



 ディレクトリを作ったらそこに、あらかじめ作ってあったライブラリのコードを入れる。コードを入れたら、Githubアプリケーションのウィンドウを見てみる。


 Changesが有効になっていて、コミットができるようになっているはず。コミットメッセージを入れて、コミットボタンをポチッと。これでプロジェクトの状態(ファイル配置、ファイル内容など)がセーブされたことになる。

 公開のためにもう一つ。ライセンスを用意する。とりあえず、「このライブラリの制限を緩くしていろんなところで使ってほしい」というならMITライセンスで構わないだろう。RubyのRailsとかJavaScriptのjQueryがMITだ。
 MITのライセンス文を探してlicense.txtという名前で保存して、プロジェクトルートに置く。置いたらさっきと同じようにGithubアプリケーションを使ってコミット。
MITライセンス文

 これまでのコミットではまだライブラリが公開されていない。Githubアプリケーションのプロジェクト画面の右上にPublishボタンがあるので、これを押して公開する。



 これでライブラリがオープンソースとして公開され、いろんな人の手に渡る準備ができた。次回以降で、いろんな人に使ってもらうための仕組みを整えていく。
 
comment: 0

PythonアプリにGithubのOAuthを使う

 Web上に置いている自分の読書メモがある。これの環境移植を最近行ったのだが、せっかくなので認証をGithubのOauthを使うようにしてみた。その流れ。

 まずGithubでアプリを登録する。個人設定を開く。


 メニューからOAuthアプリを選ぶ。


 新しくアプリの認証を通す。


 必要な情報の入力。


 一覧にもどってアプリの認証情報をメモ。必要なのはClientIDとClientSecret。


 ここまでで事前準備は終了で、あとのやることはアプリ側。
 OAuthでの認証の流れは…
1.自サイトのリンクからGithub(あるいはOAuthを持っているほかのサイト)へ行ってもらう(ワンクリック)
2.Githubで、自サイトがそこの認証情報を使わせてもらうことをユーザーに許諾してもらう(ワンクリック)
3.Githubであらかじめ設定しておいたリダイレクト先URIにユーザーが認証コードを持ってリダイレクトされてくる
4.自サイトサーバが認証コードを使ってGithubにトークンを要求
5.トークンが帰ってきたらそれを使って再度自サイトサーバがGithubへ、今度はユーザーの個人認証情報を要求
6.Githubから自サイトサーバが受け取った個人認証情報で認証処理を完了させる
という流れ。
 自サーバが持つべきなのはGithubの指定の認証ページへのリンクと、そこからリダイレクトで帰ってきたときの処理をするハンドラの二つか。
 というわけでリダイレクトでGithubから帰ってきたユーザーの認証処理を行うハンドラの流れを書いておく。

 まず認証コードを使ってトークン取得。
        code = self.get_argument("code", None)

client_id = GITHUB_CLIENT
if code:
url = "https://github.com/login/oauth/access_token"
secret = GITHUB_SECRET
data = {
"code": code,
"client_id": client_id,
"client_secret": secret
}
p_data = urllib.parse.urlencode(data).encode(encoding='ascii')
with urllib.request.urlopen(url, data=p_data) as f:
res = f.read().decode("ascii")
token = res.replace("access_token=", "").replace("&scope=&token_type=bearer", "")


 レスポンスからトークンを抜粋する方法がアレなのは置いておく。次はトークンを使って個人情報をGithubからもらう。
            url = "https://api.github.com/user?access_token=" + token

with urllib.request.urlopen(url) as f:
res = f.read().decode("ascii")

info = json.loads(res)


 JSONで返ってくるので、そこからloginIDなどを参照する。OAuthのためのGithubサーバとのやり取りはこれでひと段落。あとはその情報で認証を与えられるなら処理を続行など。
 以下に認証コードを持って帰ってきたユーザーに認証を与える処理の一連を。
class OauthHandler(tornado.web.RequestHandler):

def get(self):
code = self.get_argument("code", None)
client_id = GITHUB_CLIENT
if code:
url = "https://github.com/login/oauth/access_token"
secret = GITHUB_SECRET
data = {
"code": code,
"client_id": client_id,
"client_secret": secret
}
p_data = urllib.parse.urlencode(data).encode(encoding='ascii')
with urllib.request.urlopen(url, data=p_data) as f:
res = f.read().decode("ascii")
token = res.replace("access_token=", "").replace("&scope=&token_type=bearer", "")

url = "https://api.github.com/user?access_token=" + token
with urllib.request.urlopen(url) as f:
res = f.read().decode("ascii")

info = json.loads(res)
user_id = info["login"]

db = self.settings["db"]
doc = db.user.find_one({"_id":user_id})

if doc is not None:
auth_token = self.generate_token()
dt = datetime.datetime.utcnow()
db.session.insert({"_id":auth_token, "createdAt":dt})
self.set_cookie("markofcain", auth_token, secure=True)
self.redirect("/")
else:
self.write("failed")

else:
url = "https://github.com/login/oauth/authorize?client_id=" + client_id
self.write("<a href='{0}'>Oauth auth</a>".format(url))

def generate_token(self):
""" Generate a 32-char alnum string. 190 bits of entropy. """
alnum = ''.join(c for c in map(chr, range(256)) if c.isalnum())
return ''.join(random.choice(alnum) for _ in range(32))
comment: 0

.gitignoreに加えたファイルよ、リポジトリからさようなら

 .gitignoreに加えたディレクトリがいつまでもリポジトリに残っていて邪魔だと感じたので消してみた。

 まず.gitignoreに不要なディレクトリを追記(今回は.vsというディレクトリ)。続いてgitのキャッシュから消す。今回消したいのはディレクトリとその下のファイル丸々なので、再帰で削除するオプション"-r"を付加。
git rm --cached -r .vs/

 GithubのGUIでやるとエラーでコミットが失敗したのでGitBashからコミット。
git commit -m "clean"

 あとはプッシュ。
git push

 完了したらリポジトリへ行って、消えていることを確認。
comment: 0

Azure: GithubからWeb Appsへデプロイ

 このブログはAzureで運用している。これまでコードのデプロイはVisualStudioを使って行っていたが、Githubでバージョン管理を行っているので、Githubにデプロイまでを一括して行ってもらうことにする。

 まずAzureの管理者コンソールを開いて、デプロイオプションを開く。さまざまなデプロイ方法が出てくる。

--------------

 Githubを選んでGithubへとび、認証を済ませてAzure→Githubのアクセス許可を与える。

--------------

 以上で設定は終わり。あとはGithubへデプロイすればデプロイまで自動で行われる。

--------------

 Azureコンソールではデプロイ履歴を追うこともできる。
comment: 0