gabaman

Hozzászólások

10 bejegyzés megtekintése - 571-580 / 2,173
  • Szerző
    Bejegyzés
  • Hozzászólás: Fejtörő – „csak guruknak”… #2104402
    gabaman
    Felhasználó
      vizsla wrote:
      Mondjuk, ami nekem hiányzik, az egy gobject c kód generátor. Noha van pl. a gob, de az elég rugalmatlan.
      Maga az preprocesszor nem enged meg bizonyos dolgokat, amelyeket ugyan a c kódba be lehet tenni, de ha felülírja az ember a kinduló kódot, és „frissíti” c kódot eltűnnek a változások.

      „GObject Builder (GOB) is a simple preprocessor for easily creating GObjects (glib objects).”

      Ez mindent elmond a korlátokról. Arra épít, hogy aki nem profi, azt megkímélje a sok gépeléstől. Ha az exit_on_error változó értékét kivezeted a paraméterezéshez (mint a –no-exit-on-warn kapcsoló esetén), akkor ugyan továbbra is sírni fog, de legalább a kódot ki fogja írni.

      Hozzászólás: Fejtörő – „csak guruknak”… #2104397
      gabaman
      Felhasználó

        „Pedig valami ilyesmiről van szó… az más kérdés, hogy milyen finomságokra gondolt.”

        Mindkét ötlet jó, és kielégíti a nagyon rövid feladatmegadást. Szándékosan nem akartam korlátokat állítani. Az első ötlet is metaprogram, de így is meg lehet valósítani:

        Code:
        #!/bin/sh

        KOD=””

        `$KOD`

        Ez esetben a metaprogram a változó és a külső programfutást lehetővé tevő operátor („), a metaprogram példányosítása a változó tartalma, a generált kód meg a változó értékének behelyettesítése.

        Vizsla megoldása még jobb, bár az nem bash metaprogram, hanem inkább meta-bash program (bash nyelven írt bash metaprogram), és az implementációs szintet viszi „meta fellegekbe”.

        Azért jutott az eszembe ez a feladat, mert három független logikai részre lehet leboltani az általam megvalósított progit:
        – halmaz operátorok (metszet, únió, különbség)
        – normál és numerikus rendezés
        – forrásfájl kódolása (karakterlánc vagy új sorral elválasztott felsorolás).

        De egy valami hasolnó mindegyikben, hogy a megvalósító funkciók, a segítség szövege és a paraméterek feldolgozása logikailag összefüggőek. Azaz ha megadok egy binér halmaz operátor definíciót így (a három pont (…) a kihagyás jele):

        Code:
        név „leírás” {kód}

        pl:
        kivon „Két halmaz különbsége” {$RENDEZ $1 $TMP1; $RENDEZ $2 $TMP2; diff (…)>$TMP3; $RENDEZ $TMP3 $3;}

        akkor meglehetősen könnyen lehet új operátorokkal bővíteni a programot, és az mindig érvényes és jól definált lesz a progi (az összes összefüggő rész egyszerre módosul, csökken a programozási hiba lehetősége).

        A következő három sablonnal:

        Code:
        function {

        }

        function segitseg {
        (…)
        echo ” —  ”
        (…)
        }

        for i in $*
        (…)
                              –) MUVELET=
                                        if test „$BEVITEL” != 2
                                        then
                                            segitseg
                                        fi ;;
        (…)

        viszonylag könnyen lehet előállítani pl. ezeket a kódrészeket:

        Code:
        function kivon {
        $RENDEZ $1 $TMP1
        $RENDEZ $2 $TMP2
        diff (…)>$3;
        $RENDEZ $TMP3 $3;
        }

        function segitseg {
        (…)
        echo ” –kivon  Két halmaz különbsége”
        (…)
        }

        for i in $*
        (…)
                              –kivon) MUVELET=kivon
                                        if test „$BEVITEL” != 2
                                        then
                                            segitseg
                                        fi ;;
        (…)

        Ugyanígy a rendezést is és a fájlok kódolását (formátumát) is végig lehetne zongorázni. Ez a megközelítés a feladatleírás oldaláról történik, és szintén metaprogram. Egy kicsit (vagy nagyon, izlés dolga) loptam a webes technikák közül. Kissé hosszú lett, remélem érthető a lényeg.

        Hozzászólás: Fejtörő – „csak guruknak”… #2104398
        gabaman
        Felhasználó

          „Pedig valami ilyesmiről van szó… az más kérdés, hogy milyen finomságokra gondolt.”

          Mindkét ötlet jó, és kielégíti a nagyon rövid feladatmegadást. Szándékosan nem akartam korlátokat állítani. Az első ötlet is metaprogram, de így is meg lehet valósítani:

          Code:
          #!/bin/sh

          KOD=””

          `$KOD`

          Ez esetben a metaprogram a változó és a külső programfutást lehetővé tevő operátor („), a metaprogram példányosítása a változó tartalma, a generált kód meg a változó értékének behelyettesítése.

          Vizsla megoldása még jobb, bár az nem bash metaprogram, hanem inkább meta-bash program (bash nyelven írt bash metaprogram), és az implementációs szintet viszi „meta fellegekbe”.

          Azért jutott az eszembe ez a feladat, mert három független logikai részre lehet leboltani az általam megvalósított progit:
          – halmaz operátorok (metszet, únió, különbség)
          – normál és numerikus rendezés
          – forrásfájl kódolása (karakterlánc vagy új sorral elválasztott felsorolás).

          De egy valami hasolnó mindegyikben, hogy a megvalósító funkciók, a segítség szövege és a paraméterek feldolgozása logikailag összefüggőek. Azaz ha megadok egy binér halmaz operátor definíciót így (a három pont (…) a kihagyás jele):

          Code:
          név „leírás” {kód}

          pl:
          kivon „Két halmaz különbsége” {$RENDEZ $1 $TMP1; $RENDEZ $2 $TMP2; diff (…)>$TMP3; $RENDEZ $TMP3 $3;}

          akkor meglehetősen könnyen lehet új operátorokkal bővíteni a programot, és az mindig érvényes és jól definált lesz a progi (az összes összefüggő rész egyszerre módosul, csökken a programozási hiba lehetősége).

          A következő három sablonnal:

          Code:
          function {

          }

          function segitseg {
          (…)
          echo ” —  ”
          (…)
          }

          for i in $*
          (…)
                                –) MUVELET=
                                          if test „$BEVITEL” != 2
                                          then
                                              segitseg
                                          fi ;;
          (…)

          viszonylag könnyen lehet előállítani pl. ezeket a kódrészeket:

          Code:
          function kivon {
          $RENDEZ $1 $TMP1
          $RENDEZ $2 $TMP2
          diff (…)>$3;
          $RENDEZ $TMP3 $3;
          }

          function segitseg {
          (…)
          echo ” –kivon  Két halmaz különbsége”
          (…)
          }

          for i in $*
          (…)
                                –kivon) MUVELET=kivon
                                          if test „$BEVITEL” != 2
                                          then
                                              segitseg
                                          fi ;;
          (…)

          Ugyanígy a rendezést is és a fájlok kódolását (formátumát) is végig lehetne zongorázni. Ez a megközelítés a feladatleírás oldaláról történik, és szintén metaprogram. Egy kicsit (vagy nagyon, izlés dolga) loptam a webes technikák közül. Kissé hosszú lett, remélem érthető a lényeg.

          Hozzászólás: Fejtörő – „csak guruknak”… #2104387
          gabaman
          Felhasználó
            vizsla wrote:
            Na, most ez a megoldás, – ha jól látom – már a két feladatnak a kombinációja…

            Igen, bár a verziószám feladatot még lehet cifrázni, hogy csomagneveket is lehessen rendezni, ami már felmerült (ize-bize-1.1.3-6.fc6). De van egy horror feladatom, csak nem volt elég bátorságom bedobni.

            Tehát Ti, Kedves lovagok, akik éppen megfelelő méltó küzdelem híjján vagytok, íme egy újabb megmérettető feladat:

            Feladat: a két korábbi – ha nem is lényegesen különböző – feladat valamelyikére bash metaprogram készítése (programot író program).

            Hozzászólás: Fejtörő – „csak guruknak”… #2104388
            gabaman
            Felhasználó
              vizsla wrote:
              Na, most ez a megoldás, – ha jól látom – már a két feladatnak a kombinációja…

              Igen, bár a verziószám feladatot még lehet cifrázni, hogy csomagneveket is lehessen rendezni, ami már felmerült (ize-bize-1.1.3-6.fc6). De van egy horror feladatom, csak nem volt elég bátorságom bedobni.

              Tehát Ti, Kedves lovagok, akik éppen megfelelő méltó küzdelem híjján vagytok, íme egy újabb megmérettető feladat:

              Feladat: a két korábbi – ha nem is lényegesen különböző – feladat valamelyikére bash metaprogram készítése (programot író program).

              Hozzászólás: Fejtörő – „csak guruknak”… #2104361
              gabaman
              Felhasználó

                Elég sokat használom a diff-et, így „kéznél volt”. Egy picit keveselltem is a megoldás méretét, ezért körítettem hozzá egy kicsit. Most már illik jobban odafigyelni a minőségre is, ahol a modularitás, a hibák lekezelése, bővíthetőség és a helyes működés könnyű ellenőrzése a főbb szempontok.

                Hozzászólás: Fejtörő – „csak guruknak”… #2104362
                gabaman
                Felhasználó

                  Elég sokat használom a diff-et, így „kéznél volt”. Egy picit keveselltem is a megoldás méretét, ezért körítettem hozzá egy kicsit. Most már illik jobban odafigyelni a minőségre is, ahol a modularitás, a hibák lekezelése, bővíthetőség és a helyes működés könnyű ellenőrzése a főbb szempontok.

                  Hozzászólás: Spec karakterek c-ben #2109180
                  gabaman
                  Felhasználó

                    Hát, el kell hogy szomorítsalak, de már van karakterkód kiírató progi. Úgy a ’70-es évektől..

                    Két választási lehetőséged van, vagy a terminálon keresztül kéred be a lenyomott gombokat, vagy az X11-et kéred meg, hogy árulja el őket. Ez utóbbihoz az „xmodmap -pke” parancs segítségével juthatsz el a kívánt kódokhoz.

                    Javasolt keresési kulcsszavak:
                    Terminál: „key code terminal vt-100”
                    X11: „key code site:x.org”

                    Hozzászólás: Spec karakterek c-ben #2109181
                    gabaman
                    Felhasználó

                      Hát, el kell hogy szomorítsalak, de már van karakterkód kiírató progi. Úgy a ’70-es évektől..

                      Két választási lehetőséged van, vagy a terminálon keresztül kéred be a lenyomott gombokat, vagy az X11-et kéred meg, hogy árulja el őket. Ez utóbbihoz az „xmodmap -pke” parancs segítségével juthatsz el a kívánt kódokhoz.

                      Javasolt keresési kulcsszavak:
                      Terminál: „key code terminal vt-100”
                      X11: „key code site:x.org”

                      Hozzászólás: Fejtörő – „csak guruknak”… #2104357
                      gabaman
                      Felhasználó

                        Volt szabad 5 percem, úgyhoy összedobtam egy kis bash scriptet.  ;D  Lassan már 3 hete dobta fel a témát Vizsla, de mindenki csak kóstolgatja a bash változatot, most itt egy komplex implementáció:

                        halmaz.sh

                        Code:
                        #!/bin/sh

                        TMP1=”temp.1.txt”
                        TMP2=”temp.2.txt”
                        BEVITEL=1
                        KEZDO=1
                        ELVALASZTO=”.”

                        function rendezes {
                                if ! [ -f $1 ]
                                then
                                        echo „A(z) $1 fájl nem létezik!”
                                        exit 2
                                fi
                                cat $1 | sort -u >$2
                        }

                        function rendezes_karakterlanc {
                                if ! [ -f $1 ]
                                then
                                        echo „A(z) $1 fájl nem létezik!”
                                        exit 2
                                fi
                                cat $1 |
                                        sed -e ‘s/”([^”]*)”[ t]*/1n/g’ |
                                        grep ‘[^n]’ |
                                        sort -u >$2
                        }

                        function numerikus_rendezes {
                                O1=$KEZDO
                                O2=`expr $O1 + 1`
                                O3=`expr $O1 + 2`
                                if ! [ -f $1 ]
                                then
                                        echo „A(z) $1 fájl nem létezik!”
                                        exit 2
                                fi
                                cat $1 | sort -u -t $ELVALASZTO -k ${O1},${O1}n -k ${O2},${O2}n -k ${O3},${O3}n >$2
                        }

                        function numerikus_rendezes_karakterlanc {
                                O1=$KEZDO
                                O2=`expr $O1 + 1`
                                O3=`expr $O1 + 2`
                                if ! [ -f $1 ]
                                then
                                        echo „A(z) $1 fájl nem létezik!”
                                        exit 2
                                fi
                                cat $1 |
                                        sed -e ‘s/”([^”]*)”[ t]*/1n/g’ | grep ‘[^n]’ |
                                        sort -u -t ‘$ELVALASZTO’ -k ${O1},${O1}n -k ${O2},${O2}n -k ${O3},${O3}n >$2
                        }

                        function kivon {
                                $RENDEZES $1 $TMP1
                                $RENDEZES $2 $TMP2
                                diff -u $TMP1 $TMP2 |
                                        grep -v „^—” |
                                        grep „^-„|
                                        cut -b 2- |
                                        sort -u >$3
                                rm -f $TMP1 $TMP2
                        }

                        function unio {
                                if test „$LANC” = „”
                                then
                                        cat $1 $2 >$TMP1
                                else
                                        cat $1 $2 | tr ‘n’ ‘ ‘>$TMP1
                                fi
                                $RENDEZES $TMP1 $3
                                rm -f $TMP1
                        }

                        function metszet {
                                $RENDEZES $1 $TMP1
                                $RENDEZES $2 $TMP2
                                diff -u $TMP1 $TMP2 |
                                        grep „^ ” |
                                        cut -b 2- |
                                        sort -u >$3
                                rm -f $TMP1 $TMP2
                        }

                        function segitseg {
                                echo „Használat: $0 [opciók] — ”
                                echo „”
                                echo ”  Műveletek:”
                                echo ”    –kivon”
                                echo ”    –unio”
                                echo ”    –metszet”
                                echo „”
                                echo ”  Opciók:”
                                echo ”    -l  Karakterlánc bemenet”
                                echo ”    -n  Numerikus bemenet”
                                echo ”    -t  Elválasztó (csak numerikus bemenetnél)”
                                echo ”    -k  Kezdő oszlop (csak numerikus bemenetnél)”
                                echo ”    -v  Bőbeszédű kimenet”
                                echo „”
                                echo ”  Példa: $0 A–kivon B C”
                                echo „”
                                exit 1
                        }

                        if test $# -le 4
                        then
                                segitseg
                        fi

                        for i in $*
                        do
                                if test „$PARANCS” = „elvalaszto”
                                then
                                        ELVALASZTO=”$i”
                                elif test „$PARANCS” = „kezdo”
                                then
                                        KEZDO=”$i”
                                else
                                        case $i in
                                                -l) LANC=_karakterlanc ;;
                                                -n) NRENDEZ=numerikus_ ;;
                                                -t) if test „$NRENDEZ” = „”
                                                    then
                                                            echo „Csak numerikus bemenetet lehet elválasztani!”
                                                            exit 3
                                                    else
                                                            PARANCS=elvalaszto
                                                    fi ;;
                                                -k) if test „$NRENDEZ” = „”
                                                    then
                                                            echo „Csak numerikus bemenetnél lehet kezdő kulcsot megadni!”
                                                            exit 3
                                                    else
                                                            PARANCS=kezdo
                                                    fi ;;
                                                –kivon) MUVELET=kivon
                                                        if test „$BEVITEL” != 2
                                                        then
                                                            segitseg
                                                        fi ;;
                                                –unio) MUVELET=unio
                                                        if test „$BEVITEL” != 2
                                                        then
                                                            segitseg
                                                        fi ;;
                                                –metszet) MUVELET=metszet
                                                        if test „$BEVITEL” != 2
                                                        then
                                                            segitseg
                                                        fi ;;
                                                -v) NYOMTAT=1 ;;
                                                -h) segitseg ;;
                                                –help) segitseg ;;
                                                -?) segitseg ;;
                                                *) if test „$PARANCS” != „”
                                                  then
                                                            segitseg
                                                  else
                                                            case $BEVITEL in
                                                                    1) FORRAS1=$i
                                                                      BEVITEL=2 ;;
                                                                    2) FORRAS2=$i
                                                                      BEVITEL=3 ;;
                                                                    3) KIMENET=$i
                                                                      BEVITEL=4 ;;
                                                                    *) segitseg ;;
                                                            esac
                                                  fi;;
                                        esac

                                fi
                        done

                        RENDEZES=${NRENDEZ}rendezes${LANC}
                        $MUVELET $FORRAS1 $FORRAS2 $KIMENET

                        if test „$LANC” != „”
                        then
                                mv $KIMENET $TMP1
                                cat $TMP1 |
                                        sed -e ‘s/([^n]*)/”1″/g’ |
                                        tr ‘n’ ‘ ‘ >$KIMENET
                                echo „” >>$KIMENET
                                rm -f $TMP1
                        fi

                        if test „$NYOMTAT” = „1”
                        then
                                echo „”
                                echo „Művelet: $MUVELET”
                                echo „”
                                echo „Forrás 1 (A):”
                                echo „————-”
                                cat $FORRAS1
                                echo „”
                                echo „Forrás 2 (B):”
                                echo „————-”
                                cat $FORRAS2
                                echo „”
                                echo „Eredmény (C):”
                                echo „————-”
                                cat $KIMENET
                                echo „”
                        fi

                        Nincs különösebben tesztelve, tényleg csak gyorsan összedobtam. Viszont szándékosan kihagytam a leírást (megjegyzéseket), hogy pontosan mi mit csinál. Akit érdekel, jó kis móka kibogozni.

                        Az általam tesztelt eredmények:

                        Code:
                        $ ./halmaz.sh -v A1 –metszet B1 C

                        Művelet: metszet

                        Forrás 1 (A):
                        ————-
                        1.1.3.fc6
                        1.1.5.fc6
                        1.2.3.fc6
                        2.1.4.fc6
                        1.10.5.fc6

                        Forrás 2 (B):
                        ————-
                        1.1.3.fc6
                        1.1.5.fc6
                        1.2.3.fc6
                        2.1.7.fc6

                        Eredmény (C):
                        ————-
                        1.1.3.fc6
                        1.1.5.fc6
                        1.2.3.fc6

                        és

                        Code:
                        $ ./halmaz.sh -l -v A –metszet B C

                        Művelet: metszet

                        Forrás 1 (A):
                        ————-
                        „1.1.3.fc6” „1.1.5.fc6” „1.2.3.fc6” „2.1.4.fc6” „1.10.5.fc6”

                        Forrás 2 (B):
                        ————-
                        „1.1.3.fc6” „1.1.5.fc6” „1.2.3.fc6” „2.1.7.fc6”

                        Eredmény (C):
                        ————-
                        „1.1.3.fc6” „1.1.5.fc6” „1.2.3.fc6”

                      10 bejegyzés megtekintése - 571-580 / 2,173