※ 생략된 부분 있음 ※

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

 

우리는 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

 

들으면서 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에 따라 차이가 있는지는 잘 모르겠다. 나중에 확인 해 봐야 할 듯.

 

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

코딩메이트 디모님의 강좌를 기반으로 하여 학습한 내용입니다  > 보러가기 <

 

 

람다함수는 이전부터 써 왔던 거라 별로 어렵지는 않았는데.. 

뭐랄까.. 이번에 공부하면서 JAVA에서 처음으로 interface를 이용한 콜백함수 구현을 처음 알았을 때의 그런 '???' 스러움을 다시 느꼈다. 

'뭐..? 함수 파라미터에 함수를 넣을 수 있어..?'

 

1. 반환값이 없는 함수의 경우

fun main() {
    call(::printOnly)
}

fun call(function:(String) -> Unit) {
    function("Call")
}

fun printOnly(str:String) {
    println("Print Only] > $str")
}
<출력결과>
Print Only] > Call
lambda] > Call

printOnly 함수는 String을 인자로 받는 void형 함수이다.

call 함수는 String을 인자로 받는 void형 함수를 인자로 받는 함수이다.

함수 실행 시 인자값으로 함수를 넘길 때는 ::{함수명} 을 입력해야 한다.

그냥 입력하면 해당 함수의 결과값을 사용한다는 의미라서 에러메세지가 나옴.

 

call함수를 호출하면 call 함수 내부에서 인자로 전달된 printOnly 함수를 실행하게 된다.

 

이 때 미리 선언한 함수가 아니라 람다 함수를 변수로 선언하여 사용할 수도 있다. 아래 예시 참조.

    var lambda:(String)->Unit = {str -> println("lambda] > $str")}
    call(lambda)

 

2. 반환값이 있는 경우

fun main() {
    call2(::returnValue)
}

fun call2(function:(String, Int, Int) -> Int) {
    var sum = function("Call2", 2, 3)
    println("SUM :: " + sum)
}

fun returnValue(str:String, i:Int, j:Int):Int {
    println("returnText] > $str")
    return i+j
}
<출력결과>
returnText] > Call2
SUM :: 5
test] > Call2
SUM :: 5

1번과 별반다르지 않다.

returnValue는 인자로 받은 String을 화면에 출력하고 Int들을 더한 값을 반환하는 함수이다.

call2는 인자로 받은 함수를 실행하고 그 결과를 받아 화면에 출력하는 함수이다.

처음 공부할 때 프로그램이 어떻게 실행되는지 코드를 따라가며 확인하는 게 좋을 것 같다.

 

단, 1번과는 다르게 람다함수에서는 return을 허용하지 않기 때문에 이 경우에는 람다함수 말고 익명함수를 통해 구현할 수 있다.  가능하다 으아아아아아아아아 !!! 가능해!!!! 다음 강의에서 바로 처음부터 나오더라!!!!

 

  1) 람다 함수 사용 : 람다 함수의 마지막 줄이 반환값

   var lambda:(String, Int, Int)-> Int = { str, i, j -> 
           println("lambda] > $str")
           i+j
   }
   
   call2(lambda)

 

  2) 익명 함수 사용 : return으로 반환값을 명시

    val func = fun(s:String, i:Int, j:Int):Int {
         println("test] > $s")
         return i+j
    }
    call2(func)

 

 

 

3. 기타

1) 인자를 받지 않는 경우

val lambda_empty:()->Unit={println("EMPTY LAMBDA")}

lambda_empty()
<실행 결과>
EMPTY LAMBDA

인자를 받지 않는 경우 그냥 실행할 코드만 넣어준다.

 

 

2) 인자가 하나인 경우

인자가 하나인 경우 따로 명시하지 않고 it을 사용해서 파라미터를 사용할 수 있다.

아래 코드는 둘 다 동일한 결과를 보임. (lambda_it에서 str이라는 변수에 한번 더 할당했는데, 그럴 필요 없이 it으로 사용해도 된다.

val lambda_nor:(String)->Unit={
	str-> println("print $str")
}

val lambda_it:(String)->Unit={
	var str:String = it
    println("print $str")
}

오늘 갑자기 모르는 내용이 확 나와서

나는 내가 강의를 빼먹었나? 하고 있었는데

다행히 그건 아니었다.

 

영상만 볼 때는 뭐가 뭔지 잘 몰랐는데

직접 만들다보니 어느정도 이해가 가는 것 같기도 하고..

알다가도 모르겠다 :(

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

코틀린 공부 - 함수(1)  (0) 2021.08.02
코틀린 기초 5 - object  (0) 2020.06.25
코틀린 기초 - 3 (if~else, when)  (0) 2020.06.23
코틀린 기초 - 2 (배열, 반복문)  (0) 2020.06.16
코틀린 기초 - 1  (0) 2020.06.16

+ Recent posts