Po długim czasie trzymania tego zadania na liście „do zrealizowania” w końcu się za nie zabrałem. Nauka do egzaminu okazała się nie tylko wyzwaniem, ale też świetną okazją do weryfikacji własnej wiedzy. Zaskakująco dużo radości dało mi odkrywanie braków, o których wcześniej nie miałem pojęcia — i jeszcze więcej satysfakcji przyniosło ich uzupełnienie.
Dzięki temu wszystkiemu mogę dziś powiedzieć, że zdobyłem uprawnienia krótkofalarskie. Zadanie odhaczone, marzenie spełnione, a droga do niego była równie wartościowa jak sam wynik.
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.
Ś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)
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ę
Słowem wstępu należy zaznaczyć że istnieje bezpłatna alternatywa dla programu Matlab i jest toGNU 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 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}.
Wyznaczenie analitycznie równań na prąd i napięcie ładowania kondensatora w obwodzie prądu stałego.
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
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.
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