GitHubのユーザ名を変更する

GitHubのユーザ名を変更する方法です。過去のコミットのユーザ名やメールアドレスも修正します。

GitHubのユーザ名を変更

Account Settings -> Change username

ローカルのgitのユーザ名を変更

git config --global user.name "新ユーザ名"
git config --global user.name "新メールアドレス" 

ローカルのgitリポジトリのリモートリポジトリを変更

  1. ローカルgitリポジトリに移動

     cd ローカルgitリポジトリ
    
  2. 過去のURLを表示

     git remote -v
    
  3. 新URLを表示

    コピペしてユーザ名のみを変更すると楽です

     git remote set-url origin https://github.com/新ユーザ名/リポジトリ名.git
    

過去のコミットの名前を変更

ここからはお勧めできませんがどうしてもという場合

  1. 過去のコミットを全て表示

     git rebase -i --root
    
  2. 修正したいコミットを選択

    修正したいコミットのpickをeditに変更します。

    修正前

     pick XXXXX
     pick XXXXX
    

    修正後

     edit XXXXX
     edit XXXXX      
    

    vimコピペ用

     %s/pick/edit/gc
    
  3. 過去のコミットを修正

    ユーザ名とメールアドレスを変更します

     git commit --amend --author="新ユーザ名 <新メアド@gmail.com>"
    

    コメントも修正できます

  4. 残りのコミットを修正

     git rebase --continue
    
  5. 繰り返す

    3と4をeditに変更した行だけ繰り返します

  6. GitHubへpush

     git push -f
    

以上

AngularJSでリストやテーブルの各行にボタンを配置する

リストの各行、テーブルの各列、ナビゲーションバーの要素などにボタンやリンクを配置して、クリックされたら各行の内容に応じて処理を行いたいケースがあると思います。このよう場合、ng-repeatng-clickを使うとシンプルです。

HTML(jade)

ul
    li(ng-repeat="element in list")
        button(ng-click="display(elemenat.name)") Click

JavaScript

$scope.display = function(name){
    console.log(name);
}

DOMのidなどは使わず素直にAngularJS流でやるのがいいようです。

herokuでnode.jsのexpress4アプリを動かすためのProcfileの書き方

Express4における雛形生成

express4の起動コマンド

Express4ではアプリの雛形をexpress-generatorで生成するようになり、標準の起動コマンドが以下に変更になりました。

npm start

heroku用のProcfile

heroku用のProcfileの書き方はいろいろありますが、以下のようにコンソールと同じにすると楽です。

web: npm start

GitHub製エディタAtomのMarkdownリアルタイムプレビューの仕様

GitHub製エディタAtomソースコードがMIT Licenseで公開されたので久しぶりに使ってみたところ、以前はできなかったMarkdwonファイルのリアルタイムプレビューができるようになっていました。

ここでは、AtomのMarkdownリアルタイムプレビュー機能の現時点での仕様やその調べ方を簡単にまとめます。

仕様の調べ方

Atomの機能はコア部分を除くとパッケージと呼ばれる取り外し可能なモジュールの集合体となっています。Vimにおけるプラグインのようなものですが、基本的な機能もパッケージとして実装されているのが特徴です。

Markdownのリアルタイムプレビュー機能markdown-previewというパッケージが担当しています。したがって、このパッケージのコードを見ると仕様がわかります。

atom/markdown-preview - GitHub

Markdownリアルタイムプレビューの使い方 [参考]

  1. AtomでMarkdownファイルを開きます。

対応している拡張子は後述します。

  1. Ctrl-MCtrl-Shift-m を実行してプレビューペインを開きます。

  2. Markdownファイルを編集します。(保存の必要なし)

  3. プレビューペインの内容がリアルタイムに更新されます。

Markdownファイルとして扱われる拡張子の一覧

対応拡張子atom/language-gfmgfm.csonに記載されています。

'fileTypes': [
  'markdown'
  'md'
  'mdown'
  'mkd'
  'mkdown'
  'ron'
]

シンタックスハイライトされる言語の一覧

atom/markdown-previewリポジトリextension-helper.coffeeに記載されています。

extensionsByFenceName =
  'bash': 'sh'
  'coffee': 'coffee'
  'coffeescript': 'coffee'
  'coffee-script': 'coffee'
  'css': 'css'
  'go': 'go'
  'html': 'html'
  'java': 'java'
  'javascript': 'js'
  'js': 'js'
  'json': 'json'
  'less': 'less'
  'mustache': 'mustache'
  'objc': 'm'
  'objective-c': 'm'
  'php': 'php'
  'python': 'py'
  'rb': 'rb'
  'ruby': 'rb'
  'sh': 'sh'
  'toml': 'toml'
  'xml': 'xml'
  'yaml': 'yaml'
  'yml': 'yaml'

レンダリング処理の流れ

現在は以下のように流れなっています。

  1. 編集を行うとAtom本体からcontents-modifiedcontents-changedイベントがemitされる
  2. markdown-previewパッケージのmarkdown-preview-view.coffeechangeHandlerがイベント処理を開始
  3. markdown-previewパッケージのrendere.coffeeが以下のgjtorikian/roasterが生成したhtmlをサニタイズするなどして最終的な出力を生成

Redcarpetなど他のレンダラと出力が違って気になる場合などは、上記の該当ライブラリを見ると原因がわかるでしょう。

Xcodeで1つのプロジェクトから無料版と有料版のiOSアプリをビルドする

iOSアプリの無料版と有料版を提供するとき等に、Xcodeの1つのプロジェクトから無料版と有料版の2つのアプリをビルドしたいケースがあります。

Xcodeで2つのプロジェクトに分けてしまうと、バグ修正や新機能追加のたびに両プロジェクトをコーディングする必要があって大変なので、広告や有無や制限値の差異程度であれば1つのプロジェクトから2つのアプリをビルドすると楽です。

ここでは1つのプロジェクトの同一ソースから2つのアプリをビルドする方法を説明します。

Xcode上での作業

ここでは、有料版が既にあって、新たに無料版を追加する場合を例にして説明します。

  1. 有料版のTargetを複製して無料版を作る

    1. Projectツリーを開く
    2. Targets > 有料版アプリを右クリックする
    3. Duplicateをクリックして複製する
    4. 無料版のTarget名が「Target名 copy」となっているので無料版の名前に修正する
    5. 無料版のTarget > General > Identity > Bundle Identifierを無料版のものに修正する
  2. 無料版のプロダクト名を設定する

    1. 無料版のTarget > Build Settings > Packaging > Product Name
    2. Product Nameが「Target名 copy」となっているので無料版の名前に修正する

    f:id:slowquery:20140506201727p:plain

  3. 無料版のビルド時のマクロを設定する

    1. 無料版のTarget > Build Settings -> Apple LLVM 5.X - Preprocessing
    2. Preprocessor MacrosのDebugRelease両方に無料版のビルドフラグを追加する

       FREE_VERSION=1
      

    f:id:slowquery:20140506201738p:plain

  4. コードに#ifdef無料版と有料版の処理を分岐させる

     #ifdef FREE_VERSION
         無料版の処理
     #elif
         有料版の処理
     #endif
    

    ※注意 無料版/有料版のコードを分岐させるには以下のようなパターンがあります。

    1. シングルトンオブジェクトを作って、一度#ifdef内で有料/無料フラグを設定して、それ以降はif文で分岐する
    2. #ifdefで関数内で処理を分岐する
    3. #ifdefで無料版の関数と有料版の関数をわける

    無料版にしか存在しない広告系の関数などは3の方法で消すのがよいです。一方で、関数中のしきい値が異なる程度なら1や2の方法で分岐するのがよいかもしれません。

    #ifdefマクロは強力で便利ですが、Xcodeのシンタックスハイライトを崩すケースや無料/有料両方のコード修正が必要になるケースやリファクタリング機能がうまく使えなくなるケースなど様々なデメリットもあるため、メンテナンスコストを考えて使うと良いと思います。