목록프로그래밍 (38)
몰?.루();
구글에 'GET POST 보안'이라고 검색하면 많은 블로그에서 POST가 보안이 뛰어나다고 설명하고 있다.하지만 절대 POST가 보안이 뛰어나지 않다. 애초에 GET과 POST는 보안의 개념과는 거리가 멀다.그저 데이터를 전송할 때 어떻게 하느냐의 차이일 뿐이다. GET는 queryString에 모든 파라미터를 담아 전송하지만, POST는 body에 모든 파라미터를 담아 전송한다. 그리고 body의 정보는 크롬 개발자 도구 - Network 탭에만 들어가도 다 보인다. 위는 쿠팡에서 로그인 버튼을 눌렀을 때 전송된 패킷이다.body 부분에 password라고 당당히 찍혀서 전송되는 걸 볼 수 있다. 즉, 중간자가 그냥 해당 패킷을 감청하면 떡하니 비밀번호가 나오는 거다. 그럼에도 불구하고 쿠팡이 당당하게..
script를 지원하지 않는 브라우저에서는 noscript 태그에 들어가있는 내용이 보이게 됩니다. 그런데 상식적으로 이상합니다. 과연 스크립트를 지원하지 않는 브라우저가 존재하긴 할까요? 처음 생각은 JS라는 게 세상에 존재하기도 전의 아주아주 오래된 브라우저라면 script를 지원하지 않을 것 같다는 생각이었는데, 그러면 script가 세상에 존재하지도 않았는데 그 브라우저가 noscript 태그는 지원하는 게 아주 이상합니다. 세상에 태어나지도 않은 존재를 예측해서 미리 noscript라는 태그를 지원할 순 없습니다. 결국 noscript도 사실상 현대에 쓰이는 브라우저들만 지원하는 태그라고 봐야합니다. 그런데 현대 브라우저는 전부 스크립트를 지원합니다. 왜 필요할까요? 이유는 사용자가 보안상의 목..
파이어베이스를 사용하다보면 클라우드 메세징Cloud Messaing 기능을 사용하는 경우가 있습니다. 이를 통해서 앱에 푸쉬 알림을 간편하게 보낼 수 있습니다. 다만 한국에서는 광고성 푸쉬 알림을 보낼 때 주의해야할 사항들이 몇 가지 있습니다. 자세한 건 이 포스팅에서 다루지 않겠지만, 대충 개발자가 유의해야할 사항은 다음과 같습니다. 광고성 푸쉬 알림을 보내기 위해서는 사용자에게 별도로 승인 요청을 받아야하며, 광고를 허용 받았든 거부 받았든 통지해야한다. 2년마다 광고성 푸쉬 알림을 계속해서 받을지 말지 확인 받아야한다. (2년마다 확인 여부 화면을 띄워주기만 하면 되고, 사용자가 딱히 의사 표현을 하지 않았다면 그냥 계속 광고 허용한 걸로 간주해도 됨) 하지만 문제는 클라우드 메시징으로 보낸 푸쉬 ..
학부생 때나 하던 건데 오랜만에 갑자기 퀵 소트 구현이나 해볼까해서 위키피디아에 있는 퀵 소트 수도 코드를 보면서 코틀린으로 그대로 옮겨봤습니다 fun main() { val array = intArrayOf(3,7,8,5,2,1,9,5,4) array.quickSort() println(array.contentToString()) // [1, 2, 3, 4, 5, 5, 7, 8, 9] } fun IntArray.quickSort(start: Int = 0, end: Int = this.size - 1) { if (start >= 0 && end >= 0 && start < end) { val pivotIndex = this.partition(start, end) this.quickSort(start, ..
lateinit var a: String // 가능 lateinit var b: Int // 불가능 lateinit var c: Integer // 가능 왜냐하면 코틀린 코드를 자바로 변환했을 때 lateinit을 구현하는 방법 자체가 변수를 일단 null로 해놓고, getter를 호출하는 시점에 변수가 아직 null이면 Exception을 throw하는 방식이기 때문입니다. 그렇기 때문에 String 같은 non-primitive type들은 처음에 null을 일단 선언해놓을 수 있는데 int 같은 primitive type들은 처음에 null로 선언할 수가 없기 때문에 (자바에서 int형에 null을 넣을 수 없습니다. 멤버 변수 선언할 때 그냥 int a; 이렇게 선언만 해놓는 것도 결국엔 int ..
Android Jetpack에 포함되어있는 유명한 라이브러리 중 하나가 LiveData입니다. 값의 변화를 liveData.observe(this, Observer { // ... }) 이런 식으로 관찰해서 사용할 수 있기 때문에 많이 사용됩니다. 그리고 이 LivaData가 디자인 패턴 중에 옵저버 패턴을 사용하는 대표적인 예시 중 하나이기 때문에 옵저버 패턴을 공부할 겸 평소에 유용하게 쓰던 LiveData를 직접 구현해보겠습니다. class SimpleLiveData { private var data: T? = null private val observers = mutableListOf Unit>() fun observe(observer: (T?) -> Unit) { observers.add(obs..
인터넷에 검색해보면 다들 참 어려운 방법을 쓰고 앉아있는데 사실 요즘은 참 쉬운 방법이 있습니다. xml에서 버튼 속성에 app:cornerRadius="{숫자}dp"만 주면 됩니다. 참고로 Button에만 적용되고 TextView나 다른 것들엔 적용 안 되기 때문에 어려운 방법으로 구현해야하는 게 맞습니다. 버튼만 쉽게 가능.
제가 원한 것은 SubActivity를 띄웠을 때 바로 스크롤뷰가 특정 scrollY만큼 이동한 상태에서 화면이 보여지는 것이었습니다. 원했던 그림 실패한 코드 1 - onCreate나 onResume에 setScrollY 넣어보기 package com.example.test import android.os.Bundle import android.widget.ScrollView import androidx.appcompat.app.AppCompatActivity class SubActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setCont..
현재 엄청나게 긴 커맨드를 입력한 상태에서 "아 아니다, 걍 지워야겠다"라고 생각했을 때 지우는 게 은근히 귀찮습니다. 윈도우 환경이었으면 그냥 Shift + Home 눌러서 한 줄 다 선택해서 Delete 하겠지만 유감스럽게도 터미널에서는 Ctrl + A도 안 되고 Shift + Home도 안 됩니다. 근데 그냥 Ctrl + U 하면 현재 커맨드 다 삭제 됩니다. 참고로 한 단어만 삭제할 때는 Ctrl + W입니다.
안드로이드 스튜디오의 terminal을 git bash로 설정해놓은 경우 한글을 입력하는 건 그럭저럭 잘 되는데 지울 때 정말 이상하게 지워집니다. 평소에는 크게 문제가 되지 않는데 git commit을 할 때 커밋 메세지를 한글로 남겨야하기 때문에 이 버그는 굉장히 짜증납니다. 아무리 검색해도 해결 방법이 안 나오다가 그냥 우연히 이것저것 해보다가 해결법을 발견해서 공유합니다. 설정(Ctrl + Atl + S)에서 Tools - Terminal - Shell path 에서 {bash 경로} 뒤에 --login을 덧붙여주고 OK를 눌러서 설정창을 끄고 나서 터미널을 종료시켰다가 다시 켜면 한글 문제가 해결됩니다. 대체 --login을 붙였는데 왜 해결되는거고 무슨 역할을 하는 건지는 모르겠지만 일단 문제..