Svn pre-commit hook and conflict markers

Előfordul néha, hogy a nagy lelkesedésben conflict makereket tartalmazó fájlt commitolnak a fejlesztők a repository-ba. Ez nem túl gyakori hiba, de azért tud kellemetlen lenni. Keresgettem egy kicsit, de nem találtam nekem tetsző script-et, ezért írtam egyet.

 

SVNLOOK=/usr/bin/svnlook
for x in `$SVNLOOK changed "$REPOS" -t "$TXN"`; do
 if [ "$updated_file" == true ]; then
    mimetype=`$SVNLOOK propget "$REPOS" svn:mime-type -t "$TXN" "${x}" 2>/dev/null`
    #ignore binary files
    if [ -z ${mimetype} ]; then
      if $SVNLOOK cat -t "$TXN" "$REPOS" "${x}" | grep -qE '^+?(<<<<<<<|>>>>>>>)'; then
        echo "Commited conflict marker detected, commit rejected!" 1>&2 && exit 1
      fi
    fi
    updated_file=false
    continue
 else
    if [ "$x" = "U" ]; then
      updated_file=true
    fi
 fi
done
set -e

Windows downgrade

A windows 10 frissítés után tudatosult bennem, hogy bár a windows 10-el önmagában semmi probléma nincs, a számítógépes zenélést el is felejthetem mert ott még komoly kompatibilitási problémák vannak. Ez nem új dolog, és nem is csak Windows specifikus, OSX-en is hasonló a helyzet az El Captain kapcsán… Azt hittem ez nem lehet probléma, visszatelepítem a régi windowst (8.1), otthon az érdemi dolgok úgyis külön partíción, vagy dropbox-ban vannak.

A telepítéshez szükséges kulcsokat mindig mentem keepass-ba, így a kulcs is megvolt. Ha valaki esetleg elmulasztotta volna ezt a lépést, és nem tudja, hogy az általa használt windowsnak mi a telepítési kulcsa, akkor azt utólag is kinyerheti a Magical Jelly Bean Keyfinder alkalmazással.

Az első komoly problémát a windows telepítő beszerzése jelentette. A microsoft még mindig egy tucat telepítőt gyárt, amik csak bizonyos kulcsokat fogadnak el. Én azt hittem msdn által telepített windows verzióm van (általában mindig olyat telepítek) de mivel a mostani windowsomat upgradek hada állította elő (win7 -> win8 -> win10) az msdn.es telepítő nem fogadta el a kulcsomat.

Ekkor került képbe Janek által fejlesztett Ultimate PID checker. Az alkalmazás segítségével meg lehet határozni egy megadott windows telepítési kulcs típusát. Az általam használt kulcs RETAIL típusú, amihez természetesen nem volt telepítőm. A megoldást meglepő módon a microsoft szállította, és még csak MSDN subscription sem kell hozzá. A Windows 8.1 Media Creation Tool letöltése után csak ki kell választani a system type-ot, nyelvet, editiont (amit szintén megmond a PID checker) és már tölti is a megfelelő telepítőt, amit közvetlenül pendrive-ra is fel tud rakni (működött, így nem kellett megfutni egy rufus-os plusz kört).

Az újratelepítés során egyetlen dolgot rontottam el. A letörölt windows 10 kulcsát nem mentettem el, mielőtt letöröltem, így az elveszett. Azt visszaszerezni már csak bonyolultan lehet (le kell menteni a Windows 8 lemez képét, azt mountolni egy virtuális gépre, ott bootolni, upgradelni win10-re, lementeni a kulcsot, törölni az egészet). A free upgrade 2016 juliusig él, tehát mindezt még ez előtt lenne célszerű megcsinálni… Majd egyszer, talán…

Mint felhasználó nem tudom, a szivatáson kívül mi értelme van ezeknek a különböző Microsoft telepítőknek, edition-oknak, időhöz kötött upgrade-knek. Jobs a leopárd kapcsán viccelődött is ezzel, egyszer talán majd Nadella is elsüti ezt lenti poént: https://www.youtube.com/watch?v=gtSDlSVDibA

Új mame, régi frontend

A mame-t minden játéktermi gépen edződött fiatal ismeri (aki valamiért mégsem, gyorsan kezdjen ismerkedni vele :). Zseniális emulátor, de a fejlesztők a minél tökéletesebb emuláción kívül nem sok mindennel foglalkoznak (szerencsére), ezért sokan gyártottak hozzá különböző front-end-eket.

Ellenben az utóbbi időben az újabb mame verziókkal valahogy semmilyen front-end nem akart működni. Ennek az az oka, hogy a mame v.162 óta megváltozott a generált gamelist.xml fájl formátuma, aminek tartalmára a front-end-ek erősen támaszkodtak. A változás miatt az újabb mame verzió által generált xml fájlon már nem nagyon igazodnak ki.

Erre jelenthet megoldást az alábbi parancs:

</pre>
sed -e "s/machine+/game+/g" -e "s/<!ELEMENT machine/<!ELEMENT game/g" -e "s/<!ATTLIST machine/<!ATTLIST game/g" -e "s/<machine/<game/g" -e "s/<\/machine/<\/game/g" < gamelist.xml > gamelist_of.xml
<pre>

Ez az új formátumú mame gamelist.xml-t konvertálja át a régi formátumra.

A problémáról az alábbi linken írnak a Mala front-end kapcsán, de ugyanúgy érinti a Maximus Arcade felhasználókat is:

http://forum.arcadecontrols.com/index.php/topic,145865.0.html

 

 

Windows 10 – disable automatic updates

A 10 számú windows esetében a fejlesztők szó szerint értelmezték az automatikus frissítések funkciót. Ugyanis ezen windows verzió óta a frissítések letöltése tényleg felhasználói interakció nélkül (automatikusan) történik. Ezzel egy kábelen lógó asztali gép esetén nincs is baj, de elég kellemetlen meglepetés érheti az embert, amikor a windows öntudatára ébred, és a legfontosabb feladatának a frissítések letöltését tekinti. Mondjuk mobilneten, egy megbeszélés közepén, amikor nagyon kellene egy dokumentum, ami a felhőben van…

A Microsoft által javasolt pol-korrekt megoldás az lenne, hogy minden ilyen jellegű wifi kapcsolat esetén állítsuk be, hogy Metered connection-ről van szó, de nekem semmi kedvem ezt átvezetni az összes elmentett wifi kapcsolatomon, valamint minden új kapcsolatkor, kapcsolódás után, külön. Amúgy sem szerencsés, ha az operációs rendszer akkor töltöget amikor csak kedve támad. Én úgy gondolom, hogy azt csak a felhasználó tudja, mikor nem zavarja, hogy a windows berántja a rendelkezésre álló sávszélességet.

Az automatikus frissítés letöltés kikapcsolására van mód, és jó leírás is:

http://www.thewindowsclub.com/make-windows-10-notify-you-before-downloading-or-installing-windows-updates

Sokat hozzátenni nem is tudok, talán csak annyit, hogy nekem a 2 érték nem működött, az 5 viszont igen, így érdemes azzal próbálkozni elsőre.

XML fájlok szerkesztése parancssorból

Egyre több program tárolja az adatokat XML formátumban, ami kezelése nem egyszerű a hagyományos parancssori eszközökkel (grep, sed, és társai). Az XML formátum kezelésére viszont léteznek már újabb eszközök, mint például az XmlStarlet. Ez gyakorlatilag egy parancssori XML szerkesztő tool, melynek segítségével könnyedén nyerhetünk ki, vagy adhatunk, módosíthatunk adatokat az XML formátumú fájlokban.

A használata során nem árt képben lenni az XPATH fogalmával, és formátumával. Ehhez jó kiindulási alap lehet az W3Schools leírása. A munka során jó szolgálatot tehetnek még az online XPATH teszterek, generátorok.

Egy sok xml-t módosító (alap) script valahogy így néz ki a gyakorlatban:

#!/bin/sh
WORKSPACE=/cygdrive/t/work/

for x in `ls -d ${WORKSPACE}/*/`;
do
  PROJ_FILE=${x}build.xml
  if [ -f ${PROJ_FILE} ]
    then
    echo Processing build file: ${PROJ_FILE}
    xmlstarlet ed -O -P -a "/project" -t attr -n default -v "rebuild_release" ${PROJ_FILE}
  fi
done

A futtatás során a megadott könyvtár alkönyvtáraiban található build.xml fájlok tartalma az alábbi képpen módosul:

Eredeti tartalom:

<?xml version="1.0" encoding="UTF-8"?>
<project name="ac">
	<import file="../build/common.xml"/>

Tartalom a módosítás után:

<?xml version="1.0" encoding="UTF-8"?>
<project name="ac" default="rebuild_release">
	<import file="../build/common.xml"/>

A példa nem vizsgálja, hogy az XML tartalmaz e már default attribútumot, de ezt igény esetén egy újabb xmlstarlet query-vel és egy if-el könnyedén ellenőrizhetnénk. Jelen működés alapján, ha kétszer futtatnák le a fenti kódot, akkor az xml-ekben 2x kerülne beszúrásra a default tag.

 

Windows 10 recovery drive

A nagy windows 10 upgrade után többen meglepődve tapasztalhatják, hogy nem tudnak Recovery drive-ot létrehozni a megszokott módon. A fórumokban elég nagy a tanácstalanság, de a probléma, nem új keletű, már windows 8.1-ben is jelen volt. Az okokat és a lehetséges megoldást szépen összefoglalja a neosmart csapat wiki oldala: https://neosmart.net/wiki/we-cant-create-a-recovery-drive-on-this-pc/

A lényeg: recovery partíció hiányában (ami upgrade esetén nem jön létre) kénytelenek vagyunk mi megadni egy helyet (a reagentc segítségével), ahol a windows telepítő elérhető.

Aki viszont nem rendelkezik windows 10 telepítővel, vagy egyszerűen csak egy gyorsabb megoldást szeretne, igénybe veheti az EasyRe alkalmazást, ami windows 10 alá ingyenesen letölthető: https://neosmart.net/EasyRE/

ReviewBoard ShipItColumn++

A reviewboard egy egyszerű, de használható eszköz (ha az ember készít hozzá egy jó review allocator programot, de erről majd máskor). A használat során arra törekedtünk, hogy egy commitot több ember is megnézzen, ezt viszont a reviewboard valamiért nem annyira támogatja.

Mint a mellékelt képen is látszik, a reviewboard a ship-it-et egy zöld pipával jelöli. Ha valaki azt mondja a review-re, hogy Ship it, akkor a pipa megjelenik. Ellenben ha több reviewer van egy ticketen, ez nem a legszerencsésebb dolog.

Nekünk az elvárt működés valami ilyesmi lett volna:

snap134

Ehhez az alábbi módosításra van szükség:

Első lépésben meg kell keresni menni a reviewboard egg csomagját, ahol a forrás fájlok is (.py) találhatóak. Ez operációs rendszer, python verzió függő, de az alábbi helyen érdemes keresni:

/usr/local/lib/python2.7/dist-packages/ReviewBoard-2.0.18-py2.7.egg

Az oszlopok definíciója a reviewboard\datagrids\columns.py fájlban van. A ShipIt column-ot előállító kódot meglepő módon ShipItColumn-nak hívják. A kapcsolódó forráskód így néz ki:

 

class ShipItColumn(Column):
    """Shows the "Ship It" count for a review request."""
    def __init__(self, *args, **kwargs):
        super(ShipItColumn, self).__init__(
            image_class='rb-icon rb-icon-shipit',
            image_alt=_('Ship It!'),
            detailed_label = _('Ship It!'),
            db_field='shipit_count',
            sortable=True,
            shrink=True,
            *args, **kwargs)

    def render_data(self, state, review_request):
        if review_request.issue_open_count > 0:
            return ('<span class="issue-count">'
                    ' <span class="issue-icon">!</span> %s'
                    '</span>'
                    % review_request.issue_open_count)
        elif review_request.shipit_count > 0:
            return '<span class="shipit-count">' \
                   '


<div class="rb-icon rb-icon-shipit-checkmark"' \                    '      title="%s"></div>



 %s' \
                   '</span>' % \
                (self.image_alt, review_request.shipit_count)
        else:
            return ''

 

A minket érdeklő rész, leginkább az if második fele: review_request.shipit_count > 0:

Itt kezelik azt a részt, ha a ticketen 0-nál több ship it van… Ezt jobb lenne korrektül kezelni, az alábbi módon:

        elif review_request.shipit_count > 0:
            peoplecount=review_request.target_people.count()
            shipicount=review_request.shipit_count
            additionalclasstext=''
            if shipicount>=peoplecount:
                additionalclasstext=' rb-icon-shipit-checkmark'
            return '<span class="shipit-count">' \
                   '

<div class="rb-icon %s"' \                    '      title="%s"></div>


 %s/%d' \
                   '</span>' % \
                (additionalclasstext, self.image_alt, shipicount, peoplecount)

A fájl szerkesztésénél figyelni kell a szóközökre, ugyanis a python fájlok nagyon nem szeretik a tab-okat, és a szóközök nem csak a formázásra szolgálnak…

A módosítások után, amennyiben van lefordított columns.py fájl (columns.pyc), akkor azt töröljük. Ha valaki szeretné, lefordíthatja újra az alábbi script-el:

#!/usr/bin/env python
import py_compile 
py_compile.compile("columns.py")