SSH keyを作成してGithubに登録する
メモがてら残しておく。
新しくSSH keyを作成する
$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
保存パス
Enter a file in which to save the key (/Users/you/.ssh/id_rsa): [Press enter]
パスフレーズの設定(任意)
Enter passphrase (empty for no passphrase): [Type a passphrase] Enter same passphrase again: [Type passphrase again]
SSH keyをssh-agentに追加
$ eval "$(ssh-agent -s)" Agent pid 59566 $ ssh-add ~/.ssh/id_rsa
SSH keyをGithubに登録する
クリップボードにコピー
$ pbcopy < ~/.ssh/id_rsa.pub
Githubのパーソナル設定からSSH keyを登録する。まずページ右上のSettingsをクリックする。
keyフィールドにペースト
クリックすると、最後にGithubのパスワードが聞かれるので入力すると、完了。
SSH接続をテストする
$ ssh -T git@github.com
Babelを使うとアロー関数内のthisがundefinedになる
ややこしい問題に直面したので、メモしておく。
問題
次のように、jQueryでコールバック関数にアロー関数を用いたスクリプトを記述する。
$("item > title").each(() => { let title = $(this).text(); console.log(title); });
このES6の構文ををBabelでES5へトランスパイルすると...
$("item > title").each(function(idx) { var title = $(undefined).text(); console.log(title); });
アロー関数の内のthis
がundefined
になってしまう。
問題は、どうやらトランスパイル前後の、each
関数でのthis
の扱いの違いによるもののようだ。
以下、シンプルな例を考えてみる。
var arr = [1]; $(arr).each(() => { console.log(this); /* Window {} */ }); $(arr).each(function() { console.log(this); /* Number {} */ }); $(arr).each((idx, value) => { console.log(value); /* 1 */ });
アロー関数のthis
はwindowオブジェクトを指し、無名関数では要素を指す。
これをBabelに通すと、自動的に"use strict"
モードになり、スクリプトを実行した結果は次のように変わる。
/* "use strict" */ var arr = [1]; $(arr).each(() => { console.log(this); /* undefined */ }) $(arr).each(function() { console.log(this); /* 1 */ }) $(arr).each((idx, value) => { console.log(value); /* 1 */ });
"use strict"
モードが適用され、非"use strict"
モードのアロー関数ではwindowオブジェクトにbindされていたthis
が、undefined
になっている。
each
関数内でのthis
は要素を指すが、アロー関数内のthis
はそのコンテキストのthis
に等しい。つまり、this === windowオブジェクトが成り立つ。加えて、"use strict"
モードにおいては、このようなthis
はundefined
になるため、今回のような問題が発生する。
まとめ
まとめると、jQueryのコールバック関数で注意すべき点としては:
- 無名関数内では、
this
は要素を指す。 - アロー関数では、
this
はそのコンテキストのthis
に等しい。
これに加えて、Babelを用いると、"use strict"
モードが適用され、今回のように、windowオブジェクトを指していたアロー関数内のthis
はundefined
になる。
解決策
この結果を踏まえると、今回の解決策としては、
- そもそもアロー関数をやめる
- 要素の値である引数を使う
/* アロー関数をやめる */ $("item > title").each(function() { let title = $(this).text(); console.log(title); }); /* 要素の値である引数を使う */ /* 第一引数がインデックス、第二引数が要素の値 */ $("item > title").each((idx, value) => { let title = $(value).text(); console.log(title); });
多分あっているとは思うが、理解がふわふわしている。
Atomエディターからはてなブログに投稿できるようになりました。
Atomエディターからはてなブログに投稿できるようになりました
はてなブログからのお知らせ風に。
以前から開発していたAtomパッケージ、hatena-blog-entry-postを更新しました。
ダウンロード数がほぼないので継続して開発するモチベーションはありませんが、今回はなんとか自分が楽したい気持ちから更新しました。
今回追加した大きな特徴は次の2つ
- カテゴリーエディター
- 画像アップローダー
カテゴリーエディター
カテゴリーを追加できるようにしました。また、カテゴリーアイテムをクリックすることで、アイテムの最後尾をリストから削除することができます。
画像アップローダー
Hatena IDとAPI Keyを使って、はてなフォトライフへ画像をアップロード、エディターにURLを挿入します。
フォーム右上のクラウドアイコンをクリックしてダイアログを開いて、画像を選択すれば、フォトライフへアップロードできます。
次に向けて
気が向いたら下記の機能を改善・追加する。
- SelectListViewをカテゴリーエディターに使用したかったが、うまく動作しなかった。今はTextEditorViewで対応。
- ブログのエントリーリストを作って、投稿済みのエントリーも編集できるように。
- ダウンロード数が少ない。
文系大学生がプログラミングを始めて4ヶ月経って思うこと
ライブラリ作ったりエディター作ったり、インプットよりアウトプットのほうが多い一ヶ月間だった。Reactしかビューライブラリを学習していないので、実際のところReactの何が良いのか実感していない。時間があれば他のビューライブラリもやっておこう。
ライブラリ
React Twitter Timelineモジュール作りました - TOEIC940点の文系プログラマー
Node.jsマルコフ連鎖モジュール作ったよ - TOEIC940点の文系プログラマー
Electronから簡単にTwitter OAuth認証するためのライブラリ作った - TOEIC940点の文系プログラマー
Electronから簡単にGithub OAuth認証するライブラリ作った - TOEIC940点の文系プログラマー
Electron
React + Electronでエディターを作りたい - TOEIC940点の文系プログラマー
ElectronのMacOSデスクトップアプリUIキット「Phtoton」とReact - TOEIC940点の文系プログラマー
ElectronとReact-Reduxではてなブログに投稿できるマークダウンエディタ作った - TOEIC940点の文系プログラマー
Redux
Redux勝手にチュートリアル(Counter) - TOEIC940点の文系プログラマー
React Redux勝手にチュートリアル(TODO List) - TOEIC940点の文系プログラマー
tips
-bash: bower: command not found 対処法 - TOEIC940点の文系プログラマー
パーミッションについて(chmod/su/sudo/chown/chgrp) - TOEIC940点の文系プログラマー
Reduxテストファースト開発
Reduxのテストファースト開発(第一回 前準備) - TOEIC940点の文系プログラマー
Reduxのテストファースト開発(第二回 投票アプリケーションのロジック) - TOEIC940点の文系プログラマー
Reduxのテストファースト開発(第三回 Reduxの導入) - TOEIC940点の文系プログラマー
Reduxのテストファースト開発(第四回 Socket.io サーバーのセットアップ) - TOEIC940点の文系プログラマー
ElectronとReact-Reduxではてなブログに投稿できるマークダウンエディタ作った
Electron Markdown Editor powered by React-Redux
いまのところ特徴としてはこんな感じ
- はてなブログエントリーの投稿
- はてなブログエントリーリストの取得
Evernoteとの連携とか画像アップロード機能とかいろいろやりたい。あとキャッチーなネーミングがほしい。
コンポーネントが複雑であればあるほどReduxの真の力がより発揮される。楽しい
ちなみにMITライセンス
Electronから簡単にGithub OAuth認証するライブラリ作った
前に作ったelectron-oauth-twitterの応用。 このライブラリを使えば簡単にGithubのアクセストークンを取得できます。
インストール
npm install electron-oauth-github
使い方
var dialog = require('electron').dialog; var OauthGithub = require('electron-oauth-github'); var github = new OauthGithub({ id: '****', secret: '****', scopes: ['user:email', 'notifications'], }); github.startRequest(function(access_token, err) { if (err) { console.error(err); } dialog.showErrorBox('Satus', 'access_token: ' + access_token); });
これでアクセストークンが取得できます。 あとはGithub APIを見ながらアクセストークンをつけてリクエストを送るだけ。
Electronから簡単にTwitter OAuth認証するためのライブラリ作った
electron-authentication-hatenaをベースにElectronのライブラリを作成しました。
このライブラリを使えば、 Electronアプリから簡単にOAuth認証することができます。
インストール
npm install electron-oauth-twitter
使い方
アプリを登録し、 Consumer Key (API Key) と Consumer Secret (API Secret)を取得します。
アプリセッティング内のCallback URLをなんでもいいので設定しておきます。 Callback URLを設定しないとPIN Basedになります。
- 次の例のように使用すると、 アクセストークンが取得できます。
var dialog = require('electron').dialog; var OauthTwitter = require('electron-oauth-twitter'); var twitter = new OauthTwitter({ key: '****', secret: '****', }); twitter.startRequest().then(function(result) { var accessToken = result.oauth_access_token; var accessTokenSecret = result.oauth_access_token_secret; dialog.showErrorBox('Status', 'Token: ' + accessToken + '\nSecret: ' + accessTokenSecret); }).catch(function(error) { console.error(error, error.stack); });