이번에는 ChatGPT에게 반대로 물어보았다.
" 구글시트 A열에는 일정 내용, B열에는 하루 일정이 있다. 일정 내용과 날짜를 구글 캘린더에 업로드하는 방법은? 구글시트의 날짜 형식은 2023.10.05(목)이야."

 
아래 구글시트에 입력되어 있는 학교 일정을 제 개인 구글캘린더에 한꺼번에  업로드하려 합니다. 이번에도 일일이 입력하는 것이 아니라 챗GPT로 하여금 앱스 스크립트 코드를 짜도록 하여 구글시트의 확장프로그램(Apps Script)을 이용해 실행 행, 자동 업로드해보겠습니다.

 

아래 캘린더에서 보라색 일정들이 업로드 결과입니다.

 

아래는 챗GPT가 제공한 코드를 수정없이 앱스 스크립트에 복사해 넣은 모습입니다. (코드 주석에 있듯이 제 캘린더 ID만 넣었습니다.)

 
정상 출력된 코드는 다음과 같습니다. (2번째 줄의 'YOUR_CALENDAR_ID_HERE' 대신 자신의 캘린더 ID를 입력하면 됩니다. 구글 캘린더-설정-갤린더 ID)

function uploadToGoogleCalendar() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var data = sheet.getDataRange().getValues();
  var calendarId = 'YOUR_CALENDAR_ID_HERE'; // Google 캘린더의 ID를 입력하세요

  for (var i = 1; i < data.length; i++) {
    var eventTitle = data[i][0]; // A열: 일정 내용
    var dateString = data[i][1]; // B열: 날짜 및 시간

    if (eventTitle && dateString) {
      var dateParts = dateString.match(/(\d{4})\.(\d{2})\.(\d{2})\((\D+)\)(?: (\d{2}):(\d{2}))?/); // 정규식을 사용하여 날짜 및 시간을 파싱
      if (dateParts) {
        var year = parseInt(dateParts[1]);
        var month = parseInt(dateParts[2]) - 1; // JavaScript에서 월은 0부터 시작하므로 1을 빼줍니다.
        var day = parseInt(dateParts[3]);
        var dayOfWeek = dateParts[4];
        var hours = dateParts[5] ? parseInt(dateParts[5]) : 0;
        var minutes = dateParts[6] ? parseInt(dateParts[6]) : 0;

        var eventStartDate = new Date(year, month, day, hours, minutes, 0); // 시작 날짜 및 시간을 생성합니다.
        var eventEndDate = new Date(year, month, day, hours, minutes, 0); // 종료 날짜 및 시간을 생성합니다.

        if (!dateParts[5]) {
          // 시간 정보가 없는 경우, 종일 이벤트로 처리하도록 종료 날짜를 하루 늘립니다.
          eventEndDate.setDate(eventEndDate.getDate() + 1);
        }

        var calendar = CalendarApp.getCalendarById(calendarId);

        if (calendar) {
          calendar.createEvent(eventTitle, eventStartDate, eventEndDate, { description: "날짜: " + dateString });
        }
      }
    }
  }
}

 


위 내용은 구글시트의 일정과 날짜(예> 2023.10.10(화))를 구글 캘린더에 업로드하는 방법이었는데, 이번에는 날짜뿐 아니라 시간을 포함하는 데이터(2023.10.10(화) 17:00)를 업로드하는 방법을 챗GPT에게 물었다. 그냥 물으니 '종일' 일정도 개별 시간(오전 12:00~)으로 잡길래 '종일' 옵션 선택을 강조해 물었다. 즉, 특정 시간이 있으면 시간 일정을 잡고 종일 일정이면 종일 옵션을 사용하게 했다.

 

아래는 챗GPT가 제공한 코드이고 전혀 수정없이 정상 출력되었습니다.(4번째 줄의 'YOUR_CALENDAR_ID_HERE' 대신 자신의 캘린더 ID를 입력하면 됩니다. 구글 캘린더-설정-갤린더 ID)

function uploadToGoogleCalendar() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var data = sheet.getDataRange().getValues();
  var calendarId = 'YOUR_CALENDAR_ID_HERE'; // Google 캘린더의 ID를 입력하세요

  for (var i = 1; i < data.length; i++) {
    var eventTitle = data[i][0]; // A열: 일정 내용
    var dateString = data[i][1]; // B열: 날짜 및 시간

    if (eventTitle && dateString) {
      var dateParts = dateString.match(/(\d{4})\.(\d{2})\.(\d{2})\((\D+)\)(?: (\d{2}):(\d{2}))?/); // 정규식을 사용하여 날짜 및 시간을 파싱
      if (dateParts) {
        var year = parseInt(dateParts[1]);
        var month = parseInt(dateParts[2]) - 1; // JavaScript에서 월은 0부터 시작하므로 1을 빼줍니다.
        var day = parseInt(dateParts[3]);
        var dayOfWeek = dateParts[4];
        var hours = dateParts[5] ? parseInt(dateParts[5]) : 0;
        var minutes = dateParts[6] ? parseInt(dateParts[6]) : 0;

        var eventStartDate = new Date(year, month, day, hours, minutes, 0); // 시작 날짜 및 시간을 생성합니다.
        var eventEndDate = new Date(year, month, day, hours, minutes, 0); // 종료 날짜 및 시간을 생성합니다.

        if (!dateParts[5]) {
          // 시간 정보가 없는 경우, 종일 이벤트로 처리하도록 종료 날짜를 하루 늘립니다.
          eventEndDate.setDate(eventEndDate.getDate() + 1);
        }

        var calendar = CalendarApp.getCalendarById(calendarId);

        if (calendar) {
          calendar.createEvent(eventTitle, eventStartDate, eventEndDate, { description: "날짜: " + dateString });
        }
      }
    }
  }
}
반응형

브레드보드, 트랜지스터(9013, NPN), 광센서(CdS), 5V LED bar, 저항(270옴, 100k옴), 9V 건전지로 회로를 구성했습니다.

주변이 어두워지면 광센서의 저항이 커지므로 100k옴을 통과한 전류가 베이스(B)를 자극하고 베이스가 스위치 역할을 하여 LED가 연결된 도선에 큰 전류가 흘러 LED가 밝아집니다.

먼저, 작은 백색 LED 한 개 켜기
(브레드보드에 아래와 같이 연결하면 됨)

5V LED bar 켜기
(위 회로에서 270옴 저항만 제거하고 나머지는 동일)

아래는 거실 등을 껐을 때 LED bar의 반응입니다.
(주변이 어두워지면 자동으로 켜짐)

 

반응형

'창의공작소' 카테고리의 다른 글

(대충, 허접)차박용 led 조명등 만들기  (0) 2022.10.01
재활용품 활용한 LED 무드등  (0) 2022.09.17
레고 시티 기차 레일_3D 프린트  (0) 2020.07.18
툴박스_3D 프린트  (0) 2020.07.14
빗걸이_3D 프린트  (0) 2020.07.14

- 스무 살을 입은 나의 아이들에게 -

 
진짜 아름다운 것들은 누구에게도 관심을 바라지 않아.
그래서 포착하기도 쉽지 않지.
 
막상 표범이 나타나자, 숀은 카메라 렌즈 너머 표범을 가만히 들여다보기만 하는 거야.
그러곤 이렇게 말해.
“간혹 너무 아름다운 것들은 찍지 않아. 그냥 그 순간에 함께 머무는 게 더 완벽할 때가 있지.”
 
그랬다.
너희와 머물러서 행복했고 나에겐 완벽한 순간들이었다.
 
여기 실린 사진들이 다 무슨 소용이람.
진짜 너를 포착하기는 앞으로도 힘들 듯.
 

반응형

'무한주제의 글쓰기' 카테고리의 다른 글

수능과 졸업을 앞둔 아이들에게  (0) 2023.11.29
어떤 아이  (0) 2022.12.09
공기의 눈물, 구름  (2) 2022.11.12
아이들과 밤하늘을 보다  (0) 2022.09.27
나의 10대  (0) 2022.09.09

- 계면활성제 -

(부제: 수능과 졸업을 앞둔 우리 아이들에게)

 
하늘과 땅
상상과 현실
물과 빛의 경계에 선
무지개가 찬란하듯
 
너희도 경계에 섰다.
어른과 아이
틀과 자유
준비와 성취의 경계
 
양껏 이과스런 별명을 붙이고 싶다.
 
세계에 편 먹지 말고
너가 스며드는 모든 물과 기름 사이에서
세상을 뒤집고
담을 뛰어 넘길.
 
벌써 뒤집었더라?
복도 3-9
 

 

반응형

'무한주제의 글쓰기' 카테고리의 다른 글

마지막 종례  (0) 2024.02.06
어떤 아이  (0) 2022.12.09
공기의 눈물, 구름  (2) 2022.11.12
아이들과 밤하늘을 보다  (0) 2022.09.27
나의 10대  (0) 2022.09.09

파이썬 프로그램을 설치하지 않고 크롬 계열 브라우저에서 바로 파이썬을 실행할 수 있는 구글 코랩(Google Colab)을 이용해 실행할 예정입니다.

https://colab.research.google.com/ 

 

Google Colaboratory

 

colab.research.google.com

 

실행 화면입니다.

 

아래 코드를 실행하면 60개의 관련 뉴스를 링크와 함께 보여줍니다. (검색어 : 천문올림피아드)

import requests
from bs4 import BeautifulSoup

for i in range(1, 60, 10):

    url = "https://search.naver.com/search.naver?where=news&sm=tab_jum&query=천문올림피아드&start=" + str(i)

    response = requests.get(url)
    html = response.text

    soup = BeautifulSoup(html, 'html.parser')

    for a_tag in soup.select('a.news_tit'):
        news_title = a_tag.text
        news_link = a_tag['href']
        print(news_title)
        print(news_link)
        print()

 


이제 코드를 해석해 보자. (검색어 : 천문올림피아드)

import requests                   # requests 라이브러리를 가져와.(웹페이지 내용을 가져오는 데 사용할거야)
from bs4 import BeautifulSoup     # bs4 모듈에서 BeautifulSoup 클래스를 가져와.(웹 페이지의 데이터를 추출하는 데 사용 할거야)

for i in range(1, 60, 10):        # 60개 뉴스를 불러들일거야.(페이지마다 10개 뉴스가 있으므로 start=1, 11, 21, 31, 41, 51을 불러들일거야)

    url = "https://search.naver.com/search.naver?where=news&sm=tab_jum&query=천문올림피아드&start=" + str(i)   # 검색어는 '천문올림피아드'로 해볼게.

    response = requests.get(url)     # requests 라이브러리를 사용하여 주어진 URL로 HTTP GET 요청을 보내서 웹 페이지 내용을 가져와. 
    html = response.text             # 웹 페이지의 내용을 가져와서 html 변수에 저장해.

    soup = BeautifulSoup(html, 'html.parser')     # BeautifulSoup을 사용하여 html의 HTML을 파싱해.

    for a_tag in soup.select('a.news_tit'):       # HTML의 <a>태그 중에서 클래스가 news_tit인 것을 선택해.(뉴스 제목을 포함하는 링크를 선택하는거야)
        news_title = a_tag.text                # 선택한 <a>태그의 텍스트 내용(뉴스 제목)을 news_title 변수에 저장해.
        news_link = a_tag['href']              # 선택한 <a>태그의 href 속성(뉴스 링크 URL)을 news_link 변수에 저장해.
        print(news_title)              # 뉴스 제목을 출력해.
        print(news_link)               # 뉴스 링크 URL을 출력해.
        print()                        # 각 뉴스 제목과 링크 사이에 빈 줄을 출력해.(가독성을 위한거야)

 

반응형

ChatGPT에게 요청했다!

"구글캘린더에서 2023년 9월 일정을 구글시트로 가져오되, 날짜를 년.월.일(요일) 형식으로 표시하는 앱스 스크립트를 짜줘"

 

아래 일정 중 회색으로 입력된 학교 일정만 구글시트에 정리하여 월말 출결 정리에 활용할 계획입니다. 일일이 보고 입력하는 것이 아니라 챗GPT로 하여금 앱스 스크립트 코드를 짜도록 하여 구글시트의 확장프로그램(Apps Script)을 이용해 실행, 자동 정리해보겠습니다.

 

아래는 구글시트에 자동으로 불러들인 결과입니다. 이 결과를 출력해 나이스 출결 정리에 활용합니다.

 

아래는 챗GPT를 귀찮게 하여 겨우 얻어낸 완결된 코드를 앱스 스크립트에 복사해 넣은 모습입니다. (실제로는 한번이 아니라 원하는 결과를 얻기까지 챗GPT에게 자꾸 물어가며 계속 수정한 결과입니다.)

 

정상 출력된 코드는 다음과 같습니다. (2번째 줄의 'YOUR_CALENDAR_ID_HERE' 대신 자신의 캘린더 ID를 입력하면 됩니다. 구글 캘린더-설정-갤린더 ID)

function importCalendarEvents() {
  var calendarId = 'YOUR_CALENDAR_ID_HERE'; // Google 캘린더의 ID를 입력하세요.
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var events = CalendarApp.getCalendarById(calendarId).getEvents(new Date('2023-10-01T00:00:00+09:00'), new Date('2023-10-31T23:59:59+09:00')); // 2023년 해당월의 시작과 끝 날짜를 설정합니다.

  // 스프레드시트에 헤더를 추가합니다.
  sheet.clear();
  sheet.appendRow(["일정 제목", "일정 시작일", "일정 종료일"]);

  // 캘린더에서 가져온 일정을 스프레드시트에 기록합니다.
  for (var i = 0; i < events.length; i++) {
    var event = events[i];
    
    // 한글 요일 포맷을 사용하여 날짜 표시
    var startTime = Utilities.formatDate(event.getStartTime(), "Asia/Seoul", "yyyy.MM.dd (E)");
    var endTime = Utilities.formatDate(event.getEndTime(), "Asia/Seoul", "yyyy.MM.dd (E)");
    
    // 요일을 한글로 변경
    startTime = startTime.replace(/\(Mon\)/g, "(월)");
    startTime = startTime.replace(/\(Tue\)/g, "(화)");
    startTime = startTime.replace(/\(Wed\)/g, "(수)");
    startTime = startTime.replace(/\(Thu\)/g, "(목)");
    startTime = startTime.replace(/\(Fri\)/g, "(금)");
    startTime = startTime.replace(/\(Sat\)/g, "(토)");
    startTime = startTime.replace(/\(Sun\)/g, "(일)");
    
    endTime = endTime.replace(/\(Mon\)/g, "(월)");
    endTime = endTime.replace(/\(Tue\)/g, "(화)");
    endTime = endTime.replace(/\(Wed\)/g, "(수)");
    endTime = endTime.replace(/\(Thu\)/g, "(목)");
    endTime = endTime.replace(/\(Fri\)/g, "(금)");
    endTime = endTime.replace(/\(Sat\)/g, "(토)");
    endTime = endTime.replace(/\(Sun\)/g, "(일)");
    
    // 일정이 하루인 경우, "일정 종료일" 셀을 비웁니다.
    if (event.isAllDayEvent()) {
      endTime = "";
    }
    
    sheet.appendRow([event.getTitle(), startTime, endTime]);
  }
}

 

 

 

 

 

 

반응형

아래와 같이 기상청 날씨누리에 들어가면 연도별, 지역별 황사관측일수 데이터를 볼 수 있다.

파이썬을 이용해 표에 있는 데이터를 엑셀로 가져와 보자.

 

아래 코드를 실행하면 날 것 그대로의 데이터를 엑셀 파일을 얻을 수 있다.

import requests
from bs4 import BeautifulSoup
from openpyxl import Workbook

wb = Workbook(write_only=True)
ws = wb.create_sheet('duststorm_count')
ws.append(['구분', '1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월'])

response = requests.get("https://www.weather.go.kr/w/dust/dust-obs-days.do", verify = False)
duststorm_page = response.text

soup = BeautifulSoup(duststorm_page, 'html.parser')

for tr_tag in soup.select('tr')[1:]:
    th_tag = tr_tag.select('th')
    td_tags = tr_tag.select('td')
    row = [
        th_tag[0].get_text(),   # 구분
        td_tags[0].get_text(),   # 1월
        td_tags[1].get_text(),   # 2월
        td_tags[2].get_text(),   # 3월
        td_tags[3].get_text(),   # 4월
        td_tags[4].get_text(),   # 5월
        td_tags[5].get_text(),   # 6월
        td_tags[6].get_text(),   # 7월
        td_tags[7].get_text(),   # 8월
        td_tags[8].get_text(),   # 9월
        td_tags[9].get_text(),   # 10월
        td_tags[10].get_text(),   # 11월
        td_tags[11].get_text(),   # 12월
    ]
    ws.append(row)

wb.save('연도별 황사관측일수.xlsx')

 

위 코드를 실행했을 때 아래와 같은 엑셀 데이터를 얻을 수 있다.

 

연도별 황사관측일수.xlsx
0.01MB

 


이제 코드를 해석해 보자.

import requests                       # requests 라이브러리를 가져와.(웹페이지 내용을 가져오는 데 사용할거야)
from bs4 import BeautifulSoup         # bs4 모듈에서 BeautifulSoup 클래스를 가져와.(웹 페이지의 데이터를 추출하는 데 사용 할거야)
from openpyxl import Workbook         # openpyxl 라이브러리에서 Workbook 클래스를 가져와.(액셀 파일을 생성하려고 해)

wb = Workbook(write_only=True)        # Workbook 클래스를 사용해 새로운 엑셀 워크북을 생성하고 쓰기 전용 모드로 설정해.
ws = wb.create_sheet('duststorm_count')     # 위에서 생성한 액셀 워크북(wb)에 'duststorm_count'라는 이름의 새로운 워크시트를 생성해.
ws.append(['구분', '1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월'])    # 워크시트(ws)에 첫 번째 행으로 '구분'과 각 월(1월부터 12월)을 나타내는 열 제목을 추가해.

response = requests.get("https://www.weather.go.kr/w/dust/dust-obs-days.do", verify=False)     # requests 라이브러리를 사용하여 주어진 URL로 HTTP GET 요청을 보내서 웹 페이지 내용을 가져와. SSL 인증서 검증은 비활성화 하고.
duststorm_page = response.text        # 웹 페이지의 내용을 가져와서 duststorm_page 변수에 저장해.

soup = BeautifulSoup(duststorm_page, 'html.parser')     # BeautifulSoup을 사용하여 duststorm_page의 HTML을 파싱해. 

for tr_tag in soup.select('tr')[1:]:      # BeautifulSoup을 사용하여 웹 페이지의 모든 <tr>(테이블 행) 태그를 선택해.(첫 번째 행은 테이블의 헤더 행이니까 제외하고 나머지 행들만 선택하면 돼)
    th_tag = tr_tag.select('th')          # 각 행에서 <th>(테이블 헤더 셀) 태그를 선택해.('구분'열을 나타내는 셀을 선택하면 돼)
    td_tags = tr_tag.select('td')         # 각 행에서 <td>(테이블 데이터 셀) 태그를 선택해.(각 월(1월부터 12월)에 해당하는 데이터 셀을 선택하면 돼)
    row = [                               # 각 월의 데이터를 row라는 리스트에 저장해.(각 셀의 텍스트 내용을 get_text() 메서드로 가져와서 row 리스트에 추가하면 돼)
    	th_tag[0].get_text(),      # 구분      # th_tag는 '구분' 셀이야.
    	td_tags[0].get_text(),     # 1월       # td_tags는 1월부터 12월까지의 데이터 셀이야.
        td_tags[1].get_text(),     # 2월      
        td_tags[2].get_text(),     # 3월
        td_tags[3].get_text(),     # 4월
        td_tags[4].get_text(),     # 5월
        td_tags[5].get_text(),     # 6월
        td_tags[6].get_text(),     # 7월
        td_tags[7].get_text(),     # 8월
        td_tags[8].get_text(),     # 9월
        td_tags[9].get_text(),     # 10월
        td_tags[10].get_text(),    # 11월
        td_tags[11].get_text(),    # 12월
	]
    wb.save('연도별 황사관측일수.xlsx')        # 위에서 구성한 row 리스트를 워크시트(ws)에 추가해.(각 연도별로 월별 데이터가 엑셀 파일에 추가되는거야)

wb.save('연도별 황사관측일수.xlsx')            # 작성한 워크북(wb)을 '연도별 황사관측일수.xlsx'라는 이름의 엑셀 파일로 저장해.

 

 

 

 

반응형

구김살없이 크는 아이도 있지만
어떤 아이는 많이 구겨지며 큰다.
나는 후자에 속한다.

지금도 구겨져 있는 나를 원래대로 돌려놓는다면
훤칠한 키에 딱 벌어진 어깨로
다들 깜놀할 걸?

많이 놀랠까봐 참고
계속 구겨 숨겨 놓으마. 흥*-

 

 

* 흥(興)이 많이 나는 한해였다. 담임을 하며 이리 사랑스러운 뇨석들을 또 만날 수 있을까?

반응형

'무한주제의 글쓰기' 카테고리의 다른 글

마지막 종례  (0) 2024.02.06
수능과 졸업을 앞둔 아이들에게  (0) 2023.11.29
공기의 눈물, 구름  (2) 2022.11.12
아이들과 밤하늘을 보다  (0) 2022.09.27
나의 10대  (0) 2022.09.09

 

나는 떠오르기 시작했다.

흐르다보니 산을 만났고
힘겹게 오르고 있다.

다양한 이유로 떠오르기 시작한
내 친구들처럼 살짝 겁이났다.
잘 해낼 수 있을까?

우리들의 오랜 꿈이었다.
드높은 하늘 위로 오르는 건.

나를 압박하던 소음들이 줄어들고
가득 머금은 기대만큼 나는 부풀기 시작한다.

추워지고 있다.
몸집을 키우려 젖 먹던 힘까지 짜 내다보니
자꾸 더 추워진다.

춥고 배고픔에 눈물이 흐른다.
강과 나무, 도로와 집들이 점점 작아지는데
그들이 날 쳐다보기 시작했다.
내가 보이나?

같이 있을 때는
존재하지도 않는 것처럼
내게 신경도 안쓰던 이들이 나를 올려다 보며
환희에 차 미소짓고 있다.

아! 
눈물.. 이것이었구나.
나는 변하고 있었다.
새털처럼
비늘처럼
면사포처럼
때론 담요나 탑 모양으로 나는 시시각각 변하고 있다.

눈물이 나를 안는다.
힘겹게 오르며 뿌린 눈물은
진짜 내 모습을 알려주려 
하늘에 나를 그렸다 지우기를 반복한다.

나는
생겼다 사라지고
더 높은 곳에서 얼어 반짝이기도 하며
푸른 하늘의 꽃이 되었다.

 

반응형

'무한주제의 글쓰기' 카테고리의 다른 글

수능과 졸업을 앞둔 아이들에게  (0) 2023.11.29
어떤 아이  (0) 2022.12.09
아이들과 밤하늘을 보다  (0) 2022.09.27
나의 10대  (0) 2022.09.09
미안함과 격려 그리고 응원을 담아  (0) 2021.11.10

계산기 없이 다음과 같은 값을 구할 수 있을까? 😱

 

미분의 정의를 이용해 위 식의 근사값을 구할 수 있다.

 

자, 그럼 한번 해보자!

 

🧐

 

미분의 정의는 다음과 같다.

 

 

 

우리는 위의 미분 정의를 이용하되 근사값을 구할 예정이므로 대략 다음과 같이 식을 변형할 수 있다.

 

이 식이 근사값을 구하는 기본 공식이다.

 

🥴

 

☝️ 먼저,

 

 

을 구해보자.

 

 

로 두면,

 

 

이므로

 

 

에서

 

 

 

 

 

즉,

 

은 대략 1.75이다. (보다 정확한 근사값은 1.73이다.)

 

 

 

✌️ 다음으로,

 

 

을 구해보자.

 

 

로 두면,

 

 

이므로

 

 

에서

 

 

 

 

 

 

 

 

 

즉,

 

은 대략 0.83이다. (보다 정확한 근사값은 0.85이다.)

 

 

 

그런데....

그냥 공학용 계산기를 쓰자..ㅜ

 

반응형

+ Recent posts