{
    "id": 786,
    "date": "2018-04-30T20:29:37",
    "date_gmt": "2018-04-30T20:29:37",
    "guid": {
        "rendered": "http:\/\/hayperek.pl\/?p=786"
    },
    "modified": "2018-04-30T20:29:37",
    "modified_gmt": "2018-04-30T20:29:37",
    "slug": "co-z-ta-konfiguracja-czesc-2",
    "status": "publish",
    "type": "post",
    "link": "https:\/\/hayperek.pl\/pl_pl\/2018\/04\/30\/co-z-ta-konfiguracja-czesc-2\/",
    "title": {
        "rendered": "Co z t\u0105 konfiguracj\u0105? &#8211; cz\u0119\u015b\u0107 2"
    },
    "content": {
        "rendered": "<p>Wczoraj zastanawiali\u015bmy si\u0119 nad wyborem sposobu przechowywania ustawie\u0144 u\u017cytkownika w naszym systemie. Finalnie zapad\u0142a decyzja o u\u017cyciu jednego z dost\u0119pnych format\u00f3w tekstowych, g\u0142\u00f3wnie ze wzgl\u0119du na wygod\u0119 u\u017cycia i wsteczn\u0105 kompatybilno\u015b\u0107 mi\u0119dzy wersjami software&#8217;u. Oczywi\u015bcie wci\u0105\u017c otwarta pozostaje kwestia doprecyzowania kt\u00f3ry dok\u0142adnie format wybra\u0107: XML, JSON czy mo\u017ce YAML. Ka\u017cdy z nich ma swoje wady i zalety, jednak nie b\u0119dziemy tym razem szczeg\u00f3\u0142owo rozwa\u017ca\u0107 ka\u017cdej z opcji. <\/p>\n<blockquote><p>O, to jakie\u015b novum! Dlaczego?<\/p><\/blockquote>\n<p>Sk\u0142adnie XMLa, JSONa czy YAMLa s\u0105 na tyle zbli\u017cone do siebie, \u017ce trudno obiektywnie wybra\u0107 najlepszy format, oceniaj\u0105c jedynie spos\u00f3b opisu struktur danych. Ka\u017cdy z nich jest w por\u00f3wnywalnym stopniu czytelny dla cz\u0142owieka oraz wymaga dedykowanego parsera po stronie maszyny. <\/p>\n<blockquote><p>Brak nam jakiegokolwiek kryterium&#8230;<\/p><\/blockquote>\n<p>C\u00f3\u017c.. jest jedno. Pami\u0119tajmy, i\u017c musi powsta\u0107 jaka\u015b forma aplikacji na komputer\/tablet pozwalaj\u0105ca edytowa\u0107 ustawienia zapisane w pliku konfiguracyjnym. Analizuj\u0105c do\u015bwiadczenia z poprzednich projekt\u00f3w, doszli\u015bmy do wniosku, \u017ce tworzenie dedykowanego programu jest bardzo nieefektywne i czasoch\u0142onne. Dlaczego wi\u0119c nie skorzysta\u0107 z gotowej aplikacji, kt\u00f3r\u0105 ma zainstalowany ka\u017cdy wsp\u00f3\u0142czesny komputer, czyli z&#8230; przegl\u0105darki internetowej? \ud83d\ude42<\/p>\n<p>Takie rozwi\u0105zanie ma ogromnie wiele zalet. Stworzenie interfejsu graficznego jest banalnie proste &#8211; sprowadza si\u0119 do stworzenia strony HTML. Nie jeste\u015bmy ju\u017c uzale\u017cnieni od konkretnego systemu operacyjnego &#8211; uzyskujemy doskona\u0142\u0105 przeno\u015bno\u015b\u0107, konfiguracj\u0119 mo\u017cna edytowa\u0107 na dowolnym urz\u0105dzeniu wyposa\u017conym w slot karty SD\/micro-SD oraz przegl\u0105dark\u0119. Wszelka forma konwersji i walidacji danych czy interakcji z u\u017cytkownikiem amo\u017ce zosta\u0107 oprogramowana w j\u0119zyku JavaScript i jego rozszerzeniach, wrodzaju jQuery.<\/p>\n<blockquote><p>A jak wczytamy plik z konfiguracj\u0105?<\/p><\/blockquote>\n<p>Tak si\u0119 dobrze sk\u0142ada, i\u017c jeden z naszych kandydat\u00f3w, JSON, jest natywnie wspierany przez JavaScript \ud83d\ude42 Trudno wyobrazi\u0107 sobie prostsze rozwi\u0105zanie. <\/p>\n<p>Oczywi\u015bcie sam wyb\u00f3r formatu nie okre\u015bla ostatecznej formy zapisu danych &#8211; ta b\u0119dzie specyficzna dla ka\u017cdej aplikacji, ka\u017cdego komponentu w naszym projekcie. I tu pojawia si\u0119 do\u015b\u0107 istotna kwestia. Dobr\u0105 praktyk\u0105 jest oddelegowanie odczytywania, dekodowania i aplikowania ustawie\u0144 do zainteresowanego nimi komponentu. <\/p>\n<blockquote><p>Co to oznacza?<\/p><\/blockquote>\n<p>Kod &#8222;platformowy&#8221;, odczytuja zawarto\u015b\u0107 pliku JSON, przeparsuje go do pewnej struktury binarnej i przeka\u017ce jej fragment do aplikacji. Od tego momentu to sama aplikacja ma wiedzie\u0107 co dane ustawienia dla niej znacz\u0105 i jak je zinterpretowa\u0107. W ten spos\u00f3b zmniejszamy ilo\u015b\u0107 zale\u017cno\u015bci mi\u0119dzy cz\u0119\u015bci\u0105 platformow\u0105 a aplikacjami do niezb\u0119dnego minimum. Dodawanie nowych ustawie\u0144, parametr\u00f3w dla poszczeg\u00f3lnych sub-komponent\u00f3w nie b\u0119dzie wymaga\u0142o wprowadzania \u017cadnych zmian w platformie.<\/p>\n<blockquote><p>Tak sobie gadamy i gadamy&#8230; a co uda\u0142o si\u0119 dzi\u015b zrobi\u0107?<\/p><\/blockquote>\n<p>C\u00f3\u017c&#8230; uda\u0142o si\u0119 napisa\u0107 prosty, acz kompletny sk\u0142adniowo parser JSONa w j\u0119zyku C. Tak, wiem &#8211; jest ca\u0142e mn\u00f3stwo gotowych bibliotek \ud83d\ude42 Niestety, \u017cadna z nich nie odpowiada\u0142a naszym wymaganiom, szczeg\u00f3lnie pod wzgl\u0119dem zarz\u0105dzania pami\u0119ci\u0105.<\/p>",
        "protected": false
    },
    "excerpt": {
        "rendered": "<p>Wczoraj zastanawiali\u015bmy si\u0119 nad wyborem sposobu przechowywania ustawie\u0144 u\u017cytkownika w naszym systemie. Finalnie zapad\u0142a decyzja o u\u017cyciu jednego z dost\u0119pnych format\u00f3w tekstowych, g\u0142\u00f3wnie ze wzgl\u0119du na wygod\u0119 u\u017cycia i wsteczn\u0105 kompatybilno\u015b\u0107 mi\u0119dzy wersjami software&#8217;u. Oczywi\u015bcie wci\u0105\u017c otwarta pozostaje kwestia doprecyzowania kt\u00f3ry dok\u0142adnie format wybra\u0107: XML, JSON czy mo\u017ce YAML. Ka\u017cdy z nich ma swoje wady [&hellip;]<\/p>",
        "protected": false
    },
    "author": 1,
    "featured_media": 789,
    "comment_status": "closed",
    "ping_status": "open",
    "sticky": false,
    "template": "",
    "format": "standard",
    "meta": {
        "footnotes": ""
    },
    "categories": [
        3
    ],
    "tags": [],
    "class_list": {
        "0": "post-786",
        "1": "post",
        "2": "type-post",
        "3": "status-publish",
        "4": "format-standard",
        "5": "has-post-thumbnail",
        "6": "hentry",
        "7": "category-stodni",
        "9": "post-with-thumbnail",
        "10": "post-with-thumbnail-large"
    },
    "_links": {
        "self": [
            {
                "href": "https:\/\/hayperek.pl\/pl_pl\/wp-json\/wp\/v2\/posts\/786",
                "targetHints": {
                    "allow": [
                        "GET"
                    ]
                }
            }
        ],
        "collection": [
            {
                "href": "https:\/\/hayperek.pl\/pl_pl\/wp-json\/wp\/v2\/posts"
            }
        ],
        "about": [
            {
                "href": "https:\/\/hayperek.pl\/pl_pl\/wp-json\/wp\/v2\/types\/post"
            }
        ],
        "author": [
            {
                "embeddable": true,
                "href": "https:\/\/hayperek.pl\/pl_pl\/wp-json\/wp\/v2\/users\/1"
            }
        ],
        "replies": [
            {
                "embeddable": true,
                "href": "https:\/\/hayperek.pl\/pl_pl\/wp-json\/wp\/v2\/comments?post=786"
            }
        ],
        "version-history": [
            {
                "count": 3,
                "href": "https:\/\/hayperek.pl\/pl_pl\/wp-json\/wp\/v2\/posts\/786\/revisions"
            }
        ],
        "predecessor-version": [
            {
                "id": 790,
                "href": "https:\/\/hayperek.pl\/pl_pl\/wp-json\/wp\/v2\/posts\/786\/revisions\/790"
            }
        ],
        "wp:featuredmedia": [
            {
                "embeddable": true,
                "href": "https:\/\/hayperek.pl\/pl_pl\/wp-json\/wp\/v2\/media\/789"
            }
        ],
        "wp:attachment": [
            {
                "href": "https:\/\/hayperek.pl\/pl_pl\/wp-json\/wp\/v2\/media?parent=786"
            }
        ],
        "wp:term": [
            {
                "taxonomy": "category",
                "embeddable": true,
                "href": "https:\/\/hayperek.pl\/pl_pl\/wp-json\/wp\/v2\/categories?post=786"
            },
            {
                "taxonomy": "post_tag",
                "embeddable": true,
                "href": "https:\/\/hayperek.pl\/pl_pl\/wp-json\/wp\/v2\/tags?post=786"
            }
        ],
        "curies": [
            {
                "name": "wp",
                "href": "https:\/\/api.w.org\/{rel}",
                "templated": true
            }
        ]
    }
}