Today I developed film

Standard

I’ve fiddled with photography for quite a while now, more than half of my life at this point, but it was mostly digital, my journey started with a Trust camera brought by Santa, in the early oughts, from which unfortunately I don’t think I have any saved images.

Then from this I remember the next camera-integrating-device being a Nokia 6233 from which – once again – I do not have anything saved. The first actual “big-boy” camera was my trusty Nikon D40 which went through my adolescent hell period but nevertheless it still survives to this day and I still have a ton of images from it.

Somewhere along the path I got a film camera for one of my birthdays, but I’m unsure if it occurred after me in the life at that point found out about Lomography and the existence of the Lomo Fisheye camera, regardless – the Fisheye I had still exists, and a Zenit I got as a birthday gift also still exists in my possession.

Thing is – a lot of the films I shot were never developed, and we’re talking about rolls of 35mm that are now anywhere between 12 to 14 years old (since I shot them at least), so being the anxiety ridden person that I apparently turned out to be – I decided the best way to fuck up your anxiety is to do something weirdly specific requiring exact temperatures and timings and chemicals that are more-or-less dangerous.

(Disclaimer: I have a friend that knows shit, but he – and I quote – “left me alone to see what I do”, so some things that may be written here might be his wits, not mine.)

After a quick google search I decided I can do this, so I ordered a Paterson B&W Developing Kit (mostly for the goodies), a CineStill C41 Simplified chemical kit, and a few other tools from FotoImpex.de as well as filmpefaza.ro.

The generic procedure is – you need to take out the film from the canister in total darkness (I used a changing bag), then put it on a spiral into a light-proof tank that will hold your chemicals to develop. You use the first developer while rotating the tank, after a set amount of time you move to the next chemical – the fixer/bleacher/etc, and finally you rinse it, afterwards you can remove your film and put it into a scanner to actually get the photos!

The Black and White developing procedure is rather straightforward and doesn’t really require precise or high temperatures, the Ilford kit specifically is made to be used at around 20-24 degrees Celsius, but after developing the friend that knows shit told me I had “shit density” which took a while to understand that he’s actually referring to the density of the film imprint thingy (e.g. what you shot), which might be due to too long of a developing time, regardless – I was really happy with the results given it was my first time and I also didn’t ruin a film from some years ago. After this I also got a Kodak Mini Digital Film Scanner, which is mostly crap but also – works like a charm for my needs.

You can notice several water droplets dried out as well as some very small dust/hair parts on some images, I guess I shouldn’t have rinsed after applying the Photoflo to the developed film.

Well that worked like a charm, on to developing C41 rolls now! I used the CineStill C41 Simplified kit, an aquarium heater and an aquarium pump to make sure the heat is moved around the container in which I sunk the developer bottle and the bleacher/fixer bottle, then started developing.

I had a nice accident while waiting for the Blix to do its thing and the cap off of the Jobo tank popped, spraying me with a mix of ammonium thiosulfate, ferric ammonium, sodium metabisulfate, luckily being the semi-blind-man I am I was wearing glasses so I only got sprinkles on them instead of my eyes. I had the composure not to fuck up the film I was fixing, and continued inverting the tank.

The colors aren’t the greatest but I’m totally fine with them, again – happy that I didn’t totally ruin a film from several years ago. I’m sure the next rolls will fare much better, but then again – this was good as well.

You should totally try it, it sounds super intimidating but isn’t as difficult as you’d imagine.

As for the anxiety, it takes your mind off of it a bit since you need to focus on inverting the tank every 30 seconds.

Minifesto despre democrație

Standard

[Disponibil și aici, pe Google Docs]

Motivul pentru care există această lucrare este situația politică și civică din România – valabil pentru momentul Ianuarie 2024 cel puțin, scopul fiind acela de a releva cum s-a ajuns în acest punct (de desprindere între legiuitor și cetățean, fapt ce conduce la decizii luate nu în primul rând pentru binele cetățeanului, ceea ce duce la nemulțumiri ale cetățenilor) și cum am fi putut să nu ajungem aici – sau să îmbunătățim situația pe viitor printr-un efort de a explica motivele pentru care sistemul democratic există și cum ar trebui în fapt folosit și exploatat de către cetățeni pentru a beneficia de un stat puternic și o democrație sănătoasă și reprezentativă pe viitor.

Continue reading

Puțin despre PISA și sistemul de educație

Standard

Zărit-am titlul acesta care anunță că suntem vărzet tăiat fin la competențe în matematică, înțelegerea unui text sau științe.

Context: Testele PISA sunt o testare internațională sub egida OECD pentru a evalua sistemele de educație din țările participante. România participă la ele din 2006, metodologia este în principal selecția aleatorie a 5000 de elevi cu vârsta de 15 ani care dau un test standardizat.

Cumva, suntem vărzet – și mai vărzet decât restul, vedem chiar aici rezultatele proiectului “România Educată” – chiar din 2016 de când a început “proiectul” după cum spune chiar site-ul Președinției.

Am fost la un pas de un AVC nu din cauza rezultatelor cumva…de așteptat, ci din cauza reacției minim cretine a Ministrului Educației – Ligia Deca – acesta ieșind la rampă să menționeze:

rezultatele României la PISA 2022 s-au menţinut la aproximativ acelaşi nivel ca în anul 2018;…avem un sistem de educaţie rezilient şi ţara noastră a reuşit, prin ansamblul măsurilor luate, să limiteze efectele pandemiei

Adică e super bine man, îți dai seama cât de rău ar fi putut fi?

Ei, nici până aici totuși nu eram convins să scriu ceva pe subiectul ăsta, până am dat de acest răspuns oferit de un Cătălin Ciupală (profesor de matematică la un liceu din Brașov). Menționează dânsul în propunerea sa că testele PISA au probleme de matematică ce au legătură cu viața reală, pentru se putea face un transfer mental din tangibil în abstract și vine cu nucleara

O astfel de raportare la realitate lipsește în general în România, atât din predare, cât și din testare, cu toată că nu lipsește din programă

De asta am scris textul ăsta nenorocit, pentru că eu până acum câțiva ani nu știam la ce naiba îmi folosește teorema lui Pitagora – am aflat când am vrut să știu câți metri de frânghie îmi trebuie pentru a ancora un stâlp, și abia atunci a existat acel click – când am văzut aplicabilitatea în lumea reală – că ai mei profesori de matematică n-au știut/vrut/putut să o facă.

Bypass vendor lock-in for PLC dashboards with 120 lines of code

Standard


Say you’ve got a legacy app that’s used at your large enterprise that shows you a few values on an old wrinkly dashboard — with no other option than just seeing that value or exporting a PDF report of historical data.

Just as well let’s say the vendor of the solution is now charging you an arm and a leg to update that dashboard, add new PLCs and add basic functionalities like graphing, you could plan ahead — prepare your budget and go with the vendor that locked you in, or you could use tools used by giants to avoid that, get rid of vendor lock-in and own your data.

Let’s talk about the second option, because I have no experience with the first one.

What’s a PLC? A glorified, hardened and fast controller with a variety of inputs/outputs that you can program to do operations (the name stands for Programmable Logic Controller), in a very simple manner of saying. They’re often used to control industrial equipment ranging from water flow sensors, chlorination stations or even nuclear plants.

Usually very proprietary software controls and programs such devices with a possibility of quite a few protection layers including at the hardware level for anything from hacking to reverse engineering.

Enough about that, let’s get to the data retrieval part.

First of all you need to know where your PLC is — specifically the RACK and SLOT, you can find this in both the PLC programming software, or you can dig around the legacy app and find the information.

After you’ve isolated that, you need to figure out where your data is — specifically the DB Number, the Address at which the information starts, and the Size of the information.

Your data could lie in DB2234, at an offset of 10 bits and have a size of 4 bits, for example. All of this could be found in the said proprietary software suite or the legacy software config files.

type PLC struct {
 Name    string `json:"name"`
 Desc    string `json:"desc"`
 IP      string `json:"ip"`
 Rack    int    `json:"rack"`
 Slot    int    `json:"slot"`
 Address int    `json:"address"` // This is the DB Number
 Start   int    `json:"start"` // This is the Address
 Size    int    `json:"size"` // This is the length of the data
}
// This is all you need to get data.

I chose to use Golang and this very useful library to scrape the data from a number of PLCs, then followed the Prometheus instrumenting documentation to expose those metrics and scrape them into Prometheus, less than 120 lines of code later — the metrics were being exported.

Finally we ended up with a nice dashboard in Grafana that allows us fine grained control over the data and enables us to do visualization of historical data, comparisons, and generally doesn’t lock us in to a specific vendor or exorbitant pricing for modifications.

That part is the easy one, the tips that’ll save you a lot of time are as follows:

  • look for the program blocks, those will show you how the data is getting composed and outputted — sometimes you’ll need a scaling factor to get the real value (since the PLC reads analog voltages, not actual human values)
  • data types are sneaky, sometimes it’s a float32, sometimes it’s a float64

This is by no means something new or amazing, and there’s a great talk by Toby Varland of Varland Plating (whose image I stole above) about using Grafana and InfluxDB for the same purpose, possibly in a better way than I did.

In an ideal world I would’ve made use of Grafana Live and a datasource plugin to have actual real-time data, but this checkmarks the 80/20 rule and is better than nothing, for now. The art of making high priority into low priority into tech debt.

I wish you the best of luck in trying to save your company a ton of money by using this “simple trick.”

I don’t want to have shut up

Standard

Israel is killing innocent people while on a crusade for Hamas members. This is their policy, so there’s no hiding around “it’s a war”, it’s a planned asymmetric retribution for Hamas’ despicable attack on October 7th.

Israel has been running an emotional campaign brandishing the horrors perpetrated by Hamas in an attempt to shock the world, as though people dying isn’t horrible enough, while not acknowledging the suffering they’re causing to innocent civilians that have been displaced and had their lives limited by the above mentioned state.

Furthermore there have been moments shockingly similar to those 20 years ago.

I’m not fine with this, and this is me saying something – Palestinians should be allowed to live.

If it’s not obvious, these are my opinions solely, and luckily there’s still free speech around.

GY-906 / MLX90614 on Pi Pico

Standard

This’ll be a placeholder for the other lost souls I found trying to hook-up an infrared thermometer module to the Raspberry Pi Pico (W) using MicroPython.

You need SoftI2C instead of the hardware I2C – and stuff will just work, the issue relates to clock stretching, here be a snippet to get you back on the path (that doesn’t require you to go into a frenzy of replacing resistors, adding new ones, breaking out the oscilloscope and so on).

I’ll write more about what I’m doing…eventually.


i2c = SoftI2C(sda=Pin(0), scl=Pin(1), timeout=100_000, freq=100000)
t = i2c.readfrom_mem(0x5a,0x07,15)
u = ustruct.unpack('<H',t)[0]
tC=str((u*0.02)-273.15)
temperature = float(tC)

The world right now

Standard

What a hectic mess we yet again find ourselves in. A pain of a situation brought upon us by unhappy children, people contempt with what they know – Plato’s cave syndrome, populism, lack of vision, fear of progress and possibly a handful of other psychologically interesting factors.

As always, this is a stupid thing to say but these are my opinions and as such only reflect me and my brain, not anyone else.

I won’t get into Putin’s stupid evil invasion, or into NATO’s expansion or even into the cold war, I don’t think these matter anymore.

I’m young by old-people standards, I’m 28 I think, I grew up watching The Jetsons and being so excited about the future, I’ve went from landline to StarTAC to Androids and now iPhones, from dial-up to breakneck speeds on fiber, from the world being so big – to having true friends across thousands of miles. I grew up innocent and rebellious and taking everything for granted, only with the hope that we can do so much better than we are.

I grew up watching 9/11 on TV without understanding what we were witnessing, living through consequences that hit more close to home that I was able to understand at the time. It felt so far away, despite C-17s and all sort of other C’s buzzing my house constantly.

20 years later I have RC-135s, Aries and F-16 (among others) birds buzzing my house yet again, 20 years in which I (alongside the rest of the world) tried to build something of myself, fought with demons small and big, and arrived at a sort of just-next-door balance. We all did the same, war was out of any sort of question for all of us – since none of us ever heard someone use “I’d go to war” as anything else than a metaphor for their beliefs. I’ve recently told my therapist that my whole plan for life specifically plans for a lack of war, my whole castle is made out of cards that don’t sit on war being anywhere near me. I know it’s a reality of life and even that it does have some benefits, I also know people in X places have been suffering it for a lifetime by now, that doesn’t make my situation better, if I could I’d very much like those people to also not endure the horror of war.

I’ll come off as egoistical, but I’m more importantly going to be honest and naked in my writing here, which is the excuse I will want applied to me later on.

A bit of prologue: back in the 90s Romania had to choose between two people, it was the country’s first democratic election – one of the candidates was a bow-tie wearing older gentleman saying “I’ll fight to my last blood cell for your right to not agree with me” and his opponent a former communist party member, someone fallen from the graces of the then-leader Ceaușescu. Romanians – out of fear and lack of better knowledge chose the latter, because it was what they knew. I am constantly blaming romanian for the choice they chose, with hindsight always being 20/20. This is something I often transpose whenever the discussion takes a turn into the “the politicians, it’s their fault” area, because it isn’t though is it? They are merely put there by people who believe they are the most accurate reflection of their interests, and if the politician is a populist – he’s there because the people want, nay, need that populism. Populism is, seemingly lately just another word for social measures (that are popular exactly because there are a lot of people in need, and who can blame anyone for voting for someone who promises you a better tomorrow in whatever form that may be), such taboo for liberals – helping those in need. Point of the matter – we choose what we (in the majority) are.

I’m trying to set the scene here, so it may seem I’m walking on a thousand paths. I am.

To the people in Ukraine, to the ones I know and the ones I do not, to Slava, Lucy, to all of you – I cannot imagine what you’re going through, I wouldn’t have had the strength, stoicism or will to live – going through what you are. I will always have the upmost respect for the power you’ve shown during these times. You did not want this, you did not need this, you did not deserve this.

Yet, looking at it from way high above – this is a war now for imaginary lines. For Putin’s idiotistical imperialistic desires. I am ferm on the side that he should not be allowed to get away with this, nor should lines be redrawn due to the wishes of a rat-faced second-hand Tsar-wannabe.

Those lines are funny like that, they were the reason for the world’s many past wars, from lebensraum to the Roman Empire to Russia now.

It feels now that it’s a perfect example of us – the collective people of the world – focusing too much on what makes us different, from the street we live on, the neighborhood, county, country, continent, color, faith, gender or any other totally arbitrary or wheel of life attribute we could imagine, and not enough on what makes us the same. Any two of us are way more similar than different, we may not speak the same language or praise the same God or live the same lives, but I strongly believe we all want to just live our little-unimportant-to-others-lives and go to that little coffee shop when we’re stressed and rejoice for 10 minutes before going back into the huge-for-us stress that is work or whatever we may have on our minds.

I’m trying not to say “give them the land” because not so long ago I was hellbent against anyone saying that a specific part of my country belongs to another, so I would be a hypocrite, yet what is evolution if not reaching a point where you can see you were a hypocrite.

I don’t like the perspectives of war, I don’t like the idea of Europe and it’s sometimes-shame worthy cousin the U.S. getting into a fist fight with Russia over Ukraine.

I don’t like it because it would affect me.

I don’t like it because it would affect my dear ones.

I can’t hide the naked egoism in here, otherwise I’d be a hypocrite.

I don’t like it because whether a Ukrainian, Russian, American, Chinese, Dutch or German or any nationality person dies – in the end a person dies and I swear to fucking God I cannot fathom we’re still accepting this.

In a way this is what Russian people chose as leaders, but it’s hard to blame people for choosing bad leaders, I’ve seen it happen here as well many many times, but if you think about it in realistic terms – of course the poor sod with nothing to feed the kids will vote for the guy saying he’s going to bring milk and honey on all tables.

Which brings me to diplomacy, and how we’re fucking failing at it. We’ve made multiple bodies as time went on specifically to keep a relationship going between two of the world’s nuclear powers that have historically hated each other (without a good reason), seeing X person being denied access to a meeting of said body makes me furious, because that was the whole purpose of it – a meeting between those two parties. I’d also very much enjoy all diplomats to remember that their sole purpose is communicating, not being children that won’t talk to Y because “I don’t condone their attitude”, well, then you can go not condone it at home and stop representing me, since I stand for war not breaking out.

I also have some issues with the US press especially pushing the idea that Ukraine can win this – because I’m so sorry but it can’t. You’re a non-nuclear state fighting a nuclear state whose whole strategy in the World War was “throw as many bodies as we have” at it (granted, the US helped), and won. Even if you’d fight this strategy of theirs, would your people still exist to enjoy anything left of the country? At this point, no one can win – not Ukraine, not Russia. Everyone can cut their losses though, count their dead, mourn their loss, and strive for a better tomorrow. Putin’s going to take a hit because of this, definitely – but I’m always going to wonder if this could’ve happened 6 months ago if the diplomacy failure wouldn’t have happened, and he would’ve had an out for the local political scene in Russia.

I want, and need – more talks about peace, about reaching the middle ground, not someone losing, but everyone winning. This is a big planet with a lot of people on it, surely we can make an actual effort to all get along.

I may be naive in my views, but hope is one thing I still have, and if not obvious – this represents solely my views as a person.

I fucking hate war dogs.

How I store knowledge…

Standard

…and you probably shouldn’t, because I ended up here after a very long journey trying to figure out how I can also take notes, be productive and stop forgetting things.

I’ve been playing and working in IT for more than half of my life now, and given how the domain evolves at a blistering pace it’s only a matter of time until you start to drown in information and forgetting things, it’s not ideal to say the least.

I’ll spare you the details of everything I tried and just say that for me the best way of storing information so far has proven to be the combination between pen/mechanical pencil + paper and a lightly customized Obsidian.

I’ve stolen tips from a lot of folks, one that I feel made an impact in productivity and serotonin was Adam Savage’s rant on making lists, and after trying it I can wholeheartedly say he was on to something.

My initial incursion into making everything a list

I’m sorry that I can’t find the place where Adam showed this, but I’ll update this post with a source after I finish my very much needed holiday.

The main thing was to make lists flexible so you can actually track progress instead of large tasks. So you’d have a more general task of “Fix The Thing” with one box filled halfway, and four subtasks out of which 2 are fully filled and 2 unfilled. I felt this was really useful from a mental standpoint to see I’m not stagnating.

Apart from lists, my notebook contains a ton of fleeting ideas, stuff that I know I want to have written and eventually get to – and this is where Obsidian shines and allows me to have a system in place.

I try to look through my notebook at least once a week and manually add to Obsidian whatever note I feel is important (a few days after I took it), and the same for projects that are larger in scope that I created that sort of dashboard for in the notebook, I tend to use the pen and paper if I’m not at a computer most of the times.

On to Obsidian

The very short intro is that Obsidian is a note taking app that loves Markdown and Open Source and is extremely customizable, you can pay them for storage or you can store stuff in a git repo (which is also how I’m using it on iOS using Working Copy).

You’ll hear a lot of folks talking about Zettelkasten but that just didn’t work for me, my brain works like those people say but the interface just doesn’t map correctly, so after a long while of enduring that pain I set to fix my system and adapt it to how my brain can work.

My Obsidian Setup

The first thing I see when I open Obsidian on any device. 

First of all I’m using the Homepage plugin to always show this sort of dashboard I made when starting the app, it’s insanely useful for the type of setup I have.

The top part of the screen has two buttons (Buttons plugin) with defined actions to create a new note with a specified template type in a specific folder, so a fleeting idea goes in one folder while a meeting note goes into another.

The ToDo part is using the Todoist Plugin to sync whatever tasks I have there to this page, I’m still a bit meh about using Todoist but I’m still giving it a try.

The next two parts are using the Dataview plugin to create views of whatever you want, in my case it looks for stuff in folders and sorts them.

In the bottom of the dashboard I have a helper toggle where I store code for the buttons so they look sleeker and I can use a shortcode for them.

For the templates I use the Templater plugin and store the files in a separate folder, and finally my folder structure looks like below:

The most vague and useless notes transcribed from the notebook will go straight into the archive and contain tags (#topic) so I can easily search for them later, the rest of the notes are fleeting or meeting, and weekly I go through the fleeting ones and either move them into a project of their own or into the icebox, sometimes a fleeting note will just go straight into the archive if it’s more of a information note instead of a “maybe actively create this thing” type of note.

I’m also using the Kanban plugin to move stuff from the agenda into projects, my system says that every project has its own dashboard page, and some have a Kanban as well.

This is what mostly works for me, and I strongly encourage you to not just try using one system or the other but just steal and adapt ideas from everywhere into something useful for you.

Mi-a ieșit un prost în cale…

Standard

…sau asta e impresia pe care mi-au lăsat-o vorbele sale.

Vorbesc de primarul Constanței, Vergil Chițac – primar pe care îl consider prost, și ca de obicei îmi argumentez părerea mai jos. În apărarea mea am zis și de Făgădău lucruri, deci n-are legătură cu o culoare anume.

Am citit articolul acesta în care mirificul non-concitadin (pentru că locuiește în alt oraș decât cel pe care îl “conduce”) ne spune lucruri, printre care “să avem încredere”, orbește.

Articolul ne spune că acesta s-a întâlnit la sfârșitul fiecări săptămâni din luna ce a trecut cu reprezentanții asociaților de proprietari din Constanța cu care

 edilul a stabilit constituirea unor grupuri de lucru, sub forma unor comitete, care să ajute municipalitatea să pună în practică obiectivele comune ce ţin de bunul mers al cartierului şi per ansamblu al întregului oraş.

Probabil la ședința asta nu au ajuns persoanele care locuiesc în jurul Bulevardului Alexandru Lăpușneanu, Bulevard pe care a decis să se radă orice loc de parcare existent, fără să existe o soluție măcar vizibilă într-un viitor relativ apropriat – mai la rahat cu voi și mașinile voastre supraimpozitate. (În continare sunt dispus să dau suta de lei oricui îmi arată unde parchează domnul Chițac în Eforie la el acasă, o bagă-n garaj sau o lasă pe margine?)

Mai departe, inepțiile continuă!

Am demarat elaborarea unui proiect de recompensare a asociaţiilor de proprietari pentru colectarea selectivă şi pentru întreţinerea spaţiilor verzi.

Noi nu avem infrastructura pentru reciclare și totuși primarul evident nu știe asta, pentru că în drumul său spre Primărie pe Șoseaua Mangaliei -> Bld. 1 Mai -> Str. Traian nu are cum să vadă orașul ăsta. Într-una din zonele Constanței am numărat 10 tonete de reciclare (9, una era răsturnată) la ..trei cartiere de blocuri, mii de oameni. Cât despre întreținerea spațiilor verzi – pentru care văd foarte multă vorbăraie în ultima perioadă – da’ nu vrem să ne pese și nouă puțin de asfaltul de pe jos, trotuare, copaci și alte alea? Tot eu rău.

Continuăm! Aveți încredere!

Luăm în calcul plata unor prime pentru fiecare asociaţie ce îşi îndeplineşte obiectivele de reciclare, aşa cum au fost stabilite la nivelul întregii comunităţi europene din care facem parte.

Ca fapt divers, obiectivele de reciclare pe care el nu le menționează pentru că nu le cunoaște sunt de 55% până în 2025, asta în contextul în care paritatea între tomberoanele de deșeuri menajere și deșeuri reciclabile este de 1 la 6 (numere scoase din burtă pe baza analizei a 2 ghene de gunoi).

Plata unor prime? De ce? De când liberalii o ard socialist?

Totuși motivul principal pentru care îl acuz pe domnul Chițac de prostie e următorul:

Sumele de bani vor putea fi exclusiv folosite pentru îmbunătăţirea spaţiilor de folosinţă comună ale asociaţiei. Pentru întreţinerea spaţiilor verzi vom oferi prime în vederea achiziţionării celor necesare desfăşurării acestei activităţi.

Primele respective vor putea fi folosite “exclusiv” pentru dat cu coasa, udat pe jos și pus panseluțe, ar fi superb dacă n-ar fi de fapt subvenționare din banii tuturor către asociațiile care separă hârtia de plastic. Stai la casă? Muie.

Totuși nu asta e prostia, prostia e că “vom oferi prime în vederea achiziționării celor necesare desfășurării acestei activități” – adică o să fim fix niște socialiști proști și bătuți în cap, niște marțafoi după cum spunea doamna administrator al orașului Felicia Ovanesian vorbind despre un coleg de-al său.

Chestia asta nu aduce niciun plus valoare orașului, firmelor din oraș sau oricui, trecând peste socialismul ideii, dacă banii respectiv ar fi putut fi folosiți “exclusiv pentru achiziționarea de servicii specifice îngrijirii spațiilor verzi” – atunci ar fi fost o investiție în firmele din orașul Constanța, dar nu – noi suntem proști până la capăt și regurgităm o idee molfăită în scârbă în speranța că proștii vor înghiți din nou.

Nu înghițim.

UGSI2DPDIT – Partea 2-a – Unelte

Standard

Ok, să începem cu începutul – sculele și sistemul. Preferința personală e Linux dar o să scriu totul aici pentru Windows, strict pentru a fi mai ușor (și în principiu se poate aplica foarte ușor tot ce e aici și pentru Linux).

Uneltele

  • Visual Studio Code – un editor de text versatil și eficient
  • Git – o unealtă pentru versionare (un fel de backup și stocare pentru codul pe care îl scriem)
  • Terminal/Command Prompt/Powershell – o interfață text care ne permite să interacționăm cu calculatorul
  • Python 3 – un limbaj de programare (și mai exact un interpretator pentru codul scris în limbajul acesta) – în timpul instalării o să aveți un prompt cu “ADD TO PATH”, alegeți opțiunea aceea.

Click pe fiecare dintre cele 3, descărcați și instalați, apoi reveniți aici pentru a ne acomoda cu fiecare dintre ele.

Visual Studio Code

În primă fază când pornim editorul o să vedem imaginea de mai jos, unde vom da click în partea dreapta pe “Install support for …”, urmat de click pe “Install” în dreptul lui Python – în bara din stânga care apare după primul click.

De aici putem crea un fișier nou cu un click pe “New File”, apoi vrem să îi spunem editorului că vrem să scriem cod in Python cu un click in dreapta jos pe “Plain Text”, urmând să completăm în câmpul ce apare “Pyth” și enter, pentru că avem un autocomplete acolo care ne face viața mai ușoară. Apoi putem să dăm un click pe Explorer în lista din stânga, loc de unde vedem ce alte fișiere mai avem în folderul în care lucrăm.

Shortcut-uri utile

Ok, mouse-ul e foarte ineficient în general când lucrăm cu un calculator, dar e mult mai intuitiv – mai departe o să înșir niște shortcut-uri foarte utile pentru parcursul ăsta.

CTRL+C -> COPY (Copiază text)
CTRL+P -> PASTE (Lipește text)
CTRL+SĂGEATĂ STÂNGA/DREAPTA (Sari la sfârșitul/începutul cuvântului)
SHIFT+SĂGEATĂ STÂNGA/DREAPTA/SUS/JOS (Selectează text, câteva litere sau multiple linii)
CTRL+SHIFT+SĂGEATĂ STÂNGA/DREAPTA/SUS/JOS (Selectează text, în principal cuvinte/linii)
CTRL+X -> CUT (Taie text dintr-un loc pentru a-l lipi în alt loc)
CTRL+S -> SAVE (Salvează fișierul)

Spre exemplu dacă aș vrea să selectez un cuvânt și să îl copiez aș folosi CTRL+SĂGEATĂ STÂNGA pentru a ajunge cu cursorul la el, apoi aș folosi CTRL+SHIFT+SĂGEATĂ STÂNGA pentru a-l selecta, iar în cele din urmă CTRL+C pentru a-l copia.

Ok, acum că am scos asta din ecuație să continuăm.

Python

Python este un limbaj de programare interpretat (spre deosebire de cele compilate), adică avem nevoie de interpretatorul Python instalat pe mașină pentru a rula codul (limbajele compilate nu au nevoie de un interpretator și le poți rula cu un simplu binar – cum ar fi .exe).

În următoarea parte o să intrăm în detaliile programării, pentru moment ar trebui să avem un ecran gol, editorul știe că vrem să scriem Python (putem verifica în dreapta jos dacă scrie “Python” în loc de “Plain Text”) și știm câteva shortcut-uri utile.

Scrieți (nu copiați) în editor print("Salut patroane!") și apoi apăsați CTRL+S pentru a salva undeva un fișier cu numele ceva (de preferat într-un folder gen C:/learning/ pe care îl puteți crea direct din ecranul de salvare).

Acum putem să dăm click pe butonul “Play” din dreapta sus, un terminal se va deschide în partea de jos și ‘programul’ va rula, prima linie cu săgeată din terminal ne arată cum am rula programul folosind terminalul (python C:/Users/numeuser/ceva.py, practic python si apoi calea către fișierul pe care python să îl citească). Dacă dăm click în terminal și apăsăm săgeata în sus, vom avea ultima linie rulată din nou afișată – putem să apăsăm Enter și comanda va rula din nou (spunând “Salut patroane!” din nou).

Pe linia următoare vedem rezultatul a ce am scris. Felicitări, ai scris prima linie de Python care a avut ca scop salutarea sinelui!Acum că avem un fișier Python putem să trecem la următoarele două unelte:

Git și Terminal/Cmd/Powershell

Git este o unealtă care ne permite să salvăm codul pe care lucrăm, și să păstrăm un istoric al modificărilor asupra sa, astfel încât dacă peste 3 versiuni ceva nu mai funcționează – ne putem uita în istoric, sau sări direct la momentul de acum 3 versiuni când totul era în regulă, de asemenea ne permite să lucrăm în echipe pe același cod fără să ne suprapunem munca. Toate la timpul lor.

Dacă deschidem un PowerShell și navigăm în directorul unde am salvat fișierul (calea subliniată din exemplul de mai sus – o să difere la voi) folosind cd <CALE-AICI> și Enter vom putea scrie

git init pentru inițializarea unui repository (un fel de cutie care ne va ține codul) iar apoi git add ceva.py pentru a adăuga fișierul într-un commit – echivalentul unei modificări salvate. Dacă scriem git status Git ne va arăta ce modificări au fost marcate pentru salvare – odată ce avem fișierul dorit dăm comanda git commit -m "<MESAJUL DESCRIPTIV AL MODIFICĂRII>" și apăsăm Enter.

Modificarea a fost acum salvată/înregistrată (local, doar pe calculatorul nostru, în “episoadele” următoare o să le urcăm pe GitHub și o să vorbim și despre alte feature-uri ale sale), putem să vedem istoricul modificărilor folosind git log. Aveți un exemplu mai jos.

Ok, acum ar trebui să aveți instalat Python, Visual Studio Code, Git și să aveți o vagă idee despre ce face fiecare dintre ele.

Încă n-am făcut Patreonul, e ok, bani de bere mai târziu – dar aștept comentarii și înjurături.