Niezalogowany [ logowanie ]
Subskrybuj kanał ATOM Kanał ATOM

Autor wpisu: matipl, dodany: 06.09.2023 15:17, tagi: php

Jeszcze raz – ogromne podziękowania dla Organizatorów za 2022 rok. Reaktywacja PHPCon Poland udała się w 100% i bardzo się cieszę, że przed nami edycja 2023.

PHPCon Poland to konferencja sięgająca roku 2010, kiedy miejscem spotkania był Jodłowy Dwór w Szklanej Hucie (tuż obok Świętego Krzyża). Były to piękne czasy, kiedy organizacją konferencji zajmował się jeszcze PLUG (koszt udziału wtedy był podzielony na 3 składowe – zakwaterowanie, akredytacja i obiad niedzielny). Co to była za konferencja – BoBsoN, Zyx, eRIZ czy Piotr Macuk wśród prelegentów. Wtedy programiści skupieni byli głównie na optymalizacji i nowościach (memcached, cachowanie danych, SOAP, git). Sama konferencja zaczynała się w piątek po 16:00, a kończyła obiadem o 13:00 w niedzielę.

Jakby ktoś z Was chciał wrócić do tamtych wspomnień, sprzed 13 lat, zapraszam na Flickr – PHPCon Poland 2010. To wszystko było, minęło, już nie wróci. Życie. Świat niesamowicie się zmienił przez te lata, ale PHPCon Poland po przerwie prawie wrócił do źródeł.

PHPCon Poland 2022

Tym razem nie było 250 osób, ale 600. Jesień zamiast wiosny. Tylko jeden dzień, zamiast trzech. Hotel inny, część Polski również. Ale atmosfera została taka sama… A do tego spora dawka wiedzy. Było świetnie.

Przed nami edycja 2023. Znów mamy możliwość spotkania się w Zawierciu, niedaleko autostrad A1 i A4. A do tego kilka kroków od hotelu Villa Verde jest stacja kolejowa (Zawiercie Borowe Pole). Tym razem konferencja zacznie już się w piątek popołudniem, a zakończy integracją późnym sobotnim wieczorem. Coraz bardziej wracamy do korzeni.

Jest już podana lista prelekcji (z ciekawymi kąskami) oraz są dostępne bilety (720 zł za sobotę, lub 2 dni za 1350 zł). Jeśli ktoś nie lubi płacić w ciemno to nie musi.

Autor wpisu: zleek, dodany: 26.01.2022 08:14, tagi: css, javascript

I have prepared a code which shows a nice spinner on the page. It contains a central part with some content (in example it is just a timer). Around we have three oval shapes with different opacitiy which spins with

Autor wpisu: zleek, dodany: 03.12.2021 10:05, tagi: apache

If you want to configure new domain at your Ubuntu server, here are the steps you neet to follow. Create new Virtual Host configuration First create a configuration file: Then put following configuration to the configuration file: Once it’s done,

Autor wpisu: matipl, dodany: 26.04.2021 15:56, tagi: internet, php

W zasadzie większość z nas ma stały adres IP, najczęściej zmienia się tylko w przypadku gdy nasz router ponownie nawiązuje połączenie z usługodawcą (ISP). W takiej sytuacji, np. w warunkach domowych, aż pragnie się wystawić na świat np. album zdjęć lub inne rzeczy, których nie chcemy umieszczać bezpośrednio na serwerach firm trzecich (w tzw. chmurze). Tylko jak przekazać link innym? Przecież za każdym razem nie będziemy podawać czegoś w stylu http://125.130.125.2. Po pierwsze ponieważ jutro możemy mieć już inny publiczny adres IP nadany przez ISP (np. modem się zrestartował), a po drugie łatwiej zapamiętać http://home.domena.pl .

DDNS – zewnętrzni usługodawcy

Skonfigurowanie subodmeny to rzecz prosta. Pozostaje inna kwestia – jak zautomatyzować proces, aby adres home.domena.pl zawsze kierował na naszą domową maszynę? Nic prostszego – możemy wykorzystać DDNS / DynDNS / dynamiczny DNS. Proces polega na tym, że wydzielamy z naszej domena.pl subdomenę, która ma inny TTL (czas odświeżania) i zarządzamy samą domeną oddzielnie (co też umożliwia lepszą kontrolę pod względem bezpieczeństwa). Możemy wykorzystać darmowe serwisy oferujące usługę DDNS, gdzie dostaniemy subdomenę w ramach ich domeny. Z naszej strony pozostaje ustawić cykliczną operację (cron) na wysłanie zapytania do API celem aktualizacji wpisu DNS dla subdomeny.

Taką usługę oferuje chociażby FreeDNS. Rejestracja jest bardzo prosta, po wszystkim pozostaje nam wywołanie przekazanego URI z tokenem naszej subdomeny w naszej sieci lokalnej (router/serwer/etc):

[~] $ curl https://sync.afraid.org/u/CyTXMbtq5cPnLjEg5vKHTPDE/
Updated demo.freshdns.com from 107.170.238.X to 50.23.197.94

Jeśli posiadacie własną domenę i korzystacie z gotowego panelu do zarządzania domeną to często jest możliwość skonfigurowania bezpośrednio tam DDNS. Taką usługę oferuje chociażby OVH.

DDNS – własne rozwiązanie

Ale może niektórzy z Was lubią posiadać większą kontrolę nad domeną (specyficzne rekordy) niż oferuje firma, w której opłacacie domenę. Posiadacie np. własną instancję BIND, gdzie trzymacie kilka domen (prostą konfigurację BIND opisałem w 2010 roku) i chcielibyście wykorzystać ten serwer nazw do DDNS. Sam tak właśnie pomyślałem, gdy okazało się, że na jednym z interfejsów zewn. posiadam dość zmienną adresację.

DDNS – modyfikacja w BIND

Zacznijmy od zmiany w samym BIND. Powiedzmy, że posiadamy domenę domena.pl i jej strefa u nas wygląda następująco:

$TTL 86400
$ORIGIN domena.pl.
@ IN SOA dns1.domena.pl. root.domena.pl. (
        2010111801 ;; serial
        2H         ;; refresh
        1H         ;; retry
        7D         ;; expire
        1D         ;; TTL
        )
@               IN      NS      dns1.domena.pl.
@               IN      NS      dns2.domena.pl.

@               IN      MX      10 mail.domena.pl.

@               IN      A       XXX.XX.XX.X
dns1            IN      A       XXX.XX.XX.X
dns2            IN      A       YYY.YY.YY.Y

www             IN      CNAME   @
mail            IN      CNAME   @
ftp             IN      CNAME   www

I gdy chemy dodać dodać naszą domową/lokalną subdomenę tworzymy dodatkową pozycją:

home            IN      A       ZZZ.ZZ.ZZ.Z

Ale w naszym przypadku dodajemy home.domena.pl z informacją, że jest zarządzana osobno:

home            IN      NS      dns1.domena.pl.

Czytaj dalej tutaj (rozwija treść wpisu)
Czytaj dalej na blogu autora...

Autor wpisu: JoShiMa, dodany: 22.03.2021 20:01, tagi: sql

Framework Django daje możliwość ręcznego budowania migracji. Jest to bardzo przydatne jeśli potrzebujemy dodać do aplikacji jakieś dane na początek. Ja wykorzystałam ostatnio tę możliwość do skopiowania danych ze starej do nowej wersji aplikacji. Do tej operacji potrzebna mi była jeszcze umiejętność łączenia się z dwiema bazami jednocześnie, oraz uruchamiania zapytań SQL, czyli pracy na ... Czytaj dalejDjango – kopiowanie danych między projektami, czyli bardziej zaawansowane migracje.

The post Django - kopiowanie danych między projektami, czyli bardziej zaawansowane migracje. first appeared on Z notatnika deweloperki.

Autor wpisu: Wojciech Sznapka, dodany: 01.11.2020 23:10, tagi: php

Every API fails at random points of time and that’s unavoidable. Sadly, it’s not taken care correctly during integrating third party API’s. I see it very often. „Hey there! But I’m using try-catch and handle errors, sometimes even I log them to the file…” one might say. Well, so what? What happens when it fails and you miss data which needed to be fetched during the daily ETL process? Or your business partner misses information if you send data to their API and for some reason, it fails. What then? As long as you use cron and have output emailed to some mailbox, which is being monitored – you’ll notice. Maybe you use Sentry or any other application monitoring/error tracking software and you’ll spot some anomaly. But imagine having dozens of such jobs running on a daily basis – it’s easy to lose track.

I think you get my point now. API errors occur quite often. Most of them are due to temporary service unavailability, caused mainly by having too much traffic at the moment. The simple solution is to retry. In this post, I’ll show how to easily implement efficient retry mechanism.

According to Wikipedia

Exponential backoff is an algorithm that uses feedback to multiplicatively decrease the rate of some process, in order to gradually find an acceptable rate.

In case, which I’ll explore, it’s a way to retry a piece of code, in case of an exception occurrence. It will delay every attempt with exponential pause, according to the equation (2^attempt) * baseTime

Below example uses PHP’s backoff library. Similar libs can be found in Python, node.js and probably any language of choice.

use GuzzleHttp\Exception\RequestException;
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Monolog\Processor\UidProcessor;
use STS\Backoff\Backoff; # nothing to do with sts.pl ;)

$log = new Logger('x');
$log->pushHandler(new StreamHandler('php://stdout', Logger::DEBUG));
$log->pushProcessor(new UidProcessor());

$client = new GuzzleHttp\Client();
// below API fails 60% of time
// always fail first call in 5 minutes timespan
$url = 'https://sznapka.pl/fakeapi.php';
$log->debug(sprintf('Fetching from %s', $url));

$backoff = new Backoff(10, 'exponential', 10000, true);
$result = $backoff->run(function() use ($client, $url, $log) {
    try {
        $res = $client->request('GET', $url);
        $data = json_decode($res->getBody(), true);
        $log->info(sprintf('Got response, %d items', count($data)));
    } catch (RequestException $e) {
        $log->error($e->getResponse()->getBody());
        throw $e; // causes backoff lib to retry
    }
});
$log->debug('All done');

When you run it with php ./console.php you’ll get:

[22:29:15.649] x.DEBUG: Fetching from https://sznapka.pl/fakeapi.php [] {"uid":"6b3d944"}
[22:29:15.759] x.ERROR: API failed, what a surprise! [] {"uid":"6b3d944"}
[22:29:15.832] x.ERROR: API failed, what a surprise! [] {"uid":"6b3d944"}
[22:29:16.268] x.INFO: Got response, 5 rows [] {"uid":"6b3d944"}
[22:29:16.269] x.DEBUG: All done [] {"uid":"6b3d944"}




As you can see, the backoff library retries with exponential intervals until our wrapped closure doesn’t throw an exception. It has set 10 retries and waitCap 10 seconds, so will stop processing whenever one of those conditions appear. I’ve also defined jitter parameter to true to spread out retries and minimize collisions.

Last but not least – always log your external API usage. It will help you a lot during the debugging phase. Also, it’s very handy to use UidProcessor which puts an uid (per session) into logger’s context. It allows filtering logs from given invocation, which is especially helpful with overlapping calls or concurrent usage.

Autor wpisu: Wojciech Sznapka, dodany: 11.10.2020 21:33, tagi: sql

TL;DR: commarize.com changes multi-line input into the comma-separated output.

Full story: around 6 years ago I created a simple tool to speed up my daily job. The problem was – our Affiliate Manager has been giving me excel file with one column – the IDs of customers to change their affiliate association in the database. There was a simple query behind it:

UPDATE clients
SET affiliate_id = 100001
WHERE id IN (<here goes comma separated list of clients>);

Of course, you can do that somehow in Excel. I often pasted that column to VIM and put the commas using a macro. But that was becoming a hassle, when I’ve been asked a couple times per week, sometimes a day.

I decided to create a simple tool, which looked ugly, but worked just fine.

I’ve changed job since then, but still use commarize.com almost every day. I’ve seen people in my teams having the same problem so I’ve given them the tool as well. Today is a good time to open-source it and make it slightly prettier, thanks to Tailwind CSS.

I’ve also pushed source to the GitHub, feel free to use it your own way or submit Pull Request or Issue: https://github.com/wowo/commarize

Wszystkie wpisy należą do ich twórców. PHP.pl nie ponosi odpowiedzialności za treść wpisów.