rails のサーバー立ち上げようとしたらセグフォした件

Railsでセグフォした

teratail.com

rails s ができません。mysql2-0.5.1/lib/mysql2/client.rb:90: [BUG] Segmentationエラー

いやいや、RailsSegmentation Faultってそんなわけないでしょ??????????

お。??まじやんwwwwwwwwwwwそんなことある????wwwwwwwって感じでした

以下質問文引用

開発中に突然warning: already initialized constant FileUtils::RUBYエラーが出てしまい、ruby、railsを再インストールしました。

そうしたところSegmentation fault at 0x00000000000000と出てしまっています。

どうもmysqlとの紐付けがうまく行ってないのかと思いますが、原因不明です。

rails sをしてもサーバーを起動させることができないでいます。 

どなたかご助言をいただけますと幸いです。

ふむふむ。よくわからんがエラー前に何かしたんじゃないの????という感じですねw ただ話を聞いていると特に何もしていないっぽかったのでよくわからんという感じです。w

...エラー文

vendor/bundle/ruby/2.4.0/gems/mysql2-0.5.1/lib/mysql2/client.rb:90: [BUG] Segmentation fault at 0x00000000000000
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-darwin16]

-- Crash Report log information --------------------------------------------
   See Crash Report log file under the one of following:                    
     * ~/Library/Logs/DiagnosticReports                                     
     * /Library/Logs/DiagnosticReports                                      
   for more details.                                                        
Don't forget to include the above Crash Report log file in bug reports.     

-- Control frame information -----------------------------------------------
c:0043 p:---- s:0315 e:000314 CFUNC  :connect
c:0042 p:0688 s:0303 e:000302 METHOD /Users/___/Desktop/lance_note/vendor/bundle/ruby/2.4.0/gems/mysql2-0.5.1/lib/mysql2/client.rb:90 [FINISH]
c:0041 p:---- s:0289 e:000288 CFUNC  :new

ほぉ?なんかgemsの下のmysql2の中のファイルで死んでるっぽいですね?。 とはいえ直前まで動いてたらしいし動くでしょ、普通w

たまたま該当の質問者と知り合いだったので連絡をしつつ解決した経緯について触れたいと思います。

なんとなく現状のMysqlRailsの疎通を確認したかったので

$ rails s
$ rails c
$ rials db:console
$ rails db:migrate:status

などのRailsコマンドを叩いてもらうと rails cだけがうまく通るみたいです。 Rails本体はうまく動いてるっぽいですね。RailsとDBを繋げようとすると◯ぬ。

$ mysql -u root;
$ show databases;
$ use sample_db;
$ show tables;

のようなMysql自体へのアクセスやSelectクエリなどは問題なく動くみたいです。

RailsMysql繋げようとするとセグフォする?????????!w

この時mysql2のgemのバージョンの問題かと思って

0.5.1
0.5.2

などに変えたりしてもエラーが発生してました。

fumihumi.hatenablog.com

などを試してみたりしてもらっても変わらん。 なるほどよくわかrん

結論

...mysql2のGemのVersionもう一個下げてみますか?と思い。 0.4.10 に下げてみてもらったところ、解決されたようです。

うーん謎いですね。特にISSUEなどになってるわけでもないので特定の環境下にて再現されるものなのかもしれません。 ただ、 rails puma segmentation fault ってググってもあんまりヒットしなかったのでとりあえず書いてみました。

何かわかる人いたら教えてください。

iOSシミュレータで開発効率が100倍増しになった話

TL;DR

Web開発するのに、スマホ画面での検証しないと行けないじゃないですか。 いままで chrome, Chrome Canary, safari, secretWindowとかを駆使して iphone5, 7, 7plus, Xのサイズ試してたのですが、◯ぬほどめんどくさいなぁと感じてしまったんですよね。(遅い) それを解決しようってのが今回の話です。

きっかけは↑の記事でのシミュレータをフルウインドウでひらくというもの。 ↑の状態で シミュレータ複数横並び にできたら幸せじゃないですか!

という訳でやってみました!

やったこと。

https://github.com/facebook/FBSimulatorControl

今回は使ったのは FBSimulatorControlというFacebook社が提供してるOSS。 このOSSbrew を使って入れてました。

  $ brew tap facebook/fb
  $ brew install fbsimctl --HEAD

$ fbsimctl list fbsimctlコマンドにlistを渡すと起動可能なシミュレータの一覧を取得できるみたいです。

@fumihumi:fbsimctl list | grep iPhone
022068FE-C8EB-4B70-A248-59050F47DEBB | iPhone X | Booted | iPhone X | iOS 11.4 | x86_64
B4D8BDFD-0F86-411A-986F-524C3B646547 | iPhone SE | Shutdown | iPhone SE | iOS 11.4 | x86_64
5E5E1123-AEF2-4765-90AA-B6C82ED55ABF | iPhone 8 Plus | Shutdown | iPhone 8 Plus | iOS 11.4 | x86_64
BDC8695E-568C-454E-9DD8-8732677B7A9D | iPhone 8 | Shutdown | iPhone 8 | iOS 11.4 | x86_64
CA9F509D-A76B-4708-B7B1-07341D8FC324 | iPhone 7 Plus | Shutdown | iPhone 7 Plus | iOS 11.4 | x86_64
DA208130-4BED-433B-89CB-BA35C0CBC5A9 | iPhone 7 | Shutdown | iPhone 7 | iOS 11.4 | x86_64
EB6362A3-BBA7-45DD-95AF-2AFA91AAD624 | iPhone 6s Plus | Shutdown | iPhone 6s Plus | iOS 11.4 | x86_64
2DE031F8-DCDB-4CD2-91B1-C8915F3E3644 | iPhone 6s | Shutdown | iPhone 6s | iOS 11.4 | x86_64
2EBD9CF9-1654-4E18-8017-53A2901F9CC9 | iPhone 6 Plus | Shutdown | iPhone 6 Plus | iOS 11.4 | x86_64
D6F59370-3C52-4DC0-823C-85B5D20E222A | iPhone 6 | Shutdown | iPhone 6 | iOS 11.4 | x86_64
DD24F91C-A6BF-470D-B8A9-B288A8D215CC | iPhone 5s | Shutdown | iPhone 5s | iOS 11.4 | x86_64
UUID:(識別子的な何かっぽい)
機種:(AppleTV, iPad Pro, iPhone, AppleWatch)など
起動状態:(Shutdown | booted)

などが乗ってますね

まぁ

fbsimctl list | grep -e 'iPhone X' -e 'iPhone SE' とかでグレップした上でそのUUIDを元に

fbsimctl B4D8BDFD-0F86-411A-986F-524C3B646547 2DE031F8-DCDB-4CD2-91B1-C8915F3E3644 boot

のように fbsimctl UUID boot とすることで複数の端末をエミュレートできます。

結局なにしてたの?

Web開発で複数のユーザで確認したいとき。 ブラウザでタブ開いて確認してもいいんですが、シークレットウインドウつかったりChrome, safari, firefoxで別ユーザでログインしたり、大変。。。。。

そんな時にiPhoneシミュレータでできると便利なんですよね。

詰まったこと

$ brew install fbsimctl --HEAD がうまくいかなかった

org.carthage.CarthageKit/dependencies/GCDWebServer: Operation not permitted

というエラーが出ていた、

sudoつけて、Installしようとしたんですが、 sudo brew install 〇〇 ってダメなんですね。初めて知りましたw

↑のエラーは Carthage を消せば良さそうみたいです。

$ brew uninstall --force carthage
$ rm -rf ~/Library/Caches/org.carthage.CarthageKit

特に Carthage に思い入れないので容赦なく消してやりました。 まぁ大丈夫っしょw。 iOSエンジニアは少し躊躇したりするんですかね? よくわかりませんけど 頑張ってください。。w

まとめ

iOSシミュレータを使ってスマホレイアウトの確認をすると、想像以上にやりやすい! (最近ChromeのDeveloperToolがより便利になってなんとも言えない気持ちになってる)

gitのssh_key作ったのにssh -T で permission deniedされた。

SSHKeyを追加したかったんですけど

qiita.com

↑の言われるようにやってました 

  ssh-keygen -t rsa -b 4096 -C  '#{めあど}@#{こめんと}'
  pbcopy  < github_id_rsa.pub
  # ブラウザでGithubのSSH登録

疎通確認をする↓

$ ssh -T git@github.com
git@github.com: Permission denied (publickey).

# なにやらうまくいかないけどとりあえず管理者権限でやったろ

$ sudo ssh -T git@github.com
Password:
The authenticity of host 'github.com (192.30.255.112)' can't be established.
RSA key fingerprint is SHA256:nThbg~~~~~~~~~~E5SY8.
Are you sure you want to continue connecting (yes/no)?
Host key verification failed.

うーん。うまくいかない。 sshの鍵は作ってるんだけど手元のpcでちゃんと認識できてないっぽい?

$ ssh-add -K ~/.ssh/github_id_rsa
Enter passphrase for /Users/{ユーザー名}/.ssh/github_id_rsa:
Identity added: /Users/{ユーザー名}/.ssh/github_id_rsa

ってやったらできました。

ssh-addの-Kはなくても問題ないんですがpc再起動すると読み込みに失敗したりするのでオプションつけたほうがよさそう

うーん。よくわからん

railsで検索するならRansack!!!!!!!!!!!!

ransack を使ったときになぜか検索できなかった話

最近の悩みだったんですよ ()

Railsの検索フォームを作る時ってさりげなくめんどくさくないですか。

めんどくさいですよね;;... めんd .... ゲホゲホ (異論は認める)

+ = form_tag xxx_yyyy_search_path do
+   .row
+     .form-group.col-sm-2
+       = text_field_tag :xxx_name,
+       { placeholder: "xxx", class: "form-control input-sm" }
+     .form-group.col-sm-2
+       = text_field_tag :yyy_name,
+       { placeholder: "yyy", class: "form-control input-sm" }
+      .form-group.col-sm-2
+        = submit_tag '検索するよー', class: 'btn btn-default btn-sm'
+def search 
+  @samples = Sample.page(params[:page]).per(PER)
+  if params[:xxx_name].present?
+    @sample = @sample.joins(zzz: :xxx)
+                     .where('xxx.name like ?', "%#{params[:xxx_name]}%")
+  end
+
+  if params[:yyy_name].present?
+    @sample = @sample.where('name like ?', "%#{params[:name]}%") 
+  end
+  
+  @sample = @sample.decorate
+end

これ。死ぬほど冗長だし、ちょっと(どころじゃなく)見栄えが悪いんですよね。 検索したいcolumnがふえるたびにViewに

+ .form-group.col-sm-2
+   = text_field_tag :new_column,
+   { placeholder: "検索したいcolumnふえたよ!", class: "form-control input-sm" }

↑のようなViewを追加し、

+  if params[:new_column].present?
+    @sample = @sample.where('new_column like ?', "%#{params[:new_column]}%") 
+  end

のように追加しないといけないんですよ。 DBがふくらんで3個どころじゃなく検索したくなったらどうするつもりですか?????? (心の声:頑張る) ←やめてください

そんな時に使うのが Ransack というGemです (https://github.com/activerecord-hackery/ransack

これがとても素晴らしいもので、早い、すごい、便利の三拍子を揃えているのです!

と、いうわけで

ransackの紹介と導入について

簡単に...(きになる方は本家みてw)

ransackは...README.

Ransack enables the creation of both simple and advanced search forms for your Ruby on Rails application (demo source code here). 
If you're looking for something that simplifies query generation at the model or controller layer,
you're probably not looking for Ransack (or MetaSearch, for that matter). Try Squeel instead.

だそうです。まあつまり シンプルだけど高度な検索をしたいならコレ!というわけです。 (雑)

ransackを使うためには

gem 'ransack'

もしくは

gem 'ransack', github: 'activerecord-hackery/ransack' # if you would like to use lates updates, use the master branch

をGemfileに記載し $ bundleするだけでじゅんびは終わりです。

def index
  @q = Person.ransack(params[:q])
  @people = @q.result(distinct: true)
end
<%= search_form_for @q do |f| %>

  # Search if the name field contains...
  <%= f.label :name_cont %>
  <%= f.search_field :name_cont %>

  # Search if an associated articles.title starts with...
  <%= f.label :articles_title_start %>
  <%= f.search_field :articles_title_start %>

  # Attributes may be chained. Search multiple attributes for one value...
  <%= f.label :name_or_description_or_email_or_articles_title_cont %>
  <%= f.search_field :name_or_description_or_email_or_articles_title_cont %>

  <%= f.submit %>
<% end %>

とすれば良いみたいです。個人プロジェクトに入れたのだいぶ昔でサンプルないので公式をコピペ。

search_form_for

というのがRansackが提供しているメソッドでRansackを使う検索をする場合はForm_forではなくこれを利用します。
  上記のような記載にしてあげることでRansack様の恩恵を受けられます。   またransackを利用するさいにはsearch_filedへ引数を利用することで検索条件を変更することが可能です。

上記のような、

<%= f.search_field :name_cont %>
<%= f.search_field :articles_title_start %>

という場合は name columnに対してLike検索、 関連先の、articlesのtitleに対してのlike検索。を行います。 (多分 has_many articlesの関係)

  その他にも、https://github.com/activerecord-hackery/ransack

シンボル引数 内部条件
column_eq 完全一致
column_matches like検索
column_cont 部分一致
column_true bool検索
column_blank blankかどうか
column_present 存在確認
column_null null確認
not column_not_eq みたいに否定ができる

などなどあります。 自分は公式のドキュメントや、

http://nekorails.hatenablog.com/entry/2017/05/31/173925

↑のサイトをみたりしてます。


そんな便利なRansackさんですが、

セキュリティ的なことを考えると機能によってはチューニングしないといけないのです。

今回自分はそれに気づくまで時間をとかしてしまったので、猛省しながら本記事を書こうと思ったわけです。

ちなみに今回僕が遭遇したのは、

特定のcolumnでは検索できるのに 他のcolumnでは検索ができない。

まずは遭遇したエラー文ですが↓

 undefined method `xxx_cont' for Ransack::Search<class: Entry, base: Grouping <combinator: and>>:Ransack::Search

うーん、エラー文としてはよくあるアレですよね、
Nomethod error ........ ウルセェ!モデルに columnあるだろ!!!! f●ck!!!!!!!!!!

ただ、この時もControllerにて

def action
  @q = Model.search(params[:q])
  @instance_valiables = @q.result
end

のようにしてたわけで、この @q の内容は

=> Ransack::Search<class: Model, base: Grouping <combinator: and>>

になっており、正常にRansackのメソッドになってるんですよね。うーん。

RailsContsoleで

Model.ransack({xxx_cont: 'sample'}).result

→と、すれば該当モデルの'xxx'カラムに対して検索もしてくれてる風なレスポンスですしお寿司。。。 (今思えば、実際は検索されていないで Model.allの結果になってたっぽい気がする)

↑↑↑↑↑↑

とまぁ。状況の創造はできたと思うので実際の対処になります。

該当columnで検索してないのに絞り込めてない時の対処が以下になります。

問題としては該当モデルのファイルにて

self.ransackable_attributes self.ransackable_associations

ransackのオーヴァーライドが原因になっていました。 自分が作業をしていた時は

  def self.ransackable_attributes(*)
    %w[created_at]
  end

  def self.ransackable_associations(*)
    %w[]
  end

となっており、検索したい name columnが検索対象の columnとして登録がされておらず。 また、関連先の定義がされていなかったため、articleに対する検索すらもできなかったということになります。。。。。。。。。。。。。。。。。。

つらい。 しんどぃ。。

なので、以下のメソッドに変更を加え、

  def self.ransackable_attributes(*)
    %w[created_at name]
  end

  def self.ransackable_associations(*)
    %w[articles]
  end

のようにすると name columnでも検索が可能になりますし、articleへの探索も可能になるのです。

これで動くのでひとあんしんですね。

余談

まぁなんというか、エラーでて調べてもこの手のエラーへの対処がなかったので今回書いてみたんですが。 行ってしまえば、自明な内容になってしまいそうなので、今回はさらに一歩踏み込んだ内容について考えてみようかなと。

ransackのsource codeをのぞいてみよう。。。!

初めてOSS?をコード見るためにCloneしました。
はるか昔にDevise(認証用のGem)をみたことがあるが黒魔術すぎて3秒で諦めたなぁと物思いに老けながらgit clonne...)

今回の諸悪の根源である該当メソッドは以下のファイルにて定義されています。 (https://github.com/activerecord-hackery/ransack/blob/master/lib/ransack/adapters/active_record/base.rb)

 # Ransackable_attributes, by default, returns all column names
 # and any defined ransackers as an array of strings.
 # For overriding with a whitelist array of strings.
 #
 def ransackable_attributes(auth_object = nil)
    @ransackable_attributes ||= if Ransack::SUPPORTS_ATTRIBUTE_ALIAS
      column_names + _ransackers.keys + _ransack_aliases.keys +
      attribute_aliases.keys
    else
      column_names + _ransackers.keys + _ransack_aliases.keys
    end
 end

 # Ransackable_associations, by default, returns the names
 # of all associations as an array of strings.
 # For overriding with a whitelist array of strings.
 #
 def ransackable_associations(auth_object = nil)
   @ransackable_associations ||= reflect_on_all_associations.map { |a| a.name.to_s }
 end

がっつりコメントアウトされとるやんけ!!!!!!!!

# Ransackable_attributes, by default, returns all column names # and any defined ransackers as an array of strings. # For overriding with a whitelist array of strings. # ちょっとした時に使う分には全ての columnにたいしての検索でもいい。ということからデフォルトは全ての columnをreutrnしている。

しかしながら、悪意のあるユーザにとってはこれがSQLインジェクションの入り口になったり? インジェクションはできなくても製作者が意図してない検索をさせることも容易に想像ができます。

そのため今回のプロジェクトでは該当メソッドをオーバーライドして検索をかける場合は自分が許可したものしか通さないんですね。 うーんStrongParameterに似ている気がするw

ちなみに改めてREADMEをみていると

Authorization (whitelisting/blacklisting)

ちゃんと記載してありました。Document読みましょう。

まとめ。

documentを読みましょう。答えはそこにある。。

とりあえずRubyが動くまでの環境構築メモ

必要なもの

  • エディタ
  • HomeBrew(以下の管理のため)
    • rbenv(rubyを管理する)
    • mysql(今回は5.7入れたい)

エディタ(高機能なメモ帳)

以下のうちどれか一つ。オススメ順

HomeBrew

以下ターミナルでの操作

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

時間かかる -> おわったら

 brew doctor

→ command not foundじゃなければおk

変なwarningがでていたら → https://qiita.com/unsoluble_sugar/items/acaffa6d0e28c3c24934 頑張れそうなら解決してみて

rbenv(rubyを管理する)

brew install rbenv ruby-build

-> rbenv --version

→ command not foundじゃなければおk

echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

source ~/.bash_profile

(変化なくて問題ない)

ruby の 2.5.0を入れる

rbenv install 2.5.0

rbenv versions

-> 2.5.0があればおk

rbenv global 2.5.0

rbenv rehash

ruby -v

-> 2.5.0ならおk

mysql

brew install mysql@5.7

brew link mysql@5.7

mysql --version

-> Command not Foundじゃなければ なんかワーニングでてたらそれ打てばおk

MySQLを立ち上げるには、
次のように入力して、エンターキーを押します。

$ mysql.server start

MySQLを終了するには、
次のように入力して、エンターキーを押します。

$ mysql.server stop

サーバにインストールしたMySQLは、常時起動するようにするのですが、
ローカル環境でMySQLの学習以外の作業もすると思いますので、
MySQLは、使う時に立ち上げて、使い終わったら、停止しておくのが良いと思います。
再起動はこれ。
$ mysql.server restart

MySQL のステータス確認
次のように入力して、エンターキーを押します。

$ mysql.server status
起動している場合はこのように表示されます。
SUCCESS! MySQL running (13035)

停止している場合はこのように表示されます。
ERROR! MySQL is not running

command not foundは基本的にNGなのでその時はがんばること。

OpenCVで画像の編集などを学んでみようとしている

openCVを使って手元の画像をちょっとだけ編集などしてみました。

  • 画像の切り取り
  • 画像の色反転
  • 画像から顔を認識するなど

はMatplotlibを利用することですんなりと動かすことができた。 ファイル入力 → 画像から顔を認識し四角で囲む → 編集後の画像を画像として出力する これは簡単にできました。

今回は画像の読み込みと簡単な加工についてです

import cv2
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

今回使うのは上記のライブラリを利用しました。

  • openCVを利用。(それはそう。画像だもの)
  • 画像は行列データを含むことがあるっぽいのでnumpy
  • 画像の出力などで利用するのでmatplotlibを

img = cv2.imread('misc/cat.jpeg') 画像の読み込みはopenCVの内部関数'imread'を使い引数に画像を渡してあげるだけで読み込みます。

type(img)
img.shape

などとしてみて画像について確認してみるのも良いですね。

plt.imshow(img) 読み込んだ画像の出力では maplotlibのimshowを使います。 しかしこの状態では画像の色などが想定しているものと違うはずです(後述)

img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)

そこで cvtColor関数にいろを変えるようにお願いします。 これで正常に出力が可能になります。

この原因は OpenCVとMatplotlibの画像を読み込んだ際の色合いの表し方がRGB,なのかBGRなのかというしょうもないもんだいなのですがこれを忘れると画像から生気がきえてしますので注意が必要そう。 (これに気づかず手元でいろいろしたけどググったらすぐに解決した、悲しい)

plt.subplot(1,2,1)
plt.imshow(img)
plt.subplot(1,2,2)

plt.imshow(resizedImg)

このような感じに処理すると一つの描画領域に複数の画像を表示することが可能です。

# gray scale 
grayedImg = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)

plt.subplot(1,2,1)
plt.imshow(img)

plt.subplot(1,2,2)
plt.imshow(grayedImg)
plt.gray()

cvtColor関数に'COLOR_RGB2GRAY'を利用すると画像がグレーアウトします。 グレーアウトした画像が欲しい時は便利かも(使う時があるのだろうか)

プログラミング初心者にGitを伝える

TL;DR

プログラミングを覚えこれからどんどん圧倒的な成長をして行くであろう、 モチベーション300%のエンジニアにgitを紹介したい


注意事項

あくまでgitの紹介に重きを置いているのですでにGit使っている人にはお勧めできません、 スッとブラウザバックをお勧めします。

その他・紹介内容にご指摘、提案、補足などあればコメントいただきたいです


余談


スピリチュアルプログラミングとは

コードの持つ本来の力を高める方法論

  • 一心不乱に祈ることでバグ発生率を抑える。
  • バグは作っていない。 俺が最強
  • 徹夜をすると絶対動くんだ。

マインドセット is 大事


開発しんどい

まぁ。ぶっちゃけしんどいときもあります。

  • 自分が実装したいことできないとか。
  • 作りたい機能の設計がうまくできないとか。
  • 実装できたはずなのに動かないとか
  • わけわからないバグとか
  • 意図してないバグとか
  • バグとか
  • bugね。
  • bug
  • bug..bug...bug.....

Debugしましょうね!!!


エンジニアとして業務に触れて察したこと

やればできる。!!

がんばれば、ちゃんと実装できる →楽しいです。 →しんどい分達成感半端ないなぁと。

わかんなかったら近くのできる人に聞けばいいんですよ。 近くのエンジニアはじゃないよ ><!!


agenda

  • git? 何それおいしいの??
  • git使わなきゃダメなの?
  • Let's git !

git? 何それおいしいの??

'\ ok Google! /' git とは


gitは、プログラムのソースコードなどの変更履歴を記録・追跡するための
分散型バージョン管理システムである。

gitでは、全履歴を含んだリポジトリの完全な複製が作られる。
したがって、ネットワークにアクセスできないなどの理由で
中心リポジトリにアクセスできない環境でも、
履歴の調査や変更の記録といったほとんどの作業を行うことができる。
これが「分散型」と呼ばれる理由である。 
                                    from / wiki

え!!!なに!!!!どういうことなの????


難しいことは置いといて。┐(´-`)┌


git is 分散型バージョン管理システム

いいっしょ?良さそうでしょ??? 集中型より聞こえが良いでしょ??????

分散型: Aくん、Bくん、cちゃんがお互いにメモとりあうのと
集中型: Aくんが責任持ってメモをとる

→ Aくんのノートきえたらやばくない????????

いろいろあるんですが。分散型 is Good!!!


git流行ってます

・ git使ってない企業ってあるんですか?
・ 今時git使えないとエンジニアとしてやばいっすよ(偏見)

git 使いましょうよ!!!!!


ほら。ね。流行ってるでしょ。

  > 青git、赤svn、黄色subversion  

gitとは

  • gitめりっと
  • gitの構造理解など。
  • team開発
  • どうしたら慣れて行くのか


メリット


メリット(特徴?)

  • コーディングしている時にSaveができます
    • Pok○m○nのレポートみたいなね。
    • D○rag○nQuestの協会でのお祈りみたいな

gitを使うと好きなセーブポイントからもどれます。

  • ゲームのセーブストックみたいな感じ?
    • メインのセーブデータ:A
    • Aデータ引き継いで別キャラにする: B
    • (A or B)データ引き継いでネカマする用のキャラ

gitの概念


gitの概念

  • Gitってどうなってんの?
  • branch(枝分かれ)というものがある

→みてみましょう。


git とは

localのgit

なんかわかりにくいのでポップなかんじにしましょうか→


ポップなGit

gitの構造について


gitの構造について


branch(枝分かれ)


team開発


gitを使うチーム開発

  • Github
  • bitbucket
  • Gitlab
  • 自前のGitサーバー

等々ありますが、今回はGithubを利用します。


gitとgithub

gitとgithub(リモートリポジトリ)


どうしたら慣れて行くのか


Git、Githubを使うしかない


gitの教材など。

まとめさいと

【初心者向け】Git入門スライドまとめ|基礎から実践まで学びつくそう

Git 教材 Git 教材


Let's git


git config settings

これしとくと便利っぽいので

$ git config --global user.name "<NAME>"
//usernameはWhen,Who,Whatの情報になるので
//GithubAccountName or 本名がおすすめ
$ git config --global user.email "<EMAIL>"
 //gitのusername && email の設定
$ git config --global color.ui auto
 //なんか見やすくしてくれるので

$ git config --global user.name 
$ git config --global user.email 
 //->ちゃんとひょうじされていればおk

git command not found ってなる人は win : https://www.granfairs.com/blog/cto/install-git-for-windows https://www.granfairs.com/blog/cto/install-sourcetree-for-windows

mac: https://qiita.com/takm-reason/items/1c368d14a76cf1ccedde


では実際に始めましょう

  • まずは作業用のRepoを用意したので下記の準備をしてください
$ cd ~/<dir name>

$ git clone https://github.com/fumihumi/git_practice_repo.git

  //githubにsshkeyを登録している場合はっsshを使ってください

$ git branch
// masterを確認
$ git branch <your name> // branch作成
$ git checkout <your name> //Branchの移動
$ git branch
// 変わってることを確認
$ mkdir <your name>
$ cd <your name>
  // ex:$ git checkout -b fumihumi
  //    $ mkdir fumifumi
  //    $ cd fumihumi

ここから先 \<fumihumi> → yourname に読み替えてください。(疲れたw)

touch sample fumihumi.html

コピペ用


$ git add fumihumi.html
作業ツリーのファイル
→ 右側の `Hunkをステージへ移動`

git add


$ git commit -m 'fumihumi.htmlの作成とテンプレの作成'
$ 左上のコミットからメッセージ入力してコミットボタン

git commit


基本的な操作はこれだけです。

for (var gitExp = 1; gitExp < '覚えるまで'; gitExp++){

-> [Bootstrap入れましょう](https://gist.github.com/fumihumi/54ca0eda54be625ca554b4dc355904f1#file-2-bootstrap)

Add -> Commit

→ [bootstrap使ったボタン置いてみる?](https://gist.github.com/fumihumi/54ca0eda54be625ca554b4dc355904f1#file-3-bootstrap4)

Add → Commit

→ [ButtonClickでAlertしてみて](https://gist.github.com/fumihumi/54ca0eda54be625ca554b4dc355904f1#file-buttonclick-alert)
//javascriptコメントアウトの構文も調べて見てね  : ヒント(ES6 ,AllowFunctions, Variables Scope)

Add → Commit

}

基本的には上記のような add -> commit が基本原則。

gitの構造について

時々右から左のようなコマンドもありますが。うまく使ってればそう必要にならないので今回は深く説明しないので口頭で。

$git reset --hard HEAD^
$git reset --mixed HEAD^ (--softもあるよ)

$git rm <file name>

github

github


git clone をしているとCloneした場所がリモートリポジトリになっています。
→みんなのRepoはgithub.com/fumihumi/git_practice_repo,を見ています。

$ git remote -v 
で確認できるので見て見てください。

このリモートリポジトリにさっきまで編集していた,
Commitを反映することを'Push'
リモートにある変更を受け取ることをpullと言います。

$ git push  

git push --set~~~~~みたいなメッセージでたらそれに従ってください


github上でリポジトリ管理者(ここではfumihumi)にコードを受け入れてもらおう!(PullRequest!)


PRが作られたら -> きっとコメントやなにかをもらうかもしれない → masterBranchにまーじ(統合)されたら開発しゅうりょー \(^o^)/

目を通して見ると雰囲気わかると思います。 英語のコメントや issue で頻出する略語の意味 (FYI, AFAIK, ...) コードレビューを受けるのがつらくなったときは コードレビューの辛さと大切さ コードレビューの際に気をつけること


今回は自分のRepoを使い’git clone’しましたが、じっさいに行う際はこんな感じです↓


## 先にGithubのRepoを作っておく

$ git init #ローカルのgitリポジトリ作成

$ git remote add  "alias" URL (remote repo の登録)
$ git remote -v

$ git status (states of this directory-tree )
$ git add ~~~ (adding staging area)
$ git commit -m'commit message' (commiting file && message)

git push (to pushiing remote repos)

branchの考え方


その他, コマンドを知っているともっとgitが便利に使えます。

git log
git status
git stash
git reset
git rm
git revert
git rebase
git show
git branch
git checkout
git log --oneline --decorate --graph

今回触れていないコマンドもいっぱいあるよ!↓↓↓↓↓ GIT CHEAT SHEET

意外と知らない? Gitコマンド 100本ノック


Gitはとても奥が深いです。実際に触って苦しんでいるときに成長します


Let's gït lífè


readmeにおける画像出展

TKRさんQiita:引用よく使うGitコマンドを図解

あさちゅんのブログ

A successful Git branching model

A successful Git branching model(翻訳版)

こっそり始めるGit/GitHub超入門(終)

はじめようgit

いつやるの?git