Rubyの配列で「参照」の疑問

配列について

以下の本などで調べると、

「配列」とは、いくつかのオブジェクトへの参照を順に並べたもの
という定義になっているとのこと。


参照のチェック

参照先が変わった場合に、配列の要素が変わるかどうかチェックするため、以下のようなコードで確認をしたところ、

1
2
3
4
5
6
text = "test1"
array1 = ["test" ,text]
array1         # => ["test", "test1"]
text = "test2"
# array1の内容が変わらない!(["test", "test2"]にならない!)
array1         # => ["test", "test1"]

変わっていませんでした。


ちなみに、以下のように書くと変わります。

1
2
3
4
5
6
text1 = "test1"
array1 = ["test" ,text1]
array1         # => ["test", "test1"]
text1[-1] = "2"
# array1の内容が変わる!
array1         # => ["test", "test2"]

こっちではイメージ通りです。


object_idでチェック

この違いがイマイチよくわからなくて、object_idで調べてみると、

1
2
3
4
5
6
7
8
9
text = "test1"
text.object_id                  # => 70252806544400
array1 = ["test" ,text]
array1         # => ["test", "test1"]
text = "test2"
# object_idが変わっている!
text.object_id                  # => 70252806543340
# array1の内容が変わらない!(["test", "test2"]にならない!)
array1         # => ["test", "test1"]

ちなみに、当然なのですが、添字参照して変更した場合は、

1
2
3
4
5
6
7
8
9
text1 = "test1"
array1 = ["test" ,text1]
text.object_id                  # => 70329724769400
array1         # => ["test", "test1"]
text1[-1] = "2"
# object_idが一緒
text.object_id                  # => 70329724769400
# array1の内容が変わる!
array1         # => ["test", "test2"]

このようにobject_idが一緒なので、参照先は変わっていません。

まとめると

以下のように理解しました。

1
text1 = "test2"

1
text1 = String.new("test2)

は同じであり、「test1 = “test2”」とすることで、test1に代入しているわけではなく、新しいオブジェクトを作成していることとなるのですね。


あっているかどうかはわかりませんが、今の理解ではここまでです。


参照させない状態での配列の作成

久々にrubyでプログラムを書いているのですが、初歩的なところでつまずいています。
たとえば、以下のように書いた場合、

1
2
array1 = ["value1", "value2"]
array2 = [array1, 1,2,3]

array1の内容を変更すると、array2の内容も変更されます。

1
2
3
4
5
6
7
array1 = ["value1", "value2"]
array2 = [array1, 1,2,3]        # => [["value1", "value2"], 1, 2, 3]

array1[0] = "value0"

p array2
# >> [["value0", "value2"], 1, 2, 3]

array2の中でarray1を参照しているので、このようになるのは当たり前なのですが、array1の変更してもarray2の内容が更新されないようにするにはどうしたらいいかよくわかりませんでした。
そこで、以下のサイトを参考に、

一番シンプルそうな書き方として、dubを用いて、

1
2
3
4
5
6
array1 = ["value1", "value2"]
array2 = [array1.map(&:dup), 1,2,3]        # => [["value1", "value2"], 1, 2, 3]

array1[0] = "value0"
p array2
# >> [["value1", "value2"], 1, 2, 3]

「array1.map(&:dup)」とすることでうまくいきました。

他にやり方はあるのかもしれませんが、とりあえずはこれでOKです。

Octpressを初めてみました

最初に

Octpressを初めてみました。

Octopress

githubの練習やMarkdown記法の練習を兼ねてと考えています。
インストールなどはとっても簡単でしたが、githubとの接続で若干とまどったので、備忘録です。

インストール手順

いろいろなやり方はあるとは思うのですが、以下のような手順で環境構築しました。
1. githubにリポジトリの作成
2. ローカル(PC上)に環境構築
3. 初期設定とgithubとの接続設定
4. デプロイ

1. githubにリポジトリの作成

新規リポジトリの作成

「new repository」から、
github_page

「Repository name」を入力:「username.github.io」とする。
ここで、「username」はgithubのユーザー名とする。
github_rep

2. ローカル(PC上)に環境構築

次に、ローカル上に環境を構築します。
これは、とっても簡単です。

Octpressのソース取得

Octpressを管理したいディレクトリ上で、ターミナル上で以下のように入力します。

1
$ git clone git@github.com:imathis/octopress.git username.github.io

githubへのデプロイ用の環境設定

gitからcloneされたディレクトリに移動して、bundlerとgemをインストールします。

1
2
3
4
$ cd username.github.io
$ sudo gem install bundler
$ sudo bundle install
$ sudo bundle exec rake install

githubへのデプロイ用の初期設定

ターミナル上で

1
$ bundle exec rake setup_github_pages

このように入力すると、

1
2
3
4
Enter the read/write url for your repository
(For example, 'git@github.com:your_username/your_username.github.io.git)
           or 'https://github.com/your_username/your_username.github.io')
Repository url: 

こんな感じになるので、「Repository url: 」に続けて、githubのリポジトリ情報を入力します。

3. 初期設定とgithubとの接続設定

初期設定

ローカルのディレクトリ内の「_config.yml」を編集することで初期設定などできます。

1
2
3
4
url: 
title: 
subtitle: 
author: 

取り急ぎは、上記のような項目(5〜8行目あたり)を編集すればいいと思います。
urlはサイトのurl、titleはブログのタイトル、といった感じで、とってもわかりやすいです。

接続設定

私の環境では、ここが一番はまってしまったので、特に備忘録です。
上述の

1
$ bundle exec rake setup_github_pages

の設定を行うと、「_deploy/.git」が作られます。
ここで、setup_github_pagesしたままですと、githubにdeployできませんでした。
「_deploy/.git/config」を

1
$ cat _deploy/.git/config

などで確認すると以下のような感じです。

1
2
3
4
5
6
7
8
9
10
[core]
  repositoryformatversion = 0
  filemode = true
  bare = false
  logallrefupdates = true
  ignorecase = true
  precomposeunicode = true
[remote "origin"]
  url = https://github.com/username/username.github.io.git
  fetch = +refs/heads/*:refs/remotes/origin/*

このままで後述のdeployすると、以下のようなエラーがでます。

1
2
3
## Pushing generated _deploy website
remote: Permission to username/username.github.io.git denied to rakkyoo.
fatal: unable to access 'https://github.com/username/username.github.io.git/': The requested URL returned error: 403

私の環境では「_deploy/.git/config」を少し書き換えれば、このエラーがなくなりました。

具体的には、

1
2
3
[remote "origin"]
  url = https://username@github.com/username/username.github.io.git
  fetch = +refs/heads/*:refs/remotes/origin/*

という感じに、「url = https://username@github.com/username/username.github.io.git
username@を追加しました。
これだけでOKでした。

4. デプロイ

あとは、デプロイすればサイトができます。

1
2
$ sudo bundle exec rake generate
$ sudo bundle exec rake deploy

とするだけです。
一括で、

1
$ sudo bundle exec rake gen_deploy

としてもいいようです。

日常の更新

markdownで記事を書いて、deployするだけです。

記事の新規作成

以下のようにターミナルから入力します。

1
$ sudo bundle exec rake new_post['post title']

(post titleは英語のみだそうです)
そうすると、
「_source/posts/2014-06-132014-06-13-post-title.markdown」
というファイルができます。開いてみると、

1
2
3
4
5
6
7
---
layout: post
title: "post title"
date: 2014-06-13 14:17:07 +0900
comments: true
categories: 
---

このようになるので、「title」を修正して(日本語OK)、記事をMarkdownで書くのみです。

記事の確認

記事を確認したいときは、

1
$ bundle exec rake preview

として、「localhost:4000」にブラウザからアクセスすれば確認できます。
私の環境では、このままpreviewを起動しておいて、記事を編集して保存すれば反映されたので、確認しながら記事を書くことができてとっても快適です。

記事の投稿

上述していますが、以下のように入力するだけです。

1
$ bundle exec rake gen_deploy

最後に

githubへの接続で相当悩みましたが(_deploy/.git/configの変更について)、それ以外はとってもスムーズで、とっても簡単でした。
githubも含め、無料で快適なブログ環境が整ってしまうのは驚きでした。
markdown記法の練習とgithubの練習がてら、楽しく更新していこうかと。

いつまで続くことやら?

最初のポスト

Octpressを用いたブログ

試しに最初のポストをしてみました。