GitHubでクローンしてRepository not foundになった

Macbookを買ったばかりで、gitからリポジトリをクローンしようと、いつものようにgit clone URLでクローンしたら、以下のようなメッセージが出たので、usernameとpasswordを入れました。

Username for 'https://github.com': 
Password for 'https://username@github.com'

目的のURLからリポジトリをクローンできたのですが。。。

個人のgithubのリポジトリをgit clone URLでクローンしようとしたら、以下のようなエラーが出ました。

remote: Repository not found.
fatal: repository 'https://github.com/xxxxxxx/xxx_proj.git/' not found

macのkeychainで記録していたのが原因で、gitで検索したら、github.com(インターネットパスワード)というのが出てきので、これを削除したら初期に戻り、git cloneする時に以下が聞かれるようになった。

Username for 'https://github.com': 
Password for 'https://username@github.com'

githubの別々のユーザーでもターミナルで使えるようにもう少し調べたい。

MacにCocoaPods、Homebrew、carthago、renv、bundlerのインストール

環境

Mac OS 10.12.3

CocoaPodsインストール

1.インストール

MacにはデフォルトでRubyがインストールされているので、それを前提に進めていきます。以下のコマンドを実行します。

$ sudo gem update --system // ruby gemを最新にする
$ sudo gem install cocoapods // CocoaPodsのインストール
$ pod setup // CocoaPodsのセットアップ
Setting up CocoaPods master repo
Setup completed (read-only access)

2.利用

Xcodeのプロジェクトフォルダ直下に「Podsfile」という名前のファイルを置きます。

# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'

target 'myproject_ios' do
pod 'SwiftCop'
pod 'ReachabilitySwift', '~> 3'
end

Posfileと同じ階層で以下のコマンドを叩くと、指定したライブラリがインストールされます。

$ pod install

Homebrewのインストール

Homebrewはパッケージのインストール(アンインストール)作業を一元的管理するものです。インストール先は /usr/local になります。

Homebrewのサイトを見ると、以下のコマンドが記載されているので、それをコピーして実行し、インストールします。

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

次にbrew doctorを実行します。これは、Homebrewのインストールやその後の使用に問題がないか確認するためのコマンドです。

$ brew doctor

バージョンを確認します。

$ brew -v
Homebrew 1.1.10
Homebrew/homebrew-core (git revision 465a; last commit 2017-02-15)

なお、一応Homebrewのupdateを行っておきます。
時々実行してupdateしておくとよいと思います。

$ brew update

その他便利コマンド

homebrewの基本コマンドを少し載せておきます。

パッケージ検索

$ brew search

パッケージインストール・アンインストール

$ brew install  // インストール
$ brew remove  // アンインストール

パッケージの有効化・無効化

$ brew link // 有効化
$ brew unlink // 無効化

パッケージされたリストの表示

$ brew list

3. carthagoのインストール

以下のコマンドを実行し、brewを使ってインストールします。
(※久しぶりにbrewを使う場合は、$ brew updateをしておくと良いでしょう。)

$ brew install carthage

インストールされているかは以下のコマンドで確認できます。
brewでインストールされたものの一覧が表示されます。

$ brew -v list

4.renvのインストール

MacにはデフォルトでRubyがインストールされていますが、それを利用するとバージョンによる影響がでるので、複数バージョンを管理することができるrbenvを入れます。

$ brew install rbenv ruby-build

バージョンを確認します。

$ rbenv --version

インストールするrubyのバージョンを確認するために、リストで候補を表示します。

$ rbenv install -l

今回はリストの中から最新版をインストールします。

$ rbenv install 2.4.0

インストールしたRubyは以下のコマンドで確認します。

$ rbenv versions

rubyのバージョン切り替え

rubyのバージョン切り替えは、以下でglobalを使って切り替えます。
(※一部プロジェクトに適応したい場合はlocalで変更します。)

$ ruby -v
ruby 2.0.0p648 (2015-12-16 revision 53162) [universal.x86_64-darwin15]
$ rbenv global 2.1.0
$ ruby -v
ruby 2.1.0p0 (2013-12-25 revision 44422) [x86_64-darwin15.0]

5. bundlerのインストール

RubyのプラグインであるGemは普通に使うとグローバルに入ってしまいますが、それを避けて、特定ディレクトリに入れる仕組みがbundlerです。
そのbundlerをインストールします。(パーミッションのエラーがでたので、/usr/local/binにインストールしました。)

$ sudo gem install -n /usr/local/bin bundler

新しいgemを入れた場合は、rbenvでrehashしないと、パスが通っていなかったりするそうなので、実行します。

$ rbenv rehash
$ bundler -v
Bundler version 1.12.4

bundlerの設定ファイルを作成します。bundler initを実行すると、Gemfile というファイルができるので入れたいGemを記述します。以下はcocoapodsを例に記述しています。

$ bundler init

以下はGemfileの例です。

# frozen_string_literal: true
# A sample Gemfile
source "https://rubygems.org"

gem 'cocoapods' , '0.39.0'

※Gemfileの詳しい書き方は「gemfile – リファレンス – – Railsドキュメント」をご参照ください。

Gemfile に書いた内容をインストールするには、以下のコマンドを実行します。インストール先のディレクトリとしては.venderを指定します。

$ bundle install --path=.vendor

gitのリポジトリを移行する方法

今まで利用していたプロジェクトの直下に移動し、originのURLを確認します。

$ git remote -v
origin  git@github.com:nekoxxxx/test.git (fetch)
origin  git@github.com:nekoxxxx/test.git (push)

このoriginのURLを変更します。

リモートリポジトリを変更する

$ git remote set-url origin git@github.com:nekoxxxx-new/test.git

変更出来ているか確認

$ git remote -v
origin  git@github.com:nekoxxxx-new/test.git(fetch)
origin  git@github.com:nekoxxxx-new/test.git (push)

ブロック

ブロックとは

ブロックオブジェクトはObjective-CではなくC言語の機能として実装されており、iOS4.0から利用できます。

ブロックオブジェクトは実行可能なコードと、それが記述時点でのアクセス可能な変数を1つをまるごと囲い込み、後から評価できるようにパックしたものです。

ブロックは他の言語でのクロージャみたいなものですが、このクロージャーという名称も変数などの環境を囲い込むところからきています。また、クロージャーが自分の外部の変数を参照して取り込むことをキャプチャすると言います。

ブロックの要点

  1. ブロックリテラルの本体には、ブロックリテラル自体のローカル変数と仮引数のほかに、そのブロックリテラルが記述された一で参照可能な変数を含めることができます。変数には、外部変数、そのブロックリテラル内のローカル変数があります。
  2. 外部変数や静的変数(static変数)は、ブロック内からも直接アクセス、変更することができます。
  3. ブロック内のローカル変数のうち自動変数(スタック内の変数)は、ブロックリテラルが記述された時点で値が保存されていて、それが参照される仕組みになっています。
    • 従って、元の変数の値が変化しても、ブロックオブジェクトの評価には反映されてません。
    • また、変数の値は参照できますが、変更はできません。(参照可能な自動変数のコピーを持つことはできるが、参照することしかできない)
    • 自動変数が配列だった場合は、コンパイルエラーが発生します。

自動変数とは

ブロックの中で普通に宣言した変数は全て自動変数になっていて、つまり、我々が利用して来たほとんどの 変数は自動変数だった訳です。自動変数の特徴は、ブロックの最初に生成され、ブロックの終りで消滅する点です。つまり、ブロックの中でしか命がないものになります。

ARCで利用するときの危険性

以下に気をつける必要があります。

  • 循環参照
  • 処理中に解放してしまう

対策としては、selfを弱い参照としてキャプチャし、ブロックオブジェクト内で強い参照を使って保持し、処理中にselfが解放されてしまうことを防ぐ。

例)

__weak Manager *weakSelf = self;    //ブロックに渡すselfは循環参照防止のために弱い参照にする
handler.cleanUp = ^{
    Manager *strangSelf = weakSelf; //処理中に開放されないように保持
    if (strongSelf) {
        [strongSelf->logger writeLog];
    }
}

__block修飾子とは

ブロックの要点でも記載しましたが、ブロックオブジェクトは参照可能な自動変数のコピーを持つことはできるが、参照することしかできません。複数のブロックオブジェクトの間で値を共有して、その関係を関係のブロック内だけに局所化できる変数をしてする機能があります。そのような変数には__blockという修飾子を使用します。

NSNotificationとは

概要

Fundationフレームワークには、ある事象が起こったことを、関連のあるところに通知するという機能が提供されています。これを通知といいます。

仕組み

プログラム内には通知センタといようばれるオブジェクトが用意されていて、通知を受け取りたいオブジェクトは、あらかじめ、どんな通知を受け取りたいかを通知センタに登録しておきます。

どんな通知というのは事象の種類ですが、これはあらかじめいくつか用意されていますが、自分で新しい通知を決めることもできます。

通知機能の登場人物

  1. 通知センタ(postされた通知を登録されている2に通知する)
  2. 通知を受け取るオブジェクト(受け取りたい通知を1に登録しておく)
  3. 通知を投げるオブジェクト(通知をpostする)

プロトコル

プロトコルとは

よく使われるプロトコル(protocol)とは、「複数の者が対象となる事項を確実に実行するための手順等について定めたもの。」との意味です。

Objective-Cのプロトコルもそれに由来します。bjective-Cのプロトコルは、オブジェクトの振る舞いを表すメソッドの集合を定義するものです。@protocolという指示子で宣言します。

オブジェクトがこのプロトコルを採用することを、「プロトコルに適合している」といいます。

よくJavaのインターフェースと似たようなものと言われますが、Objective-Cのプロトコルは、インスタンス変数が定義できるJavaのインタフェースと違って、メソッドしか定義できません。

また、Javaのインターフェースは、定義した全てのメソッドをインターフェースを実装するクラスで実装しないといけませんが、Objective-Cのプロトコルでは、プロトコルの実装クラスで実装することを必須・非必須の指定ができます。

例)

@protocol プロトコル名

メソッドの宣言; //実装は必須 (デフォルトは@required)

@required
メソッドの宣言; //実装は必須

@optional
メソッドの宣言; //実装は任意

@end