devlove2012-let-yor-test-drive-dev-more

 devlove2012-let-yor-test-drive-dev-more

70e13d9877054026fda46d5a5b53a236?s=128

MOROHASHI Kyosuke

December 16, 2012
Tweet

Transcript

  1. ςετʹ։ൃΛ ۦಈ͍ͤͨ͞ (ג) Ӭ࿨γεςϜϚωδϝϯτ ॾڮګհ @moro ΋ͬͱ

  2. • MOROHASHI Kyosuke • @moro on Twitter and GitHub •

    works at @esminc
  3. None
  4. None
  5. None
  6. ͖ΐ͏࿩͢͜ͱ •ςετΛॻ͜͏ͱͯ͠ɺ͔͑ͬͯ։ ൃ͕ਏ͘ײͨ͜͡ͱɺ͋Γ·ͤΜ? •ςετΛ͍͍ಋ͖໾ʹ͢ΔݟํΛ঺ հ͠·͢

  7. Ͳ͏ͯ͠ςετΛॻ͘ͷ •ͦΕ͕ਖ਼͍͠΍Γํ͔ͩΒ •඼࣭͕޲্͢Δ͔Β •σάϨ࣌ʹ͙͢ؾ͚ͮΔ͔Β

  8. ͡Ό͋ςετΛॻ͘ͷ͸ɺ কདྷͷͨΊʹߴ͍อݥྉΛ ෷͏Α͏ͳ΋ͷͳͷ

  9. http://flic.kr/p/zBdU7 ςετ͸։ൃΛ ۦಈ͢Δ ͓࡞๏ͱ͔ɺ ਖ਼͍͔͠Ͳ͏͔ͱ͔͚ͩͰͳ͘ ։ൃ͠΍͘͢͢Δ

  10. ίʔυΛॻ͘ͱ͖ʹ ΍͍ͬͯΔ͜ͱ

  11. think code run Programming workflow

  12. think code run ίʔυΛॻ͍ͨΒ ಈ͔͍ͨ͠Ͱ͢ΑͶ?

  13. SVO •ॻ͍ͨίʔυ͸ɺ࣮ߦͯ͠Έ ͳ͍ͱΘ͔Βͳ͍ •ॻ͍ͨΒ͙͢ʹಈ͔ͨ͘͠ͳ Γ·ͤΜ?

  14. ಈ͔͢ if __FILE__ == $0 require 'pp' myobj = MyClass.new(:arg)

    p myobj.do_something pp myobj end ςετ࢖Θͣʹ࣮ߦ͢Δ
  15. ಈ͔͢ % irb -r ./my_class > my_obj = MyClass.new >

    myobj.do_something > myobj ର࿩࣮ߦ؀ڥ΋͋Δ
  16. w͙͢ʹಈ͔ͤΔ wͰ΋΋͏ͪΐͬͱෳࡶ ʹͳΔͱ

  17. ಈ͔͢ if __FILE__ == $0 require 'pp' alice = Person.create(name:

    'alice', age: 24) alisia = Person.create(name: 'alisia', age: 30) bob = Person.create(name: 'bob', age: 18) chris = Person.create(name: 'chris', age: 42) pp Person.name_like('ali') pp Person.younger_than(24) end ΋͏ͪΐͬͱෳࡶͳྫ
  18. ಈ͔͢ $ rails console > alice = Person.create(name: 'alice') >

    alissa = Person.create(name: 'alissa') > bob = Person.create(name: 'bob') > chris = Person.create(name: 'chris') > > Person.name_like('ali') > Person.younger_than(24) ର࿩࣮ߦ؀ڥͰ΋ Ͱ͖Δͱ͍͑͹Ͱ͖Δ
  19. ࣮ߦ݁ՌΛ ݟΔͨΊʹ ඞཁͳ͜ͱ

  20. ಈ͔͢ if __FILE__ == $0 require 'pp' alice = Person.create(name:

    'alice', age: 24) alisia = Person.create(name: 'alisia', age: 30) bob = Person.create(name: 'bob', age: 18) chris = Person.create(name: 'chris', age: 42) pp Person.name_like('ali') pp Person.younger_than(24) end σʔλͳͲͷ४උ લͷσʔλ͕࢒ͬͯͳ͍͔΋֬ೝ͠ͳ͍ͱΠΧϯ
  21. ಈ͔͢ if __FILE__ == $0 require 'pp' alice = Person.create(name:

    'alice', age: 24) alisia = Person.create(name: 'alisia', age: 30) bob = Person.create(name: 'bob', age: 18) chris = Person.create(name: 'chris', age: 42) pp Person.name_like('ali') pp Person.younger_than(24) end ݁ՌΛ໨ࢹ
  22. ಈ͔͢ if __FILE__ == $0 require 'pp' alice = Person.create(name:

    'alice', age: 24) alisia = Person.create(name: 'alisia', age: 30) bob = Person.create(name: 'bob', age: 18) chris = Person.create(name: 'chris', age: 42) pp Person.name_like('ali') pp Person.younger_than(24) end ݁Ռ͕࣮ߦॱʹґଘ ΠνΠνߟ͑ͳ͍ͱ͍͚ͳ͍
  23. ಈ͔͢ if __FILE__ == $0 require 'pp' alice = Person.create(name:

    'alice', age: 24) alisia = Person.create(name: 'alisia', age: 30) bob = Person.create(name: 'bob', age: 18) chris = Person.create(name: 'chris', age: 42) pp Person.name_like('ali') pp Person.younger_than(24) end ݁Ռ͕࣮ߦॱʹґଘ σʔλΛมߋͨ͠Γ͢ΔͱπϥΠ ༨ܭͩͱࢥͬͨ σʔλΛফͨ͠Β ผͷςετͰ ࢖͓ͬͯͨ...
  24. •σʔλͱ͔Λ४උ͠ͳ͍ͱ! •݁ՌΛ໨ࢹ͠ͳ͍ͱ!! •࣮ߦॱʹ΋஫ҙ͠ͳ͍ͱ!!! ͔͠΋ςετ͕૿͑Ε͹૿͑Δ΄Ͳ େมʹͳΔɻ͏΁͐ ςετ࢖Θͣʹ࣮ߦ͢Δ ಈ͔͢

  25. ͦ͜ͰςεςΟϯά ϑϨʔϜϫʔΫͰ͢Α • Arrange : σʔλ΍ίϯςΩετΛ༻ҙ • Act : ͦΕͧΕಠཱʹɺಈ͔ͯ͠

    • Assert : ݁ՌΛࣗಈతʹνΣοΫ͢Δ
  26. ಈ͔͢ ςετͱ࣮ͯ͠ߦ͢Δ describe Person do context '4 people with below'

    do let!(:alice) { Person.create(name: 'alice', age: 24) } let!(:alissa){ Person.create(name: 'alissa', age: 30) } let!(:bob) { Person.create(name: 'bob', age: 18) } let!(:chris) { Person.create(name: 'chris', age: 42) } describe '.name_like' do subject { Person.name_like('ali').map(&:name) } it { should =~ %w[alice alissa] } end describe '.younger_than' do subject { Person.younger_than(24).map(&:name) } it { should =~ %w[bob] } end end end
  27. Arrange: σʔλͳͲΛ ମܥͩͬͯ४උ͢Δ

  28. ribe Person do ntext '4 people with below' do let!(:alice)

    { Person.create(name: 'alice', age: let!(:alissa){ Person.create(name: 'alissa', age: let!(:bob) { Person.create(name: 'bob', age: 18 let!(:chris) { Person.create(name: 'chris', age: describe '.name_like' do subject { Person.name_like('ali').map(&:name) } it { should =~ %w[alice alissa] } end describe '.younger_than' do subject { Person.younger_than(24).map(&:name) } it { should =~ %w[bob] } end
  29. Act: ͦΕͧΕ ಠཱʹಈ͔͢

  30. ibe Person do text '4 people with below' do et!(:alice)

    { Person.create(name: 'alice', age: et!(:alissa){ Person.create(name: 'alissa', age: et!(:bob) { Person.create(name: 'bob', age: 18 et!(:chris) { Person.create(name: 'chris', age: escribe '.name_like' do subject { Person.name_like('ali').map(&:name) } it { should =~ %w[alice alissa] } nd escribe '.younger_than' do subject { Person.younger_than(24).map(&:name) } it { should =~ %w[bob] } nd
  31. Assert: ݁ՌΛ ࣗಈతʹݕূ͢Δ

  32. let!(:alissa){ Person.create(name: 'alissa', age let!(:bob) { Person.create(name: 'bob', age: 1

    let!(:chris) { Person.create(name: 'chris', age: describe '.name_like' do subject { Person.name_like('ali').map(&:name) it { should =~ %w[alice alissa] } end describe '.younger_than' do subject { Person.younger_than(24).map(&:name) it { should =~ %w[bob] } end d
  33. ςετ͕։ൃΛۦಈ͢ΔϙΠϯτ ίʔυͷ࣮ߦΛߏ଄Խ͢Δ • ςεςΟϯάϑϨʔϜϫʔΫ͕ɺίʔυ ࣮ߦΛॿ͚ͯ͘ΕΔ: • ίϯςΩετͷηοτΞοϓ • ಠཱ࣮ͯ͠ߦ •

    ݁Ռͷݕূ
  34. ͜ ͜ · Ͱ ͷ · ͱ Ί ‣ ͪΐͬͱେ͖͍ίʔυΛɺ

    ςετ࢖Θͣʹಈ͔͢ͱେม ‣ ςετΛ࢖͏ͱɺॻ͍ͨίʔυ Λ͙͢ʹɺ҆৺ͯ͠ಈ͔ͤΔ
  35. ΋͏ͪΐͬͱ೉͍͠ ໰୊ʹऔΓ૊Ήͱ͖ Ͳ͏͢Δ? http://flic.kr/p/5xKFpY

  36. ͜Μͳ͜ͱΛ ߟ͍͑ͯΔ͸ͣ •ࣄલ৚݅͸ͲΜͳ͔ͳ? •݁Ռ͸Ͳ͏ͳΕ͹͍͍Μͩ? •Ͳ͏͍͏࡞Γ͕͍͍ͷ͔ͳ?

  37. think code run Programming workflow

  38. think code run Programming workflow ౰ͨΓલ͗ͯ͢Θ͔Βͳ͍͚Ͳ ·ͣɺߟ͍͑ͯ·͢ΑͶ?

  39. wͳʹΛ͢Δ͔ wͲ͏͢Δ͔

  40. None
  41. Ϣʔβͱͯ͠γεςϜʹ ʮͳʹΛʯͯ͠ཉ͍͔͠

  42. ։ൃऀͱͯ͠ ʮͲ͏ʯಈ͔͍͔ͨ͠

  43. ։ൃऀͱͯ͠ ΦϒδΣΫτʹʮͳʹΛʯͯ͠ཉ͍͔͠

  44. ͍··͞ʹ࣮૷͍ͯ͠Δ։ൃऀͱͯ͠ ͜ͷΦϒδΣΫτΛʮͲ͏ʯ࡞Δ͔

  45. ͍··͞ʹ࣮૷͍ͯ͠Δ։ൃऀͱͯ͠ ͜ͷϝιου͸ʮͳʹΛʯ͢Δ͔

  46. ͍··͞ʹ࣮૷͍ͯ͠Δ։ൃऀͱͯ͠ ͜ͷϝιουΛʮͲ͏ʯ࡞Δ͔

  47. ͳʹΛ͢Δ͔Λ ߟ͑ͯ ςετʹॻ͘

  48. ͍ΖΜͳࢹ఺ͰʮͳʹΛʯ͢Δ͔

  49. wϢʔβͱͯ͠γεςϜʹʮͳ ʹΛʯͯ͠ཉ͍͔͠ w։ൃऀͱͯ͠ΦϒδΣΫτʹ ʮͳʹΛʯͯ͠ཉ͍͔͠

  50. Cucumber •ࣗવݴޠ(΋ͪΖΜ೔ຊޠ΋!!)Λ ࢖ͬͯʮͳʹΛʯ͢Δ͔Λॻ ͚Δςετπʔϧɻ •cucumber-jvm͍ͬͯ͏Javaα ϙʔτ΋

  51. None
  52. None
  53. 5%%ϑϨʔϜϫʔΫ •jUnitͱ͔ɺRSpecͱ͔ •։ൃऀͱͯ͠ɺΦϒδΣΫτ ʹԿΛ͍͔ͤͨ͞Λهड़͢Δ

  54. Ϣʔβc։ൃऀ ͱͯ͠ γεςϜc͜ͷΦϒδΣΫτ ʹ ʮͳʹΛʯͯ͠ཉ͍͔͠ߟ͑Δ

  55. ͜ ͜ · Ͱ ͷ · ͱ Ί ‣ ࢲͨͪ͸ߟ͍͑ͯΔ

    ‣ ʮͳʹΛʯ͢Δ͔ͱʮͲ͏ʯ ࡞Δ͔Λ෼͚ͯߟ͑Δ ‣ ʮͳʹΛʯ͢Δ͔Λςετͱ ͯ͠ॻ͘
  56. Α͋͘Δײ͡ͷ ݕࡧϑΥʔϜ

  57. wΑ͋͘ΔݕࡧϑΥʔϜ w໊લͷ෦෼Ұக w೥ྸͰͷൺֱ wझຯͰͷݕࡧ Person - name (str) - age

    (int) Hobby - name (str) Interest - person_id(fk) - hobby_id(fk) 1 * * 1
  58. ߟ͑Δ • ActiveRecord ͷscopeΛఆٛ ͠·͠ΐ͏ • (࣮͸΋͏લͷྫͰͰ͖ͯ·ͨ͠ :-) ) ·ͣ͸؆୯ͳͱ͜Ζ͔Β

  59. describe Person do context '4 people with below' do let!(:alice)

    { Person.create(name: 'alice', age: 24) let!(:alissa){ Person.create(name: 'alissa', age: 30) let!(:bob) { Person.create(name: 'bob', age: 18) } let!(:chris) { Person.create(name: 'chris', age: 42) describe '.name_like' do subject { Person.name_like('ali').map(&:name) } it { should =~ %w[alice alissa] } end describe '.younger_than' do subject { Person.younger_than(24).map(&:name) } it { should =~ %w[bob] } end end end
  60. class Person < ActiveRecord::Base scope :name_like, ->(name) { where("#{table_name}.name LIKE

    ?", "#{name} } scope :younger_than, ->(age) { where("#{table_name}.age < ?", age.to_i) } end
  61. ߟ͑Δ •ྫ͑͹: είʔϓ໊͸... `has_at_least_one_hobby'. •hobbyΛ഑ྻͰऔΔͱ͍͍͔ͳ? `%w[programming BBQ travel]` . •ͱɺߟ͑ͨ͜ͱΛςετʹॻ͘

    hobby͸Ͳ͏͠Α͏
  62. ribe Person do ntext '4 people with below' do #

    snip describe '.has_at_least_one_hobby(hobbies)' do let(:hobbies) { %w[programming BBQ travel] } subject(:people) do Person.has_at_least_one_hobby(hobbies) end end d ͏ʔΜɺ໊લ͕௕͗͢ΔɺΑ͏ͳ...
  63. ߟ͑Δ • தؒςʔϒϧ'interests'ͬͯͷ͕͋Δ! • Ruby ͩͱ `#any?`ϝιου͕͋Δͳɻ • ͡Ό͋͜ΜͳͷͰͲ͏͔: Person.interest_in_any(ho

    bbies) ΋ͬͱྑ໊͍લ͸ͳ͍͔ͳ
  64. describe Person do context '4 people with below' do #

    snip describe '.interest_in_any(hobbies)' do let(:hobbies) { %w[programming BBQ travel subject(:people) do Person.interest_in_any(hobbies) end end end end Αͦ͞͏!
  65. ߟ͑Δ • ֬ೝ͢ΔͨΊʹϢʔβ2ਓҎ্΄͍͠ • ৚݅ʹϚον͢Δਓͱɺ͠ͳ͍ਓͱ • ͜͏͍͏ͷΛbefore {} (RSpec)΍ setup

    {} (test/unit)ʹॻ͘ ࣄલ৚݅ͳΜ͚ͩͬ
  66. describe '.interest_in_any(hobbies)' do let(:hobbies) { %w[programming BBQ travel] } before

    do hobbies.each do |hobby_name| Hobby.create!(name: hobby_name) end Hobby.create!(name: 'baseball') alice.hobbies << Hobby.where(name: 'travel'). bob.hobbies << Hobby.where(name: 'programmi chris.hobbies << Hobby.where(name: 'baseball' end subject(:people) { Person.interest_in_any(hobbi end
  67. ߟ͑Δ •ͪΌΜͱɺϚον͢Δ͸ͣͷ ਓ͚ͩϚονͯ͠ΔΑͶ...? ͳʹΛݕূ͢Δ͔

  68. Hobby.create!(name: hobby_name) end Hobby.create!(name: 'baseball') alice.hobbies << Hobby.where(name: 'travel') bob.hobbies

    << Hobby.where(name: 'programm chris.hobbies << Hobby.where(name: 'baseball end subject(:people) { Person.interest_in_any(hobb it { should =~ [alice, bob] } end
  69. http://flic.kr/p/4rxk3X ࠷ॳͷΰʔϧ͕ ݟ͑ͨ

  70. describe '.interest_in_any(hobbies)' do let(:hobbies) { %w[programming BBQ travel] } before

    do hobbies.each do |hobby_name| Hobby.create!(name: hobby_name) end Hobby.create!(name: 'baseball') alice.hobbies << Hobby.where(name: 'travel').first bob.hobbies << Hobby.where(name: 'programming').first chris.hobbies << Hobby.where(name: 'baseball').first end subject(:people) { Person.interest_in_any(hobbies) } it { should =~ [alice, bob] } end ͜ͷςετ͕௨ͬͨΒҰ൪؆୯ͳਖ਼ৗܥ͸Ͱ͖ͨ
  71. ͜ ͜ · Ͱ ͷ · ͱ Ί ‣ ߟ͑ͨ͜ͱΛςετʹॻ͘

    ‣ ςετʹॻ͔ΕͨίʔυΛ ݟͯ೰ΜͩΓۛຯͨ͠Γ͢Δ ‣ ςετ͕௨ΔΑ͏ʹίʔυΛॻ͘
  72. None
  73. ߟ͑Δ •Railsͩͱೖྗ஋͸จࣈྻͷ Hashͱͯ͠औΔͷ͕Ұൠత • ϑΥʔϜΦϒδΣΫτͱ࣮ͯ͠૷͢Ε ͹Αͦ͞͏!! • PeopleQueryͱݺ΅͏ ৄࡉݕࡧ

  74. require 'spec_helper' describe PeopleQuery do include_context \ '4 people: alice(24),

    aliass(30), bob(18), chris(42)' describe '.new(name_like: "ali", younger_than: 25)' do let(:query) { PeopleQuery.new(name_like: 'ali', younger_than: 25) } subject { query.people } it { should == [alice] } end end
  75. ߟ͑Δ PeopleQueryͷAPI • ίϯετϥΫλͰɺHashͰෳ ਺ͷ৚݅ΛऔΓ • PeopleQuery#people Ͱ ActiveRecord::Relation Λฦͤ

    ͹Αͦ͞͏
  76. require 'spec_helper' describe PeopleQuery do include_context \ '4 people: alice(24),

    aliass(30), bob(18), describe '.new(name_like: "ali", younger_than let(:query) { PeopleQuery.new(name_like: 'ali', younger_than: 25) } subject { query.people } it { should == [alice] } end end Act
  77. require 'spec_helper' describe PeopleQuery do include_context \ '4 people: alice(24),

    aliass(30), bob(18), describe '.new(name_like: "ali", younger_than let(:query) { PeopleQuery.new(name_like: 'ali', younger_than: 25) } subject { query.people } it { should == [alice] } end end Arrange
  78. describe PeopleQuery do include_context \ '4 people: alice(24), aliass(30), bob(18),

    describe '.new(name_like: "ali", younger_than let(:query) { PeopleQuery.new(name_like: 'ali', younger_than: 25) } subject { query.people } it { should == [alice] } end end Assert ͜Ε͕࣍ͷΰʔϧ
  79. http://flic.kr/p/4rxk3X ࣍ͷΰʔϧ΋ ݟ͑ͨ

  80. require 'spec_helper' describe PeopleQuery do include_context \ '4 people: alice(24),

    aliass(30), bob(18), chris(42)' describe '.new(name_like: "ali", younger_than: 25)' do let(:query) { PeopleQuery.new(name_like: 'ali', younger_than: 25) } subject { query.people } it { should == [alice] } end end FAQ: ςετ͸ ͲΕ͘Β͍ॻ͘΂͖? A; ΰʔϧͩͱࢥ͏ͱ͜Ζ·Ͱॻ͘ͱΑ͍
  81. ͜ ͜ · Ͱ ͷ · ͱ Ί ‣ ೉͍͠໰୊΋ɺ·ͣʮͳʹΛʯͯ͠

    ཉ͍͔͠Λߟ͑Δ ‣ ςετΛ࢖ͬͯɺΰʔϧΛઃఆ͢Δ
  82. ߟ͑Δ • Person.interest_any?()Λ͏·͘ ϥοϓͰ͖ͳ͍͔ • Railsͷ࢓૊ΈΛߟ͑Δʹ: • ίϯτϩʔϥ͔Βݺ͹Εͦ͏ • ͦͷ࣌͸ύϥϝʔλ͸จࣈྻͰ͖ͦ͏

    hobby;ͨͨͼ
  83. describe '.new(name_like: "ali", hobbies: "baseball")' d include_context \ 'there are

    4 hobbies: programming, travel, BBQ and b let(:query) { PeopleQuery.new(name_like: 'ali', hobbies: 'baseball travel') } before do alice.hobbies << Hobby.where(name: 'BBQ') alissa.hobbies << Hobby.where(name: 'baseball') end subject { query.people } it { should == [alissa] } end 3ͭͷ৚݅Λ૊Έ߹Θͤ͸ɺ ͜Μͳ;͏ʹಈ͍ͯʮ΄͍͠ʯ
  84. cribe '.new(name_like: "ali", hobbies: seball")' do nclude_context \ 'there are

    4 hobbies: programming, travel, BBQ baseball' et(:query) { PeopleQuery.new(name_like: 'ali', hobbies: 'baseball travel') efore do alice.hobbies << Hobby.where(name: 'BBQ') alissa.hobbies << Hobby.where(name: 'baseball') nd ubject { query.people }
  85. class PeopleController < ApplicationController def index @query = PeopleQuery.new(params[:q]) @people

    = @query.people end end
  86. ͜ ͜ · Ͱ ͷ · ͱ Ί ‣ ࿅Δͱ͖͸ɺ࢖ΘΕํ΋

    ߟ͑Δ Ϣʔβͱ͔ϑϨʔϜϫʔΫͱ͔ ‣ ςετͰͷ"DUͱɺϓϩ μΫτίʔυ͸Α͘ࣅΔ
  87. ςετۦಈ։ൃͷਐΊํ • ख͕͚͍ͯΔΦϒδΣΫτͷৼΔ෣͍Λ ߟ͑Δɺϝιου໊ɺҾ਺ɺ໭Γ஋ͳͲ • ؔ࿈͢ΔσʔλͳͲɺৼΔ෣͏ͨΊͷࣄ લ৚݅Λߟ͑Δ • γϯϓϧͳݕূΛॻ͘ •

    ಈ͔͢
  88. ςετ͕։ൃΛۦಈ͢ΔϙΠϯτ τϥΠΤϥʔ͢Δ৔ʹͳΔ • ίʔυΛॻ͍ͯɺಡΜͰɺͦͯ͠ߟ͑ Δ৔ʹͳΔɻ • νʔϜϝϯόʔʹ΋ɺϗϯϞϊͷίʔ υͰ૬ஊͰ͖Δɻ • ࣮ߦ·ͰͰ͖Δ!!

  89. think code run Programming workflow ςετ͸ɺ࣮ߦ͢Δ͜ͱͱߟ͑Δ͜ͱͱɺ ྆ํΛαϙʔτͯ͠։ൃΛۦಈ͢Δ

  90. Ԟ͕ਂ͍ ྑ͘΋ѱ͘΋ • ͍ΖΜͳςΫχοΫ͕͋Δ • ϑΣΠΫ΍ࡾ֯ଌྔ • σʔλੜ੒ύλʔϯ • ϞοΫ΍ελϒ

    • assert͔Βॻ͘͜ͱ΋Α͋͘Δ • ͪΐ͏೉͍͠ϩδοΫͷςετͱ͔
  91. ૉৼΓॏཁ •͚ͬ͜͏୾ྗ͕͍Δ • ࣮૷ͷৄࡉΛߟ͍͑ͨؾ࣋ͪΛ ͙ͬͱת͑Δ •ྔ͸࣭ʹసԽ͢Δ

  92. None
  93. None
  94. None
  95. ςΫχοΫΑΓ΋ େࣄͳ͜ͱ ࠶ܝ

  96. http://flic.kr/p/zBdU7 ςετ͸։ൃΛۦಈ͢Δ • run: ࣮ߦΛߏ଄Խ͢Δɻ • think: τϥΠ&Τϥʔͷ৔ʹͳΔɻ • ΋ͪΖΜɺϦϑΝΫλϦϯάΛॿ͚ͨΓ

    σάϨͷ๷ࢭʹ΋໾ཱͭ
  97. think code run Programming workflow

  98. think code run Programming workflow ໰୊͕೉͚͠Ε͹ͦΕ͚ͩɺ ಈ͔͠ͳ͕Β࡞ΕΔςετ͕໾ʹཱͭ

  99. Thank you for listening. - May it be a light

    for you in dark places, when all other lights go out. - May it be a light for you in dark places, when all other lights go out.