반응형

HTMLCollection , NodeList 는 유사배열객체. 

 

두개의 결정적인 차이는 동적 , 정적입니다.

    <div id="app">
        <h1>test</h1>
        <div class="greeting">Hello</div>
    </div>

 

HTMLCollection type으로 가저온경우

       const $app = document.getElementById('app');
        const $greeting = document.getElementsByClassName('greeting');
        console.log($greeting, $greeting.length);
        $app.insertAdjacentHTML('beforeend', '<div class="greeting">Hello</div>');
        console.log($greeting, $greeting.length);

NodeList type으로 가저온경우

        const $app = document.getElementById('app');
        const $greeting = document.querySelector('.greeting');
        console.log($greeting, $greeting.length);
        $app.insertAdjacentHTML('beforeend', '<div class="greeting">Hello</div>');
        console.log($greeting, $greeting.length);

NodeList 의경우 선언해놓으면 계속해서 그값을 갱신해준다.

반응형
반응형

기초개념

 

스크립트는 신기하게도 single thread로 프로세서를 제어한다.

 

비동기라는 개념이 있지만

 

그도 결국 event loop를 이용해 main thread로 작업을 넘기는 방식이다.

 

그래서 main Thread에서 무거운 작업을하면 ui가 밀리고 버벅거리게 된다.

 

이를 피하려면 비동기영역으로 무거운 작업을 넘기고 작업단위에 텀을 짧게해서

 

ui버벅거림을 해결할수 있다.

 

결론은 단일 프로세서로 한번에 하나의 기능만 작동하게된다.

 

heap

생성된 객체를 담아놓는 영역

 

call stack

요청한 기능을 차례대로 실행해주는 영역

main thread가 이쪽에서 작동된다.

 

webApis

DOM, ajax, setTimeout등의 api

 

callback queue

이벤트 발생후 대기하는 영역

 

 

event loop

callback queue를 계속 관찰하며 해로운 queue가 쌓일때마다 stack영역으로 넘겨주는역할

 

 

반응형
반응형

 

1. 안드로이드 스튜디오 설치 or adb툴 설치

 

 

2. 환경 변수 등록

mac도 window처럼 터미널에서 사용하기위해 path를 등록시켜줘야한다.

 

맥설치시 아래 루트 아래 adb툴이 설치되있다.

/Users/{사용자아이디}/Library/Android/sdk/platform-tools

 

bash_profile이 있는지 확인

$ ls -a


없으면 생성한다.

$ touch .bash_profile


있으면 열어준다.

$ open -e .bash_profile


내용 입력 후  저장 (cmd+s)
export ADB_HOME=/Users/{사용자 경로}/Library/Android/sdk/platform-tools
export PATH=${ADB_HOME}:$PATH


적용

$ source ~/.bash_profile


확인

$ adb version

 

반응형
반응형

android12 

targetSdk버전이 31인경우

pending intent생성시 

PendingIntent.getActivity(context,2631,pi,PendingIntent.FLAG_IMMUTABLE)
PendingIntent.FLAG_IMMUTABLE

이런식으로 지정해줘야한다.

 

  • PendingIntent.FLAG_MUTABLE : 변경 가능
  • PendingIntent.FLAG_IMMUTABLE : 변경 불가능

 

대기 중인 인텐트 변경 가능 여부

앱이 Android 12를 타겟팅하는 경우 앱에서 만드는 각 PendingIntent 객체의 변경 가능 여부를 지정해야 합니다. 이 추가 요구사항은 앱의 보안을 강화합니다.

 

동작 변경사항: Android 12를 타겟팅하는 앱  |  Android Developers

 

 

이렇게 두줄로 끝내버리면 어쩌자는거 -.-

 

암튼 저렇게 수정하면된다.

반응형
반응형

예시 값

	private val smaple = "body\n" +
			"{\n" +
			"margin: 0px !important;\n" +
			"padding: 0px !important;\n" +
			"}\n" +
			"header\n" +
			"{\n" +
//			"background-image: url(\"https://iso.500px.com/wp-content/uploads/2015/12/stock-photo-125301449-1500x822.jpg\");\n" +
			"background-postion: center center;\n" +
			"background-position-y: 30%;\n" +
			"overflow: hidden;\n" +
			"height: 200px;\n" +
			"width: 100%;\n" +
			"text-align: center;\n" +
			"}\n" +
			"\n" +
			"header h1 {\n" +
			"color: #F0477F;\n" +
			"font-family: \"Roboto\", sans-serif;\n" +
			"font-size: 1.999em;\n" +
			"font-weight: 400;\n" +
			"}\n" +
			"\n" +
			"header h2 {\n" +
			"\n" +
			"color: #F0477F;\n" +
			"font-family: \"Roboto\", sans-serif;\n" +
			"font-size: 1.414em;\n" +
			"font-weight: 400;\n" +
			"\n" +
			"}"+
			".asdlkah\n" +
			"{\n" +
//			"background-image: url(\"https://iso.500px.com/wp-content/uploads/2015/12/stock-photo-125301449-1500x822.jpg\");\n" +
			"background-postion: center center;\n" +
			"background-position-y: 30%;\n" +
			"overflow: hidden;\n" +
			"height: 200px;\n" +
			"width: 100%;\n" +
			"text-align: center;\n" +
			"}\n" +
			".amzxcnzxmc\n" +
			"{\n" +
//			"background-image: url(\"https://iso.500px.com/wp-content/uploads/2015/12/stock-photo-125301449-1500x822.jpg\");\n" +
			"background-postion: center center;\n" +
			"background-position-y: 30%;\n" +
			"overflow: hidden;\n" +
			"height: 200px;\n" +
			"width: 100%;\n" +
			"text-align: center;\n" +
			"}\n"

 

값 비교

	//indexOf
	private fun test1(){
		val target = "background-image:"
		val start = System.nanoTime()
		val doc = Jsoup.parse("<HTML><STYLE>${smaple}</STYLE></HTML>")
		val index = doc.head().select("style").first()?.run { this.data().indexOf(target) }
		logger.info("speed: ${System.nanoTime() - start} idx: ${index}")
	}

	//contains
	private fun test2(){
		val target = "background-image:"
		val start = System.nanoTime()
		val doc = Jsoup.parse("<HTML><STYLE>${smaple}</STYLE></HTML>")
		val index = doc.head().select("style").first()?.run { this.data().contains(target, ignoreCase = true) }
		logger.info("speed: ${System.nanoTime() - start} idx: ${index}")
	}

	//contains
	private fun test3(){
		val target = "background-image:"
		val start = System.nanoTime()
		val doc = Jsoup.parse("<HTML><STYLE>${smaple}</STYLE></HTML>")
		val has = doc.head().select("style").first()?.run { this.data().contains(target, ignoreCase = false) }
		logger.info("speed: ${System.nanoTime() - start} has: ${has}")
	}

	//contains
	private fun test4(){
		val target = "background-image:"
		val start = System.nanoTime()
		val doc = Jsoup.parse("<HTML><STYLE>${smaple}</STYLE></HTML>")
		val has = doc.head().select("style").first()?.run { this.data().matches(target.toRegex()) }
		logger.info("speed: ${System.nanoTime() - start} has: ${has}")
	}

 

 

결과

1. 결과값을 찾을 수 없는 경우

speed: 52209000 idx: -1
speed: 501400 idx: false
speed: 222200 has: false
speed: 332600 has: false

 

2. 결과값을 찾을 수 있는 경우

speed: 47471500 idx: 563
speed: 278100 idx: true
 speed: 149200 has: true
speed: 243500 has: false

 

 

 

결론

contains가 빠르다

반응형
반응형

 

To get local formatting use getDateInstance(), getDateTimeInstance(), or getTimeInstance(), or use new SimpleDateFormat(String template, Locale locale) with for example Locale.US for ASCII dates.

 

lint 에러로 위메시지가 뜨길래 봣더니 설정을 해줘야하는것같다.

 

SimpleDateFormat("yyyy-MM-dd hh:mm:ss")
SimpleDateFormat("yyyy-MM-dd hh:mm:ss",Locale.getDefault()).format(Date())

Locale.getDefault()를 추가해줘야한다.

반응형
반응형
        fun hideKeyboard(act: Activity?, edit: EditText?) {
            if (edit != null) {
                val inputManager = act?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
                inputManager.hideSoftInputFromWindow(edit.windowToken, 0)

            }else{
                if (act != null && act.currentFocus != null) {
                    val inputMethodManager = act.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
                    inputMethodManager.hideSoftInputFromWindow(act.currentFocus!!.windowToken, 0)
                }
            }
        }
        fun showKeyboard(act: Activity?, edit: EditText?){
            if(edit != null){
                val inputManager = act?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
                inputManager.showSoftInput(edit, 0)
            }else{
                if (act != null && act.currentFocus != null) {
                    val inputMethodManager = act.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
                    inputMethodManager.showSoftInput(act.currentFocus, 0)
                }
            }
        }

 

 

가로모드 시 이상한 키패드가 같이 올라오는 것을 볼수있다.

 

                <EditText
                    android:id="@+id/et_search"
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:paddingStart="16dp"
                    android:paddingLeft="@dimen/text_margin"
                    android:hint="검색"
                    android:imeOptions="flagNoExtractUi"
                    android:inputType="text" />

 

제조사에서 키보드를 불렀을때 강제로 자기들 키보드 editerea를 넣어주는데

 

이때 imeOptions를 flagNoExtractUi하면 된다.

반응형
반응형

간단한 타이머 기능

    /**
     * music timer
     */
    var mTimer: Timer?= null
    fun runTimer(){
        if (mTimer == null){
            mTimer = timer(period = 600){
                currentDuration()
            }
        }
    }
    fun stopTimer(){
        mTimer?.let {
            it.cancel()
        }
        mTimer = null
    }
반응형

+ Recent posts