※ 생략된 부분 있음 ※

※ 번역기 사용 + 의역 있음 ※

 

우리는 7월에 Git 작업에 대해 토큰 기반 인증(:personal access 토큰, OAuth, GitHub App installation token)을 사용해야한다고 발표했습니다. 2021813일부터 GitHub.com에서 Git 작업을 하려면 패스워드를 이용한 방식은 허용되지 않습니다.

 

영향을 주는 작업

- Command line에서 GitAccess하는 것

- Git을 사용하는 데스크톱 애플리케이션

- GitHub 패스워드로 액세스하는 모든 GitHub.comGit repositories와 관련된 앱/서비스

- GitHub 앱이 패스워드 인증 방식을 지원하지 않음

계정에 대한 2단계 인증(two-factor authentication, 2FA)이 활성화되어있는 경우 토큰 또는 SSH기반 인증을 사용해야 합니다.

 

뭘 해야 하나?

- 개발자는 HTTPS(권장)SSH 키를 통한 personal access token을 발급받아서 사용해야 합니다. 오래된 서드파티 통합 프로그램을 사용한다면 클라이언트를 최신 버전으로 업데이트해야 합니다.

- 계정에 2단계 인증(two-factor authentication, 2FA)을 활성화할 수 있습니다. 이를 위해 personal access token이 필요합니다.

 

브라운아웃

- 영향을 받는 고객에게 인증 변경 사항을 알리기 위해 두 번의 브라운 아웃이 예정되어있으며, 이 기간동안 암호 인증 지원을 비활성화하고 암호를 사용한 Git 작업이 수행되지 않습니다. 브라운아웃 스케쥴은 아래와 같습니다.

 

* 한국 시각 기준

2021년 6월 30일 16:00 - 19:00
2021년 7월 01일 01:00 - 04:00
2021년 7월 28일 16:00 - 19:00
2021년 7월 29일 01:00 - 04:00

 

타임라인

20201215- GitHub.com에서 Git 작업 인증 시 패스워드를 사용하면 인증방법을 업데이트라는 이메일 발송

2021630, 2021728- 일시적으로 모든 Git 작업에 토큰 인증이 일시적으로 필요(위의 브라운아웃)

2021813- 모든 Git 작업에 토큰 인증이 의무화

 

원본 : https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/

 

Token authentication requirements for Git operations - The GitHub Blog

Beginning August 13th, 2021, we will no longer accept account passwords when authenticating Git operations on GitHub.com and will instead require token-based authentication (for example, a personal access, OAuth, or GitHub App installation token) for all a

github.blog

 

spinner에 배경으로 쓰려고 xml shape를 만드는 중인데 자꾸 오류가 났다.

xml에서 미리보기 할 때는 

이렇게 잘 나오는데..

 

실행을 하면

이렇게 나오는 것이다.

 

 

▼문제가 된 코드

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        ...
    </item>
    <item android:gravity="center_vertical|right">
        <bitmap
            android:src="@drawable/arrow" />
    </item>
</layer-list>

 

▼ 옳게 수정한 코드

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        ...
    </item>
    <item >
        <bitmap
            android:gravity="center_vertical|right"
            android:src="@drawable/arrow" />
    </item>
</layer-list>

 

화살표 <item> 에 android:gravity를 지정하는 게 아니라

화살표 <item> 내부의 <bitmap>에 지정해줘야 했음.

 

 

 

검색하기 애매해서 혼났다.

 


[참고링크] stackoverflow.com/questions/37411637/change-spinner-dropdown-icon/37461505

 

사회 초년생 시절부터 돈을 효과적으로 관리하고 싶을 때 준비하기 좋은 것들을 대략이나마 적어본다.

'무조건 필수적으로!' 라는 느낌보다는 '내 개인적인 경험에서는 말이야~' 정도로 보는 게 좋을 것이다.

참고로 본인은 '한방쾌감!' 보다는 '조금씩 모으자'형이기 때문에, 투자나 이런 부분은 다루지 않을 예정이다.


역시 시작은 뭐니뭐니해도 통장쪼개기 아니겠어?

통장쪼개기. 말 그대로 통장을 목적별로 구분해서 관리한다는 의미다.

왜 통장을 '쪼개는'걸까?

그 이유는 통장쪼개기를 해 보면 알겠지만(^^) 통장쪼개기를 통해 내 돈의 흐름의 파악이 수월해지기 때문이다.

공장 등에서 분업을 하는 이유를 생각해보면 더 쉬울 것이다.

 

 

어떻게 쪼개면 되는데?

주로 '월급통장', '생활비통장', '투자통장', '비상금통장' 4가지로 나누기를 권장한다. 

 

1) 월급통장

월급 입금받아서 다른 통장으로 이체한다. 타행 이체 수수료가 없는 통장이 좋다. 보통 급여통장상품들은 타행 이체 수수료를 제외해주는 편. 

 

2) 생활비통장

생활비로 쓸 돈을 넣는 곳이다. 식비, 교통비 등등등.. 체크카드를 쓴다면 혜택이 좋은 은행을 고르는 게 좋다. 더치페이 등으로 이체할 거 생각하면 이체하기 편한 곳 찾는 것도 좋을 듯. 뭐 요즘엔 다 간편이체가 되니 고만고만하기는 하다. 

 

3) 투자통장

여기 넣는 돈은 무조건 다 저금한다고 생각하면 된다. 이 통장에서 돈을 빼는 건 마지막 날 정말 최후의 수단이라고 생각해야 한다. 마찬가지로 타행 이체 수수료가 없는 통장을 추천한다. 돈을 자주 넣었다 뺐다 하므로 이체 수수료가 발생하는 CMA 통장은 적절하지 않다. (CMA통장을 이용하고 싶다면 수수료 면제 혜택이 있는 상품을 찾아보거나 카카오뱅크의 '세이프박스' 기능 등을 활용하자)

 

4) 비상금통장

비상금+연간비를 모으는 통장. 경조사 등 갑작스럽게 돈 나갈 일이 있으면 여기서 빼 쓰면 된다. 연간비는 쉽게 말해서 1년마다 일반적으로 사용하게되는 비용을 말한다. 예를 들면 안경구입비나 어버이날 선물같은 것들..? 일반적으로 CMA통장을 사용한다.

 

얼마씩 넣어야하는지에 대해서는 각자의 기준이 있겠으나 잘 모르겠다면 아래의 방법으로 산정한다.

(이건 지극히 개인적인 경험을 통해 결정하는 것이며 더 좋은 방법이 있으면 그걸 따라하는 게 더 좋다)

1. 자기가 한 달에 쓰는 금액을 대략적으로나마 구한다. 

  - 가계부를 작성하지 않는다면 대략적으로 구하고, 아니면 가계부를 작성해서 확인하는 게 더 좋다.

  - 자기가 꼭 써야 할 돈을 기준으로 잡는다. (식비, 교통비, 통신비 등.. 화장품이나 옷같은 건 제외)

2. 그렇게 구한 금액만큼 생활비 통장에 입금하고 한 달 정도를 써 본다

3. 부족하면 늘리고, 넉넉하면 줄여본다(5만원씩 줄이는 식)

4. 비상금은 월급의 10%씩 모으고, 통장에 월급의 2~3배의 금액이 쌓이면 어느정도 가감.

 

왠만하면 저축액을 정하고 남은 금액을 생활비에 맞추는 게 맞으나, 내 돈 관리를 처음 하는 사람은 갑자기 씀씀이를 줄이기도 힘들고, 뭣보다 '내가 얼마나 쓰고, 얼마나 낭비하는지 파악하는 것'도 중요하다고 생각하니 이렇게 생활비를 먼저 떼고 저금하는 것도 나을 것이다. (다이어트도 시작은 식단일기부터 시작하는 것 만큼, 내돈관리의 시작은 가계부부터 시작이다)

 

더보기

여담이지만

대부분 권장하기로는 월급의 50%를 저축하라고 한다.

하지만 좋소블랙기업+최저임금+자취 3단 컴보를 하는 사람은 50%는 커녕 저축을 할 수 있다는 것조차 사치라고 느낄 수 있을 것이다.

그냥 개인적으로는 무리해서 50% 넣겠다고 편의점 밥 먹으면서 자기 몸 상해가면서 넣지 말고

차라리 그 돈으로 자기개발해서 50%를 넣을 수 있는 연봉을 가질 수 있는 능력을 먼저 얻는 쪽을 추천한다.

 

사회초년생의 여유자금은 몸무게 올리는 데 쓰지 말고 몸값 올리는 데 쓰자.

 

그래서 어떤 식으로 진행되는건데?

월급통장에 월급이 입금된다.

② 정해진 금액만큼 생활비/투자/비상금 통장에 각각 입금한다.

보너스 등이 들어오면 비상금 통장으로 입금한다.

생활비/투자 통장에서 사용할 돈이 부족하면 비상금 통장에서 꺼내 쓴다.
(진짜 중요하고 진짜 어렵다. 투자통장에 돈 빼서 생활비 통장 막지 않기!)

⑤ 다음 월급날 이전에 생활비/투자 통장에 남은 돈은 비상금 통장으로 이체한다.

 

대충 이런 식으로 진행된다고 보면 된다.

대충대충~

 

이거만 기억하자.

정해진 돈보다 남으면 무조건 비상금 통장으로 이체하고, 돈이 부족하면 비상금 통장에서 꺼내 쓰기.

 

너무 복잡한데요?

통장쪼개기에 대한 글을 읽을 때는 정말 명확하게 나눌 수 있을 것 같지만 사실 막상 하다보면 섞이기 마련이다. 그럴 때는 개인마다 조금씩 자신만의 방법으로 정리하는 게 좋을 것이다. 참고가 될 지는 모르겠지만 일단 나의 경우를 적어본다. 

 

나같은 경우는 크게 4개의 통장으로 나누어 관리하고 있으며, 월급날이 아닌 1일을 기점으로 정리한다. 

 

- 월급통장(일반은행) : 월급 받아서 월세와 공과금 등의 고정비를 제하고 투자통장으로 보낸다. (이건 월급날에 한다)

 

- 투자통장(카카오뱅크) : 생활비통장에 필요한 금액을 넣고 나머지는 적금 자동이체용으로 남겨둔다. 자동이체가 모두 마무리되는 5일쯤에 남은 금액을 비상금통장으로 이체한다.

 

- 생활비통장(카카오뱅크) : 체크카드를 쓸 때는 한 달에 생활비로 쓸 만큼 이체해뒀고, 지금은 신용카드금액을 이체하여 1일날 결제한다. 이후 남은 금액이 15만원으로 맞추고 대기 (현금이체용 금액)

 

- 비상금통장(CMA) : 시럽월렛의 마이피그 CMA를 사용한다. 연결된 하나의 계좌에만 이체가 가능한 대신 아무런 조건 없이 출금수수료를 면제해준다.(단, 입금은 어디에서나 가능하다.) 이율이 높지는 않으나 접근성이 좋아서 계속 쓰고 있다. 

 

자 이제 용기내서 내 돈 관리의 첫발을 내딛어보자!

사실 처음 시작할 때는 꽤 귀찮다. 나도 통장쪼개기를 회사 다닌 지 3년차부터 시작했는데 초반에는 꽤 시행착오를 겪었던 기억이 난다. 보통 통장쪼개기를 하기 전 한 개의 통장에서 모든 걸 해결하거나, 여러 통장에 이체가 흩어져 있는 경우가 대부분이라 정리하기가 꽤 까다롭다. 하지만 체계적으로 돈을 관리하고 싶다면 울면서라도 해야 하는 게 통장쪼개기이다.

 

또 막상 하다 보면 사실 애매한 게 많아서 여기저기 뒤섞이거나, 통장을 너무 세세하게 쪼개는 바람에 관리하기 더 어려워지는 경우도 있는데 그럴 때 마다 꼭 기억해야 할 것이 있다. 통장쪼개기는 내 돈의 흐름을 좀 더 쉽게 파악하기 위해서 하는 것이다. 주객전도되지 않게 조심하자. 

들으면서 JAVA의 static이 생각났다.

singleton 패턴의 경우 예전에 글로 읽기만 하고 실제로 구현해 본 적은 없어서 잘 와닿지는 않았지만

JAVA의 static처럼 어디에서든지 접근할 수 있다는 .. 대충 그런 개념인 것 같다.

일단 나는 object는 static class와 비슷하고, companion object는 해당 클래스 내의 static 변수를 모아놓은..? 거라고 이해하였다.

 


1. object 

fun main() {
    println(Counter.count)
    Counter.countUp()
    Counter.countUp()
    
    println(Counter.count)
    
    Counter.clear()
    
    println(Counter.count)
}

object Counter {
    var count = 0
 
    fun countUp() {
        count++
    }
    
    fun clear() {
        count = 0
    }
}
<실행결과>
0
2
0

object로 Counter를 선언한다. Counter의 경우 countUp이 선언되면 count가 1씩 증가하도록 하였다.

사용할 때는 자바의 static class처럼 Counter.XX()의 방식으로 사용한다.

자바의 static class처럼 남용하면 문제가 생기겠지..?

 

 

2. companion object

class FoodPoll(val name:String) {
    companion object {
        var total = 0
    }
    
    var count = 0
    
    fun vote() {
        total++
        count++
    }
}


fun main() {
    var a = FoodPoll("cake")
    var b = FoodPoll("cookie")
    
    a.vote()
    a.vote()
    b.vote()
    b.vote()
    b.vote()
    
    println("RESULT :: ${a.name} (${a.count}) vs ${b.name} (${b.count}) => ${FoodPoll.total}")
}
<실행결과>
RESULT :: cake (2) vs cookie (3) => 5

companion object는 object와 마찬가지로 어디에서나 접근이 가능하나 특정 클래스 내에 속해있다는 것에서 object와 차이점을 보인다. 자바로 생각하자면 static 변수와 비슷하지 않을까?

 

main()에서 FoodPoll 객체 두 개를 만든다음 vote()를 다섯 번 실행한다.

vote()는 해당 객체의 count와 companion object인 total을 1씩 증가하는 함수이다. 

 

실행 결과를 보면 a와 b객체의 count는 각각 vote를 호출한 횟수이고 total은 그 합과 같다는 것을 알 수 있다.

 

companion object를 사용할 때 주의할 점이 있는데,

JAVA의 static 변수의 경우 클래스로 생성한 객체에서도 해당 static변수를 참조연산자를 통해 가져올 수 있는 반면

compainion object의 경우 객체의 참조연산자를 통해서 가져오는 경우 컴파일 에러가 발생한다.

 

예를 들어 FoodPoll의 객체인 icecream이 있다고 할 때

자바는 아래 두 경우 모두 사용할 수 있지만
(물론 뭐라고 메세지를 띄우기는 한다)

int total2 = FoodPoll.total	//가능
int total = icecream.total;			//가능

코틀린에서는 'Unresolved reference'이라며 에러를 발생시키는 것을 확인할 수 있다.

var t1 = FoodPoll.total	//가능
var t2 = a.total	//불가능 (Unresolved reference: total)

나중에 기본서를 한번 더 읽으면서 내가 이해한 게 맞는지 꼭 확인해야 할 것 같다.

지금은 그냥.. '앗 이 맛은.... static의 맛과 비슷하구나..!' 하는 느낌이라..

지금 그냥 맛보기만 하는 수준이라서 더 그런 것 같기도 하고..?

'개발 > Kotlin' 카테고리의 다른 글

코틀린 공부 - 함수(2)  (0) 2021.08.02
코틀린 공부 - 함수(1)  (0) 2021.08.02
코틀린 기초 - 4(고차함수, 람다)  (0) 2020.06.24
코틀린 기초 - 3 (if~else, when)  (0) 2020.06.23
코틀린 기초 - 2 (배열, 반복문)  (0) 2020.06.16

이 포스팅은 아래 포스팅을 기반으로 하여 쓰여졌습니다. 
> https://like-tomato.tistory.com/156 [토마토의 일상 얘기]

원본 포스팅 작성자 분께서는 부디 복 많이 받으시고 적게 일하시고 많이 버시길..


Notification을 클릭 시 앱이 실행되게 해 달라는 요청이 들어옴. 세부 조건은 아래와 같았음.

 

<조건>

- 앱이 실행 중일 때는 아무 반응 없게

- 홈 버튼 등을 눌러서 백그라운드에 위치했을 때는 앱을 포그라운드로 가져오고 가장 최근에 실행했던 액티비티 띄우기

- 앱이 완전히 종료되었을 때(엄밀히 말하자면 완전히 종료되었다는 건 애매한 표현이지만)는 앱이 다시 실행되게

 

구글링 하던 중 위 링크에 있는 코드를 기반으로 하여 구현하니 조건에 맞게 실행됨을 확인함.

Intent intent = new Intent(getBaseContext(), ActSplash.class);
intent.setAction(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pIntent = PendingIntent.getActivity(getBaseContext(), NotificationHelper.ID_FCM, intent, PendingIntent.FLAG_UPDATE_CURRENT);

PendingIntent.getActivity의 마지막 인자로 넘겨주는 Flag에 따라 차이가 있는지는 잘 모르겠다. 나중에 확인 해 봐야 할 듯.

 

왜 이렇게 되는지 자세한 내용은 이후 다시 보충하겠음!

+ Recent posts