http fejléc alapú tartalom kiszolgálás

Adott egy wordpress weboldal, amin szeretnének fejleszteni. Az új wordpress jó volna, ha azon a domainen működne amin az éles. Esetünkben a hosts file átírása és a fejlesztői környezetben futtatása nem megoldás, így a domain.tld címnek az éles szerveren kell átmennie. Azt találtam ki, hogy egy böngésző bővítménnyel fejlécet injektálunk, aminek ha dev az értéke, akkor az új, fejlesztés alatt álló tartalom jön be, ha stable, akkor a régi, nyilvánosan elérhető.

Nginx config az éles szerveren

upstream stable {
     server 127.0.0.1:8080;
}

upstream development {
     server 127.0.0.1:8081;
}

map $http_x_selector_header $pool {
     default "stable";
     stable "stable";
     dev "development";
}

server {
    listen 443 ssl http2;
    server_name domain.tld;
    
    ssl_certificate     certs/domain.tld.cert.pem;
    ssl_certificate_key certs/domain.tld.key.pem;
    
    location / {
        proxy_pass       http://$pool;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

server {
    listen 127.0.0.1:8080;
    server_name domain.tld;
    
    # szokásos wp config
}

server {
    listen 127.0.0.1:8081;
    server_name domain.tld;
    
    # szokásos wp config
}

wp-config.php mindkét telepítésben

if (!empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && 
    $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') {

    $_SERVER['HTTPS'] = 'on';
    $_SERVER['SERVER_PORT'] = 443;
}

if (!empty($_SERVER['HTTP_X_FORWARDED_HOST'])) {
    $_SERVER['HTTP_HOST'] = $_SERVER['HTTP_X_FORWARDED_HOST'];
}

Esetünkben a fejlesztés alatt álló wordpress nem a production szerveren van és szabadon hozzáférnek a fájlokhoz.

Így a “fejlesztő” gépére közvetlenül nem kell semmit feltenni, tud mókolni a tartalommal, sablonnal és bővítményekkel. Ha elkészültek akkor a fejlesztés alatt álló wordpressről elég egy statikus másolatot készíteni és azt feltenni (szökőévente egyszer módosul rajta bármi, fölösleges mögé egy wordpress).

Fejléc injektálás

Chrome alatt az inssman csinálta azt amit szerettem volna. A többi vagy nagyon előfizetéses volt, vagy bugos.

Browserslist: caniuse-lite is outdated.

A Symfony projectekben a UI kódok buildje során ez a hibaüzenet jön szembe egy idő után:

Browserslist: caniuse-lite is outdated. Please run:
  npx browserslist@latest --update-db
  Why you should do it regularly: https://github.com/browserslist/browserslist#browsers-data-updating

Mi ez a probléma?

A browserslist hivatkozik a caniuse-lite csomagra ami egy idő után elavul. Elég agresszív a hibaüzenet és tökre elnyomja a valódi hibákat is. A fejlesztő persze meg tudja indokolni, hogy ez miért kell, talán érthető is, a mód viszont tökre ellenszenves. Azt nem veszi csak figyelembe, hogy ha a caniuse-lite-ot nem te használod direktben, és történetesen yarnt használsz, a függőségi fa mélyebb részén lévő csomagot a yarn nem tudja frissíteni. A yarntól el is lehetne térni, de a symfony/encore alapból azt javasolja, a nyilvánvaló problémáival együtt. A browserslist elképzelése szerint minden héten minden csomagot mindig frissíteni kéne, ami szerintem nonszensz. Ennyi kecske nincs a világon.

Milyen megoldást találtam ki erre?

Szerintem alapból azt kéne csinálnia a browserslist csomagnak, hogy nem mint node függőség teszi fel a csomagot, hanem egy cache mappába tölti le, mint egy csomag, és onnan húzza be az információkat. Innen jött az ötlet, hogy kiszervezem a caniuse-lite csomagot a build környezetből és csak azt az egy csomagot frissen tartom anélkül, hogy a yarn-t lecserélném. A build folyamat részévé tettem az alábbi lépéseket:

  • Feltelepítem pontosan azokat a csomagokat amiket a lock file kíván
  • Feltelepítem/frissítem globálisan a caniuse-lite csomagot
  • Rákényszerítem a node modul keresést a NODE_PATH env. variable segítségével, hogy a helyi telepítések helyett a globális könyvtárban találhatót használja amit viszont én mindig frissen tartok.

Szerintem a caniuse-lite-ot egyébként is így kéne használni, hogy egy központi helyre települ minden metaadat amit használ a többi csomag.

Blue-green deployment

Egyik ügyfélnél egy minimál blue-green deployment technikát alkalmazok ami annyit tesz, hogy nem buildelek minden alkalommal új VPS-t, hanem egy szerverre megy az új kód a régivel és a docroot symlinkje változik:
prod => prod-{hash1}
prod-{hash1}
prod-{hash2}

Amikor kikerül az új kód akkor a symlinket átírjuk és 0 kieséssel már az új kód fut. Ez azért is hasznos mert így még offsite állapotban lehet symfony cache-t építeni. A php opcache path cache-t is végez, így symlink módosításkor “No input file specified” üzenetet dob a felhasználó képébe.

Erre a megoldás az, hogy a fastcgi paramétereknél a SCRIPT_FILENAME-t módosítani kell.

Régi érték:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

Új érték:
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;

Arra is figyelni kell, hogy ne írja felül se fastcgi.conf, se egyéb fpm specifikus config file (nálunk minden php főverzió saját fastcgi configot kap: php81.conf php82.conf stb).

Karácsonyi ének a házátépítésről

avagy a múlt, a jelen és a jövő szelleme a ház felújítás körül.

Mivel lassan lezárul egy szakasz a ház felújítással kapcsolatban, így összeszedtem, legalább fejben, hogy mivel hol tartunk és hova tovább. Thread a földszint átépítéséről a twitteren található. Hossza miatt inkább itt összegzem.

Idén sok mindenre rájöttem, rengeteget okosodtam az online elérhető anyagok, youtube csatornák révén. Legutóbbi örömöm, hogy párát kordában tudjuk tartani (40% 20 fokon) és már nem probléma a penészedés. Eddig sem volt hatalmas probléma, de így már teljes lett a penészedés know-how.

“Kész”-“kész”, de jó pár dolgot már teljesen máshogy csinálnék. 😀

Fürdő & WC

A fürdőszoba burkolása nagyjából kész. Leadtuk a rendelést a párkányra. Január végére ígérték, akkor a burkoló be tudja fejezni a körülötte lévő részt. Ha lesz lelkierőnk, akkor ott a vakolatot hozzáigazítjuk a burkolathoz. Vakolat terén egy nagy tanulsága a felújításnak, hogy ha ilyen mélyen belenyúlsz egy ház átalakításba (komplett szint), akkor célszerű tégláig letúrni a vakolatot és újra vakolni. Mai eszközökkel (lézer, vakolósín) olyan pontos munkát lehet végezni amit 40 évvel ezelőtt csak az igazán profi kőművesek tudtak (guess what, a miénket nem ilyen csinálta). Ha falakat szüntetsz meg, akkor pláne.

Hevenyészett összeszedtük pár hete, hogy ide mi hányzik még:

  • zuhany ajtó
  • világítás
  • kézmosó
  • sarokcsapok
  • bútor
  • tükör
  • wc kagyló
  • nyomólap
  • ajtó(k)

Az ajtóhoz a méret kiszenvedését bonyolítja, hogy a burkolat síkja függőleges lett, míg a dilettáns kőműves a függőlegessel össze nem egyeztethető síkot rakott a falból.

Ha januárban kész az ablak, jöhet a gépész szerelvényezni és akkor már elvben használhatjuk a zuhanyzót, mert a fürdő padlója teljes terjedelmében vízzárt lett. A szoba közepén is zuhanyozhatnánk.

Következő két dolog 2023-ban

Földszinten nagyobb koszolós dolog még a gardrób padlója. Azt ígértem, hogy ha a konyha rendeződik (reálisan február végén lesz talán konyhabútor), akkor ennek nekilátok. Tele van már gépészettel, ide fut össze minden, így a gépészeti csövek alá kell szerelőbetont rakni, aztán rá a szokásos rétegrendet. Ez mókás lesz.

Viszont fontossági sorrendben a következő az az előszoba kéne legyen, mert a hozzáépítés ami jelenleg úgy néz ki mint egy “terasz”, és ami az alapját adja az előszobának, az most ráhordja a vizet a házra. Igaz a bitumenes lemez szintje alatt, de egy 40 éves oxid-bitumenes lemez az már csak dísz. A falazóelem az udvaron várja sorsát, cserép a kertben pihen, így nagyobb kiadás már csak a faanyag.

Vegyes TODO lista a ház körül

Kis összefoglaló, leginkább magamnak, hogy mivel kell még foglalkozni a házban.

  • Tető: Meg kellene csinálni rendesen az ereszt és a cseppentőlemez környékét. Nem csináltak rendes rétegrendet ide és a beszellőzést lecsökkentették 4 centire ezen a szakaszon (lambériát nem a szaruzatba marták, hanem rátették a szaru tetejére).
  • Tető: Nem csináltak vihardeszkát a szaruzatra. Ezt pótolni kéne mert nagyon sok gipszkarton illesztés mentén felrepedt az emeleten. Ez a része már önmagában a teljes cserép leszedésével járna. Meg sok fejfájással. Viszont akkor szépen ki lehetne javítani a szakmai hibákat és fel lehetne bővíteni 7.5 cm-re a beszellőzést amivel fokokat lehetne hűteni nyáron a tetőtérben. Volt ahol az alátétfóliát szépen átszögelték félre ütött szöggel. Ezek után a vápa kialakításra is kíváncsi lennék, mennyire sikerült nekik jól.
  • Tetőtér: Az emeleti fődém párazárásán és szigetelésén javítani kell. Pár helyen a villanyszerelő nem légtömör anyagokat használt. Azóta már okosabb is lettem és a célnak megfelelő alapanyagokat is ismerem (dörken szalag, kaiser légtömör dobozai, dugói). A szigetelést meg rá kell húzni a fogópárokra, hogy egységesebb legyen a szigetelés.
  • Emelet: Meg kell javítani az ablakok párazárását kívülről és belülről. Ez 6 ablak javítását jelenti, púrhab csere, RAL szalagos beépítés, belső könyöklők újra ragasztása (van ami már kopogásra üreges, csak a gravitáció tartja helyén), ablakfülke újraépítése és festés.
  • Emelet: Fürdő padlója elvált egy ponton és felrepedt. Anno nem lett a padlófűtés kifűtve, csak az alsó szinttel együtt készült el a padlófűtési rendszer, így ez valahol várható volt. Itt szívem szerint a teljes padlózatot újra raknám, mert egyébként vizet kapva csúszik is, nem lett jó választás a csempe.
  • Emelet: A svéd padló púposodását meg kell oldani. Sajnos nagyon rossz helyen púposodott fel, a székem alatt. Nem vízszintes talajon állok, így a munka közben állás sem a legjobb és ergonómikus széket sem tudok venni. Rövid távon a szoba átrendezése lesz a megoldás. A cég aki csinálta lepattintott, még csak meg sem vizsgálták mi a probléma. Gyanítom valami gané padlókiegyenlítőt öntöttek le ami elvált és a falnál sem hagyták meg a diletációs hézagot (ez utóbbi látszik). Persze azóta tiktok-on osztják az észt és szólják le a mások munkáját.
  • Emelet: Drága jó kőművesek a mellvéd magasságában futó új koszorú és a tégla találkozását nem hálózták le, így szépen felrepedt. De ezt már csak akkor csináljuk meg ha festeni kell a szobákat.
  • Földszint: Beltéri ajtók.
  • Földszint: Fürdő légtechnikája, kb mint az emeleten. Elengedhetetlen eszköz a fürdés utáni pára elleni küzdelemben.
  • Gépészet: Be kell fejezni a fűtésvezérlést. Ez a motoros szelepeket, termosztátokat és a vezérlést jelenti.
  • Mindkét szint: Burkolatváltók felrakása elmaradt. Ha a földszint kész, akkor ezt egyben lehet pótolni.
  • Pince szint és lépcső ház: Utolsó szint amit meg kell csinálni. Itt még kérdés, hogy a padlóval mit lehet kezdeni, hogy vízzárt és szigetelt legyen. Anno ide nem került bitumenes lemez.
  • Alap vízzárás: Kívülről teljes vízzárást és szigetelést kell tenni a megfelelő magasságig. Ez már a homlokzatszigeteléssel lesz összefüggésben.
  • Homlokzat szigetelés. Úgy tűnik itt legalább az alapanyag tekintetében szerencsések leszünk.
  • Terasz. Feleségem nagy álma.
  • Kert- és udvarrendezés.

Persze ez így leírva vagy egy lottó ötös, vagy legalább 5, de inkább 10 év. De ha minden évben egy nagyobb és pár kicsi tételt le tudok húzni, már jók vagyunk.

A kb 2 év hosszúra nyúlt földszinti felújítást a látszat ellenére tökre élveztem. Itt köszön kicsit vissza, hogy anno az építészmérnökség irányába is kacsintgattam, ezek szerint nem ok nélkül.

Gigabyte laptop tápcsatlakozó

Rendeltem egy GA-H310TN-R2 típusú Gigabyte alaplapot abban a reményben, hogy a laptopoknál használt tápcsatlakozó mérete majd talán a dobozban megtalálható lesz. Nem volt ott sem, így kénytelen voltam írni a supportnak.

GA-H310TN-R2 alaplap tápcsatlakozója

Válaszuk szerint a csatlakozó mérete 5.3 x 2 mm, a tápfesztültésgre meg az alábbit írták: “You can refer to any Universal Laptop adapter, such as FSP NB65 adapter.”

mysql karakterkódolási gondok

Új helyre költözött a blog és kellett egy keveset mókolni az adatbázison, hogy működjön a karakterkódolás. Latin1 táblában unicode karakterek voltak. Mivel az elkövetkezendő időben nagyobb méretű és mennyiségű adatbázist kell majd migrálnom, felvésem ide a receptet.

# mysqldump --no-data --skip-set-charset --default-character-set=latin1 -u user -p adatbázis neve > blog_schema.sql
# mysqldump --no-create-info --skip-set-charset --default-character-set=latin1 -u user -p adatbázis neve > blog_data.sql

Mivel az adatbázisban unicode karaktereket tárol, a latin1 charset kapcsolóval annyit mondunk csak meg, hogy semmi konverziót nem kérünk, illetve a fejlécben elhelyezett set-charset részt se. Így a táblában tartott adatok változtatás nélkül fognak szerepelni a fájlban.

Export után a sémafájlban az összes tábla karakterkódolást át kell írni utf8-ra.

Vegyes táblatartalom esetén (volt már ilyenhez is részem) értelem szerűen az azonosakat kell együtt exportálni, alakítani és importálni.

RAID hdd csere

Némi memó magamnak. Most éppen apánként cserélek egy régóta működő tömbben winyókat és havonta egyszer el kell végezni a mutatványt.

Előfeltételezés: /etc/initramfs-tools/conf.d/mdadm configban BOOT_DEGRADED=true

  1. Gép kikapcs. (Nem hotswappos)
  2. Winó kicserél.
  3. Gép bekapcs.
  4. Raid állapotát és a tömb tagjait meg kell nézi a statban: cat /prod/mdstat
  5. Ki kell keresni a megfelelő hdd-t és létre kell hozni rajta az üres partíciót: fdisk /dev/sdx
    1. n – create new partition
    2. P – primary partition
    3. 1 – Partition number
    4. Enter – Default starts at
    5. Enter – Default ends at
    6. t – choose partition
    7. fd – partition type
    8. p – print changes
    9. w – write changes
  6. mdadm –manage /dev/md0 -a /dev/sdx1

Honda Jazz II., izzócsere

Az eredeti leírás azt próbálja meg beadni, hogy a H4-es izzó cseréje egyszerűbb a kerék felől. Ez akár még igaz is lehetne a jobb oldalra, de a bal oldalon annyi minden van, hogy egyszerűen lehetetlen hozzáférni, ezért itt kipróbáltam, mi van akkor ha kiszedem a lámpatestet.

Nos, a tapasztalat az, hogy SOKKAL gyorsabb és kevésbé bonyodalmas.

Ami kell hozzá:

  • Lapos fejű csavarhúzó
  • Phillips csavarhúzó
  • Tizes villáskulcs

A motorháztetőt felnyitva látható, hogy az első lökhárító 4 műanyag patenttal van rögzítve. Ezeket, és a kerekeknél, a lökhárító és az oldalsó elem találkozásnál található kereszthornyos csavarokat eltávolítva lehet az idomot annyira kiemelni, hogy a lámpa két alsó csavarjáthoz hozzá lehessen férni. Ezeket is kicsavarva ki lehet billenteni a lámpatestet annyira, hogy a szerelést kényelmesen el lehessen végezni.

Ha legközelebb cserélni kell bármelyiket, dokumentálni fogom a teljes procedúrát.

net::ERR_INCOMPLETE_CHUNKED_ENCODING

Oprendszer: OSX
Környezet: brew csomagkörnyezettel feltett nginx, PHP FPM-et hívogat, 8080-as port miatt saját user futtatja az nginx-et sudo nélkül.
Hibajelenség: Nagyméretű oldalak betöltődésekor, véletlenszerűen net::ERR_INCOMPLETE_CHUNKED_ENCODING hibaüzenettel elszáll a chrome és a safari sem tölti be az oldalakat.
Oka: Jogosultsági gondok.
Megoldás:
nginx -V 2>&1 | grep path –color parancs segítségével ki kell deríteni, hogy hol vannak az nginx átmeneti mappái és azokra meg kell adni az írási jogot az nginx-et futtató user számára.
Magyarázat:

I’ve learned that when you give a response too big for Nginx, it uses this directory to write as a working directory for temporary files. If the worker process cannot access it, Nginx will terminate the transmission before it completes, thus the error INCOMPLETE_CHUNKED_ENCODING.

Innenstackoverflow.com/…/neterr-incomplete-chunked-encoding-nginx

PopCorn Garage

Megoldások:

toy story
willy wonka
gremlins
total recall
indiana jones
o brother where art thou
fight club
5th element
terminator
mask
hook
zorro
scream
star wars
matrix
top gun
back to the future
the birds
forrest gump
inception
jurassic park
teenage mutant ninja turtles
harry potter
ghost busteres
adams family
cast away
amelie
catch me if you can
friday the 13th
lion king
The Good, the Bad and the Ugly
avatar
v for vendetta
wall e
amadeus
There’s Something About Mary
12 monkeys
men in black
Zombieland
kill bill
Pirates of the Caribbean
saw
batman
Who Framed Roger Rabbit
big lebowski
predator
E.T. the Extra-Terrestrial
mars attacks
Crocodile Dundee
howard the duck
taxi driver
pulp fiction
wayne’s world
alien
A Perfect World
leon the professional
dracula
the great dictator
goonies
watchmen
snatch
willow
neverending stroy
nightmare berfore christmas
alice in wonderland
clockwork orange

NSOutline- és NSTableView sorkiválasztás

Egy apró érdekességbe futottam bele.

A view alapú tábla és outlineview felépítésekor a customizált sorháttér rajzoláskor szükségünk van ugye arra, hogy a cella tartalom is highlighted állapotba kerüljön. Viszont nem mindegy, hogy a sorháttér rajzoló metódusa és a cellatartalom változtatása mikor fut, mouse down vagy up állapotkor. Ha ezek nem egyszerre futnak, sorháttér down cellatartalom mouse up állapotkor, akkor lassú kattintáskor csúnya, gyors kattintáskor se túl elegáns villogást lehet észlelni. A cellatartalmak változtatására az apple egy WWDC videóban az -outlineViewDidChanged: notification-t javasolja, hogy ott állítsuk át. Ez viszont a kattintás befejezésekor fut. Ahhoz, hogy a két eseményt (közel) azonos időbe hozzuk a kétféle view datasource protokolljában implementálni kell a sárkánydobáshoz tartozó metódusokat:
-tableView:writeRowsWithIndexes:toPasteboard: illetve,
-outlineView:writeRowsWithIndexes:toPasteboard:
Ilyenkor a kattintás felengedésekor megvizsgálja, hogy indult-e droppolás és akkor állítja a cél sort kijelölt állapotba.
További optimalizáció, hogy a notification helyett szerintem a mouseUp metódusban is el lehetne végezni a cellatartalom highlighted állapotba kapcsolását, akkor még kevesebb a delay a megjelenítéskor. Viszont ez utóbbit még nem próbáltam.

youtube vlc alól

Egy ideje elcsesződött a youtube videók lejátszása VLC alól. Viszont a main repoban megtalálható a javítás a problémára. Szerencsére elég a youtube.lua scrip frissítése. Aki nem tudja/akarja megvárni a 2.0.4-es verziót amiben javítják, az megjavíthatja maga is. A mac-es metódust írom le, a többiek úgyis tudják mit kell csinálni. 😉

Letöltöd az új lua scriptet a vlc repóból youtube.lua néven.
Finderből megkeresed az /Applications-ben a VLC appot.
Jobbklikk, Show Package Contents.
Az app package-ben megkeresed a Contents/MacOS/share/lua/playlist/youtube.lua fájlt, és lecseréled.
Voilà!

class-dump exception

Egy folyamatban lévő munkához volt szükségem egy friss AppKit.framework class-dumpra, de a program elszállt.

Hibajelenség:
class-dumpot frameworkon futtatva a következő exceptiont adja:

2012-09-28 20:41:02.484 class-dump[21769:707] *** Terminating app due to uncaught exception 'NSRangeException', reason: 'Trying to read past end in -[CDDataCursor readLittleInt32]'
*** First throw call stack:
(
	0   CoreFoundation                      0x00007fff8f52bf56 __exceptionPreprocess + 198
	1   libobjc.A.dylib                     0x00007fff8614ad5e objc_exception_throw + 43
	2   CoreFoundation                      0x00007fff8f52bd8a +[NSException raise:format:arguments:] + 106
	3   CoreFoundation                      0x00007fff8f52bd14 +[NSException raise:format:] + 116
	4   class-dump                          0x000000010000ed41 class-dump + 60737
	5   class-dump                          0x000000010001a3d2 class-dump + 107474
	6   class-dump                          0x0000000100009399 class-dump + 37785
	7   class-dump                          0x000000010001a8dd class-dump + 108765
	8   class-dump                          0x0000000100001fa8 class-dump + 8104
	9   class-dump                          0x000000010000d217 class-dump + 53783
	10  class-dump                          0x0000000100001464 class-dump + 5220
)

Hiba oka: olyan frameworkon próbálod futtatni ami SDK és az XCode szállítja. Ezek MH_DYLIB_STUB típusúak és nem tartalmaznak futásidejű információt.
Hiba megoldása: /System alatt található framework-ön futtassad. pl:

class-dump /System/Library/Frameworks/AppKit.framework/AppKit

Megj.: Mindez persze nem vonatkozik az iOS SDK-ra.

kevesebb több

“…a képek gondolatisága erősebb legyen, mint az esztétikája. Persze el kell kerülni azt a csapdát, hogy így akár rossz képeimet is rettentő izgalmasnak nevezhetném. Inkább arra gondolok, hogy meg akarom szabadítani a felületet a felesleges részektől, hogy a rétegleszedésnek köszönhetően többé váljon. Ez a fajta absztrakciós lehetőség hihetetlenül felszabadító tud lenni.”
Szalontai Ábel a vele készült interjúban, Fotóművészet 2010/2.

forrás

Az utolsó két mondatban párhuzamot vélek felfedezni a szoftverfejlesztéssel. Persze ahogy a forrás folytatja, nem is annyira egyszerű a rétegleszedést jól művelni. Ott sem, itt sem.