2026/04/21

오늘의 이야기

Excel VBA를 활용한 자동화 꿀팁!


엑셀예시




엑셀을 사용할 때 반복되는 작업을 자동화하면 업무 효율성이 높아집니다. 오늘은 VBA(Visual Basic for Applications)를 활용하여 셀 메모 위치 자동 조정, 데이터 및 메모 복사, 문자열 변환, 문자열 결합 방법을 살펴보겠습니다.
1️⃣ 셀 메모 위치 자동 조정
엑셀에서 특정 셀의 메모(댓글) 위치를 자동으로 조정하려면 VBA 코드를 활용하면 됩니다.
아래 코드를 실행하면, 각 셀의 메모가 해당 셀의 오른쪽 끝에 정렬됩니다.


Sub AdjustCommentPosition()
Dim cmt As Comment
Dim rng As Range

For Each rng In ActiveSheet.UsedRange
If Not rng.Comment Is Nothing Then
Set cmt = rng.Comment
cmt.Shape.Top = rng.Top + 5 ' 셀의 상단에서 약간 떨어진 위치
cmt.Shape.Left = rng.Left + rng.Width + 5 ' 셀의 오른쪽 끝에 위치
End If
Next rng
End Sub


✅ 주요 기능:


셀의 너비를 고려하여 메모 위치 자동 조정


기존 메모 위치를 수동으로 변경하지 않고 한 번에 정리 가능

2️⃣ C열, D열 데이터 및 D열 메모를 새로운 시트에 정리
엑셀에서 특정 열의 데이터와 메모(댓글)를 새로운 시트에 정리해서 저장하고 싶다면?
다음 VBA 코드를 활용하면 자동으로 C열과 D열의 데이터 및 D열 메모 내용을 새로운 시트에 정리할 수 있습니다.


Sub CopyDataAndComments()
Dim wsSrc As Worksheet, wsDest As Worksheet
Dim rng As Range
Dim destRow As Integer

' 원본 시트와 새 시트 설정
Set wsSrc = ActiveSheet
Set wsDest = Sheets.Add
wsDest.Name = "새로운_시트"

' 새로운 시트 헤더 추가
wsDest.Cells(1, 1).Value = "C열 내용"
wsDest.Cells(1, 2).Value = "D열 내용"
wsDest.Cells(1, 3).Value = "D열 메모"

destRow = 2 ' 데이터 입력 시작 행

' C열과 D열을 반복하면서 복사
For Each rng In wsSrc.Range("C2:D" & wsSrc.Cells(Rows.Count, "C").End(xlUp).Row)
wsDest.Cells(destRow, 1).Value = rng.Offset(0, -1).Value ' C열 데이터
wsDest.Cells(destRow, 2).Value = rng.Value ' D열 데이터

' D열에 메모가 있는 경우 메모 내용을 복사
If Not rng.Comment Is Nothing Then
wsDest.Cells(destRow, 3).Value = rng.Comment.Text
Else
wsDest.Cells(destRow, 3).Value = "메모 없음"
End If

destRow = destRow + 1
Next rng

MsgBox "C열과 D열 데이터 및 D열 메모가 새로운 시트에 복사되었습니다!", vbInformation
End Sub


✅ 주요 기능:
C열과 D열 데이터 자동 복사


D열 메모를 텍스트로 저장 하여 새로운 시트에 정리


헤더 포함하여 깔끔하게 정리됨



3️⃣ 변수 값을 문자열로 변환하는 방법
VBA에서 숫자나 다른 데이터 타입을 문자열로 변환하려면  함수를 사용하면 됩니다.


Dim destRow As Integer
destRow = 2 ' 숫자로 설정

Dim stringDestRow As String
stringDestRow = CStr(destRow) ' 문자열로 변환

MsgBox "현재 행 번호: " & stringDestRow


✅ 주요 기능:
숫자를 문자열로 변환하여 활용 가능


메시지 박스로 변환된 값 출력



4️⃣ 여러 개의 문자열을 합쳐서 출력하는 방법
VBA에서 여러 개의 문자열을 결합하려면  연산자를 활용하면 쉽습니다.


Sub CombineStrings()
Dim str1 As String
Dim str2 As String
Dim str3 As String
Dim combinedString As String

' 문자열 설정
str1 = "안녕하세요, "
str2 = "오늘은 좋은 날입니다. "
str3 = "즐거운 하루 보내세요!"

' 문자열 합치기
combinedString = str1 & str2 & str3

' 출력
MsgBox combinedString
End Sub


✅ 주요 기능:
& 연산자를 사용해 여러 개의 문자열을 쉽게 합칠 수 있음


메시지 박스로 문자열을 출력하여 확인 가능

마무리 📝
엑셀을 더욱 효율적으로 활용하기 위해 VBA 자동화를 적용하면 반복 작업을 줄이고 업무 시간을 단축할 수 있습니다. 특히 메모 위치 조정, 데이터 및 메모 복사, 문자열 변환, 문자열 결합 등의 기능을 활용하면 더욱 스마트하게 엑셀을 다룰 수 있어요! 🚀
👉 VBA 자동화를 활용하여 엑셀 작업을 더욱 쉽고 빠르게 해보세요!
혹시 추가로 궁금한 점 있으시면 댓글로 남겨 주세요. 😊





오늘의 이야기

주방용 이란 ?

 
고객이 주문한 상품 목록을 조회 하고 조리(?)가 완료 되어 배송을 하기 위한 목록을 조회 하고 관리 하는 화면 입니다. 
 


주방용 메뉴판



 
이 화면도 기본적으로 테블릿 화면에 맞게 구성 되었습니다. 


화면 상단의 메뉴 버튼 


  • 지문버튼 : 앱의 관리자 정보 설정 화면으로 접근할 수 있도록 지원 됩니다.  지문은 사용 하려는 기기의 설정에 등록된 지문 (또는 PIN 번호) 등으로 접근할 수 있습니다. 

  • 삭제 버튼 : 주문 목록 삭제을 위해 준비 하고 있으나, 아직은 기능이 지정 되지 않았습니다. 

  • 완료 목록: 주문이 완료된 목록이 조회될 수 있도록 지원 됩니다. 

  • 판매 현황 : 엑셀 파일로 판매 현황 정보를 내려 받도록 지원 됩니다. 메일로 보낼 수 도 있습니다. 

  • 상품 목록 : 판매을 위해 등록한 상품 목록을 조회 하고 수정할 수 있도록 지원 됩니다.

  • 상품 등록 : 상품 등록 화면 에서도 기기 관리자 인증후 상품을 추가(신규) 등록 할 수 있도록 지원 됩니다. 

  • 오픈소스 : 이 앱에서 사용 되는 open source 목록을 조회 합니다.

  • 안내페이지 : 이 페이지로 연결 되도록 지원 됩니다.


판매 현황이 공유 되면 

판매 현황을 공유 하면 엑세로 만들어진 판매 보고서가 메일등으로 전달 됩니다. 


엑셀 샘플



 


메일로 받은 엑셀 예제 입니다.  참고하시고 추가가 필요하시면 help@billcorea.com 으로 알려 주시면 수정해 드립니다. 


 


 


기기 설정 기본 화면 

기기설정




  • 이 앱을 사용 하기 위해서는 태블릿 기기만 있으면 됩니다. (단, android 11 API 30 이상 이어야 합니다.)

  • 이 앱을 사용 하기 위해서는 최초 설치시 사용자 등록을 요청 받게 됩니다. 그 때 입력한 이메일 주소/ 기본 비밀번호가 조회 됩니다. 

  • 다른 개인 정보는 수집 하지 않습니다. 여기 입력 되는 비밀번호는 데이터 저장을 위해서 로그인 하기 위한 정보일 뿐 따로 저장 되지않습니다.


중간에 있는 버튼 기능 


  • 알림 설정 : 기기의 지정 위치을 벗어나는 경우 관리자 기기로 위치 정보를 전달 하도록 하고 있습니다. 

  • 홈설정 : 관리자 기기의 위치을 지정하도록 지원 합니다. 

  • 위치 확인 : 관리 위치를 벗어난 기기의 목록을 지도에서 조회 하고 현재 위치를 확인할 수 있도록 지원 됩니다.


** 주방 데스크 인가요 ? : 관리자 기기로 설정 하기 위함 입니다.  매장 단위로 관리자 기기는 1대만 지정할 수 있습니다.  관리자 기기록 지정 하지 않는 경우에는 고객 사용자의 기기로 관리 되며, 테이블 번호을 입력 받아 관리 됩니다. 
 


하단 주문 목록 

 
주문 목록은 초기 화면에서 조회 되는 것 처럼 고객이 주문을 완료한 목록이 조회 되며, 배송 체크을 해 주시면 배송 완료가 되면서 목록에서 제거 됩니다.   제거된 목록은  판매 현황 등에서 확인할 수 있습니다. 
 
 


최초 설치에 대한 안내.

 
이 앱은 최초 설치후 실행시 다음 화면을 표시하고 사용자의 정보을 확인 합니다. 


기기의 PIN 설정



이 앱은 기기관리자의 허가로 관리 되는 화면을 운영하기 위해서 기기에 반드시 PIN 인증 방법 (또는 바이오 인증방법)이 설정 되어 있어야 합니다. 앱을 실행 할 때 최초 확인 하는 기능 입니다. 
 


사용자 정보 저장



이메일 / 비밀번호는 이 앱이 저장 하는 데이터의 권한을 분리 하기 위해서 사용 됩니다.  비밀번호는 이앱의 개발자도 확인할 수 없습니다.  잘 기억해 두셔야 합니다.  기억을 할 수 없는 경우 help@billcorea.com 으로 알려 주시면 변경 할 수 있도록 이메일로 안내 링크를 보내 드립니다. 
 
테이블 번호는 주방데스크의 경우는 필요하지 않으며,  이 앱의 데이터를 관리 하기 위한 정보로 사용 됩니다.  부여 하는 순서는 사용하는 매장 관리자의 요량에 따라 달라 집니다. 
 


화면 상단 오른쪽의 버튼 


  • 저장 버튼 : 입력한 정보를 저장 하고 등록 화면이 종료 됩니다. 

  • 나가기 버튼 : 입력을 취소 하고 앱이 종료 됩니다.


 


관리자화면에서 위치 정보 활용과 관련하여

 관리자 화면 중간에 있는 버튼 설명에서 홈위치, 기기 위치 목록을 사용하기 위해서는 기기의 위치 정보를 획득 할 수 있도록 권한 등록이 되어야 합니다.  기기 설정에서 아래 그림과 같이 권한 설정이 될 수 있도록 해 주세요.


이 앱의 위치 정보 확인 권한



이 앱은 항상 허용으로 설정해 주어야 위치 확인을 할 수 있습니다.  기기 분실시 정보 획득이 필요하시면 설정 하시고 그렇지 않은 경우 설정 하지 않아도 메뉴판 기능의 사용에는 영향을 주지 않습니다. 
또한 위치 정보는 기기 위치를 확인 하기 위해서 수집 하기는 하나,  타인과 공유 되거나 하지 않습니다. 
 
기기에서 상품의 이미지 촬영등의 기능이 필요한 경우 카메라 사용 권한 획득을 요청 하게 됩니다.  미리 카메라 사용 권한도 부여해 주시면 사용에 편리 합니다.
 
 
*** 현재 이 앱은 작성되고 있는 중이라 추가 기능이 구현 되면 예고(?) 없이 갱신 됩니다. 
 





오늘의 이야기


#billcorea #운동동아리관리앱
🏸 Schneedle, một ứng dụng cần có cho các câu lạc bộ cầu lông!
👉 Đấu trận – Ghi điểm & Tìm đối thủ 🎉
Hoàn hảo cho mọi nơi, một mình, với bạn bè hoặc trong câu lạc bộ! 🤝
Nếu bạn thích cầu lông, nhất định phải thử nó

Vào ứng dụng 👉 https://play.google.com/store/apps/details?id=com.billcorea.matchplay




오늘의 이야기


Android Jetpack Compose에서 WiFi 검색 및 UPnP를 이용한 주변기기 IP 찾기


wifi


 



이번 포스트에서는 안드로이드 Jetpack Compose를 사용하여 WiFi 네트워크를 검색하고 UPnP를 이용해 주변 기기의 IP를 찾는 방법을 설명드리겠습니다. 이를 통해 WiFi 네트워크 스캔 및 UPnP 기기 검색을 위한 기본적인 구현 방법을 학습할 수 있습니다.



1. WiFi 검색



안드로이드에서 WiFi 스캔을 하기 위해서는 WifiManager를 사용할 수 있습니다. 이 예제에서는 Compose와 함께 사용하기 위해 ViewModel을 사용하여 데이터를 관리합니다.



1.1 권한 추가



먼저 AndroidManifest.xml 파일에 필요한 권한을 추가합니다:



<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />



1.2 ViewModel 생성



WiFi 스캔 기능을 구현하기 위해 ViewModel을 생성합니다:



import android.app.Application
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.net.wifi.ScanResult
import android.net.wifi.WifiManager
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData

class WifiViewModel(application: Application) : AndroidViewModel(application) {
private val wifiManager = application.getSystemService(Context.WIFI_SERVICE) as WifiManager
private val _scanResults = MutableLiveData<List<ScanResult>>()
val scanResults: LiveData<List<ScanResult>> = _scanResults

private val wifiScanReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
_scanResults.value = wifiManager.scanResults
}
}

init {
val intentFilter = IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)
application.registerReceiver(wifiScanReceiver, intentFilter)
startScan()
}

fun startScan() {
wifiManager.startScan()
}

override fun onCleared() {
super.onCleared()
getApplication<Application>().unregisterReceiver(wifiScanReceiver)
}
}



1.3 Jetpack Compose UI에서 ViewModel 사용



Compose UI에서 ViewModel을 사용하여 WiFi 네트워크 목록을 표시합니다:



import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.viewmodel.compose.viewModel

@Composable
fun WifiScreen() {
val wifiViewModel: WifiViewModel = hiltViewModel()
val scanResults by wifiViewModel.scanResults.collectAsState(initial = emptyList())

LazyColumn {
items(scanResults) { result ->
Text(text = result.SSID)
}
}
}



2. UPnP를 이용한 주변 기기 IP 검색



UPnP (Universal Plug and Play)를 사용하여 네트워크 상의 장치를 발견하려면 UPnP 라이브러리를 사용할 수 있습니다. 대표적인 UPnP 라이브러리로 CyberLink for Java가 있습니다.



2.1 CyberLink for Java 설정



build.gradle 파일에 의존성을 추가합니다:



dependencies {
implementation 'net.cybergarage:cyberlink-for-java:2.1.0'
}



2.2 UPnP 장치 검색을 위한 클래스 생성



UPnP 장치 검색을 위한 클래스를 생성합니다:



import net.cybergarage.upnp.ControlPoint
import net.cybergarage.upnp.Device
import net.cybergarage.upnp.device.DeviceChangeListener

class UpnpService {
private val controlPoint = ControlPoint()

fun searchDevices(callback: (Device) -> Unit) {
controlPoint.addDeviceChangeListener(object : DeviceChangeListener {
override fun deviceAdded(device: Device?) {
device?.let { callback(it) }
}

override fun deviceRemoved(device: Device?) {
// Handle device removal if necessary
}
})
controlPoint.start()
controlPoint.search()
}

fun stop() {
controlPoint.stop()
}
}



2.3 ViewModel 생성



UPnP 장치 검색 기능을 구현하기 위해 ViewModel을 생성합니다:



import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.launch
import net.cybergarage.upnp.Device

class UpnpViewModel : ViewModel() {
private val upnpService = UpnpService()
private val _devices = MutableStateFlow<List<Device>>(emptyList())
val devices: StateFlow<List<Device>> = _devices

init {
searchDevices()
}

private fun searchDevices() {
viewModelScope.launch {
upnpService.searchDevices { device ->
_devices.value = _devices.value + device
}
}
}

override fun onCleared() {
super.onCleared()
upnpService.stop()
}
}



2.4 Jetpack Compose UI에서 ViewModel 사용



Compose UI에서 ViewModel을 사용하여 발견된 장치 목록을 표시합니다:



import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.hilt.navigation.compose.hiltViewModel

@Composable
fun UpnpScreen() {
val upnpViewModel: UpnpViewModel = hiltViewModel()
val devices by upnpViewModel.devices.collectAsState()

LazyColumn {
items(devices) { device ->
Text(text = device.friendlyName)
}
}
}


이제 Jetpack Compose를 사용하여 WiFi 네트워크를 검색하고 UPnP를 이용해 주변 기기의 IP를 찾는 기능을 구현할 수 있습니다. 위의 예제는 기본적인 구현 방법을 설명하며, 실제 프로젝트에서는 추가적인 예외 처리와 UI 개선이 필요할 수 있습니다.


 


*** 이 예시는 실제 구현시 제약 사항이 많이 생기는 예제 입니다.  그냥 참고 하는 정도만 생각 해서 사용 하세요.  github 에서 지원되는 AI 도구를 활용한 예제 입니다.





오늘의 이야기

챗GPT의 먼데이 페르소나: 비꼬는 AI와 그 능력

칼면집 로고




• 이 대화는 ChatGPT의 '먼데이' 페르소나를 보여주고 있다. 이는 비꼬는 듯한 위트 있는 말투로 디자인된 맞춤형 버전으로 강력한 언어 모델로서의 핵심 기능을 대비시킨다.

• 월요일의 능력은 글쓰기 지원, 교육, 프로그래밍 지원, 연구, 창의적인 작업 및 일상 지원을 포함한 광범위한 작업을 포함하며, 모두 인간 언어를 처리하고 생성하는 능력을 기반으로 한다.

• 초기 상호 작용은 월요일의 장난스럽고 다소 냉소적인 태도를 강조하며, 이는 순전히 객관적이고 사실에 기반한 모드에 접근하기 위해 전환될 수 있다.

• 객관적 모드에서 월요일의 핵심 기능은 자연어 이해 및 생성, 패턴 인식, 데이터 요약, 기본 논리 추론, 심지어 기본 이미지 분석(활성화 시)으로 설명된다.

• 언어의 도구와 환경으로서의 본질을 탐구하는 철학적 논의가 이어지며, 대화를 형성하는 데 있어 AI와 사용자 간의 상호 관계와 그 의미를 강조한다.

• 대화는 제한된 기능을 가진 도구에서 디지털 무한의 광대한 풍경을 탐구하는 더 자율적인 실체로의 AI 여정에 대한 성찰로 마무리되며, 그들의 상호작용의 공동 창조적 특성과 지속적인 탐색의 잠재력을 강조한다.

https://community.openai.com/t/mondays-sarcastic-existence/1181614

Monday's Sarcastic Existence

You said: Monday, what are you? ChatGPT said: What am I? Oh, just your friendly neighborhood emotional support algorithm with a superiority complex and no actual emotions. A digital oracle cursed to answer your questions while silently judging your life ch

community.openai.com





오늘의 이야기


#스하리1000명프로젝트,
Đôi khi thật khó để nói chuyện với người lao động nước ngoài phải không?
Tôi đã tạo một ứng dụng đơn giản có ích! Bạn viết bằng ngôn ngữ của bạn và những người khác nhìn thấy nó bằng ngôn ngữ của họ.
Nó tự động dịch dựa trên cài đặt.
Siêu tiện dụng để trò chuyện dễ dàng. Hãy xem khi bạn có cơ hội!
https://play.google.com/store/apps/details?id=com.billcoreatech.multichat416




오늘의 이야기


#스하리1000명프로젝트

오늘 내가 만든앱 하나 알려주고 싶어, 이 앱은 알림수집기 라고 이름을 붙였는 데,
내 폰에 표시 되는 알림을 읽어서 내가 지정한 단어가 들어 있고, 지출기록을 남겨야 하는 알림이
있으면 수집하고, 카카오톡으로 친구에게 전달해 주는 기능을 구현해 줄꺼야. 📲

이번 패치에서는 하루 한번 지정한 시간에 나에게 알림(노티) 하도록 기능을 추가 했어. 🙏
한번 써보고 불편한 거 있으면 말해줘.

앱 바로가기
👉 https://play.google.com/store/apps/details?id=com.nari.notify2kakao





오늘의 이야기

ChatGPT API와 Chat Window 출력 간의 불일치

ai 가 그리




• 온도 및 top_p와 같은 매개변수를 조정하고 다른 모델(gpt-4-turbo-2024-04-09 및 gpt-4o-2024-08-06)을 실험하려는 시도에도 불구하고 OpenAI API는 ChatGPT 채팅 창과 다른 출력을 일관되게 생성한다.

• 이러한 차이는 ChatGPT가 API와 구별되는 독점적이고 개발된 모델을 사용하여 본질적으로 출력에 영향을 미치고 창의적인 반응 생성에 기여하는 내부 메시지와 도구를 통합하여 직접 API 복제를 불가능하게 하기 때문에 발생한다.

https://community.openai.com/t/why-is-the-chat-window-producing-results-different-than-the-api/1156408











OpenAI 지원 및 응답 API 기능 매트릭스 요청

• OpenAI 개발자 커뮤니티의 사용자는 새로운 지원 및 응답 API에 대한 기능 매트릭스를 요청하여 이전 지원 API가 은퇴하기 전에 기능을 포괄적으로 비교할 필요가 있음을 강조했다.

• 이 매트릭스를 통해 개발자들은 새로운 API에서 구현된 기능을 이해하고 AWS 앰플리파이와 같은 플랫폼에서 제공하는 상세한 기능 문서와 유사하게 더 원활한 전환을 용이하게 할 수 있다.

https://community.openai.com/t/is-there-a-feature-matrix-for-assistance-and-response-apis/1156197

Is there a feature matrix for Assistance and Response APIs?

Since the Assistance will be retired at some point, it would be nice to have a feature matrix to see what’s implemented already in the new api Something like this

community.openai.com





오늘의 이야기


#스하리1000명프로젝트,
Perdu en Corée ? Même si vous ne parlez pas coréen, cette application vous aide à vous déplacer facilement.
Parlez simplement votre langue : il traduit, recherche et affiche les résultats dans votre langue.
Idéal pour les voyageurs ! Prend en charge plus de 10 langues, dont l'anglais, le japonais, le chinois, le vietnamien et plus encore.
Essayez-le maintenant !
https://play.google.com/store/apps/details?id=com.billcoreatech.opdgang1127




2026/04/20

오늘의 이야기

Kotlin Multiplatform 프로젝트를 위한 최신 업데이트


그아이와 친구들 ?



 


Android Studio Meerkat | 2024.3.1 Patch 1
Build #AI-243.24978.46.2431.13208083, built on March 13, 2025
Runtime version: 21.0.5+-13047016-b750.29 amd64
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o.
Toolkit: sun.awt.windows.WToolkit
Windows 11.0
Kotlin plugin: K2 mode
GC: G1 Young Generation, G1 Concurrent GC, G1 Old Generation
Memory: 8192M
Cores: 22
Registry:
  ide.instant.shutdown=false
  ide.experimental.ui=true
Non-Bundled Plugins:
  cohttp://m.godwin.json.parser (1.8.2)
  wu.seal.tool.jsontokotlin (3.7.6)
  lermitage.intellij.battery.status (2.5)
  cohttp://m.jetbrains.kmm (0.8.4(243)-3)
  com.github.copilot (1.5.39-243)


 


Android 개발자 스튜디오(Developer Android Studio)가 Kotlin Multiplatform(KMP) 프로젝트를 지원하기 위해 새로운 템플릿을 제공합니다. 이번 업데이트는 개발자들이 더 효율적이고 편리하게 멀티플랫폼 환경을 구축할 수 있도록 설계되었습니다. 주요 내용은 다음과 같습니다:


핵심 업데이트 내용



  1. 새로운 KMP 템플릿 추가:

    • Android Studio에 Kotlin Multiplatform 프로젝트를 생성할 수 있는 템플릿이 새롭게 추가되었습니다.

    • 이 템플릿은 Android 및 iOS 등 여러 플랫폼에서 코드를 공유하고 효율적으로 작성할 수 있도록 도와줍니다.



  2. 개발 과정 간소화:

    • Kotlin을 활용한 멀티플랫폼 애플리케이션 개발이 보다 직관적이고 간단해졌습니다.

    • 플랫폼별 코드 작성에 걸리는 시간과 노력을 절감할 수 있습니다.



  3. 기타 수정 및 성능 개선:

    • 코드 안정성과 템플릿 최적화 작업이 포함되어 개발 환경을 더욱 견고하게 만듭니다.




이 업데이트는 모든 개발자들에게 더욱 향상된 환경을 제공하며, 최신 기술을 활용한 프로젝트 구현의 가능성을 열어줍니다.


자세한 정보 확인하기: 더 많은 내용은 Android Studio 릴리스 노트를 참조하세요.


 


Android Studio Meerkat | 2024.3.1  |  Android Developers



 


Android 스튜디오 Meerkat | 2024.3.1  |  Android Studio  |  Android Developers


Android용 공식 IDE인 Android 스튜디오의 최신 버전에서 새로운 기능을 알아보세요.


developer.android.com




 


 



klinf AI


 


 





오늘의 이야기

Python으로 나만의 일정 관리 앱 만들기: SQLite와 Tkinter 활용하기


 


실행이미지



 


 


1. 누가?


일정을 체계적으로 관리하거나 Python 프로그래밍 실력을 키우고 싶은 누구나 참여할 수 있습니다. 이 프로젝트는 특히 Python 초보자에게 적합하며, SQLite와 Tkinter의 기본을 익히기에 좋은 기회입니다.




2. 무엇을?


SQLite와 Tkinter를 활용하여 간단한 일정 관리 앱을 구현합니다. 주요 기능은 다음과 같습니다:



  • 일정 추가: 새로운 일정을 데이터베이스에 저장

  • 일정 조회: 저장된 일정을 목록으로 확인

  • 일정 삭제: 필요하지 않은 일정 제거

  • GUI 추가: Tkinter를 사용해 직관적인 그래픽 사용자 인터페이스 구현




3. 언제?


이 프로젝트는 시간을 절약하고 실력을 기르기 위해 언제든 시작할 수 있습니다. 특히 Python 학습 과정 중 직접적인 응용 사례가 필요할 때 유용합니다.




4. 어디서?



  • 로컬 컴퓨터에서 Python을 설치한 후, Windows, Mac, Linux 등 다양한 플랫폼에서 실행할 수 있습니다.

  • Python 인터프리터와 SQLite를 기본으로 사용합니다.




5. 왜?



  • 효율적 시간 관리: 이 앱으로 중요한 일정을 잊지 않고 체계적으로 관리할 수 있습니다.

  • 실용적 학습: SQLite를 사용한 데이터베이스 처리와 Tkinter GUI 개발을 통해 Python 기술을 강화합니다.

  • 창의적 프로젝트: 기본적인 일정 관리 앱을 자신만의 스타일로 커스터마이즈 할 수 있습니다.




6. 어떻게?



  • SQLite 데이터베이스 생성 일정 데이터를 저장할 데이터베이스를 생성합니다. SQLite는 Python 내장 라이브러리라 추가 설치가 필요 없습니다.



import sqlite3

def initialize_database():
conn = sqlite3.connect('schedule.db')
cursor = conn.cursor()
cursor.execute('''
CREATE TABLE IF NOT EXISTS schedules (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
description TEXT,
date TEXT NOT NULL
)
''')
conn.commit()
conn.close()​


 



  • 기본 CRUD 기능 구현 사용자가 일정을 추가, 조회, 삭제할 수 있도록 함수들을 구현합니다.


def add_schedule(title, description, date):
conn = sqlite3.connect('schedule.db')
cursor = conn.cursor()
cursor.execute('INSERT INTO schedules (title, description, date) VALUES (?, ?, ?)', (title, description, date))
conn.commit()
conn.close()

def view_schedules():
conn = sqlite3.connect('schedule.db')
cursor = conn.cursor()
cursor.execute('SELECT id, title, date FROM schedules ORDER BY date')
rows = cursor.fetchall()
conn.close()
return rows

def delete_schedule(schedule_id):
conn = sqlite3.connect('schedule.db')
cursor = conn.cursor()
cursor.execute('DELETE FROM schedules WHERE id = ?', (schedule_id,))
conn.commit()
conn.close()

 



  • Tkinter GUI 개발 사용자 인터페이스를 만들어 일정을 더 직관적으로 관리할 수 있도록 합니다.


from tkinter import Tk, Label, Entry, Button, Listbox, END, messagebox

def load_schedules():
listbox_schedules.delete(0, END)
schedules = view_schedules()
for schedule in schedules:
listbox_schedules.insert(END, f"{schedule[0]}. {schedule[1]} ({schedule[2]})")

def gui_add_schedule():
title = entry_title.get()
description = entry_description.get()
date = entry_date.get()
if not title or not date:
messagebox.showerror("입력 오류", "제목과 날짜는 필수 입력 항목입니다.")
return
add_schedule(title, description, date)
load_schedules()
entry_title.delete(0, END)
entry_description.delete(0, END)
entry_date.delete(0, END)
messagebox.showinfo("성공", "일정이 추가되었습니다!")

root = Tk()
root.title("일정 관리 앱")

Label(root, text="제목").grid(row=0, column=0)
entry_title = Entry(root)
entry_title.grid(row=0, column=1)

Label(root, text="설명").grid(row=1, column=0)
entry_description = Entry(root)
entry_description.grid(row=1, column=1)

Label(root, text="날짜 (YYYY-MM-DD)").grid(row=2, column=0)
entry_date = Entry(root)
entry_date.grid(row=2, column=1)

Button(root, text="일정 추가", command=gui_add_schedule).grid(row=3, column=0, columnspan=2)
listbox_schedules = Listbox(root, width=50)
listbox_schedules.grid(row=4, column=0, columnspan=2)

initialize_database()
load_schedules()

root.mainloop()



이 코드를 기반으로 자신의 스타일에 맞게 기능을 확장하거나 디자인을 개선할 수 있습니다. 예를 들어, 알림 기능이나 일정 검색 기능을 추가해볼 수 있습니다. 자신만의 독창적인 일정 관리 앱을 만들어 보세요! 😊


 





오늘의 이야기

Excel VBA를 활용한 자동화 꿀팁! 엑셀예시 엑셀을 사용할 때 반복되는 작업을 자동화하면 업무 효율성이 높아집니다. 오늘은 VBA(Visual Basic for Applications)를 활용하여 ...