Automatyzacja kalendarza Google z wykorzystaniem Gemini AI

Automatyzacja Urodzin: Google Sheets + Gemini AI + Kalendarz

Dowiedz się, jak stworzyć przypomnienia o urodzinach swoich bliskich w Twoim kalendarzu Google

1. Architektura Rozwiązania

System opiera się na trzech filarach:

  • Google Sheets: Baza danych z imionami, datami urodzin i opcjonalnie zainteresowaniami.
  • Gemini AI: Generuje kod przetwarzający dane źródłowe i tworzący
  • Google Apps Script: „Mózg” operacji, który łączy arkusz z AI i wysyła gotowe wydarzenia do Kalendarza Google.

2. Przygotowanie Bazy Danych (Google Sheets)

Stwórz arkusz z następującymi kolumnami: | Imię i Nazwisko | Data Urodzenia | Zainteresowania (dla Gemini) | Status | | :— | :— | :— | :— | | Jan Kowalski | 1990-05-15 | Żeglarstwo, góry | Pending | | Anna Nowak | 1985-11-22 | Fotografia, koty | Pending |



Przykładowy plik Birthdays w Google Sheets

Następnie w zakładce Extensions -> Apps Script

3. Automatyczne Dodawanie do Kalendarza

Kod wygenerowany za pomocą Google Gemini

JavaScript

function createBirthdayRemindersWithStatus() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var data = sheet.getDataRange().getValues();
  var calendar = CalendarApp.getDefaultCalendar();
  
  // Define which column is the Status column (0-indexed, so D is 3)
  var STATUS_COL = 3; 

  for (var i = 1; i < data.length; i++) {
    var name = data[i][0];
    var birthday = new Date(data[i][1]);
    var status = data[i][STATUS_COL];

    // Only run if the status is not "Synced" and there is a name/date
    if (status !== "Synced" && name && !isNaN(birthday.getTime())) {
      
      var currentYear = new Date().getFullYear();
      var reminderDate = new Date(currentYear, birthday.getMonth(), birthday.getDate());

      try {
        // Create the event
        calendar.createAllDayEvent("Birthday: " + name, reminderDate, {
          description: "Added automatically from Google Sheets"
        });

        // Update the spreadsheet to mark it as Synced
        // i + 1 because sheets are 1-indexed; STATUS_COL + 1 for the same reason
        sheet.getRange(i + 1, STATUS_COL + 1).setValue("Synced");
        
        Logger.log("Added birthday for: " + name);
      } catch (e) {
        Logger.log("Error adding " + name + ": " + e.toString());
      }
    }
  }
}

Kod wygenerowany za pomocą sztucznej inteligencji osadzono w Apps Script.


Pozostaje nadać uprawnienia i nacisnąć Run. W efekcie w Twoim kalendarzu google pojawią się przypomnienia o urodzinach osób które zostały zebrane w pliku źródłowym. Wydarzenia które są utworzone w Twoim kalendarzu będą też oznaczone w pliku źródłowym w kolumnie D jako synced.

Pomiar linii kodu źródłowego

Ściągnij & Rozpakuj & Uruchom przykład użycia oprogramowania cloc do pomiaru linii kodu źródłowego (metryka SLOC) dla prostego programu stworzonego w języku C.

Rozpatrywany kod źródłowy składa się z jednego pliku źródłowego .c i jednego pliku nagłówkowego .h

Liczba linii kodu źródłowego dla przykładu powyżej.

Skrypty uruchamiające program cloc (run.bat i countCodeLines.bat)

run.bat

countCodeLines.bat

Gotowe do uruchomienia archiwum pomiar liczby linii kodu.

Wartość skuteczna RMS

Wzór ogólny na wartość skuteczną (RMS – root mean square)
F_{RMS} = \sqrt{\frac{1}{T}\int_{0}^{T}{f^{2}(t)\cdot dt}}

Interpretacja tej wielkości na podstawie wartości skutecznej prądu.

u(t) = R \cdot i(t)

W = \int{p \cdot dt}
W = \int{u \cdot i \cdot dt}
W = R\cdot \int{ i^{2} \cdot dt}

gdzie:
W – praca
p – moc chwilowa
p = u \cdot i
u – napięcie chwilowe
i – prąd chwilowy

Jeżeli przebieg jest okresowy to

W_{T} = R\cdot \int_{0}^{T}{ i^{2} \cdot dt}

Wartość skuteczna jest to prąd stały który wydzieli tyle samo ciepła.

R\cdot \int_{0}^{T}{ i^{2} \cdot dt} = R \cdot I^{2} \cdot T
Dzieląc powyższe równanie obustronnie przez R
\int_{0}^{T}{ i^{2} \cdot dt} = I^{2} \cdot T
Następnie zamieniając strony tak aby wyznaczyć prąd stały I
I^{2} \cdot T = \int_{0}^{T}{ i^{2} \cdot dt}
Finalnie uzyskuje się

Wartość skuteczna prądu

I_{RMS} = \sqrt{\frac{1}{T}\cdot \int_{0}^{T}{ i^{2} \cdot dt}}

Wartość skuteczna napięcia

U_{RMS} = \sqrt{\frac{1}{T}\cdot \int_{0}^{T}{ u^{2} \cdot dt}}

GNU Octave – zamiennik programu Mathworks Matlab

Słowem wstępu należy zaznaczyć że istnieje bezpłatna alternatywa dla programu Matlab i jest to GNU Octave. GNU Octave niestety nie posiada w swojej paczce narzędzi zamiennika dla Simulink-a.

GNU Octave

W trakcie studiów na uczelniach wyższych, podczas laboratoriów lub pracowni komputerowych korzysta z się programów Mathworks Matlab lub Mathworks Simulink.

Mathworks Matlab

Niektóre uczelnie w Polsce posiadają/zapewniają dostęp słuchaczom do licencji dla studentów. Ale co zrobić kiedy nie ma takiej możliwości, wtedy pojawia się GNU Octave.

Pomiędzy GNU Octave a Mathworks Matlab występują pewne różnice w składni plików skryptowych tj. m-plików. Często pliki te są kompatybilne w obydwu środowiskach, czasami jednak wymagane będę pewne modyfikacje w kodzie skryptu.

Macierz rotacji

Macierz rotacji opisuje transformację pomiędzy dwoma układami współrzędnych. W przedstawionym przykładzie są dwa układy kartezjańskie {A} i {B}. Wyznaczona zostanie macierz rotacji opisują transformację z układu {B} do układu {A}. Znajomość takiej macierzy pozwala na przetransformowanie współrzędnych dowolnego wektora z układu {B} do układu {A}.

_{B}^{A}\bm{R}\left[ \begin{array}{ccc} \hat X_{B} \cdot \hat X_{A} & \hat X_{B} \cdot \hat Y_{A} & \hat X_{B} \cdot \hat Z_{A}\\ \hat Y_{B} \cdot \hat X_{A} & \hat Y_{B} \cdot \hat Y_{A} & \hat Y_{B} \cdot \hat Y_{A}\\ \hat Z_{B} \cdot \hat X_{A} & \hat Z_{B} \cdot \hat Y_{A} & \hat Z_{B} \cdot \hat Z_{A} \end{array} \right]

Wyrazy \hat X_{B}, \hat X_{A}, \hat Y_{B}, \hat Y_{A} , \hat Z_{B}, \hat Z_{A} są wersorami tj. wektorami jednostkowymi.

Kolejne wyrazy macierzy _{B}^{A}\bm{R} wyznaczane są w następujący sposób:

\hat X_{B} \cdot \hat X_{A} = |\hat X_{B}| \cdot |\hat X_{A}| \cos{\sphericalangle{(\hat X_{B},\hat X_{A})}}

Prąd i napięcie ładowania kondensatora w obwodzie prądu stałego

Wyznaczenie analitycznie równań na prąd i napięcie ładowania kondensatora w obwodzie prądu stałego.

Stan nieustalony podczas ładowania kondensatora - obwód elektryczny
Obwód RC prądu stałego

Równanie napięciowe dla rozpatrywanego obwodu
E - u_{R}(t)- u_{C}(t) = 0

Uwzględniając
u_{R}(t) = R \cdot i(t)
i_{C}(t) = C \cdot \frac{du_{C}(t)}{dt}

Rozpatrywany obwód jest szeregowym obwodem elektrycznym tj. przez każdy element w obwodzie przepływa ten sam prąd.
i(t) = i_{C}(t)

Otrzymuje się następujące równanie różniczkowe
E - R \cdot C \cdot \frac{du_{C}(t)}{dt} - u_{C}(t)

Rozwiązanie równania różniczkowego jest następującej postaci
Otrzymuje się następujące równanie różniczkowe
u_{C}(t) = E - (E - U_{C0})\cdot e^{-\frac{t}{T}}
gdzie stała czasowa T
T = R\cdot C
u_{C}(t) = E - (E - U_{C0})\cdot e^{-\frac{t}{R \cdot C}}

Przyjmując napięcie na kondensatorze dla czasu t = 0
U_{C0} = 0
u_{C}(t) = E \cdot (1 - e^{-\frac{t}{R \cdot C}})

Równanie na prąd ładowania kondensatora otrzymuje się poprzez zróżniczkowanie po czasie równania na napięcie ładowania kondensatora

i_{C}(t) = \frac{E - U_{C0}}{R}\cdot e^{-\frac{t}{R \cdot C}}

Przykładowa charakterystyka napięcia na kondensatorze w funkcji czasu

Stan nieustalony - napięcie kondensatora podczas ładowania
Napięcie ładowania kondensatora

Przykładowa charakterystyka prądu ładowania kondensatora

Stan nieustalony - prąd kondensatora podczas ładowania
Prąd ładowania kondensatora

Wzmacniacz operacyjny w konfiguracji różnicowej

Dla wzmacniacz operacyjnego w konfiguracji odwracającej wyznaczona zostanie funkcja opisujące napięcie wyjściowe wzmacniacza V_{out} względem napięć na wejściach odwracającym V_{1} i nieodwracającym V_{2} . Rozpatrywany układ elektroniczny zostanie rozwiązany analitycznie z zastosowaniem metody superpozycji oraz praw Kirchhoffa dla obwodów elektrycznych.

Wzmacniacz operacyjny w konfiguracji różnicowej

Analizowany układ przedstawiony powyżej zostaje „rozbity” na dwa podukłady:
1) zwarte do masy zostaje napięcie podane na wejście nieodwracające
2) zwarte do masy zostaje napięci podane na wejście odwracające

Poprzez zwarcie do masy sygnału na wejściu nieodwracającym otrzymuje się następujący podukład:

Wzmacniacz operacyjny konfiguracja odwracająca – podukład 1 – zwarty do masy sygnał na wejściu nieodwracającym

Po przeprowadzeniu obliczeń napięcie wyjściowego tego podukładu opisane jest równaniem.

V_{out1} = -\frac{R_{F}}{R_{1}}\cdot V_{1}

Następnym krokiem jest zwarcie do masy sygnału na wejściu odwracającym i usunięciu zwarcia do masy dla sygnału na wejściu nieodwracającym. Otrzymany podukład jest następujący.

Wzmacniacz operacyjny konfiguracja odwracająca – podukład 2 – zwarty do masy sygnał na wejściu odwracającym

Po przeprowadzeniu obliczeń napięcie wyjściowego tego podukładu opisane jest równaniem.

V_{out2} = \frac{R_{F}}{R_{1}}\cdot V_{2}

Równania na napięcia wyjściowego z każdego podukładów są już wyznaczone, wobec tego można wyznaczyć napięcie wyjściowego wzmacniacza operacyjnego w konfiguracji odwracającej na podstawie metody superpozycji.

V_{out} = V_{out1} + V_{out2}

Finalnie

V_{out} =\frac{R_{F}}{R_{1}}\cdot (V_{2} - V_{1})

Obliczenia wykonane krok po kroku dostępne są na stronie – wzmacniacz operacyjny w konfiguracji różnicowej.

Wyznaczanie momentu gnącego i siły tnącej w belce

Belka podparta na dwóch podporach poddana jest obciążeniom statycznym. Na początku, w punkcie A, belka podparta jest na podporze nieruchomej. Na końcu, w punkcie B, belka podparta jest na podporze ruchomej. W przykładzie do belki zostaje przypisany dwuwymiarowy układ współrzędnych.

Belka poddana obciążeniom statycznym

Równania równowagi statycznej dla rozpatrywanego przypadku obciążonej belki.

\sum{F_{ix}} = 0 \rightarrow R_{AX} = 0 \sum{F_{iy}} = 0 \rightarrow R_{AY} - P - 2 \cdot P + R_{BY} = 0 \sum{M_{iA}} = 0 \rightarrow l \cdot P + 2 \cdot l \cdot 2 \cdot P - 3\cdot l \cdot R_{BY} = 0

Dodatkowe obliczenia wyznaczające wartości sił -> belka zdanie 1

Obwód elektroniczny z diodą

W przykładzie rozpatrzony zostanie obwód elektroniczny z diodą krzemową. Rozpatrywany obwód zbudowany jest z dwóch oczek. W celu wyznaczenia prądów w obwodzie wyznaczone zostaną równania dla pierwszego i drugiego prawa Kirchhoffa.

Równanie prądowe Kirchhoffa
i - i_1 - i_2 = 0

Równanie napięciowe Kirchhoffa dla pierwszego oczka
V_1 - i \cdot R_1 - i_2 \cdot R_2 = 0

Równanie napięciowe Kirchhoffa dla drugiegooczka
i_2 \cdot R_2 - U_d - i_1 \cdot R_3 = 0

Pełne rozwiązanie analizowanego przykładu zadanie z diodą.