Minska blogas

Už laisvę gyventi laisvai

Žinutės | Blogas | Mintys | Elektronika | Technologijos | Politika | Oro stebėjimas | Filmai ir serialai | Knygos | Apie

Kalendorius: įvykių įvedimas

Pagaliau mano savadarbis kalendorius veikia. Gal dar ne viskas optimalu, bet kompiuteris man rodo, ką dabar turėčiau veikti, o įvykiui praėjus paklausia, ar įvykis įvyko. Taip tvarkomas mano kalendoriaus failas, kuriame surašyti visi įvykiai. Tačiau apie viską iš pradžių. Pirmiausia reikia sukurti kalendoriaus failą. Pasinaudojęs Remind ir Wyrd, apie kuriuos užsiminiau anksčiau rašytame įraše, supratau, kad ir pats elementariausias duomenų įvedimo būdas - tiesiog įvesti juos su teksto redaktoriumi, bent jau man, yra priimtinas. Tekstinis redaktorius yra paprasta programa, kurią galima rasti ir kompiuteryje, ir telefone. Norint įvesti įvykį tereikia kalendoriaus faile pridėti įvykį aprašančius duomenis tam tikru, mano sugalvotu formatu. Tai atrodytų kad ir taip: 2015-11-23/14:30-15:30/@Vingio parkas/#Įprastas/-Vis dar spoksoti į žmones

Tai visai nesudėtinga, kai reikia pridėti vieną įvykį. Tačiau mano gyvenime labai daug dalykų vis kartojasi. Kad ir paskaitos. Išprotėčiau, jei reikėtų suvedinėti kiekvienos atskiros paskaitos laikus, pavadinimus ir vietas rankutėmis. Tokį nuobodų darbą galima būtina automatizuoti ir tam aš parašiau Python skriptą.

                    #!/usr/bin/env python
                    #Script to help adding events to calendar file. Written by Mindaugas Stambrauskas
                    #(mindaugas@minska.lt).
                    
                    #Copyright 2015 Mindaugas Stambrauskas
                    #
                    #Licensed under the Apache License, Version 2.0 (the "License");
                    #you may not use this file except in compliance with the License.
                    #You may obtain a copy of the License at
                    #
                    # http://www.apache.org/licenses/LICENSE-2.0
                    #
                    #Unless required by applicable law or agreed to in writing, software
                    #distributed under the License is distributed on an "AS IS" BASIS,
                    #WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
                    #See the License for the specific language governing permissions and
                    #limitations under the License.
                    
                    #Changelog:
                    #v0.1 2015-03-02
                    # Initial code
                    #v0.2 2015-11-25
                    # Addded comments
                    # Added capability to add event that does not repeat
                    # Added argument help messages
                    # Added calendar path variable
                    # Made this code copyrighted under Apache 2.0 license.
                    
                    import argparse
                    import datetime
                    
                    #Change this path to where your calendar file is.
                    calendarFilePath = "/home/minska/kalendorius"
                    
                    parser = argparse.ArgumentParser(description = "Script to help adding events to calendar file.")
                    #These are the arguments that can be used when using this script.
                    #For example: thisScript.py -d 2015-11-22 -s 10:00 -e 13:00 -r 7 -u 2015-12-31 -l Home -c Work -m "Do the test"
                    #This command would create an event called "Do the test" with location at Home,
                    #category Work. This event would start at 10:00 and end at 13:00 of 2015-11-22.
                    #This event would also repeat until the end of year 2015 every week (7 days).
                    #What does an argument mean is revealed by dest variables. The name of variables
                    #are self-explanatory (Oh and "message" usually is the name of the event).
                    parser.add_argument('-d', action="store", dest="date", required=True, help="Starting date of the event.")
                    parser.add_argument('-s', action="store", dest="startTime", help="Starting time of the event (HH:MM). If not provided will be ALLDAY.")
                    parser.add_argument('-e', action="store", dest="endTime", help="Ending time of the event (HH:MM).")
                    parser.add_argument('-r', action="store", dest="repeat", default=0, type = int, help="Number of days the event repeats after. For example -r 7 would mean that event repeats once a week. This is optional and defaults to 0.")
                    parser.add_argument('-u', action="store", dest="repeatUntil", default="2050-01-01", help="Date until which event will be repeated. If not provided defaults to 2050-01-01." )
                    parser.add_argument('-l', action="store", dest="location", help="Location of the event.")
                    parser.add_argument('-c', action="store", dest="category", help="Category of the event.")
                    parser.add_argument('-m', action="store", dest="message", help="Message about the event. Usually it's the name of the event.")
                    
                    results = parser.parse_args()
                    
                    startingDate = datetime.datetime.strptime(results.date, "%Y-%m-%d")
                    #If repeat option is not provided variable repeat will be 0. That means that the
                    #event is not repeating. So the script will only append the calendar file with
                    #given information wrapped in syntax once and exit.
                    if results.repeat == 0:
                        with open (calendarFilePath, "a") as calfile:
                        calfile.write(startingDate.strftime("%Y-%m-%d"))
                        calfile.write("/")
                    #If start time is not specified script assumes that the event happens all day
                    #long and will print ALLDAY.
                        if results.startTime != None:
                            calfile.write(results.startTime)
                            calfile.write("-")
                            calfile.write(results.endTime)
                            else:
                                calfile.write("ALLDAY")
                                calfile.write("/@")
                                calfile.write(results.location)
                                calfile.write("/#")
                                calfile.write(results.category)
                                calfile.write("/-")
                                calfile.write(results.message)
                                calfile.write("\n")
                                calfile.close()
                    #Otherwise if repeat variable is more that 0, script will append information
                    #wrapped in required syntax to the file the same way as if the event would be
                    #not repeating, but then add number of days specified in variable repeat to the
                    #startDate and append the same event information to the end of the calendar file
                    #only with the changed date. It will do that until repeating events date is
                    #equal to the untilDate - which can be specified with -u argument or default to
                    #2050-01-01.
                                else:
                                    untilDate = datetime.datetime.strptime(results.repeatUntil, "%Y-%m-%d")
                                    repeatDate = startingDate
                                    while repeatDate <= untilDate:
                                        with open (calendarFilePath, "a") as calfile:
                                        calfile.write(repeatDate.strftime("%Y-%m-%d"))
                                        calfile.write("/")
                                        if results.startTime != None:
                                            calfile.write(results.startTime)
                                            calfile.write("-")
                                            calfile.write(results.endTime)
                                            else:
                                                calfile.write("ALLDAY")
                                                calfile.write("/@")
                                                calfile.write(results.location)
                                                calfile.write("/#")
                                                calfile.write(results.category)
                                                calfile.write("/-")
                                                calfile.write(results.message)
                                                calfile.write("\n")
                                                calfile.close()
                                                repeatDate = repeatDate + datetime.timedelta(days=results.repeat)
                

Šis skriptas veikia paprastai. Paleidžiant jį argumentais nurodoma įvykio pradžios data, laikas, vieta, kategorija ir žinutė, kuri dažniausiai yra įvykio pavadinimas. Taip pat su argumentais -r ir -u nurodoma kas kiek dienų įvykis kartojasi ir iki kada jis kartojasi. Jei kartojimasis nenurodytas, įvykis į kalendoriaus failą įrašomas vieną kartą. Jei kartojasi - įrašomas su pradžios data, tada prie pradinės datos pridedamas nurodytas dienų skaičius, įvykis įrašomas su naujai gauta data, tada vėl pridedamas nurodytas dienų skaičius ir taip kartojama, kol pasiekiama data iki kurios įvykis kartojasi.

Taigi jei norėčiau įvesti aukščiau pateiktą pavyzdį aš terminale, įvesčiau:

./kalendoriausIvykiuKartojimas.py -d 2015-11-23 -s 14:30 -e 15:30 -l "Vingio parkas" -c Įprastas -m "Vis dar spoksoti į žmones"

kalendoriausIvykiuKartojimas.py tai čia taip šis skriptas vadinasi pas mane. Jis gali vadintis ir kitaip, kad ir kik.py ar drambliukas.py. Nesvarbu. Aišku, skriptui reikia suteikti vykdymo teises. Tai galima padaryti su komanda chmod +x.

Jei norėčiau, kad šis įvykis kartotųsi kas 5 dienas iki 2016-08-31, aš įvesčiau tokią komandą:

./kalendoriausIvykiuKartojimas.py -d 2015-11-23 -s 14:30 -e 15:30 -r 5 -u 2016-08-31 -l "Vingio parkas" -c Įprastas -m "Vis dar spoksoti į žmones"

Ir viskas. Dabar mano kalendoriaus failas atrodytų taip:

                    2015-11-23/14:30-15:30/@Vingio parkas/#Įprastas/-Vis dar spoksoti į žmones
                    2015-11-28/14:30-15:30/@Vingio parkas/#Įprastas/-Vis dar spoksoti į žmones
                    2015-12-03/14:30-15:30/@Vingio parkas/#Įprastas/-Vis dar spoksoti į žmones
                    2015-12-08/14:30-15:30/@Vingio parkas/#Įprastas/-Vis dar spoksoti į žmones
                    2015-12-13/14:30-15:30/@Vingio parkas/#Įprastas/-Vis dar spoksoti į žmones
                    2015-12-18/14:30-15:30/@Vingio parkas/#Įprastas/-Vis dar spoksoti į žmones
                    2015-12-23/14:30-15:30/@Vingio parkas/#Įprastas/-Vis dar spoksoti į žmones
                    2015-12-28/14:30-15:30/@Vingio parkas/#Įprastas/-Vis dar spoksoti į žmones
                    2016-01-02/14:30-15:30/@Vingio parkas/#Įprastas/-Vis dar spoksoti į žmones
                    2016-01-07/14:30-15:30/@Vingio parkas/#Įprastas/-Vis dar spoksoti į žmones
                    2016-01-12/14:30-15:30/@Vingio parkas/#Įprastas/-Vis dar spoksoti į žmones
                    2016-01-17/14:30-15:30/@Vingio parkas/#Įprastas/-Vis dar spoksoti į žmones
                    2016-01-22/14:30-15:30/@Vingio parkas/#Įprastas/-Vis dar spoksoti į žmones
                    2016-01-27/14:30-15:30/@Vingio parkas/#Įprastas/-Vis dar spoksoti į žmones
                    2016-02-01/14:30-15:30/@Vingio parkas/#Įprastas/-Vis dar spoksoti į žmones
                    2016-02-06/14:30-15:30/@Vingio parkas/#Įprastas/-Vis dar spoksoti į žmones
                    2016-02-11/14:30-15:30/@Vingio parkas/#Įprastas/-Vis dar spoksoti į žmones
                    2016-02-16/14:30-15:30/@Vingio parkas/#Įprastas/-Vis dar spoksoti į žmones
                    2016-02-21/14:30-15:30/@Vingio parkas/#Įprastas/-Vis dar spoksoti į žmones
                    2016-02-26/14:30-15:30/@Vingio parkas/#Įprastas/-Vis dar spoksoti į žmones
                    2016-03-02/14:30-15:30/@Vingio parkas/#Įprastas/-Vis dar spoksoti į žmones
                    2016-03-07/14:30-15:30/@Vingio parkas/#Įprastas/-Vis dar spoksoti į žmones
                    2016-03-12/14:30-15:30/@Vingio parkas/#Įprastas/-Vis dar spoksoti į žmones
                    2016-03-17/14:30-15:30/@Vingio parkas/#Įprastas/-Vis dar spoksoti į žmones
                    2016-03-22/14:30-15:30/@Vingio parkas/#Įprastas/-Vis dar spoksoti į žmones
                    2016-03-27/14:30-15:30/@Vingio parkas/#Įprastas/-Vis dar spoksoti į žmones
                    2016-04-01/14:30-15:30/@Vingio parkas/#Įprastas/-Vis dar spoksoti į žmones
                    2016-04-06/14:30-15:30/@Vingio parkas/#Įprastas/-Vis dar spoksoti į žmones
                    2016-04-11/14:30-15:30/@Vingio parkas/#Įprastas/-Vis dar spoksoti į žmones
                    2016-04-16/14:30-15:30/@Vingio parkas/#Įprastas/-Vis dar spoksoti į žmones
                    2016-04-21/14:30-15:30/@Vingio parkas/#Įprastas/-Vis dar spoksoti į žmones
                    2016-04-26/14:30-15:30/@Vingio parkas/#Įprastas/-Vis dar spoksoti į žmones
                    2016-05-01/14:30-15:30/@Vingio parkas/#Įprastas/-Vis dar spoksoti į žmones
                    2016-05-06/14:30-15:30/@Vingio parkas/#Įprastas/-Vis dar spoksoti į žmones
                    2016-05-11/14:30-15:30/@Vingio parkas/#Įprastas/-Vis dar spoksoti į žmones
                    2016-05-16/14:30-15:30/@Vingio parkas/#Įprastas/-Vis dar spoksoti į žmones
                    2016-05-21/14:30-15:30/@Vingio parkas/#Įprastas/-Vis dar spoksoti į žmones
                    2016-05-26/14:30-15:30/@Vingio parkas/#Įprastas/-Vis dar spoksoti į žmones
                    2016-05-31/14:30-15:30/@Vingio parkas/#Įprastas/-Vis dar spoksoti į žmones
                    2016-06-05/14:30-15:30/@Vingio parkas/#Įprastas/-Vis dar spoksoti į žmones
                    2016-06-10/14:30-15:30/@Vingio parkas/#Įprastas/-Vis dar spoksoti į žmones
                    2016-06-15/14:30-15:30/@Vingio parkas/#Įprastas/-Vis dar spoksoti į žmones
                    2016-06-20/14:30-15:30/@Vingio parkas/#Įprastas/-Vis dar spoksoti į žmones
                    2016-06-25/14:30-15:30/@Vingio parkas/#Įprastas/-Vis dar spoksoti į žmones
                    2016-06-30/14:30-15:30/@Vingio parkas/#Įprastas/-Vis dar spoksoti į žmones
                    2016-07-05/14:30-15:30/@Vingio parkas/#Įprastas/-Vis dar spoksoti į žmones
                    2016-07-10/14:30-15:30/@Vingio parkas/#Įprastas/-Vis dar spoksoti į žmones
                    2016-07-15/14:30-15:30/@Vingio parkas/#Įprastas/-Vis dar spoksoti į žmones
                    2016-07-20/14:30-15:30/@Vingio parkas/#Įprastas/-Vis dar spoksoti į žmones
                    2016-07-25/14:30-15:30/@Vingio parkas/#Įprastas/-Vis dar spoksoti į žmones
                    2016-07-30/14:30-15:30/@Vingio parkas/#Įprastas/-Vis dar spoksoti į žmones
                    2016-08-04/14:30-15:30/@Vingio parkas/#Įprastas/-Vis dar spoksoti į žmones
                    2016-08-09/14:30-15:30/@Vingio parkas/#Įprastas/-Vis dar spoksoti į žmones
                    2016-08-14/14:30-15:30/@Vingio parkas/#Įprastas/-Vis dar spoksoti į žmones
                    2016-08-19/14:30-15:30/@Vingio parkas/#Įprastas/-Vis dar spoksoti į žmones
                    2016-08-24/14:30-15:30/@Vingio parkas/#Įprastas/-Vis dar spoksoti į žmones
                    2016-08-29/14:30-15:30/@Vingio parkas/#Įprastas/-Vis dar spoksoti į žmones
                

Beje, šie įrašai neišsirūšiuotų tarp kitų, anksčiau kalendoriaus faile įrašytų, įvykių, o būtų įrašyti failo apačioje. Kad įvykiai būtų išrūšiuoti pagal datą aš vim redaktoriuje naudoju :sort komandą, bet taip pat galima naudoti ir shell komandą sort ar dar kitokius būdus.

Taip aš įvedinėju pasikartojančius įvykius į savo kalendoriaus failą. Dažniausiai šitą skriptą naudoju tik pasikartojantiems įvykiams. Paprastus įvykius įvedu su vim.

Šis skirptas pravertė suvedinėjant paskaitų tvarkaraštį. Dabar teliko suvesti likusius įvykius ir pradėti pilnai naudoti savadarbį kalendorių.

Kitą kartą parašysiu kaip tvarkau šį kalendoriaus failą.


Irašo komentarai

Komentarus siųskite man elektroniniu paštu, adresu: mindaugas per minska taškas lt.

Laiške nurodykite įrašo pavadinimą ir ar norite, kad jūsų komentaras būtų paviešintas.