도시는 오늘도 바빴다.
사람들은 시계를 보며 걷고, 휴대폰을 보며 밥을 먹고, 미래를 걱정하며 잠에 들었다.
누구도 지금 이 순간을 살아내지 못하는 것처럼 보였다.
그도 그랬다.
출근길엔 지하철 안에서 멍하니 고개를 떨구었고, 회사에선 말보다 한숨이 먼저 나왔다.
“고생하셨습니다”라는 말은 더 이상 위로가 아닌 자동응답처럼 느껴졌고,
이따금 울리는 카톡 알림 소리는 업무인지 사생활인지조차 구분되지 않았다.
그날도 그는 평소처럼 일찍 출근했고, 밤늦게 퇴근했다.
커피는 벌써 다섯 잔째였고, 점심은 생각도 나지 않았다.
회의 중 누군가의 말이 들리지 않아 핀잔을 들었고, 퇴근 직전엔 “좀 더 분발하자”는 상사의 말이 잔잔한 독처럼 퍼졌다.
그리고—
그는 아무 말 없이 노트북을 닫고, 조용히 사직서를 올렸다.
감정도, 미련도 없었다.
남은 건 단 하나, 깊고 무거운 피로감뿐이었다.
지하철 대신 걷기로 했다.
딱히 가고 싶은 곳이 있는 건 아니었지만, 지금 이대로 어딘가 멀어지고 싶었다.
하루치의 피로가 발끝에 묻은 채, 도시의 길을 무의식적으로 밟아 나갔다.
그러던 중—
어딘가에서 바람이 스쳤다.
아스팔트 냄새 속에 섞여 들어온 풀냄새 같은, 이상할 만큼 낯익은 공기였다.
그는 문득, 잊고 있던 어떤 풍경을 떠올렸다.
어릴 적, 시골 외갓집 근처의 들판.
해 질 무렵이면 아이들 다섯이 모였다.
누구는 두건을 쓰고, 누구는 종이칼을 들고, 우리는 독수리 오형제였다.
바람을 맞으며 달리던 길,
흙먼지를 뒤집어쓴 채 웃어대던 얼굴들.
손엔 장난감이었지만, 마음만은 진짜 세상을 구하는 영웅이었다.
그 시간은—
짧고, 투명하고, 무한했다.
그는 걸음을 멈췄다.
갑자기 코끝이 시큰해졌다.
“다들 지금 뭐 하고 있으려나...”
혼잣말이 새어나왔다.
하지만 대답 대신 돌아온 건, 고요한 정적.
그리고 문득 눈앞에 낯선 골목 하나가 펼쳐져 있었다.
좁고 눅눅한 그 골목 안,
낡은 간판 하나가 나지막이 고개를 들고 있었다.
시간을 팝니다
검은색 바탕에 금빛 글씨.
마치 누군가의 손때로 빛바랜 책 표지처럼, 오래되고도 묘하게 정겨운 느낌이었다.
가게는 문이 열려 있었고, 안에서는 시계가 '째깍째깍' 울리는 소리가 귓가를 간질였다.
그는 문 앞에 멈춰 섰다.
지금까지 흘러간 시간들, 그 속에서 닳아버린 감정들이 잠시 그의 등을 밀었다.
그리고 문은—
그가 손을 대기도 전에, 천천히 열렸다.
텍스트 데이터를 다루다 보면 특정 단어가 얼마나 자주 등장했는지 파악해야 할 때가 많습니다. 이를테면 문서 분석, 검색 엔진 최적화(SEO), 소셜 미디어 데이터 분석 등 다양한 분야에서 단어 빈도 계산이 중요한 역할을 합니다. Python은 이러한 작업을 간단하게 처리할 수 있는 강력한 도구를 제공합니다. 오늘은 Python을 사용해 문장 내 단어 빈도를 계산하는 방법을 알아보겠습니다.
승 - 해결책 1: collections.Counter 활용
Python의 collections 모듈 내 Counter 클래스는 단어 빈도를 계산하는 가장 간단하고 효율적인 방법 중 하나입니다. 아래는 예제 코드입니다:
python
from collections import Counter
sentence = "Python is amazing and Python is fun" words = sentence.split() word_counts = Counter(words)
print(word_counts)
위 코드는 단어를 공백으로 나눈 뒤, 각 단어가 몇 번 등장했는지를 계산해줍니다. 결과는 다음과 같습니다:
Oracle 데이터베이스를 다루면서 자주 접하는 문제를 해결하고, 효율적인 쿼리를 작성할 수 있는 방법들을 정리했습니다.
1. Oracle에서 만 19세 나이 산출 방법
만 나이를 계산하려면 MONTHS_BETWEEN 함수를 사용하여 생년월일과 현재 날짜 간 차이를 계산하고, 12로 나누어 연령을 산출할 수 있습니다.
sql
SELECT TRUNC(MONTHS_BETWEEN(SYSDATE, TO_DATE('2005-04-10', 'YYYY-MM-DD')) / 12) AS age FROM dual;
만약 만 19세 이상인지 확인하려면 다음과 같은 쿼리를 활용할 수 있습니다:
sql
SELECT CASE WHEN ADD_MONTHS(TO_DATE('2005-04-10', 'YYYY-MM-DD'), 12 * 19) <= SYSDATE THEN '19세 이상' ELSE '19세 미만' END AS age_status FROM dual;
2. ORA-01847 오류 무시
날짜 형식 오류(ORA-01847)를 처리하기 위해 예외(Exception) 처리를 활용할 수 있습니다:
sql
BEGIN SELECT TO_DATE('2025-02-30', 'YYYY-MM-DD') FROM dual; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('오류 발생: 무시하고 계속 진행'); END;
입력 데이터가 정확한지 검증하는 것이 가장 효과적인 해결책입니다.
3. 사용자 정의 함수에서 오류 처리
프로시저 또는 함수에서 발생할 수 있는 쿼리 오류를 처리하려면 예외 처리를 포함하는 구조를 사용합니다:
sql
CREATE OR REPLACE FUNCTION get_employee_name(p_emp_id NUMBER) RETURN VARCHAR2 IS v_name VARCHAR2(100); BEGIN SELECT ename INTO v_name FROM emp WHERE empno = p_emp_id;
RETURN v_name; EXCEPTION WHEN NO_DATA_FOUND THEN RETURN '존재하지 않는 직원'; WHEN TOO_MANY_ROWS THEN RETURN '중복된 데이터 오류'; WHEN OTHERS THEN RETURN '예기치 않은 오류 발생'; END get_employee_name; /
4. 프로시저의 쿼리 확인 방법
DBMS_METADATA 또는 USER_SOURCE를 활용하여 Oracle에서 프로시저의 소스 코드를 확인할 수 있습니다:
sql
SELECT DBMS_METADATA.GET_DDL('PROCEDURE', '프로시저_이름', '스키마_이름') FROM dual;
또는 USER_SOURCE를 사용하여 코드 확인:
sql
SELECT text FROM USER_SOURCE WHERE name = '프로시저_이름' ORDER BY line;
5. PIVOT과 CONNECT BY를 활용한 동적 월별 합산
PIVOT을 활용하여 월별 거래 합계를 계산할 수 있습니다:
sql
WITH months AS ( SELECT TO_CHAR(ADD_MONTHS(TRUNC(SYSDATE, 'MM'), LEVEL - 1), 'YYYY-MM') AS month_label FROM dual CONNECT BY LEVEL <= 12 ), transformed_data AS ( SELECT TO_CHAR(transaction_date, 'YYYY-MM') AS month_label, amount FROM transactions ) SELECT * FROM transformed_data PIVOT ( SUM(amount) FOR month_label IN ('2025-01' AS "JAN", '2025-02' AS "FEB", '2025-03' AS "MAR") );
6. 반기별 거래 합산
CASE 문을 사용하여 반기별 거래 합계를 구합니다:
sql
SELECT CASE WHEN EXTRACT(MONTH FROM transaction_date) BETWEEN 1 AND 6 THEN TO_DATE(EXTRACT(YEAR FROM transaction_date) || '-01-01', 'YYYY-MM-DD') ELSE TO_DATE(EXTRACT(YEAR FROM transaction_date) || '-07-01', 'YYYY-MM-DD') END AS half_year_start, SUM(amount) AS total_amount FROM transactions GROUP BY CASE WHEN EXTRACT(MONTH FROM transaction_date) BETWEEN 1 AND 6 THEN TO_DATE(EXTRACT(YEAR FROM transaction_date) || '-01-01', 'YYYY-MM-DD') ELSE TO_DATE(EXTRACT(YEAR FROM transaction_date) || '-07-01', 'YYYY-MM-DD') END ORDER BY half_year_start;
결론
위의 방법들을 활용하면 Oracle 데이터베이스를 효율적으로 사용할 수 있습니다. 각각의 쿼리는 특정한 문제를 해결하거나 데이터를 동적으로 관리하는 데 유용합니다. 여러분의 업무나 프로젝트에서 적극적으로 활용해보세요!
#스하리1000명프로젝트,
Perso in Corea? Anche se non parli coreano, questa app ti aiuta a muoverti facilmente.
Parla semplicemente la tua lingua: traduce, cerca e mostra i risultati nella tua lingua.
Ottimo per i viaggiatori! Supporta oltre 10 lingue tra cui inglese, giapponese, cinese, vietnamita e altre.
Provalo adesso!
https://play.google.com/store/apps/details?id=com.billcoreatech.opdgang1127
엑셀을 사용할 때 반복되는 작업을 자동화하면 업무 효율성이 높아집니다. 오늘은 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