Quick tip on how to use a Mikrotik router to filter unwanted sites on select LAN devices, within specified time range.
https://jacek.zlydach.pl/blog/2020-05-25-blocking-distractions-with-mikrotik-router.html
Part of zlydach.pl
Blog of Jacek Złydach - a programmer and science enthusiast.
tar -xvjf filename.tar.bz2, in case you don't remember ;)) and follow instructions from the INSTALL file.
CCL
Go to the CCL download page and fetch the newest CCL for ARM. Unpack it (tar -xvvzf filename.tar.gz this time ;)). You will have an armcl executable file, which is the CCL executable. However, if you go and actually run it, it may crash. If so, it means you'll need to rebuild the Lisp kernel for your platform.
Go to the lisp-kernel/linuxarm directory. Make sure you have an uncommented line in the float_abi.mk file that says FLOAT_ABI_OPTION = -mfloat-abi=hard. Then, run make inside the lisp-kernel/linuxarm directory. After the compilation process finishes, you should have a working armcl executable.
Working with Lisp on a remote machine
Having a Lisp on a Raspberry Pi is a good excuse to learn how to develop a Lisp program remotely. This involves editing remote files on a local machine and executing Lisp code remotely.
Since the best IDE for Common Lisp is Emacs with SLIME, let's see how this operating system editor can help us.
Connecting to a remote Lisp
First of all, you need to make sure you have fresh versions of SLIME on both your Pi and the machine you want to connect from. Use Quicklisp ((ql:quickload :SWANK)) on the former, and Emacs package manager (or direct download) on the latter[4].[4] - You could also install SLIME locally via QuickLisp. Do a (ql:quickload :quicklisp-slime-helper) and follow instructions from here. I've heard that this is *the* recommended way of installing SLIME now, but I haven't tested it yet.
After that's done, you need to run a SWANK server in your Lisp instance and make sure you can establish a secure connection with it.
A good way to approach it is to use SSH port forwarding. If you want to connect to your Lisp instance, establish an SSH connection with port tunneling, using a command like this:
ssh -L 8885:localhost:4005 user@raspberrypi
It's just a normal SSH connection, but additionally, it will securely map the port 8885 on your machine to the remote 4005 port.
On the remote side, inside your Lisp image, run the following code:
(swank:create-server :port 4005 :dont-close t)
It's a good idea to run your Lisp under screen or tmux, so that you can leave the program running and only connect (with port forwarding) to the Raspberry Pi when you need to do actual development.
When you've done all this, all that remains is to switch to your local Emacs instance and do M-x slime-connect and connect SLIME to the port 4005. You should be able to execute code on Raspberry Pi via Lisp REPL now.
With SLIME connected, you'll also be able to use shortcuts like C-c C-c to dynamically evaluate any opened code inside the remote Lisp image.
Editing code remotely
Developing on a remote machine involves changing code on it. You may of course set up git repository and clone it on both local and remote machine, but doing commit-push-pull dance to move the code around is tiring. Fortunately, Emacs gives you a way to directly edit files on a remote machine.
This feature is known as TRAMP (Transparent Remote Access, Multiple Protocols), and comes with Emacs by default. It allows you to edit files over various protocols as if they were just local files on your hard drive[5].[5] - It's primary use, however, seems to be editing files as a superuser. If you want to access a file with superuser rights, instead of launching a new Emacs instance with sudo, you can use TRAMP like this: C-x C-f /sudo:root@localhost:/ - at this point you will be prompted for your password and, after successful authorization, you can continue typing in the path of the file you want to visit.
To use it over SSH with the Raspberry Pi, open the file using C-x C-f, but enter a path like this:
/ssh:user@raspberrypi:/
You will be then prompted for password, and after successful authorization, you will see that you're able to access remote device's file system. You can now open your remote file, and any changes you save to it will be written directly on the remote device.
Emacs of course caches the established connection, so you don't have to give your password again to save data or open more remote files.
Note however, that there's a caveat - after you leave Emacs idle for some time (like, half an hour or more) the connection timeouts, and it's easy for Emacs to get stuck trying to reconnect. It's a weird problem I don't have any solution for yet. There is a lot written about it on Emacs Wiki though, so make sure to check it out, and in the meantime, be prepared to kill Emacs after you're done with remote work.
Using Lisp for something interesting
So now that we have a working Lisp on a Raspberry Pi and a proper development setup, what interesting things can we do with it? Well, this post is already too long, so I will leave that for later - but as a little sneak peak, so far I've managed to run a webserver that exposes readings from internal SOC temperature sensor and external thermometer. Stay tuned for this and more lispy stuff on Raspberry Pi.
s/praca/nauka/) i we wspólnie prowadzonej działalności. Ma szansę być bardzo spełniające, aczkolwiek problemy zawodowe mają poważną tendencję do przeciekania w życie osobiste.
Oczywiście można być też Elonem Muskiem - zlać pracę i hobby w jedno, po czym wywalić związki i zająć się ratowaniem świata.
(ql:quickload :swank)
(setf swank::*LOOPBACK-INTERFACE* "0.0.0.0")
(swank:create-server :port 4005 :dont-close t)
and map SWANK port when doing docker run:
docker run --name="your-app" -v `pwd`/src:/var/src -p 4005:4005 -ti -d yourname/app
and you can connect to it via M-x slime-connect straight from your Emacs.
It's actually quite easy to bundle that in your own Dockerfile for your app. For SBCL, it could look like this:
FROM temporal/quicksbcl
ADD ./startup.lisp /tmp/startup.lisp
CMD sbcl --load /tmp/startup.lisp
EXPOSE 4005
Where temporal/quicksbcl stands for the name you gave for the SBCL container you built and startup.lisp is the file you use to boot up your application, in which you could put the SWANK start code from above. The code for CCL is very similar, so I'll leave it out as an exercise to the reader :P.
Feel free to use and modify those Docker scripts as you wish. Since I'm not really good at Docker yet, those scripts could likely use some improvements. All issues and pull requests are welcome! And stay tuned for the upcoming posts about Lisp and web development!
preg_match('/.*(?=.{6,})(?=.*\d)(?=.*[a-zA-Z]).*/', $something);
Myślę, że nawet wprawionemu w bojach programiście przetworzenie tego wyrażenia zajmie krótką chwilę. W praktyce wyrażenia regularne szybko robią się skomplikowane, ekstremalnie trudne w czytaniu i jeszcze trudniejsze w debugowaniu. Można jednak te problemy rozwiązać za pomocą odrobiny formatowania i dodania komentarzy.
preg_match('/^
.* # Match any number of characters...
(?=.{6,}) # ... AND match at least 6 characters (lookahead) ...
(?=.*\d) # ... AND match one digit after any number of characters (lookahead) ...
(?=.*[a-zA-Z]) # ... AND match one letter after any number of characters (lookahead) ...
.* # ... AND allow any number of characters later.
$/x', $password);
Prawda, że czytelniej?
Modyfikator x powoduje, że wszystkie niewyescape'owane białe znaki zostaną zignorowane, a wszystko od znaku # do końca linii zostanie potraktowane jako komentarz i zignorowane.
O możliwości komentowania wyrażeń regularnych dowiedziałem się z artykułu Advanced Regular Expression Tips and Techniques. Zachęcam do jego przeczytania - jest tam więcej ciekawych porad, m.in. na temat callbacków czy nadawania nazw grupom.
Debugger do regexpów
Istnieje świetne narzędzie do analizy i debugowania regexpów - Debuggex. Wyświetla on strukturę wyrażenia graficznie, pozwalając na analizę krok po kroku.
Spójrzmy na przykład z poprzedniej części tego posta:
^(?:(?:ht|f)tp(?:s?)\:\/\/|~\/|\/)?(?:\w+:\w+@)?(?:(?:[-\w]+\.)+(?:com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum|travel|[a-z]{2}))(?::[\d]{1,5})?(?:(?:(?:\/(?:[-\w~!$+|.,=]|%[a-f\d]{2})+)+|\/)+|\?|#)?(?:(?:\?(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=?(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)(?:&(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=?(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)*)*(?:#(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)?$
Polecam skopiowanie powyższego wyrażenia do Debuggexa. Z jednej strony widać wyraźnie, jak ten regexp działa i do czego służy; z drugiej strony, sekcja Some random matches pokazuje, jak dziwne rzeczy przejdą przez nie poprawnie.
Uwaga o wydajności wyrażeń regularnych
Jak zapewne wielu programistów, którzy swą przygodę zaczęli od programowania gier, jestem sceptycznie nastawiony do wszelkich rzeczy pracujących na stringach. W szczególności, regexpy mogą na pierwszy rzut oka wydawać się wysoce niewydajne - ot skomplikowane dopasowanie tekstu zapisane w formie tekstu. Z pewnością napisanie tego w formie normalnego kodu - acz dłuższe - musi być wydajniejsze, prawda?
Otóż nie. Wyrażenia regularne są tak na prawdę programem - są (bardzo skondensowanym) opisem maszyny stanów, przez którą dopasowywany tekst stopniowo przechodzi, i jeśli uda się doprowadzić tę maszynę do stanu terminalnego, to dopasowanie jest uznawane za udane. Co to dokładnie znaczy? Polecam przyglądnąć się jeszcze raz rysunkom, które tworzy Debuggex - to dokładnie struktura tejże maszyny stanów. Taki system reprezentowany jest w programie w sposób bardzo wydajny; prawdopodobnie dużo wydajniejszy od naiwnego parsera, którego moglibyśmy napisać w niewielkiej liczbie linii kodu.
Co więcej, niektóre języki programowania (jak na przykład Common Lisp lub Java) pozwalają prekompilować wyrażenia regularne - jeżeli spodziewamy się, że dane wyrażenie regularne będzie używane wielokrotnie w czasie działania programu, to możemy zbudować maszynę stanów tylko raz (w przeciwieństwie do tworzenia jej na nowo za każdym razem, gdy chcemy dopasować jakiś napis), a następnie używać jej wszędzie tam, gdzie potrzebujemy korzystać z danego wyrażenia regularnego. Są nawet języki, które kompilują regexpy automatycznie.
"Welcome to Hackerspace Kraków. The place where everything is made up and the points don't matter."Krakowski HS działa już od wakacji 2012. Założyli go Maria Skrzypek, Mateusz Herych i Mirek Woźniak. Dość szybko wyrosła jednak wokół niego całkiem spora społeczność. Na początku zaczynaliśmy, jeszcze bez lokalu, z warsztatami Arduino. Były one bardzo udane, przyciągnęły sporo fanów, z których wielu stało się teraz aktywnymi członkami HSu. Niedługo później udało się ostatecznie zdobyć lokal. Formalnie więc, działamy od listopada, a oficjalne otwarcie planujemy zaraz po Nowym Roku. Fizycznie, Hackerspace Kraków mieści się przy ul. Radziwiłłowskiej 20/2 - w samym centrum Krakowa. Przez ostatnie miesiące lokal był intensywnie remontowany (przez członków HSu, własnymi siłami, w czasie wolnym**** - strasznie fajna zabawa; szlifierki oscylacyjne i opalarki są pr0!). Jest w nim mnóstwo miejsca - prawie 80 metrów powierzchni i cztery metry wysokości ***! Docelowo planujemy, by był on otwarty 24 godziny na dobę dla aktywnych członków HSu (jak tylko ogarniemy sprawę zamków), natomiast w ciągu dnia, gdy w środku jest ktoś "z załogi", zapraszamy wszystkich - nie trzeba być członkiem HSu, żeby móc wpaść i popracować!*** - przyszłe sekcje UAV oraz rakietowe HS KRK się cieszą ;). Instytut Mirakologii Hackerspace Kraków Czym się zajmujemy? Większość z nas to programiści i/lub elektronicy, stąd obecnie skupiamy się na "lekkich" projektach. Nie jest to jednak jedyny obszar zainteresowania - rozwija się też tu grupa zainteresowana... szydełkowaniem! HS był też współorganizatorem konferencji KrakDroid, która właśnie się odbywa. Jednakże głównym obszarem działań obecnie jest przyhackerspace'owy front drukarek 3D - budujemy ich aż 14, w tym jedną dla samego Hackerspace'a. O druku 3D (i Wallace'u, którego składam) napiszę w kolejnym poście; dość powiedzieć, że jest to fascynujący temat, i że HS KRK to najlepsze miejsce dla każdego, kto chce się zacząć tym interesować. Są też osoby chętne do wystartowania projektów związanych z frezarkami CNC i innym ciekawym sprzętem. Większość komunikacji odbywa się obecnie przez mailową grupę dyskusyjną. Planujemy niedługo uruchomić Hackerspace'owe Wiki z informacjami oraz Reddita na dyskusje - do tego czasu jednak trzymamy się Google Groups. Jeśli chcesz dołączyć do Hackerspace Kraków, to zachęcam do zapisania się na grupę i do aktywnego udziału! Śledź też bloga Hackerspace Kraków! W moim mieście nie ma Hackerspace'a :(. Szkoda :(. Ale nic nie stoi na przeszkodzie, żebyś go założył(a)! Dobry poradnik jak zrobić dokładnie to napisała niedawno Limor "Ladyada" Fried. Wystarczy, że znajdziesz kilka osób chętnych do hackowania razem z Tobą. Każdy istniejący Hackerspace (w tym nasz) chętnie pomoże poradami związanymi z zakładaniem takiego miejsca. Poza Hackerspace'ami Bardzo pokrewną do Hackerspaces inicjatywą są FabLab'y, Fabrication Laboratories. Od HS różnią się one tym, że są skupione na wytwarzaniu fizycznych obiektów za pomocą wycinarek, frezarek, drukarek i innych maszyn - chociaż tak na prawdę granica jest płynna, i nie zawsze wiadomo, kiedy coś jest FabLabem, a kiedy Hackerspace'm. W chwili obecnej powstaje też krakowski FabLab, ale jest to temat na innego posta, którego napiszę, jak będę coś o nim więcej wiedział :). A w międzyczasie, miłego hackowania wszystkim i zapraszamy do Hackerspace Kraków! Patrz także
Czy mógłbyś powiedzieć, gdzie najstraszniejszy i najbardziej ambitny przekonywujący pitch wypadł na poniższej skali?** - nazwa nadana przez użytkownika ph0rque. Więc, jak ambitny jest Twój start-up? :).
- Zbudujemy następnego Facebooka!
- Zbudujemy następne Apple!
- Nasz produkt stworzy rozległe zmiany polityczne! Stworzy to poważną rewolucję ekonomiczną w przynajmniej jednym kraju! (Seasteading byłoby zmianą na tym poziomie gdyby zadziałało; udane stworzenie nowego kraju jest mniej-więcej na tym poziomie zmian.)
- Nasz produkt to następna broń jądrowa. Nie chcecie, żeby wpadła w niepowołane ręce, prawda?
- To będzie odpowiednikiem wynalezienia elektryczności, jeśli się uda.
- Stworzymy lekarstwo zwiększające IQ tworząc podstawową zmianę w warunkach bytu ludzkości.
- Stworzymy poważną, Drexlerowską nanotechnologię molekularną.
- Wgramy mózg ludzki do komputera.
- Zbudujemy rekurencyjnie samoulepszającą się sztuczną inteligencję.
- Wydaje nam się, że wiemy jak włamać się do komputerów, na których chodzi wszechświat.