Kotlin Coroutine 개념 예시 suspend fun fetchDocs() { // Dispatchers.Main val result = get("https://developer.android.com") // Dispatchers.IO for `get` show(result) // Dispatchers.Main } suspend fun get(url: String) = withContext(Dispatchers.IO) { /* ... */ } 예시에서 get() 은 기본 스레드에서 실행되지만 네트워크 요청을 시작하기 전 Coroutine 을 정지(suspend)합니다. 네트워크 요청이 완료되면 get() 은 callback 을 사용하여 기본 스레드에 알리는 대신 정지(spspend)된 Corou..
euc-kr 로 된 자막파일을 utf-8 로 변환하기 위해 사용한 것 import java.nio.charset.Charset import java.nio.file.Files import kotlin.io.path.Path import kotlin.io.path.extension import kotlin.io.path.readBytes fun main() { // 해당 경로의 파일 목록을 가져오기 val stream = Files.list(Path("path/files")) // smi 파일들만 필터링 stream.filter { it.extension == "smi" } .forEach { // 파일을 byte array 로 변환 val bytes = it.readBytes() // string 으로 ..
Network Interface Overview $ ip address show 1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host noprefixroute valid_lft forever preferred_lft forever 2: enp1s0: mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether b..
Install packages pacman -S package_name1 package_name2 ... Remove an installed package pacman -R package_name To remove a package and its dependencies which are not required by any other installed package pacman -Rs package_name Upgrading packages S stands for sync y is for refresh (local cache) u is for system update pacman -Syu Use pacman to search for packages pacman -Ss string1 string2 ... T..

올해 초 삼성은 55인치, 65인치, 77인치 QD-OLED TV를 선보였는데 몇 달 전 LG디스플레이의 WRGB OLED 패널을 사용한 83인치 OLED TV를 선보였고, 미국에서도 출시됐는데요, 이제 삼성은 유럽에서도 77인치와 83인치 WRGB OLED TV를 출시했습니다. 유럽 시장의 경우 삼성의 WRGB OLED TV는 77인치와 83인치로 출시됩니다. 이 TV들은 S89C와 S91C 두 가지 종류로 출시됩니다. S89C에는 폭을 조절할 수 있는 테이블 마운트 스탠드가 있고, S91C에는 삼성의 여러 고급 TV에서 볼 수 있는 전통적인 테이블 마운트 스탠드가 있습니다. 한국 기업은 2023년 베를린 TV 부스에서 OLED 신모델을 선보였습니다. S89C OLED TV는 77인치 버전의 모델 번호..

Apple은 9월 12일 Wonderlust 이벤트에서 수많은 업그레이드를 선보일 계획입니다. iPhone 15 라인업이 이벤트의 하이라이트가 될 것이지만, 곧 출시될 Apple Watch Series 9와 새로운 AirPods도 발표하는 것이 적절하다고 판단할 것입니다. 이제 AirPods Pro의 충전 케이스가 USB-C 포트로 업그레이드되지만 나머지 디자인은 동일하게 유지될 것으로 보고되었습니다. 애플은 Wonderlust 아이폰 15 이벤트에서 USB-C 포트로 에어팟 프로를 업그레이드할 예정이지만 디자인 변경은 예상되지 않습니다. Apple은 iPhone 15 라인업에서 USB-C 포트로 전환할 예정이며, 기존 장치에도 새 포트를 도입할 계획입니다. 최종 사용자의 경우 단일 USB-C 케이블을 ..
문제 Ajax 를 이용하여 300건 정도의 데이터를 Apache POI 를 이용하여 엑셀 파일 생성 중 Ajax timeout 을 10초로 해 두었는데 timeout 이 발생하여 원인을 확인한 결과 sheet.autoSizeColumn() 함수 처리에 시간이 오래 걸리는 현상을 발견 해결방법 row 마다 컬럼의 문자열 길이를 이용하여 너비를 가중치를 이용하여 늘려주는 방식 문자열 길이 최대 70 까지만 적용되도록 함 ( 문자열 길이가 너무 길어지면 너비가 너무 커짐 방지 ) fun setColumnSize(sheet: XSSFSheet, index: Int, value: String) { val defaultColumnWidth = 2048 val maxLength = 70 val characterWid..
다운로드 및 압축 해제 경로 : ~/dynamodb # download package curl -O https://s3.ap-south-1.amazonaws.com/dynamodb-local-mumbai/dynamodb_local_latest.tar.gz # create target directory mkdir dynamodb # uncompress to target directory tar -xvf dynamodb_local_latest.tar.gz -C ~/dynamodb .zprofile (쉘 시작시 실행 됨) 시작/종료 함수 추가 # .zprofile DYNAMODB_PATH=~/dynamodb dynamodb_start() { nohup java -Djava.library.path=$DYNAMO..
mysql 8.0 password 초기화 1. mysql 서비스 종료 (mac) brew services stop mysql (linux) sudo systemctl stop mysqld 2. skip-grant-tables 옵션을 통해 데몬 시작 mysqld --console --skip-grant-tables 3. 비밀번호 초기화 (비밀번호 null 로 설정) mysql> update mysql.user set authentication_string=null where user='root'; mysql> flush privileges; 4. 데몬 종료 (ctrl +c) 5. mysql 서비스 시작 (mac) brew services start mysql (linux) sudo systemctl sta..
kotlin 에서 slf4j logger 를 이용할 경우 불편한 점이 있어 LoggerDelegate 를 이용하여 사용하는 전략을 사용하고 있습니다. class LoggerDelegate : ReadOnlyProperty { private lateinit var logger: Logger override fun getValue(thisRef: Any, property: KProperty): Logger { if (!::logger.isInitialized) { logger = LoggerFactory.getLogger(thisRef.javaClass.name.substringBefore("\$Companion")) } return logger } } val loggerK: ReadOnlyProperty ..