Archiwa kategorii: Programowanie / Coding

Jak stworzyć dyrektywę w AngularJS ? Na przykładzie prostej dyrektywy input-label-text.

Możliwe, że wielu z Was, przeglądając kod, natknęło się na magiczne wyrażenie ‚directive’. Czym tak naprawdę jest? Jak można coś takiego stworzyć samemu? Na te pytania spróbuję odpowiedzieć, opisując krok po kroku tworzenie prostej dyrektywy input-label-text.

  1. Czym jest dyrektywa w AngularJS?

    Jest to reużywalny komponent, w kodzie widoczny najczęściej jako znacznik (tag), atrybut lub wartość atrybutu. Klasycznie składa się z części skryptowej, gdzie możemy zdefiniować potrzebne zmienne, funkcje, etc. oraz z części HTML-owej, czyli tzw. template’a – kawałku kodu, ‚wstrzykiwanego’ w miejsce wywołania dyrektywy.

  2. Jak ją stworzyć? Jak skonfigurować swoje pliki, aby dyrektywa zadziałała?

    Pokaże to na przykładzie komponentu, który łączy ze sobą tagi <input> i <label> oraz implementuje prostą logikę w swoim własnym wydzielonym kontrolerze.

Czytaj dalej

JSoup mini-tutorial – parsowanie HTML w środowisku java

Wstęp

Biblioteka JSoup pozwala w sposób szybki i przyjemny przeparsować dokument HTML i wyciągnąć z niego interesujące nas dane. Używając gotowego parsera (zamiast na przykład wyrażeń regularnych) oszczędzimy sporo czasu i nerwów, a przede wszystkim umożliwimy samym sobie stworzenie czytelniejszego rozwiązania.

JSoup umożliwia zarówno klasyczne przechodzenie po drzewie (children <> parent), jak i wyszukiwanie węzłów po:

  • html’owym id
  • dowolnych atrybutach
  • html’owym class
  • html’owym tagu (czyli nazwie znacznika)
  • selektorze css (tak, jak w arkuszu styli / jQuery)

Czytaj dalej

Installing and running SCons on Windows with MinGW

1. Installing Python 2.x 32bit

Right now, when SCons  2.3.4 is the latest available version, it won’t work with python >= 3.4.1. Thats because of modified behavior of print function. Its usage without ( ) is depracted and causes errors in latest python version. This construction is still used in some of SCons scripts.

SCons installer is also not capable of finding installation of 64 bit python.

Thats why you should choose latest ‚2’ version in 32 bit. For me – 2.7.9

For purposes of this test I put Python in default directory:

C:\Python27\

2. Installing SCons

The easiest way to install SCons on windows is to use default Win32 installer. There are no sophisticated install options.

Installer will put some files in <Python>\Scripts directory. Nothing more, nothing less.

Main SCons executable is wrapped with scons.bat which should be used as default SCons launcher.

3. Creating SCons launcher in projects directory

In your project directory in which your SConstruct file is located you should create new batch file. For purposes of this tutorial I called it ‚run_scons.bat’.

Inside put something like:

"C:\Python27\Scripts\scons.bat"
if NOT ["%errorlevel%"]==["0"] pause

This will simply run scons.bat in SCons installation directory and pause closing of command line dialog if error occurred.

Creating shortcut to scons.bat won’t work since shortcut changes working directory of environment to targets directory. We want to stay in projects directory.

 4. Configuring SCons to use MinGW instead of MSVC++

Some steps must be done in SConstruct to properly use MinGW compiler

  1. Environment must be initialized with tools = [‚mingw’] parameter
  2. Environment[‚ENV’][‚PATH’] must have „bin” directory of MinGW
  3. Target should be linked with -static option enabled

for example:

(...)
E = Environment(tools = ['mingw'])
E['ENV']['PATH'] += ';' + r'C:\Program Files (x86)\mingw-w64\i686-4.9.2-posix-dwarf-rt_v3-rev1\mingw32\bin'
E.Append(LINKFLAGS = "-static")
(...)

5. Running SCons

Just double-click run_scons.bat 🙂

gcc / g++ – minimalizacja rozmiaru pliku binarnego, usuwanie nieużywanych funkcji

Wstęp

Rozmiar nas ogranicza. W przypadku komputerów klasy PC nie jest to problem aż tak znaczący jak w architekturze AVR, gdzie ogranicza nas pamięć o rozmiarze 4/8/16/32KB.

Sporo miejsca możemy zaoszczędzić zmuszając kompilator do optymalizacji rozmiaru, usuwając nieużywane funkcje z kodu, itp.

Mniejszy rozmiar pliku binarnego to także szybsze uruchomienie aplikacji.

Czytaj dalej

Super skrypt do pracy z obrazem minixa i emulatorem qemu

Ah to SOI. Zabrakło 0,5pkt do 5, a głupio było się tak po prostu poddać 🙂

Udałem się więc po dodatkowe zadanie. Jak się okazało musiałem wymyślić je sobie sam, ostatecznie wpadłem na genialny pomysł stworzenia skryptu który będzie ułatwiał przyszłym pokoleniom pracę z minixem.

Z ciekawszych rzeczy:

  • Sam pobierze czysty obraz minixa do zajęć
  • Będzie automatycznie montował obraz w katalogu roboczym (łatwa modyfikacja plików!)
  • Będzie tworzył kopie zapasowe obrazów i umożliwiał powrót do wcześniejszej wersji
  • Pozwoli na wyeksportowanie zmian do zip’a
  • Pozwoli przenieść aktualny obraz na pendrive’a
  • I wiele wiele innych

Działa (przynajmniej powinien) pod linuxem, testowałem na Ububtu.

Skrypt + Instrukcja:

https://github.com/peku33/minix-toolkit

phpMyAdmin Automatic Update script

Today I present you my latest project – script for automated update of phpMyAdmin

From README.md:

Requirements – basic linux commands

  • bash
  • wget
  • unzip
  • mktemp

Usage:

  1. Download phpMyAdmin_Update.sh
  2. chmod +x ./phpMyAdmin_Update.sh
  3. ./phpMyAdmin_Update.sh <phpMyAdmin directory>

This simple script will:

  1. Download and unpack latest phpMyAdmin (zip) into temporary directory
  2. Remove _old and rename to _old
  3. Move downloaded phpMyAdmin to
  4. Copy config.inc.php from _old to
  5. Done

Project on GitHub: https://github.com/peku33/pma-update

Chinese techincal thought

This piece of artwork was found in android audio driver (bp_utils.c)

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

int exec_at(char *tty_dev, char *at)
{
   char cmdline[100] ={0} ;
   sprintf(cmdline, "/system/bin/busybox echo -e \"%s\r\n\" > %s", at, tty_dev);
   return  system(cmdline);
}

Busybox in this case – works as shell.

So to write data to file instead of fopen(), fwrite(), fclose() they are invoking shell to do echo to file.

Genius!

Szeregowanie loteryjne w systemie MINIX

Postawy teoretyczne, najbardziej obrazowo jak to możliwe

Szeregowanie loteryjne polega na tym, aby następny proces do uruchomienia niejako ‚wylosować’, jednak z zachowaniem możliwości ustalania priorytetu. W tym opisie priorytet będzie zależał od „ilości losów”.

Każdy proces powinien posiadać pewną liczbę losów, na potrzeby zadania przyjmiemy od 1 do 20. Liczbę losów nadaje się mu przy jego utworzeniu i będzie ona zmieniana wyłącznie na żądanie użytkownika. Liczba losów jest na poniższym obrazku tożsama z szerokością prostokąta.

minix1

Kiedy ma nastąpić wybranie nowego procesu do wykonania – losujemy liczbę od 1 do sumy losów wszystkich gotowych procesów. W tym wypadku od 1 do 11.

Następnie patrzymy na którym procesie wypadła nasza liczba i ten proces zostanie uruchomiony. Kiedy zajdzie potrzeba wybrania nowego procesu – należy powtórzyć tą procedurę.

  • Liczby 1,2,3,4,5 wypadają na procesie #1
  • Liczby 6,7,8 wypadają na procesie #2
  • Liczby 9,10 na procesie #3
  • A 11 na procesie #4

Zakładając, że wylosowanie każdej liczby jest równo prawdopodobne – proces 1 ma aż 5/11 szans na bycie wylosowanym, więc po wielu losowaniach okaże się, że dostał znacznie więcej czasu procesora niż proces 4 którego szanse były 1/11. Wychodzi na to, że będzie to 5-krotna różnica.

Dla przykładu załóżmy, że wylosowaną liczbą jest 8. Spowoduje to, że teraz uruchomionym procesem będzie proces #2. Na tym kończy się operacja wyboru procesu. Wylosowaliśmy, ustawiliśmy, gotowe.

Implementacja

Czytaj dalej