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.

libreoffice calc

Szakmai munkásságom csúcsán megalkottam ezt:
CONCATENATE(IF(INDEX(Sheet10.$C$1:$C$235, MATCH(B71,Sheet10.$A$1:$A$235, 0))=”Budapest”,CONCATENATE(INDEX(Sheet10.$C$1:$C$235, MATCH(B71,Sheet10.$A$1:$A$235, 0)),” “, IF(ISTEXT(INDEX(Sheet10.$B$1:$B$235, MATCH(B71,Sheet10.$A$1:$A$235, 0))),INDEX(Sheet10.$B$1:$B$235, MATCH(B71,Sheet10.$A$1:$A$235, 0)),CONCATENATE(ROMAN(MID(INDEX(Sheet10.$B$1:$B$235, MATCH(B71,Sheet10.$A$1:$A$235, 0)),2,2)),”.”)) ),CONCATENATE(INDEX(Sheet10.$B$1:$B$235, MATCH(B71,Sheet10.$A$1:$A$235, 0)),” “,INDEX(Sheet10.$C$1:$C$235, MATCH(B71,Sheet10.$A$1:$A$235, 0)))),”, “,INDEX(Sheet10.$D$1:$D$235, MATCH(B71,Sheet10.$A$1:$A$235, 0)),CHAR(10),INDEX(Sheet10.$E$1:$E$235, MATCH(B71,Sheet10.$A$1:$A$235, 0)))

ismerkedés a symfony2-vel (2.)

Tehát azt ígértem, hogy a project lezárása után elkezdjük az ismerkedést az symfonyval. Az első kérdés a letöltés után, hogy ok, mit hol találok?

Az app könyvtárban találhatóak a beállítófájlok, cache és a kernel. A kernel az mvc szemléletben felépített modulok (bundle-ök) betöltéséért, futtatásáért felel.

A bin könyvtárban lévő vendors fájl, a gyökérben lévő deps és deps.lock fájlok felelősek a symfony frissítéséért git tárolókból. A vendors a futtatható parancsfájl, a deps meg tárolja a függőségeket. Ide kell felvenni a szükséges paramétereket akkor, ha új 3rd party eszközre lenne szükségünk. Későbbiekben a symfonyban egy új csomagkezelést fognak bevezetni, ami nagyjából hasonlít a linuxokban megismert csomagkezelésre. Függőségeket lehet vele definiálni és a saját kódjainkat csomagokba szervezni. További infó az composerről.

Az src könyvtárban lesznek a kódjaink. A bundle egy komponens a symfonyban, amit mi írtunk. src/cégnév/projectnév/bundleneveBundle a bundle elérési útvonala. Ezzel az útvonallal (ami egyben namespace is) később, bizonyos alap összetevők kiszervezhetőek a vendors mappába is. A bundle Controller mappája tartalmazza a kontrollereket. A controller fájl és osztály suffixe minden esetben Controller. A bundle php fájl ami még szükséges, a többi mappának nem kötelező léteznie.

Vendor mappába frissülnek le a fentebb emlegetett komponensek. Symfony és 3rd party kiterjesztések. Itt is megfigyelhető egyébként a bundle szerű felépítés, a Symfony is egy bundle.

Web DocRoot. De ez lehet akármi.

OK! Most már megtalálom nagyjából a dolgokat a fájlrendszerben, hogyan kezdjek neki?

Symfony environment-ek

A environment-ek különböztetik meg a különféle futásokat. Így tudunk csinálni egy rendszerre dev, test, prod(uction) environmenteket. De akár egy symfony kódbázisra ráépíthetünk különféle projecteket, létrehozva ezzel projectneve1_dev, projectneve1_prod, projectneve2_dev … elnevezésű environmenteket. Az environmentek nevét a belépő fájl, az alap telepítéseben a web mappa docroot app.php és app_dev.php fájlja tartalmazza. Azt is itt írjuk le, hogy az adott environment debug módban fut-e (lásd kernel.debug paraméter később), vagy sem.

app.php 9. sor

$kernel = new AppKernel(‘prod’, false);

app_dev.php 15. sor

$kernel = new AppKernel(‘dev’, true);

A web mappát lemásolva és ezeket a paramétereket átírva új environmentet hozhatunk létre. Mondjuk egy új weboldalt.

A konzolos parancsok esetében (app/console a belépési pont) az –env kapcsolóban mi kézzel adjuk meg, hogy milyen environmentet akarunk futtatni. Ha lényeges akkor a további kapcsolókban a debug módot is megadhatjuk (cache újraépítésénél lényeges pl).

Environmentenként betöltődő bundle-ök.

Következő lépésként még azt is szeretnénk megadni, hogy mely bundle-ök töltődjenek be az egyes futások alkalmával. Ezt beállítani az app/AppKernel.php fájlban van lehetőségünk.


app/AppKernel.php 22. sor

if (in_array($this->getEnvironment(), array('dev', 'test'))) {

illetve


app/AppKernel.php 32-35. sor

public function registerContainerConfiguration(LoaderInterface $loader)
{
$loader->load(__DIR__.'/config/config_'.$this->getEnvironment().'.yml');
}

Az első kódban mutatott ponton ágaz(hat)nak el a különféle environmentek. Itt egy egyszerű switch szerkezettel el tudjuk különíteni a különféle environmenteket. A második kód mutatja, hogy az environment nevétől függően, hol keresi a belépő beállító fájlt az app config mappában.

Korábban az app és web mappábat úgy ahogy van másoltam, és úgy hoztam létre új elágazást. De szervesen összetartozó, ugyanakkor mégis külön részegységet alkotó environmentek esetén ez egy kicsit szorosabb integrációt tud eredményezni és karbantartani is egyszerűbb.

Legközelebb nekilátunk egy minta project és néhány tucat bundle létrehozásának.

Olvasnivaló:
How to Master and Create new Environments

symfony in progress

Az első után kicsit elmaradt a symfony2-ről a folytatás. A helyzet az, hogy a napokban fejezek be egy nagyobb lélegzetvételű projectet symfony2 alapokon. Ha azt lezárom, mindenképpen megosztom a tapasztalatokat! A honi hobbi project után azért sok megoldás született!

A mai agymenésem twitteren a következő témák körül forogtak:
– yaf nagyon jól néz ki (pecl-ben megírt MVC keretrendszer)! teljesítmény tesztek twitterpajtitól remélem érkezni fognak
– miért nem írnak több modult zend enginge-ben (c-ben) gyorsítva ezáltal a kódokat? minden adott! még akár 1 az 1ben átültethető lehetne a php kód, interface zend enginge alá.
– innentől gurult el a gyógyszer, egy mobilfejlesztő cégben ahol iphone kódokat túrunk, miért ne lehetne objective c-ben megírni a weboldalt?
– a múltkori crossplatform objective c kód után teljesen felvillanyozott az elgondolás, hogy objective c-ben írjak meg weboldalakat. Egyedül talán a doctrine-t kéne portolni objective c alá. iOS alatt a Core Data nagyjából teljesen megoldja az ORM kérdést. ezt kéne átültetni ebbe a környezetbe cserélhető DB backenddel (mysql, pgsql, oracle, sqlite stb). MVC elv nem tétel, más meg minden létezik lib szinten. max egy objc binding kell hozzá.
– későbbi megvizslatásra eltesszük a cappuccino-t és a frothkit-et. előbbi objective-j és kliens oldali kódot, javascriptet generál egy objective-cre hajazó kódhalmazból, utóbbi objective c és szigorúan szerver oldali. alaposabb ismerkedés és remélhetőleg egy éles project preview-ja közeljövőben érkezik!