2026/03/09

오늘의 이야기

이제 또 새로운 앱을 하나 만들어 볼까 합니다.  제목은 가칭 '주문이요'라고 했습니다. 


 


기획의도 


요즘은 매장에 가면 다들 테이블에 테블릿 하나쯤 거치하고 주문을 받고 실시간으로 결제도 진행하고 그렇게 매장을 운영하는 경우를 종종 보게 됩니다.  그것이 좋은 지 어떤지는 모르겠지만...  그런 매장을 하나 가져보고 싶은 욕망(?)이 생기는 건... 이제 떠나야 할 곳이 어디인지 보이기 때문 이기도 합니다.


 


앱 로고 이미지



이것은 맞는 가 하는 문제는 나중에 생각해 보려 합니다. 지금은 무언가를 해야할 것 같은 시기이기도 하고 해서...


 


준비사항


아직은 아무런 준비도 없고 그저 앱을 하나 기획하고 기본 화면만 하나 만들어서 무작정 게시를 시작합니다. 


다들 아시는 것처럼 playstore console 에서 새로 앱 만들기를 하고 게시할 준비를 시작합니다.


기본 스토어 등록 정보



이걸 하기 전에 준비해야 할 것들은 


로그 이미지 (앱 아이콘은 투명한 PNG 또는 JPEG, 최대 1MB, 512px X 512px이어야 하며 디자인 사양  메타데이터 정책을 준수해야 합니다.), 


기본 아미지 (그래픽 이미지는 PNG 또는 JPEG, 최대 1MB, 1024px X 500px이어야 합니다.),


동영상 링크 (보통은 youtube 링크를 입력합니다.)


그리고 여러 장의 앱 이미지 (휴대전화 스크린숏을 2~8장 업로드하세요. 스크린숏은 PNG 또는 JPEG, 장당 최대 8MB, 가로세로 비율 16:9 또는 9:16, 가로세로 길이는 320px X 3840px 사이여야 합니다.) 등을 준비하여야 합니다.


 


다음은 앱 콘텐츠에서 나오는 각 항목을 설정해 두어야 합니다.  그다음은 앱을 빌드해서 내부 테스트부터 하건, 바로 프로덕션으로 하건 앱을 업로드하고 게시 허가가 나오길 기다려 봅니다. 


 


기다려 봅니다.



 


다음 이야기


무엇을 준비해야 할까요?


 


시작해 봅니다.


 


https://play.google.com/store/apps/details?id=com.billcoreatech.bespeak1003 



 


주문이요, Bespeak - Google Play 앱


매장안에 있는 테이블에서 주문을 실시간으로 받고 주방으로 전달해 앱 입니다.


play.google.com




 


 


오늘 (2022.10.04) 구글링을 해서 PG연동에 대한 조사를 해 보았으나, 이 글의 내용과 맞는 결제 처리 방식은 찾을 수 없었습니다.  해서 ... 앱의 구현에서 결제 모듈 연동은 제외 하고 진행 해 볼까 합니다.


 





오늘의 이야기

이 글은 앱 사용자를 위한 설명입니다.  (2022.10.03 13시 이후에 적용된 패치 버전 기준 입니다.)


 


https://play.google.com/store/apps/details?id=com.billcoreatech.ontheway801 



 


주변검색, 주변찾기, 가는길에, 요소수 주유소 - Google Play 앱


내주변의 장소를 선택하고, 선택한 위치에 도착하면 사전에 등록한 알림을 보내 줍니다.


play.google.com




앱 개발의 취지


집에 가는 길에 들려야 하는 곳이 있다면 근처에 도착했을 때 알림을 주고자 했습니다.  그 이후에 요소수 품귀가 있었던 때에는 데이터 포털(www.data.go.kr)에서 제공하는 요소수 재고가 있는 주요소 정보를 제공하고자 했습니다. 


 


이 버전은


이 버전은 이전 버전에서 화면 구성을 새로게 수정합니다. 메뉴의 구현도 달라집니다. 


설정에서 등록하는 지역에 따라 요소수 주요소 정보를 제공합니다. (이 정보는 opinet - 유가정보 api를 활용합니다.)


지도 화면에는 주변에 있는 주유소 위치 정보와 최근 우리 지역의 평균 유가정보를 표시합니다. (이것도 opinet에서 제공된  api을 활용합니다.)


 


설정 하기


설정화면1



 


 


 


다른 사람과 공유할 별칭을 나의 위치정보를 주기적으로 전달하도록 설정할 때 상대방 화면에 표시될 나의 별칭입니다. 


 


 


 


위치인식범위는 앱이 실행되는 스마트폰의 위치를 사전에 선택한 위치에서 얼마나 떨어진 상태까지 인식하게 할 것인가를 설정합니다. 


 


나의 위치에서 얼마나 떨어진 곳에 있는 곳을 검색하도록 할 것인가를 설정 합니다. 키워드 검색이나, 카테고리 검색을 할 때 찾을 수 있는 범위를 지정하는 것입니다.


 


한번 지정된 위치는 몇 시간 범위 내에서 진입/이탈하였을 때 알림을 보여줄 것인지 지정하는 것입니다. 


 


위치정보를 수신하기 위해서 위치정보를 보내줄 상대방에게 알림 정보를 보내는 것입니다.  예) 부모가 아이에게 알림 정보를 보내야 합니다. 


 


위치 설정에서 등록한 우리 집/회사/학교/학원 등의 위치 점검을 반복해서 할 것인 지를 선택 하면 됩니다.


 


 


 


 


설정화면2



 


 


 


 


 


 


 


 


 


 


 


요소수 주유소 정보를 보여줄 기본 위치 정보를 선택할 수 있도록 하였습니다.  


 


기본적으로 보일 주유소 정보를 표시하기 위해서 주 사용 연료를 선택하도록 하였습니다.


 


 


내 위치를 보내줄 상대방의 정보를 표시합니다 위에서 토큰 정보를 보내주면 받은 상대방의 폰에 표시되는 내용이 됩니다. 


 


 


 


 


 


 


 


 


 


메인 메뉴


기본화면



 


이번에는 화면 구성을 단순하게 변경하였습니다 


이 그림과 같이 화면이 표시됩니다. 


 


제목 아래 부분에는 선택한 위치 정보가 있을 선택한 위치 정보와 함께 등록된 시간이 표시 됩니다.


 


키위드


키위드를 이용하여 주변을 검색합니다. 


카테고리


카테고리를 선택하여 주변을 검색합니다. (예: 약국, 대형병원, 슈퍼마켓, 편의점....)


위치 설정


우리 집/ 회사 / 학교 / 학원 / 기타 등의 위치를 지도를 보면서 고정할 수 있습니다.


 


요소수


설정에서 선택한 지역의 요소수 주유소 정보를 보여 줍니다.


설정


설정의 앞에서 설명이 되었습니다.


 


 


키워드 검색




 


키워드를 이용한 검색은 다음과 같이 적용됩니다. 


 


화면 상단에는 지도가 보이고 아래 부분에는 검색할 수 있는 창이 있습니다.  검색 버튼을 이용해서 검색을 하게 되면, 지도 위에 해당 위치가 표시 됩니다. 


 


지도위에 마커를 클릭하면 하단에 리스트는 해당 위치 정보가 보이도록 이용됩니다. 


 


위치가 정해지면 명칭 하단에 있는 위치 알림 또는 알림 해제 기능을 사용할 수 있습니다.


 


 




 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


화면 아래 부분이던 리스트 상단바를 위로 끌어올리면 화면 전체가 리스트만 나오는 화면으로 변경됩니다. 


 


이때는 조회된 위치 목록을 스크롤해서 찾아볼 수 있습니다. 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


카테고리 검색




 


카테고리 검색은 화면 중간에 있는 선택 콤보를 이용해서 내 주변을 검색할 카테고리를 지정할 수 있습니다.


 


선택하고 검색을 하게 되면 키워드 검색과 같이 지도상에 위치 정보를 표시합니다.


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 




 


목록이 표시된 이후에는 키워드 검색과 동일하게 실행됩니다.


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


위치 설정


위치설정



 


위치 설정은 현재 5곳의 위치를 지정합니다.  (우리 집, 학교, 회사, 학원, 그 외) 지정된 곳은 설정에서 선택하기에 따라 주기적으로 위치 기억이 자동으로 설정됩니다. 


 


일회성으로 선택되는 위치와 다르게 매번 반복적(기억 활성화 시간 주기로 반복)으로 위치 기억을 설정하게 할 수 있습니다.


 


또한 선택된 위치에 진입하거나, 이탈하게 되는 경우 설정에 나와 있는 내 위치 수신 목록의 상대방에게 알림 메시지를 전달하게 됩니다.


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


요소수 주유소


요소수 주유소 정보



 


설정에서 선택한 지역에 있는 요소수 보유 주유소 위치를 한 번에 확인할 수 있으며, 지도에서는 빨간색 주유소 표시로 확인할 수 있습니다. 


 


해당 마커를 클릭하면 아래 리스트가 해당 주유소 이름으로 전환되어 표시됩니다.


 


해당 정보는 오피넷으로부터 API을 통해서 수신하고 있습니다. 정보 중에 보고 일시 가 오래된 것의 경우도 오피넷에서 제공하는 정보이므로 보고 일시가 오래된 경우는 아무래도 방문하지 않는 것이 좋을 것 같습니다.


 


기준 가격은 리터 단위 가격입니다. 방문 시 참고하세요.


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


이것으로 앱에 대한 기능 설명을 마무리하겠습니다.


 





오늘의 이야기



#스치니1000프로젝트 #재미 #행운기원 #Compose #Firebase

🎯 야 너 토요일마다 로또 확인하냐?
나도 맨날 "혹시나~" 하면서 봤거든 ㅋㅋ

근데 이제는 그냥 안 해
AI한테 맡겼어 🤖✨

그것도 구글 Gemini로다가!

그래서 앱 하나 만들었지
👉 "로또 예상번호 by Gemini" 🎱

AI가 분석해서 번호 딱! 뽑아줌
그냥 보고 참고만 하면 됨

재미로 해도 좋고…
혹시 모르는 거잖아? 😏


https://play.google.com/store/apps/details?id=com.billcorea.gptlotto1127




오늘의 이야기

지오펜싱 트리거 되는 위치의 명칭 표시 


지오펜스 앱을 수정하면서 또 하나를 찾았습니다.  구현해 보고 싶었던 것은 지오펜싱에서 찾은 위치에 대한 알림을 구현할 때 현재 내가 도착한 위치가 어떤 것 때문에 표시가 되고 있는지 알고 싶다는 것입니다.  물론 잘 아시는 분들은 이미 찾으셨을리라고 생각이 되지만, 이제 구현을 해 가고 있는 분들을 위해서 기억을 남겨 두고자 합니다. 


 



import android.annotation.SuppressLint
import android.app.NotificationChannel
import android.app.NotificationManager
import android.app.PendingIntent
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.graphics.Color
import android.os.Build
import android.os.Bundle
import android.util.Log
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat
import com.billcoreatech.ontheway801.MainComposeActivity
import com.billcoreatech.ontheway801.R
import com.google.android.gms.location.Geofence
import com.google.android.gms.location.GeofenceStatusCodes
import com.google.android.gms.location.GeofencingEvent

class GeofenceBroadcastReceiver : BroadcastReceiver() {

companion object {
var TAG = "GeofenceBroadcastReceiver"
internal const val ACTION_GEOFENCE_EVENT =
"action.ACTION_GEOFENCE_EVENT"
}


override fun onReceive(context: Context, intent: Intent) {

if (intent.action == ACTION_GEOFENCE_EVENT) {
Log.e(TAG, "onReceive ...")

val geofencingEvent = GeofencingEvent.fromIntent(intent)
// Test that the reported transition was of interest.
if (geofencingEvent != null) {

if (geofencingEvent.hasError()) {
val errorMessage = GeofenceStatusCodes.getStatusCodeString(geofencingEvent.errorCode)
Log.e("GeofenceBR", errorMessage)
return
}

// 트리거된 위치에 대한 정보를 취득해 보기 위해서...
var geofenceList = geofencingEvent.triggeringGeofences
var whereString = " "
if (geofenceList != null) {
for (geofence in geofenceList) {
Log.e(TAG, "requestId = ${geofence.requestId}")
whereString += "${geofence.requestId} "
}
}

when(val geofenceTransition = geofencingEvent.geofenceTransition) {
Geofence.GEOFENCE_TRANSITION_DWELL -> {
if (context != null) {
sendNotification(context, context.getString(R.string.DWell) + "[${whereString}]")
}
Log.e(TAG, context.getString(R.string.DWell))
}
Geofence.GEOFENCE_TRANSITION_ENTER -> {
if (context != null) {
sendNotification(context, context.getString(R.string.Enter) + "[${whereString}]")
}
Log.e(TAG, "Entered")
}
Geofence.GEOFENCE_TRANSITION_EXIT -> {
if (context != null) {
sendNotification(context, context.getString(R.string.Exit) + "[${whereString}]")
}
Log.e(TAG, "Exit")
}
else -> {
if (context != null) {
sendNotification(context, "Geofence ${geofenceTransition.hashCode()}")
}
Log.e(TAG, "geofenceTransition = ${geofenceTransition.hashCode()}")
}

}
} else {
Log.e(TAG, "geofencingEvent is null...")
}
}
}

@SuppressLint("MissingPermission")
private fun sendNotification(context : Context, messageBody: String) {
val intent = Intent(context, MainComposeActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
val extras = Bundle()
extras.putString("MSGRCV", messageBody)
intent.putExtras(extras)
val pendingIntent = PendingIntent.getActivity(
context, 0 /* Request code */, intent,
PendingIntent.FLAG_MUTABLE
)

val channelId: String = context.getString(R.string.default_notification_channel_id)
val channelName: CharSequence = context.getString(R.string.default_notification_channel_name)
val importance = NotificationManager.IMPORTANCE_DEFAULT
val notificationChannel = NotificationChannel(channelId, channelName, importance)
notificationChannel.enableLights(true)
notificationChannel.lightColor = Color.RED
notificationChannel.enableVibration(true)
notificationChannel.vibrationPattern =
longArrayOf(100, 200, 300, 400, 500, 400, 300, 200, 400)

val wearNotifyManager = NotificationManagerCompat.from(context)
val wearNotifyBuilder: NotificationCompat.Builder =
NotificationCompat.Builder(context, channelId)
.setSmallIcon(R.drawable.ic_locationnote_foreground)
.setContentTitle(context.getString(R.string.app_name))
.setContentText(messageBody)
.setAutoCancel(true)
.setContentIntent(pendingIntent)
.setVibrate(longArrayOf(100, 200, 300, 400, 500, 400, 300, 200, 400))
.setDefaults(-1)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
wearNotifyManager.createNotificationChannel(notificationChannel)
}
wearNotifyManager.notify(0, wearNotifyBuilder.build())
}
}

 


코드가 구현된 예제 화면


위에 기술된 전체 소스의 내용과 같이 트리거 되는 위치에 대한 정보를 취해서 그곳에 대한 알림을 전달하는 방식으로 내가 지정한 위치에 도달하였을 때 명칭을 표시하는 방법을 구현해 보게 됩니다. 


 


지오펜싱 위치 도달 알림.



 


트리거 명칭 전달 방법


참 저렇게 trigger 되게 하는 부분은 다음과 같이 적용했습니다.   아래처럼 geofenceList.add을 하게 되는 경우 builder을 설정하면서 setRequestId에 넣는 값을 표시하고자 하는 장소의 명칭을 넣었습니다.  그러면 위에 기술된 코드에서는 getRequestId로 값을 가져와 현재 표시되는 위치의 명칭을 보여주는 기능을 구현할 수 있습니다.


 


private fun doAddGeoFence(documents: ResponseBean.Documents) {
geofenceList.clear()
geofenceList.add(Geofence.Builder()
// Set the request ID of the geofence. This is a string to identify this
// geofence.
.setRequestId(documents.placeName)

// Set the circular region of this geofence.
.setCircularRegion(
documents.posY,
documents.posX,
sp.getFloat("aroundArea", 300f)
)

// Set the expiration duration of the geofence. This geofence gets automatically
// removed after this period of time.
.setExpirationDuration(sp.getFloat("geofenceTime", 1.0f).toLong() * 60 * 60 * 1000)

// Set the transition types of interest. Alerts are only generated for these
// transition. We track entry and exit transitions in this sample.
.setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER or Geofence.GEOFENCE_TRANSITION_EXIT)

// Create the geofence.
.build())

geofencingClient.addGeofences(getGeofencingRequest(), geofencePendingIntent).run {
addOnSuccessListener {
Log.e(TAG, "addOnSuccessListener")
showSnackbar(this@MainComposeActivity,
R.string.add_geofences,
R.string.geofences_added,
View.OnClickListener {
var dbHandler = DBHandler.open(this@MainComposeActivity)
var geoBean = GeoDataBean(
0, documents.placeName, documents.posY, documents.posX, documents.addressName, "Y"
)
dbHandler.insert(geoBean)
dbHandler.close()
}
)
}
addOnFailureListener {
// Failed to add geofences
// ...
Log.e(TAG, "addOnFailureListener ${it.message}")
}
}
}

 


이상으로 구현 예시는 정리를 마치도록 하겠습니다.  이렇게 구현 되는 앱은 다 정리가 되면 playstore에 게시할 예정입니다.   





오늘의 이야기


#스하리1000명프로젝트

스치니들!
내가 만든 이 앱은, 내 폰에 오는 알림 중에서 중요한 키워드가 있는 경우
등록해둔 친구에게 자동으로 전달해주는 앱이야 📲

예를 들어, 카드 결제 알림을 와이프나 자녀에게 보내주거나
이번 달 지출을 달력처럼 확인할 수도 있어!

앱을 함께 쓰려면 친구도 설치 & 로그인해줘야 해.
그래야 친구 목록에서 서로 선택할 수 있으니까~
서로 써보고 불편한 점 있으면 알려줘 🙏

👉 https://play.google.com/store/apps/details?id=com.nari.notify2kakao





오늘의 이야기

이런 날도 오네요.   처음이에요...






오늘의 이야기

private val geofencePendingIntent: PendingIntent by lazy {
val intent = Intent(this, GeofenceBroadcastReceiver::class.java)
intent.action = ACTION_GEOFENCE_EVENT
PendingIntent.getBroadcast(this, 0, intent, FLAG_MUTABLE)
}

지오펜스는실제 지리적 영역에 대한 가상 경계 경계입니다.[1] 지오펜스는 동적으로 생성되거나(포인트 위치 주변의 반경에서와 같이) 미리 정의된 경계 세트(예: 스쿨 존 또는 이웃 경계)와 일치할 수 있습니다.


지오펜스의 사용은 지오펜싱이라고 하며 , 사용의 한 예는 지오펜스에 들어가거나 나가는 위치 기반 서비스 (LBS) 사용자의 위치 인식 장치를 포함합니다. 이 활동은 장치 사용자에 대한 경고와 지오펜스 운영자에게 메시지를 보낼 수 있습니다. 장치의 위치를 ​​포함할 수 있는 이 정보는 휴대폰 이나 이메일 계정으로 전송될 수 있습니다.


 


이 글은 https://en.wikipedia.org/wiki/Geo-fence에서 퍼온 번역글입니다. 



 


Geo-fence - Wikipedia


Virtual perimeter Two geofences defined in a GPS application A geofence is a virtual perimeter for a real-world geographic area.[1] A geofence could be dynamically generated (as in a radius around a point location) or match a predefined set of boundaries (


en.wikipedia.org




 


해서 나는 오늘도 지오펜싱에 대한 오해(?)를 하고 있었습니다.  위에서 기술된 소스는 geofence 수신을 설정하기 구현하는 예제를 android codelab에서 보면서 따라 하기를 하면서 구현한 소스이기도 합니다 


 


android 가 API 13을 위해서 퍼블리싱을 해야 하는 경우 경고를 날리는(?) 부분이 있습니다. 어디냐 하면 PendingIntent을 broadcast 하는 경우 따라가는 파라미터 중 FLAG_IMMUTABLE을 서술하라고 하는 경우 입니다. gradle build 을 하는 경우 에러 메시지가 나타나고 가이드 문구에 FLAG_IMMUTABLE 을 넣으라고 안내를 합니다. 


 


그래서 난 착하게(?) 그대로 따라 해 보았습니다.  그런데... 그것 때문인지 아직 잘 알지는 못하지만, 지오펜싱을 수신할 때


진입, 이탈하는 것을 결괏값으로 수신하여야 하나, 그것이 잘 되지 않는 문제가 발생했습니다.  아래 소스 예시 중에서  Geofence.GEOFENCE_TRANSITION_DWELL, GEOFENCE_TRANSITION_ENTER, GEOFENCE_TRANSITION_EXIT 등의 결과 구분을 못하는 경우를 말합니다. 그래서 구현하고자 했던 기능 구현이 어렵게 되는 현상이 있었습니다. 


 


<GeofenceBroadcastReceiver 소스의 일부 발췌>


override fun onReceive(context: Context, intent: Intent) {

if (intent.action == ACTION_GEOFENCE_EVENT) {
Log.e(TAG, "onReceive ...")

val geofencingEvent = GeofencingEvent.fromIntent(intent)
// Test that the reported transition was of interest.
if (geofencingEvent != null) {

if (geofencingEvent.hasError()) {
val errorMessage = GeofenceStatusCodes.getStatusCodeString(geofencingEvent.errorCode)
Log.e("GeofenceBR", errorMessage)
return
}

when(val geofenceTransition = geofencingEvent.geofenceTransition) {
Geofence.GEOFENCE_TRANSITION_DWELL -> {
if (context != null) {
sendNotification(context, "GeoFence Dwell")
}
Log.e(TAG, context.getString(R.string.DWell))
}
Geofence.GEOFENCE_TRANSITION_ENTER -> {
if (context != null) {
sendNotification(context, context.getString(R.string.Enter))
}
Log.e(TAG, "Entered")
}
Geofence.GEOFENCE_TRANSITION_EXIT -> {
if (context != null) {
sendNotification(context, context.getString(R.string.Exit))
}
Log.e(TAG, "Exit")
}
else -> {
if (context != null) {
sendNotification(context, "Geofence ${geofenceTransition.hashCode()}")
}
Log.e(TAG, "geofenceTransition = ${geofenceTransition.hashCode()}")
}

}
} else {
Log.e(TAG, "geofencingEvent is null...")
}
}
}

 


그래서 이런저런 검색을 하던 중에 FLAG_MUTABLE을 파라미터로 적용하는 것을 알려주는 stackoverflow.com의 게시글을 하나 발견했습니다.  해서 현재 구현된 앱을 이용하여 테스트를 진행해 보고 있습니다.


 


오늘이 1일 차 테스트 중이라 아직 확실한 결과를 도출하였다고 하기 힘들 것 같아, 이번 주 중으로 결과를 알게 되면 다시 


수정해 보겠습니다. 





오늘의 이야기


#스하리1000명프로젝트,
कभी-कभी विदेशी कामगारों से बात करना कठिन होता है, है न?
मैंने एक सरल ऐप बनाया है जो मदद करता है! आप अपनी भाषा में लिखते हैं, और दूसरे इसे अपनी भाषा में देखते हैं।
यह सेटिंग्स के आधार पर स्वचालित अनुवाद करता है।
आसान चैट के लिए बहुत उपयोगी। जब मौका मिले तो देख लेना!
https://play.google.com/store/apps/details?id=com.billcoreatech.multichat416




오늘의 이야기

 


애드센스 입금내역



이런 날이 오네요... 시작은 미미 하기는 하나 그 끝은 창대하리라는 글귀처럼 다음엔 더 좋아질 것이라 믿으며... 오늘을 기록해 둡니다.  먼 뒷날을 위한 일이기는 하나 이런 소소한(?) 당근이라도 있어야 하는 게 아닐까 하는 생각이 들기도 합니다.  


 


처음 받는 거라 이제서야 알게 된 것은 카카오 뱅크는 $100 미만이라 수수료가 면제되었으나, 송금하는 쪽에서는 $10이나 때어갔네요. 흠... 뭐 아무튼 그걸로 제세금(?)은 낸 것으로 치면 되지 않을까 하는 생각이 들기는 합니다.


 


또 다른 날이 오기를 바라며...





오늘의 이야기

새이름은 뭘까요?



 


오늘 나타난 바탕 화면 이미지 입니다. 한쌍의 새가 떠~억 나왔습니다. 


 


이 새의 이름은 무엇인지 아시나요? 저는 모르겠습니다.


 


아무튼 한쌍의 새들과 같이 쭈~욱 행복한 날들이 함께 하였으면 합니다. 


 





오늘의 이야기


#billcorea #운동동아리관리앱
🏸 श्नीडल, बैडमिंटन क्लबों के लिए एक आवश्यक ऐप!
👉 मैच खेलें - स्कोर रिकॉर्ड करें और विरोधियों को खोजें 🎉
कहीं भी, अकेले, दोस्तों के साथ, या क्लब में बिल्कुल सही! 🤝
अगर आपको बैडमिंटन पसंद है तो इसे जरूर ट्राई करें

ऐप पर जाएं 👉 https://play.google.com/store/apps/details?id=com.billcorea.matchplay




오늘의 이야기

이제 또 새로운 앱을 하나 만들어 볼까 합니다.  제목은 가칭 '주문이요'라고 했습니다.    기획의도  요즘은 매장에 가면 다들 테이블에 테블릿 하나쯤 거치하고 주문을 받고 실시간으로 결제도 진행하고 그렇게 매장을 운영하는 경우를 종종...