フクチ@プログラミングと釣り好き大学生のブログ

プログラミングと釣りと、ときどき日常生活

isucon7で惨敗した。

f:id:Yuki-F:20171023222747j:plain
先日開催されたisucon7にチーム「仕事ください」で参加してきました。
isucon.net

今年の四月からプログラミングの勉強初めたのですが
この大会で勝ち抜くことが今年のプログラマーとしての目標でした。

四月にもこんなことを書いてた、懐かしい。(ここに isuconについても書かれてます)
yuki-f-oki.hatenablog.com



そして、四月から今まで模擬isuconを数度やったりチームのレギュラー選抜をなんとか勝ち抜いたり
色々とありましたが、いよいよ本番を迎えました!


isucon7惨敗

結果から言うと

惨敗

初期スコアが6000で

最終的なスコアが4500

初期スコアよりも低いという、絶望的な結果でisuconを去りました。
ジャイアントキリング起こせなかった。


敗因分析

前提として、unixの基礎知識だったり、複数台サーバの構成やwebの知識などが大きな原因ではありました。
しかし、それだけではなくて

①今までのisuconとは違う、予想外のことが起きた時の対処
・rackサーバ:unicorn→pumaに変更されていた。しかも設定ファイルがない
rubyなどの各言語のファイルがhome/localの中にあり、bashrubyのパスを探せていなかった。
・いつも使っている分析ツールでネックが探せなかった。

ボトルネックも今までの傾向とは若干違う点
・/messageのN +1問題解決したけど処理速度大して変わらず。。。
・一番最初で気づいていて大きいボトルネックだった画像の静的配信ができなかった。
ステートメントを304にしたり、webの通信関連の知識が求められていた。

こういったことに対して、チームで話し合いが足りず
8hあったので2hごとに作業中断して自分が今何をしているのかだったり、各々が思うボトルネックについて話す時間を取れるようにしなかったのが一番の敗因かなと思っています。

インフラ担当の樹理さんには半端ない負担をかけてしまった上に、僕が画像の静的配信について理解が足りなかったせいでapp側担当としての責任も果たせなかったので本当に申し訳ない。

isucon挑んでの感想
isuconのおかげで、知識と精神的な面での学びがありました。
知識面では、rubyなどのプログラミング言語だけではなく、最初からwebを構成するモノ全体の知識とそれを学ぼうっていうモチベーションを得られました。
あとは、それぞれの分野をより深く学んでいきたい。今回でいうならweb支える技術を改めて読んでwebに関する知識増やしたい。

精神的な面では、こういう完全に勝ち負けが出る競技に対して、ここ数年疎遠だったので
負けた時の絶望感とかああやればよかったとかの後悔とか、絶対次はやってやるというリベンジ精神を深く学びました。いや、ほんと悔しいな。。。


今後について

実は今期から1年半休学しています。その間にずっと前から言っているエストニアへの留学に年始から行ってきます。
それまでに1、2回、日本でエンジニアインターンできたらいいな。


最後に
isucon運営の皆さん、
日曜定休日だったのにも関わらず、僕らのチームだけのために8h貸切させていただいたトポセシアさん

そして、
4月から僕らにプログラミングを教えてくれた師匠のさぼさん、開発で必要なことの勉強会を何回か開いてくれたり、
クソみたいな初歩の質問にも答えてくれて、さぼさんがいなかったら学べなかったことが数え切れないくらいありました。

そしてそして
チーム仕事くださいの先輩方、この半年迷惑かけたことの方が多かったと思います。。。
プログラミングに関わらず、人生の相談にものってもらい本当に助かりました。

本当に感謝です。
皆さん、ありがとうございました。

codebaseで模擬isuconやってきた

 

先日、codebaseで行われてた模擬isuconに行ってきました。

f:id:Yuki-F:20171011125552j:plain

 

 

本題に入る前に軽くcodebaseついてお話すると,

codebaseについて
CODE BASEは、「宜野湾西海岸を、ITビーチに!」という目的のもとプロトソリューションが運営するラボスペース。これからITスキルを身に付けたい方や、すでにエンジニアやクリエイターとして活動されている方が集う場所を目指し、様々な勉強会やイベントを開催していきます。

----HPから引用


以前、訪れて作業していましたが、内装すごく綺麗でした。

f:id:Yuki-F:20171011123725j:plain

isuconを一言でいうと、webアプリケーションを高速化を競う大会です。
具体的にいうと
・事前に与えられたwebアプリケーション(ex,ecサイトとか掲示板などのwebapp)のチューニング
・チューニングが成功した分だけスコアが上がる。そのスコアで競う
・1チーム三人(二人も可)で1組
・制限時間:8h

ってな感じです。

 

で、今年の四月からその出場に向けてチーム組んで勉強していて模擬isucon自体は初めてではなく、今回で6.7回目くらいでした。

ただ、今回は初挑戦のishocon1と事情(別記事で書きます。)があってチームではなく、一人で参戦。

ちなみに
githubhttps://github.com/showwin/ISHOCON1
題材webappは「ishocon」という爆買いecサイト的なやつ。

 

スコアの遷移
ざっくりと僕のスコアの遷移を

1.2017/10/08 10:49:26 Score: 283(初期スコア)
2.2017/10/08 11:47:43 Score: 620( my.cnf調整した)
3.2017/10/08 11:50:38 Score: 573( my.cnf調整2)
4.2017/10/08 12:06:14 Score: 558( unicornのワーカー増やした)
5.2017/10/08 12:09:42 Score: 593(nginx.conf調整)
6.2017/10/08 12:57:34 Score: 2119(historiesのところにindex貼った)
7.2017/10/08 13:36:00 Score: 17235(commentsテーブルのusers_id product_idにindex貼った)
8.2017/10/08 15:37:15 Score: 22838(benchを4にした)
9.2017/10/08 16:36:14 Score: 23948(app.rbのcurrent_userをチューニング)
最終.2017/10/08 18:01:08 Score: 24963(app.rbのcmt_queryとcmt_count_queryをいじった)

最終スコア:24963

おおまかにやったこ


*nginx側
・alp入れてログを解析
・nginx.confの調整

*app側
unicornのworker_processを増やす。
・gitリポジトリつくる。

@ローカル

・isuchon1をローカルで立ち上げる

・rack_line_profでコードごとの処理速度を監視
・rack_mini_profilerでページごとのクエリの数とかかった時間を監視
・上でわかった部分を中心にappチューニング

*DB側
・myprofilerでスロークエリの分析
・my.cnfの調整
・DB上でindexを貼る。
・dump→リストア

こういった準備等や設定ファイルの調整を12:30くらいまでに終わらせれた。

 

そして、ログを見たりしながら
indexをペタペタ作業。これで

5000ms → 200ms 
スコア2万を超えるという。
indexつえぇぇ

 

貼り終わったあとは
14:00すぎくらいからappcation側をチューニング。

今回のapp側のネックとしては
商品とそれに紐づくレビュー、そのレビューの数を表示させる処理をviewsの側でクエリを呼び出していて、それをeachで回していた。

で、それに1h30くらいかけてチューニングするもエラーとかででできず(技術力が足りない)、
他にネックとなっているところを探すと

 def current_user
   db.xquery('SELECT * FROM users WHERE id = ?', session[:user_id]).first
end

このcurrent_userというメソッドが30ms くらいかかっていて、購入ページやコメントページで呼び出されていたのにもかかわらず、一度だけログインユーザーの名前だけを使い、あと、使うのはidだけというw

これを、別でcurrent_user_nameメソッドをつくってsession[:user_id]だけ返すようにしクエリを呼び出さないようにした。

そしたら

30ms → 0.3ms まで下がった。が

スコアは1,000くらいしか上がらなかった。。

ここで残り一時間。。。 

 

最後に悪あがきで

my.cnfとnginx.confをググりながら調整

結果:スコア変わらず。。 

残り10分で

app.rbの中で無駄に多くのカラムを取ってきてるやつを無くしてあげた。

結果:1000くらい伸びる

 

そしてしゅーりょー

 

今回の感想

app側のチューニング、ちゃんと遅い部分を分析して、こうしたら早くなりそうって推測してそれを実行できたのは素直に嬉しすごく楽しかった。

ただ、一番ボトルネックだった部分を直せなかったりとか、スコア、初めて2万超えたけど順位的にみたら、下から2,3番目くらいだったのでそこがすごく悔しい。。。

本番はもっといろんな人と競うことになる。

残り2週間弱でどのくらいのレベルまでいけるかわからないがやりきっていきたい。

 

最後に、プロビジョンの立ち上げやポータルサイト作ってくれたさぼさんを始め、運営のみなさんありがとうございました。

 

 

 

 

 

 

UNIX系OSを大まかに知る①

こんばんは、
今日は、UNIX系OSについて現時点での知見を大まかにまとめようと思います。

というのも
isuconをやっていると、
自身はmacOS Xを使っているのですが
macOS以外のOSの環境下でwebアプリをデプロイしていて

例えばUbuntuCentOS など
初めて見た時は何がなんだかわかりませんでした。

ってことで
調べてまとめてみました。

0.そもそもOSとはなんぞや

OSとは、コンピューターを動かすためのソフトウェアのことです。
Operating System オペレーティング システムの略。コンピューター全体を管理、制御し、人が使えるようにする役割があります。
コンピューターを使う上では 基本となるソフトなので、OSを基本ソフトウェアといいます。
身の回りにある家電製品や産業機器などのコンピューターには 役割や機能は異なりますが すべてOSが入っています。

参照:PC講座


要は人とコンピュータの動力源てきなやつか。
OSの種類を大まかに分けると UNIXwindowsMac に分かれる
ちなみに知っての通り、一般人が使っているOSで一番のシェア(デスクトップOS)はwindowsで90%以上を誇る

1.UNIXとはなんぞや
OSの種類の一種で
・現存している最古の OS
・インタネットサーバはほぼ UNIX系統のOSが使われている
・高いセキュリティとネットワーク機能の安定性を誇る らしい。

1969年にアメリカの研究所でMulticsという世界初のOSがつくられたが重すぎて使いものにならず、
なんとか作り直して、実用化したのが UNIX

開発元の事情がありUNIXソースコードは世界中に公開されていた(後にライセンス化される)

そのおかげもあってか
ソースコード見れるし、自分たちでさらに改良できるんじゃね?」
ってことで世界中でヒットして、UNIXから派生したOSがどんどん出てくる

ーーなるほどなるほど、
とりあえず、 OSの起源はUNIXからきていたんだな

2.Linuxの誕生
そして、UNIXから派生したものの代表的な一つがLinuxです。
UNIXの機能に対して不満を感じたフィンランドの大学院生がUNIXを参照に開発したのが
Linuxだそうです。

しかも、驚くべきことが
あくまで参照してつくったということ。
UNIXがライセンス等の問題でうるさかったために一から開発をして作ったらしい。
末恐ろし。

だから、使われているコマンドは似てるけど、ソースコードは違う。
さらに
UNIXとは違って、Linuxは完全にソースコードが公開されていて
これまた、派生した色々なOSが出てきて大ヒット。

3.種類について
で、UbuntuCentOSはなんなのというと
結論からいうと
Linuxディストリビューション(配布形態、派生したモノ)に含まれるらしいです。

結局、UNIXから派生した OSを大まかに分けると

①systemV系---これはUNIXを開発した親会社が開発したもの
BSD---カリフォルニア大学のバークレー校が開発したUNIXの互換 OS
Linux---linuxはさらにRedHat系とDebian系、slackware系に派生

の三つに分けられる。

4.MacOSってunixからの派生?
Mac OSにはDebianというappleが開発したOSがあってそれがUnixの互換OSであるBDS系がカーネル部分(OSの根幹的なやつ、車でいうエンジン?)のベースに使われているらしい。
若干ややこしい。。。
だからディレクトリの階層設定とかコマンドがほぼ一緒なのか。
まとめると、こうなるのか
f:id:Yuki-F:20170816165914p:plain


しかし、
調べみてなんでにこんなに派生させちゃったんだろう。と思いましたが、
もっと良いOSを作りたい、という野心をもった多くのハッカー達のおかげでどんどん良いモノができていて
僕らがこうやって良いOSを使えているのかなとも感じました。

現に、OSによって得意分野があるみたいで
一般user向けはwindowsだけど、サーバ向けはUNIX系が使われているみたい。
さらに細かい分類があるみたいでけど、ここでは控えます。

ってことで
大まかな UNIX系OSを振り返りました。


次回は
macOSUbuntuCentOSの代表的なパッケージ管理システムとインストールコマンドの違いを忘れがちだから書きたいな。


参照:
UNIX系 OSについて1Pでまとめていた
http://uguisu.skr.jp/Windows/first_unix.html

・OSの歴史を初心者向けに面白く書かれていた。
OS種類:https://eng-entrance.com/programming-os
UNIXLinuxの違い:https://eng-entrance.com/unix_linux
Linuxの誕生;https://eng-entrance.com/linux_birth
Linuxディストリビューションhttps://eng-entrance.com/linux_beginner_distribution

・OSのシェア(デスクトップOS)
http://news.mynavi.jp/news/2017/07/03/131/

〜第三回模擬isuconを終えて〜

こんにちは!

先週、第三回模擬isuconをやりました!
ブログには書いてないのですが、1,2回目も実はやっていました。
先輩達が書いてくれています
一回目(pixivのprivate-isucon)
http://masa-world.hateblo.jp/entry/2017/07/06/233357
http://matsuda-juri.hatenablog.com/entry/2017/06/27/142352

2回目(isucon5)
http://masa-world.hateblo.jp/entry/2017/07/06/233357
http://matsuda-juri.hatenablog.com/entry/2017/08/01/174159

さて、今回3回目模擬isuocnでは
isucon6(ややこしい)をやる予定。。。。

だったのですが、

まさかの
サーバ起動後のプロビジョン(課題のwebapp)が立ち上がらず、アレヤコレヤしたのですが
時間もないので諦めて、復習を兼ねて前回やったisucon5をやってみようということになりました。

あと、
上の先輩方の記事を見たらわかるのですが、
3人で八時間やって最終スコア0点でした。。。
(ちなみに初期スコアが300くらいww 初期スコアより低いw)


前回の反省とコーチの助言を踏まえてやろうと試みたこととして
mysqlのmy.cnfとnginxのnginx.confをチューニング(前回、コーチがmy.cnfいじって約2万点上がった。)
②N+1問題解決する

でした。


①my.cnfとnginx.conf
そもそも、なんで設定ファイルいじるのかというと
今回のネックとして、②のN+1問題もあったのですが、
前回コーチがそこを解決してもスコアが600くらいしか伸びなかった。そのあとにhtop使って見てみると
DB側に適切にメモリが割り当てられないことがわかりmy.cnfをチューニングすると約二万点に上がった。

nginxは先輩が担当、僕がmy,cnf担当だったので
catasuyさんのmy.cnfを参考に(てか、ほぼパクリ)していじってみると
スコア:300 → 600
あれ?あんまり上がっていない。
前にコーチがいじった時、二万点くらい上がったのに。。
しかも追加した設定もほとんど変わっていないのに。。

そして、
先輩がnginx.confいじり、そしてデータにindex貼ったりするが
スコア:600→1000
あれ?
確かに前回よりもスコア上がっているし、試みたこともできたから嬉しい。
けど、なんか全然スコア上がってなさすぎて嬉しさ半減。

と、とりあえず、気を取り直して②にGO

②N + 1問題
今回、もっともボトルネックなのがこのN +1問題。
ログインユーザーのフレンドかどうかを判断する際に無駄なクエリが発行されている。
ということで、そこのクエリ文を直せば良いことにチームメンバー全員が気づいた。

お、すごく順調じゃん!

となるが


なおせねぇ

というか、誰もクエリ文の直し方とか書き方マスターしてる人がいねぇ。。

チューニングする場所がわかっているのに直せない辛さ。。。
(*うまくいけば 1200クエリ→ 16クエリくらいに減るらしい。)

ググリまくって、書き方を調べて試してみるも
うまくいかず。スコアが下がるどころかエラーが出た。

さらに、rack-mini-profilerとかrack-line-profilerを入れたり
アレヤコレヤやってるうちに時間がすぎて行き
結局、最終スコア 940点でしゅーりょー。

今回の振りかえり
・設定ファイルをいじったとしても、肝心の無駄なクエリが解決していないのでDB側が無駄な動きをしっぱなしで、あまり点数に繋がらなかった。
ボトルネックがわかっても、改善する腕がなければ、意味ない(当たり前)

ただ、よかった点として
・自分達が詰まったところを書き込んで復習できるようにした。
・設定ファイルチューニングがある程度できるようになった。

そして
そもそものコーディング力ってまじで大事!!ってことがわかった
当たり前でしょ?って感じだけど、こうやって模擬isuconをやっての実感値は全然違うなと思いました。

あと、個人的な問題は
コードを読んでこのメソッドがどういう働きをしているのかだったりコードからサービス全体像の把握がまだできていないなと思いました。
圧倒的に読んでる量と書いてる量が足りてない問題。。


とりあえず、
次回までにクエリ文を習得しようと思います。

ではでは〜

デフォルトrubyの罠 〜mac sierra〜

こんばんは!!

 

f:id:Yuki-F:20170717201300p:plain

今日はrailsのお話です。

 

最初のrails入れるのにだいぶ苦労していた僕ですが
先日友人に「railsをpcに入れようとしたらエラーが色々でて、困っている」との連絡

が、、、


実際に会ってみて見ると、
僕も最初ruby入れる際にハマった罠だったので今回、記事にすることに決めました。

 

端的にいうと
.rbenv配下に入れたrubyをpcが読み取ってくれず、rails入れる時にエラーが出てしまう。

 

そして、その原因として
macにはデフォルトでrubyが入っていて、そこをbashが読み取りにいっている。

さらに、ぶつかったものとして

OS X El capitan以降からデフォルトrubyのアンインストールをしようとするとoperation not permittedが出る。

 

結論としては、

bash_profieの中でPATH設定を加えたら上手くいきました。

*ただ根本的な解決になっているのかは怪しいです。。。

 

ちなみに結論に行くまでにやっていたこととして

・usr/bin/ruby をアンインストールしようとするが、できない。→chmodしても

permission error。

・rbenv global でrubyのversionを指定していた。→rbenv versionでも切り替わっているのが確認済み

 

 

Macにはデフォルトでrubyが入っている。

おぉそれならデフォルトのruby使えば良いじゃん!ってなると思うのですが問題が。。。

versionが古い!

そうなんです。デフォルトのrubyのversionは今回 2.0.0だったんですが

最新は2.4.1でなかなかversionが古い。

そして、デフォルトrubyを使わない理由(今の僕の理解範囲)として

・古いので公式のサポートがない。バグとかセキリュティの面で不安。

・最新versionはメソッドが増えていたり便利

などなど、、

そして、それを解決するためにrubyのversion管理ツールであるrbenvを使って最新versionにしていきます。

 

今回のエラー

rbenvで最新のrubyをインストールするまでは上手く行ったのですが、gem install bundlerをしたときに permision errorが出ました。。。

 

これはmacデフォルトruby(usr/bin/rubyがある)を読みにいっているかつ、OS El Capitan以降、セキリュティが強化されて、/usr以下のルートディレクトリは sudo使わないとインストールできないみたいです。

 

ここで一回強行で、sudo gem install bundlerをすると上手くいきましたが 

またまた、問題が!!

sudo gem install rails を打つと

ERROR: While executing gem ... (Gem::FilePermissionError)
You don't have write permissions for the /Library/Ruby/Gems/2.0.0 directory.

 ありゃ?

bundlerはsudoでできたけど、railsはできない。。

 ここで which rubyをすると

usr/bin/ruby を読み取っている。

 

....おい! もっと前に気づけよ、俺笑

急いでいたため、rbenv  versionsで見て、ruby -v の確認コマンド打っていなった僕。

ってことで、デフォルトrubyを潰す作業に入るが最初の冒頭 に書いたようにできず。。

 ならば 読み取るpath変えて、usr/bin/rubyではなく/.rbenv配下のrubyを読み取れるようにしそこに入れるようにしました

 

~/.bash_profileをホームディレクトリの配下に作りました

解決策として、

ホームディレクトリの中に .bash_profileを作って、その中に 

eval "$(rbenv init -)"

 と打ち

$ source ~/.bash_profile

で反映させて、bashを再度起動(これ忘れがち)させ

ruby -v を打つと

 

ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-darwin16]

 

できてる!!

 

which ruby を打つと

/Users/user_name/.rbenv/shims/ruby

 

できてる!!

 

ということで一旦落着。

 

別の解決策の可能性として

Rootlessを解除してデフォルトrubyを潰す。(参照:http://gabekore.org/emacs-auto-install-err-443)

とか、他にも解決策ありそうな予感。

 

 

今回参考にさせていただた記事です。

インストール手順参考

https://design4b.co.jp/blog/rails5_1-install-mac-2017

 

〜〜エラー参考〜〜

・rbenvでのversion切り替え:http://qiita.com/akatsuki174/items/c0384b9903b4b5cbbdaf

bash_profile内コマンド:https://github.com/rbenv/rbenv/issues/938

・初期ruby罠について:http://gabekore.org/mac-default-ruby-problem

・gem install 権限について:http://qiita.com/tokimari/items/feda1ed61f2d8b5b317c

 

〜〜今後詳しく調べること〜〜

・中盤で書いた、railsがsudoを使ってもインストールできなかった理由は何か

bash_profile, bashrc とか設定ファイルがあるけど、その読み込みの優先順位と仕組み

・rbenv/shims  のshimsの必要性 

・そもそもappleはなぜmacにデフォルトでruby入れてるの

5時間の苦労が10分で終わった話

 

こんばんは!

 

先ほど、メンターのさぼさんのRubyMineとzshの講座を受けて、作業効率がレベルアップした福地です。

 

 

さてさて、

以前からチーム、個人個人で「line」っぽいものを作ろう活動をしているのですが

先輩は大方完成させています。

同じチームのまさよしさんの「line」(完成度がすごい)↓↓

http://masa-world.hateblo.jp/entry/2017/05/27/172439

 

こんなやつ、俺も早く作りてぇ!

 

と意気込みながら

 

コードを書いて、実行してをしてを繰り返し

よし、Activerecordを使ってmysqlに接続してみようと

http://qiita.com/u1_fukui/items/88c10d4d530ec6fbaaa1

のサイトを見ながら実行してみると....

 

f:id:Yuki-F:20170603022500p:plain

"database configuration does not specify adapter (ActiveRecord::AdapterNotSpecified)"

........

なんかアダプターが特定されていないと怒られました。

エラーが出たのはこの部分。

f:id:Yuki-F:20170603024005p:plain

むむ。

 

そっからほんと地獄が始まりました。

 

入力ミスを探したり

ディレクトリのパスを変えたり

そもそもの書き方探したりしたけど

 

なぜかできない。

それで、以前同じようなことでミスってる人いないかと思って探したりしていると

まさかの同じチームのまさよしさんがブログで書いていたwww

http://masa-world.hateblo.jp/entry/2017/05/15/125249

 

とその中で,

まさよしさんは

database.ymlの adapter :mysql2をmysqlとん入力していたことが原因だと書かれていたので見てみると

f:id:Yuki-F:20170603023524p:plain

 

あれ、ちゃんとmysql2にしている。

気になってgemfileも見てみると、ちゃんと'gem mysql2'にしてました

 

こんなエラーとにらめっこすること総計 5h近く。

さすがに思考も固まりかけていたので

同じ大学だったエンジニアの先輩に助けを求めると,

なんとですね

 

...10分足らずで解決しました。

 

まさに、「まじかよ」って感じですね。

 

原因は 

①developmentをクオーテーションで囲っていること

 そこを'development' →:development  にする

ActiveRecord::Base.establish_connection(:development)
 

②database.ymlの中でインデントをちゃんとしなかったこと

 development以下のコードをインデントしてあげる

development:
adapter: mysql2
database: line_app
host: 127.0.0.1
username: root
password: kuro@0000
encoding: utf8

 

実行してみると.........

サーバが立ち上がりうまくいきました!!!!!!!!!!

 

いやー5時間かけたやつが人に聞くと10分で解決するとは。。

恐ろしや。

 

てか、そもそもこんな基本的なところで間違うということはそこまでちゃんと意味を理解していないんだろうなとも思い、勉強不足を痛感しました。

 

色々ともう一回復習しまくります!

 

では、また

 

Gut に感動 ②

GIt Hub

 

こんばんは!

先日はGitについて、書いたのですが、

今日はGitをもっと有効的に活用したGit Hubについて

  • Git Hubとは?? Gitとの違い
  • Git hubを使ってのアップロードの流れ
  • おまけ:branchとGit Hub desktop

で書いていきます。

 

 Git Hubとは?? ~Gitとの違い~

前回お話したように Gitはファイル変更の履歴などを各変更ごとにリポジトリに記録するシステムでした。

では、Git hubは一体なんでしょうか。

Git hubは簡単に言えば、Gitの機能を拡張させたもので、

Gitは個人のpc(ローカル)のリポジトリに記録するのに対し、

Git Hubはクラウド上(リモート)のリポジトリに記録します。

 

Git Hubのリポジトリにうつすことによって、

そこから、ソースコードを引っ張てきたり、アップロードしたりして他の人との共同開発ができるようになります。

 

 Git Hubの「hub」は「中心、中継」という意味があるので、本当にそのままの意味ですね!

 

Git hubを使っての作業の流れ

 

リモートリポジトリで使う主なコマンドは以下の通り。

 

------------リモートリポジトリへアップロード系コマンド一覧

git remote add (使用するリモート先の) url :アップロードするリモートリポジトリを指定します

・git push リポジトリの名前 master  :リモートリポジトリにアップロードします。

 

------------リモートリポジトリからダウンロード系コマンド一覧

git pull リポジトリの名前  : リモートリポジトリのmasterからのソースコード変更の反映

git clone リポジトリの名前  : リモートリポジトリからローカルリポジトリにクローン

 

------------実際に開発する際に使うコマンド

git branch + ブランチ名  :ブランチをつくれる

git checkout + ブランチ名  :ブランチへ移動 

git branch -d + ブランチ名   :ブランチを削除

 

こんな感じですかね。

 

ってことで

前回のtestフォルダをGit Hub上にあげてみようと思います!

(前回でローカルリポジトリにCommitしてる状態から開始です)

 

①Git Hub上でリポジトリを作る

Git Hubの最初のページの右下にNew repositoryがあるのでそこをクリックしたら

レポジトリ作成ぺージがあるのでそこでテキトーに名前つけて作成。

f:id:Yuki-F:20170518232004p:plain

 

②ローカルにリモート先を登録

今度はターミナルを開いて、リモート先へ

$ git remote add origin https://github.com/(ここは各々変わる)

を入力します。 

 

③リモートにファイルをアップロード

$ git push origin master

f:id:Yuki-F:20170518232635p:plain

 

これで完了しました!!

 

Git Hub上でみて見ると。。。

 

f:id:Yuki-F:20170518233053p:plain

 

できてますね!

 

よかった!

 

しかしめっちゃシンプルすぎ!!

ほんと現代の技術に感動。。

 

おまけ:branchとGit Hub desktop

 

branchとは

何気なーく出てきたbranchですが、Git Hub上ではすごく重要な仕組みです。

 

----ブランチとは、履歴の流れを分岐して記録していくためのものです。分岐したブランチは他のブランチの影響を受けないため、同じリポジトリ中で複数の変更を同時に進めていくことができます。       参照:サルでも分かるGit入門

 

複数のリリース版の開発や機能追加、バグ修正などを複数のメンバーが平行して開発していくためにはbranchが必須なのです。

 

Git Hub desktopとは

 Gitで共同開発をしていく上で、commitするタイミングとしては バグ修正や機能追加など各変更点でcommitしていくそう。

 

しかし、commitを忘れて修正や機能追加をたくさんしてしまった場合、一度のメッセージでは伝えられないことがあります。

そんな時にGit Hub desktop の出番です!!

これを使えば、ソースコードの変更点ごとにわけてcommitができます。

...............便利すぎる!!

 

僕の先輩が実際に試したやつをブログで書いています↓↓

http://masa-world.hateblo.jp/entry/2017/05/17/223014

 

 

まだまだ奥が深いGit Hub。

実際にこれから開発で使っていくのが楽しみです♪