Categories
การพัฒนาซอฟท์แวร์

เปิด UML class diagram ใน IntelliJ

กด Ctrl+Alt+U เพื่อเปิด UML class diagram

Categories
Productivity

Tips ~ ทำงานง่ายขึ้น

  1. เก็บโทรศัพท์มือถือไว้ในลิ้นชัก โดยยึดหลัก 3 ข้อนี้
    • ไม่ให้มองเห็น โดยการเก็บไว้ในลิ้นชัก
    • ไม่ให้ได้ยิน โดยเปิด Do not disturb
    • ไม่ให้เข้าถึง เช่น เก็บไว้ไกล ๆ หรือล็อคลิ้นชัก
  2. เลือกรายการใน Todo list มา 3-5 รายการที่สำคัญที่สุด เขียนใส่กระดาษโน้ต เรียงลำดับความสำคัญ เริ่มทำรายการแรก
  3. ใช้ Software มาช่วย Block ไม่ให้เราเข้าเว็บ เช่น Facebook ในเวลาทำงาน เช่น Block Site ใน Google Chrome และควรใช้บนมือถือด้วย
  4. ระหว่างทำงานถ้ามีอะไรมาดึงความสนใจหรือเราวอกแวกไปคิดเรื่องอะไร ให้จดใส่กระดาษไว้ งานเสร็จจะกลับมาดูก็ได้
  5. ออกไปเดินซักนิดก่อนเริ่มทำงานยาก
Categories
OS

เพิ่มพื้นที่บน macOS

สำหรับตัวเอง ใคร search มาเจอก็เอาไปเลือกใช้เองนะครับ ไฟล์อะไรหายไม่รับผิดชอบนะ

  1. clear cache Homebrew
    • brew cleanup -s
    • rm -rf $(brew –cache)
  2. clear cache Gradle
    • rm -rf $HOME/.gradle/caches/
    • ในแต่ละโปรเจค ./gradlew cleanBuildCache
  3. เลือกลบ cache ใน ~/Library/Caches ที่เคลียร์ได้ เช่น
    • GoLand20xx.x
    • IntelliJIdea20xx.x
    • JetBrains
    • Yarn
    • Google/Chrome
    • Google/AndroidStudioX.X
    • PhpStormXXXX.X
    • PyCharmXXXX.X
    • CocoaPods
    • com.apple.dt.Xcode <– Xcode.app Cache
  4. ~/Library/Developer/Xcode/DerivedData/Runner-xxxx
  5. ~/Library/Developer/Xcode/Archives/xxxxxx
  6. ~/Library/Containers/com.tinyspeck.slackmacgap/Data/Library/Application Support/Slack/Cache
  7. ~/Library/Application Support/Code/Cache
Categories
ข้อคิดดีๆ

แค่เรียนรู้ตลอดเวลายังไม่พอ

ปีนี้มีทั้งช่วงที่ทำแต่งานจนไม่เวลาเรียนรู้สิ่งใหม่ ช่วงที่ว่างและเรียนคอร์สออนไลน์มากมาย และช่วงนี้ที่ทำงานเยอะแต่หาเวลาเรียนรู้สิ่งใหม่ ๆ ทุกวัน

พบว่าการเรียนรู้เยอะ ๆ ก็ไม่ได้มีประโยชน์เท่าไหร่ ได้แค่รู้ ต้องนำความรู้ไปใช้ด้วย เพื่อที่จะรู้จริง รู้ลึก รู้ปัญหา รู้ที่มา จนเข้าใจและทำเป็น ไม่ใช่แค่จำเค้ามาพูดต่อ

แต่การทำงานเยอะโดยไม่ได้เรียนรู้สิ่งใหม่เลยนั้นก็แย่พอกัน ไม่รู้สึกว่าทำงานได้ดีขึ้นเลย ใช้แค่สิ่งที่เคยรู้มา บ้างก็คิดเอาเอง ทั้ง ๆ มีเครื่องมือหรือวิธีที่ดีกว่าแต่เราไม่รู้ เราก็ไม่พัฒนา

ต้องเรียนรู้อยู่เสมอ และต้องนำความรู้ไปใช้จริงด้วย ไม่อย่างนั้นไม่มีประโยชน์เท่าไหร่

Categories
การตลาด

[สรุป] ทำ Marketing สำหรับ Mobile app ให้รุ่ง

ในยุคนี้มี app มากมายไปหมด จะทำ marketing strategy ยังไงให้ดึงดูดใจ และ Hook ให้กลุ่มเป้าหมาย download แอพของเรา

เนื้อหา

ตอนนี้ผู้คนอ่าน ดู และฟังสิ่งต่างๆ ด้วยเวลาที่สั้นลง เพราะข้อมูลในแต่ละวันมีมากขึ้น เราจะทำยังไงให้ดึงดูด หรือสร้างความสนใจให้นานพอที่จะดาวน์โหลดหรือจ่ายเงินซื้อสินค้า

  • Screenshots ทำให้เค้าชอบและอยากใช้ อาจจะแสดงหน้าจอที่แสดงความเจ๋ง คุณค่าสูงสุดที่แอพให้กับเค้า หรือ feature ที่สำคัญที่สุด
  • Videos แสดงให้เห็นว่าจะใช้ในสถานะการจริงได้ยังไง ความสำคัญอยู่ที่เรื่องที่เล่าเพื่อให้เค้าอิน
  • Infographic ใช้รูปคุณภาพสูง เพื่ออธิบายคุณค่าสูงสุดที่โดดเด่น แตกต่าง ที่โน้มน้าวเค้าได้

ที่สำคัญอย่าลอกคนอื่น เพราะไม่มีอะไรดีที่สุดกับทุกงาน จงลงทุนกับการสร้างสรรค์ เพื่อให้ลูกค้าจำแบรนด์ของเราได้

และที่สำคัญมากคืองานต้องสดใหม่และอัพเดตอยู่เสมอ บอกให้เค้ารู้ถึงกำหนดปล่อย feature ใหม่ก็ได้ และถ้ากลายเป็น viral ในทางบวกจนมีการแชร์ต่อจะถือว่าประสบความสำเร็จ

การสื่อสารกับผู้รับสาร

เก็บเกี่ยวทุก feedback และข้อมูลจากลูกค้า เป็นสิ่งสำคัญมากสำหรับ MVP (minimum viable product) ทั้งปรับ Product และ Workflow

การปรับกลยุทย์หลังจากได้ข้อมูลมาเป็นเรื่องปกติ แต่ต้องมี metrics ที่โปร่งใสและมาประสิทธิภาพ จากนั้นแปลผลให้ดี เพื่อนำมาสู่ไอเดียใหม่ ๆ

หัวใจของ marketing คือการเข้าใจลูกค้า สื่อสารให้มาก เพราะเราไม่สามารถรู้ทุกอย่างจากลูกค้าไม่กี่คน และสำคัญมากที่ต้องดูพฤติกรรมแฝงด้วย ดูให้กว้างและลึกที่สุด

Social Media เป็นสื่อสำคัญระหว่างเรากับลูกค้า ต้องใส่ใจ ให้เวลา ให้ลูกค้ารู้สึกถึงปฏิสัมพันธ์ของทั้ง 2 ทาง ไม่ใช่ไม่ตอบสนอง ให้เค้ารับรู้ถึงการสื่อสารกับ “คน” ไม่อย่างนั้นเค้าจะหนีไป   –ก็เหมือนกับชีวิตจริง

จะดีมากถ้าลูกค้าให้ feedback ผ่านแอพได้ใน click เดียว

ชื่อและ Logo

นี่อาจเป็นสิ่งที่เราให้ความสนใจมาก แต่อย่าให้มันหลอกเรา จนลืมสนใจปฏิสัมพันธ์ระหว่างลูกค้า

ชื่อที่เป็นการเล่นคำกำลังได้รับความนิยม(อาจเป็นเพราะชื่อทั่วไปมีคนใช้หมดแล้ว) แต่ระวังว่าลูกค้าต้องอ่านออกทุกคน ออกเสียงได้ง่าย จำได้ง่าย   –ชื่อที่ดีคิดยากแต่คุ้ม

ไม่ต้องคาดหวังถึงขั้นลูกค้าจะวาด logo ของเราได้ แค่เห็นแล้วจำได้ ไม่ต้องยัดอะไรลงไปเยอะแยะ ยังมีงานส่วนอื่นให้ยัดไอเดียอีกเยอะ

ทำให้รู้สึกตื่นเต้น

ทุกวันนี้แอพเยอะทำให้ผู้คนรู้สึกชินกับการสื่อสารแบบต่าง ๆ แล้ว ต้องทำให้เค้าสนใจให้ได้ การทำให้เค้าพูดถึง และเป็น word of mouth บน Social Media ควรเป็นเป้าหมาย

ส่งมอบคุณค่า และทำให้ชัดเจน

ผู้คนคาดหวังว่า app ต่าง ๆ จะแก้ปัญหาของเค้าได้ เราต้องสื่อสารว่า app เราดีที่สุดที่เค้าตามหา เราควรสื่อสาร product positioning ออกไปได้ในประโยคเดียว ต้องทำให้เค้าสนใจทันทีที่เห็น เพราะเรามีโอกาสไม่มากนัก

จำเป็นต้องระบุกลุ่มเป้าหมาย ใครต้องการ app ของเรา? ทำไมเค้าถึงต้องการ? จะอธิบายพวกเค้าอย่างไร? และที่สำคัญ เราแตกต่างจากคนอื่นอย่างไร? ทำให้ถูกต้องในเวลาที่เรายังมีโอกาสทำได้

ต้องให้ข้อมูลในครั้งเดียว พอเค้าโดน hook ค่อยให้รายละเอียด

ทำ SEO ให้ถูกพบได้ง่าย หา keywords, sentences ที่เค้าใช้ และทำ #hashtags บน Social Media ด้วย

Categories
Uncategorized

เราอยู่ในยุคที่ใคร ๆ ก็ประสบความสำเร็จอย่างสูง และมากกว่าคนอื่นได้ง่าย ๆ

ยุคนี้ ใคร ๆ ก็เข้าถึงข้อมูลได้
ยุคนี้ ใคร ๆ ก็เรียนสิ่งที่อยากเรียนได้
ยุคนี้ ใคร ๆ ก็เข้าถึงแหล่งเงินทุนได้
ยุคนี้ ใครอยากเป็นอะไร สามารถเป็นได้หมด
ยุคนี้ ไม่มีคำว่าไม่รู้ ทำไม่ได้

แต่ทำไมหลาย ๆ คนไม่เข้าใกล้คำว่าประสบความสำเร็จเลย

เราคาดหวังจะประสบความสำเร็จในเรื่องใดในชีวิต เราย่อมรู้ดี

แต่ เรารู้หรือไม่ว่าเราต้องทำอะไรบ้างเพื่อเป้าหมายนั้น
เราลงทุนไปกับสิ่งนั้นบ้างหรือเปล่า

  • เราอยากดูดี อยากลดความอ้วน แต่ไม่มีเวลาออกกำลังกาย ไม่มีเวลาทำอาหาร
  • เราอยากก้าวหน้าในหน้าที่การงาน แต่ไม่มีเวลาเรียนรู้เพิ่มเติม
  • เราอยากอยู่ในสังคมที่ดี แต่ถูกรายล้อมไปด้วยคนเห็นแก่ตัว ขี้อิจฉา ขี้นินทา
  • อยากทำธุรกิจ แต่ไม่มีเงิน ไม่มีคอนเน็คชั่น ไม่มีคนที่จะช่วยทำ

ดูเหมือนชีวิตไม่ได้ง่ายอย่างที่ว่ามาในตอนต้น
และไม่ใช่ทุกคนจะโชคดี มีเวลาทำสิ่งที่ต้องการ ได้เจอสิ่งดีๆ คนดีๆ เสมอไป

ชีวิตมันยาก หรือเราเองที่ไม่ทำให้มันง่ายขึ้น ?

เรายังนั่งส่อง facebook, instagram ชาวบ้านวันนึงหลายชั่วโมงหรือเปล่า ?
เรายังดูละครหลังข่าวทุกวัน คุณยังเม้าท์มอยเรื่องชาวบ้านอยู่หรือเปล่า ?
เรายังดื่มน้ำหวาน น้ำชง น้ำอัดลม แอลกอฮอล์ อยู่หรือเปล่า ?

ดูเหมือนว่าเรามีแต่สิ่งที่ต้องการในชีวิต
แต่ถ้าให้ตอบตัวเองอย่างซื่อสัตย์

เรา “เลือก” ทำในสิ่งที่ดีที่สุดแล้วหรือยัง?
เรา “ลงมือทำ” ในสิ่งที่ดีที่สุดแล้วหรือยัง?

ถ้าเราไม่นั่งส่อง facebook, instagram ชาวบ้าน
ไม่ดูละครหลังข่าวทุกวัน ไม่ใช้เวลาเม้าท์มอยเรื่องชาวบ้าน

ลอง ลงเรียนออนไลน์  ไปสัมมนา  อ่านหนังสือ ฟังพอดแคสต์ หาความรู้ใหม่ๆ ทุกวัน
ลอง เอาเวลาไปออกกำลังกายเล็กๆ น้อยๆ
ลอง ใช้เวลาสร้างความสัมพันธ์ที่มีคุณภาพ กับคนที่มีคุณภาพ

การ “เลือก” และ “ลงมือทำ” ในสิ่งที่ดี สิ่งที่มีคุณภาพนั้นยาก

แต่การ “หยุด” พฤติกรรมหรือนิสัยที่ไม่ดี นั้นยากไม่แพ้กัน
การหยุด ดื่มน้ำหวาน น้ำชง น้ำอัดลม แอลกอฮอล์ จะช่วยให้การลดความอ้วนง่ายขึ้นมาก
แต่การ “หยุด” เรื่องแค่นี้กลับยากสำหรับเราหลายคน ใช่หรือไม่?

เราอาจมีแต้มต่อน้อยกว่าคนอื่น
อาจมีเงินน้อยกว่าคนอื่น
อาจมีภาระรับผิดชอบมากมาย
อาจมีเวลาไม่มากนัก

แต่ถ้าเราเพียงแค่มีเป้าหมาย มีแผนการชัดเจน แล้ว
“เลือก” ในสิ่งที่ดีที่สุด
“ลงมือทำ” ในสิ่งที่ดีที่สุด
“หยุด” พฤติกรรมหรือนิสัยที่ไม่ดี

เราอาจสร้างแต้มต่อในชีวิตได้ด้วยตัวเอง
และการประสบความสำเร็จอย่างที่เราหวัง อาจไม่ยากอย่างที่คิด

และถ้าคนอีกมากยังมีแต่ความอยาก แต่ไม่มีเป้าหมาย ไม่มีแผนการ
ยังใช้ชีวิตอย่างประมาท ไม่ตั้งใจในการใช้ชีวิต
ถึงเค้าจะเกิดมามีแต้มต่อในชีวิตมากแค่ไหน เราก็อาจจะแซงเค้าได้ในซักวัน

หยุด พูดแต่สิ่งที่อยากได้
หยุด อิจฉาชีวิตคนอื่น
เริ่ม คิดและลงมือทำ

Categories
การพัฒนาซอฟท์แวร์

รวมสไลด์จากงาน I/O Extended Bangkok (9 ก.ค. 2017)

เมื่อวันเสาร์ที่ผ่านมา (9 ก.ค. 2017) มีการจัดงาน I/O Extended Bangkok ที่ตลาดหลักทรัพย์แห่งประเทศไทย มีหัวข้อที่น่าสนใจหลายหัวข้อเลยครับ ผมรวบรวมสไลด์เท่าที่หาได้ สำหรับเพื่อน ๆ ที่ไม่ได้ไปร่วมงานหรือเพื่อน ๆ ที่ไปร่วมงานแล้วอยากได้ Reference จากในสไลด์ของ speaker แต่ละท่านเพื่อนำไปศึกษาเพิ่มเติม

What’s new in Firebase and Cloud Platform


Speaker : Jirawat Karanwittayakarn (GDE Firebase)

…..

What’s new in Android O

GitHub -> https://github.com/akexorcist/Android-O-Feature

Speaker : Somkiat Wongkitwattana (GDE Android)

…..

Unlock the power of web Components with Polymer

Speaker : Tanakrit Saisillapee

…..

Introduction to Kotlin

Speaker : Travis Subanaphong

…..

Building apps for the Google Assistant

Github -> https://github.com/thangman22/googleiobkk17-action-on-google

Speaker : Warat Wongmaneekit (GDE Web Technologies)

…..

Speeding up your Android Gradle builds

Speaker : Jirawat Karanwittayakarn (GDE Firebase)

…..

Introduction to Architecture Components

GitHub -> https://github.com/akexorcist/Android-ArchComponents

Speaker : Somkiat Wongkitwattana (GDE Android)

…..

Modern web The next era of web experience

Speaker : Warat Wongmaneekit (GDE Web Technologies)

Categories
iOS

[iOS] การทำให้ UITableView ไม่แสดง Separator สำหรับ Cell ที่ว่าง

ผมคิดว่าคนที่พัฒนาแอพ iOS คงจะเคยเจอปัญหาว่า UITableView จะแสดงเส้นคั่น (separator) สำหรับ cell ที่ว่างกันมาบ้าง ตามรูปนี้ครับ

บล็อกนี้ผมจะเสนอวิธีง่ายๆ ที่จะแก้ปัญหานี้ครับ

Swift

override func viewDidLoad() {
    super.viewDidLoad()
    self.tableView.tableFooterView = UIView()
}

Objective-C

- (void)viewDidLoad 
{
    [super viewDidLoad];

    // This will remove extra separators from tableview
    self.tableView.tableFooterView = [UIView new];
}

หรืออาจจะทำแบบนี้ก็ได้ครับ

self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];

อ้างอิง stackoverflow

Categories
Git

การใช้ไฟล์ .gitignore กับโปรเจคเก่า ๆ

บางครั้งเรามีโปรเจคเก่าที่ใช้ Git อยู่แล้ว แต่เรา ignore ไฟล์ไม่ครบ อาจมีไฟล์ที่เราไม่ต้องการ ถูก track เข้าไปด้วย เช่น ไฟล์จาก OS หรือ ไฟล์จาก IDE เป็นต้น

เราสามารถแก้ไขได้ง่าย ๆ ด้วยคำสั่งเพียงไม่กี่คำสั่ง แต่ก่อนอื่นผมขอแนะนำสำหรับคนที่ไม่รู้ว่าจะ Ignore ไฟล์อะไรดี สามารถเข้าไปดูได้ที่ https://github.com/github/gitignore ซึ่งรวบรวมไฟล์และโฟลเดอร์ที่เราควร ignore ไว้ครบถ้วน (ผมแนะนำให้ดูในโฟล์เดอร์ Global ด้วย เพราะมีคำแนะนำการ ignore ไฟล์ของ IDE และ OS เพิ่มเติม)

สมมุติว่าผมเขียน Java ด้วย Eclipse บน macOS ผมจะสามารถสร้างไฟล์ .gitignore ได้ประมาณนี้

# General
*.DS_Store
.AppleDouble
.LSOverride

# Icon must end with two \r
Icon

# Thumbnails
._*

# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent

# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk

#Eclipse
.metadata
bin/
tmp/
*.tmp
*.bak
*.swp
*~.nib
local.properties
.settings/
.loadpath
.recommenders

# External tool builders
.externalToolBuilders/

# Locally stored "Eclipse launch configurations"
*.launch

# PyDev specific (Python IDE for Eclipse)
*.pydevproject

# CDT-specific (C/C++ Development Tooling)
.cproject

# Java annotation processor (APT)
.factorypath

# PDT-specific (PHP Development Tools)
.buildpath

# sbteclipse plugin
.target

# Tern plugin
.tern-project

# TeXlipse plugin
.texlipse

# STS (Spring Tool Suite)
.springBeans

# Code Recommenders
.recommenders/

# Scala IDE specific (Scala &amp; Java development for Eclipse)
.cache-main
.scala_dependencies
.worksheet

#Java
# Compiled class file
*.class

# Log file
*.log

# BlueJ files
*.ctxt

# Mobile Tools for Java (J2ME)
.mtj.tmp/

# Package Files #
*.jar
*.war
*.ear
*.zip
*.tar.gz
*.rar

# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*

เมื่อสร้างไฟล์ .gitignore ก่อนที่จะทำขั้นตอนต่อไปให้ทำการ commit การเปลี่ยนแปลงทั้งหมดก่อน

แล้วใช้คำสั่งนี้เพื่อเคลียร์ index ของ git

$ git rm -r --cached .

แล้วใช้คำสั่ง

$ git add .

และ commit

$ git commit -m ".gitignore is now working"

เพียงเท่านี้เราก็สามารถ ignore ไฟล์และโฟลเดอร์ที่เราไม่ต้องการได้แล้วครับ

Categories
Git

การใช้งาน Git Submodules

หลังจากที่ผมได้รู้จัก Git Submodules มาซักพักหนึ่ง ผมก็พยายามใช้ในงานต่าง ๆ ซึ่งช่วยให้ผมจัดการ Source code สะดวกขึ้นมาก แต่เนื่องจากได้ใช้คำสั่งพวกนี้ในช่วงเริ่มโปรเจคซะเป็นส่วนใหญ่เลยทำให้มีอาการหลงลืมคำสั่งไปบ้าง ก็เลยมาบันทึกไว้หน่อยจะได้ไม่ต้องไปหาข้อมูลใหม่อีก

การเพิ่ม Submodules เข้ามาใน Git Repository

ใช้คำสั่งดังนี้

$ git submodule add https://github.com/golfz/module1 lib/module1
Initialized empty Git repository in ~/a_project/lib/module1/.git/
remote: Counting objects: 1006, done.

remote: Compressing objects: 100% (978/978), done.

remote: Total 1006 (delta 631), reused 0 (delta 0)

Receiving objects: 100% (1006/1006), 408.22 KiB, done.

Resolving deltas: 100% (631/631), done.

แต่ละส่วนของคำสั่งมีรายละเอียดดังนี้

git submodule add เป็นคำสั่ง git เพื่อเพิ่ม Submodules

https://github.com/golfz/module1 คือ git repository ภายนอกที่เราต้องการเพิ่มเข้ามาเป็น submodule ซึ่งคุณต้องมั่นใจว่าคุณมีสิทธิ clone repository นี้

lib/module1 คือ path ของ submodules ใน repository หลัก

ลองตรวจสอบ repository ดูด้วย git status
$ git status
# On branch master
# Changes to be committed:

# (use "git reset HEAD <file>..." to unstage)

#

# new file: .gitmodules

# new file: lib/module1

#

ถ้าเราลองตรวจสอบ .gitmodules ที่เพิ่มเข้ามาใหม่ จะพบข้อมูลดังนี้

$ cat .gitmodules
[submodule "lib/module1"]
path = lib/module1

url = https://github.com/golfz/module1

การใช้งาน Submodules

ถ้าเราเพิ่ม clone repository ลงมา เราจะพบว่าโฟลเดอร์ที่เป็น submodule จะว่างเปล่า ดังนั้นเราต้อง initial submodules ก่อน ดังนี้

$ git submodule init
Submodule 'lib/module1' (https://github.com/golfz/module1) registered for path 'lib/module1'

ขั้นตอนต่อไปเราจำเป็นต้อง pull files ลงมา

$ git submodule update
Initialized empty Git repository in ~/a_project/lib/module1/.git/
remote: Counting objects: 26, done.

remote: Compressing objects: 100% (22/22), done.

remote: Total 26 (delta 5), reused 0 (delta 0)

Receiving objects: 100% (26/26), 17.37 KiB, done.

Resolving deltas: 100% (5/5), done.

Submodule path 'lib/module1': checked out '1c407cb2315z0847facb57d79d680f88ca004332'

ตอนนี้ถ้าเราเข้าไปดูใน lib/module1 เราจะพบว่ามีไฟล์อยู่อย่างถูกต้องแล้ว

การลบ Submodules

ขั้นตอนในการลบ Submodules จะมีความซับซ้อนเล็กน้อย ดังนี้

1. เข้าไปลบข้อมูล submodules ในไฟล์ .gitmodules ให้ลบข้อมูลออกไปดังนี้
[submodule "lib/module1"]
path = lib/module1
url = https://github.com/golfz/module1

2. เข้าไปลบข้อมูล submodule entry ในไฟล์ .git/config ขั้นตอนนี้ไม่จำเป็นต้องทำก็ได้ แต่เพื่อป้องกันปัญหาในอนาคตหากเราใช้คำสั่ง “git submodule init” ผมแนะนำว่าทำก็ดีครับ โดยให้ลบข้อมูลออกไปดังนี้
[submodule "lib/module1"]
url = https://github.com/golfz/module1

3. ลบ path ของ Submodules ด้วยคำสั่ง
$ git rm --cached lib/module1
rm 'lib/module1'

การอัพเดต Submodules

นี่เป็นอย่างหนึ่งที่เราจะค่อนข้างสับสนเมื่อใช้งาน Submodules เพราะเมื่อเราเพิ่ม submodules เข้ามา เราจะได้รับ commit ล่าสุดของ repository ของ submodule นั้น

หากหลังจากนั้น Repository ของ submodule มีการอัพเดตแล้วเรา clone โปรเจคหลักไปที่อื่น แล้วใช้คำสั่ง

$ git submodule init

ต่อด้วย

$ git submodule update

เราจะพบว่าเราจะไม่ได้โค้ดล่าสุดของ submodule ซึ่งมักสร้างความสับสนอยู่บ่อยครั้ง

แต่หากคิดดูดี ๆ ก็จะพบว่ากลไกนี้มีความเหมาะสมแล้ว เนื่องจาก code ใน repository หลักของเราได้ถูกทดสอบกับ submodules เวอร์ชั่นใด เมื่อ clone repository หลักไปใช้ก็ควรได้ submodule เวอร์ชั่นเดิมที่เคยทดสอบแล้ว ไม่ใช่เวอร์ชั่นใหม่ล่าสุดที่เราไม่เคยทดสอบ

แต่หากเราต้องการ repository ของ submodule ใหม่ล่าสุด สามารถทำได้ดังนี้

1. เข้าไปที่โฟลเดอร์ของ submodule

$ cd lib/module1

2. checkout ไปที่ master

$ git checkout master
Previous HEAD position was b8ff8f6... re-ordering
Switched to branch 'master'

Your branch is behind 'origin/master' by 8 commits, and can be fast-forwarded.

3. ดึงอัพเดตล่าสุดลงมา

$ git pull
remote: Counting objects: 31, done.
remote: Compressing objects: 100% (24/24), done.

remote: Total 24 (delta 15), reused 0 (delta 0)

Unpacking objects: 100% (24/24), done.

From https://github.com/golfz/module1

b8ff8f6..5cab93f master -> origin/master

* [new tag] 1.2.28 -> 1.2.28

From https://github.com/golfz/module1

* [new tag] 1.2.26 -> 1.2.26

* [new tag] 1.2.27 -> 1.2.27

Updating c547e0d..5cab93f

Fast-forward

index.php | 109 ++++++++++++++-

css/admin.css | 26 ++++

js/admin.js | 17 +++

3 files changed, 51 insertions(+), 4 deletions(-)

create mode 100644 css/admin.css

create mode 100644 js/admin.js

4. กลับไปที่ repository หลัก แล้ว

$ git add lib/module1
$ git status
# On branch master
# Changes to be committed:

# (use "git reset HEAD ..." to unstage)

#

# modified: lib/module1

#