가끔 하늘을 보자

2024년 5월 16일 목요일

Android Jetpack viewpager2

 Android Jetpack ViewPager2 기본 개념 및 샘플 코드


오늘은 안드로이드 개발에 있어서 굉장히 유용한 컴포넌트 중 하나인 ViewPager2에 대해 이야기해볼까 합니다. ViewPager2는 사용자 인터페이스에서 여러 화면을 좌우로 스와이프하여 넘길 수 있게 해주는 아주 멋진 라이브러리인데요. 기본 개념부터 시작해서 간단한 샘플 코드까지, 함께 알아보도록 할게요!

Android Jetpack ViewPager2 소개
Android Jetpack의 일부인 ViewPager2는 안드로이드 기기에서 화면을 전환하는 라이브러리입니다. 이전 버전인 ViewPager에 비해 성능과 유연성이 개선되었습니다. 

ViewPager2는 RecyclerView와 같은 어댑터 뷰(Adapter View)로, 데이터 소스(DataSource)로부터 페이지를 가져와 표시합니다. 각 페이지는 Fragment 또는 Activity로 구성될 수 있습니다. 

주요 특징은 다음과 같습니다. 

- 성능 향상: ViewPager2는 RecyclerView와 동일한 RecyclerView 엔진을 사용하므로 스크롤링 및 페이지 전환이 부드럽고 빠릅니다. 

- 유연성: 수직 및 수평 스크롤을 지원하며, 페이지 크기를 동적으로 조정할 수 있습니다. 멀티 터치 및 제스처를 처리하는 방식을 커스터마이징 할 수도 있습니다.

- API 단순화: API가 직관적이고 간단하여 사용하기 쉽습니다. 기존의 ViewPager와 달리 데이터 바인딩 및 LiveData를 지원합니다.

다음은 간단한 ViewPager2 구현 예시입니다.

public class MainActivity extends AppCompatActivity {

  private ViewPager2 viewPager;
  private MyPageAdapter adapter;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    viewPager = findViewById(R.id.viewpager);
    adapter = new MyPageAdapter(this);
    viewPager.setAdapter(adapter);
  }
}

class MyPageAdapter extends FragmentStateAdapter {
  public MyPageAdapter(@NonNull FragmentActivity fragmentActivity) {
    super(fragmentActivity);
  }

  @NonNull
  @Override
  public Fragment createFragment(int position) {
    return PageFragment.newInstance(position);
  }

  @Override
  public int getItemCount() {
    return 3; //페이지 수
  }
}


위 코드는 세 개의 페이지를 가진 ViewPager2를 구현한 예시입니다. `MyPageAdapter` 클래스는 `FragmentStateAdapter`를 상속받아 페이지를 관리합니다. 각 페이지는 `createFragment()` 메서드에서 생성되며, `getItemCount()` 메서드는 페이지 수를 반환합니다. 이렇게 설정된 어댑터를 `viewPager`에 연결하면 페이지가 표시됩니다.

ViewPager2의 기능적 특성 이해하기
안드로이드 앱 개발에서 ViewPager2는 탭 형태의 인터페이스나 갤러리 인터페이스를 만드는데 유용한 도구 입니다. 아래에서는 ViewPager2의 주요 기능적 특성을 살펴 보겠습니다.

1.부드러운 스크롤링과 빠른 페이지 전환: ViewPager2는 RecyclerView와 같은 엔진을 사용하여 부드러운 스크롤링과 빠른 페이지 전환을 제공합니다. 이로 인해 사용자는 인터랙션 동안 원활한 경험을 할 수 있습니다.

2.직관적인 API: ViewPager2의 API는 간단하고 직관적이므로 쉽게 사용할 수 있습니다. XML 레이아웃 파일에서 간단히 참조하거나 Java 코드에서 인스턴스화 할 수 있습니다.

3.다양한 방향의 스크롤 지원: ViewPager2는 전통적인 수평 스크롤 뿐만 아니라 수직 스크롤도 지원합니다. 이를 통해 보다 다양한 UI 디자인을 구현할 수 있습니다.

4.동적 페이지 크기 조정: ViewPager2는 페이지 크기를 동적으로 조정할 수 있는 기능을 제공합니다. 이는 화면 크기나 디바이스 종류에 따라 페이지 크기를 적절하게 조정하는데 유용합니다.

5.멀티 터치 및 제스처 처리: ViewPager2는 멀티 터치 및 제스처를 처리하는 강력한 기능을 가지고 있습니다. 사용자가 손가락을 이용하여 페이지를 스와이프하거나 드래그 할 때 이를 인식하고 반응합니다.


이러한 기능들을 활용하여 안드로이드 앱에서 다양한 형태의 슬라이딩 인터페이스를 구현할 수 있습니다.

ViewPager2 구현을 위한 준비사항
뷰 페이저2를 프로젝트에 추가하려면 다음 단계를 따르세요:

1.build.gradle (Module: app) 파일에 의존성 추가: 뷰 페이저2 라이브러리를 사용하려면 프로젝트의 build.gradle (Module: app) 파일에 androidX 패키지 종속성을 추가해야 합니다. 

최신 버전은 아래 링크 참고

gradle
dependencies {
implementation 'androidx.viewpager2:viewpager2:1.1.0'
}

2.레이아웃 XML 파일에 뷰 페이저2 선언: 액티비티의 XML 레이아웃 파일에 뷰 페이저2 위젯을 선언하세요. 일반적으로 이것은 루트 ViewGroup 안에 배치됩니다.

xml
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent"/>

위의 단계를 완료하면 이제 뷰 페이저2를 사용하여 안드로이드 앱에 슬라이딩 인터페이스를 구현할 준비가 되었습니다.


간단한 ViewPager2 예제 코드 분석
다음은 간단한 ViewPager2 예제 코드입니다.

public class MainActivity extends AppCompatActivity {

  private ViewPager2 viewPager;
  private MyAdapter adapter;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    viewPager = findViewById(R.id.view_pager);
    adapter = new MyAdapter(this);
    viewPager.setAdapter(adapter);
  }

  public class MyAdapter extends RecyclerView.Adapter {
    private List dataSet;

    public MyAdapter(Context context) {
      dataSet = new ArrayList<>();
      for (int i = 0; i < 10; i++) {
        dataSet.add("Item " + i);
      }
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
      LayoutInflater inflater = LayoutInflater.from(parent.getContext());
      View view = inflater.inflate(R.layout.item_view, parent, false);
      return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
      holder.textView.setText(dataSet.get(position));
    }

    @Override
    public int getItemCount() {
      return dataSet.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
      TextView textView;

      public ViewHolder(@NonNull View itemView) {
        super(itemView);
        textView = itemView.findViewById(R.id.text_view);
      }
    }
  }
}

이 코드는 뷰 페이저2를 사용하여 페이지를 스크롤링하는 예시입니다. MainActivity 클래스에서는 뷰 페이저 인스턴스와 어댑터를 생성하고, 그것을 뷰 페이저에 연결합니다. 어댑터(MyAdapter)는 리사이클러뷰 어댑터를 상속하며, 데이터셋을 정의하고 각 항목에 대한 뷰 홀더를 생성합니다.


페이지 전환 효과와 커스터마이징
기본적으로 ViewPager2는 페이지 전환 시 부드럽게 미끄러지는 효과를 제공합니다. 하지만 이 효과를 사용하지 않거나, 다른 효과로 변경하거나, 추가적인 애니메이션을 적용하여 페이지 전환을 커스터마이징 할 수도 있습니다.

- 전환 효과: 
사용하지 않으려면 setPageTransformer(false)를 호출합니다. 원하는 효과를 직접 구현하려면 setPageTransformer() 메소드에 ViewPager2.PageTransformer 인터페이스를 구현한 객체를 전달합니다.

이상 끝.


2024년 5월 15일 수요일

구글 blogger 소스 코드 code-prettify

구글 blogger 소스 코드 code-prettify 적용하기

 

구글 blogger 좌측 메뉴 -> 테마 선택

 

 
맞춤설정 하위 메뉴 ->HTML 편집 선택
 
 
 

 
 
</head> 를 찾아 위에다가 구글에서 만든 아래 script 추가
 
<script src="https://cdn.jsdelivr.net/gh/google/code-prettify@master/loader/run_prettify.js"></script> 
 
출처 : https://github.com/googlearchive/code-prettify


 

코드가 사용될 블로그에서 HTML 모드로 변경 후 아래 추가

<pre class="prettyprint">

여기에 코드 작성

</pre>

 

Android Framework - ACTION BOOT COMPLETE

부팅완료시 ACTION BOOT COMPLETE 보내는 부분

분석버전 : Froyo
android\frameworks\base\services\java\com\android\server\am

ActivityManagerService.java


final void finishBooting() {
        IntentFilter pkgFilter = new IntentFilter();
        pkgFilter.addAction(Intent.ACTION_QUERY_PACKAGE_RESTART);
        pkgFilter.addDataScheme("package");
        mContext.registerReceiver(new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                String[] pkgs = intent.getStringArrayExtra(Intent.EXTRA_PACKAGES);
                if (pkgs != null) {
                    for (String pkg : pkgs) {
                      synchronized (ActivityManagerService.this) {
                        if (forceStopPackageLocked(pkg, -1, false, false, false)) {
                            setResultCode(Activity.RESULT_OK);
                            return;
                        }
                      }
                    }
                }
            }
        }, pkgFilter);

        synchronized (this) {
            // Ensure that any processes we had put on hold are now started up.
            final int NP = mProcessesOnHold.size();
            if (NP > 0) {
                ArrayList procs = new ArrayList(mProcessesOnHold);
            }
            for (int ip=0; ip < NP; i++) {
                this.startProcessLocked(procs.get(ip), "on-hold", null);
            }

            if (mFactoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL) {
                // Tell anyone interested that we are done booting!
                broadcastIntentLocked(null, null,                       // <------ 0="" android.manifest.permission.receive_boot_completed="" code="" false="" intent="" my_pid="" new="" ntent.action_boot_completed="" null="" process.system_uid="">





Android ListAdapter

https://developer.android.com/reference/androidx/recyclerview/widget/ListAdapter

# 안드로이드 ListAdapter 사용하기: 효율적인 RecyclerView 업데이트

안드로이드 개발에서 RecyclerView는 매우 중요한 UI 컴포넌트입니다.

데이터 리스트를 효율적으로 표시하고 관리할 수 있게 해줍니다.

이번 포스팅에서는 RecyclerView에서 ListAdapter를 사용하는 방법에 대해 자세히

알아보겠습니다.


# ListAdapter란?

ListAdapter는 RecyclerView.Adapter를 상속하는 클래스입니다.

따라서 onCreateViewHolder, onBindViewHolder와 같은 기본적인 작업을 오버라이드할 수 있습니다.

ListAdapter의 핵심 기능은 DiffUtil을 활용해서 리스트를 효율적으로 업데이트하는 것입니다.

기존 데이터와 새로운 데이터를 비교해서 변경된 부분만 업데이트하므로,

전체 리스트를 다시 그릴 필요가 없습니다.

이를 통해 UI 성능을 크게 향상시킬 수 있습니다.

ListAdapter는 내부적으로 AsyncListDiffer 클래스를 사용하여 이 기능을 구현합니다.

AsyncListDiffer는 백그라운드 스레드에서 데이터 비교를 수행하고,

변경 사항을 UI 스레드에 전달합니다.

# ListAdapter 사용법

1. ListAdapter 클래스 정의

   - RecyclerView.Adapter를 상속하고 ListAdapter를 구현합니다.

   - 데이터 모델 클래스와 DiffUtil.ItemCallback 구현체를 제네릭 타입으로 지정합니다.

2. DiffUtil.ItemCallback 구현

   - areItemsTheSame: 두 항목이 동일한지 확인합니다.

   - areContentsTheSame: 두 항목의 내용이 동일한지 확인합니다.

3. onCreateViewHolder, onBindViewHolder 구현

   - 기존 RecyclerView.Adapter와 동일한 방식으로 구현합니다.

4. 데이터 업데이트

   - submitList 메서드를 사용하여 새로운 데이터 리스트를 전달합니다.

   - ListAdapter가 내부적으로 DiffUtil을 사용하여 변경 사항을 계산하고 UI를 업데이트합니다.


다음은 ListAdapter 사용 예시 코드입니다

class MyAdapter : ListAdapter(MyDiffCallback()) {
    
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
        // ViewHolder 생성 코드
    }

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        // ViewHolder 바인딩 코드
    }

    class MyDiffCallback : DiffUtil.ItemCallback() {
        override fun areItemsTheSame(oldItem: MyData, newItem: MyData): Boolean {
            return oldItem.id == newItem.id
        }

        override fun areContentsTheSame(oldItem: MyData, newItem: MyData): Boolean {
            return oldItem == newItem
        }
    }
}

// 데이터 업데이트
val newList = listOf(/* 새로운 데이터 */)
myAdapter.submitList(newList)

# ListAdapter의 장점

1. UI 성능 향상

 - DiffUtil을 사용하여 변경된 부분만 업데이트하므로 전체 리스트를 다시 그릴 필요가 없어 UI 성능이 향상됩니다.

2. 코드 간결성

 - 기존 RecyclerView.Adapter에 비해 코드가 간결해집니다. DiffUtil 관련 로직을 직접 구현할 필요가 없습니다.

3. 유지보수성 향상 

 - 데이터 모델 클래스와 DiffUtil.ItemCallback 구현체를 분리하여 관리할 수 있어 유지보수성이 향상됩니다.

 

# 추가 정보: DiffUtil

DiffUtil은 두 리스트 간의 차이를 계산하는 유틸리티 클래스입니다.

ListAdapter는 DiffUtil을 활용하여 리스트 업데이트를 효율적으로 수행합니다.

DiffUtil.ItemCallback 구현체에서는 다음과 같은 메서드를 오버라이드해야 합니다

 - areItemsTheSame : 두 항목이 동일한지 확인합니다. 일반적으로 고유 식별자

  (예: id)를 비교합니다.

- areContentsTheSame : 두 항목의 내용이 동일한지 확인합니다. 데이터 모델 클래스의 필드 값을 비교합니다.

DiffUtil은 이 정보를 바탕으로 기존 리스트와 새로운 리스트 간의 차이를 계산하고, 변경된 부분만 업데이트합니다.


이상으로 안드로이드 코틀린에서 ListAdapter 사용법에 대해 알아보았습니다.

ListAdapter를 사용하면 RecyclerView의 UI 성능을 크게 향상시킬 수 있습니다. 

데이터 모델 클래스와 DiffUtil.ItemCallback 구현체를 분리하여 관리함으로써

코드의 간결성과 유지보수성도 높일 수 있습니다. 

 

Google Lookout


Google Lookout: 어떤 시각 장애인을 도와주는 안드로이드 앱일까?


Google Lookout은 시각장애인이 주변 환경을 더 잘 인식할 수 있도록 도와주는 안드로이드 앱이에요.

Lookout은 사물, 이미지, 텍스트 등에 대한 세부 정보를 인식하고 설명해요.

카메라를 이용하여 일상 업무를 보다 효율적으로 수행할 수 있도록 도와주며, 문서 읽기, 우편 정리, 식료품 정리 등의 작업을 수행할 수 있어요.

Lookout는 텍스트 읽기, 물체 탐색, 통화와 음식 라벨 식별, 이미지 설명 등을 지원하며, Google Play Store에서 Lookout를 다운로드하여 사용할 수 있어요.

 
 
 

Lookout 앱의 주요 기능


도큐먼트 모드를 활용하여 책이나 손으로 쓴 편지를 읽을 수 있고, Lookout은 문서를 자동으로 캡처하고 읽어줘요.

리딩 툴바로 분량 읽기를 조절하거나 속도 조절할 수 있고, 설정 아이콘으로 설정을 조정할 수 있어요.

음식 라벨 모드를 통해 포장된 식품 제품 앞의 라벨을 스캔하고 인식 가능하며, 통화 모드로는 특정 통화를 식별할 수 있어요.

Lookout의 이미지 모드는 사진을 설명하고, 영어 캡션을 제공하며 이미지를 다른 앱에 공유할 수 있어요.

 
 
 

Lookout 사용법과 설정 변경 방법


최근 목록에서 Lookout이 감지한 아이템의 이력을 검토할 수 있고, 다른 사람과 공유할 수 있어요.

Lookout은 기본적으로 안드로이드 폰과 동일한 설정을 사용하지만, 언어를 바꾸려면 지구 모양 아이콘을 클릭하면 돼요.

음식 라벨 모드의 국가 또는 통화 모드를 변경하고 싶다면, 각 모드의 상단 아이콘을 탭하세요.

국가 또는 통화를 변경하면 해당 국가의 새로운 데이터를 다운로드하도록 메시지가 표시돼요.



 

Android 14 새로운 기능

 


안드로이드 14의 새로운 기능은?


구글이 안드로이드 14에서 사용 가능한 새로운 기능 14가지를 소개해요.

안전성과 개인정보 보호에서 자동으로 PIN 확인 옵션을 추가하여 사용자들의 편의를 높였어요.

기존에는 적용되지 않았던 점으로, 전원을 켠 직후나 재부팅 후에도 사용할 수 있죠.

PIN을 설정한 후에 '설정 - 보안 및 개인정보 - 기기 잠금 방식 - 화면 잠금 - 최소한 6자리 코드 입력 - 자동으로 올바른 PIN 확인'으로 설정할 수 있어요.


분할 화면 기능 업그레이드 내용


분할 화면 기능이 개선되어 더 명확하게 각 애플리케이션의 레이아웃을 보여줘요.

세로나 가로 방향으로 태블릿을 사용할 때도 가능하며, split-screen 모드 진입 시 어플리케이션이 어디에 나타날지 이해하기 쉽게 변화시켰어요.

첫 번째 애플리케이션과 함께 사용할 경우에도 더 명확한 선택을 위해 첫 번째 애플리케이션에 더 잘 보이는 split-screen 진입 옵션이 있다요.


새로운 잠금 화면 시계 스타일 기능은?


안드로이드 14에서는 잠금 화면 시계를 8가지 사전 설정된 스타일 중 하나로 변경할 수 있는 편리한 기능이 추가돼요.

기술적으로는 16가지 스타일이 있지만, 선호하는 스타일이 작은 좌측 상단 시계라면 강제로 선택할 수 있어요.

이러한 스타일은 기본적으로 '다이나믹 컬러 설정'에 기반하지만, 원하는 경우 제한된 팔레트 옵션 중에서 선택할 수 있어요.

구글이 '메테리얼 U'를 계속 발전시킨다면 미래에는 튜닝 옵션을 더욱 확장할 것으로 기대돼요.

안드로이드에 적용된 이 옵션은 미래에는 튜닝 옵션을 더욱 확장하고 산재된 것과는 다른 매력을 제시하게 될 것이에요.


새 미니 게임과 예측 백 제스처


안드로이드 14에서 'About Phone'으로 이동하여 소프트웨어 빌드에 대한 Android 14 옵션을 찾은 후, 해당 옵션을 여러 번 누르거나 탭하여 Android 14 로고가 표시될 때까지 기다려요.

로고를 길게 누르면 우주선처럼 부서져 나가며, 이것만으로도 꽤 멋져요.

하지만 공간 테마에 따라 계속 진행되는, 보다 어렵게 보이는 새로운 '루나 미니 게임'으로 진입하게 돼요.

이러한 게임들의 부활을 보는 것이 좋으며, 사용자 본인이 직접 시도해보기를 강력히 추천해요.

또한, 안드로이드 14에서 예측 백 제스처가 새롭게 추가되어 개발자 옵션에서 토글로 숨겨져 있다는 점에 주목할 필요가 있어요.


안드로이드 14에서 사용자 경험의 주요 변경점?


안드로이드 14에서는 제스처 네비게이션으로 백 제스처를 사용할 때, 목적지 시스템 미리보기가 가능해져 부드럽고 세련된 애니메이션을 제공하고 있어요.

픽셀폰에 충전기를 연결할 때 새로운 애니메이션도 추가되어, 동적 색상의 작은 알약 모양으로 배터리 인디케이터가 변하는 것이 특징이에요.

안드로이드 14에서는 PIN 입력 확인 및 잠금 화면 스킵할 수 있게 되었으며, 키 누름 감지 시 이제는 이전 버전의 점과 원 대신 작은 머티리얼 UI 아이콘으로 표시되죠.

이러한 변화들은 안드로이드 14에서의 사용자 경험과 디자인 변화 중 하나로, 픽셀폰 사용자들이 소중히 여기는 구글이 도입하는 변화의 한 부분입니다.


픽셀 버전 안드로이드의 새로운 변화


픽셀 버전의 Android에서 시각적으로 중요한 새로운 변화인 플래시 통지 기능이 추가되었어요.

이는 새로운 알림이 도착했음을 시각적으로 알려주는 접근성 기능이죠.

앱 알림 도착 시 디스플레이에 번쩍이는 색상을 설정할 수 있고 12가지 색상 중 선택 가능하죠.

뿐만 아니라, 플래시 통지 설정으로 카메라 플래시를 깜박이는 대신 펄스 설정할 수 있어요.

또한, 기기의 제스처 네비게이션 영역을 투명하게 설정하는 기능도 추가되었어요.

이는 개발자 옵션 섹션에서 설정하는데, 흑백으로 주의를 분산시킬 수 있다는 점을 유의해야 해요.


Android 12의 미디어 플레이어와 애니메이션의 변화


화면을 좌나 우측에서 스와이프하면 UI에서 뒤로 이동하는 가이드 서클이 나타나죠.

가이드 서클의 색상은 시스템 테마의 색상과 일치하며, Google은 이를 통해 안드로이드 12 이후부터 중요한 부분이 된 테마를 지원하기 위한 노력을 보여준다고 해요.

Google은 시스템 미디어 플레이어를 계속 발전시키고 있고, 올해는 미디어 플레이어 사용 시 파도 타는 빛나는 애니메이션 효과가 추가되었어요.

이전에 베타 버전에 있던 효과가 안정적인 안드로이드 빌드에 포함되며, 리파인된 잠금 화면 공개 애니메이션이 함께 업데이트되었답니다.


밝은 색을 좋아하지 않는 사람을 위한 옵션이 추가된 이유


동영상에서 동적 컬러 테마에 관한 이야기를 계속하고 있어요.

밝고 장난기 많은 색상을 좋아한다면 훌륭한 선택이에요.

그러나 이제는 화면 배경 및 스타일 앱에 단색 옵션이 추가되어, 휴대폰에서 밝은 색상을 좋아하지 않는 경우에도 선택할 수 있어요.

특별한 에디션은 아니지만, 대담한 색상을 좋아하지 않는다면 좀 더 간단하게 유지할 수 있는 옵션이 추가되었다.

이제 안드로이드 14에서는 잠금 화면 퀵 토글을 사용자 정의하거나 완전히 비활성화할 수 있게 되었어요.


One UI의 단축키 활용 방법


One UI에서 단축키는 디폴트 카메라, 비공개 모드, 구글 홈 컨트롤, 빠른 음소거 스위치, QR 코드 스캐너, 손전등 또는 토치 옵션, 비디오 카메라 모드 등 포함하여 8가지로 제한돼요.

이 단축키를 탭하거나 실수로 그럴 경우, 폰이 흔들리면서 진동으로 알려주며 완전히 해제하거나 액세스할 수 있도록 길게 눌러야 해요. 안드로이드 14에서는 애플리케이션 간 텍스트 복사가 편리해지고, 텍스트를 선택하고 길게 누른 뒤 다른 애플리케이션 텍스트 입력 창으로 끌어다 이동하여 즉시 붙여넣기할 수 있어요.

휴대폰 화면에서 사용하기에는 쉽지 않은 제스처이지만, 분할 화면 모드를 사용하거나 Pixel Fold나 Pixel Tablet 같은 큰 화면 기기를 사용할 때 유용하구요.

안드로이드 14의 최신 기능 14가지를 Pixel 폰에서 알아두어야 해요.



G
M
T
Y
음성 기능은 200자로 제한됨

2024년 5월 2일 목요일

Android 15 Beta 1

- 안드로이드 15 베타1 에서는 무엇을 다루나요?


안드로이드 15의 첫 공개 베타 버전에 대해 소개하며, 무료 라이트 모드 배경화면을 제공해요.


2,500개의 좋아요가 달리면 다크 모드 버전도 제공한다고 약속하며, 베타 1에서 새로워진 내용을 알아봅니다.


구독 유도를 하며, Android 15 관련 콘텐츠를 더 많이 받아보라고 권유하고, 딥 다이브 형식의 콘텐츠를 추구한다고 합니다.



- 안드로이드 15 Beta 1에서 구글 지갑 앱의 기본 설정과 보안 개선사항은?


안드로이드 15 Beta 1에서는 기기에 기본으로 설정할 수 있는 지갑 애플리케이션 기능이 추가됐어요.


기본 설정 앱을 변경하면 이제 NFC 결제가 처리되고, 기존 Pixel은 Google Wallet 앱으로 설정되지만 다른 어플은 이를 제어할 수 없죠.


기능을 완전히 비활성화도 가능하며, 기기 이름을 공유하지 않도록 하는 새로운 토글도 있어 개인정보 보호를 향상시켰어요.


또한, Android 15 beta 1에서는 셀룰러 네트워크 보안 메뉴를 통해 안전하지 않은 네트워크를 감지하고 이를 알리는 기능이 추가되었어요.



- 안드로이드 15 베타 1의 주요 변경 사항은?


안드로이드 15 베타 1의 중요한 변경 사항은 애플리케이션 내에서 정보를 프로파일링할 수 있는 개발자 기능이에요.


일반 사용자들을 위해서는 이는 개발자 옵션에서 메모리 사용량을 확인할 수 있는 기능으로 나타나죠.


베타 1에서는 이 추적 기능을 비활성화 또는 활성화할 수 있어요.


기본적으로 비활성화되어 있으며, 시간에 따라 전화기에서 사용 중인 메모리 용량을 확인하려면 재시동이 필요해요.


작은 UI 변경 사항과 조정이 많이 있지만, 원하는 대로 이 추적 기능을 활성화 또는 비활성화할 수 있는 옵션이 있어요.



- 안드로이드 15 베타 1 빌드의 새로운 변화와 이슈


안드로이드 15 베타 1 빌드에서 빅스비 텍스트가 약간 덜 진해진 걸 발견했고, 텍스트 도중에 이중 헤더 또는 섹션 제목이 나타나는 현상을 관찰했어요.


새로운 시각적 변화 중에서는 일부가 약간 이상한 3D 효과를 나타내고, 두 번째 헤더는 데이터에 따라 다크 모드에서 더 나은 모습을 보였어요.


미래에는 안드로이드 15를 타겟팅하는 앱들이 베타 1부터 기본으로 에지를 표시할 것이고, 큰 화면에서 더 나은 시각적 경험을 제공할 예정이에요.


아직 이 변경사항을 지원하는 애플리케이션이 없지만, 향후 더 많은 앱 지원이 예상되고, 시간이 지날수록 더 많은 변화가 예정돼 있어요.



- Android 15 Beta 1에 미세한 변화는 무엇인가요?


Android 15 Beta 1에서는 예측 제스처에 미세한 변화가 있었어요.


대부분의 애플리케이션에서 널리 사용되지 않는 예측 제스처에서 새로운 옵션이 '프레잉 카드'처럼 더 자연스러운 디자인으로 변화되었다고 해요.


그러나 이 변화를 확인하려면 대부분은 개발자 옵션으로 이동하여 활성화해야 합니다.


Android 15 Beta 1에서는 그 외에 큰 변화보다는 이런 미세한 변화가 중심이었어요.


Android 15 Developer Preview 2

 


- Android 15 개발자 미리보기 2 업데이트의 핵심은?


구글이 Android 15 개발자 미리보기 2 업데이트를 공개했고, 유용한 추가 기능이 포함되었어요.


Android 15 중요 사용자 관련 변경 사항을 살펴보면, 새로운 오디오 공유 메뉴와 다운로드된 앱을 디바이스에 보관할 수 있는 기능이 주목할 만 합니다.


앱 정보 페이지의 '앱 열기' 버튼 옆에 '아카이브된' 앱이 위치하며, 홈 화면에서 회색으로 표시되어 Play Store에서 아이콘을 탭하여 다시 다운로드할 수 있어요.


픽셀을 웹캠으로 사용할 때 고품질 토글을 사용할 수 있으며, 비디오를 밝고 조금 더 선명하게 제공한다고 하네요.


또한, 개발자 미리보기 2에서 사소한 디자인 변경 사항이 소개되었지만 크게 변한 것은 없어요.


사용자에게 노출된 모든 변경 사항을 다룬 후, 더 많은 변경 사항에 대해 이야기할 예정이라고 해요.



- Android 15의 개발자 기능 기능성은?


Android 15에서 개발자가 이용할 수 있는 기술적 측면은 덮개가 있는 플리파블 기기에 대한 앱 호환성 선언이에요.


또한, 위성 연결도 주요 관심 사항 중 하나로 Android 15에서는 사용 중일 때의 새로운 상태 표시줄 아이콘 및 메시지 및 작동 방식에 대한 정보를 간단히 볼 수 있는 알림을 제공해요.


또한, SMS, MMS 및 RCS 메시징과 같은 앱은 위성 연결 기능을 활용하여 더 부드러운 사용자 경험을 제공할 수 있어요.


또한, 앱이 차가운, 따뜻한 또는 뜨거운 상태로 시작되었는지 추적할 수 있으며 앱이 다양한 출처에서 시작되었는지 확인할 수 있는 새로운 도구를 제공해요.


마지막으로, 앱이 화면 녹화 중인지 감지하고 사용자에게 알릴 수 있으며 NFC의 개선을 통해 더욱 원활한 탭하여 지불 트랜잭션을 제공해요.



- PDF 향상 기능과 안드로이드 15 업데이트의 주요 내용은?


앱에서 암호 보호된 파일, 주석, 양식 편집, 복사 검색 선택 등이 가능한 PDF 향상 기능이 곧 출시될 거예요.


기존 기능을 보완하는 주요 개발자 중점 기능 외에도 기술적인 내용은 링크로 안내되며, 안드로이드 15 설치를 원하는 경우 9to5Google 웹사이트에서 안내가 가능해요.


사용자 간의 큰 변경점이 많지 않아서 지금 안드로이드 15를 설치하는 건 권장되지 않지만, 개발자 중점 기능은 앞으로의 안드로이드 버전을 기대하게 만들어요.


2023년 7월 2일 일요일

경주 주상절리

경주여행 - 주상절리

경주하면 떠오르는 대표 관광지 중 하나인 주상절리는 용암이 빠르게 식으면서 기둥 모양으로 굳어진 지형입니다.

 

 제주도나 울릉도 등 다른 지역에서도 주상절리를 볼 수 있지만 경주의 주상절리는 독특한 형태로도 유명한데요. 부채꼴 모양의 주상절리가 특히 유명하답니다.

이번 주말엔 가족과 함께 경주 주상절리 구경하러 떠나보는건 어떨까요?

 

 

사진제공 - 경주시 관광자원 영상이미지
(https://www.gyeongju.go.kr/gyeongjuimage/page.do?cmd=2&mnu_uid=2440&con_uid=4199)

 

주상절리는 어떻게 만들어지나요? 주상절리는 화산활동시 분출되는 뜨거운 용암이 지표면에 흘러내리면서 급격히 식어서 만들어진 육각형 또는 사각형 돌기둥을 말합니다. 이러한 절리(틈)들이 수직방향으로 발달하면서 형성되는데요. 이 때 암석이 냉각될 때 부피가 수축되면서 사이사이에 틈이 생기게 됩니다. 그리고 오랜 시간동안 풍화작용을 거치면 균열이 생긴 암석 조각들이 떨어져 나가면서 지금의 모습처럼 멋진 주상절리를 이루게 된답니다.


경주의 주상절리는 어떤 특징이 있나요? 앞서 말했듯이 경주의 주상절리는 특이한 형태로도 유명한데요. 위 사진 속 부채꼴 모양의 주상절리가 보이시나요?

이렇게 큰 규모의 부채꼴 모양의 주상절리는 국내에서는 유일하게 경주에서만 볼 수 있다고 합니다. 또한 바다 근처에 위치해서 파도소리길이라는 산책로를 걸으며 아름다운 자연경관을 감상할 수 있답니다.


주변에 가볼만한 곳이 있나요? 부채꼴모양의 주상절리 뿐만 아니라 다양한 종류의 주상절리를 한 눈에 볼 수 있는 읍천항 벽화마을 추천드려요. 마을 곳곳에 그려진 예쁜 벽화들을 보며 걷다보면 마음속 힐링 제대로 느낄 수 있으실 꺼에요. 주변에 카페도 많으니 여유롭게 커피한잔 하며 둘러보는것도 좋을 것 같아요.


2019년 10월 10일 목요일

Android NDK


Android Studio 에서 App 빌드후 생성된 so ndk-build.cmd 생성한 so 파일의 크기가 다르다. 왜일까?
또한 ndk-build 이용해야 so libs 복사된다.(내부 install 명령을 통해서)

Android Studio Ndk-build 설정
File - Settings - Tools - External Tools - add

Build 추가
Program : sdk 설치폴더\ndk-bundle\ndk-build.cmd
Working dir : 프로젝트\app\src\main (or jni)

Clean 추가
Program : sdk 설치폴더\ndk-bundle\ndk-build.cmd
Arguments : clean
Working dir : 프로젝트\app\src\main (or jni)

 

 

[Build error : Error fatal error opening dependency file … No such file or directory]

D:/xxx/yyy/zzz/D_/build/xxx/yyy 형태로 중복 출력되는 경우

프로젝트의 경로가 너무 길어 발생하는 문제

 

2019년 8월 29일 목요일

Android Studio build error

  • java.lang.UnsatisfiedLinkError

Jni library를 추가 하거나, 빌드된 Library를 추가 했을 경우 아래와 같은 에러 발생
1. gradle.properties 파일  -> 아래 한 줄을 추가
   android.useDeprecatedNdk=true
2. app/build.gradle 파일 -> 아래 소스 추가
   defaultConfig {
        ndk {
            abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
        }
    }

  • GCM java.io.IOException: SERVICE_NOT_AVAILABLE

시스템 환경설정 시간을 자동으로 설정

  • More than one file was found with OS independent path 'lib/armeabi-v7a/libxxx.so' 
해당 모듈의 build.gradle 에 추가.

 
packagingOptions {
    pickFirst 'lib/arm64-v8a/*'
    pickFirst 'lib/armeabi-v7a/*' 
}
 

2019년 7월 18일 목요일

Android SECRET_CODE

디버깅 로그 확인을 위해 SECRET_CODE 를 사용하였는데 언제부터인가 안되는 단말이 생기기 시작했다.
관련 내용을 정리해본다.

기본 dialer 앱을 통해 동작시켜야 한다.
*#*#code#*#* 이 동작하지 않을 경우는 adb 를 이용하는 방법도 있다.

adb shell am broadcast -a android.provider.Telephony.SECRET_CODE -d android_secret_code://codeNumber

but, Android Oreo(?) 이후부터는 exception 발생한다.
java.lang.SecurityException: Permission Denial: not allowed to send broadcast android.provider.Telephony.SECRET_CODE

API29 에서 ACTION_SECRET_CODE 가 생긴다는데 추후 확인 필요하다.

현재까지의 결론은, S 폰은 위 방법들로는 안되는거 같고, 내가 가지고 있는 일부 폰에서는 dialer app 에서는 동작은 한다.

2018년 6월 26일 화요일

Android Runtime Exception


  • Only the original thread that created a view hierarchy can touch its views
Original Thread으로만 UI를 변경하여야 함.
Main Thread 외의 새로 생성한 Thread를 이용하여 임의로 UI를 업데이트 할 경우 발생.
Handler를 이용하여 Main Thread를 간접적으로 사용하여하 함.




2017년 11월 30일 목요일

Git



git status
git add .
git commit -m "내용" (status 로 확인)
git log

[branch 생성 및 checkout]
git branch xxx
git checkout xxx
(git check -b xxx : 2명령어를 한번에.)

원격 브치가 이미 존재 할 경우 원격 브랜치를 기준으로 로컬 브랜치를 만드는 방법
git checkout -b dev origin/dev

이미 존재하는 브랜치를 바로 가져오기
git bash 를 관리자 권한으로 실행 - 폴더 이동
git clone -b dev(브랜치명) http://xxx/xxx.git xxx_dev(폴더명 지정)

[work 브랜치에서 작업]
git add .
git commit -m "xxx"
git push origin work (work push)

[리모트 서버로부터 동기화]
git fetch origin

[work branch master merge & push]
git branch (현재 위치 확인)
git checkout master (master 로 변경)
git merge xxx (merge 할 브랜치 이름)
git push origin master (master push)

[remote branch push commit 삭제]
git reset --hard commit_id (id push 이전의 id, 내가 올리기전 마지막 id)
git push -f origin master (reset 이후 강제 push)

[add 취소]
git reset HEAD 파일명 (파일명 입력하지 않으면 모두 취소)

[commit 취소]
[방법 1] commit을 취소하고 해당 파일들은 staged 상태로 워킹 디렉터리에 보존
$ git reset --soft HEAD^
[방법 2] commit을 취소하고 해당 파일들은 unstaged 상태로 워킹 디렉터리에 보존
$ git reset --mixed HEAD^ // 기본 옵션
$ git reset HEAD^ // 위와 동일
$ git reset HEAD~2 // 마지막 2개의 commit을 취소
[방법 3] commit을 취소하고 해당 파일들은 unstaged 상태로 워킹 디렉터리에서 삭제
$ git reset --hard HEAD^

[push 취소]
가장 최근의 commit을 취소 (기본 옵션: --mixed)
$ git reset HEAD^

Reflog(브랜치와 HEAD가 지난 몇 달 동안에 가리켰었던 커밋) 목록 확인
$ git reflog 또는 $ git log -g
 
원하는 시점으로 워킹 디렉터리를 되돌린다.
$ git reset HEAD@{number} 또는 $ git reset [commit id]

commit message 수정
$ git commit -m "Write commit messages"

push
$ git push origin [branch name] -f 또는 $ git push origin +[branch name]


[충돌시]
Android Studio 이용시 unlink 에러는 read-only 이거나 write 가 안되는 상황 (다른 프로세스에서 잡고 있는 경우)
error: Your local changes to the following files would be overwritten by checkout:
Please commit your changes or stash them before you switch branches.


[Option]
git add -A : stages All
git add .  : stages new and modified, without deleted
git add -u  : stages modified and deleted, without new
//git remote add origin <원격서버주소>

git show <tag명>  : 태그정보와 해당 태그의 commit 정보를 확인한다.
ex : git show v1.4

git tag
git tag -l 'v.1.4.*' : Tag 목록조회 [v1.4 버전들의 목록만 조회]
git tag -a <tag명> -m '[tag message]' : 태그 추가
ex>git tag -a v1.0 -m 'add first release tag'
git push origin v1.4 : 태그 반영

git remote [-v] // 원격 저장소 정보 확인
git remote show <remote명> //리모트 저장소 살펴보기

comment message 수정
git commit --amend -> 내용 수정
git commit --amend -m "New commit message"

git pull

소스 수정사항 원복시키기(서버 상태 동기화?)
git fetch origin
git reset --hard origin/master

git config --global --list
현재 설정정보 조회할 수 있습니다. --global옵션은 전역설정에 대한 옵션이며 현재 프로젝트에만 적용할때는 주지 않습니다.
git config --global user.name "사용자명"
사용자명을 등록합니다 (필수)
git config --global user.email "이메일주소"
이메일 주소를 등록합니다. (필수)
git config --global color.ui “auto”
터미널에 표시되는 메시지에 칼라를 표시해줌


git에 대해서 사전에 알아야 될 부분은 아래와 같습니다.

git의 저장소는 3가지 단계로 나누어 집니다. 커밋한 소스가 보관되는 저장소와 현재 프로젝트 파일들이 있는 작업트리, 저장소와 작업트리사이의 버퍼영역으로 커밋될 대상이 저장되는 스테이징 영역입니다.
    git은 빈 디렉토리는 추적하지 않습니다.
    형상관리를 하지 않을 파일은 .gitignore 파일에 추가합니다.
    HEAD는 현재 브랜치의 가장 최신커밋을 의미한다.
    기본원격 저장소를 origin이라고 부릅니다.


[멀티 계정 사용시]
나의 경우 github(개인), bitbucket(회사) 2개를 동시에 사용하고자 할 경우
1. 각 계정별 ssh key 생성 및 등록
git bash home 에서 .ssh 폴더로 이동하여 생성
ssh-keygen -t rsa -b 4096 -C "abc@xxx.com"
ssh-add ~/.ssh/id_rsa_xxx
clip < ~/.ssh/id_rsa.pub (클립보드 복사)
각 사이트에 ssh key 붙여넣기

2. git config 에 각 계정 등록 (이 부분이 실제로 필요한지 확인이 안됨)
touch config
아래 내용 작성
# seesky89
Host seesky89
HostName github.com
User seesky89
IdentityFile ~/.ssh/id_rsa_seesky89

# aaa
Host aaa
HostName abc.com (포트 특정시 abc.com:7990)
User aaa
IdentityFile ~/.ssh/id_rsa_aaa

3. 그 이후에는 사용하던대로 하면 된다.
(대부분 해당 툴에서 계정 연동 팝업이 뜬다.)
bash 환경에서 할 경우 아래처럼 설정해줘도 된다.
git config --local user.name "aaa"
git config --local user.email "bbb@ccc.com"



[기본적인 명령어]
git --version
현재 git의 버전을 확인합니다.

git init
현재 디렉토리에 git 저장소를 생성합니다.

git add 파일명
git add는 2가지를 하는데 untracked files의 파일들을 git가 추적하도록 하거나 파일은 수정했지만 아직 스테이징 영역에 올라가지 않은(Changed but not updated) 파일들을 스테이징 영역에 올립니다. -i 옵션을 주면 대화형모드가 시작되며 파일의 일부분만 선택해서 스테이징하는 것이 가능합니다. -p 옵션을 사용하면 -i 대화형모드없이 바로 패치모드를 사용할 수 있습니다.

git commit -m "커밋메시지"
스테이징 영역에 올라가 있는 파일들을 커밋합니다. -m 은 커밋메시지를 주는 옵션으로 여러 줄의 커밋메시지를 쓸 경우 -m 을 여러개 사용할 수 있습니다. -a 옵션을 사용하면 스테이징에 올리는 작업과 커밋을 동시에 할 수 있습니다.(추적되지 않는 파일은 추가하지 않습니다.) -m을 사용하지 않을때 -v옵션을 사용하면 편집기에 커밋하려는 변경사항의 다른점을 보여줍니다. 특정파일만 커밋하려면 마지막에 파일명을 추가해주면 됩니다.

git commit -C HEAD -a --amend
지정한 커밋의 로그메시지를 다시 사용하여 기존커밋을 수정합니다. -c를 사용하면 기존메시지를 수정할 수 있는 편집기를 실행해 줍니다.

git status
커밋되지 않은 변경사항을 조회합니다.

git diff
스테이징영역과 현재 작업트리의 차이점을 보여줍니다. --cached 옵션을 추가하면 스테이징영역과 저장소의 차이점을 볼 수 있다. git diff HEAD를 입력하면 저장소, 스테이징영역, 작업트리의 차이점을 모두 볼 수 있다. 파라미터로 log와 동일하게 범위를 지정할 수 있으며 --stat를 추가하면 변경사항에 대한 통계를 볼 수 있습니다.

git mv 파일명 새파일명
기존에 존재하는 파일을 새파일로 이동합니다. 변경이력은 그대로 유지합니다.

git checkout -- 파일명
아직 스테이징이나 커밋을 하지 않은 파일의 변경내용을 취소하고 이전 커밋상태로 돌립니다. svn에서 revert와 동일합니다.



Branch와 Tag
git branch
현재 존재하는 브랜치를 조회합니다. -r 옵션을 사용하면 원격저장소의 브랜치를 확인할 수 있습니다.

git branch 브랜치명B 브랜치명A
브랜치명A에서 새로운 브랜치 브랜치명B를 만듭니다. (git에서 기본 브랜치는 master라는 이름을 사용합니다.)

git branch 브랜치명
브랜치명의 새로운 브랜치를 만듭니다.(체크아웃은 하지 않습니다.)

git branch -d 브랜치명
브랜치를 삭제합니다.

git branch -m 존재하는브랜치명 새로운브랜치명
존재하는 브랜치를 새로운브랜치로 변경합니다. 이미 존재하는 브랜치명이 있을 경우에는 에러가 나는데 -M 옵션을 사용하면 이미 있는 브랜치의 경우에도 덮어씁니다.

git tag 태그명 브랜치명
브랜치명의 현재시점에 태그명으로 된 태그를 붙힙니다. git tag만 입력하면 현재 존재하는 태그 목록을 볼 수 있습니다.

git checkout 브랜치명/태그명
해당 브랜치나 태그로 작업트리를 변경합니다.

git checkout -b 브랜치명B 브랜치명A
브랜치명A에서 브랜치명B라는 새로운 브랜치를 만들면서 체크아웃을 합니다.

git rebase 브랜치명
브랜치명의 변경사항을 현재 브랜치에 적용합니다.

git merge 브랜치명
브랜치명의 브랜치를 현재 브랜치로 합칩니다. --squash 옵션을 주면 브랜치명의 모든 커밋을 하나의 커밋으로 만듭니다.

git cherry-pick 커밋명
커밋명의 특정 커밋만을 선택해서 현재 브랜치에 커밋으로 만듭니다. -n 옵션을 주면 작업트리에 합치지만 커밋은 하지 않기 때문에 여러개의 커밋을 합쳐서 커밋할 수 있습니다.



로그 관리
git log
커밋로그들을 볼 수 있으면 -1나 -2같은 옵션을 주어 출력할 커밋로그의 갯수를 지정할 수 있습니다. --pretty=oneline 옵션을 주면 한줄로 간단히 보여주고 --pretty=format:"%h %s"처럼 형식을 정해줄 수 있습니다. -p 옵션을 사용하면 변경된 내용을 같이 보여줍니다. --since="5 hours" 이나 --before="5 hours"같은 옵션도 사용가능합니다. --graph 옵션을 주면 브랜치 트리를 볼 수 있습니다.

git log 커밋명
해당 커밋명의 로그를 볼 수 있습니다. 커밋명A..커밋명B (마침표2개)와 같이 입력하면 커밋명A이후부터 커밋명B까지의 로그를 볼 수 있습니다. ^은 -1과 동일해서 HEAD^라고 하면 최신바로 이전 커밋이고 HEAD^^^와 같이 쓸 수 있으며 HEAD~3을 하면 HEAD의 3개 이전의 커밋을 뜻합니다.

git blame 파일명
갈 줄 앞에 커밋명과 커밋한 사람등의 정보를 볼 수 있습니다.

git blame -L 10,15 파일명
-L 옵션을 사용하면 10줄부터 15줄로 범위를 지정해서 볼수 있고 15대신 +5와 같이 사용할 수 있습니다. 숫자의 범위 대신 정규식도 사용이 가능합니다.

git blame -M 파일명
-M 옵션을 사용하면 반복되는 패턴을 찾아서 복사하거나 이동된 내용을 찾아줍니다.  -C -C 옵션을 사용하면 파일간의 복사한 경우를 찾아줍니다. -C -C는 git log에서도 사용가능하며 내용의 복사를 찾을때는 git log에서 -p옵션을 사용합니다.

git revert 커밋명
기존의 커밋에서 변경한 내용을 취소해서 새로운 커밋을 만듭니다. -n옵션을 사용하면 바로 커밋하지 않기 때문에 revert를 여러번한 다음에 커밋할 수 있습니다.(항상 최신의 커밋부터 revert해야 합니다.)

git reset 커밋명
이전 커밋을 수정하기 위해서 사용합니다. --soft 옵션을 사용하면 이전 커밋을 스테이징하고 커밋은 하지 않으며 --hard옵션은 저장소와 작업트리에서 커밋을 제거합니다. git reset HEAD^와 같이 입력하면 최근 1개의 커밋을 취소할 수 있습니다.

git rebase -i 커밋범위
-i옵션으로 대화형모드로 커밋 순서를 변경하거나 합치는 등의 작업을 할 수 있습니다.



원격저장소
git clone 저장소주소 폴더명
원격저장소를 복제하여 저장소를 생성합니다. 폴더명을 생략가능합니다.

git fetch
원격저장소의 변경사항 가져와서 원격브랜치를 갱신합니다.

git pull
git fetch에서 하는 원격저장소의 변경사항을 가져와서 지역브랙치에 합치는 작업을 한꺼번에 합니다. 파라미터로 풀링할 원격저장소와 반영할 지역브랜치를 줄 수 있습니다.

git push
파라미터를 주지 않으면 origin 저장소에 푸싱하며 현재 지역브랜치와 같은 이름의 브랜치에 푸싱합니다. --dry-run 옵션을 사용하면 푸싱된 변경사항을 확인할 수 있습니다. 로컬에서 tag를 달았을 경우에 기본적으로 푸싱하지 않기 때문에 git push origin 태그명이나 모든 태그를 올리기 위해서 git push origin --tags를 사용해야 합니다.

git remote add 이름 저장소주소
새로운 원격 저장소를 추가합니다.

git remote
추가한 원격저장소의 목록을 확인할 수 있습니다.

git remote show 이름
해당 원격저장소의 정보를 볼 수 있습니다.

git remote rm 이름
원격저장소를 제거합니다.



서브모듈
git submodule
연관된 하위모듈을 확인할 수 있습니다.

git submodule add 저장소주소 서브모듈경로
새로운 하위모듈을 해당경로에 추가합니다. 추가만하고 초기화 하지는 않으며 커밋해쉬앞에 마이나스(-) 표시가 나타납니다.

git submodule init 서브모듈경로
서브모듈을 초기화 합니다.

git submodule update 서브모듈경로
서브모듈의 변경사항을 적용합니다.(저장소의 최신커밋을 추적하지 않습니다.)



기타 명령어
git archive --format=tar --prefix=폴더명/ 브랜치혹은태그 | gzip > 파일명.tar.gz
git archive --format=zip --prefix=폴더명/ 브랜치혹은태그 > 파일명.zip
해당 브랜치나 태그를 압축파일로 만듭니다. --prefix를 주면 압축하일이 해당폴더 안에 생성되도록 할 수 있습니다.

git mergetool
설정에 merge.tool의 값에 있는 머지툴을 찾아서 실행합니다.

git gc
저장소의 로그를 최적화 합니다. 로그가 변경되지는 않고 저장하는 방식만 최적화 합니다. --aggressive 옵션을 주면 더 자세하게 최적화합니다.

git rev-parse --show-toplevel
git 저장소내에서 입력하면 루트디렉토리를 알려줍니다.

Why? 왜 자동차 유리는 깨지면 거미줄처럼 퍼질까?

  🎯 자동차 유리는 왜 거미줄처럼 깨질까? 몰랐던 안전의 비밀 3년 동안 운전하면서도 전혀 몰랐던 사실이었어요. 고속도로를 달리다 '탁' 소리와 함께 앞 유리에 금이 갔는데, 거미줄처럼 쫙 퍼지는 모습 보신 적 있으시죠? 일반 유리라...