วันศุกร์ที่ 29 สิงหาคม พ.ศ. 2557

การเปลี่ยน theme app

   ไปที่ res->values->style.xml

1.   เพิ่มไปใน <resource>
 <style name="ชื่อสไตที่เมิงตั้งใหม่" parent="AppTheme">

        <item name="android:windowNoTitle">true</item>
        <item name="android:windowContentOverlay">@null</item>


    </style>
<resource>

2. ไปที่ androidmanifest.xml

หาแล้วแก้แค่เนี่ย
android:theme="@style/ชื่อสไตที่เมิงตั้งใหม่"

จบละฝัดด เบย

การใช้งาน ViewPagerIndicator


1.สร้าง MainActivity with Fragment

\\MainActivity//

import com.viewpagerindicator.PageIndicator;
import com.viewpagerindicator.TitlePageIndicator;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
import android.view.Menu;

public class MainmenuActivity extends FragmentActivity {
  
    FragmentAdapter mAdapter;
    ViewPager mPager;
    PageIndicator mIndicator;
    int Number = 0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout."ชื่อ layout ของเรา");
      
        mAdapter = new FragmentAdapter(getSupportFragmentManager());
        mPager = (ViewPager)findViewById(R.id.pager);
        mPager.setAdapter(mAdapter);
                 เปลี่ยนเป็น สไตต่างๆเช่น
                  Title
                  //mIndicator = (TitlePageIndicator)findViewById(R.id.indicator);

                   Tab
        //mIndicator = (TabPageIndicator)findViewById(R.id.indicator);
                    เลือกเอาซักอย่าง

        mIndicator.setViewPager(mPager);
     
    }
  
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu. "ดูชื่อใน res->menu แล้วก็อบมาใส" , menu);
        return true;
    }
  
  
}

เออเร่อชั่งมั้น กดแก้เองเด๋วมันก็หาย
หน้า xml ของ MainActivity


\\Your Fragment Holder in the XML//
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">


//Title    <com.viewpagerindicator.TitlePageIndicator
         //Tab    <com.viewpagerindicator.TabPageIndicator  เลือกเอา
        android:id="@+id/indicator"
        android:padding="10dip"
        android:layout_height="wrap_content"
        android:layout_width="fill_parent"
        android:background="#000000"
        android:textColor="#2FB3E3"
        />
    <android.support.v4.view.ViewPager
        android:id="@+id/pager"
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        /> 
</LinearLayout>

จากนั้นก็ไปที่ res->values->style.xml  ถ้าใช้ Tab ใส่ลงไปใน AppTheme ด้วย 
ไม่งั้นแม่งสไตหายกุงงตั้งนานไอสัส
<item name="vpiTabPageIndicatorStyle">@style/Widget.TabPageIndicator</item>

2. สร้าง FragmentAdapter.java 

\\Fragment Adapter//

import com.viewpagerindicator.IconPagerAdapter;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
public class FragmentAdapter extends FragmentPagerAdapter implements IconPagerAdapter{
    public FragmentAdapter(FragmentManager fm) {
        super(fm);
        // TODO Auto-generated constructor stub
    }
    @Override
    public int getIconResId(int index) {
        // TODO Auto-generated method stub
        return 0;
    }
    @Override
    public Fragment getItem(int position)
    {
        // TODO Auto-generated method stub
        Fragment fragment = new BitFragment();
        switch(position){
        case 0:
            fragment = new BitFragment();
            break;
        case 1:
            fragment = new ByteFragment();
            break;
        case 2:
            fragment = new KiloByteFragment();
            break;
        case 3:
            fragment = new MegaByteFragment();
            break;
        }
        return fragment;
    }
    @Override
    public int getCount() {
        // TODO Auto-generated method stub

                 มีกี่ tab เมิงกะใส่ตรงนี้นะ
        return 4;
    }
  
    @Override
    public CharSequence getPageTitle(int position){
        String title = "";
        switch(position){
        case 0:
            title = "Bit";
            break;
        case 1:
            title = "Byte";
            break;
        case 2:
            title = "KiloByte";
            break;
        case 3:
            title = "MegaByte";
            break;
        }
        return title;
    }
}
 3.สร้าง Fragment (Activity ) class+xml หน้าต่างๆที่จะเรียกใช้

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class ชื่อไรก็ว่าไปFragment extends Fragment {
  
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
        View rootview = inflater.inflate(R.layout.ชื่อเลเอ้าเปลี่ยนตามด้วย, null);
        
         //Calendar
         CaldroidFragment caldroidFragment;
        caldroidFragment = new CaldroidFragment();
        Bundle args = new Bundle();
        Calendar cal = Calendar.getInstance();
        args.putInt(CaldroidFragment.MONTH, cal.get(Calendar.MONTH) + 1);
        args.putInt(CaldroidFragment.YEAR, cal.get(Calendar.YEAR));
        caldroidFragment.setArguments(args);
        android.support.v4.app.FragmentTransaction t = getFragmentManager().beginTransaction();
        t.replace(R.id.calendar1, caldroidFragment);
        t.commit();


        //  About Clear Button
        Button btnMultipleClear = (Button) view.findViewById(R.id.btnMultipleClear);
        btnMultipleClear.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(getActivity(), "Clear", Toast.LENGTH_SHORT).show();
            }
        });
      
      
        return rootview ;
      
    }
}
    xml กำหนดเองเลยอยากใส่ไรใส่ได้เลย



เดบิต By Mizzeeboy กุรักเมิงฝุดๆขอบใจมากๆ

วันอาทิตย์ที่ 24 สิงหาคม พ.ศ. 2557

Android Studio Add ViewPagerIndicator Library with Gradle

บาง library ใน Android Studio แอดแบบปกติไม่ได้ พอดีเจอมาอีกวิธีนึง ง่ายมากเลย
(กว่ากุจาหาเจอสาดเอ้ยยยย!!!)


1. เข้า build.gradle ของโปรเจค แล้ว ก็ใส่ตามรูปด้านขวาล่าง ***ต้องใส่ข้างบน jcenter()
        maven
                {
                    url "http://dl.bintray.com/populov/maven"
                }
jcenter()




2. เข้า build.gradle ของ module แล้วก็ใส่ตามรูปด้านขวาล่าง
       compile 'com.viewpagerindicator:library:2.4.1@aar'




แค่นี้ก็ใช้ได้แล้ววุ้ยยยยยย


วันเสาร์ที่ 16 สิงหาคม พ.ศ. 2557

Basic Android Studio

Android Studio
โปรแกรมเขียนแอนดรอยของอากู๋ โหลดเลย กด



    เสดละก็ลงดิ ยากไร next ยาว เสดละเปิดขึ้นมาเลย เอ้ย ลืมๆลง java ก่อนนะ  กดโลด ติ๊กในช่อง Accept ละก็กดเลยตาม os ลองเรา x86 มันคือ วินโด 32 bit นะครัช



     ลงก็ Next ยาววว จากนั้น คลิกขวา My Computer เลือก Property 




จะได้หน้าต่างใหม่ขึ้นมา เลือก Advanced system setting ด้านซ้ายบน



เลือก  Environment Variables...


     กด New...  ละก็พิมตามภาพเลย ส่วน Variable value เป็นที่เก็บไฟล์จาวาของซึ่่งส่วนใหญ่ก็จะอยู่คล้ายกันนี่แหละต่างกันที่ version ตอนนี้อย่าลง 1.8 เดดขาดนะเคอะ แล้วกด OK เลย



มาที่ System variables หา path แล้วกด Edit.. ใส่ ที่อยู่ไฟล์จาวาลงไปแล้วครอบด้วย " ; "
จะได้ ;C:\Program Files\Java\jdkxxx; ต่อท้ายในช่อง  Variable value แล้วกด OK



จากนั้นก็ลุย Android Studio ได้เล้ยยย









วันพฤหัสบดีที่ 14 สิงหาคม พ.ศ. 2557

Codeigniter PHP framework ตอนที่ 2

ข้อมูลสรุปนี้ไม่พร้อมใช้งาน โปรด คลิกที่นี่เพื่อดูโพสต์

Codeigniter PHP framework ตอนที่ 1

Codeigniter

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

MVC คือไรว่ะ

    - M ถ้าเกี่ยวกับฐานข้อมูลไม่ว่าจะเป็น Create Read Update Delete เนี่ยให้เราเขียนไว้ใน model 
    - V พวกหน้าเว็บ เลเอ้าต่างๆ ให้เขียนไว้ใน view 
    - C เป็นพวก กลไกการทำงานข้องเว็บอ่ะ ว่ากดปุ่มนี้จะให้ทำไร เป็นตัวกลางในการประสาน M มาแสดงผลที่ V

                           โหลดเลย https://ellislab.com/codeigniter จะได้ไม่เป็นภาระลูกหลาน 

เสดละก็จะได้ไฟล์ zip มาเราก็เก็บไว้ในไฟล์เว็บ ผมลองใช้ xampp ก็จะสร้าง folder เก็บไว้ใน htdocs
ใครใช้ appserv หรือ wamp ก็อยู่ใน www เน้อ 
ละเราก็แตกไฟล์มาเลยครัช 
ตอนแรกเราก็ไปตั้งค่าก่อนเลยเป็นอย่างแรก ไปที่ application->config

โดยเราจะเข้าไปตั้งค่า 4 ไฟล์ ที่ผมได้ติ๊กไว้

1. Autoload.php
    - หา libraries ให้่เจออยู่บนๆเลย แล้วก็ใช้ไปตามภาพ ทำให้เราไม่ต้องเสียเวลาเขียนตอนในงาน เช่น Database และ Session ใครอย่างเพิ่มอย่างอื่นก็จัดไปนะ
 

   - helper ก็ใส่ตามนั้นรูปนั้นแหละ หรือใครอยากเพิ่มไรก็เรื่องมึง


  - model ส่วนสุดท้ายเลย ไว้ใช้ ออโต้โหลด model ที่เราเขียนไว้จะได้ใช้ได้เลย ใส่แต่ชื่อนะไม่ต้อง .php


ไปถูบ้านละครัช เด๋วมาต่อ -*-


Breakpoints

Breakpoints

          Breakpoints คือ การที่ Responsive Web เปลี่ยนรูปแบบการแสดงผล เมื่อ viewport มีความกว้างถึงจุดๆ หนึ่ง เช่นตอนแรกเราออกแบบมาดูในมือถือสวยละ แต่พอขยายหน้าเว็บปุ๊บแม่งเหี้ยอย่างเห็นได้ชัดเลย ดังนั้นเราเลยต้องมานั่งกำหนดว่า ถ้ากว้างน้อยกว่า หรือมากกกว่านี้ จะแสดงผลยังไงให้แม่งสวยตลอด ไรประมานนี้เนี่ย


วันอังคารที่ 12 สิงหาคม พ.ศ. 2557

Responsive Web Design

เป็นการออกแบบเพื่อให้เว็บไซต์แสดงผลได้ใน อุปกรณ์ที่ต่างกัน โดยใช้ website เดิม โดยใช้เทคนิค 3 อย่างด้วยกัน Fluid Grid, Flexible Images,CSS3 Media Queries Fluid Grid ซึ่งก็คือการออกแบบ Grid ให้เป็นแบบ Relative ซึ่งก็คือการที่ไม่ได้กำหนดขนาดของ Grid แบบตายตัว แต่จะกำหนดให้สัมพันธ์กับสิ่งอื่นๆ เช่น กำหนดความกว้างแบบเป็น % หรือการใช้ font-size หน่วยเป็น em เป็นต้น Flexible Images หรือการกำหนดขนาดของ Images ต่างๆ ให้มีความสัมพันธ์กับขนาดของหน้าจอแสดงผล หากรูปต้นฉบับมีขนาดใหญ่มาก เวลาแสดงในมือถือที่มีจอขนาดเล็ก ก็ควรลดขนาดลงมา เพื่อให้แสดงผลได้อย่างสวยงาม CSS3 Media Queries ซึ่งจะช่วยให้เราสามารถกำหนด style sheets สำหรับ Devices ต่างๆ ได้ โดยส่วนใหญ่ เราจะเขียน style sheets พื้นฐานเอาไว้ ซึ่งกลุ่มนี้ จะไม่ขึ้นอยู่กับ Devices ใดๆ หลังจากนั้นให้เราเขียน style sheets สำหรับ Devices ที่มีขนาดหน้าจอที่เล็กสุด เพิ่มขึ้นไปเรื่อยๆ จนถึงขนาดใหญ่สุด ซึ่งการเขียนแบบนี้ จะช่วยลดความซ้ำซ้อนของโค้ด และยังทำให้การแก้โค้ดในภายหลังทำได้ง่ายอีกด้วย

CSS3 Media Queries

เป็นการเพิ่มข้อกำหนดให้กับ Media Types เช่น screen and (min-width:1024px) หน้าจอที่มีความกว้างอย่างน้อย 1024px ช่วยจำแนก device ต่างๆ ได้ดียิ่งขึ้น หากอยากทำให้ Web Browser ที่ไม่รองรับ ให้ใช้ “HTML5 Cross Browser Polyfills”

#siamhtml

วันศุกร์ที่ 8 สิงหาคม พ.ศ. 2557

เริ่มใช้ Bitbucket

เริ่มต้นเลย
1. สมัครใช้งาน bitbucket
- ไปที่ https://bitbucket.org
- เมื่อสมัครเสร็จไปที่ปุ่ม create จากนั้นตั้งชื่อ repository
2.ลง Git
- ไปที่เว็บนี้ กดโลด http://git-scm.com/ แล้วกดปุ่ม Download
- Next ยาวเลยไม่ต้องถาม จนถึงหน้านี้ให้เลือก use git from the windows command prompt ดังรูป

- Next ต่อจนเสร็จ
- จากนั้นเปิด git bash  เพื่อสร้าง ssh key ในการอัพโหลดไฟล์ต่างๆไปที่ bitbucket
   - พิม cd ~/.ssh เพื่อดูว่าเราสร้าง ssh key ไว้รึยัง ถ้ายังมันจะขึ้น No such file or directory
    - พิม ssh-keygen -t rsa -C"ใส่อีเมลที่ใช้สมัคร bitbucket" เพื่อสร้าง ssh key จากนั้นมันขึ้นไรก็ enter ไปเลยไม่ต้องใส่
    - พิม clip <~/.ssh/id_rsa.pub เพื่อ copy ssh key
- ไปที่ repository ที่สร้างไว้ที่ https://bitbucket.org 
- เลือกคลิกรูป avatar ขวาบน แล้วเลือกเมนู manage account ดังรูป



- มันจะขึ้นหน้าต่างใหม่มาให้ แล้วเลือกเมนู SSH KEYS ด้านซ้ายล่าง


- จะได้หน้าต่างขึ้นมา กด Add keys แล้ว paste ssh key ที่เราสร้างไว้ ลงไป  ส่วนตรง Label  ใส่ก็ได้ไม่ใส่ก็ได้




3. ลง Sourcetree
- โหลดจาก http://www.sourcetreeapp.com/
- Next ยาวเลย จนถึง SSH Client Configuration ก็ให้เลือกเป็น OpenSSH
- ละก็ใส่ user pass ของ bitbucket จากนั้นระบบมันจะลองเชื่อมต่อให้
- จากนั้นก็กด finish
- เปิดโปรแกรม Sourcetree
ไปที่ repository ที่สร้างไว้ที่ https://bitbucket.org เลือก Clone in sorce tree ดังรูป
- ไปที่โปรแกรม  Sourcetree  Source Path เป็นที่อยู่ของ repository บนเว็บ Destination path คือที่ที่เราจะสร้าง project ต้องเป็น folder ว่างๆ) จากนั้นกดปุ่ม clone ดังรูป ถ้าหากเรามีไฟล์โปรเจคอยู่แล้วก็ย้ายไฟล์ต่างๆเข้ามาที่ folder นี้หลังจาก clone แล้ว


- ไฟล์ต่างๆที่เราเพิ่งใส่ไปจะมาให้เห็นเลยจากนั้นกดปุ่ม ดังรูปเพื่อ add ไฟล์ต่างๆเข้าโปรแกรม


- กดปุ่ม commit เพื่อ save ลง repository ในเครื่องของเรา

- กดปุ่ม push  เพื่อ save repository ไว้บน bitbucket.org
# ส่วนต่อไปนี้ Copy มาจาก http://yothinix.blogspot.com/2013/12/tde-2-git-basix-command.html
ขี้เกียจพิมต่อละ 555
Fetch/Pull
       Fetch จุดประสงค์ของมันก็เพื่อเช็คว่ามีการกระทำอะไรใดๆ ใน remote repository ที่เราใช้อยู่รึเปล่า ซึ่งถ้ามีตัวโปรแกรมก็จะแจ้งเตือนเป็นตัวเลขจำนวน Commit พร้อมกับลูกศรลงอยู่ข้างหลัง Branch นั้นๆ หรือถ้าเราอยู่ใน Branch นั้นแล้วมันจะแสดงเป็นตัวเลขแดงๆ อยู่ตรงปุ่ม Pull กลายๆ ว่าเมิงกดกูซักทีเหอะนะ ซึ่งถ้าเรากดปุ่ม Pull ก็จะเป็นการดาวน์โหลดการเปลี่ยนแปลงใดๆ ที่เกิดใน Branch นั้นที่อยู่บน Remote repo ลงมายังBranch เดียวกันที่อยู่เครื่องเราเป็นการทำให้แน่ใจว่าเครื่องเรามี Source code ล่าสุดพร้อมสำหรับการพัฒนาต่อเสมอ

Commit
       คำสั่งนี้เป็นคำสั่งพื้นฐานที่สุดและใช้บ่อยที่สุดสำหรับ Git โดยการ Commit คือการเก็บบันทึกการเปลี่ยนแปลงใดๆ ที่เราทำใน  Working Folder หรือโฟลเดอร์ Project ของเราเองไว้ ซึ่งก็จะแบ่งเป็น 2 Mode หลักๆ คือ Stage changes และ Working copy change โดย Stage change คือการเปลี่ยนแปลงที่เรากระทำกับไฟล์ในโฟลเดอร์นั้นๆ เช่น การสร้างไฟล์, การลบไฟล์ รวมถึงการ Merge Branch หลายๆ ครั้งเราก็จะใช้ Mode นี้ด้วย ส่วน Mode Working copy change คือการเปลี่ยนแปลงใดๆ ที่เรากระทำกับไฟล์ใดๆ ที่มีอยู่แล้วในโฟลเดอร์นั้น (ซึ่งอันนี้ใช้บ่อยที่สุดละ) ข้อควรระวังก็คือ ถ้าเราต้องการเปลี่ยนไป Branch อื่นๆ เช่นจาก Feature หนึ่งไปอีก Feature หนึ่งถ้ามีการเปลี่ยนแปลงใดๆ ที่ทำไปแล้วก็ควรจะ Commit ก่อนเปลี่ยน Branch (ซึ่งโดยปกติแล้วโปรแกรมจะเตือนไม่ให้เปลี่ยน แต่ก็จะมีตัวเลือก discard all change ไว้ในกรณีขี้เกียจด้วย)

Push
       หลังจากเรากด commit ไปแล้วการเปลี่ยนแปลงนั้นก็เพียงแค่บันทึกไว้ใน Local repository ซึ่งถ้าเครื่องเราHDD พัง OS เจ๊งก็ยังมีโอกาสที่เราจะสูญเสีย Source code ที่เราอุตส่าห์พร่ำเขียนมา ซึ่งการที่เรามี Remote repository ก็เพื่อป้องกันเหตุร้ายดังกล่าว (แต่ก็ใช้ว่ามันจะไม่มีโอกาสเสียเลย) รวมถึงเป็นการ Synchronous ตัวงานหรือโมดูลที่เราทำเข้ากับส่วนกลางเพื่อให้คนอื่นในทีมได้ใช้งานร่วมกันรวมถึงรวมเข้าด้วยกันในภายหลังโดยการPush เราสามารถเลือกได้ว่าจะ Push ทุก Branch ที่มีอยู่ในเครื่องหรือเพียงแค่ Branch ที่เราได้ทำการเปลี่ยนแปลงไปในข้างต้น ข้อควรระวังคือโปรแกรมจะไม่ให้เรากด Push ถ้ามีการค้าง Pull ไว้ใน Branch ที่เราเลือก วิธีแก้ก็คือPull มันลงมาซะแล้วค่อยกด Push ใหม่อีกรอบหนึ่ง

Branch/Merge/Checkout
       อย่างที่ผมได้กล่าวไปแล้วในตอนที่ เรื่องแนวทางการแตก Branch จากประสบการณ์ผมเคยแตก Branchเองจริงๆ น้อยมากครับ ส่วนใหญ่จะใช้ฟีเจอร์ Git Flow ให้เป็นประโยชน์โดยหลังจากที่เราสร้าง Project มาแล้วการกด Git Flow ครั้งแรกจะเป็นการ Initial ตัว Local repository เราว่า เราจะทำงานแบบ Git Flow นะโดยตัวโปรแกรมก็จะแยก Branch ใหม่ให้เองเป็น Master กับ Develop ก่อนโดยเราจะถูกสลับ (Checkout) มาไว้ที่ Branch นี้โดยอัตโนมัติ หลังจากนั้นแล้วเมื่อเราต้องการพัฒนาฟีเจอร์ใหม่ใดๆ ก็กดตรง Git Flow แล้วเลือก Start New Featureซึ่งส่วนใหญ่แตกแล้วแตกยาว เพราะหลายงานที่ทำอยู่ปัจจุบันก็ยังทำไม่เสร็จจน Finish Feature ซึ่งตัวโปรแกรมจะทำการรวม (Merge) ตัว Branch Feature นั้นๆ เข้า Develop ให้โดยอัตโนมัติ วิธีแก้ปัญหาในปัจจุบันส่วนใหญ่ผมยังใช้การ Merge เองด้วยมือในตอนวันท้ายๆ ของสัปดาห์ซึ่งเป็นการ Release ตัว Project ออกมาเป็นเวอร์ชั่นย่อยๆ รวมถึงเป็นการรวม Source Code จากคนอื่นๆ ในทีมมาอัพเดทไว้ที่ Branch Develop ด้วย ซึ่งถ้าคนในทีมเริ่มแก้ไฟล์เดียวกันเมื่อไร สิ่งที่ตามมาอยู่ในย่อหน้าถัดไปครับ
       Merge Conflict เป็นปัญหาที่เกิดขึ้นจากการแก้ไขไฟล์เดียวกันในบรรทัดเดียวกันจากต่าง Branch กันซึ่งพอเราจะกด Merge ตัวโปรแกรมก็จะงงว่าตกลงเราจะเอาอันไหน ซึ่งมีตัวเลือกในการแก้ (resolve conflict) อยู่ ทางคือใช้ไฟล์ของเรา หรือใช้ไฟล์จากอีก Branch หนึ่งที่กำลังจะรวมเข้าไป ซึ่งอันนี้ก็ขึ้นอยู่กับสถานการณ์ว่าจะใช้แบบไหนในการแก้
  

วันพฤหัสบดีที่ 7 สิงหาคม พ.ศ. 2557

Git !!! คืออัลไร

Git !!!

git เป็น Version controll  ละเวอชั่นคอนโทนห่าไรเนี่ยคือไร
แม่มกะคือตัวที่เราเอาไว้ใช้ดูการเปลี่ยนแปลง Code ของเรา เช่น เราแก้บรรทัดนี้เมื่อไหร่ หรือไอที่แก้ไว้แม่งไม่เวิกก็ชั่งแม่ม เรียกกลับมาใช้ Code เวอชั่นเดิมก็ได้กุไม่ง้อไรเงี้ย คือเราทำไรไว้กับ code เชี่ยนี่เสือกเก็บไว้หมด 
Code ต่างๆที่เราเก็บไว้บน git เนี่ยเค้าเรียกว่า Repository เอาไว้ใช้เป็นพาทให้ระบบมันลิ้งไปหา code ของเราถูกอัน ง่ายๆกะที่อยู่ไฟของเราอ่ะแหละเชี่ยยุ่งยากขิง

ข้อดีรวมๆนะ
- ฟรีไง
- backup code ของเราให้
- รวม code ที่แก้ๆไว้จากเพื่อนแต่ละคนเข้าด้วยกัน Merge ซึ่งถ้ามันไม่แน่ใจแม่มก็จะให้เราตัดสินใจเอง
- แบ่ง code เป็น ver ไป จะเอาไปใช้ตอนไหนก็ได้
- บอกว่า code ส่วนนี้ใครแก้มั่ง  บอกว่าใครทำ bug อ่ะแหละ
- ไม่ต้องต่อเนตก็ใช้ได้ เยสแม่ม เจ๋งสาด  แต่ตอนอัพขึ้นเว็บต้องใช้นะจ้ะ

Git hosting ผู้ใช้บริการ git เน้น ฟรีนะ
1. อันดับหนึ่งเลย GitHub เอาไว้แชโคดให้โลกตะลึงง เน้นที่ Public Repository ใช้ได้ไม่จำกัด  แต่แก้ไขไม่ได้  สนใจก็จัดไป http://github.com  
2. Bitbucket เน้น Private Repository ใช้ได้ไม่จำกัด แต่คนที่จะเข้าไปดู แก้ไขนั้น ไม่เกิน 5 คน น่าจะเหมาะกับทีมพัฒนา code ทีมเล็กๆ กุจะใช้นี้แหละ ใครว้อนกดโลด https://bitbucket.org