<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>cynar.ski</title>
    <link>https://cynar.ski/</link>
    <description>Recent content on cynar.ski</description>
    <generator>Hugo -- 0.146.7</generator>
    <language>pl-PL</language>
    <lastBuildDate>Wed, 07 Jan 2026 09:49:21 +0000</lastBuildDate>
    <atom:link href="https://cynar.ski/feed.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>IoT - czyli prosta elektronika zwyczajnie for funn</title>
      <link>https://cynar.ski/posts/2026/01/iot---czyli-prosta-elektronika-zwyczajnie-for-funn/</link>
      <pubDate>Mon, 05 Jan 2026 23:33:37 +0000</pubDate>
      <guid>https://cynar.ski/posts/2026/01/iot---czyli-prosta-elektronika-zwyczajnie-for-funn/</guid>
      <description>&lt;p&gt;Grunt to dobry wkręt, zajawka lub jak to tam zwał. Ogólnie, masz wolne, siedzisz sobie patrząc (nie do końca tępo) w monitor. Masz gdzieś listę rzeczy, które chciałoby się zrobić. Widzisz kolejny wpis retro-maniaków, że podpięli stare Atari XT do czytnika USB (lub na odwrót). No i pyk… trafiło Cię jak z bicza… ESP32.&lt;/p&gt;
&lt;p&gt;Kiedyś tam kupiłeś sobie układ wroom, bo był w zajebistej promocji u Chińczyka, gdzieś też walają się jakieś inne układy, które kupiłeś bo była promka (grzech nie kupić… jakby pojęcie grzechu było dla Ciebie jakkolwiek istotne).&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Grunt to dobry wkręt, zajawka lub jak to tam zwał. Ogólnie, masz wolne, siedzisz sobie patrząc (nie do końca tępo) w monitor. Masz gdzieś listę rzeczy, które chciałoby się zrobić. Widzisz kolejny wpis retro-maniaków, że podpięli stare Atari XT do czytnika USB (lub na odwrót). No i pyk… trafiło Cię jak z bicza… ESP32.</p>
<p>Kiedyś tam kupiłeś sobie układ wroom, bo był w zajebistej promocji u Chińczyka, gdzieś też walają się jakieś inne układy, które kupiłeś bo była promka (grzech nie kupić… jakby pojęcie grzechu było dla Ciebie jakkolwiek istotne).</p>
<p>Wiecie jak to jest, zajawka to zajawka. Siadasz i zwyczajnie napierdalasz, aż skończysz. We współczesnym świecie niesamowite jest to, że tak naprawdę do wszystkiego masz dostęp z biurka. Siadasz, odpalasz jakiegoś swojego albo i nie swojego agenta AI i zaczynasz oddawać się zajawce. Nie tracisz dnia na szperanie i pogłębianie wiedzy o „zabawionym temacie”, ot po prostu prosisz o analizę odpowiedni jak ja to mówię „flow AI” (agent, mcp, chat, whatever…). Z jednej strony super, bo szybko zajawka wlatuje na grubo, gorzej z tym, że właśnie wchodzi za szybko, bo ta szybkość kosztuje :) Kosztuje realnie, kasę na tokeny, kasę na dodatkowe elementy. Zdradzieckie jest to, że teraz wszystko wyklikasz. Np. projekt płytki zlecisz online wgrywając pliki prototypu PCB. Projekt dla drukarki 3d zrobicie serwerem mcp i wyślecie na innej stronie żeby wydrukować. Wszystko przyjdzie po kilku dniach do paczkomatu.</p>
<h2 id="sensor-gestów-dla-homeassistant">Sensor gestów dla HomeAssistant</h2>
<p>Pierwszy projekt, który w czasie wolnym poczyniłem to prosty sensor ruchu ręki, który aktywuje odpowiednie webhooki w moim domowym home assistant. Na razie nie ma obudowy takiej ładnej dedykowanej, bo jeszcze ją projektuję (a w programach 3d nie jestem wymiataczem, ale <a href="https://github.com/ahujasid/blender-mcp]">blender-mcp</a> powinien pomóc).</p>
<p><img alt="AC1FA962-A9E1-4E85-BE2A-1FACB785AE88_1_105_c.jpeg" loading="lazy" src="/ob/AC1FA962-A9E1-4E85-BE2A-1FACB785AE88_1_105_c.jpeg"></p>
<p>Tak wygląda mój sensor. Kod sterownika i pełny flow uruchomienia znajdziecie na <a href="https://gitlab.com/automancer/iot/esp32-handsensor">gilab esp32-handsensor</a>, oczywiście sam kod CPP napisał LLM, architektura oraz samo podejście do tasków w <a href="https://taskfile.dev">taskfile</a> są moje, ale 80% kodu wygenerował agent AI (w tym przypadku Antropic).</p>
<p>Co jest w środku?</p>
<ul>
<li><a href="https://pl.aliexpress.com/item/1005009229869766.html">esp32 wroom</a></li>
<li><a href="https://pl.aliexpress.com/item/1005009029566480.html">PAJ7620</a></li>
</ul>
<p>Oczywiście układy znajdziecie na allegro czy w innych rodzimych serwisach, ale u chińczyka najtaniej, do zabawy ideolo :)</p>
<h2 id="e-ink-dashboard">E-ink dashboard</h2>
<p>Kolejnym projektem był prosty dashboard na wyświetlaczu e-ink, oparty również o ESP32 wroom, jak kupiło się kilka to trzeba je jakoś wykorzystać.</p>
<p>Kilka miesięcy temu, u chińczyka była bardzo fajna promocja na wyświetlacz <a href="https://pl.aliexpress.com/item/1005002311698459.html">HINK-E075A07-A0</a>. Leżał deko i się kurzył, więc warto było coś z tym zrobić.</p>
<p><img alt="AD24B228-FDAD-4399-9DBC-84F2A5ABCABF_1_105_c.jpeg" loading="lazy" src="/ob/AD24B228-FDAD-4399-9DBC-84F2A5ABCABF_1_105_c.jpeg"></p>
<p>Wyświetlacz nie jest idealny, ale jak już pisałem do zabawy (sami wiecie) :) Z wyświetlaczem już było deko więcej roboty niż z sensorem. Sam moduł HAT wyświetlacza jest pod RaspberyPI, na którym oczywiście uruchomiłem ten e-ink, żeby sprawdzic czy działa. Kolejnym krokiem było przeklikanie tego do ESP32, żeby sobie ułatwić połączenia użyłem płytki dev &lt;3 (bardzo polecam, wszystko ładnie śmiga).</p>
<p><img alt="CB8F3D8F-16FD-41A0-8112-5E3E99518E93_1_105_c.jpeg" loading="lazy" src="/ob/CB8F3D8F-16FD-41A0-8112-5E3E99518E93_1_105_c.jpeg"></p>
<p>Oczywiście kod, razem z całym stackiem znajdziecie <a href="https://gitlab.com/automancer/iot/esp32-einkdashboard">esp32-einkdashboard</a>, projekt pozwala na definiowanie w json dashboardów z kilkoma obsługiwanymi &ldquo;renderami&rdquo;. Dane pobierane z rest api, na ten moment wymagają dla każdego z typów wykresu konkretnego formatu danych, a w repozytorium jest mock serwera rest, który serwuje dane.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Serwer ACME lokalnie w labie</title>
      <link>https://cynar.ski/2025/09/14/acme-w-labie/</link>
      <pubDate>Sat, 13 Sep 2025 11:23:12 +0100</pubDate>
      <guid>https://cynar.ski/2025/09/14/acme-w-labie/</guid>
      <description>&lt;p&gt;Jak chyba prawie każdy, kto pracuje przy procesach jako DevOps posiadam homelab. Jakieś tam mikrotiki, jakieś proxmoxy, kubernetesy, usługi chmurowe&amp;hellip; wszystko spięte sieciami VPN. Taki ot standard.&lt;/p&gt;
&lt;p&gt;Czego zawsze brakuje w fajnym homelab? A przynajmniej u mnie tego długo nie było, głównie z racji braku czasu, szczypty lenistwa&amp;hellip; fajnego scentralizowanego PKI dla całego środowiska homelab. Mam vault pki, ale zarządzanie nim i przygotowanie wszystkich skryptów, które pozwalają na tworzenie cert chain dla różnych usług np. nginx, cert-manager, certy dla oprogramowania - sporo tego jest.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Jak chyba prawie każdy, kto pracuje przy procesach jako DevOps posiadam homelab. Jakieś tam mikrotiki, jakieś proxmoxy, kubernetesy, usługi chmurowe&hellip; wszystko spięte sieciami VPN. Taki ot standard.</p>
<p>Czego zawsze brakuje w fajnym homelab? A przynajmniej u mnie tego długo nie było, głównie z racji braku czasu, szczypty lenistwa&hellip; fajnego scentralizowanego PKI dla całego środowiska homelab. Mam vault pki, ale zarządzanie nim i przygotowanie wszystkich skryptów, które pozwalają na tworzenie cert chain dla różnych usług np. nginx, cert-manager, certy dla oprogramowania - sporo tego jest.</p>
<p>Pomyślałem, kurde, letsencrypt ma już 10 lat (jak ten czas leci, bo pamiętam moje pierwsze integracje z letsencryptem) i może warto by pójść tą drogą. ACME to już generalnie standard, autoryzacja via DNS, wszystko zautomatyzowane, bo większość oprogramowania ma wbudowanego klienta ACME, mamy certbot, mamy całą masę implementacji.</p>
<p>Poszperałem i znalazłem bardzo fajną usługę <a href="https://smallstep.com/docs/step-ca/">step-ca</a>, instalacja jest banalnie prosta. Można wykorzystać cały ekosystem smallstep, jednak na moje potrzeby chciałem tylko ACME. Choć ich ekosystem to naprawdę ciekawe rozwiązanie, więc zachęcam do lektury <a href="https://smallstep.com/docs/platform/core-concepts/">Core concepts</a></p>
<p>No dobra, tyle słowem wstępu. Deko mięcha.</p>
<pre class="mermaid mermaid-container">
    flowchart

  subgraph PUBLIC[&#34;Mój HQ&#34;]
    VPN[Headscale Server]
    DNS[(Headscale DNS&lt;br/&gt;*.para.net)]:::dns
    DNS --- VPN
  end

  subgraph LAB[&#34;Homelab&#34;]
    subgraph MYSZKA[&#34;Serwer zarządzający&lt;br/&gt;(systemd/docker)&#34;]
        SVC1[Usługi zarządcze / dashboard]
        SVC2[Inne serwisy self-hosted]
        STEPCA[&#34;Serwer step-ca&#34;]
    end

    subgraph PMX[&#34;Serwer Proxmox&#34;]
      subgraph VMS[&#34;VM-ki na Proxmox&#34;]
        GL[VM: GitLab]:::vm
        GR[VM: GitLab Runner]:::vm
        K8S[VM: Kubernetes]:::vm
      end
    end
  end

  VPN &lt;--&gt; MYSZKA
  VPN &lt;--&gt; PMX
  VPN &lt;--&gt; GL
  VPN &lt;--&gt; GR
  VPN &lt;--&gt; K8S
  VPN &lt;--&gt; STEPCA

  STEPCA ==&gt;|ACME/letsencrypt&lt;br/&gt;crt: gitlab.para.net| GL
  STEPCA ==&gt;|ACME/cert-manager&lt;br/&gt;crt: k8s.para.net| K8S

  DNS ==&gt; SVC1
  DNS ==&gt; SVC2

  STEPCA ==&gt; |ACME/certbot&lt;br/&gt;crt: yyy.para.net| SVC1
  STEPCA ==&gt; |ACME/certbot&lt;br/&gt;crt: xxx.para.net| SVC2
  </pre>
<p>Tak poglądowo wygląda infrastruktura rozwiązania. Realnie jest teko więcej, ale dla wizualizacji wystarczy.</p>
<p>Na serwerze zarządzającym mam postawionego Debiana, więc instalacja step-ca to zwyczajnie</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>apt-get update <span style="color:#f92672">&amp;&amp;</span> apt-get install -y --no-install-recommends curl vim gpg ca-certificates
</span></span><span style="display:flex;"><span>curl -fsSL https://packages.smallstep.com/keys/apt/repo-signing-key.gpg -o /etc/apt/trusted.gpg.d/smallstep.asc <span style="color:#f92672">&amp;&amp;</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    echo <span style="color:#e6db74">&#39;deb [signed-by=/etc/apt/trusted.gpg.d/smallstep.asc] https://packages.smallstep.com/stable/debian debs main&#39;</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    | tee /etc/apt/sources.list.d/smallstep.list
</span></span><span style="display:flex;"><span>apt-get update <span style="color:#f92672">&amp;&amp;</span> apt-get -y install step-cli step-ca
</span></span></code></pre></div><p>Odsyłam na stronę producenta - <a href="https://smallstep.com/docs/step-ca/installation/">Step-ca installation</a></p>
<p>Po instalacji uruchamiamy inicjalizację usługi, u mnie deko odpuściłem security, z racji laba i uroszczenia sobie tematu, oczywiście nie jest to koszerne, ale w labie czasami sobie folguję. :)</p>
<p>Z użytkownika <code>root</code> (choć lepiej to uruchomić na jakimś dedykowanym pod usługę)</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>step ca init <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>  --name <span style="color:#e6db74">&#34;Lab CA&#34;</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>  --dns <span style="color:#e6db74">&#34;ca.para.net&#34;</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>  --address <span style="color:#e6db74">&#34;:9000&#34;</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>  --provisioner <span style="color:#e6db74">&#34;admin&#34;</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>  --deployment-type standalone <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>  --password-file &lt;<span style="color:#f92672">(</span>echo <span style="color:#e6db74">&#34;SuperDuperHasło&#34;</span><span style="color:#f92672">)</span>
</span></span></code></pre></div><p>Ta komenda stworzy nam strukturę plików i katalogów w <code>/root/.step/</code> znajdziecie tam, konfigurację, klucze, bazy etc&hellip;</p>
<p>Teraz service dla systemd <code>/etc/systemd/system/step-ca.service</code>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-plain" data-lang="plain"><span style="display:flex;"><span>[Unit]
</span></span><span style="display:flex;"><span>Description=Smallstep CA for para.net
</span></span><span style="display:flex;"><span>After=network.target
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>[Service]
</span></span><span style="display:flex;"><span>User=root
</span></span><span style="display:flex;"><span>Group=root
</span></span><span style="display:flex;"><span>ExecStart=/usr/bin/step-ca --password-file /root/.step/secrets/password.txt /root/.step/config/ca.json
</span></span><span style="display:flex;"><span>WorkingDirectory=/root/.step
</span></span><span style="display:flex;"><span>Restart=on-failure
</span></span><span style="display:flex;"><span>AmbientCapabilities=CAP_NET_BIND_SERVICE
</span></span><span style="display:flex;"><span>LimitNOFILE=1048576
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>[Install]
</span></span><span style="display:flex;"><span>WantedBy=multi-user.target
</span></span></code></pre></div><p>w pliku <code>/root/.step/secrets/password.txt</code> odkładamy nasze hasło, które podaliśmy przy <code>init</code></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo systemctl daemon-reload
</span></span><span style="display:flex;"><span>sudo systemctl enable --now step-ca
</span></span><span style="display:flex;"><span>sudo systemctl status step-ca
</span></span></code></pre></div><p>Po instalacji nasz serwer step-ca nie posiada jeszcze provisionera acme, więc dodajemy:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>step ca provisioner add acme --type ACME
</span></span></code></pre></div><p>Nasz root CA znajdziecie na <code>https://ca.para.net:9000/roots.pem</code>, przygotowałem na szybko <a href="https://git.cynarski.pl/public/homelab-acme-step-ca/raw/tag/1.0.0/install-root-ca.sh">install-root-ca.sh</a>, który pozwala na szybką instalację root certyfikatu dla systemów debianowych i redhatowych.</p>
<p>To generalnie tyle w temacie instalacji, teraz przykład użycia dla certbot:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>certbot --nginx <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>  -d homepage.para.net <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>  --server <span style="color:#e6db74">&#34;https://ca.para.net:9000/acme/acme/directory&#34;</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>  --agree-tos -m admin@para.net --non-interactive
</span></span></code></pre></div><p>Przykładowo dla cert-managera:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">apiVersion</span>: <span style="color:#ae81ff">cert-manager.io/v1</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">kind</span>: <span style="color:#ae81ff">ClusterIssuer</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">metadata</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">name</span>: <span style="color:#ae81ff">acme</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">namespace</span>: <span style="color:#ae81ff">cert-manager</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">spec</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">acme</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">server</span>: <span style="color:#ae81ff">https://ca.para.net:9000/acme/acme/directory</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">email</span>: <span style="color:#ae81ff">admin@para.net</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">privateKeySecretRef</span>:
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">name</span>: <span style="color:#ae81ff">acme</span>
</span></span></code></pre></div><p>Polecam się pobawić i mieć w pełni zautomatyzowany system zarządzania certyfikatami w przestrzeni homelab.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Zabawa gopass i procesami</title>
      <link>https://cynar.ski/2025/07/13/gopass-w-procesie/</link>
      <pubDate>Wed, 16 Jul 2025 13:15:12 +0100</pubDate>
      <guid>https://cynar.ski/2025/07/13/gopass-w-procesie/</guid>
      <description>&lt;p&gt;Ostatnio rozkminiałem, zupełnie tak żeby się pobawić, proces pobierania secretów z repozytorium secretów. Sam używam &lt;a href=&#34;https://github.com/gopasspw/gopass&#34;&gt;gopass&lt;/a&gt;,
którego z pełną odpowiedzialnością polecam jako manager secretów. Jest oparty o git i gpg, potrafi w integracje systmowe, wiele źródeł. Ogólnie naprawdę fajna rzecz, jest on golangową 
implementacją &lt;a href=&#34;https://www.passwordstore.org/&#34;&gt;passwordstore&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Pomysł pojawił się w sumie przez przypadek, bo wykombinowałem sobie proces, który będzie w stanie tworzyć hasła i je gdzieś odkładać, ale nie chciałem jak zawsze ogarniać tego za pomocą dodatkowego
serwisu, ale zwykłego repozytorium.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Ostatnio rozkminiałem, zupełnie tak żeby się pobawić, proces pobierania secretów z repozytorium secretów. Sam używam <a href="https://github.com/gopasspw/gopass">gopass</a>,
którego z pełną odpowiedzialnością polecam jako manager secretów. Jest oparty o git i gpg, potrafi w integracje systmowe, wiele źródeł. Ogólnie naprawdę fajna rzecz, jest on golangową 
implementacją <a href="https://www.passwordstore.org/">passwordstore</a>.</p>
<p>Pomysł pojawił się w sumie przez przypadek, bo wykombinowałem sobie proces, który będzie w stanie tworzyć hasła i je gdzieś odkładać, ale nie chciałem jak zawsze ogarniać tego za pomocą dodatkowego
serwisu, ale zwykłego repozytorium.</p>
<p>No i sobie wymyśliłem coś takiego:</p>
<pre class="mermaid mermaid-container">
    flowchart TD
    A[Start CI/CD] --&gt; B[Pobranie obrazu dla procesu]
    B --&gt; C[secret GPG_PRIVATE_KEY]
    B --&gt; D[secret GPG_PUBLIC_KEY]
    B --&gt; E[secret SSH_PRIVATE_KEY]

    C &amp; D &amp; E --&gt; F[Configure GPG and SSH access]
    F --&gt; G[Clone repozytorium z secretami dla gopass]
    G --&gt; H[Inicjalizacja gopass i deszyfrowanie plików z hasłami za pomocą gpg]
    H --&gt; I[Export sekretów do zmiennych]
    I --&gt; J[Uruchomienie jobów z pobranymi secretami]
    J --&gt; K[Koniec]
  </pre>
<p>Całość oparłem o <a href="https://about.gitea.com/">gitea</a>, której używam od dawna, bo jak juz wiecie nie lubię swoich rzeczy trzymać na obcych serwerach :)</p>
<p>Dla testu zrobiłem sobie taki skrypt w pipeline:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>curl https://packages.gopass.pw/repos/gopass/gopass-archive-keyring.gpg | tee /usr/share/keyrings/gopass-archive-keyring.gpg &gt;/dev/null
</span></span><span style="display:flex;"><span>cat <span style="color:#e6db74">&lt;&lt; EOF | tee /etc/apt/sources.list.d/gopass.sources
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">Types: deb
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">URIs: https://packages.gopass.pw/repos/gopass
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">Suites: stable
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">Architectures: all amd64 arm64 armhf
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">Components: main
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">Signed-By: /usr/share/keyrings/gopass-archive-keyring.gpg
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">EOF</span>
</span></span><span style="display:flex;"><span>apt update
</span></span><span style="display:flex;"><span>apt install -y gopass gopass-archive-keyring
</span></span><span style="display:flex;"><span>echo <span style="color:#e6db74">&#34;</span><span style="color:#e6db74">${</span>{ secrets.GPG_PRIVATE_KEY <span style="color:#e6db74">}</span><span style="color:#e6db74">}&#34;</span> | gpg --batch --import
</span></span><span style="display:flex;"><span>echo <span style="color:#e6db74">&#34;</span><span style="color:#e6db74">${</span>{ secrets.GPG_PUBLIC_KEY <span style="color:#e6db74">}</span><span style="color:#e6db74">}&#34;</span> | gpg --batch --import
</span></span><span style="display:flex;"><span>mkdir -p ~/.ssh/
</span></span><span style="display:flex;"><span>echo <span style="color:#e6db74">&#34;</span><span style="color:#e6db74">${</span>{ secrets.SSH_PRIVATE_KEY <span style="color:#e6db74">}</span><span style="color:#e6db74">}&#34;</span> &gt; ~/.ssh/id_ed25519
</span></span><span style="display:flex;"><span>chmod <span style="color:#ae81ff">600</span> ~/.ssh/id_ed25519
</span></span><span style="display:flex;"><span>git clone ssh://gitea@git.cynarski.pl:65522/homelab/secrets.git <span style="color:#e6db74">&#34;</span><span style="color:#e6db74">${</span>PASSWORD_STORE_DIR<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>gpg --list-secret-keys
</span></span><span style="display:flex;"><span>gopass list
</span></span><span style="display:flex;"><span>gopass mounts
</span></span><span style="display:flex;"><span>gopass services/proxmox
</span></span><span style="display:flex;"><span>mkdir -p <span style="color:#e6db74">${</span>PASSWORD_STORE_DIR<span style="color:#e6db74">}</span>/process
</span></span><span style="display:flex;"><span>git config --global user.email <span style="color:#e6db74">&#34;ci@automancer.dev&#34;</span>
</span></span><span style="display:flex;"><span>git config --global user.name <span style="color:#e6db74">&#34;Process CI&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>echo <span style="color:#e6db74">&#34;ci@automancer.dev&#34;</span> &gt; <span style="color:#e6db74">${</span>PASSWORD_STORE_DIR<span style="color:#e6db74">}</span>/process/.gpg-id
</span></span><span style="display:flex;"><span>echo <span style="color:#66d9ef">$(</span>gopass pwgen -xn |head -n1<span style="color:#66d9ef">)</span> |gopass insert -m process/generated
</span></span><span style="display:flex;"><span>gopass sync
</span></span></code></pre></div><p>No i gra pięknie :D</p>
<p>Szybkie info odnośnie samego gopass i sposobu zapisywania i odczytywania haseł z repozytorium. Gopass używa do szyfrowania gpg, oraz przypisywania odbiorców (kluczy publicznych) dla store,
store to repozytotium i niestety gopass nie potrafi dla pojedynczych haseł robić różnych dostępów, ale potrafi to w kontekście katalogu (grupy). Służy to tego plik <code>.gpg-id</code> w którym zdefiniowane
są klucze, mające dostęp do pęku. Jeżeli w procesie chcemy zapisać hasło do repozytorium to musimy mieć zaimportowane wszystkie klucze publiczne, które są w pliku <code>.gpg-id</code> dla danego katalogu.</p>
<p>Dlatego komenda wyżej dodaje adres email klucza, który zapisuje i szyfruje hasło stworzone w procesie.</p>
<p>To tak w telegraficznym skrócie. Jak widzicie, rozwiązanie jest typowo labowe, bo produkcyjnie używamy do tego wyspecjalizowanych serwisów, ale dla laba i fajnych automatów w/g mnie jak znalazł :)</p>
<p>Poniżej output z procesu:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>gpg: directory <span style="color:#e6db74">&#39;/root/.gnupg&#39;</span> created
</span></span><span style="display:flex;"><span>gpg: keybox <span style="color:#e6db74">&#39;/root/.gnupg/pubring.kbx&#39;</span> created
</span></span><span style="display:flex;"><span>gpg: /root/.gnupg/trustdb.gpg: trustdb created
</span></span><span style="display:flex;"><span>gpg: key 419EFC3AA0B51C36: public key <span style="color:#e6db74">&#34;Process CI/CD (Process CI/CD) &lt;ci@automancer.dev&gt;&#34;</span> imported
</span></span><span style="display:flex;"><span>gpg: key 419EFC3AA0B51C36: secret key imported
</span></span><span style="display:flex;"><span>gpg: Total number processed: <span style="color:#ae81ff">1</span>
</span></span><span style="display:flex;"><span>gpg:               imported: <span style="color:#ae81ff">1</span>
</span></span><span style="display:flex;"><span>gpg:       secret keys read: <span style="color:#ae81ff">1</span>
</span></span><span style="display:flex;"><span>gpg:   secret keys imported: <span style="color:#ae81ff">1</span>
</span></span><span style="display:flex;"><span>gpg: key 419EFC3AA0B51C36: <span style="color:#e6db74">&#34;Process CI/CD (Process CI/CD) &lt;ci@automancer.dev&gt;&#34;</span> not changed
</span></span><span style="display:flex;"><span>gpg: Total number processed: <span style="color:#ae81ff">1</span>
</span></span><span style="display:flex;"><span>gpg:              unchanged: <span style="color:#ae81ff">1</span>
</span></span><span style="display:flex;"><span>Cloning into <span style="color:#e6db74">&#39;$CI_PROJECT_DIR/.secrets&#39;</span>...
</span></span><span style="display:flex;"><span>Warning: Permanently added <span style="color:#e6db74">&#39;[git.cynarski.pl]:65522&#39;</span> <span style="color:#f92672">(</span>ED25519<span style="color:#f92672">)</span> to the list of known hosts.
</span></span><span style="display:flex;"><span>/root/.gnupg/pubring.kbx
</span></span><span style="display:flex;"><span>------------------------
</span></span><span style="display:flex;"><span>sec   rsa3072 2025-07-12 <span style="color:#f92672">[</span>SC<span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>      7A50A5675DACE35863C6D38B419EFC3AA0B51C36
</span></span><span style="display:flex;"><span>uid           <span style="color:#f92672">[</span> unknown<span style="color:#f92672">]</span> Process CI/CD <span style="color:#f92672">(</span>Process CI/CD<span style="color:#f92672">)</span> &lt;ci@automancer.dev&gt;
</span></span><span style="display:flex;"><span>ssb   rsa3072 2025-07-12 <span style="color:#f92672">[</span>E<span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>gopass
</span></span><span style="display:flex;"><span>└── services/
</span></span><span style="display:flex;"><span>    └── proxmox
</span></span><span style="display:flex;"><span>No mounts
</span></span><span style="display:flex;"><span>tajnehaslo123
</span></span><span style="display:flex;"><span>⚠ Found untracked files: <span style="color:#f92672">[</span>process/.gpg-id<span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>🚥 Syncing with all remotes ...
</span></span><span style="display:flex;"><span><span style="color:#f92672">[</span>&lt;root&gt;<span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>   gitfs pull and push ... ⚠ Found untracked files: <span style="color:#f92672">[</span>process/.gpg-id<span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>OK <span style="color:#f92672">(</span>no changes<span style="color:#f92672">)</span>
</span></span><span style="display:flex;"><span>   <span style="color:#66d9ef">done</span>
</span></span><span style="display:flex;"><span>✅ All <span style="color:#66d9ef">done</span>
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>Pomysł na parametr stabilności procesu</title>
      <link>https://cynar.ski/2025/07/14/pomysl-na-indeks-stabilnosci/</link>
      <pubDate>Sun, 13 Jul 2025 23:37:12 +0100</pubDate>
      <guid>https://cynar.ski/2025/07/14/pomysl-na-indeks-stabilnosci/</guid>
      <description>&lt;p&gt;Praca czasami skłania do śmiesznych kombinacji, akuratnie u mnie często pojawia się problem &amp;ldquo;stabilności procesu&amp;rdquo;, za cholerę nie mam pojęcia czym ta stabilność mogłaby być mierzona, ale siedziałem i kombinowałem, jak takową opisać i to za pomocą zmiennego algorytmu. Głównie chodzi o zbieranie prostych danych, które potem w razie potrzeby należy podstawić pod algorytm, żeby uzyskać odpowiednią wartość liczbową, najlepiej reprezentowaną w przedziale od &amp;ldquo;kicha&amp;rdquo; do &amp;ldquo;zajebiście&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Nazwałem sobie to:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Praca czasami skłania do śmiesznych kombinacji, akuratnie u mnie często pojawia się problem &ldquo;stabilności procesu&rdquo;, za cholerę nie mam pojęcia czym ta stabilność mogłaby być mierzona, ale siedziałem i kombinowałem, jak takową opisać i to za pomocą zmiennego algorytmu. Głównie chodzi o zbieranie prostych danych, które potem w razie potrzeby należy podstawić pod algorytm, żeby uzyskać odpowiednią wartość liczbową, najlepiej reprezentowaną w przedziale od &ldquo;kicha&rdquo; do &ldquo;zajebiście&rdquo;.</p>
<p>Nazwałem sobie to:</p>
<h2 id="indeks-stabilności-procesu-cicd">Indeks Stabilności Procesu CI/CD</h2>
<p>Indeks stabilności procesu $S$ służy do oceny, na ile proces CI/CD jest <strong>przewidywalny i odporny na zakłócenia</strong>. Im wartość indeksu bliższa 1, tym proces jest <strong>bardziej stabilny</strong>. Wartość poniżej 0.6 może sugerować problemy systemowe lub inżynierskie. W przykładzie chodzi o podejście a nie konkretne rozwiązanie, głównie na zadadzie normalizacji danych oraz określenia wzoru do którego można by podstawiać konkretne wartości wraz z wagami.</p>
<h3 id="wzór-ogólny">Wzór ogólny:</h3>
<div class="math-block">
    $$S = \frac{1}{1 &#43; w_E \cdot \hat{E} &#43; w_R \cdot \hat{R} &#43; w_F \cdot \hat{F} &#43; w_T \cdot \hat{T} &#43; w_{Re} \cdot \hat{Re} &#43; w_D \cdot \hat{D}}$$
</div>
<p>Gdzie:</p>
<p>$\hat{E}$ — znormalizowana liczba zapytań do systemów zewnętrznych (External Calls)<br>
$\hat{R}$ — znormalizowana konsumpcja zasobów (CPU, RAM, IO)<br>
$\hat{F}$ — znormalizowana liczba błędnych przebiegów (Failures)<br>
$\hat{T}$ — znormalizowany czas trwania procesu (Duration)<br>
$\hat{Re}$ — znormalizowana liczba ponownych uruchomień procesu (Retries)<br>
$\hat{D}$ — znormalizowana liczba błędów zależności zewnętrznych (Dependency Failures)</p>
<p>Wagi:</p>
<div class="math-block">
    $$w_E &#43; w_R &#43; w_F &#43; w_T &#43; w_{Re} &#43; w_D = 1$$
</div>
<p>Dla równomiernego rozkładu:</p>
<div class="math-block">
    $$w_E = w_R = w_F = w_T = w_{Re} = w_D = \frac{1}{6}$$
</div>
<hr>
<h3 id="normalizacja-danych">Normalizacja danych</h3>
<p>Każda zmienna $X$ jest normalizowana do przedziału $[0, 1]$ przy pomocy wzoru:</p>
<div class="math-block">
    $$\hat{X} = \frac{X - X_{\min}}{X_{\max} - X_{\min}}$$
</div>
<hr>
<h3 id="możliwa-interpretacja">Możliwa interpretacja:</h3>
<table>
  <thead>
      <tr>
          <th>Wartość indeksu ( S )</th>
          <th>Znaczenie</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>0.85 – 1.00</td>
          <td>Proces stabilny</td>
      </tr>
      <tr>
          <td>0.65 – 0.85</td>
          <td>Proces umiarkowanie stabilny</td>
      </tr>
      <tr>
          <td>0.50 – 0.65</td>
          <td>Oznaki niestabilności</td>
      </tr>
      <tr>
          <td>&lt; 0.50</td>
          <td>Proces niestabilny (wymaga interwencji)</td>
      </tr>
  </tbody>
</table>
<hr>
<h3 id="przykład-obliczenia-indeksu-stabilności">Przykład obliczenia indeksu stabilności</h3>
<p>Załóżmy, że dla danego tygodnia mamy następujące wartości surowe:</p>
<table>
  <thead>
      <tr>
          <th>Parametr</th>
          <th>Symbol</th>
          <th>Wartość</th>
          <th>Zakres obserwowany</th>
          <th>Normalizacja \( \hat{X} \)</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Zapytania zewnętrzne</td>
          <td>\( E \)</td>
          <td>25</td>
          <td>[15, 40]</td>
          <td>\( \hat{E} = \frac{25 - 15}{40 - 15} = 0.4 \)</td>
      </tr>
      <tr>
          <td>Konsumpcja CPU/h</td>
          <td>\( R \)</td>
          <td>2.5</td>
          <td>[2.0, 3.5]</td>
          <td>\( \hat{R} = \frac{2.5 - 2.0}{3.5 - 2.0} = 0.333 \)</td>
      </tr>
      <tr>
          <td>Liczba błędów</td>
          <td>\( F \)</td>
          <td>6</td>
          <td>[2, 10]</td>
          <td>\( \hat{F} = \frac{6 - 2}{10 - 2} = 0.5 \)</td>
      </tr>
      <tr>
          <td>Czas trwania (minuty)</td>
          <td>\( T \)</td>
          <td>14</td>
          <td>[11, 20]</td>
          <td>\( \hat{T} = \frac{14 - 11}{20 - 11} = 0.333 \)</td>
      </tr>
      <tr>
          <td>Retry (ponowne uruchomienia)</td>
          <td>\( Re \)</td>
          <td>2</td>
          <td>[0, 5]</td>
          <td>\( \hat{Re} = \frac{2 - 0}{5 - 0} = 0.4 \)</td>
      </tr>
      <tr>
          <td>Błędy zależności</td>
          <td>\( D \)</td>
          <td>1</td>
          <td>[0, 3]</td>
          <td>\( \hat{D} = \frac{1 - 0}{3 - 0} = 0.333 \)</td>
      </tr>
  </tbody>
</table>
<p>Przyjmując równe wagi:</p>
<p>\[
w_E = w_R = w_F = w_T = w_{Re} = w_D = \frac{1}{6}
\]</p>
<p>Obliczamy indeks stabilności:</p>
<p>\[
S = \frac{1}{1 + \frac{1}{6}(0.4 + 0.333 + 0.5 + 0.333 + 0.4 + 0.333)} = \frac{1}{1 + \frac{1}{6} \cdot 2.299} \approx \frac{1}{1 + 0.383} \approx 0.723
\]</p>
<hr>
<p><strong>Wniosek:</strong><br>
Dla podanych danych indeks stabilności wynosi około \(0.72\), co oznacza umiarkowaną stabilność procesu. Warto obserwować retry oraz błędy, które mają znaczący wpływ na ten wynik.</p>
<p>Oczywiście jest to proof of concept, parametery użyte we wzorze można zmienić, mi chodziło raczej o mindset rozwiązania i podejście do metryki. Zapraszam do komentowania, bo jestem ciekaw jakie macie na to pomysł.</p>
]]></content:encoded>
    </item>
    <item>
      <title>sd i systemd gitwatch</title>
      <link>https://cynar.ski/2025/02/16/sd-gitwatch/</link>
      <pubDate>Sun, 16 Feb 2025 13:00:12 +0100</pubDate>
      <guid>https://cynar.ski/2025/02/16/sd-gitwatch/</guid>
      <description>&lt;p&gt;Od jakiegoś około roku czasu używam namiętnie &lt;a href=&#34;https://github.com/ianthehenry/sd&#34;&gt;sd&lt;/a&gt;, mega prosty i naprawdę wygody skrypt do organizowania skryptów powłoki.&lt;/p&gt;
&lt;p&gt;Kilka miesięcy temu do katalogu źródłowego zawierającego moje skrypty, czyli &lt;code&gt;$HOME/sd/&lt;/code&gt; podpiąłem sobie &lt;a href=&#34;https://github.com/gitwatch/gitwatch&#34;&gt;gitwatch&lt;/a&gt;. Dzięki temu każda zmiana leci od razu do mojego repozytorium ze skryptami, a co za tym idzie na wszystkich maszynkach, na których używam &lt;strong&gt;sd&lt;/strong&gt; mam je wszystkie dostępne.&lt;/p&gt;
&lt;p&gt;Mega fajna sprawa i naprawdę polecam taką konfigurację.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Od jakiegoś około roku czasu używam namiętnie <a href="https://github.com/ianthehenry/sd">sd</a>, mega prosty i naprawdę wygody skrypt do organizowania skryptów powłoki.</p>
<p>Kilka miesięcy temu do katalogu źródłowego zawierającego moje skrypty, czyli <code>$HOME/sd/</code> podpiąłem sobie <a href="https://github.com/gitwatch/gitwatch">gitwatch</a>. Dzięki temu każda zmiana leci od razu do mojego repozytorium ze skryptami, a co za tym idzie na wszystkich maszynkach, na których używam <strong>sd</strong> mam je wszystkie dostępne.</p>
<p>Mega fajna sprawa i naprawdę polecam taką konfigurację.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Nowe międzymordzie, czyli migracja na Hyprland</title>
      <link>https://cynar.ski/2025/01/22/nowe_miedzymordzie/</link>
      <pubDate>Wed, 22 Jan 2025 21:49:25 +0100</pubDate>
      <guid>https://cynar.ski/2025/01/22/nowe_miedzymordzie/</guid>
      <description>&lt;p&gt;Po długim czasie postanowiłem nareszcie zmienić menadżera okien, od lat używałem sway, a przed nim i3-gaps. Lubię minimalizm oraz rzeźbienie w konfiguracji, po prostu mnie to bawi i sprawa perwersyjną przyjemność, tak jestem pelikanem dla kontentu z &lt;a href=&#34;https://www.reddit.com/r/unixporn/&#34;&gt;/r/unixporn&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Nie byłbym sobą, jakbym deko bardziej nie rozpoczął bajania o moich przygodach z unixowym międzymordziem. Zaparz sobie kawę.&lt;/p&gt;
&lt;p&gt;Już w czasach, kiedy stały dostęp do sieci był marzeniem, moim systemem był stary dobry Slackware, prosty, architektonicznie minimalistyczny bo oparty o BSD4 no i praktycznie wszystkie pakiety na płytkach w pisemkach, czego chcieć więcej?&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Po długim czasie postanowiłem nareszcie zmienić menadżera okien, od lat używałem sway, a przed nim i3-gaps. Lubię minimalizm oraz rzeźbienie w konfiguracji, po prostu mnie to bawi i sprawa perwersyjną przyjemność, tak jestem pelikanem dla kontentu z <a href="https://www.reddit.com/r/unixporn/">/r/unixporn</a>.</p>
<p>Nie byłbym sobą, jakbym deko bardziej nie rozpoczął bajania o moich przygodach z unixowym międzymordziem. Zaparz sobie kawę.</p>
<p>Już w czasach, kiedy stały dostęp do sieci był marzeniem, moim systemem był stary dobry Slackware, prosty, architektonicznie minimalistyczny bo oparty o BSD4 no i praktycznie wszystkie pakiety na płytkach w pisemkach, czego chcieć więcej?</p>
<p>Już wtedy stroniłem od kombajnów graficznych takich jak Gnome, czy KDE. Komputer, który miałem wtedy Pentium 100 deko pocił się po włączeniu takich kobył, więc szukałem alternatyw. Wtedy był to <a href="https://www.windowmaker.org/">windowmaker</a>, fajny, inny od standardowych look like windows. Potem długo używałem <a href="https://www.fvwm.org/">fwvm</a> i cudownej nakładki <a href="https://fvwm-crystal.sourceforge.io/">fvwm-crystal</a>.</p>
<p>W między czasie pod maską zmieniały się dystrybucje linuxa, <a href="https://www.debian.org/">Debian</a> jeszcze  <a href="https://www.debian.org/releases/potato/">potato</a>, <a href="https://www.gentoo.org/">Gentoo</a> (tylko ze stage 1) i <a href="https://www.pld-linux.org/">PLD</a> z nieśmiertelnym <a href="http://poldek.pld-linux.org/">poldkiem</a> (chyba jedyna dystrybucja rpm&rsquo;owa którą naprawdę lubiłem i nieoceniony <code>/dev/drzewo</code>). Romansowałem też swojego czasu na desktopie z <a href="https://www.freebsd.org/">FreeBSD</a>, a potem <a href="https://www.dragonflybsd.org/">DragonFly BSD</a>.</p>
<p>Kurde, jak tak to piszę i sobie przypominam te wszystkie zarwane nocki i rozkminy, to aż się ciepło rozczulam&hellip; eh :D</p>
<p>No dobra, ale wracając do międzymordzia, chwilkę używałem <a href="https://fluxbox.org/">fluxbox</a>, żeby potem odkryć <a href="https://github.com/0intro/wmii">wmii</a>, w którym się po prostu zakochałem. Nie dość, że adresował wszystkie moje potrzeby, to dodatkowo czerpał z mojego ulubionego unix&rsquo;a, który niestety średnio nadawał się na desktop, czyli <a href="https://9p.io/plan9/">Plan9</a>.</p>
<p>Przez kilka lat używania wmii moje oczy zwróciły się w stronę stajni Apple, jak chyba większości ówczesnych developerów PLD (he he) i tak zostało przez długie lata. A wszystko zaczęło się od <a href="https://www.szarlotka.pl/">szarlotka.pl</a>.</p>
<p>Po ponad dekadzie używania maków, zaczął mnie system z pod egidy nadgryzionego jabłka dość irytować, problemy z uruchamianiem docker, odchodzenie od miłych rozwiązań unix (wtedy chyba wszystkie firmy, które początkowo bazowały na naprawdę fajnych standardach stworzonych przez środowisko Wolnego Oprogramowania zaczynały coraz bardziej zamykać swoje ekosystemy. Pewnie niektórzy jeszcze pamiętają udostępnianie divx za pomocą wczesnej bety gmail).</p>
<p>Po powrocie do linuxa świat graficzny zmienił się diametralnie. Xorg trącił myszką, na salony zaczynał wchodzić wayland. Moje stare środowisko graficzne też już było deko leciwe i zacząłem szukać czegoś nowego. Oczywiście szukałem w stajni środowisk podobnych do <code>wmii</code>, na tapecie wylądował <a href="https://i3wm.org/">i3</a>. Lekki, wręcz ascetyczny. Z bardzo fajnie zaprojektowanym IPC, przypominającym stare dobre rozwiązanie z <code>wmii</code> bazujące na <a href="https://en.wikipedia.org/wiki/9P_%28protocol%29">p9</a>. Kilka miesięcy na <strong>i3</strong> i wewnętrzna potrzeba migracji na wayland. Nowe poszukiwania i na tapecie w sumie na kilka lat pojawił się <a href="https://swaywm.org/">sway</a> - to nie ukrywam był strzał w 10tkę :)</p>
<p>To tyle słowem wstępu.</p>
<p>Niedawno przesiadłem się na <a href="https://hyprland.org/">Hyperland</a>, architektonicznie przyjemnie zrobiony, oczywiście z IPC, który jest praktycznie klonem tego ze <strong>sway</strong>, więc migracja była uproszczona, ale przysporzyła małych kłopotów.</p>
<p>Hyperland do wszystkiego co miał Sway dodaje miłe dla oka wykończenia okien, animacje. Oczywiście jego mechanika jest zgoła inna, ma inne zarządzanie wyświetlanymi oknami. Brak trybu scratchpad (co da się obejść prostymi skryptami). Jednak jako dość młody projekt cierpi jeszcze na problemy wieku dziecięcego, ale jak już wiecie lubię grzebanie, więc dla mnie bomba 😍</p>
]]></content:encoded>
    </item>
    <item>
      <title>Testowanie Skryptów Powłoki</title>
      <link>https://cynar.ski/2025/01/12/testowanie_skryptow_powloki/</link>
      <pubDate>Sun, 12 Jan 2025 17:50:03 +0100</pubDate>
      <guid>https://cynar.ski/2025/01/12/testowanie_skryptow_powloki/</guid>
      <description>&lt;p&gt;Ostatnio było o tym, jak spowodować, że nasz stary skryptowy pierdolnik był bardziej stabilny i przewidywalny. No super, to może pobawmy się bardziej procesem testowania i rozważeniem dostępnych opcji związanych z testowaniem skryptów.&lt;/p&gt;
&lt;h1 id=&#34;co-wybrać-i-dlaczego&#34;&gt;Co wybrać i dlaczego?&lt;/h1&gt;
&lt;h1 id=&#34;popularne-frameworki-do-testowania-skryptów-powłoki&#34;&gt;Popularne frameworki do testowania skryptów powłoki&lt;/h1&gt;
&lt;p&gt;Poniżej znajduje się zestawienie kilku najpopularniejszych frameworków i narzędzi służących do testowania skryptów powłoki, wraz z krótkim omówieniem i porównaniem ich głównych cech.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;1-bats-bash-automated-testing-system&#34;&gt;1. Bats (Bash Automated Testing System)&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Opis&lt;/strong&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Ostatnio było o tym, jak spowodować, że nasz stary skryptowy pierdolnik był bardziej stabilny i przewidywalny. No super, to może pobawmy się bardziej procesem testowania i rozważeniem dostępnych opcji związanych z testowaniem skryptów.</p>
<h1 id="co-wybrać-i-dlaczego">Co wybrać i dlaczego?</h1>
<h1 id="popularne-frameworki-do-testowania-skryptów-powłoki">Popularne frameworki do testowania skryptów powłoki</h1>
<p>Poniżej znajduje się zestawienie kilku najpopularniejszych frameworków i narzędzi służących do testowania skryptów powłoki, wraz z krótkim omówieniem i porównaniem ich głównych cech.</p>
<hr>
<h2 id="1-bats-bash-automated-testing-system">1. Bats (Bash Automated Testing System)</h2>
<p><strong>Opis</strong></p>
<ul>
<li>Bats to jeden z najczęściej używanych frameworków do testowania skryptów Bash.</li>
<li>Pozwala pisać testy w sposób przypominający testy jednostkowe w językach wysokiego poziomu (np. w Pythonie, Javie).</li>
<li>Każdy test to osobna funkcja rozpoczynająca się od słowa <code>test_</code>, w której korzysta się z asercji.</li>
<li>Bats jest łatwy w konfiguracji i użytkowaniu, a wyniki testów pokazywane są w przyjaznej formie (PASSED/FAILED).</li>
</ul>
<p><strong>Zalety</strong></p>
<ul>
<li>Dobra dokumentacja i duże wsparcie społeczności.</li>
<li>Prosta składnia pozwala szybko rozpocząć pisanie testów.</li>
<li>Logi i wyniki testów prezentowane są w czytelnej formie.</li>
<li>Łatwa integracja z systemami CI/CD.</li>
</ul>
<p><strong>Wady</strong></p>
<ul>
<li>Skupia się głównie na Bashu – jeśli nasze skrypty muszą działać w różnych powłokach (sh, zsh itp.), może to być ograniczenie.</li>
<li>Rozszerzenia czy pluginy do bardziej zaawansowanych zastosowań wymagają dodatkowych narzędzi bądź forka (np. bats-core).</li>
</ul>
<p><strong>Link</strong></p>
<ul>
<li><a href="https://github.com/sstephenson/bats">Repozytorium Bats (oryginalne)</a></li>
<li><a href="https://github.com/bats-core/bats-core">Repozytorium bats-core</a></li>
</ul>
<hr>
<h2 id="2-shunit2">2. shUnit2</h2>
<p><strong>Opis</strong></p>
<ul>
<li>Lekki framework do testowania skryptów w POSIX shell (może działać z Bash, Dash, Zsh itd.).</li>
<li>Inspiruje się popularnym stylem xUnit, stąd nazwa (shUnit2).</li>
<li>Testy pisane są w postaci funkcji <code>testNazwa</code>, a asercje dostępne są za pomocą wbudowanych funkcji (np. <code>assertEquals</code>, <code>assertTrue</code> itp.).</li>
</ul>
<p><strong>Zalety</strong></p>
<ul>
<li>Działa w wielu powłokach, co bywa przydatne przy testowaniu skryptów, które muszą być przenośne.</li>
<li>Struktura testów jest przejrzysta i wzorowana na xUnit, więc dość intuicyjna.</li>
<li>Posiada wbudowane funkcje asercji i raportuje wyniki testów w standaryzowany sposób.</li>
</ul>
<p><strong>Wady</strong></p>
<ul>
<li>Mniej „przyjazny” format wyników w porównaniu z Bats (choć wciąż czytelny).</li>
<li>Nie jest aż tak popularny jak Bats – mniej przykładów w sieci i mniejsza społeczność, choć wciąż wystarczająca.</li>
</ul>
<p><strong>Link</strong></p>
<ul>
<li><a href="https://github.com/kward/shunit2">Repozytorium shUnit2</a></li>
</ul>
<hr>
<h2 id="3-shellspec">3. ShellSpec</h2>
<p><strong>Opis</strong></p>
<ul>
<li>ShellSpec to framework do testów w stylu BDD (Behavior-Driven Development) dla skryptów shellowych (POSIX/Bash).</li>
<li>Umożliwia pisanie testów w formie <code>Describe</code>/<code>It</code> i używania asercji w stylu „should equal”, „should match” itp.</li>
<li>Pozwala na tworzenie bardziej opisowych scenariuszy testowych.</li>
</ul>
<p><strong>Zalety</strong></p>
<ul>
<li>BDD może być bardziej czytelne dla osób nietechnicznych (testy w formie scenariuszy).</li>
<li>Obsługuje różne powłoki, w tym POSIX shell, Bash, Dash, Zsh.</li>
<li>Daje możliwość integracji z CI/CD i generowania raportów w różnych formatach (np. JUnit XML).</li>
</ul>
<p><strong>Wady</strong></p>
<ul>
<li>Mniejsza popularność niż Bats i mniejsza społeczność (choć nadal rośnie).</li>
<li>Dla niektórych składnia BDD może być mniej intuicyjna, jeśli przyzwyczajeni są do klasycznego stylu xUnit.</li>
</ul>
<p><strong>Link</strong></p>
<ul>
<li><a href="https://shellspec.info/">Oficjalna strona/repozytorium ShellSpec</a></li>
</ul>
<hr>
<h2 id="4-zunit">4. zUnit</h2>
<p><strong>Opis</strong></p>
<ul>
<li>zUnit to framework testowy przeznaczony głównie do Zsh, choć może działać też w innych powłokach (z ograniczeniami).</li>
<li>Również inspirowany konwencją xUnit.</li>
<li>Umożliwia integrację z takimi narzędziami jak Docker, Jenkins czy Travis CI.</li>
</ul>
<p><strong>Zalety</strong></p>
<ul>
<li>Dobrze integruje się z Zsh i potrafi wykorzystać jej specyficzne funkcjonalności.</li>
<li>Czytelna składnia, podobna do xUnit.</li>
<li>Możliwe równoległe uruchamianie testów w niektórych konfiguracjach.</li>
</ul>
<p><strong>Wady</strong></p>
<ul>
<li>Mniej uniwersalny – nastawiony przede wszystkim na Zsh, co może ograniczać przenośność testów.</li>
<li>Mniejsza społeczność i dokumentacja w porównaniu z Bats i shUnit2.</li>
</ul>
<p><strong>Link</strong></p>
<ul>
<li><a href="https://github.com/zunit-zsh/zunit">Repozytorium zUnit</a></li>
</ul>
<hr>
<h2 id="5-shpec">5. Shpec</h2>
<p><strong>Opis</strong></p>
<ul>
<li>Narzędzie testowe w stylu BDD podobne do RSpec (z Ruby).</li>
<li>Skupia się na prostocie składni: testy piszemy w blokach <code>describe</code>, <code>it</code> oraz używamy <code>assert</code>/<code>expect</code>.</li>
<li>Domyślnie działa w Bash, ale dość łatwo uruchomić go też w innych powłokach.</li>
</ul>
<p><strong>Zalety</strong></p>
<ul>
<li>BDD-owy styl testów bywa bardziej czytelny i opisowy.</li>
<li>Szybka konfiguracja i prostota użytkowania.</li>
<li>Dobry wybór, jeśli zależy nam na prostych testach w stylu „Spec”.</li>
</ul>
<p><strong>Wady</strong></p>
<ul>
<li>Mniejsza popularność niż Bats czy shUnit2, przez co wsparcie społeczności jest bardziej ograniczone.</li>
<li>Niekiedy brakuje rozbudowanych przykładów czy tutoriali.</li>
</ul>
<p><strong>Link</strong></p>
<ul>
<li><a href="https://github.com/rylnd/shpec">Repozytorium Shpec</a></li>
</ul>
<hr>
<h2 id="porównanie-w-pigułce">Porównanie w pigułce</h2>
<table>
  <thead>
      <tr>
          <th><strong>Nazwa</strong></th>
          <th><strong>Główna powłoka</strong></th>
          <th><strong>Styl testów</strong></th>
          <th><strong>Popularność (społeczność)</strong></th>
          <th><strong>Łatwość nauki</strong></th>
          <th><strong>Integracja CI/CD</strong></th>
          <th><strong>Główne zalety</strong></th>
          <th><strong>Potencjalne wady</strong></th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>Bats</strong></td>
          <td>Bash</td>
          <td>xUnit</td>
          <td>Bardzo duża</td>
          <td>Wysoka</td>
          <td>Łatwa (plug &amp; play)</td>
          <td>Prosta składnia, czytelne wyniki, duże wsparcie</td>
          <td>Dedykowany głównie Bash, mniejsza elastyczność</td>
      </tr>
      <tr>
          <td><strong>shUnit2</strong></td>
          <td>POSIX shell (wiele)</td>
          <td>xUnit</td>
          <td>Średnia</td>
          <td>Średnia</td>
          <td>Łatwa</td>
          <td>Uniwersalność wielu powłok, struktura xUnit</td>
          <td>Mniej „przyjazny” output, ograniczona liczba przykładów</td>
      </tr>
      <tr>
          <td><strong>ShellSpec</strong></td>
          <td>POSIX/Bash</td>
          <td>BDD</td>
          <td>Średnia/rośnie</td>
          <td>Średnia</td>
          <td>Łatwa</td>
          <td>Styl BDD, wsparcie wielu powłok, rozbudowane asercje</td>
          <td>Mniejsza społeczność, nieco bardziej rozbudowana konfiguracja</td>
      </tr>
      <tr>
          <td><strong>zUnit</strong></td>
          <td>Zsh</td>
          <td>xUnit</td>
          <td>Niewielka</td>
          <td>Średnia</td>
          <td>Łatwa</td>
          <td>Integracja z Zsh i jej funkcjonalności</td>
          <td>Mniejsza popularność, mocne powiązanie z Zsh</td>
      </tr>
      <tr>
          <td><strong>Shpec</strong></td>
          <td>Bash (pozostałe z pewnym nakładem)</td>
          <td>BDD</td>
          <td>Niewielka</td>
          <td>Wysoka</td>
          <td>Łatwa</td>
          <td>Prosty styl RSpec, minimalizm</td>
          <td>Mniejsza społeczność, ograniczona dokumentacja</td>
      </tr>
  </tbody>
</table>
<hr>
<h2 id="dodatkowe-narzędzia-wspierające-testowanie-i-jakość-skryptów">Dodatkowe narzędzia wspierające testowanie i jakość skryptów</h2>
<ul>
<li><strong>ShellCheck</strong> – narzędzie do statycznej analizy kodu powłoki. Nie jest to framework testowy, ale bardzo przydatne do wychwytywania błędów składniowych i potencjalnych błędów logicznych (np. niezainicjowane zmienne).</li>
<li><strong>shellcheck-action</strong> (GitHub Action) – integracja ShellCheck z GitHub Actions, przydatna w CI/CD.</li>
</ul>
<hr>
<h2 id="podsumowanie">Podsumowanie</h2>
<ul>
<li><strong>Bats</strong> (lub bardziej rozwijany <strong>bats-core</strong>) pozostaje najpopularniejszym rozwiązaniem do testowania skryptów w Bashu. Prosta składnia, duża społeczność oraz łatwa integracja sprawiają, że jest to najczęstszy wybór.</li>
<li>Jeżeli potrzebujesz testów przenośnych między różnymi powłokami, rozważ <strong>shUnit2</strong>, który jest bardziej zorientowany na POSIX.</li>
<li>Jeśli preferujesz podejście BDD i bardziej opisowe testy, <strong>ShellSpec</strong> będzie dobrą opcją – obsługuje kilka powłok i ma przyjemną składnię BDD.</li>
<li><strong>zUnit</strong> to opcja, gdy pracujesz przede wszystkim w Zsh i chcesz wykorzystać jej specyficzne funkcjonalności.</li>
<li><strong>Shpec</strong> jest ciekawą alternatywą w stylu BDD, lecz ma mniejszą społeczność i jest nieco mniej elastyczny od ShellSpec.</li>
</ul>
<p>Dobór frameworka zależy więc od:</p>
<ol>
<li>Wymagań co do przenośności (czy testy mają działać w różnych powłokach, czy wystarczy Bash/Zsh).</li>
<li>Preferencji stylistycznych (xUnit vs BDD).</li>
<li>Dostępności wsparcia i przykładowych testów (co często przekłada się na czas nauki).</li>
<li>Integracji z istniejącymi narzędziami CI/CD.</li>
</ol>
<p>Najbezpieczniejszym wyborem „na start” zazwyczaj jest <strong>Bats</strong>, głównie ze względu na mnogość przykładów, popularność i prostą składnię. Jeśli jednak Twoje skrypty muszą działać w środowiskach z różnymi powłokami (szczególnie w minimalistycznych Dockerach opartych o Dash), rozważ <strong>shUnit2</strong> lub <strong>ShellSpec</strong>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Shell w procesach ci/cd</title>
      <link>https://cynar.ski/2025/01/08/shell_w_procesach_cicd/</link>
      <pubDate>Wed, 08 Jan 2025 22:37:28 +0100</pubDate>
      <guid>https://cynar.ski/2025/01/08/shell_w_procesach_cicd/</guid>
      <description>&lt;p&gt;Przez lata pracy jako admin, potem developer, a aktualnie devops zawsze zachodzę w głowę dlaczego skrypty shell bardzo często wyglądają jakby były pisane na kolanie. Oczywiście nie zawsze, ale traktowanie skryptu bash/sh z reguły wygląda na zasadzie zrób po kolei to i to, nie ma porządnej parametryzacji, a o handlowaniu błędów to już w ogóle można zapomieć. Sam tak kiedyś robiłem, bo skrypt traktowałem jako taki nazwijmy to &amp;ldquo;pierdolnik&amp;rdquo; z komendami do wykonania i wsio. Ale to nie jest dobra droga, a już na pewno nie jest dobra w bardziej skomplikowanych procesach, które mają dużo zależności, konfiguracji i są rozczłonowane na wiele systemów i elementów. Traktując takie skrypty jak wspomniany już pierdolnik skończymy z wyrwanym owłosieniem, podkrążonymi i zalanymi szałem oczami, a przecież nie o to chodzi w fajnym i seksownym procesie.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Przez lata pracy jako admin, potem developer, a aktualnie devops zawsze zachodzę w głowę dlaczego skrypty shell bardzo często wyglądają jakby były pisane na kolanie. Oczywiście nie zawsze, ale traktowanie skryptu bash/sh z reguły wygląda na zasadzie zrób po kolei to i to, nie ma porządnej parametryzacji, a o handlowaniu błędów to już w ogóle można zapomieć. Sam tak kiedyś robiłem, bo skrypt traktowałem jako taki nazwijmy to &ldquo;pierdolnik&rdquo; z komendami do wykonania i wsio. Ale to nie jest dobra droga, a już na pewno nie jest dobra w bardziej skomplikowanych procesach, które mają dużo zależności, konfiguracji i są rozczłonowane na wiele systemów i elementów. Traktując takie skrypty jak wspomniany już pierdolnik skończymy z wyrwanym owłosieniem, podkrążonymi i zalanymi szałem oczami, a przecież nie o to chodzi w fajnym i seksownym procesie.</p>
<p>Po raz kolejny pisząc jakiś dokument w firmie dotyczący jak prawilnie napisać skrypt używany gdzieś w procesie CI/CD, postanowiłem zrobić do na blogu, który przecież jest online :)</p>
<p>Skrypt którego przepływ działania musi ładnie ogarniać error code, musi być odporny na złe wykonanie komend, lub błędną konfigurację środowiska istnieje i to nawet powiem więcej - istnieje na wyciągnięcie ręki, wystarczy poznać kilka prostych rzeczy i wziąć się do pracy, ale najpierw usiąść i przez kilkanaście minut pomyśleć czego tak naprawdę potrzebujemy.</p>
<h1 id="shebang-czyli-">Shebang, czyli <code>#!</code></h1>
<p>Ja wiem, że <code>#!</code> na początku skryptu to coś co po prostu jest, ale czy zastanawialiście się czym i dlatego jest shebang? Tak się nazywa ów zlepek magicznych znaków, mówi on kernelowi jakiego interpretera ma użyć dla wykonania komend zawartych w pliku. Dla ciekawskich, <a href="https://www.in-ulm.de/~mascheck/various/shebang/4.0BSD_newsys_sys1.c.html">Email od Denisa Ritchie z 1980</a> opisujący shebang, przy okazji - ja należę do tych, którzy płakali po Denisie, a po Jobsie mniej (między ich śmiercią było kila miesięcy). Miałem go nawet w terminalu <a href="https://github.com/LukeSmithxyz/voidrice/blob/master/.local/bin/unix">jako asciiart</a>, a i na ścianie się znajdzie :}</p>
<p>No dobra tyle wstępu, ale dlaczego o tym piszę? Otóż każdy kto chce stworzyć skrypt shell, którego środowisko uruchomieniowe nie do końca jest znane i kontrolowane chyba już wie do czego zmierzam, a mianowicie do <code>#!/bin/bash</code> na systemach redhatowych nie istnieje 😎, a jak używamy jakichś tam jak im było&hellip; kontenerów i to jeszcze o zgrozo zrobionych przez kogoś innego, kogo albo nie znamy, albo nie lubimy? No to używanie <code>#!/bin/bash</code> odpada. Nie lubimy hardcoded ścieżek, no ok ale to w takim razie jak to zrobić prawilnie? <code>#!/usr/bin/env bash</code> oo tak! <code>/usr/bin/env</code> ma więcej pozytywów, bo potrafi ogarniać środowisko uruchomieniowe, a to już w przypadku rozwiązań choćby <code>nodejs</code>, czy <code>python</code> jest bardzo wygodne.</p>
<h1 id="konfiguracja-interpretera-set">Konfiguracja interpretera <code>set</code></h1>
<p>Jak już nasz shebang ustawia odpowiedni interpreter, (skupmy się teraz na <code>bash</code>) to pora na odpowiednie skonfigurowanie owego, bo przecież chcemy mieć kontrolę nad zachowaniem, nie tylko kanalizacji w domu, ale też naszych skryptów, które nie mają już być &ldquo;pierdolnikiem&rdquo;.</p>
<p>Dobra to na początek pytanie, ile razy zdarzyło się Wam tak, że skrypt zakończył działanie poprawnie, ale pewne rzeczy się nie wykonały? Albo skrypt długo się wykonywał i nagle wyskoczył z errorem, że nie ma jakiejś zmiennej i bang&hellip; a działał na SageMaker na AWS, który właśnie uczył model, a błąd wyskoczył po 4 dniach pracy? Straciłeś kilka stówek i nie masz nic poza niesmakiem i naskórkiem pod paznokciami, który zdarłeś(aś) z lewego policzka.</p>
<p>A można było tego uniknąć jedną linijką w skrypcie, najlepiej zaraz po shebang, ha! A te kilka stówek to koszt tej nauki, a można było za to kupić taki <a href="https://www.fine-art.com.pl/cm-b-custom-micron-airbrush-0-18mm-in-roter-box.html">fajny areograf</a>&hellip; :D W naszym narzeczu nazywamy to &ldquo;frycowe&rdquo;</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>set -eaou pipefail
</span></span></code></pre></div><p>W przeliczeniu na ten areograf to drogie te ascii znaczki. Skoro takie drogie, to trzeba je dokładnie opisać, w końcu z jakiegoś powodu kosztują ile kosztują.</p>
<p><code>set -e</code> przerwij działanie skryptu przy błędzie, w przypadku komend które mogą zwrócić błąd w tym przypadku należy użyć konstrukcji <code>command_error_allowed || true</code></p>
<p><code>set -a</code> włącza exportowanie wszystkich utworzonych zmiennych do procesów podrzędnych, pewnie nie raz mieliście problem z brakiem zmiennej, która nie pojawiała się w kontekście skryptu uruchamianego ze skryptu.</p>
<p><code>set -u</code> wymuszenie błędu w przypadku braku definicji zmiennej wymaganej w działaniu skryptu, bardzo przydatna rzecz, ale wymaga zmiany podejścia do definiowania i używania zmiennych, bo przy jej użyciu każda zmienna użyta gdzieś w ciele skryptu <strong>musi</strong> być zdefiniowana i mieć jakąś domyślną wartość.</p>
<p><code>set -o pipefail</code> bardzo przytadna opcja, a mianowicie jeżeli używamy potoków w skryptach, to dzięki tej opcji interpreter zwraca status z pierwszego polecenia, które zakończyło się błędem. Domyślnie działa to tak, że zwraca błąd tylko z ostatniego (a to bardzo często powoduje dużo problemów)</p>
<p>Oczywiście opcji konfiguacji jest dużo więcej, więc odsyłam do <a href="https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html">dokumentacji bash na GNU</a></p>
<p>Jak lubicie mieć bardziej opisowo to wszystko ustawione, to można każdą rzecz ustawić za pomocą parametru <code>-o</code> np.:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>set -o allexport
</span></span><span style="display:flex;"><span>set -o errexit
</span></span><span style="display:flex;"><span>set -o nounset
</span></span><span style="display:flex;"><span>set -o pipefail
</span></span></code></pre></div><p>Możliwości jest wiele, wszystko zależy od wygody i potrzeb.</p>
<h1 id="funkcje">Funkcje</h1>
<p>Jak już automatyzujemy to często fajnie coś zamknać w reużywalną funkcję, ja mam kilka, których używam często i w wielu skryptach.</p>
<p>Czy faktycznie potrzebujemy funkcji w skryptach shell? Pewnie!</p>
<p>Przy każdym skrypcie, który wykonuje coś wiele razy, funkcja daje nam &ldquo;jeden punkt zmiany&rdquo;. Chodzi o to, że chcąc zmienić jakąś często wykonywaną komendę, albo sekwencję komend, zamiast robić to kilka lub kilkanaście razy w kodzie, zmieniamy coś w jednym miejscu.</p>
<p>Np. chcemy sobie coś zainstalować, ale nie wiemy do końca jakiego będziemy używali systemu, bo w firmie używane są RedHaty i Debiany, możemy sobie stworzyć funkcję <code>install</code>, która ogarnie taki temat w sposób mądrzejszy niż wklepywanie <code>apt-get install</code> lub <code>yum install</code></p>
<h2 id="deklaracja">Deklaracja</h2>
<p>W bash funkcja jest deklarowana za pomocą nazwy np.:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>install<span style="color:#f92672">()</span> <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>  echo <span style="color:#e6db74">&#34;Instalowanie&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span></code></pre></div><p>Bash nie umożliwia zdefiniowania wejścia w sposób jawny, robi się to inaczej, ale to tym za chwilę.</p>
<p>Wracając do przykładu z instalacją pakietów na RedHat lub Debian, musimy jakoś wykryć na jakim systemie pracujemy, żeby w skrypcie zobaczyć typ systemu najwygodniej skorzystać z <code>/etc/os-release</code> (polecam rzucić okiem na <a href="https://www.freedesktop.org/software/systemd/man/latest/os-release.html">freedesktop</a>)</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>install<span style="color:#f92672">()</span> <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>  . /etc/os-release
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">case</span> <span style="color:#e6db74">&#34;</span>$ID<span style="color:#e6db74">&#34;</span> in
</span></span><span style="display:flex;"><span>    debian|ubuntu<span style="color:#f92672">)</span>
</span></span><span style="display:flex;"><span>      apt-get install $1
</span></span><span style="display:flex;"><span>      ;;
</span></span><span style="display:flex;"><span>    rhel|centos|fedora<span style="color:#f92672">)</span>
</span></span><span style="display:flex;"><span>      yum install $1
</span></span><span style="display:flex;"><span>      ;;
</span></span><span style="display:flex;"><span>    *<span style="color:#f92672">)</span>
</span></span><span style="display:flex;"><span>      echo <span style="color:#e6db74">&#34;System is not supported&#34;</span>
</span></span><span style="display:flex;"><span>      exit <span style="color:#ae81ff">1</span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">esac</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span></code></pre></div><p>W funkcji wykorzystaliśmy też parametr, w bash funkcje działają jak komendy w powłoce, czyli nie definiujemy parametrów przy deklaracji funkcji, po prostu wykonujemy funkcję z parametrami, które w ciele funkcji pobieramy za pomocą <code>$1</code>, <code>$2</code> etc&hellip;</p>
<p>Teraz w skrypcie wykonując komendę <code>install vim</code> instalujemy po postu vim odpowiednim managerem pakietów w zależności od dystrybucji.</p>
<h2 id="przyśpieszenie-wykonywania">Przyśpieszenie wykonywania</h2>
<p>Podobnie jak w różnych językach programowania musimy zastanowić się, czy nasza funkcja jest napisana optymalnie, np. czy za każdym razem nie wykonuje zbędnych operacji, w tej powyżej widać, że przy każdym wykonaniu zaczytuje plik <code>/etc/os-release</code> - ale czy to ma sens? Zawsze to kilka dodatkowych taktów procesora.</p>
<h1 id="error-handling">Error handling</h1>
<p>Temat, który naprawdę często jest pomijany w skryptach powłoki, co niestety bardzo negatywnie wpływa na ich jakość i stabilność. Wspomniany już <code>pipefail</code> jest powodem tracenia masy czasu na sprawdzaniu co poszło źle w procesie, skoro wszystkie skrypty zakończyły się prawidłowo.</p>
<p>Każdy programista wie, że odpowiednio zaprojektowane wyjątki i error handlery to podstawa dobrej aplikacji. Tak samo musimy podchodzić do skryptów shell, bez tej świadomości Wasze procesy mogą mieć naprawdę dużą bezwładność.</p>
<p>Wyżej przy <code>set</code> opisałem <code>set -eo pipefail</code> czyli exit przy błędzie oraz zwracanie pierwszego błędu z potoku, takie ustawienie w znacznym stopniu poprawia kontrolę wykonywania skryptu i reakcje na błędy, ale to nie jest wszystko co musimy przemyśleć.</p>
<p>W przypadku <code>set -e</code> skrypt zakończy działanie przy <code>ERR</code>, często zdarza się, że będziemy potrzebowali wykonać komendy, które mogą zakończyć się błędem, ale nie będzie to powodowało przerwania działania skryptu. W takim przypadku musimy zastosować prostą sztuczkę:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e">#!/usr/bin/env bash
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>set -e
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>cat /tmp/jakis_se_pliczek <span style="color:#f92672">||</span> true
</span></span></code></pre></div><p>Powyższa konstrukcja powoduje, że jeżeli <code>cat /tmp/jakis_se_pliczek</code> zwróci błąd, czyli jeżeli pliku nie ma to interpreter wykona instrukcję <code>true</code>, dzieje się tak dlatego, że użyto w konstrukcji operatora &ldquo;lub&rdquo; (<code>||</code>), który maskuje ewentualne błędy z wykonania <code>cat</code>.</p>
<p>Często może się zdarzyć, że nasz skrypt podczas wykonywania wpływa na środowisko, np. zapisuje sobie jakieś dane w pliku, który na końcu wykonania skryptu musi być usunięty, ale podczas startu skryptu nie może istnieć.</p>
<p>Powyższy schemat może być problematyczny w przypadku, kiedy podczas wykonywania skryptu coś pójdzie nie tak i w połowie działania proces zakończy działanie. Plik zostanie i kolejne wykonanie skryptu albo nie dojdzie do skutku, albo przepływ będzie zupełnie inny niż spodziewany.</p>
<p>Co zrobić w takiej sytuacji?</p>
<p>Założyć pułapkę, czyli <code>trap</code>.</p>
<p>Pozwoli to na zdefiniowanie kodu, który wykona się po wystąpieniu odpowiedniego sygnału podczas działania skryptu.</p>
<p>Przykład użycia: <code>trap cleanup EXIT ERR SIGINT SIGTERM</code>, czyli <code>trap &lt;komenda&gt; &lt;lista sygnałów&gt;</code> same sygnały reprezentowane są za pomocą liczby lub nazwy.</p>
<p>Dostępne sygnały możemy sobie wylistować w powłoce za pomocą komendy <code>trap -l</code></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sh-5.2$ trap -l
</span></span><span style="display:flex;"><span> 1<span style="color:#f92672">)</span> SIGHUP	 2<span style="color:#f92672">)</span> SIGINT	 3<span style="color:#f92672">)</span> SIGQUIT	 4<span style="color:#f92672">)</span> SIGILL	 5<span style="color:#f92672">)</span> SIGTRAP
</span></span><span style="display:flex;"><span> 6<span style="color:#f92672">)</span> SIGABRT	 7<span style="color:#f92672">)</span> SIGBUS	 8<span style="color:#f92672">)</span> SIGFPE	 9<span style="color:#f92672">)</span> SIGKILL	10<span style="color:#f92672">)</span> SIGUSR1
</span></span><span style="display:flex;"><span>11<span style="color:#f92672">)</span> SIGSEGV	12<span style="color:#f92672">)</span> SIGUSR2	13<span style="color:#f92672">)</span> SIGPIPE	14<span style="color:#f92672">)</span> SIGALRM	15<span style="color:#f92672">)</span> SIGTERM
</span></span><span style="display:flex;"><span>16<span style="color:#f92672">)</span> SIGSTKFLT	17<span style="color:#f92672">)</span> SIGCHLD	18<span style="color:#f92672">)</span> SIGCONT	19<span style="color:#f92672">)</span> SIGSTOP	20<span style="color:#f92672">)</span> SIGTSTP
</span></span><span style="display:flex;"><span>21<span style="color:#f92672">)</span> SIGTTIN	22<span style="color:#f92672">)</span> SIGTTOU	23<span style="color:#f92672">)</span> SIGURG	24<span style="color:#f92672">)</span> SIGXCPU	25<span style="color:#f92672">)</span> SIGXFSZ
</span></span><span style="display:flex;"><span>26<span style="color:#f92672">)</span> SIGVTALRM	27<span style="color:#f92672">)</span> SIGPROF	28<span style="color:#f92672">)</span> SIGWINCH	29<span style="color:#f92672">)</span> SIGIO	30<span style="color:#f92672">)</span> SIGPWR
</span></span><span style="display:flex;"><span>31<span style="color:#f92672">)</span> SIGSYS	34<span style="color:#f92672">)</span> SIGRTMIN	35<span style="color:#f92672">)</span> SIGRTMIN+1	36<span style="color:#f92672">)</span> SIGRTMIN+2	37<span style="color:#f92672">)</span> SIGRTMIN+3
</span></span><span style="display:flex;"><span>38<span style="color:#f92672">)</span> SIGRTMIN+4	39<span style="color:#f92672">)</span> SIGRTMIN+5	40<span style="color:#f92672">)</span> SIGRTMIN+6	41<span style="color:#f92672">)</span> SIGRTMIN+7	42<span style="color:#f92672">)</span> SIGRTMIN+8
</span></span><span style="display:flex;"><span>43<span style="color:#f92672">)</span> SIGRTMIN+9	44<span style="color:#f92672">)</span> SIGRTMIN+10	45<span style="color:#f92672">)</span> SIGRTMIN+11	46<span style="color:#f92672">)</span> SIGRTMIN+12	47<span style="color:#f92672">)</span> SIGRTMIN+13
</span></span><span style="display:flex;"><span>48<span style="color:#f92672">)</span> SIGRTMIN+14	49<span style="color:#f92672">)</span> SIGRTMIN+15	50<span style="color:#f92672">)</span> SIGRTMAX-14	51<span style="color:#f92672">)</span> SIGRTMAX-13	52<span style="color:#f92672">)</span> SIGRTMAX-12
</span></span><span style="display:flex;"><span>53<span style="color:#f92672">)</span> SIGRTMAX-11	54<span style="color:#f92672">)</span> SIGRTMAX-10	55<span style="color:#f92672">)</span> SIGRTMAX-9	56<span style="color:#f92672">)</span> SIGRTMAX-8	57<span style="color:#f92672">)</span> SIGRTMAX-7
</span></span><span style="display:flex;"><span>58<span style="color:#f92672">)</span> SIGRTMAX-6	59<span style="color:#f92672">)</span> SIGRTMAX-5	60<span style="color:#f92672">)</span> SIGRTMAX-4	61<span style="color:#f92672">)</span> SIGRTMAX-3	62<span style="color:#f92672">)</span> SIGRTMAX-2
</span></span><span style="display:flex;"><span>63<span style="color:#f92672">)</span> SIGRTMAX-1	64<span style="color:#f92672">)</span> SIGRTMAX	
</span></span></code></pre></div><p>Pełny przykład:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e">#!/usr/bin/env bash
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>set -eaou pipefail
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>cleanup<span style="color:#f92672">()</span> <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>    echo <span style="color:#e6db74">&#34;Cleanup&#34;</span>
</span></span><span style="display:flex;"><span>    rm /tmp/jakis_tam_pliczek <span style="color:#f92672">||</span> true
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Set trap</span>
</span></span><span style="display:flex;"><span>trap cleanup EXIT ERR SIGINT SIGTERM
</span></span></code></pre></div><h1 id="pełny-przykład">Pełny przykład</h1>
<p>Poniższy plik może być szablonem dla Waszych entrypointów w kontenerach, lub skryptów wykonywanych w jakimś procesie CI/CD.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e">#!/usr/bin/env bash
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>set -eaou pipefail
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>declare -i term_width<span style="color:#f92672">=</span><span style="color:#ae81ff">120</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>VERBOSE<span style="color:#f92672">=</span><span style="color:#e6db74">${</span>VERBOSE<span style="color:#66d9ef">:-</span>false<span style="color:#e6db74">}</span>
</span></span><span style="display:flex;"><span>LOG_FILE<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;/tmp/script.log&#34;</span>
</span></span><span style="display:flex;"><span>DEPENDENCY<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;jq podman kubectl&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">if</span> <span style="color:#f92672">[</span> <span style="color:#e6db74">&#34;</span>$VERBOSE<span style="color:#e6db74">&#34;</span> <span style="color:#f92672">=</span> true <span style="color:#f92672">]</span>; <span style="color:#66d9ef">then</span>
</span></span><span style="display:flex;"><span>    set -o xtrace
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">fi</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>h1<span style="color:#f92672">()</span> <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>    declare border padding text
</span></span><span style="display:flex;"><span>    border<span style="color:#f92672">=</span><span style="color:#e6db74">&#39;\e[1;34m&#39;</span><span style="color:#e6db74">&#34;</span><span style="color:#66d9ef">$(</span>printf <span style="color:#e6db74">&#39;=%.0s&#39;</span> <span style="color:#66d9ef">$(</span>seq <span style="color:#ae81ff">1</span> <span style="color:#e6db74">&#34;</span>$term_width<span style="color:#e6db74">&#34;</span><span style="color:#66d9ef">))</span><span style="color:#e6db74">&#34;</span><span style="color:#e6db74">&#39;\e[0m&#39;</span>
</span></span><span style="display:flex;"><span>    padding<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;</span><span style="color:#66d9ef">$(</span>printf <span style="color:#e6db74">&#39; %.0s&#39;</span> <span style="color:#66d9ef">$(</span>seq <span style="color:#ae81ff">1</span> <span style="color:#66d9ef">$((</span><span style="color:#f92672">(</span>term_width <span style="color:#f92672">-</span> <span style="color:#66d9ef">$(</span>wc -m <span style="color:#f92672">&lt;&lt;&lt;</span><span style="color:#e6db74">&#34;</span>$*<span style="color:#e6db74">&#34;</span><span style="color:#66d9ef">)</span><span style="color:#f92672">)</span> <span style="color:#f92672">/</span> <span style="color:#ae81ff">2</span><span style="color:#66d9ef">))))</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>    text<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;\\e[1m</span>$*<span style="color:#e6db74">\\e[0m&#34;</span>
</span></span><span style="display:flex;"><span>    echo -e <span style="color:#e6db74">&#34;</span>$border<span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>    echo -e <span style="color:#e6db74">&#34;</span><span style="color:#e6db74">${</span>padding<span style="color:#e6db74">}${</span>text<span style="color:#e6db74">}${</span>padding<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>    echo -e <span style="color:#e6db74">&#34;</span>$border<span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>h2<span style="color:#f92672">()</span> <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>    printf <span style="color:#e6db74">&#39;\e[1;33m==&gt;\e[37;1m %s\e[0m\n&#39;</span> <span style="color:#e6db74">&#34;</span>$*<span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>error_exit<span style="color:#f92672">()</span> <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>    log_error <span style="color:#e6db74">&#34;</span>$1<span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>    exit <span style="color:#e6db74">&#34;</span><span style="color:#e6db74">${</span>2<span style="color:#66d9ef">:-</span>1<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>logfile<span style="color:#f92672">()</span> <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> <span style="color:#f92672">[</span> ! -f $LOG_FILE <span style="color:#f92672">]</span>; <span style="color:#66d9ef">then</span>
</span></span><span style="display:flex;"><span>        local timestamp<span style="color:#f92672">=</span><span style="color:#66d9ef">$(</span>date <span style="color:#e6db74">&#39;+%Y-%m-%d %H:%M:%S&#39;</span><span style="color:#66d9ef">)</span>
</span></span><span style="display:flex;"><span>        echo <span style="color:#e6db74">&#34;</span>$timestamp<span style="color:#e6db74"> </span>$1<span style="color:#e6db74">: </span>$2<span style="color:#e6db74">&#34;</span> &gt;&gt; <span style="color:#e6db74">&#34;</span>$LOG_FILE<span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">fi</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>log_error<span style="color:#f92672">()</span> <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>    logfile ERROR <span style="color:#e6db74">&#34;</span>$1<span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>    echo <span style="color:#e6db74">&#34;ERROR: </span>$1<span style="color:#e6db74">&#34;</span> &gt;&amp;<span style="color:#ae81ff">2</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>log_info<span style="color:#f92672">()</span> <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>    logfile INFO <span style="color:#e6db74">&#34;</span>$1<span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>    echo <span style="color:#e6db74">&#34;INFO: </span>$1<span style="color:#e6db74">&#34;</span> &gt;&amp;<span style="color:#ae81ff">2</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>debug<span style="color:#f92672">()</span> <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> <span style="color:#f92672">[</span> <span style="color:#e6db74">&#34;</span>$VERBOSE<span style="color:#e6db74">&#34;</span> <span style="color:#f92672">=</span> true <span style="color:#f92672">]</span>; <span style="color:#66d9ef">then</span>
</span></span><span style="display:flex;"><span>        echo <span style="color:#e6db74">&#34;DEBUG: </span>$1<span style="color:#e6db74">&#34;</span> &gt;&amp;<span style="color:#ae81ff">2</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">fi</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>check_deps<span style="color:#f92672">()</span> <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">for</span> command in <span style="color:#e6db74">${</span>DEPENDENCY<span style="color:#e6db74">}</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">do</span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> ! command -v <span style="color:#e6db74">&#34;</span><span style="color:#e6db74">${</span>command<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span> &amp;&gt; /dev/null; <span style="color:#66d9ef">then</span>
</span></span><span style="display:flex;"><span>            error_exit <span style="color:#e6db74">&#34;Komenda: </span><span style="color:#e6db74">${</span>command<span style="color:#e6db74">}</span><span style="color:#e6db74"> nie znaleziona, zainstaluj i uruchom ponownie&#34;</span> <span style="color:#ae81ff">2</span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">fi</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">done</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>cleanup<span style="color:#f92672">()</span> <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>  h1 <span style="color:#e6db74">&#34;Czyszczenie&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>trap cleanup EXIT ERR SIGINT SIGTERM
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>main<span style="color:#f92672">()</span> <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>    h1 <span style="color:#e6db74">&#34;Skrypt uruchomiono...&#34;</span>
</span></span><span style="display:flex;"><span>    
</span></span><span style="display:flex;"><span>    h2 <span style="color:#e6db74">&#34;Sprawdzam zależności&#34;</span>
</span></span><span style="display:flex;"><span>    check_deps
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> ! process_data; <span style="color:#66d9ef">then</span>
</span></span><span style="display:flex;"><span>        error_exit <span style="color:#e6db74">&#34;Błąd wykonania&#34;</span> <span style="color:#ae81ff">3</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">fi</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    cleanup
</span></span><span style="display:flex;"><span>    h2 <span style="color:#e6db74">&#34;Zakończono działanie i czyszczenie&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Run main function</span>
</span></span><span style="display:flex;"><span>main <span style="color:#e6db74">&#34;</span>$@<span style="color:#e6db74">&#34;</span>
</span></span></code></pre></div><h1 id="moje-funkcje-które-lubię-i-często-używam">Moje funkcje, które lubię i często używam</h1>
<h2 id="h1">h1</h2>
<p>Ładnie drukuje tekst w konsoli, robi górną i dolną kreskę, a wpisany tekst środkuje do wartości <code>term_width</code> - fajne i czytelne w outpucie procesu CI na stronach (gitlab, gitea, etc&hellip;).</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>declare -i term_width<span style="color:#f92672">=</span><span style="color:#ae81ff">120</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>h1<span style="color:#f92672">()</span> <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>    declare border padding text
</span></span><span style="display:flex;"><span>    border<span style="color:#f92672">=</span><span style="color:#e6db74">&#39;\e[1;34m&#39;</span><span style="color:#e6db74">&#34;</span><span style="color:#66d9ef">$(</span>printf <span style="color:#e6db74">&#39;=%.0s&#39;</span> <span style="color:#66d9ef">$(</span>seq <span style="color:#ae81ff">1</span> <span style="color:#e6db74">&#34;</span>$term_width<span style="color:#e6db74">&#34;</span><span style="color:#66d9ef">))</span><span style="color:#e6db74">&#34;</span><span style="color:#e6db74">&#39;\e[0m&#39;</span>
</span></span><span style="display:flex;"><span>    padding<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;</span><span style="color:#66d9ef">$(</span>printf <span style="color:#e6db74">&#39; %.0s&#39;</span> <span style="color:#66d9ef">$(</span>seq <span style="color:#ae81ff">1</span> <span style="color:#66d9ef">$((</span><span style="color:#f92672">(</span>term_width <span style="color:#f92672">-</span> <span style="color:#66d9ef">$(</span>wc -m <span style="color:#f92672">&lt;&lt;&lt;</span><span style="color:#e6db74">&#34;</span>$*<span style="color:#e6db74">&#34;</span><span style="color:#66d9ef">)</span><span style="color:#f92672">)</span> <span style="color:#f92672">/</span> <span style="color:#ae81ff">2</span><span style="color:#66d9ef">))))</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>    text<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;\\e[1m</span>$*<span style="color:#e6db74">\\e[0m&#34;</span>
</span></span><span style="display:flex;"><span>    echo -e <span style="color:#e6db74">&#34;</span>$border<span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>    echo -e <span style="color:#e6db74">&#34;</span><span style="color:#e6db74">${</span>padding<span style="color:#e6db74">}${</span>text<span style="color:#e6db74">}${</span>padding<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>    echo -e <span style="color:#e6db74">&#34;</span>$border<span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span></code></pre></div><h2 id="h2">h2</h2>
<p>Koloruje tekst i daje przedrostek, podobnie jak wyżej używam w procesach dla zwiększenia czytelności.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>h2<span style="color:#f92672">()</span> <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>    printf <span style="color:#e6db74">&#39;\e[1;33m==&gt;\e[37;1m %s\e[0m\n&#39;</span> <span style="color:#e6db74">&#34;</span>$*<span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span></code></pre></div><h1 id="materiały-online">Materiały online</h1>
<ul>
<li><a href="https://github.com/dylanaraps/pure-bash-bible">Bash pure bible</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Porzadki w moich cyfrowych siedzibach</title>
      <link>https://cynar.ski/2025/01/02/porzadki/</link>
      <pubDate>Thu, 02 Jan 2025 00:55:11 +0100</pubDate>
      <guid>https://cynar.ski/2025/01/02/porzadki/</guid>
      <description>&lt;p&gt;To już u mnie chyba zwyczaj, albo co najmniej &amp;ldquo;tradycja&amp;rdquo;. Jak co roku zabieram się w grudniu do robienia małych lub większych porządków w mojej cyfrowej przestrzeni. W tym roku postanowiłem pozbyć się kilku vps&amp;rsquo;ów, które od lat sobie stoją i w sumie mało robią. Teraz większość przeniosłem na jeden, który zasilany jest kubernetesem i drugi, na którym stoi klasycznie nginx. W końcu uporządkowałem swoje terrformy, bo tam wiało złem. Provider do hetzner cloud działa całkiem spoko, ten z proxmoxa też ujdzie w tłumie. Teraz w jednym &lt;code&gt;tf apply&lt;/code&gt; leci AWS, proxmox, hetzner i cloudflare - co powiem? Działa :)&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>To już u mnie chyba zwyczaj, albo co najmniej &ldquo;tradycja&rdquo;. Jak co roku zabieram się w grudniu do robienia małych lub większych porządków w mojej cyfrowej przestrzeni. W tym roku postanowiłem pozbyć się kilku vps&rsquo;ów, które od lat sobie stoją i w sumie mało robią. Teraz większość przeniosłem na jeden, który zasilany jest kubernetesem i drugi, na którym stoi klasycznie nginx. W końcu uporządkowałem swoje terrformy, bo tam wiało złem. Provider do hetzner cloud działa całkiem spoko, ten z proxmoxa też ujdzie w tłumie. Teraz w jednym <code>tf apply</code> leci AWS, proxmox, hetzner i cloudflare - co powiem? Działa :)</p>
<p>Oby mi nie zeszło powietrze z kół i do końca miesiąca żeby udało się wyłączyć działające jeszcze maszynki (w razie czego) ;]</p>
]]></content:encoded>
    </item>
    <item>
      <title>Słów kilka o blogu</title>
      <link>https://cynar.ski/o-blogu/</link>
      <pubDate>Mon, 23 Dec 2024 00:15:13 +0000</pubDate>
      <guid>https://cynar.ski/o-blogu/</guid>
      <description>&lt;p&gt;Reaktywacja, renowacja i chęć odreagowania. To tylko po to 😈&lt;/p&gt;
&lt;p&gt;W grafikach na blogu pojawia się koleś którego głową jest telewizor, to nie chora wyobraźnia autora owego bloga, nic bardziej mylnego, Retro bo tak ów się nazywa pochodzi z anime &lt;strong&gt;Dead Leaves&lt;/strong&gt;. Ogólnie odzwierciedla moje walki z materią świata technologii i nie tylko, więc wymyśliłem sobie, że będzie maskotką.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://cynar.ski/retro.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;Ci którzy mnie znają wiedzą, że jestem fanem anime ogólnie, a w szczególności anime nazwijmy to odważnego i nie rzadko dziwnego, do takich należy właśnie Dead Leaves. Samo anime powstało w 2004, tytuł to nazwa więzienia umieszczonego na wpół zniszczonym księżycu.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Reaktywacja, renowacja i chęć odreagowania. To tylko po to 😈</p>
<p>W grafikach na blogu pojawia się koleś którego głową jest telewizor, to nie chora wyobraźnia autora owego bloga, nic bardziej mylnego, Retro bo tak ów się nazywa pochodzi z anime <strong>Dead Leaves</strong>. Ogólnie odzwierciedla moje walki z materią świata technologii i nie tylko, więc wymyśliłem sobie, że będzie maskotką.</p>
<p><img loading="lazy" src="/retro.png"></p>
<p>Ci którzy mnie znają wiedzą, że jestem fanem anime ogólnie, a w szczególności anime nazwijmy to odważnego i nie rzadko dziwnego, do takich należy właśnie Dead Leaves. Samo anime powstało w 2004, tytuł to nazwa więzienia umieszczonego na wpół zniszczonym księżycu.</p>
<p><img loading="lazy" src="/dead_leaves.jpg"></p>
<p>Nasz bohater to jak już pisałem <strong>Retro</strong>, który jest pozbawiony wspomnień ze swojego poprzedniego życia. Wierzy, że był członkiem Yakuzy lub płatnym zabójcą ninja. Wyobrażenia te poprarte są jego niezwykłymi umiejętnościami bojowymi i talentem do wywoływania chaosu przy użyciu bardzo zróżnicowanej broni. Działa impulsywnie i nie stroni od przemocy 😎 - no to już wiecie, czemu go lubię he he</p>
<p>Pomysł jest taki, żeby Retro był motywem przewodnim wpisów i może potem jednolitych tekstów opisujących pomysły czy ciekawe rozkminki. Zawsze chaos i rozpierdziel, bo Retro to chodząca mała gwiazda śmierci napędzana nienawiścią :D</p>
<p>&quot; <strong>My brain is my enemy&hellip;</strong>&quot; bo tak.</p>
<p>Tu znajdziecie stary tekst <a href="/dlaczego-tak">o blogu</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Migracja na Hugo</title>
      <link>https://cynar.ski/2024/12/22/migracja_na_hugo/</link>
      <pubDate>Sun, 22 Dec 2024 12:43:16 +0100</pubDate>
      <guid>https://cynar.ski/2024/12/22/migracja_na_hugo/</guid>
      <description>&lt;p&gt;Jak już pisałem, postanowiłem po latach ożywić starego pryka, ale przy okazji zmienić techologię. Na niby prostrzą czyli prosty blog oparty o markdown zasilany świetnym silnikiem &lt;a href=&#34;https://gohugo.io/&#34;&gt;hugo&lt;/a&gt;, nigdy nie miałem odpowiednio sporo weny i zaparcia, żeby starego wordpressa przemigrować na markdown, ale w końcu się zebrałem.&lt;/p&gt;
&lt;p&gt;Pierwszym krokiem było znalezienie jakiegoś sensowanego narzędzia do migracji z backupu wordpressa do struktury strawnej dla hugo, znalazłem fajne (acz nie pozbawione wad) narzędzie &lt;a href=&#34;https://github.com/ashishb/wp2hugo/&#34;&gt;wp2hugo&lt;/a&gt;. Problemy z migracją polegały głównie na tym, że mój stary blog średnio spełniał standardy i np. code-block na starych postach zdziebko trącił myszką. Tutaj z pomocą przyszedł stary dobry &lt;code&gt;sed&lt;/code&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Jak już pisałem, postanowiłem po latach ożywić starego pryka, ale przy okazji zmienić techologię. Na niby prostrzą czyli prosty blog oparty o markdown zasilany świetnym silnikiem <a href="https://gohugo.io/">hugo</a>, nigdy nie miałem odpowiednio sporo weny i zaparcia, żeby starego wordpressa przemigrować na markdown, ale w końcu się zebrałem.</p>
<p>Pierwszym krokiem było znalezienie jakiegoś sensowanego narzędzia do migracji z backupu wordpressa do struktury strawnej dla hugo, znalazłem fajne (acz nie pozbawione wad) narzędzie <a href="https://github.com/ashishb/wp2hugo/">wp2hugo</a>. Problemy z migracją polegały głównie na tym, że mój stary blog średnio spełniał standardy i np. code-block na starych postach zdziebko trącił myszką. Tutaj z pomocą przyszedł stary dobry <code>sed</code></p>
<p>No dobra po 20 minutach miałem gotową podstawkę, kolejna rzecz do mały custom dla <code>theme</code>. Powyższe narządko tworzy stronę hugo na bazie tematu <a href="https://github.com/adityatelange/hugo-PaperMod">PaperMod</a>, który okazał się bardzo przyjemny i z dużymi możliwościami.</p>
<p>To na co patrzysz to delikatnie zmodyfikowany PaperMod. No ale dobra, wszysto fajnie, teraz warto jakoś sobie to wszystko pożenić z nowym światem, czyli kontenery, kubernetesy i inne blogowe tematy. Bo właśnie tak to jest zrobione, czyli full gitops, pełna automatyka i możliwość szybkiego pisania postów praktycznie z każdego urządzenia. Ogólnie proste rzeczy, ale jak sobie na to popatrzyłem z lotu ptaka i zobaczyłem ilość elementów jakie są w całej tej automatyce wykorzystane to ostatnim epitetem do określenia tego galimatiasu będzie <strong>proste</strong> 😻</p>
<p>Porównując starego wysłużonego już wordpressa z architekturą tego bloga, to wordpress był banalny, a co ciekawe chciałem go zaorać żeby nie utrzymywać upierdliwego <code>php-fpm</code>, za to mam <code>gitea-actions</code>, <code>container registry</code>, <code>k8s</code>, <code>argocd</code>, <code>remark42</code> - no i własnie o tym chciałem w pierwszym dłuższym technologicznym poście napisać 😎</p>
<h2 id="blog-to-też-komentarze">Blog to też komentarze</h2>
<p>Hugo to statyczne strony, więc wszelakie formularze, komentarze czy inne &ldquo;dynamiczne&rdquo; elementy trzeba sobie zapewnić jakoś inaczej. Oczywiście naturalnym wyborem dla blogów opartych o hugo jest <a href="https://disqus.com/">Disqus</a>, ale ja jestem jednak z tych, którzy wyznają starą zasadę &ldquo;ważne i prywatne dane trzymam na serwerach, z których adminem piłem&rdquo; - sam ze sobą piłem, więc wolę takie rzeczy hostować &ldquo;sam se&rdquo; 😎 Na stronkach związanych z oglądanym theme znalazłem <a href="https://remark42.com/">Remark42</a> świetny serwisik pozwalający na umieszczanie sekcji komentarzy na statycznych stronach, bardzo fajnie działa markdown, obsługuje większość popularnych OAuth2. Wystarczy skonfigurować, wystawić na jakiejś domence na świat i cieszyć się komentarzami na blogu.</p>
<h2 id="blog-to-proste-pisanie">Blog to proste pisanie</h2>
<p>Tutaj przy założeniu, że jako stary opos aka devops lubię mieć rozwiązania na czasie i przy okazji bawić się procesami automatycznymi zależało mi na oczwiście kubernetesie, w aktualnej wersji cały blog to jeden kontener, wszystkie assety, htmle i jsy są w nim zawarte. Wszystko fajnie, ale jeżeli automat to na czym mi zależało? Na commicie do mastera i wystawieniu zmian na klastrze. Proste? Proste! Ale fajnie by było korzystać z repozytorium stanu, fajnie by było żeby całość leciała automatem i pozwalała na przyjemną pracę z tekstem.</p>
<p>U mnie proces wygląda prosto: commit do mastera, proces CI/CD oparty na <code>gitea-actions</code> (podobny patent jak github-actions), aktualizacja klastra czyli wystawienie nowej wersji kontenera. W pierwszej wersji proces sobie uprościłem do trzymania w repo stanu definicji kontenera z tagiem <code>latest</code>, czyli prosty deployment:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">apiVersion</span>: <span style="color:#ae81ff">apps/v1</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">kind</span>: <span style="color:#ae81ff">Deployment</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">metadata</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">name</span>: <span style="color:#ae81ff">cynarski-deployment</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">namespace</span>: <span style="color:#ae81ff">default</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">spec</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">selector</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">matchLabels</span>:
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">run</span>: <span style="color:#ae81ff">cynarski</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">strategy</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">type</span>: <span style="color:#ae81ff">RollingUpdate</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">rollingUpdate</span>:
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">maxUnavailable</span>: <span style="color:#ae81ff">0</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">maxSurge</span>: <span style="color:#ae81ff">1</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">replicas</span>: <span style="color:#ae81ff">2</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">template</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">metadata</span>:
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">labels</span>:
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">run</span>: <span style="color:#ae81ff">cynarski</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">spec</span>:
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">containers</span>:
</span></span><span style="display:flex;"><span>        - <span style="color:#f92672">name</span>: <span style="color:#ae81ff">cynarski</span>
</span></span><span style="display:flex;"><span>          <span style="color:#f92672">image</span>: <span style="color:#ae81ff">git.cynarski.pl/sites/cynarski.dev:latest</span>
</span></span><span style="display:flex;"><span>          <span style="color:#f92672">imagePullPolicy</span>: <span style="color:#ae81ff">Always</span>
</span></span><span style="display:flex;"><span>          <span style="color:#f92672">ports</span>:
</span></span><span style="display:flex;"><span>            - <span style="color:#f92672">containerPort</span>: <span style="color:#ae81ff">80</span>
</span></span></code></pre></div><p>Jak widać nie ma tu żadnej magii, usuwanie za pomocą <code>kubectl</code> podów powoduje postawienie pod&rsquo;a na nowym obrazie, nie jest to świat idealny, ale na ten moment działa fajnie.</p>
<p>Druga wersja powyższego procesu będzie opisana już niebawem, a póki co cieszę się nowym layoutem i technologią bloga, co może pozwoli na częstsze pisanie o moich przebojach technologicznyh i nie tylko.</p>
<p>Howk!</p>
]]></content:encoded>
    </item>
    <item>
      <title>Powrót</title>
      <link>https://cynar.ski/2024/12/14/powrot/</link>
      <pubDate>Sat, 14 Dec 2024 23:19:44 +0000</pubDate>
      <guid>https://cynar.ski/2024/12/14/powrot/</guid>
      <description>&lt;p&gt;Prawie 9 lat blog leżał, kurzył się i obserwował kolejne zmiany otoczenia, a sam trwał jak skamielina. Pora coś zmienić, czas reaktywować się online, bo wydarzyło się sporo dziwnych i ciekawych rzeczy.&lt;/p&gt;
&lt;p&gt;Z wordpress przeniesione do hugo, wywalenie php jest zbawienne 💝 teraz blog będzie niezależny od dodatkowych usług (baza, fpm) ❤️&lt;/p&gt;
&lt;p&gt;Nowa szata graficzna, chęć zebrania w jednym miejscu wszystkich aktywności i poczynań tekstowych.&lt;/p&gt;
&lt;p&gt;Zobaczymy co z tego wyjdzie, ten blog istnieje od 2007 roku, poprzedni niestety przez moje niedopatrzenie zniknął w niebycie (nieodżałowany jogger) , więc sobie tak trwa… obadamy.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Prawie 9 lat blog leżał, kurzył się i obserwował kolejne zmiany otoczenia, a sam trwał jak skamielina. Pora coś zmienić, czas reaktywować się online, bo wydarzyło się sporo dziwnych i ciekawych rzeczy.</p>
<p>Z wordpress przeniesione do hugo, wywalenie php jest zbawienne 💝 teraz blog będzie niezależny od dodatkowych usług (baza, fpm) ❤️</p>
<p>Nowa szata graficzna, chęć zebrania w jednym miejscu wszystkich aktywności i poczynań tekstowych.</p>
<p>Zobaczymy co z tego wyjdzie, ten blog istnieje od 2007 roku, poprzedni niestety przez moje niedopatrzenie zniknął w niebycie (nieodżałowany jogger) , więc sobie tak trwa… obadamy.</p>
<p>Plany są jak zawsze srogie, ale jak to bywa wychodzą czasem lepiej, czasem gorzej albo wcale&hellip; teraz też zobaczymy, nowy ipad, nowe pomysły hyh.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Konfiguracja i użytkownicy systemu Fenix</title>
      <link>https://cynar.ski/2017/01/12/fenix-uzytkownicy/</link>
      <pubDate>Thu, 12 Jan 2017 13:39:55 +0000</pubDate>
      <guid>https://cynar.ski/2017/01/12/fenix-uzytkownicy/</guid>
      <description>&lt;p&gt;Podstawą jest poprawna konfiguracja systemu, dodanie użytkowników systemowych, pracowników i usług świadczonych przez firmę. Poniższy opis pomoże przygotować poprawną konfigurację sysystemu.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;media_1484216740220.png&#34; loading=&#34;lazy&#34; src=&#34;https://cynar.ski/wp-content/uploads/2017/01/media_1484216740220.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;Logowanie do systemu demo.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;login&lt;/strong&gt;: demo&lt;br&gt;
&lt;strong&gt;password&lt;/strong&gt;: demo.1010&lt;/p&gt;
&lt;h3 id=&#34;główny-widok-systemu-kalendarz&#34;&gt;Główny widok systemu (kalendarz)&lt;/h3&gt;
&lt;p&gt;&lt;img alt=&#34;media_1484216792458.png&#34; loading=&#34;lazy&#34; src=&#34;https://cynar.ski/wp-content/uploads/2017/01/media_1484216792458.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;Po poprawnym zalogowaniu widzimy widok kalendarza, zalogowany użytkownik ma dostęp do kalendarzy pracowników. Dostęp jest konfigurowany w zakładce &lt;strong&gt;konfiguracja&lt;/strong&gt;, szczegółowy opis konfiguracji znajduje się poniżej.&lt;/p&gt;
&lt;h3 id=&#34;konfiguracja-systemu&#34;&gt;Konfiguracja systemu&lt;/h3&gt;
&lt;p&gt;&lt;img alt=&#34;media_1484216823634.png&#34; loading=&#34;lazy&#34; src=&#34;https://cynar.ski/wp-content/uploads/2017/01/media_1484216823634.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;W zakładce konfiguracji mamy dostęp (tylko uprawniony użytkownik - administrator) do wszystkich istotnych opcji konfiguracyjnych.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Podstawą jest poprawna konfiguracja systemu, dodanie użytkowników systemowych, pracowników i usług świadczonych przez firmę. Poniższy opis pomoże przygotować poprawną konfigurację sysystemu.</p>
<p><img alt="media_1484216740220.png" loading="lazy" src="/wp-content/uploads/2017/01/media_1484216740220.png"></p>
<p>Logowanie do systemu demo.</p>
<p><strong>login</strong>: demo<br>
<strong>password</strong>: demo.1010</p>
<h3 id="główny-widok-systemu-kalendarz">Główny widok systemu (kalendarz)</h3>
<p><img alt="media_1484216792458.png" loading="lazy" src="/wp-content/uploads/2017/01/media_1484216792458.png"></p>
<p>Po poprawnym zalogowaniu widzimy widok kalendarza, zalogowany użytkownik ma dostęp do kalendarzy pracowników. Dostęp jest konfigurowany w zakładce <strong>konfiguracja</strong>, szczegółowy opis konfiguracji znajduje się poniżej.</p>
<h3 id="konfiguracja-systemu">Konfiguracja systemu</h3>
<p><img alt="media_1484216823634.png" loading="lazy" src="/wp-content/uploads/2017/01/media_1484216823634.png"></p>
<p>W zakładce konfiguracji mamy dostęp (tylko uprawniony użytkownik - administrator) do wszystkich istotnych opcji konfiguracyjnych.</p>
<h3 id="konta-dostępowe">Konta dostępowe</h3>
<p><img alt="media_1484216843666.png" loading="lazy" src="/wp-content/uploads/2017/01/media_1484216843666.png"></p>
<p>Konto dostępowe to konto, które umożliwia zalogowanie się do systemu - nie jest to jednoznaczne z kontami pracowników, które są reprezentowane przez kalendarze. Taka struktura pozwala na tworzenie kont logowania które mają dostęp do jednego lub większej ilości kalendarzy. Konto logowania posiadające uprawnienia do kont pracowniczych ma możliwość zmiany i edycji kalendarzy każdego z przypisanych do niego kont pracowniczych.</p>
<p><img alt="media_1484216873438.png" loading="lazy" src="/wp-content/uploads/2017/01/media_1484216873438.png"></p>
<p>Konto dostępowe umożliwia ustalenie roli systemowej oraz kont pracowniczych. Ról oraz kont pracowniczych do danego konta dostępowego może być przypisanych więcej niż jeden, co pozwala na dowolną konfigurację kont dostępowych.</p>
<p>Dostępne role systemowe:</p>
<ol>
<li><strong>Konto managerskie</strong></li>
<li><strong>Konto pracownicze</strong></li>
<li><strong>Konto pracownicze z dostępem do usług</strong></li>
<li><strong>Konto pracownicze z dostępem do raportów</strong></li>
<li><strong>Konto pracownicze z dostępem do komunikacji</strong></li>
</ol>
<h3 id="konta-pracownicze">Konta pracownicze</h3>
<p><img alt="media_1484216894827.png" loading="lazy" src="/wp-content/uploads/2017/01/media_1484216894827.png"></p>
<p>Każde konto pracownicze to kalendarz, konta pozwalają na ustawienie danych adresowych pracownika, czas pracy oraz świadczone przez niego usługi.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Blockchain</title>
      <link>https://cynar.ski/2016/06/19/blockchain/</link>
      <pubDate>Sun, 19 Jun 2016 20:56:31 +0000</pubDate>
      <guid>https://cynar.ski/2016/06/19/blockchain/</guid>
      <description>&lt;p&gt;O samym &lt;strong&gt;Blockchain&lt;/strong&gt; napisano już dużo, fajnie, że pojawiają się projekty wykorzystujące idee w celu poprawy transparentności rzeczy, które dotyczą nas wszystkich. Otóż rząd Szwecji testuje rozwiązania &lt;strong&gt;blockchaina&lt;/strong&gt; do rejestracji umów obrotu ziemią. W/g mnie to świetny pomysł i powinien się genialnie przyjąć.&lt;/p&gt;
&lt;p&gt;Źródło &lt;a href=&#34;http://www.coindesk.com/sweden-blockchain-smart-contracts-land-registry/&#34;&gt;http://www.coindesk.com/sweden-blockchain-smart-contracts-land-registry/&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>O samym <strong>Blockchain</strong> napisano już dużo, fajnie, że pojawiają się projekty wykorzystujące idee w celu poprawy transparentności rzeczy, które dotyczą nas wszystkich. Otóż rząd Szwecji testuje rozwiązania <strong>blockchaina</strong> do rejestracji umów obrotu ziemią. W/g mnie to świetny pomysł i powinien się genialnie przyjąć.</p>
<p>Źródło <a href="http://www.coindesk.com/sweden-blockchain-smart-contracts-land-registry/">http://www.coindesk.com/sweden-blockchain-smart-contracts-land-registry/</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Nowa zabawka - H8 Mini Drone</title>
      <link>https://cynar.ski/2016/06/18/nowa-zabawka-h8-mini-drone/</link>
      <pubDate>Sat, 18 Jun 2016 10:17:23 +0000</pubDate>
      <guid>https://cynar.ski/2016/06/18/nowa-zabawka-h8-mini-drone/</guid>
      <description>&lt;p&gt;Oj dawno nic nie pisałem, nie było możliwości i chęci w sumie, tym razem opiszę doznania, które dzięki małej zabawce odkurzyły moje stare modelarskie zacięcie, klej, farby, kalkomania i takie tam stare pasje przykryte toną kurzu i życiowych wybojów.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://cynar.ski/wp-content/uploads/2016/04/dronik.jpg&#34;&gt;&lt;img alt=&#34;dronik&#34; loading=&#34;lazy&#34; src=&#34;https://cynar.ski/wp-content/uploads/2016/04/dronik.jpg&#34;&gt;&lt;/a&gt;&lt;a href=&#34;http://www.banggood.com/Eachine-H8-Mini-Headless-Mode-2_4G-4CH-6-Axis-RC-Quadcopter-RTF-p-975808.html&#34;&gt;Eachine H8 Mini na Banggood&lt;/a&gt; to w sumie mały wydatek, lata się tym fajnie (jest to moja pierwsza zabawka tego typu), zabawa jest wkręcająca szczególnie jak się lubi deko dłubać. Myślę, że jakby takie zabawki były dostępne za moich młodych lat, kiedy prezent pod postacią modeli &lt;strong&gt;Matchbox&amp;rsquo;a&lt;/strong&gt; był dla mnie najlepszą opcją, takie  latające byłyby czystym skarbem :)&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Oj dawno nic nie pisałem, nie było możliwości i chęci w sumie, tym razem opiszę doznania, które dzięki małej zabawce odkurzyły moje stare modelarskie zacięcie, klej, farby, kalkomania i takie tam stare pasje przykryte toną kurzu i życiowych wybojów.</p>
<p><a href="/wp-content/uploads/2016/04/dronik.jpg"><img alt="dronik" loading="lazy" src="/wp-content/uploads/2016/04/dronik.jpg"></a><a href="http://www.banggood.com/Eachine-H8-Mini-Headless-Mode-2_4G-4CH-6-Axis-RC-Quadcopter-RTF-p-975808.html">Eachine H8 Mini na Banggood</a> to w sumie mały wydatek, lata się tym fajnie (jest to moja pierwsza zabawka tego typu), zabawa jest wkręcająca szczególnie jak się lubi deko dłubać. Myślę, że jakby takie zabawki były dostępne za moich młodych lat, kiedy prezent pod postacią modeli <strong>Matchbox&rsquo;a</strong> był dla mnie najlepszą opcją, takie  latające byłyby czystym skarbem :)</p>
<p>Całym pomysłem na zabawę zaraził mnie znajomy, już nie mogę się doczekać na dostawę jego starych części do dronów i będziem budować (mam nadzieje), choć hobby nie należy do tanich niestety.</p>
<p>Jakiś czas temu po zakupie <strong>RPi</strong> cieszyłem się, że mam nowe klocki lego dla większych chłopców, lutownica, kalafonia i zabawa w pełni - przy dronach to jeszcze lata więc wkręt jest jeszcze większy. Bateria, waga, długość lotu, sterowanie, telemetria no i potem FPV po prostu super, PayPal może się deko rozgrzać :D</p>
<p>Taki mini dron  jest fajną zabawką, nauka latania i ćwiczenie trików wciąga, minusem oczywiście jest bateria, mam aktualnie jedną która ładuje się około 40 minut a wystarcza na 4-5 minut lotu maksymalnie. Niestety deko to wydłuża proces nauki, przy kupowaniu takiego wynalazku warto dokupić od razu dodatkowe śmigiełka oraz baterie. Śmigiełka się łamią - ja zaliczyłem już 2, bateria dodatkowa wiadomo, bo teraz jak się zaczynam wkręcać to niestety pada bateria. Dodatkowo jak mamy w domu np. koty dron jest nie lada atrakcją.</p>
<p>Opisywany dron jest genialną zabawką dla kogoś, kto lubi czasami pobawić się w &ldquo;personalizację&rdquo;, biorąc pod uwagę jego cenę to możliwości są ogromne - bo można się do drona dobrać pod kątem oprogramowania, niestety trzeba dokupić sobie kilka rzeczy, ale ich cena nie jest jakoś bardzo oszałamiająca.</p>
<p>Jak chcecie pobawić się w programowanie drona, dodawanie nowych funkcji do np. flipa lub nowych combosów na kontrolerze pozwalających np. stworzyć sekwencję ruchów drona automatycznie to będziecie potrzebować (poza lutownicą, kabelkami) przejściówki do USB - <a href="http://www.banggood.com/ST-LINK-V2-Emulator-Downloader-Programmer-Support-STM8-STM32-p-973898.html">ST-LINK V2</a> .</p>
]]></content:encoded>
    </item>
    <item>
      <title>Po przerwie</title>
      <link>https://cynar.ski/posts/po-przerwie/</link>
      <pubDate>Tue, 14 Apr 2015 19:25:38 +0000</pubDate>
      <guid>https://cynar.ski/posts/po-przerwie/</guid>
      <description>&lt;p&gt;Jak tak widzę, to bardzo dawno niczego nie pisałem. Jakoś nie było ani okazji, ani woli. Człowiek czym starszy, tym ma więcej różnych obowiązków, które niestety nie zawsze pozwalają spokojnie usiąść i coś skrobnąć. Z drugiej strony jak już siadasz, to ostatnia rzecz której chcesz to siadanie przed komputerem, bo i po co? Spędzasz czas z rodziną lub po prostu odpoczywasz od klawiatury.&lt;/p&gt;
&lt;p&gt;Ostatni wpis był pisany jeszcze za czasów Fly-High, w której już nie pracuję ponad pół roku, w między czasie wydarzyło się sporo, w pracy i w domu, ale nie tylko.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Jak tak widzę, to bardzo dawno niczego nie pisałem. Jakoś nie było ani okazji, ani woli. Człowiek czym starszy, tym ma więcej różnych obowiązków, które niestety nie zawsze pozwalają spokojnie usiąść i coś skrobnąć. Z drugiej strony jak już siadasz, to ostatnia rzecz której chcesz to siadanie przed komputerem, bo i po co? Spędzasz czas z rodziną lub po prostu odpoczywasz od klawiatury.</p>
<p>Ostatni wpis był pisany jeszcze za czasów Fly-High, w której już nie pracuję ponad pół roku, w między czasie wydarzyło się sporo, w pracy i w domu, ale nie tylko.</p>
]]></content:encoded>
    </item>
    <item>
      <title>webDev nieco bardziej alternatywnie i z przytupem...</title>
      <link>https://cynar.ski/posts/webdev-alternatywanie/</link>
      <pubDate>Sun, 12 Aug 2012 13:41:50 +0000</pubDate>
      <guid>https://cynar.ski/posts/webdev-alternatywanie/</guid>
      <description>&lt;p&gt;Tekst ten traktuje nieco o historii technologii, która zmieniając się bardzo dynamicznie pozwoliła na całkowitą zmianę podejścia do &amp;ldquo;bycia online&amp;rdquo;. Od czasów liczenia impulsów i podziału dnia na ten lepszy (po 22-giej godzinie) i gorszy od 6 rano do 22-giej (tak było kiedyś w TPSA, kiedy impuls był naliczany raz na 3 minuty lub raz na 6 minut). Do teraz, czyli czasów kiedy to dzięki smartfonom mamy dostęp do sieci właściwie na okrągło.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Tekst ten traktuje nieco o historii technologii, która zmieniając się bardzo dynamicznie pozwoliła na całkowitą zmianę podejścia do &ldquo;bycia online&rdquo;. Od czasów liczenia impulsów i podziału dnia na ten lepszy (po 22-giej godzinie) i gorszy od 6 rano do 22-giej (tak było kiedyś w TPSA, kiedy impuls był naliczany raz na 3 minuty lub raz na 6 minut). Do teraz, czyli czasów kiedy to dzięki smartfonom mamy dostęp do sieci właściwie na okrągło.</p>
<p><strong>Prehistoria, czyli technologiczny mezozoik.</strong></p>
<p><a href="/wp-content/uploads/2012/08/cchip.jpeg"><img alt="Conexant chip (winmodem)" loading="lazy" src="/wp-content/uploads/2012/08/cchip.jpeg"></a> Kiedyś chyba jeden z popularniejszych układów modemów, aktualnie prehistoria.</p>
<p>Od czasów kiedy to modem wydający ten magiczny dźwięk ( <a href="http://www.wgrane.pl/854de0320f02fdff9d541460d60f6105" title="Modem internetowy">oh młodości</a>) sposób używania komputera, a co za tym idzie internetu zupełnie się zmienił. Kiedyś jako użytkownik winmodemu (czyli takiego emulowanego przez system windows, który niestety nie działał na niczym innym) dość sporo używałem programu <strong>TeleportPro</strong>. Najpierw było planowanie co ściągamy a potem wszystkie strony w offline. Nawet przy takim rozwiązaniu rachunki telefoniczne powodowały ból głowy. Potem pojawił się dostawca czegoś, co się nazywało <strong>callback</strong>. Kupowało się abonament na godziny, wpisywało odpowiedni kod i modem łączył się z numerem callback po czym rozłączał się i oczekiwał na połączenie od providera (swoją drogą pamiętam firmę, która ostatnie takie numery dostępowe wyłączyła w 2009 roku). W tamtych czasach śniłem o tzw. &ldquo;stałym łączu&rdquo;. W tamtych czasach praca webmastera była bardzo opłacalna i prosta zarazem. Proste strony w html&rsquo;u właściwie czystym, bazującym głównie na tabelach, kolorach i grafikach. Dynamika uzyskiwana za pomocą prostych animacji flash (1997 Flash 2 i programiki robiące jakieś &ldquo;bajerki&rdquo;)</p>
<p>Pierwszy bum na &ldquo;wizualne interpretacje danych&rdquo; (nie mówię tu tylko o wykresach) pojawił się kiedy potrzeba była jasno zdefiniowana: ludzie zaczynają rozmawiać za pomocą API.</p>
<p>Nowa fala zabawek dla pokolenia nie wyżytych programistów, deko znudzonych.</p>
<p>Fala nowych możliwości dzięki potędze telewizji &hellip;</p>
<p>Interfejs użytkownika swobodnie opisuje HTML5 i CSS3 &hellip;</p>
<p>Przeglądarki jako środowisko programistyczne &hellip;</p>
<p>Z ciekawych rzeczy. http://pictos.cc/</p>
]]></content:encoded>
    </item>
    <item>
      <title>PHP 5.4 sprawdzanie kompatybilności kodu</title>
      <link>https://cynar.ski/2012/08/09/php-5-4-sprawdzanie-kompatybilnosci-kodu/</link>
      <pubDate>Thu, 09 Aug 2012 11:50:37 +0000</pubDate>
      <guid>https://cynar.ski/2012/08/09/php-5-4-sprawdzanie-kompatybilnosci-kodu/</guid>
      <description>&lt;p&gt;Mamy aplikację napisaną w starym klimacie i chcemy przejść na php 5.4 a nie jesteśmy pewni czy wszystko będzie działać poprawnie? Ręcznie sprawdzać co jest grane to przy większej ilości kodu proszenie się o problemy, dlatego fajnie zautomatyzować proces.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Opcja 1&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Wykorzystać crawler&amp;rsquo;a i przeglądać logi z błędami. Jasne, zadziała zakładając, że mamy dobrego crawler&amp;rsquo;a (trzeba pamiętać o obsłudze JS&amp;rsquo;a, jeżeli crawl&amp;rsquo;er jest napisany w php to musimy się pobawić &lt;strong&gt;&lt;a href=&#34;http://pecl.php.net/package/spidermonkey&#34; title=&#34;Pecl SpiderMonkey&#34;&gt;SpiderMonkey&lt;/a&gt;&lt;/strong&gt; - opis biblioteki znajdziecie na &lt;a href=&#34;http://devzone.zend.com/1480/using-javascript-in-php-with-pecl-and-spidermonkey/&#34; title=&#34;DevZone SpierMonkey&#34;&gt;DevZone&lt;/a&gt;)&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Mamy aplikację napisaną w starym klimacie i chcemy przejść na php 5.4 a nie jesteśmy pewni czy wszystko będzie działać poprawnie? Ręcznie sprawdzać co jest grane to przy większej ilości kodu proszenie się o problemy, dlatego fajnie zautomatyzować proces.</p>
<p><strong>Opcja 1</strong></p>
<p>Wykorzystać crawler&rsquo;a i przeglądać logi z błędami. Jasne, zadziała zakładając, że mamy dobrego crawler&rsquo;a (trzeba pamiętać o obsłudze JS&rsquo;a, jeżeli crawl&rsquo;er jest napisany w php to musimy się pobawić <strong><a href="http://pecl.php.net/package/spidermonkey" title="Pecl SpiderMonkey">SpiderMonkey</a></strong> - opis biblioteki znajdziecie na <a href="http://devzone.zend.com/1480/using-javascript-in-php-with-pecl-and-spidermonkey/" title="DevZone SpierMonkey">DevZone</a>)</p>
<p><strong>Opcja 2</strong></p>
<p>Za pomocą pear&rsquo;a instalujemy sobie <strong><a href="http://pear.php.net/package/PHP_CodeSniffer/redirected" title="Pear PHP_CodeSniffer">PHP_CodeSniffer</a></strong>. Po poprawnej instalacji musimy odszukać katalog, w którym zainstalował się CodeSniffer, u mnie wygląda to tak:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>ls -l \`php-config --prefix\`/lib/php/PHP/CodeSniffer
</span></span></code></pre></div><p>Za pomocą komendy <strong><em>php-config &ndash;prefix</em></strong> uzyskujemy katalog w którym znajdują się źródła PHP.</p>
<p>Output powyższej komendy na moim latopie:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>13:43:12-paramah@lobo:~$ ls -l <span style="color:#e6db74">`</span>php-config --prefix<span style="color:#e6db74">`</span>/lib/php/PHP/CodeSniffer
</span></span><span style="display:flex;"><span>total <span style="color:#ae81ff">336</span>
</span></span><span style="display:flex;"><span>-rw-r--r-- <span style="color:#ae81ff">1</span> root admin <span style="color:#ae81ff">26715</span> <span style="color:#ae81ff">1</span> lip 04:06 CLI.php
</span></span><span style="display:flex;"><span>drwxr-xr-x <span style="color:#ae81ff">13</span> root admin <span style="color:#ae81ff">442</span> <span style="color:#ae81ff">1</span> lip 04:06 CommentParser
</span></span><span style="display:flex;"><span>drwxr-xr-x <span style="color:#ae81ff">5</span> root admin <span style="color:#ae81ff">170</span> <span style="color:#ae81ff">1</span> lip 04:06 DocGenerators
</span></span><span style="display:flex;"><span>-rw-r--r-- <span style="color:#ae81ff">1</span> root admin <span style="color:#ae81ff">1009</span> <span style="color:#ae81ff">1</span> lip 04:06 Exception.php
</span></span><span style="display:flex;"><span>-rw-r--r-- <span style="color:#ae81ff">1</span> root admin <span style="color:#ae81ff">101016</span> <span style="color:#ae81ff">1</span> lip 04:06 File.php
</span></span><span style="display:flex;"><span>-rw-r--r-- <span style="color:#ae81ff">1</span> root admin <span style="color:#ae81ff">1433</span> <span style="color:#ae81ff">1</span> lip 04:06 MultiFileSniff.php
</span></span><span style="display:flex;"><span>-rw-r--r-- <span style="color:#ae81ff">1</span> root admin <span style="color:#ae81ff">1443</span> <span style="color:#ae81ff">1</span> lip 04:06 Report.php
</span></span><span style="display:flex;"><span>-rw-r--r-- <span style="color:#ae81ff">1</span> root admin <span style="color:#ae81ff">7712</span> <span style="color:#ae81ff">1</span> lip 04:06 Reporting.php
</span></span><span style="display:flex;"><span>drwxr-xr-x <span style="color:#ae81ff">13</span> root admin <span style="color:#ae81ff">442</span> <span style="color:#ae81ff">1</span> lip 04:06 Reports
</span></span><span style="display:flex;"><span>-rw-r--r-- <span style="color:#ae81ff">1</span> root admin <span style="color:#ae81ff">3074</span> <span style="color:#ae81ff">1</span> lip 04:06 Sniff.php
</span></span><span style="display:flex;"><span>drwxr-xr-x <span style="color:#ae81ff">13</span> root admin <span style="color:#ae81ff">442</span> <span style="color:#ae81ff">9</span> sie 13:06 Standards
</span></span><span style="display:flex;"><span>drwxr-xr-x <span style="color:#ae81ff">5</span> root admin <span style="color:#ae81ff">170</span> <span style="color:#ae81ff">1</span> lip 04:06 Tokenizers
</span></span><span style="display:flex;"><span>-rw-r--r-- <span style="color:#ae81ff">1</span> root admin <span style="color:#ae81ff">15821</span> <span style="color:#ae81ff">1</span> lip 04:06 Tokens.php
</span></span></code></pre></div><p>Katalog z CodeSniffer&rsquo;em jest dla nas o tyle istotny, bo musimy dograć do niego wzór standardu kodowania, na którym nam zależy. Standard o którym mowa znajdziecie na <strong><a href="https://github.com/wimg/PHPCompatibility">GitHub</a></strong>. Klonujemy repozytorium do katalogu <strong>Standards</strong>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>13:43:17-paramah@lobo:~$ ls -l <span style="color:#e6db74">`</span>php-config --prefix<span style="color:#e6db74">`</span>/lib/php/PHP/CodeSniffer/Standards
</span></span><span style="display:flex;"><span>total <span style="color:#ae81ff">112</span>
</span></span><span style="display:flex;"><span>-rw-r--r-- <span style="color:#ae81ff">1</span> root admin <span style="color:#ae81ff">35839</span> <span style="color:#ae81ff">1</span> lip 04:06 AbstractPatternSniff.php
</span></span><span style="display:flex;"><span>-rw-r--r-- <span style="color:#ae81ff">1</span> root admin <span style="color:#ae81ff">6472</span> <span style="color:#ae81ff">1</span> lip 04:06 AbstractScopeSniff.php
</span></span><span style="display:flex;"><span>-rw-r--r-- <span style="color:#ae81ff">1</span> root admin <span style="color:#ae81ff">7976</span> <span style="color:#ae81ff">1</span> lip 04:06 AbstractVariableSniff.php
</span></span><span style="display:flex;"><span>drwxr-xr-x <span style="color:#ae81ff">5</span> root admin <span style="color:#ae81ff">170</span> <span style="color:#ae81ff">1</span> lip 04:06 Generic
</span></span><span style="display:flex;"><span>-rw-r--r-- <span style="color:#ae81ff">1</span> root admin <span style="color:#ae81ff">1090</span> <span style="color:#ae81ff">1</span> lip 04:06 IncorrectPatternException.php
</span></span><span style="display:flex;"><span>drwxr-xr-x <span style="color:#ae81ff">4</span> root admin <span style="color:#ae81ff">136</span> <span style="color:#ae81ff">1</span> lip 04:06 MySource
</span></span><span style="display:flex;"><span>drwxr-xr-x <span style="color:#ae81ff">5</span> root admin <span style="color:#ae81ff">170</span> <span style="color:#ae81ff">1</span> lip 04:06 PEAR
</span></span><span style="display:flex;"><span>drwxr-xr-x <span style="color:#ae81ff">3</span> root admin <span style="color:#ae81ff">102</span> <span style="color:#ae81ff">1</span> lip 04:06 PHPCS
</span></span><span style="display:flex;"><span>drwxr-xr-x <span style="color:#ae81ff">6</span> root admin <span style="color:#ae81ff">204</span> <span style="color:#ae81ff">9</span> sie 13:06 PHPCompatibility
</span></span><span style="display:flex;"><span>drwxr-xr-x <span style="color:#ae81ff">5</span> root admin <span style="color:#ae81ff">170</span> <span style="color:#ae81ff">1</span> lip 04:06 Squiz
</span></span><span style="display:flex;"><span>drwxr-xr-x <span style="color:#ae81ff">4</span> root admin <span style="color:#ae81ff">136</span> <span style="color:#ae81ff">1</span> lip 04:06 Zend
</span></span></code></pre></div><p>Po wszystkim powinno to wyglądać tak jak powyżej ;-)</p>
<p>Teraz prosta komenda:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>phpcs --standard=PHPCompatibility &lt;ścieżka_do_kodu&gt; --report-file=report.txt
</span></span></code></pre></div><p>Po chwili (w przypadku dużej ilości kodu może to potrwać deko długo) otrzymamy raport z  przeprowadzonego testu, wszystkie informacje będą się znajdować w pliku określonym przez parametr <strong>&ndash;report-file</strong></p>
]]></content:encoded>
    </item>
    <item>
      <title>Uff...</title>
      <link>https://cynar.ski/2012/06/19/uff/</link>
      <pubDate>Tue, 19 Jun 2012 02:07:37 +0000</pubDate>
      <guid>https://cynar.ski/2012/06/19/uff/</guid>
      <description>&lt;p&gt;Powiem tak:&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://cynar.ski/wp-content/uploads/2012/06/motto.jpg&#34;&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://cynar.ski/wp-content/uploads/2012/06/motto.jpg&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ugh&amp;hellip;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Powiem tak:</p>
<p><a href="/wp-content/uploads/2012/06/motto.jpg"><img loading="lazy" src="/wp-content/uploads/2012/06/motto.jpg"></a></p>
<p>Ugh&hellip;</p>
]]></content:encoded>
    </item>
    <item>
      <title>e24cloud, beyond i kontakt z klientem</title>
      <link>https://cynar.ski/2012/06/06/e24cloud-benyond-i-kontakt-z-klientem/</link>
      <pubDate>Wed, 06 Jun 2012 16:33:12 +0000</pubDate>
      <guid>https://cynar.ski/2012/06/06/e24cloud-benyond-i-kontakt-z-klientem/</guid>
      <description>&lt;p&gt;To co wyprawiło się w tak ostro promującym się e24cloud to już zakrawa chyba na miejską legendę. Kanały informacyjne, sam przypadek - oj temat na pracę doktorską z dziedziny zarządzania ;)&lt;/p&gt;
&lt;p&gt;Ale co jest ciekawe, jeżeli jesteś klientem firmy X ( :D ), a firma owa ma bijący po oczach problem z świadczeniem Ci usług i po bagatela 3 dniach dostajesz maila takiej treści:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Serwery &lt;a href=&#34;http://e24cloud.com/&#34;&gt;e24cloud.com&lt;/a&gt; pracują w nowoczesnej i wyposażonej wg najsurowszych zasad bezpieczeństwa&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>To co wyprawiło się w tak ostro promującym się e24cloud to już zakrawa chyba na miejską legendę. Kanały informacyjne, sam przypadek - oj temat na pracę doktorską z dziedziny zarządzania ;)</p>
<p>Ale co jest ciekawe, jeżeli jesteś klientem firmy X ( :D ), a firma owa ma bijący po oczach problem z świadczeniem Ci usług i po bagatela 3 dniach dostajesz maila takiej treści:</p>
<blockquote>
<p>Serwery <a href="http://e24cloud.com/">e24cloud.com</a> pracują w nowoczesnej i wyposażonej wg najsurowszych zasad bezpieczeństwa</p>
<p>serwerowni. Mimo to nie uniknęliśmy awarii, która pociągnęła za sobą poważne skutki. 4 czerwca rano nastąpiła</p>
<p>dysfunkcja systemu zasilania. Przyczyną przerwy w dostępności zasilania był fatalny zbieg okoliczności – nałożenie</p>
<p>się sytuacji awaryjnych w kluczowych punktach instalacji:</p>
<p>a. awaria układu automatycznego sterowania rozdzielniami elektrycznymi,</p>
<p>b. awaria jednego z głównych wyłączników układu SZR,</p>
<p>c. nieprecyzyjne dane na temat czasu pracy na bateriach – urządzenia podają 25 minut podczas kiedy faktycznie</p>
<p>ten czas jest krótszy (15min).</p>
<p>Dodatkowym okolicznością, która wpłynęła na przebieg awarii był tzw. czynnik ludzki - tak skomplikowany przebieg</p>
<p>awarii zwiększył poziom stresu, co negatywnie wpłynęło na szybkość podejmowania decyzji. Niemniej czynności</p>
<p>podjęte przez pracowników firmy, pozwoliły w krótkim czasie usunąć przyczynę problemów oraz przywrócić stabilność zasilania.</p>
<p>Niestety, na skutek awarii zasilania, uszkodzone zostało środowisko produkcyjne <a href="http://e24cloud.com/">e24cloud.com</a>, na które składają się dwie redundantne grupy macierzy, zbudowane z grup dysków twardych spiętych w RAID 6 (dopuszczalne uszkodzenie 2 dysków). Na nieszczęście, wiele dysków w znacznym stopniu ucierpiało podczas utraty zasilania – w najgorszym przypadku straciliśmy 60% dysków z grupy raidowej.</p>
<p>Dyski, które zawierały kopie bezpieczeństwa wykonane przez użytkowników zachowały pełną sprawność.</p>
<p>Aktualnie wszystkie siły wkładamy w odzyskanie danych z uszkodzonych macierzy. Rozumiemy, że wielu z Was miało tam cenne dane i informacje. Czasu, który jest potrzebny na tę operację nie możemy Wam oddać. Wiemy, że jest do dla Was bardzo stresująca sytuacja i rozumiemy Wasze obawy oraz pytania o szczegóły.  Jak tylko zakończą się trwające prace, natychmiast się z Wami podzielimy szczegółowymi informacjami na ten temat.</p>
<p>Harmonogram prac znajdziecie tutaj: <a href="http://devblog.e24cloud.com/awaria-z-04-06-2012-harmonogram-prac-zwiazanych-z-e24cloud-com/">http://devblog.e24cloud.com/awaria-z-04-06-2012-harmonogram-prac-zwiazanych-z-e24cloud-com/</a></p>
<p>Do momentu zakończenia wszystkich prac naprawczych nie pobieramy żadnych opłat za korzystanie z naszej usługi. Pracujemy również nad systemem premiowym dla aktywnych użytkowników <a href="http://e24cloud.com/">e24cloud.com</a>. Staramy się wypracować jak najkorzystniejsze dla Was rozwiązanie.</p></blockquote>
<p>Treść super, dużo &ldquo;mądrych&rdquo; terminów i w ogóle łał. Oczywiście czas reakcji, treść maila, publikacje na FB oraz YT wszystko to krzyczy: &ldquo;uciekać&rdquo; :)</p>
<p>A dla ludzi zajmujących się PR w Beyond polecam stronę, którą przygotowaliśmy specjalnie na takie okazje: <a href="http://wymowka.pretasoft.pl">WYMÓWKA</a> oczywiście używanie strony jest free, kopiuj-wklej do maila i generuj &ldquo;mądre&rdquo; maile do klientów.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Sublime Text 2</title>
      <link>https://cynar.ski/posts/sublime-text-2/</link>
      <pubDate>Tue, 06 Mar 2012 12:04:32 +0000</pubDate>
      <guid>https://cynar.ski/posts/sublime-text-2/</guid>
      <description>&lt;p&gt;Nowy TextMate zupełnie nie przypadł mi do gustu, ale w zamian za to na horyzoncie aplikacji developerskich pojawił się Sublime Text 2. Chwilę mi zajęło wąchanie nowego edytora, ale teraz mogę powiedzieć, że przemigrowałem zupełnie z TM na rzecz ST2.&lt;/p&gt;
&lt;p&gt;Zalety Sublime&amp;rsquo;a:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;wieloplatformowy&lt;/li&gt;
&lt;li&gt;lekki&lt;/li&gt;
&lt;li&gt;szybkie wyszukiwanie&lt;/li&gt;
&lt;li&gt;mnogość pluginów&lt;/li&gt;
&lt;li&gt;przyjemny interface z możliwością zupełnej personalizacji&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Poza samym środowiskiem mamy dostęp do ogromnej liczby pluginów dostępnych na github&amp;rsquo;ie i zarządzanych przez jeden prosty plugin Package Manager.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Nowy TextMate zupełnie nie przypadł mi do gustu, ale w zamian za to na horyzoncie aplikacji developerskich pojawił się Sublime Text 2. Chwilę mi zajęło wąchanie nowego edytora, ale teraz mogę powiedzieć, że przemigrowałem zupełnie z TM na rzecz ST2.</p>
<p>Zalety Sublime&rsquo;a:</p>
<ol>
<li>wieloplatformowy</li>
<li>lekki</li>
<li>szybkie wyszukiwanie</li>
<li>mnogość pluginów</li>
<li>przyjemny interface z możliwością zupełnej personalizacji</li>
</ol>
<p>Poza samym środowiskiem mamy dostęp do ogromnej liczby pluginów dostępnych na github&rsquo;ie i zarządzanych przez jeden prosty plugin Package Manager.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Mniam...</title>
      <link>https://cynar.ski/2011/11/27/mniam/</link>
      <pubDate>Sun, 27 Nov 2011 17:28:19 +0000</pubDate>
      <guid>https://cynar.ski/2011/11/27/mniam/</guid>
      <description>&lt;div class=&#34;gallery gallery-cols-2&#34;&gt;&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cynar.ski/wp-content/uploads/2011/11/mirela1.png&#34;
         alt=&#34;mirela1&#34;/&gt; &lt;figcaption&gt;
            mirela1
        &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cynar.ski/wp-content/uploads/2011/11/na_morze.png&#34;
         alt=&#34;na\_morze&#34;/&gt; &lt;figcaption&gt;
            na\_morze
        &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://cynar.ski/wp-content/uploads/2011/11/notofrugo.png&#34;
         alt=&#34;notofrugo&#34;/&gt; &lt;figcaption&gt;
            notofrugo
        &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;</description>
      <content:encoded><![CDATA[

<div class="gallery gallery-cols-2"><figure>
    <img loading="lazy" src="/wp-content/uploads/2011/11/mirela1.png"
         alt="mirela1"/> <figcaption>
            mirela1
        </figcaption>
</figure>
<figure>
    <img loading="lazy" src="/wp-content/uploads/2011/11/na_morze.png"
         alt="na\_morze"/> <figcaption>
            na\_morze
        </figcaption>
</figure>
<figure>
    <img loading="lazy" src="/wp-content/uploads/2011/11/notofrugo.png"
         alt="notofrugo"/> <figcaption>
            notofrugo
        </figcaption>
</figure>
</div>

]]></content:encoded>
    </item>
    <item>
      <title>automate social live, czyli ifttt.com</title>
      <link>https://cynar.ski/2011/11/27/automate-social-live-czyli-ifttt-com/</link>
      <pubDate>Sun, 27 Nov 2011 17:18:31 +0000</pubDate>
      <guid>https://cynar.ski/2011/11/27/automate-social-live-czyli-ifttt-com/</guid>
      <description>&lt;p&gt;Facebook, Twitter, Google+, Posterous, Delicious, blog, można by wymieniać w nieskończoność. Aktualnie mnogość serwisów społecznościowych zaczyna przytłaczać, a przy okazji wielu zależy na &amp;ldquo;kanałach&amp;rdquo;, co opublikujemy na G+ chcemy żeby było automatem na Twitterze lub odpowiednio oznaczone wylądowało na naszym blogu. Używając mediów socialnych chcemy być aktualni a przy okazji nie chcemy tracić czasu na &amp;ldquo;kopiowanie&amp;rdquo; treści, może się to okazać bardzo przydatne dla wszystkich tworzących kampanie socjalne na wielu serwisach jednocześnie.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Facebook, Twitter, Google+, Posterous, Delicious, blog, można by wymieniać w nieskończoność. Aktualnie mnogość serwisów społecznościowych zaczyna przytłaczać, a przy okazji wielu zależy na &ldquo;kanałach&rdquo;, co opublikujemy na G+ chcemy żeby było automatem na Twitterze lub odpowiednio oznaczone wylądowało na naszym blogu. Używając mediów socialnych chcemy być aktualni a przy okazji nie chcemy tracić czasu na &ldquo;kopiowanie&rdquo; treści, może się to okazać bardzo przydatne dla wszystkich tworzących kampanie socjalne na wielu serwisach jednocześnie.</p>
<p>[caption id=&ldquo;attachment_640&rdquo; align=&ldquo;alignright&rdquo; width=&ldquo;300&rdquo; caption=&ldquo;Copyright Timothy Allen <a href="http://www.humanplanet.com">http://www.humanplanet.com</a>&rdquo;] <a href="/wp-content/uploads/2011/11/Timothy-Allen_photographer_001.jpg"><img loading="lazy" src="/wp-content/uploads/2011/11/Timothy-Allen_photographer_001-300x200.jpg"></a>[/caption]</p>
<p>W tym przypadku bardzo pomocny, mający bardzo prosty i przejrzysty interface serwis <a href="http://ifttt.com/">ifttt.com</a>, na którym bez problemu można utworzyć &ldquo;zadania&rdquo; łączące akcje wykonywane przez serwisy społecznościowe. Najprostszym przykładem może być integracja Twitter&rsquo;a z Facebook&rsquo;iem, albo blog&rsquo;a z Google Reader&rsquo;em, Twitterem i Delicious&rsquo;ami. Wszystko inne jest tylko Waszą wyobraźnią i realizacją potrzeb.</p>
<p>Miłej zabawy.</p>
]]></content:encoded>
    </item>
    <item>
      <title>new Youtube layout</title>
      <link>https://cynar.ski/2011/11/20/new-youtube-layout/</link>
      <pubDate>Sun, 20 Nov 2011 16:41:45 +0000</pubDate>
      <guid>https://cynar.ski/2011/11/20/new-youtube-layout/</guid>
      <description>&lt;p&gt;Integracja z usługami google idzie coraz dalej ;) Nowy layout Youtube&amp;rsquo;a wygląda tak:&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://cynar.ski/wp-content/uploads/2011/11/main.png&#34;&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://cynar.ski/wp-content/uploads/2011/11/main-300x229.png&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Historia:&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://cynar.ski/wp-content/uploads/2011/11/historia.png&#34;&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://cynar.ski/wp-content/uploads/2011/11/historia-300x184.png&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Film:&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://cynar.ski/wp-content/uploads/2011/11/film.png&#34;&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://cynar.ski/wp-content/uploads/2011/11/film-300x237.png&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ciekawe kiedy będzie już ogólnie dostępne, na razie wygląda fajnie z tego co widać na stronie głównej będzie lista filmów publikowanych na naszych G+ - zobaczymy.&lt;/p&gt;
&lt;p&gt;Wersja preBeta jeszcze totalnie krzaczy kanały na YT, no ale myślę że to kwestia czasu.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Integracja z usługami google idzie coraz dalej ;) Nowy layout Youtube&rsquo;a wygląda tak:</p>
<p><a href="/wp-content/uploads/2011/11/main.png"><img loading="lazy" src="/wp-content/uploads/2011/11/main-300x229.png"></a></p>
<p>Historia:</p>
<p><a href="/wp-content/uploads/2011/11/historia.png"><img loading="lazy" src="/wp-content/uploads/2011/11/historia-300x184.png"></a></p>
<p>Film:</p>
<p><a href="/wp-content/uploads/2011/11/film.png"><img loading="lazy" src="/wp-content/uploads/2011/11/film-300x237.png"></a></p>
<p>Ciekawe kiedy będzie już ogólnie dostępne, na razie wygląda fajnie z tego co widać na stronie głównej będzie lista filmów publikowanych na naszych G+ - zobaczymy.</p>
<p>Wersja preBeta jeszcze totalnie krzaczy kanały na YT, no ale myślę że to kwestia czasu.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Share, share, share... g&#43;, fb connecting people</title>
      <link>https://cynar.ski/2011/10/18/share-share-share-g-fb-connecting-people/</link>
      <pubDate>Tue, 18 Oct 2011 17:58:31 +0000</pubDate>
      <guid>https://cynar.ski/2011/10/18/share-share-share-g-fb-connecting-people/</guid>
      <description>&lt;p&gt;Nie wiem czy ktoś z Was zauważył wzmożony ruch na Google+ ludzie zaczynają masowo naparzać na konto, a tak bo se kliknę. Dodatkowo, udostępnianie kręgów stało się pewnego rodzaju celebracją, tworzeniem kanału informacji &amp;ldquo;ważnych, ciekawych&amp;rdquo; istotnych.&lt;/p&gt;
&lt;p&gt;Zabawa liczbami zaczyna mi się niezmiernie podobać, można sobie wyobrazić czasy z przed sieci społecznościowych. No dobra wiem, prehistoria. Ciekawe ile ludzi ma jeszcze aktywne konta (regularnie używane) na &lt;a href=&#34;http://grono.net&#34;&gt;grono.net&lt;/a&gt;, pamiętam czasy kiedy to kto kogo ma w gronie tak się lokuje w pokojach. Tak bluszcz o tobie mowa :) No dobra, ale wyobrażamy sobie te czasy, kiedy informacje trzeba było zdobyć w deko bardziej skomplikowany sposób niż wpisanie g o o &lt;tab&gt;. Czy wtedy człowiek popularny, również był tak policzalny? Fajnie jest stworzyć teorię, potem ją wpakować w mentalność ludzi jako wirtualny produkt i potem robić sobie z tym co się tam chce. A teraz połączymy Was w nowy sposób, o! Tworzymy sobie dokument na google docs&amp;rsquo;ach, nazywamy &amp;ldquo;jedynie miarodajne źródło informacji&amp;rdquo; tylko oczywiście w iście dopieszczonej formie - informacja wprost do pseudointeligencji nie trafia - za tanio. Jak już nazbieramy ludzi którzy wleźli na ustrojstwo robimy sobie prywatny dokument, potem kto wpadnie w interakcję chcę -&amp;gt; mogę mamy kolejne połączenie w super przefiltrowany sposób między kretynami jarającymi się kto co i jak. hipster&amp;rsquo;s doc&amp;rsquo;s online&amp;rsquo;s.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Nie wiem czy ktoś z Was zauważył wzmożony ruch na Google+ ludzie zaczynają masowo naparzać na konto, a tak bo se kliknę. Dodatkowo, udostępnianie kręgów stało się pewnego rodzaju celebracją, tworzeniem kanału informacji &ldquo;ważnych, ciekawych&rdquo; istotnych.</p>
<p>Zabawa liczbami zaczyna mi się niezmiernie podobać, można sobie wyobrazić czasy z przed sieci społecznościowych. No dobra wiem, prehistoria. Ciekawe ile ludzi ma jeszcze aktywne konta (regularnie używane) na <a href="http://grono.net">grono.net</a>, pamiętam czasy kiedy to kto kogo ma w gronie tak się lokuje w pokojach. Tak bluszcz o tobie mowa :) No dobra, ale wyobrażamy sobie te czasy, kiedy informacje trzeba było zdobyć w deko bardziej skomplikowany sposób niż wpisanie g o o <tab>. Czy wtedy człowiek popularny, również był tak policzalny? Fajnie jest stworzyć teorię, potem ją wpakować w mentalność ludzi jako wirtualny produkt i potem robić sobie z tym co się tam chce. A teraz połączymy Was w nowy sposób, o! Tworzymy sobie dokument na google docs&rsquo;ach, nazywamy &ldquo;jedynie miarodajne źródło informacji&rdquo; tylko oczywiście w iście dopieszczonej formie - informacja wprost do pseudointeligencji nie trafia - za tanio. Jak już nazbieramy ludzi którzy wleźli na ustrojstwo robimy sobie prywatny dokument, potem kto wpadnie w interakcję chcę -&gt; mogę mamy kolejne połączenie w super przefiltrowany sposób między kretynami jarającymi się kto co i jak. hipster&rsquo;s doc&rsquo;s online&rsquo;s.</p>
<p>Ludzie łączcie się jak sobie tam chcecie w lewo, w prawo i po skosie w kosmosie, ale po cholerę spora grupa ludzi traktuje to tak poważnie ? :)</p>
<p>Fajnie się powkręcać, ale tak czy siak raczej będę nosić wyjechane koszulki z napisem Ritchie :P</p>
]]></content:encoded>
    </item>
    <item>
      <title>Chmura, czyli zawsze...</title>
      <link>https://cynar.ski/2011/08/18/chmura-czyli-zawsze/</link>
      <pubDate>Thu, 18 Aug 2011 20:27:26 +0000</pubDate>
      <guid>https://cynar.ski/2011/08/18/chmura-czyli-zawsze/</guid>
      <description>&lt;p&gt;Wstałem rano i jak zawsze załączyłem ekspres. Podczas picia kawy cały czas migała czerwona lampka nieco przykurzonego modemu, connection error. Znudzony podniosłem wzrok, w tym przypadku obserwacja tego co się dzieje za oknem musi mi wystarczyć. Siorpię kawe i zastanawiam się nad tym jak to było jeszcze kilkanaście lat temu, ściąganie filmów i nagrywanie ich na CD, potem DVD, a potem na dyski zewnętrzne. Gromadzenie danych właściwie bez totalnego sensu - ale wtedy miałbym co robić przy kawie. Klik i proszę, film dokumentalny o produkcji konopii indyjskich.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Wstałem rano i jak zawsze załączyłem ekspres. Podczas picia kawy cały czas migała czerwona lampka nieco przykurzonego modemu, connection error. Znudzony podniosłem wzrok, w tym przypadku obserwacja tego co się dzieje za oknem musi mi wystarczyć. Siorpię kawe i zastanawiam się nad tym jak to było jeszcze kilkanaście lat temu, ściąganie filmów i nagrywanie ich na CD, potem DVD, a potem na dyski zewnętrzne. Gromadzenie danych właściwie bez totalnego sensu - ale wtedy miałbym co robić przy kawie. Klik i proszę, film dokumentalny o produkcji konopii indyjskich.</p>
<p>O, ktoś wyszedł wyrzucić śmieci, siorp.</p>
<p>Praca leży, właściwie nie mam co się śpieszyć z piciem kawy. Mogę robić co mi się chce. Super. Chwilkę, ale lampić się na ludzi łażących za oknem to mi się akurat zupełnie nie chce. Spokojnie, to tylko chwilowa przerwa, max 10 minut - w końcu to u nich problem skali, wytrzymam. Chwała bogu nie jestem dostawcą pizzy muszącym doręczyć ładunek w góra 20 minut. Mam czas. No dobra ale jak coś ciekawego się wydarzy? Jakiś nowy trend, strumień, albo rzeka danych popłynie, a ja będę - że jak? Offline? Ok, klik, klik, klik - fajno jestem online, no dobra centrum miasta na mobilny internet to nie do końca dobry pomysł ale do przesłania parunastu informacji wystarczy. Klik, kuurwa jeszcze te wszystkie zewnętrzne linki do JavaScriptów, jakiś flesz, fajnie jest strona z niusami. O. Klik. Noo dobra, biało&hellip; Siorp. Kawa się kończy, ja nie zobaczyłem nic ciekawego, nic nie poczytałem. O. lampka jest zielona. Klik, klik, BT wyłączone. Ooo taak, jestem, mam dostęp do danych. Tak, tak powszedni aktualnie atut mieszkania w cywilizowanym świecie - mam dostęp do miliardów stron, tekstów. Co prawda na moim terminalu nie ma za dużego dysku, właściwie mieści się tam tylko loader czegoś na wzór przeglądarki internetowej. Odpalam sobie grooveshark&rsquo;a, potem załączam imo.im, google, moje środowisko IDE oparte o Amy - jestem, mogę swobodnie pracować.</p>
<p>Może to i mała fantazja na temat, jedno wiem na pewno - dalej będę siorpać kawę.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Autostop? ... czemu nie.</title>
      <link>https://cynar.ski/2011/08/17/autostop-czemu-nie/</link>
      <pubDate>Wed, 17 Aug 2011 12:57:35 +0000</pubDate>
      <guid>https://cynar.ski/2011/08/17/autostop-czemu-nie/</guid>
      <description>&lt;p&gt;Genialna aplikacja dla wszystkich chcących zaoszczędzić na drodze do pracy (i nie tylko) lub tych, którzy nie chcą korzystać z usług PKP, albo tanim kosztem zajechać np. do Francji.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://carpooling.pl&#34;&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://cynar.ski/wp-content/uploads/2011/08/2011-08-17_1445.png&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Posiadają oczywiście apkę na &lt;strong&gt;&lt;a href=&#34;http://itunes.apple.com/us/app/carpooling.pl/id416990778?mt=8&#34;&gt;iPhone&lt;/a&gt;&lt;/strong&gt; - polecam :)&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Genialna aplikacja dla wszystkich chcących zaoszczędzić na drodze do pracy (i nie tylko) lub tych, którzy nie chcą korzystać z usług PKP, albo tanim kosztem zajechać np. do Francji.</p>
<p><a href="http://carpooling.pl"><img loading="lazy" src="/wp-content/uploads/2011/08/2011-08-17_1445.png"></a></p>
<p>Posiadają oczywiście apkę na <strong><a href="http://itunes.apple.com/us/app/carpooling.pl/id416990778?mt=8">iPhone</a></strong> - polecam :)</p>
]]></content:encoded>
    </item>
    <item>
      <title>Komunikatory w przeglądarce.</title>
      <link>https://cynar.ski/2011/08/17/komunikatory-w-przegladarce/</link>
      <pubDate>Wed, 17 Aug 2011 12:44:55 +0000</pubDate>
      <guid>https://cynar.ski/2011/08/17/komunikatory-w-przegladarce/</guid>
      <description>&lt;p&gt;W czasie przerwy na kawę buszowałem deko po internecie, ostatnimi czasy zainteresował mnie rozwój &lt;a href=&#34;http://www.google.com/chromebook/&#34;&gt;Chrome OS&lt;/a&gt;, wszystko online w chmurze - no dobra ale co z komunikatorami? Skype, MSN, Jabber i inne. Osobiście lubię mieć wszystko w jednym miejscu dlatego aktualnie korzystam z &lt;a href=&#34;http://adium.im/&#34;&gt;Adium&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Okazuje się, że jest panaceum - &lt;a href=&#34;https://imo.im/&#34;&gt;imo.im&lt;/a&gt; strona przydatna dla wszystkich mobilnych, korzystających z wielu komputerów ludzi, chcących mieć kontakt ze światem za pomocą własnych komunikatorów. Aktualnie &lt;strong&gt;imo.im&lt;/strong&gt; wspiera takie komunikatory jak: Skype, MSN, Steam, Jabber, GTalk, Facebook, ICQ, MySpace wszystko z pozycji strony www, a i wygląd jest całkiem całkiem. Mamy do dyspozycji powiadamianie o zdarzeniach takie jak w Gmail&amp;rsquo;u, czyli &lt;a href=&#34;http://www.chromium.org/developers/design-documents/desktop-notifications/api-specification&#34;&gt;Notifications API&lt;/a&gt;. Wszystko co potrzebne do swobodnego prowadzenia rozmów.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>W czasie przerwy na kawę buszowałem deko po internecie, ostatnimi czasy zainteresował mnie rozwój <a href="http://www.google.com/chromebook/">Chrome OS</a>, wszystko online w chmurze - no dobra ale co z komunikatorami? Skype, MSN, Jabber i inne. Osobiście lubię mieć wszystko w jednym miejscu dlatego aktualnie korzystam z <a href="http://adium.im/">Adium</a>.</p>
<p>Okazuje się, że jest panaceum - <a href="https://imo.im/">imo.im</a> strona przydatna dla wszystkich mobilnych, korzystających z wielu komputerów ludzi, chcących mieć kontakt ze światem za pomocą własnych komunikatorów. Aktualnie <strong>imo.im</strong> wspiera takie komunikatory jak: Skype, MSN, Steam, Jabber, GTalk, Facebook, ICQ, MySpace wszystko z pozycji strony www, a i wygląd jest całkiem całkiem. Mamy do dyspozycji powiadamianie o zdarzeniach takie jak w Gmail&rsquo;u, czyli <a href="http://www.chromium.org/developers/design-documents/desktop-notifications/api-specification">Notifications API</a>. Wszystko co potrzebne do swobodnego prowadzenia rozmów.</p>
<p>Naprawdę da się tego używać, raczej na pewno na razie nie jest to alternatywa dla desktopowego klienta - ale na pewno pozwala zaoszczędzić nieco zasobów np. dla Skype&rsquo;a :)</p>
]]></content:encoded>
    </item>
    <item>
      <title>Chrome dev console black skin</title>
      <link>https://cynar.ski/2011/08/17/chrome-dev-console-black-skin/</link>
      <pubDate>Wed, 17 Aug 2011 11:16:01 +0000</pubDate>
      <guid>https://cynar.ski/2011/08/17/chrome-dev-console-black-skin/</guid>
      <description>&lt;p&gt;Chrome to dość dobra przeglądarka, dla mnie jest idealna z wielu względów, ale najbardziej podoba mi się możliwość jej pełnej personalizacji. Ot na przykład domyślna konsola wygląda tak:&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://cynar.ski/wp-content/uploads/2011/08/2011-08-17_0918-1.png&#34;&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://cynar.ski/wp-content/uploads/2011/08/2011-08-17_0918-1-1024x339.png&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ale może wyglądać zupełnie inaczej, bo ja mam aktualnie tak:&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://cynar.ski/wp-content/uploads/2011/08/2011-08-17_0918.png&#34;&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://cynar.ski/wp-content/uploads/2011/08/2011-08-17_0918-1024x356.png&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Cała operacja jest banalnie prosta i wymaga jedynie znajomości CSS&amp;rsquo;a :) otóż (pełny art. na ten temat jest &lt;a href=&#34;http://darcyclarke.me/design/skin-your-chrome-inspector/&#34;&gt;tu&lt;/a&gt;) musimy podmienić plik CSS w katalogu użytkownika. Jego lokalizacja w zależności od systemu jest:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Chrome to dość dobra przeglądarka, dla mnie jest idealna z wielu względów, ale najbardziej podoba mi się możliwość jej pełnej personalizacji. Ot na przykład domyślna konsola wygląda tak:</p>
<p><a href="/wp-content/uploads/2011/08/2011-08-17_0918-1.png"><img loading="lazy" src="/wp-content/uploads/2011/08/2011-08-17_0918-1-1024x339.png"></a></p>
<p>Ale może wyglądać zupełnie inaczej, bo ja mam aktualnie tak:</p>
<p><a href="/wp-content/uploads/2011/08/2011-08-17_0918.png"><img loading="lazy" src="/wp-content/uploads/2011/08/2011-08-17_0918-1024x356.png"></a></p>
<p>Cała operacja jest banalnie prosta i wymaga jedynie znajomości CSS&rsquo;a :) otóż (pełny art. na ten temat jest <a href="http://darcyclarke.me/design/skin-your-chrome-inspector/">tu</a>) musimy podmienić plik CSS w katalogu użytkownika. Jego lokalizacja w zależności od systemu jest:</p>
<p><strong>Mac</strong>: <code>/Users/YourUsername/Library/Application Support/Google/Chrome/Default/User StyleSheets/Custom.css</code> `` <strong>PC</strong>: <code>C:\Users\YourUsername\AppData\Local\Google\Chrome\User Data\Default\User StyleSheets\Custom.css</code> <strong>Ubuntu (Chromium)</strong>: `~/.config/chromium/Default/User\ StyleSheets/Custom.css```</p>
<p>Następnie korzystamy z tego pliku:</p>
<p>Chrome to dość dobra przeglądarka, dla mnie jest idealna z wielu względów, ale najbardziej podoba mi się możliwość jej pełnej personalizacji. Ot na przykład domyślna konsola wygląda tak:</p>
<p><a href="/wp-content/uploads/2011/08/2011-08-17_0918-1.png"><img loading="lazy" src="/wp-content/uploads/2011/08/2011-08-17_0918-1-1024x339.png"></a></p>
<p>Ale może wyglądać zupełnie inaczej, bo ja mam aktualnie tak:</p>
<p><a href="/wp-content/uploads/2011/08/2011-08-17_0918.png"><img loading="lazy" src="/wp-content/uploads/2011/08/2011-08-17_0918-1024x356.png"></a></p>
<p>Cała operacja jest banalnie prosta i wymaga jedynie znajomości CSS&rsquo;a :) otóż (pełny art. na ten temat jest <a href="http://darcyclarke.me/design/skin-your-chrome-inspector/">tu</a>) musimy podmienić plik CSS w katalogu użytkownika. Jego lokalizacja w zależności od systemu jest:</p>
<p><strong>Mac</strong>: <code>/Users/YourUsername/Library/Application Support/Google/Chrome/Default/User StyleSheets/Custom.css</code> `` <strong>PC</strong>: <code>C:\Users\YourUsername\AppData\Local\Google\Chrome\User Data\Default\User StyleSheets\Custom.css</code> <strong>Ubuntu (Chromium)</strong>: `~/.config/chromium/Default/User\ StyleSheets/Custom.css```</p>
<p>Następnie korzystamy z tego pliku:</p>
<p>[gist id=1151334]</p>
<p>Tutaj jedna uwaga, wszystko działa real-time, więc każda zmiana będzie widziana od razu. Miłej zabawy z personalizacją.</p>
<p>Tutaj jedna uwaga, wszystko działa real-time, więc każda zmiana będzie widziana od razu. Miłej zabawy z personalizacją.</p>
]]></content:encoded>
    </item>
    <item>
      <title>node.js addons</title>
      <link>https://cynar.ski/node-js/node-js-addons/</link>
      <pubDate>Mon, 08 Aug 2011 14:11:25 +0000</pubDate>
      <guid>https://cynar.ski/node-js/node-js-addons/</guid>
      <description>&lt;p&gt;Poniżej znajduje się lista dodatków, modułów, bibliotek do &lt;strong&gt;node.js&lt;/strong&gt;. które znalazłem / użyłem, mam nadzieję że lista będzie się stale powiększać. Wszystko głównie dla pamięci. Jak znacie / używacie czegoś fajnego, a nie ma tego na liście komentujcie.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;simple test client-side &lt;strong&gt;&lt;a href=&#34;http://zombie.labnotes.org/&#34;&gt;zombie.js&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;</description>
      <content:encoded><![CDATA[<p>Poniżej znajduje się lista dodatków, modułów, bibliotek do <strong>node.js</strong>. które znalazłem / użyłem, mam nadzieję że lista będzie się stale powiększać. Wszystko głównie dla pamięci. Jak znacie / używacie czegoś fajnego, a nie ma tego na liście komentujcie.</p>
<ol>
<li>simple test client-side <strong><a href="http://zombie.labnotes.org/">zombie.js</a></strong></li>
</ol>
]]></content:encoded>
    </item>
    <item>
      <title>Node.js</title>
      <link>https://cynar.ski/node-js/</link>
      <pubDate>Sat, 06 Aug 2011 16:23:00 +0000</pubDate>
      <guid>https://cynar.ski/node-js/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://cynar.ski/wp-content/uploads/2011/08/d838c_node_js_logo.gif&#34;&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://cynar.ski/wp-content/uploads/2011/08/d838c_node_js_logo.gif&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Na wstępie, muszę przyznać, że pisanie serwera w &lt;strong&gt;JavaScript&amp;rsquo;cie&lt;/strong&gt; było dla nie dość &amp;ldquo;szalone&amp;rdquo;. Tym bardziej, że &lt;strong&gt;JavaScript&lt;/strong&gt; zawsze był dla mnie bardziej slangiem niż językiem programowania. Po czasie pracy nad serwerem node.js deko zmieniłem zdanie na temat samego &lt;strong&gt;JS&lt;/strong&gt;&amp;lsquo;a i zwracam mu należny honor. Samo rozwiązanie napisania serwera w tymże języku okazało się dość ciekawą przygodą, która myślę nie skończy się tylko na przygodzie. O samym &lt;strong&gt;node.js&lt;/strong&gt; nie będę się rozpisywać, bo jest tego w sieci już na tyle dużo, że nie ma to większego sensu, dla zaciekawionych tematem odsyłam do storn:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="/wp-content/uploads/2011/08/d838c_node_js_logo.gif"><img loading="lazy" src="/wp-content/uploads/2011/08/d838c_node_js_logo.gif"></a></p>
<p>Na wstępie, muszę przyznać, że pisanie serwera w <strong>JavaScript&rsquo;cie</strong> było dla nie dość &ldquo;szalone&rdquo;. Tym bardziej, że <strong>JavaScript</strong> zawsze był dla mnie bardziej slangiem niż językiem programowania. Po czasie pracy nad serwerem node.js deko zmieniłem zdanie na temat samego <strong>JS</strong>&lsquo;a i zwracam mu należny honor. Samo rozwiązanie napisania serwera w tymże języku okazało się dość ciekawą przygodą, która myślę nie skończy się tylko na przygodzie. O samym <strong>node.js</strong> nie będę się rozpisywać, bo jest tego w sieci już na tyle dużo, że nie ma to większego sensu, dla zaciekawionych tematem odsyłam do storn:</p>
<ul>
<li><a href="http://nodejs.org/" title="node.js">http://nodejs.org/</a></li>
<li><a href="http://www.nodebeginner.org/" title="Node Beginner">http://www.nodebeginner.org/</a></li>
<li><a href="https://github.com/joyent/node" title="Node.js github">https://github.com/joyent/node</a></li>
<li><a href="http://dailyjs.com/2010/11/01/node-tutorial/" title="Node Tutorial">http://dailyjs.com/2010/11/01/node-tutorial/</a></li>
</ul>
<p>Na dobry początek to powinno wystarczyć, ja wolę posłużyć się konkretnymi przykładami (w dużej części działającymi produkcyjnie rozwiązaniami).</p>
<p>Dzięki swojej specyfice node idealnie nadaje się do stron real-time (czaty, agregatory treści i tym podobne), można za jego pomocą stworzyć naprawdę duży, w pełni skalowalny serwis www i wszystko w JavaScript&rsquo;cie. Mnie osobiście node.js wydał się idealnym rozwiązaniem do zaimplementowania czata online podpinanego do stron. Do tego doskonałą technologią jest <strong>WebSocket</strong> dzięki któremu możemy zapomnieć o klasycznych zapytaniach AJAX wysyłanych przez klienta w określonym interwale czasowym. Websocket pozwala na przeniesienie całej logiki aktualizacji treści na serwer, aby to uzyskać potrzebujemy <strong>socket.io</strong> (istnieją inne moduły node.js&rsquo;a do obsługi websocketów, jednak ta jest w/g mnie najwygodniejsza).</p>
<h2 id="przygotowanie-środowiska">Przygotowanie środowiska</h2>
<p>Wszyscy posiadający systemy *NIX (linux, BSD, OSX) mają dość ułatwione zadanie, użytkowników Windows odsyłam do <a href="http://blog.wilgucki.pl/2011/07/instalacja-node-js-na-windows.html" title="Wilgucki blog">bloga</a> (nie wiem czy opisywana metoda działa, nie sprawdzałem). Osobiście uważam, że Windows nie jest dobrą platformą dla webDevelopera, szczególnie teraz gdy do głosu zaczynają dochodzić nowe rozwiązania, typy baz danych i technologie - ale mnie mnie to oceniać. Sam używam OSX oraz Linuxa, więc opiszę jak u mnie to wyglądało:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>brew install node
</span></span><span style="display:flex;"><span>curl http://npmjs.org/install.sh | sh
</span></span></code></pre></div><p><strong>npm</strong> to bardzo przyjemny manager pakietów dla node.js&rsquo;a, dzięki niemu zainstalujemy moduły potrzebne do każdego projektu.</p>
<h2 id="nasz-hello-world">Nasz hello-world</h2>
<p>Jakby nie inaczej. Na początek, dokonałem wyboru frameworka opracowanego na potrzeby node.js&rsquo;a ułatwiającego pisanie aplikacji www o nazwie <strong>express</strong>, aby go zainstalować najpierw tworzymy katalog z projektem: <code>mkdir node-helloworld cd node-helloworld npm install express</code> <strong>express</strong> został przeze mnie wybrany głównie z powodu popularności i prostoty, samych frameworków jest dużo więcej, pewnie zachce przetestować inne, ale na razie express zupełnie mi wystarcza.Teraz cała magia na początek, czyli hello-world. W ulubionym edytorze tworzymy sobie plik np. <strong>app.js</strong> lub jak tam sobie chcemy, a w nim:</p>
<script src="https://gist.github.com/paramah/1136718.js"></script>

<p>Prawda, że proste? Programowanie serwera za pomocą node.js&rsquo;a to naprawdę czysta przyjemność - ale deko trzeba jednak się przetoczyć po dokumentacji oraz kreatywnie rozwiązywać problemy, bo wielu jeszcze nie ma opisanych - nowości tak mają, ale nie ma co się przerażać. Po prostu siadać i pisać serwery.</p>
<p>Nasz serwer odpalamy za pomocą polecenia:
<code>node app.js</code></p>
<p>Prawda, że proste? Programowanie serwera za pomocą node.js&rsquo;a to naprawdę czysta przyjemność - ale deko trzeba jednak się przetoczyć po dokumentacji oraz kreatywnie rozwiązywać problemy, bo wielu jeszcze nie ma opisanych - nowości tak mają, ale nie ma co się przerażać. Po prostu siadać i pisać serwery.</p>
<p>Nasz serwer odpalamy za pomocą polecenia:
<code>node app.js</code></p>
]]></content:encoded>
    </item>
    <item>
      <title>PEAR local config</title>
      <link>https://cynar.ski/2011/07/17/pear-local-config/</link>
      <pubDate>Sun, 17 Jul 2011 18:47:46 +0000</pubDate>
      <guid>https://cynar.ski/2011/07/17/pear-local-config/</guid>
      <description>&lt;p&gt;Aby szybko i bezboleśnie zainstalować sobie PEAR&amp;rsquo;a w katalogu z projektem możemy zastosować poniższy kod:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkdir &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;pwd&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;/vendors
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pear config-create &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;pwd&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;/vendors pear-config
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pear -c pear-conf channel-discover
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pear -c pear-config install /
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
      <content:encoded><![CDATA[<p>Aby szybko i bezboleśnie zainstalować sobie PEAR&rsquo;a w katalogu z projektem możemy zastosować poniższy kod:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>mkdir <span style="color:#e6db74">`</span>pwd<span style="color:#e6db74">`</span>/vendors
</span></span><span style="display:flex;"><span>pear config-create <span style="color:#e6db74">`</span>pwd<span style="color:#e6db74">`</span>/vendors pear-config
</span></span><span style="display:flex;"><span>pear -c pear-conf channel-discover
</span></span><span style="display:flex;"><span>pear -c pear-config install /
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>GitHub for Mac</title>
      <link>https://cynar.ski/2011/06/22/github-for-mac/</link>
      <pubDate>Wed, 22 Jun 2011 21:43:28 +0000</pubDate>
      <guid>https://cynar.ski/2011/06/22/github-for-mac/</guid>
      <description>&lt;p&gt;GitHub dorobił się aplikacji desktopowej &lt;a href=&#34;http://mac.github.com/&#34;&gt;GitHub for Mac&lt;/a&gt;, działa całkiem znośnie. Co więcej ładnie obsługuje nie github&amp;rsquo;owe repozytoria, przyjemny interface, dość szybko działa.&lt;/p&gt;
&lt;p&gt;Co tu dużo mówić, ogólnie polecam (ale raczej jako klikany pomagier niż główny soft do obsługi repozytoriów).&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>GitHub dorobił się aplikacji desktopowej <a href="http://mac.github.com/">GitHub for Mac</a>, działa całkiem znośnie. Co więcej ładnie obsługuje nie github&rsquo;owe repozytoria, przyjemny interface, dość szybko działa.</p>
<p>Co tu dużo mówić, ogólnie polecam (ale raczej jako klikany pomagier niż główny soft do obsługi repozytoriów).</p>
]]></content:encoded>
    </item>
    <item>
      <title>JavaScript array remove element</title>
      <link>https://cynar.ski/2011/05/15/javascript-array-remove-element/</link>
      <pubDate>Sun, 15 May 2011 22:28:13 +0000</pubDate>
      <guid>https://cynar.ski/2011/05/15/javascript-array-remove-element/</guid>
      <description>&lt;p&gt;Szybkie kasowanie elementu jak nie znamy indexu elementu.
Szybko i na temat:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-gdscript3&#34; data-lang=&#34;gdscript3&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Array&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;prototype&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;remove&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;function(s){
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; i &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; this&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;indexOf(s);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(i &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;) this&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;splice(i, &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Wykorzystanie:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;jakisarray.remove(&amp;#39;wartosc&amp;#39;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
      <content:encoded><![CDATA[<p>Szybkie kasowanie elementu jak nie znamy indexu elementu.
Szybko i na temat:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-gdscript3" data-lang="gdscript3"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">Array</span><span style="color:#f92672">.</span>prototype<span style="color:#f92672">.</span>remove<span style="color:#f92672">=</span>function(s){
</span></span><span style="display:flex;"><span>   <span style="color:#66d9ef">var</span> i <span style="color:#f92672">=</span> this<span style="color:#f92672">.</span>indexOf(s);
</span></span><span style="display:flex;"><span>   <span style="color:#66d9ef">if</span>(i <span style="color:#f92672">!=</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>) this<span style="color:#f92672">.</span>splice(i, <span style="color:#ae81ff">1</span>);
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>Wykorzystanie:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>jakisarray.remove(&#39;wartosc&#39;);
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>GIT &#43; management &#43; securing branch model</title>
      <link>https://cynar.ski/2011/03/12/git-management-securing-branch-model/</link>
      <pubDate>Sat, 12 Mar 2011 15:55:04 +0000</pubDate>
      <guid>https://cynar.ski/2011/03/12/git-management-securing-branch-model/</guid>
      <description>&lt;p&gt;No dobra, kiedyś używałem gitosis&amp;rsquo;a ale zaczął mi nie wystarczać, działał nie do końca tak jak chciałem, gwoździem do trumny dla niego stal się fakt że ostatnie dodanie użytkownika nie poszło z palca - coś mu się w główce przestawiło i dupa.&lt;/p&gt;
&lt;p&gt;Migracja na &lt;strong&gt;gitolite&lt;/strong&gt; przeszła bez większych problemów, repozytoria działają, wszystko śmiga, plus jedna dodatkowa rzecz - uprawnienia per użytkownik via branches i tu się zachwyciłem prostotą konfiguracji:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   repo    project
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           RW      master$             =   paramah
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           RW+     develop$            =   paramah
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           RW      develop$            =   mirela
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Teraz wiem, że mirela nie popsuje mi master&amp;rsquo;a, a po sprawdzeniu zmian merge i na produkcję ;-)&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>No dobra, kiedyś używałem gitosis&rsquo;a ale zaczął mi nie wystarczać, działał nie do końca tak jak chciałem, gwoździem do trumny dla niego stal się fakt że ostatnie dodanie użytkownika nie poszło z palca - coś mu się w główce przestawiło i dupa.</p>
<p>Migracja na <strong>gitolite</strong> przeszła bez większych problemów, repozytoria działają, wszystko śmiga, plus jedna dodatkowa rzecz - uprawnienia per użytkownik via branches i tu się zachwyciłem prostotą konfiguracji:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>   repo    project
</span></span><span style="display:flex;"><span>           RW      master$             =   paramah
</span></span><span style="display:flex;"><span>           RW+     develop$            =   paramah
</span></span><span style="display:flex;"><span>           RW      develop$            =   mirela
</span></span></code></pre></div><p>Teraz wiem, że mirela nie popsuje mi master&rsquo;a, a po sprawdzeniu zmian merge i na produkcję ;-)</p>
<p>Smacznego.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Rapid, rapid development</title>
      <link>https://cynar.ski/2011/03/09/rapid-rapid-development/</link>
      <pubDate>Wed, 09 Mar 2011 07:45:23 +0000</pubDate>
      <guid>https://cynar.ski/2011/03/09/rapid-rapid-development/</guid>
      <description>&lt;p&gt;Aktualnie bardzo popularne stało się tworzenie wszelakiej maści aplikacji webowych bazujących na ogólnie dostępnych API, ot małe zestawienie w/g krajów &lt;a href=&#34;http://www.appappeal.com/the-most-popular-app-per-country/web-development/&#34;&gt;Web development App Per Country&lt;/a&gt;. Chyba każdy, kto używał kiedyś wielu API w jednej aplikacji pamięta jak (bez przygotowanych narzędzi) męczące jest debugowanie outputu. Developerów jest coraz więcej (więcej != lepiej) coraz częściej marudzą, że czegoś tam nie zrobią bo &amp;hellip; nie (najczęściej z braku doświadczenia i odpowiedniej wiedzy).&lt;/p&gt;
&lt;h4 id=&#34;wyciągnij-rękę-i-pogłaszcz-developera&#34;&gt;Wyciągnij rękę i pogłaszcz developera&lt;/h4&gt;
&lt;p&gt;Smerani przez innych programatorów, tych &amp;ldquo;z przekonania&amp;rdquo; dostają takie narzędzia jak &lt;a href=&#34;https://apigee.com/&#34;&gt;apigee.com&lt;/a&gt; doskonałe do testowania API, w
ramach serwisu mamy dostęp do takich popularnych interface&amp;rsquo;ów jak &lt;strong&gt;Facebook&lt;/strong&gt;, &lt;strong&gt;Twitter&lt;/strong&gt;, &lt;strong&gt;SoundCloud&lt;/strong&gt; i wiele innych - polecam
do zabawy.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Aktualnie bardzo popularne stało się tworzenie wszelakiej maści aplikacji webowych bazujących na ogólnie dostępnych API, ot małe zestawienie w/g krajów <a href="http://www.appappeal.com/the-most-popular-app-per-country/web-development/">Web development App Per Country</a>. Chyba każdy, kto używał kiedyś wielu API w jednej aplikacji pamięta jak (bez przygotowanych narzędzi) męczące jest debugowanie outputu. Developerów jest coraz więcej (więcej != lepiej) coraz częściej marudzą, że czegoś tam nie zrobią bo &hellip; nie (najczęściej z braku doświadczenia i odpowiedniej wiedzy).</p>
<h4 id="wyciągnij-rękę-i-pogłaszcz-developera">Wyciągnij rękę i pogłaszcz developera</h4>
<p>Smerani przez innych programatorów, tych &ldquo;z przekonania&rdquo; dostają takie narzędzia jak <a href="https://apigee.com/">apigee.com</a> doskonałe do testowania API, w
ramach serwisu mamy dostęp do takich popularnych interface&rsquo;ów jak <strong>Facebook</strong>, <strong>Twitter</strong>, <strong>SoundCloud</strong> i wiele innych - polecam
do zabawy.</p>
<p>Do tego ułatwić można sobie życie za pomocą <strong>reverce proxy</strong> przykład takiego rozwiązania tutaj <a href="http://ipsec.pretasoft.pl">IpSEC PretaSOFT</a>, tak moja firma, mój patent - u mnie działa i się świetnie sprawdza. Przynajmniej pokazywanie/publikowanie (wersji developerskich) z własnego laptopa za firewallami jest bajecznie proste i przyjemne</p>
<p>Na koniec przyjade się coś co powiadomi nas o błędach, a i tu juz powstały rozwiązania ciekawe i dobrze zrobione, ale niestety drogie (pisałem już o <strong>NewRelic</strong>) lepiej sobie zrobić samemu, całość oprzeć o otwarte standardy, opublikować i zacząć używać (czas developmentu: 12h) i oczywiście jakoś nazwać <a href="http://herold.pretasoft.pl">Herold</a> tak, też moje. System powiadamia o błędach aplikacji via XMPP, zapisuje wszystko do bazy danych (ma zabezpieczenia pod postacią klucza oraz referera) robi wszystko co potrzebuje developer, żeby mieć realny feedback ze strony aplikacji a nie klienta (który nie zawsze wszystko wyłapie).</p>
<h4 id="teraz-czas-na-kawę">Teraz czas na kawę!</h4>
<p>Dobranoc i pamiętaj - chcesz coś mieć &ldquo;zrób se sam&rdquo;&quot; ;)</p>
]]></content:encoded>
    </item>
    <item>
      <title>Potrzeba chwili, czyli Netgear DG834Gv5 &#43; jDownloader</title>
      <link>https://cynar.ski/2011/03/05/potrzeba-chwili-czyli-netgear-dg834gv5-jdownloader/</link>
      <pubDate>Sat, 05 Mar 2011 20:26:28 +0000</pubDate>
      <guid>https://cynar.ski/2011/03/05/potrzeba-chwili-czyli-netgear-dg834gv5-jdownloader/</guid>
      <description>&lt;p&gt;Rapidshare, hotfile, fileshare etc.. etc.. jest deko trochę, ale wszystko działa pod jedną aplikacją jDownloader. Jak ktoś chce, może płacić, jak ktoś chce
może czekać, ale jak ktoś chce może też pomyśleć i zrobić sobie dobrze za darmo.&lt;/p&gt;
&lt;p&gt;jDownloader oferuje bardzo fajną funkcję - zmiana adresu IP (czywiście dostępna jest dla ludzi posiadających zmienne IP u swojego ISP), jako klient TPSA mam ten (jedyny) plus, że
takie IP posiadam.&lt;/p&gt;
&lt;p&gt;Poniższy kod działa na &lt;strong&gt;Netgear DG834Gv5&lt;/strong&gt;, niestety nie znajdziecie go w liście dostępnych routerów w jDownload&amp;rsquo;erze, dlatego umieszczam.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Rapidshare, hotfile, fileshare etc.. etc.. jest deko trochę, ale wszystko działa pod jedną aplikacją jDownloader. Jak ktoś chce, może płacić, jak ktoś chce
może czekać, ale jak ktoś chce może też pomyśleć i zrobić sobie dobrze za darmo.</p>
<p>jDownloader oferuje bardzo fajną funkcję - zmiana adresu IP (czywiście dostępna jest dla ludzi posiadających zmienne IP u swojego ISP), jako klient TPSA mam ten (jedyny) plus, że
takie IP posiadam.</p>
<p>Poniższy kod działa na <strong>Netgear DG834Gv5</strong>, niestety nie znajdziecie go w liście dostępnych routerów w jDownload&rsquo;erze, dlatego umieszczam.</p>
<p>Mam nadzieję, że komuś się przyda.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>	<span style="color:#f92672">[[[</span>HSRC<span style="color:#f92672">]]]</span>
</span></span><span style="display:flex;"><span>	   <span style="color:#f92672">[[[</span>STEP<span style="color:#f92672">]]]</span>
</span></span><span style="display:flex;"><span>	       <span style="color:#f92672">[[[</span>REQUEST<span style="color:#f92672">]]]</span>
</span></span><span style="display:flex;"><span>	       GET / HTTP/1.1
</span></span><span style="display:flex;"><span>	       Host: %%%routerip%%%
</span></span><span style="display:flex;"><span>	       Authorization: Basic %%%basicauth%%%
</span></span><span style="display:flex;"><span>	       <span style="color:#f92672">[[[</span>/REQUEST<span style="color:#f92672">]]]</span>
</span></span><span style="display:flex;"><span>	   <span style="color:#f92672">[[[</span>/STEP<span style="color:#f92672">]]]</span>
</span></span><span style="display:flex;"><span>	   <span style="color:#f92672">[[[</span>STEP<span style="color:#f92672">]]]</span>
</span></span><span style="display:flex;"><span>	       <span style="color:#f92672">[[[</span>REQUEST<span style="color:#f92672">]]]</span>
</span></span><span style="display:flex;"><span>	       POST /st_ppa.cgi HTTP/1.1
</span></span><span style="display:flex;"><span>	       Host: %%%routerip%%%
</span></span><span style="display:flex;"><span>	       Authorization: Basic %%%basicauth%%%
</span></span><span style="display:flex;"><span>	ConMethod<span style="color:#f92672">=</span>Disconnect&amp;ConnectStatus<span style="color:#f92672">=</span>Connected
</span></span><span style="display:flex;"><span>	       <span style="color:#f92672">[[[</span>/REQUEST<span style="color:#f92672">]]]</span>
</span></span><span style="display:flex;"><span>	   <span style="color:#f92672">[[[</span>/STEP<span style="color:#f92672">]]]</span>
</span></span><span style="display:flex;"><span>	   <span style="color:#f92672">[[[</span>STEP<span style="color:#f92672">]]]</span>
</span></span><span style="display:flex;"><span>	       <span style="color:#f92672">[[[</span>REQUEST<span style="color:#f92672">]]]</span>
</span></span><span style="display:flex;"><span>	       POST /st_ppa.cgi HTTP/1.1
</span></span><span style="display:flex;"><span>	       Host: %%%routerip%%%
</span></span><span style="display:flex;"><span>	       Authorization: Basic %%%basicauth%%%
</span></span><span style="display:flex;"><span>	ConMethod<span style="color:#f92672">=</span>++Connect++&amp;ConnectStatus<span style="color:#f92672">=</span>Disconnected
</span></span><span style="display:flex;"><span>	       <span style="color:#f92672">[[[</span>/REQUEST<span style="color:#f92672">]]]</span>
</span></span><span style="display:flex;"><span>	   <span style="color:#f92672">[[[</span>/STEP<span style="color:#f92672">]]]</span>
</span></span><span style="display:flex;"><span>	<span style="color:#f92672">[[[</span>/HSRC<span style="color:#f92672">]]]</span>
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>NewRelic - świteny monitor Twojego softu.</title>
      <link>https://cynar.ski/2011/02/01/428/</link>
      <pubDate>Tue, 01 Feb 2011 10:40:33 +0000</pubDate>
      <guid>https://cynar.ski/2011/02/01/428/</guid>
      <description>&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;http://content.screencast.com/users/paramah/folders/Jing/media/058d479a-0f6c-4ff9-81f3-0c10878ac5c7/00000006.png&#34;&gt;&lt;strong&gt;Co to jest &lt;a href=&#34;http://newrelic.com&#34;&gt;NewRelic&lt;/a&gt; ?&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Poborca podatkowy ściągający (prędzej lub później) zaciągnięty przez Ciebie dług technologiczny ;)&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Jeżeli ktoś ma problem z online&amp;rsquo;ową analizą aplikacji web, potrzebuje statystyk zapytań do bazy, odpowiedzi serwera i innych bardzo szczegółowych informacji.
Sam pomysł świetny (deko szkoda, bo mam podobny ale mniej rozbudowany). zmuszenie do raportowania o błędach nie człowieka ale samej aplikacji daje zawsze przewagę twórcy aplikacji. A klient jak już zadzwoni, to nie będzie to &amp;ldquo;zostaliśmy poinformowani przez klienta&amp;rdquo; tylko &amp;ldquo;klient otrzymał informację, że już pracujemy nad rozwiązaniem&amp;rdquo; - o ile brand może się podnieść.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><img loading="lazy" src="http://content.screencast.com/users/paramah/folders/Jing/media/058d479a-0f6c-4ff9-81f3-0c10878ac5c7/00000006.png"><strong>Co to jest <a href="http://newrelic.com">NewRelic</a> ?</strong></p>
<blockquote>
<p>Poborca podatkowy ściągający (prędzej lub później) zaciągnięty przez Ciebie dług technologiczny ;)</p></blockquote>
<p>Jeżeli ktoś ma problem z online&rsquo;ową analizą aplikacji web, potrzebuje statystyk zapytań do bazy, odpowiedzi serwera i innych bardzo szczegółowych informacji.
Sam pomysł świetny (deko szkoda, bo mam podobny ale mniej rozbudowany). zmuszenie do raportowania o błędach nie człowieka ale samej aplikacji daje zawsze przewagę twórcy aplikacji. A klient jak już zadzwoni, to nie będzie to &ldquo;zostaliśmy poinformowani przez klienta&rdquo; tylko &ldquo;klient otrzymał informację, że już pracujemy nad rozwiązaniem&rdquo; - o ile brand może się podnieść.</p>
<p>Oczywiście serwis na dzień dobry daje nam pakiet <strong>gold</strong>, ale niestety tylko na 9 dni - potem za ten pakiet trzeba płacić <strong>200$</strong></p>
]]></content:encoded>
    </item>
    <item>
      <title>Nowomodnie, politycznie...</title>
      <link>https://cynar.ski/2010/10/11/nowomodnie-politycznie/</link>
      <pubDate>Mon, 11 Oct 2010 07:50:05 +0000</pubDate>
      <guid>https://cynar.ski/2010/10/11/nowomodnie-politycznie/</guid>
      <description>&lt;p&gt;Nigdy nie myślałem, że o tym pomyślę - ale&amp;hellip; tylko krowa nie zmienia poglądów.&lt;/p&gt;
&lt;p&gt;Nigdy nie przypuszczałem, że wpadnę na plan zapisania się do partii politycznej ale &amp;hellip;
Po obejrzeniu kolejny raz filmu &lt;a href=&#34;http://bit.ly/bIGUql&#34;&gt;Łowcy smoków&lt;/a&gt; dostrzegłem, a raczej usłyszałem o &lt;a href=&#34;http://bit.ly/c4zmpM&#34;&gt;dubbingu Janusza Palikota&lt;/a&gt;, który dubbinguje &lt;strong&gt;Błędnego rycerza&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Mam teraz realny powód aby zapisać się do partii kolesia, który jest totalnie pogięty. Kto nie widział/słyszał roli - musi to uczynić, naprawdę warto (sama postać rycerza pojawia się na chwilę w mniejwięcej połowie filmu, a jej charakter nie ułatwia dubbingu).&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Nigdy nie myślałem, że o tym pomyślę - ale&hellip; tylko krowa nie zmienia poglądów.</p>
<p>Nigdy nie przypuszczałem, że wpadnę na plan zapisania się do partii politycznej ale &hellip;
Po obejrzeniu kolejny raz filmu <a href="http://bit.ly/bIGUql">Łowcy smoków</a> dostrzegłem, a raczej usłyszałem o <a href="http://bit.ly/c4zmpM">dubbingu Janusza Palikota</a>, który dubbinguje <strong>Błędnego rycerza</strong>.</p>
<p>Mam teraz realny powód aby zapisać się do partii kolesia, który jest totalnie pogięty. Kto nie widział/słyszał roli - musi to uczynić, naprawdę warto (sama postać rycerza pojawia się na chwilę w mniejwięcej połowie filmu, a jej charakter nie ułatwia dubbingu).</p>
<p>Smacznego.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Glukometr na iPhone</title>
      <link>https://cynar.ski/2010/09/22/glukometr-na-iphone/</link>
      <pubDate>Wed, 22 Sep 2010 19:57:52 +0000</pubDate>
      <guid>https://cynar.ski/2010/09/22/glukometr-na-iphone/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://ibgstar.com/web/ibgstar&#34;&gt;&lt;img alt=&#34;iBGStar™&#34; loading=&#34;lazy&#34; src=&#34;http://ibgstar.com/cp/medias/E63447D9-977D-47E9-AD81-87D7463E5A81.jpg&#34;&gt;&lt;/a&gt; Ten temat akuratnie dotyczy mnie bezpośrednio, gdyż od ponad 2 lat jestem cukrzykiem.&lt;/p&gt;
&lt;p&gt;Aplikacji na &lt;strong&gt;iPhone&amp;rsquo;a&lt;/strong&gt; pozwalających prowadzić dzienniczek pomiarów jest co nie miara, ale komu się chce za każdym razem wszystko pisywać ? Firma &lt;a href=&#34;http://ibgstar.com/web/about_us&#34;&gt;Sanofi-aventis&lt;/a&gt; stworzyła przystawkę do &lt;strong&gt;iPhone&amp;rsquo;a&lt;/strong&gt; pozwalającą na pomiar cukru we krwi. &lt;a href=&#34;http://ibgstar.com/web/ibgstar&#34;&gt;iBGStar™&lt;/a&gt;, bo o tym wynalazku mowa jest modułem wpinanym do telefonu.
Ciekawym jest fakt, że urządzenie nie potrzebuje kodów do pasków.&lt;/p&gt;
&lt;p&gt;W naszym kraju raczej nie prędko się ów pojawi, jak dla mnie rozwiązanie jest genialne. Czekam na informacje - bo może kiedyś będę mógł zakupić urządzenie.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="http://ibgstar.com/web/ibgstar"><img alt="iBGStar™" loading="lazy" src="http://ibgstar.com/cp/medias/E63447D9-977D-47E9-AD81-87D7463E5A81.jpg"></a> Ten temat akuratnie dotyczy mnie bezpośrednio, gdyż od ponad 2 lat jestem cukrzykiem.</p>
<p>Aplikacji na <strong>iPhone&rsquo;a</strong> pozwalających prowadzić dzienniczek pomiarów jest co nie miara, ale komu się chce za każdym razem wszystko pisywać ? Firma <a href="http://ibgstar.com/web/about_us">Sanofi-aventis</a> stworzyła przystawkę do <strong>iPhone&rsquo;a</strong> pozwalającą na pomiar cukru we krwi. <a href="http://ibgstar.com/web/ibgstar">iBGStar™</a>, bo o tym wynalazku mowa jest modułem wpinanym do telefonu.
Ciekawym jest fakt, że urządzenie nie potrzebuje kodów do pasków.</p>
<p>W naszym kraju raczej nie prędko się ów pojawi, jak dla mnie rozwiązanie jest genialne. Czekam na informacje - bo może kiedyś będę mógł zakupić urządzenie.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Peer-to-Peer VPN - n2n</title>
      <link>https://cynar.ski/2010/09/19/peer-to-peer-vpn-n2n/</link>
      <pubDate>Sun, 19 Sep 2010 15:18:13 +0000</pubDate>
      <guid>https://cynar.ski/2010/09/19/peer-to-peer-vpn-n2n/</guid>
      <description>&lt;p&gt;Niedawno rozmawiałem ze znajomym z &lt;a href=&#34;http://telesieci.pl&#34;&gt;telesieci.pl&lt;/a&gt;, firmy zajmującej się wdrażaniem rozwiązań VoIP dla firm. Piotrek wkęcił mnie w nowe rozwiązanie problemu &amp;ldquo;failover&amp;rdquo; dla sieci wirtualnych.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;n2n VPN&lt;/strong&gt; bo o nim mowa, to VPN bazujący na sieciach p2p.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;http://www.ntop.org/n2n/2.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;Ciekawe rozwiązanie to publiczne &lt;strong&gt;super nodes&lt;/strong&gt; przez które może przechodzić wiele niezależnych polączeń VPN, a dzięki zastosowaniu szyfrowania wewnątrz tunelu klienci różnych VPN&amp;rsquo;ów w obrębie jednego &lt;strong&gt;super node&lt;/strong&gt; nie widzą
nie swoich pakietów. Rozwiązanie świetne, tym bardziej że jest to VPN L2.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Niedawno rozmawiałem ze znajomym z <a href="http://telesieci.pl">telesieci.pl</a>, firmy zajmującej się wdrażaniem rozwiązań VoIP dla firm. Piotrek wkęcił mnie w nowe rozwiązanie problemu &ldquo;failover&rdquo; dla sieci wirtualnych.</p>
<p><strong>n2n VPN</strong> bo o nim mowa, to VPN bazujący na sieciach p2p.</p>
<p><img loading="lazy" src="http://www.ntop.org/n2n/2.png"></p>
<p>Ciekawe rozwiązanie to publiczne <strong>super nodes</strong> przez które może przechodzić wiele niezależnych polączeń VPN, a dzięki zastosowaniu szyfrowania wewnątrz tunelu klienci różnych VPN&rsquo;ów w obrębie jednego <strong>super node</strong> nie widzą
nie swoich pakietów. Rozwiązanie świetne, tym bardziej że jest to VPN L2.</p>
<p>Zainteresowany tematem, pragnę bardziej go zgłębić.</p>
<p>Mam też nadzieję, że niebawem Piotr coś wyskrobie na ten temat, chętnie poczytam. ;-)</p>
]]></content:encoded>
    </item>
    <item>
      <title>Debian L2TP (over IPSec) &#43; iPhone &#43; OSX = working</title>
      <link>https://cynar.ski/2010/09/18/debian-l2tp-over-ipsec-iphone-osx-working/</link>
      <pubDate>Sat, 18 Sep 2010 12:39:08 +0000</pubDate>
      <guid>https://cynar.ski/2010/09/18/debian-l2tp-over-ipsec-iphone-osx-working/</guid>
      <description>&lt;p&gt;W końcu usiadłem do konfiguracji VPN&amp;rsquo;a, w końcu ja mam iPhone&amp;rsquo;a, moja żona też ma iPhone&amp;rsquo;a. W końcu nadchodzi taki moment, aby wszystkie urządzenia gadały między sobą w sposób nie widoczny dla innych.&lt;/p&gt;
&lt;p&gt;Przygotowania:&lt;/p&gt;
&lt;p&gt;Ciekawy i dość konkretny artykuł znalazłem na stronie &lt;a href=&#34;http://nielspeen.com/blog/2009/04/linux-l2tpipsec-with-iphone-and-mac-osx-clients/&#34;&gt;Linux L2TP/IPSec with iPhone and Mac OS/X clients&lt;/a&gt;, jednak niestety okazało się, że nie wszystko jest tak jak bym chciał. Tak czy owak polecam artykuł, bo to co jest poniżej to wariacja na jego temat.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>W końcu usiadłem do konfiguracji VPN&rsquo;a, w końcu ja mam iPhone&rsquo;a, moja żona też ma iPhone&rsquo;a. W końcu nadchodzi taki moment, aby wszystkie urządzenia gadały między sobą w sposób nie widoczny dla innych.</p>
<p>Przygotowania:</p>
<p>Ciekawy i dość konkretny artykuł znalazłem na stronie <a href="http://nielspeen.com/blog/2009/04/linux-l2tpipsec-with-iphone-and-mac-osx-clients/">Linux L2TP/IPSec with iPhone and Mac OS/X clients</a>, jednak niestety okazało się, że nie wszystko jest tak jak bym chciał. Tak czy owak polecam artykuł, bo to co jest poniżej to wariacja na jego temat.</p>
<p>Wszystko do momentu pobierania źródeł <strong>Strongswan&rsquo;a</strong> jest jak w wyżej załączonym linku, potem małe schody z budowaniem deb&rsquo;a. Ale po kolei.</p>
<p>Do poprawnego działania <strong>strgonswan</strong> co prawda nie potrzebuje rekompilacji, ale w 80% przypadków będziemy ze swoim telefonem lub laptopem znajdowali się za NAT&rsquo;em a tu niestety trzeba deko zaingerować w <strong>strongswan</strong>. Debian nie posiada wkompilowanej obsługi <strong>NAT&rsquo;a</strong>.</p>
<p>Po kolei co trzeba zrobić (część poniższego jest kopią z zlinkowanej strony):</p>
<p><strong>/etc/ipsec.conf</strong> ```</p>
<p>config setup
# crlcheckinterval=600
# strictcrlpolicy=yes
# cachecrls=yes
nat_traversal=yes
charonstart=yes
plutostart=yes
conn L2TP
authby=psk
pfs=no
rekey=no
type=tunnel
esp=aes128-sha1
ike=aes128-sha-modp1024
left=your.ip.goes.here
leftnexthop=%defaultroute
leftprotoport=17/1701
right=%any
rightprotoport=17/%any
rightsubnetwithin=0.0.0.0/0
auto=add
` <strong>/etc/ipsec.secrets</strong> ```</p>
<p>your.ip.goes.here %any:     PSK &ldquo;yoursharedkeygoeshere&rdquo;</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Teraz już zaczynamy deko wariować ;-)
</span></span><span style="display:flex;"><span>Pierwsze to sprawdzenie czy w naszym **/etc/apt/sources.list** są wpisy deb-src, pozwalające na ściąganie źródeł pakietów.
</span></span></code></pre></div><p>apt-get install build-essential fakeroot dpkg-dev devscripts
apt-get source strongswan
apt-get install libcurl4-openssl-dev
apt-get build-dep strongswan
cd strongswan-4.2.4/
dch -i</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-gdscript3" data-lang="gdscript3"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Za pomocą ulubionego edytora tekstowego, otwieramy plik <span style="color:#f92672">**</span>debian<span style="color:#f92672">/</span>rules<span style="color:#f92672">**</span> <span style="color:#960050;background-color:#1e0010">```</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">#!/usr/bin/make -f</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Sample debian/rules that uses debhelper.</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># GNU copyright 1997 to 1999 by Joey Hess.</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Uncomment this to turn on verbose mode.</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">export</span> DH_VERBOSE<span style="color:#f92672">=</span><span style="color:#ae81ff">1</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">export</span> DH_OPTIONS
</span></span><span style="display:flex;"><span><span style="color:#75715e"># this is a security-critical package, set all the options we can</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">export</span> DEB_BUILD_HARDENING<span style="color:#f92672">=</span><span style="color:#ae81ff">1</span>
</span></span><span style="display:flex;"><span>CONFIGUREARGS :<span style="color:#f92672">=</span> <span style="color:#f92672">--</span>prefix<span style="color:#f92672">=/</span>usr <span style="color:#f92672">--</span>sysconfdir<span style="color:#f92672">=/</span>etc <span style="color:#f92672">--</span>localstatedir<span style="color:#f92672">=/</span><span style="color:#66d9ef">var</span> \
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">--</span>libexecdir<span style="color:#f92672">=/</span>usr<span style="color:#f92672">/</span>lib \
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">--</span>enable<span style="color:#f92672">-</span>ldap <span style="color:#f92672">--</span>enable<span style="color:#f92672">-</span>curl \
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">--</span>enable<span style="color:#f92672">-</span>nonblocking <span style="color:#f92672">--</span>enable<span style="color:#f92672">-</span>thread \
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">--</span>enable<span style="color:#f92672">-</span>smartcard <span style="color:#f92672">--</span>enable<span style="color:#f92672">-</span>cisco<span style="color:#f92672">-</span>quirks \
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">--</span>with<span style="color:#f92672">-</span>default<span style="color:#f92672">-</span>pkcs11<span style="color:#f92672">=/</span>usr<span style="color:#f92672">/</span>lib<span style="color:#f92672">/</span>opensc<span style="color:#f92672">-</span>pkcs11<span style="color:#f92672">.</span>so \
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">--</span>enable<span style="color:#f92672">-</span>mediation <span style="color:#f92672">--</span>enable<span style="color:#f92672">-</span>medsrv <span style="color:#f92672">--</span>enable<span style="color:#f92672">-</span>medcli \
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">--</span>enable<span style="color:#f92672">-</span>openssl <span style="color:#f92672">--</span>enable<span style="color:#f92672">-</span>agent \
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">--</span>enable<span style="color:#f92672">-</span>eap<span style="color:#f92672">-</span>radius <span style="color:#f92672">--</span>enable<span style="color:#f92672">-</span>eap<span style="color:#f92672">-</span>identity <span style="color:#f92672">--</span>enable<span style="color:#f92672">-</span>eap<span style="color:#f92672">-</span>md5 \
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">--</span>enable<span style="color:#f92672">-</span>eap<span style="color:#f92672">-</span>gtc <span style="color:#f92672">--</span>enable<span style="color:#f92672">-</span>eap<span style="color:#f92672">-</span>aka <span style="color:#f92672">--</span>enable<span style="color:#f92672">-</span>eap<span style="color:#f92672">-</span>mschapv2 \
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">--</span>enable<span style="color:#f92672">-</span>sql \
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">--</span>disable<span style="color:#f92672">-</span>aes <span style="color:#f92672">--</span>disable<span style="color:#f92672">-</span>des <span style="color:#f92672">--</span>disable<span style="color:#f92672">-</span>fips<span style="color:#f92672">-</span>prf <span style="color:#f92672">--</span>disable<span style="color:#f92672">-</span>gmp \
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">--</span>disable<span style="color:#f92672">-</span>md5 <span style="color:#f92672">--</span>disable<span style="color:#f92672">-</span>sha1 <span style="color:#f92672">--</span>disable<span style="color:#f92672">-</span>sha2 \
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">--</span>enable<span style="color:#f92672">-</span>nm
</span></span><span style="display:flex;"><span> (<span style="color:#f92672">...</span>)
</span></span></code></pre></div><p>Do <strong>CONFIGUREARGS</strong> odpisujemy <strong>&ndash;enable-nat-transport</strong>, w celu włączenia obsługi NAT&rsquo;a</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">dpkg</span><span style="color:#f92672">-</span><span style="color:#a6e22e">buildpackage</span> <span style="color:#f92672">-</span><span style="color:#a6e22e">rfakeroot</span> <span style="color:#f92672">-</span><span style="color:#a6e22e">uc</span> <span style="color:#f92672">-</span><span style="color:#a6e22e">b</span>
</span></span></code></pre></div><p>Powyższa komenda zbuduje nam pakiet debiana, jednak u mnie problem pojawił się ze źródłami libnm-glib-vpn, nie wiedzieć dlaczego ale instalator ich nie widział a pakiet zainstalowany był.</p>
<p>Nie ma czym się przejmować, linux to linux - nie zawsze trzeba zrobić wszystko &ldquo;ładnie&rdquo; - czasem wystarczy, tak aby działało:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>pkg-config --cflags libnm-glib-vpn
</span></span></code></pre></div><p>U mnie output był taki:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>-pthread -I/usr/include/libnm-glib -I/usr/include/NetworkManager -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include
</span></span></code></pre></div><p>Jeżeli pośpieszyliście się z <strong>dpkg-buildpackage</strong> to pewnie dostaliście informacje (o ile też problem występuje u Was) o sposobie poradzenia sobie z problemem, ja zrobiłem to prosto:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-gdscript3" data-lang="gdscript3"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>nm_CFLAGS<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;-pthread -I/usr/include/libnm-glib -I/usr/include/NetworkManager -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">export</span> nm_CFLAGS
</span></span><span style="display:flex;"><span>nm_LIBS<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;/usr/include/NetworkManager/&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">export</span> nm_LIBS
</span></span></code></pre></div><p>następnie, znany już:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">dpkg</span><span style="color:#f92672">-</span><span style="color:#a6e22e">buildpackage</span> <span style="color:#f92672">-</span><span style="color:#a6e22e">rfakeroot</span> <span style="color:#f92672">-</span><span style="color:#a6e22e">uc</span> <span style="color:#f92672">-</span><span style="color:#a6e22e">b</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">cd</span> ..<span style="color:#f92672">/</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">ls</span> <span style="color:#f92672">-</span><span style="color:#a6e22e">l</span> |<span style="color:#a6e22e">grep</span> .<span style="color:#a6e22e">deb</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">-</span><span style="color:#a6e22e">rw</span><span style="color:#f92672">-</span><span style="color:#a6e22e">r</span><span style="color:#f92672">--</span><span style="color:#a6e22e">r</span><span style="color:#f92672">--</span> <span style="color:#ae81ff">1</span> <span style="color:#a6e22e">root</span> <span style="color:#a6e22e">root</span>   <span style="color:#ae81ff">188328</span> <span style="color:#ae81ff">09</span><span style="color:#f92672">-</span><span style="color:#ae81ff">18</span> <span style="color:#ae81ff">11</span>:<span style="color:#ae81ff">57</span> <span style="color:#a6e22e">libstrongswan_4</span><span style="color:#ae81ff">.3.2</span><span style="color:#f92672">-</span><span style="color:#ae81ff">1.4</span><span style="color:#a6e22e">_amd64</span>.<span style="color:#a6e22e">deb</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">-</span><span style="color:#a6e22e">rw</span><span style="color:#f92672">-</span><span style="color:#a6e22e">r</span><span style="color:#f92672">--</span><span style="color:#a6e22e">r</span><span style="color:#f92672">--</span> <span style="color:#ae81ff">1</span> <span style="color:#a6e22e">root</span> <span style="color:#a6e22e">root</span>    <span style="color:#ae81ff">70366</span> <span style="color:#ae81ff">09</span><span style="color:#f92672">-</span><span style="color:#ae81ff">18</span> <span style="color:#ae81ff">11</span>:<span style="color:#ae81ff">56</span> <span style="color:#a6e22e">strongswan_4</span><span style="color:#ae81ff">.3.2</span><span style="color:#f92672">-</span><span style="color:#ae81ff">1.4</span><span style="color:#a6e22e">_all</span>.<span style="color:#a6e22e">deb</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">-</span><span style="color:#a6e22e">rw</span><span style="color:#f92672">-</span><span style="color:#a6e22e">r</span><span style="color:#f92672">--</span><span style="color:#a6e22e">r</span><span style="color:#f92672">--</span> <span style="color:#ae81ff">1</span> <span style="color:#a6e22e">root</span> <span style="color:#a6e22e">root</span>   <span style="color:#ae81ff">349814</span> <span style="color:#ae81ff">09</span><span style="color:#f92672">-</span><span style="color:#ae81ff">18</span> <span style="color:#ae81ff">11</span>:<span style="color:#ae81ff">57</span> <span style="color:#a6e22e">strongswan</span><span style="color:#f92672">-</span><span style="color:#a6e22e">ikev1_4</span><span style="color:#ae81ff">.3.2</span><span style="color:#f92672">-</span><span style="color:#ae81ff">1.4</span><span style="color:#a6e22e">_amd64</span>.<span style="color:#a6e22e">deb</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">-</span><span style="color:#a6e22e">rw</span><span style="color:#f92672">-</span><span style="color:#a6e22e">r</span><span style="color:#f92672">--</span><span style="color:#a6e22e">r</span><span style="color:#f92672">--</span> <span style="color:#ae81ff">1</span> <span style="color:#a6e22e">root</span> <span style="color:#a6e22e">root</span>   <span style="color:#ae81ff">256576</span> <span style="color:#ae81ff">09</span><span style="color:#f92672">-</span><span style="color:#ae81ff">18</span> <span style="color:#ae81ff">11</span>:<span style="color:#ae81ff">57</span> <span style="color:#a6e22e">strongswan</span><span style="color:#f92672">-</span><span style="color:#a6e22e">ikev2_4</span><span style="color:#ae81ff">.3.2</span><span style="color:#f92672">-</span><span style="color:#ae81ff">1.4</span><span style="color:#a6e22e">_amd64</span>.<span style="color:#a6e22e">deb</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">-</span><span style="color:#a6e22e">rw</span><span style="color:#f92672">-</span><span style="color:#a6e22e">r</span><span style="color:#f92672">--</span><span style="color:#a6e22e">r</span><span style="color:#f92672">--</span> <span style="color:#ae81ff">1</span> <span style="color:#a6e22e">root</span> <span style="color:#a6e22e">root</span>    <span style="color:#ae81ff">45092</span> <span style="color:#ae81ff">09</span><span style="color:#f92672">-</span><span style="color:#ae81ff">18</span> <span style="color:#ae81ff">11</span>:<span style="color:#ae81ff">57</span> <span style="color:#a6e22e">strongswan</span><span style="color:#f92672">-</span><span style="color:#a6e22e">nm_4</span><span style="color:#ae81ff">.3.2</span><span style="color:#f92672">-</span><span style="color:#ae81ff">1.4</span><span style="color:#a6e22e">_amd64</span>.<span style="color:#a6e22e">deb</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">-</span><span style="color:#a6e22e">rw</span><span style="color:#f92672">-</span><span style="color:#a6e22e">r</span><span style="color:#f92672">--</span><span style="color:#a6e22e">r</span><span style="color:#f92672">--</span> <span style="color:#ae81ff">1</span> <span style="color:#a6e22e">root</span> <span style="color:#a6e22e">root</span>   <span style="color:#ae81ff">291452</span> <span style="color:#ae81ff">09</span><span style="color:#f92672">-</span><span style="color:#ae81ff">18</span> <span style="color:#ae81ff">11</span>:<span style="color:#ae81ff">57</span> <span style="color:#a6e22e">strongswan</span><span style="color:#f92672">-</span><span style="color:#a6e22e">starter_4</span><span style="color:#ae81ff">.3.2</span><span style="color:#f92672">-</span><span style="color:#ae81ff">1.4</span><span style="color:#a6e22e">_amd64</span>.<span style="color:#a6e22e">deb</span>
</span></span></code></pre></div><p>Tak to wygląda u mnie, u Was powinno podobnie.</p>
<p>Następnie instalujemy za pomocą <strong>dpkg -i pliki_deb</strong></p>
<p>Jak to już jest zainstalowane to pierwszy etap za nami, teraz konfiguracja i instalacja <strong>xl2tpd</strong>, tu jest deko łatwiej:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	apt-get install xl2tpd
</span></span></code></pre></div><p>Konfigurujemy demona xl2tpd:
<strong>/etc/xl2tpd/xl2tpd.conf</strong> ```</p>
<pre><code>[global]
debug network = yes
debug tunnel = yes
[lns default]
ip range = 172.16.1.100-172.16.1.254
local ip = 172.16.1.1
require chap = yes
refuse pap = yes
require authentication = yes
name = pretasoft.pl
ppp debug = yes
pppoptfile = /etc/ppp/options.xl2tpd
length bit = yes
</code></pre>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Ustawiamy hasło globalne:
</span></span><span style="display:flex;"><span>**/etc/xl2tpd/l2tp-secrets** ```
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	# Secrets for authenticating l2tp tunnels
</span></span><span style="display:flex;"><span>	# us	them	secret
</span></span><span style="display:flex;"><span>	# *		marko blah2
</span></span><span style="display:flex;"><span>	# zeus		marko	blah
</span></span><span style="display:flex;"><span>	# *	*	interop
</span></span><span style="display:flex;"><span>	*       *       haslo_globalne *
</span></span></code></pre></div><p>Opcje xl2tpd dla połączeń ppp
<strong>/etc/ppp/options.xl2tpd</strong> ```</p>
<pre><code>ipcp-accept-local
ipcp-accept-remote
ms-dns twoj_dns
noccp
auth
crtscts
idle 1800
mtu 1410
mru 1410
nodefaultroute
debug
lock
proxyarp
connect-delay 5000
</code></pre>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Plik chap z naszymi klientami VPN:
</span></span><span style="display:flex;"><span>**/etc/ppp/chap-secrets** ```
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	# Secrets for authentication using CHAP
</span></span><span style="display:flex;"><span>	# client	server		secret				IP addresses
</span></span><span style="display:flex;"><span>	client1 * haslo1 *
</span></span><span style="display:flex;"><span>	client2 * haslo2 *
</span></span></code></pre></div><p>Na samym końcu:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	/etc/init.d/ipsec start
</span></span><span style="display:flex;"><span>	/etc/init.d/xl2tpd start
</span></span></code></pre></div><p>Taka konfiguracja u mnie działa i na iPhone&rsquo;ach oraz OSX&rsquo;ie.</p>
<p>Jak ktoś zauważył błąd to proszę o komentarze, powodzenia z VPN&rsquo;em.</p>
]]></content:encoded>
    </item>
    <item>
      <title>screen &#43; dvtm = tmux</title>
      <link>https://cynar.ski/2010/09/06/screen-dvtm-tmux/</link>
      <pubDate>Mon, 06 Sep 2010 22:57:51 +0000</pubDate>
      <guid>https://cynar.ski/2010/09/06/screen-dvtm-tmux/</guid>
      <description>&lt;p&gt;Przez zupełny przypadek odkryłem projekt &lt;a href=&#34;http://tmux.sourceforge.net/&#34;&gt;tmux&lt;/a&gt;, zastępca screen&amp;rsquo;a i dvtm&amp;rsquo;a, których to używam namiętnie i nie przerwanie.&lt;/p&gt;
&lt;p&gt;Do mnie przemawia:
&lt;img alt=&#34;To jest tmux&#34; loading=&#34;lazy&#34; src=&#34;http://tmux.sourceforge.net/tmux5.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;Pozatym dość bogaty help &lt;strong&gt;C-b ?&lt;/strong&gt; - na razie jest na prowadzeniu.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Przez zupełny przypadek odkryłem projekt <a href="http://tmux.sourceforge.net/">tmux</a>, zastępca screen&rsquo;a i dvtm&rsquo;a, których to używam namiętnie i nie przerwanie.</p>
<p>Do mnie przemawia:
<img alt="To jest tmux" loading="lazy" src="http://tmux.sourceforge.net/tmux5.png"></p>
<p>Pozatym dość bogaty help <strong>C-b ?</strong> - na razie jest na prowadzeniu.</p>
]]></content:encoded>
    </item>
    <item>
      <title>OSX, polskie stacje &#43; FStream</title>
      <link>https://cynar.ski/2010/08/30/osx-polskie-stacje-fstream/</link>
      <pubDate>Mon, 30 Aug 2010 07:10:35 +0000</pubDate>
      <guid>https://cynar.ski/2010/08/30/osx-polskie-stacje-fstream/</guid>
      <description>&lt;p&gt;Od jakiegoś czasu pracuje na sprzęcie firmowym, wszystko fajnie - jedyne co mi doskwiera to brak muzyki. Można sobie z tym poradzić na kilka sposobów (tak aby nie trzymać muzyki lokalnie):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;ldquo;iTunes online&amp;rdquo;, czyli &lt;a href=&#34;http://listen.grooveshark.com/&#34;&gt;grooveshark.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;zassać programik &lt;a href=&#34;http://www.sourcemac.com/?page=fstream&#34;&gt;FStream&lt;/a&gt;, a następnie zaimportować sobie plik z polskimi stacjami online: &lt;a href=&#34;http://appleblog.pl/polskie-stacje-dla-fstream&#34;&gt;Appleblog.pl - Polskie stacje dla fstream&lt;/a&gt;, osobiście polecam jeszcze stronkę z listą: &lt;a href=&#34;http://www.listenlive.eu/poland.html&#34;&gt;lista polskich stacji radiowych&lt;/a&gt; oraz nieśmiertelne&lt;/li&gt;
&lt;/ul&gt;</description>
      <content:encoded><![CDATA[<p>Od jakiegoś czasu pracuje na sprzęcie firmowym, wszystko fajnie - jedyne co mi doskwiera to brak muzyki. Można sobie z tym poradzić na kilka sposobów (tak aby nie trzymać muzyki lokalnie):</p>
<ul>
<li>&ldquo;iTunes online&rdquo;, czyli <a href="http://listen.grooveshark.com/">grooveshark.com</a></li>
<li>zassać programik <a href="http://www.sourcemac.com/?page=fstream">FStream</a>, a następnie zaimportować sobie plik z polskimi stacjami online: <a href="http://appleblog.pl/polskie-stacje-dla-fstream">Appleblog.pl - Polskie stacje dla fstream</a>, osobiście polecam jeszcze stronkę z listą: <a href="http://www.listenlive.eu/poland.html">lista polskich stacji radiowych</a> oraz nieśmiertelne</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>homebrew package manager OS X</title>
      <link>https://cynar.ski/2010/08/19/homebrew-package-manager-os-x/</link>
      <pubDate>Thu, 19 Aug 2010 18:30:35 +0000</pubDate>
      <guid>https://cynar.ski/2010/08/19/homebrew-package-manager-os-x/</guid>
      <description>&lt;p&gt;Przez wiele lat używałem &lt;a href=&#34;http://www.macports.org/&#34;&gt;MacPorts&lt;/a&gt;, jednak jakiś czas temu dotarła do mnie informacja o istnieniu nowego managera pakietów dla OSX - &lt;a href=&#34;http://mxcl.github.com/homebrew/&#34;&gt;Homebrew&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Informację jak zawsze obtagowałem i odłożyłem na potem. Ostatnie przejścia z moim laptopem przyczyniły się do zmiany MacPorts na Homebrew - generalnie jestem zadowolony.&lt;/p&gt;
&lt;p&gt;System napisany jest w ruby&amp;rsquo;m, pozawala w prosty sposób zarządzać i dodawać nowe pakiety do repozytorium - wszystko bazuje na git&amp;rsquo;cie, github&amp;rsquo;ie i prostych skryptach w ruby&amp;rsquo;m.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Przez wiele lat używałem <a href="http://www.macports.org/">MacPorts</a>, jednak jakiś czas temu dotarła do mnie informacja o istnieniu nowego managera pakietów dla OSX - <a href="http://mxcl.github.com/homebrew/">Homebrew</a>.</p>
<p>Informację jak zawsze obtagowałem i odłożyłem na potem. Ostatnie przejścia z moim laptopem przyczyniły się do zmiany MacPorts na Homebrew - generalnie jestem zadowolony.</p>
<p>System napisany jest w ruby&rsquo;m, pozawala w prosty sposób zarządzać i dodawać nowe pakiety do repozytorium - wszystko bazuje na git&rsquo;cie, github&rsquo;ie i prostych skryptach w ruby&rsquo;m.</p>
<p>Przykładowy plik z pakietem (tzw. formula):</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>require &#39;formula&#39;
</span></span><span style="display:flex;"><span>class MidnightCommander
</span></span><span style="display:flex;"><span>Jak widać powyżej idea jest bajecznie prosta i przystępna. Co więcej każdy pakiet jest instalowany z władnym zdefiniowanym --prefix co daje duże możliwości, a zarazem ładnie się odkłada w systemie.
</span></span><span style="display:flex;"><span>Duża giętkość homebrew pozwala na szybkie tworzenie własnych rozszerzeń i komend systemowych. Homebrew jest dla wszystkich lubiących porządek i ceniących sobie możliwości daleko idącej personalizacji - ja jestem za ;-) ```
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>Nowy digg, hmmm...</title>
      <link>https://cynar.ski/2010/08/18/nowy-digg-hmmm/</link>
      <pubDate>Wed, 18 Aug 2010 23:28:15 +0000</pubDate>
      <guid>https://cynar.ski/2010/08/18/nowy-digg-hmmm/</guid>
      <description>&lt;p&gt;No i jest nowy Digg :)&lt;/p&gt;
&lt;p&gt;Na dzień dobry przywitany zostałem przyjemnym komunikatem:
&lt;img alt=&#34;Digg&amp;hellip;&#34; loading=&#34;lazy&#34; src=&#34;http://grab.by/5Y9O&#34;&gt;&lt;/p&gt;
&lt;p&gt;Oprawa graficzna, no cóż trąci Facebookiem. Właściwie trudno się dziwić.&lt;/p&gt;
&lt;p&gt;Mnie osobiście brakuje możliwości logowania za pomocą OpenID.&lt;/p&gt;
&lt;p&gt;Zobaczymy jak to działa - w praniu.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>No i jest nowy Digg :)</p>
<p>Na dzień dobry przywitany zostałem przyjemnym komunikatem:
<img alt="Digg&hellip;" loading="lazy" src="http://grab.by/5Y9O"></p>
<p>Oprawa graficzna, no cóż trąci Facebookiem. Właściwie trudno się dziwić.</p>
<p>Mnie osobiście brakuje możliwości logowania za pomocą OpenID.</p>
<p>Zobaczymy jak to działa - w praniu.</p>
]]></content:encoded>
    </item>
    <item>
      <title>HipHop for FreeBSD | HPHP Playground</title>
      <link>https://cynar.ski/2010/07/28/hiphop-for-freebsd-hphp-playground/</link>
      <pubDate>Wed, 28 Jul 2010 20:01:32 +0000</pubDate>
      <guid>https://cynar.ski/2010/07/28/hiphop-for-freebsd-hphp-playground/</guid>
      <description>&lt;p&gt;Teraz już tylko dzieli mały kroczek od Hip-Hop&amp;rsquo;a na OSX ;]&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://huichen.org/en/2010/07/hiphop-for-freebsd/&#34;&gt;HipHop for FreeBSD | HPHP Playground&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Teraz już tylko dzieli mały kroczek od Hip-Hop&rsquo;a na OSX ;]</p>
<p><a href="http://huichen.org/en/2010/07/hiphop-for-freebsd/">HipHop for FreeBSD | HPHP Playground</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Zalety dobrego pijaru...</title>
      <link>https://cynar.ski/2010/05/30/zalety-dobrego-pijaru/</link>
      <pubDate>Sun, 30 May 2010 01:17:42 +0000</pubDate>
      <guid>https://cynar.ski/2010/05/30/zalety-dobrego-pijaru/</guid>
      <description>&lt;p&gt;Generalnie każdy chce się zareklamować z dobrej, jak najlepszej strony. Umieszcza więc wersję demo swojego produktu, najlepiej online - w końcu czemu by nie skorzystać z dobrodziejstw &amp;ldquo;światowej sieci&amp;rdquo;. Już sama nazwa działa jak lep na muchy wszystkich &amp;ldquo;fachowców&amp;rdquo; do marketingu - światowa AAAAAA. No jeden z drugim siadają naprzeciw siebie i &amp;ldquo;móżdżą&amp;rdquo;, kombinują, piją kawa za kawą. OO jest pomysł na reklamę światową. Zamieńmy naszą aplikację na stronę, tak aby nikt nie mógł nam podpierdolić softu. Przecież złodzieje czają się na każdym kroku. No i tworzą, tworzą, programują tygodnie całe. Systemy przerabiają, moduły dodają, kombinują ogólnie jak dzikie konie. Melają tak jeszcze czas jakiś. Mieszając dokumentnie w kodzie, na serwerach, w domach, na łatkach i przy balustradach - ale klops, dupa zbita - działać nie będzie i basta. Tutaj zwyczajowy konflikt wewnętrzny pomiędzy marketingowcami a programistami, grafikami, administratorami - ogólnie ludźmi, którzy starają się coś zrobić. No może nie zawsze dla dobra tak zwanej firmy, ale dla siebie - ot zwyczajowo, żeby było ładnie. A przecież ostatnio na stackoverflow było ciekawe rozwiązanie podobnego problemu - tylko jak kurwa to ma prawo działać? A jednak, nie działa - HA!. Ale nic to, obejście zawsze się znajdzie, tutaj wchodzą stare słowa: &amp;ldquo;nie trzeba ładnie, wystarczy skutecznie&amp;rdquo; no i jest - upgragniona wersja:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Generalnie każdy chce się zareklamować z dobrej, jak najlepszej strony. Umieszcza więc wersję demo swojego produktu, najlepiej online - w końcu czemu by nie skorzystać z dobrodziejstw &ldquo;światowej sieci&rdquo;. Już sama nazwa działa jak lep na muchy wszystkich &ldquo;fachowców&rdquo; do marketingu - światowa AAAAAA. No jeden z drugim siadają naprzeciw siebie i &ldquo;móżdżą&rdquo;, kombinują, piją kawa za kawą. OO jest pomysł na reklamę światową. Zamieńmy naszą aplikację na stronę, tak aby nikt nie mógł nam podpierdolić softu. Przecież złodzieje czają się na każdym kroku. No i tworzą, tworzą, programują tygodnie całe. Systemy przerabiają, moduły dodają, kombinują ogólnie jak dzikie konie. Melają tak jeszcze czas jakiś. Mieszając dokumentnie w kodzie, na serwerach, w domach, na łatkach i przy balustradach - ale klops, dupa zbita - działać nie będzie i basta. Tutaj zwyczajowy konflikt wewnętrzny pomiędzy marketingowcami a programistami, grafikami, administratorami - ogólnie ludźmi, którzy starają się coś zrobić. No może nie zawsze dla dobra tak zwanej firmy, ale dla siebie - ot zwyczajowo, żeby było ładnie. A przecież ostatnio na stackoverflow było ciekawe rozwiązanie podobnego problemu - tylko jak kurwa to ma prawo działać? A jednak, nie działa - HA!. Ale nic to, obejście zawsze się znajdzie, tutaj wchodzą stare słowa: &ldquo;nie trzeba ładnie, wystarczy skutecznie&rdquo; no i jest - upgragniona wersja:</p>
<p><img loading="lazy" src="http://grab.by/grabs/3fedd106be58a9703063260bc87a3c1c.png"></p>
<p>Nawet działa, super. Marketingowcy szaleją, firma się kręci - ogólnie szał ciał i świst pizd - extra. Następnego ranka przed biurkiem staje zmęczony marketingowiec i widzi jak mu skrzynka pocztowa nie pęka w szwach. Oburza się lekko, bo miało być światowo. Nic to, kawa i kolejny dzień jak zawsze - po prostu i bez rewolucji na rynku - ehh. Mijają dni, skrzynka pusta. Ehh co za życie. Czasami wpadnie jakiś ciekawy mailing z propozycją nie do odrzucenia, rachunek za wodę przez pół roku nie zapłacony. Życie toczy się dalej. W między czasie sieć zaczyna jednak o sobie dawać znać, jednak nie od razu na mailu marketingowca, ani nikogo zainteresowanego zawodowo tematem. Google nie śpi, jak wielki brat czuwa nad każdą informacją. W najmniej spodziewanym momencie przekieruje w swojej chorej i tylko sobie znanej logice demiurga na stronę programu kogoś kto tak na prawdę tego nie chciał. Ale że ma chwilę wolnego, a i tak nic bardziej ciekawego aniżeli program text-to-speech w tech chwili nie istnieje - to czemu by nie. Sprawdza sobie czy działa, oo - nie działa. Coś się zepsuło w niesamowitej aplikacji demo? W żadnym razie aplikacja działa poprawnie - w końcu &ldquo;sample text&rdquo; przeczytała.</p>
<p><img loading="lazy" src="http://grab.by/grabs/9c9e4e89f16d4348119b22add28776ed.png"></p>
<p>No co za świnia użyła narodowego języka producenta aplikacji? Spisek jakiś. Chamy zbuntowane, nie używają światowej aplikacji jak należy.</p>
<p>Dlatego też, biorąc pod uwagę owych niesamowitych marketingowców i całą resztę bandy w rajtuzach przenoszę się z, przez wielu uważanego za najlepszy edytor <strong>Vim&rsquo;a</strong> do nowego edytora dla programistów: <a href="http://www.ommwriter.com/en/">OmmWriter</a>. Niebawem, w hołdzie głosom zza granicy powstanie aplikacja <strong>text-to-speech</strong> pozwalająca rozumieć napisy tlhIngan (klingońskie). !!!</p>
<p><a href="http://tlhIngan.ojebek.pl">tlhIngan text-to-speech</a></p>
<p>Oj jak jeszcze nie działa to niestety wina marketingu - za szybko dał znać w &ldquo;światowe media&rdquo; :)</p>
]]></content:encoded>
    </item>
    <item>
      <title>Językoznawcy do dzieła.</title>
      <link>https://cynar.ski/2010/05/21/jezykoznawcy-do-dziela/</link>
      <pubDate>Fri, 21 May 2010 08:44:57 +0000</pubDate>
      <guid>https://cynar.ski/2010/05/21/jezykoznawcy-do-dziela/</guid>
      <description>&lt;p&gt;Literówki to rzecz cudna, a googlowa nowomowa jeszcze lepsza:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;http://grab.by/4uNU&#34; loading=&#34;lazy&#34; src=&#34;http://grab.by/grabs/8f9d31962d473a3a0186defb4e0daf67.png&#34;&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Literówki to rzecz cudna, a googlowa nowomowa jeszcze lepsza:</p>
<p><img alt="http://grab.by/4uNU" loading="lazy" src="http://grab.by/grabs/8f9d31962d473a3a0186defb4e0daf67.png"></p>
]]></content:encoded>
    </item>
    <item>
      <title>Apple Outsider » Cocoa, Flash, and Safari</title>
      <link>https://cynar.ski/2010/05/18/apple-outsider-%C2%BB-cocoa-flash-and-safari/</link>
      <pubDate>Tue, 18 May 2010 20:50:16 +0000</pubDate>
      <guid>https://cynar.ski/2010/05/18/apple-outsider-%C2%BB-cocoa-flash-and-safari/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.appleoutsider.com/2010/05/18/cocoa-flash-and-html5/&#34;&gt;Apple Outsider » Cocoa, Flash, and Safari&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="http://www.appleoutsider.com/2010/05/18/cocoa-flash-and-html5/">Apple Outsider » Cocoa, Flash, and Safari</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Facebook &#43; Microsoft = docs.com</title>
      <link>https://cynar.ski/2010/05/14/facebook-microsoft-docs-com/</link>
      <pubDate>Fri, 14 May 2010 09:33:36 +0000</pubDate>
      <guid>https://cynar.ski/2010/05/14/facebook-microsoft-docs-com/</guid>
      <description>&lt;p&gt;Edycja dokumentów online to przyjemna funkcjonalność szczególnie w erze chmur, urządzeń mobilinych (chociaż strona niestety nie działa na moim iPhone - ciekawe jak na iPad&amp;rsquo;ach). Dlaczego &lt;strong&gt;docs.com&lt;/strong&gt; przypadło mi do gustu?&lt;/p&gt;
&lt;p&gt;Po pierwsze pełna obsługa docx - co niestety aktualnie jest dla wielu ludzi problemem, po drugie Microsoft - nie muszę instalować żadnych programów żeby swobodnie tworzyć dokumenty Word na moim Mac&amp;rsquo;u.&lt;/p&gt;
&lt;p&gt;Dość przyjemny interface (szczególnie dla tych którzy na co dzień korzystają z &lt;strong&gt;Microsoft Office&lt;/strong&gt;:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Edycja dokumentów online to przyjemna funkcjonalność szczególnie w erze chmur, urządzeń mobilinych (chociaż strona niestety nie działa na moim iPhone - ciekawe jak na iPad&rsquo;ach). Dlaczego <strong>docs.com</strong> przypadło mi do gustu?</p>
<p>Po pierwsze pełna obsługa docx - co niestety aktualnie jest dla wielu ludzi problemem, po drugie Microsoft - nie muszę instalować żadnych programów żeby swobodnie tworzyć dokumenty Word na moim Mac&rsquo;u.</p>
<p>Dość przyjemny interface (szczególnie dla tych którzy na co dzień korzystają z <strong>Microsoft Office</strong>:</p>
<p><img loading="lazy" src="http://grab.by/grabs/95ea310d3d5251afc3a446686f9a22d8.png"></p>
<p>Oczywiście wszystko na razie <strong>beta</strong> - zobaczymy co będzie dalej.</p>
<p>Minusem na razie jest to, że nie mogę zmienić języka na polski (chodzi o spelling), na liście wyboru jest polski, jednak nie ustawia go jako języka aktywnego dla słowników - non stop jest angielski. (chyba że ja coś źle robię)</p>
]]></content:encoded>
    </item>
    <item>
      <title>fbconnect wordpress</title>
      <link>https://cynar.ski/2010/05/12/fbconnect-wordpress/</link>
      <pubDate>Wed, 12 May 2010 01:05:53 +0000</pubDate>
      <guid>https://cynar.ski/2010/05/12/fbconnect-wordpress/</guid>
      <description>&lt;p&gt;Teraz połączyłem się z facebookiem :-) czyli co ? Jedna wielka wspólna świadomość ? :D&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Teraz połączyłem się z facebookiem :-) czyli co ? Jedna wielka wspólna świadomość ? :D</p>
]]></content:encoded>
    </item>
    <item>
      <title>iPhone theme</title>
      <link>https://cynar.ski/2010/05/10/iphone-theme/</link>
      <pubDate>Mon, 10 May 2010 17:24:11 +0000</pubDate>
      <guid>https://cynar.ski/2010/05/10/iphone-theme/</guid>
      <description>&lt;p&gt;Od dzisiaj można przeglądać bloga na iPhone - zapraszam ;)&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Od dzisiaj można przeglądać bloga na iPhone - zapraszam ;)</p>
]]></content:encoded>
    </item>
    <item>
      <title>tail, growl</title>
      <link>https://cynar.ski/2010/05/10/tail-growl/</link>
      <pubDate>Mon, 10 May 2010 13:41:49 +0000</pubDate>
      <guid>https://cynar.ski/2010/05/10/tail-growl/</guid>
      <description>&lt;p&gt;Szybkie rozwiązanie podglądu logów, plików i innego badziewia na OSX&amp;rsquo;ie.&lt;/p&gt;
&lt;p&gt;Tworzymy sobie pliczek tak aby był w PATH, u mnie jest to &amp;ldquo;~/bin&amp;rdquo; (tak sobie dodałem do .bashrc - bo wygodnie):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#!/bin/sh
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt; -z &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$1&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;; &lt;span style=&#34;color:#66d9ef&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;arggghhh....&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    exit &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tail -n0 -F $1 | &lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt; read; &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    echo $REPLY | growlnotify -a tailfgrowl -t $1;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;po odpaleniu będzie nam ładnie wyświetlać to co się w pliku zmienia w GROWL&amp;rsquo;u ;)&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Szybkie rozwiązanie podglądu logów, plików i innego badziewia na OSX&rsquo;ie.</p>
<p>Tworzymy sobie pliczek tak aby był w PATH, u mnie jest to &ldquo;~/bin&rdquo; (tak sobie dodałem do .bashrc - bo wygodnie):</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e">#!/bin/sh
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#66d9ef">if</span> <span style="color:#f92672">[</span> -z <span style="color:#e6db74">&#34;</span>$1<span style="color:#e6db74">&#34;</span> <span style="color:#f92672">]</span>; <span style="color:#66d9ef">then</span>
</span></span><span style="display:flex;"><span>    echo <span style="color:#e6db74">&#34;arggghhh....&#34;</span>
</span></span><span style="display:flex;"><span>    exit <span style="color:#ae81ff">1</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">fi</span>
</span></span><span style="display:flex;"><span>tail -n0 -F $1 | <span style="color:#66d9ef">while</span> read; <span style="color:#66d9ef">do</span>
</span></span><span style="display:flex;"><span>    echo $REPLY | growlnotify -a tailfgrowl -t $1;
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">done</span>
</span></span></code></pre></div><p>po odpaleniu będzie nam ładnie wyświetlać to co się w pliku zmienia w GROWL&rsquo;u ;)</p>
]]></content:encoded>
    </item>
    <item>
      <title>pecl, xampp, osx snow </title>
      <link>https://cynar.ski/2010/05/09/pecl-xampp-osx-snow/</link>
      <pubDate>Sun, 09 May 2010 20:35:15 +0000</pubDate>
      <guid>https://cynar.ski/2010/05/09/pecl-xampp-osx-snow/</guid>
      <description>&lt;p&gt;Domyślna konfiguracja xampp&amp;rsquo;a niestety powoduje problemy z kompilacją modułów php, jednak żeby wymusić architekturę podczas kompilacji wystarczy ustawić zmienne systemowe:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;MACOSX_DEPLOYMENT_TARGET&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;10.6
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;CFLAGS&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;-arch i386 -arch x86_64 -g -Os -pipe -no-cpp-precomp&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;CCFLAGS&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;-arch i386 -arch x86_64 -g -Os -pipe&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;CXXFLAGS&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;-arch i386 -arch x86_64 -g -Os -pipe&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;LDFLAGS&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;-arch i386 -arch x86_64 -bind_at_load&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;export CFLAGS CXXFLAGS LDFLAGS CCFLAGS MACOSX_DEPLOYMENT_TARGET
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;i po bólu.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Domyślna konfiguracja xampp&rsquo;a niestety powoduje problemy z kompilacją modułów php, jednak żeby wymusić architekturę podczas kompilacji wystarczy ustawić zmienne systemowe:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>MACOSX_DEPLOYMENT_TARGET<span style="color:#f92672">=</span>10.6
</span></span><span style="display:flex;"><span>CFLAGS<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;-arch i386 -arch x86_64 -g -Os -pipe -no-cpp-precomp&#34;</span>
</span></span><span style="display:flex;"><span>CCFLAGS<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;-arch i386 -arch x86_64 -g -Os -pipe&#34;</span>
</span></span><span style="display:flex;"><span>CXXFLAGS<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;-arch i386 -arch x86_64 -g -Os -pipe&#34;</span>
</span></span><span style="display:flex;"><span>LDFLAGS<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;-arch i386 -arch x86_64 -bind_at_load&#34;</span>
</span></span><span style="display:flex;"><span>export CFLAGS CXXFLAGS LDFLAGS CCFLAGS MACOSX_DEPLOYMENT_TARGET
</span></span></code></pre></div><p>i po bólu.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Wordpress, Buzz</title>
      <link>https://cynar.ski/2010/05/06/wordpress-buzz/</link>
      <pubDate>Thu, 06 May 2010 16:23:50 +0000</pubDate>
      <guid>https://cynar.ski/2010/05/06/wordpress-buzz/</guid>
      <description>&lt;p&gt;Brakowało mi jednego w buzz&amp;rsquo;ach - jak ktoś komentuje wpis na buzz to chcę też to mieć na blogu, rozwiązanie przyszło samo:&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://wordpress.org/extend/plugins/buzz-comments/&#34;&gt;http://wordpress.org/extend/plugins/buzz-comments/&lt;/a&gt;&lt;img loading=&#34;lazy&#34; src=&#34;http://grab.by/grabs/b00c941eec5535eec24c046f340ab3b9.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;Nic dodać, nic ująć&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Brakowało mi jednego w buzz&rsquo;ach - jak ktoś komentuje wpis na buzz to chcę też to mieć na blogu, rozwiązanie przyszło samo:</p>
<p><a href="http://wordpress.org/extend/plugins/buzz-comments/">http://wordpress.org/extend/plugins/buzz-comments/</a><img loading="lazy" src="http://grab.by/grabs/b00c941eec5535eec24c046f340ab3b9.png"></p>
<p>Nic dodać, nic ująć</p>
]]></content:encoded>
    </item>
    <item>
      <title>Firefox, zwalnianie pamięci...</title>
      <link>https://cynar.ski/2010/05/06/firefox-zwalnianie-pamieci/</link>
      <pubDate>Thu, 06 May 2010 06:24:44 +0000</pubDate>
      <guid>https://cynar.ski/2010/05/06/firefox-zwalnianie-pamieci/</guid>
      <description>&lt;p&gt;Żeby zwolnić sobie deko pamięci systemowej którą używa firefox, wystarczy w konfiguracji ( &lt;strong&gt;about:config&lt;/strong&gt;) dodać jedną opcję (można to zrobić za pomocą menu podręcznego) :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;config.trim_on_minimize = true;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Oczywiście typ pola &lt;strong&gt;boolean&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Na OSX działa ładnie, inne systemy nie wiem.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Żeby zwolnić sobie deko pamięci systemowej którą używa firefox, wystarczy w konfiguracji ( <strong>about:config</strong>) dodać jedną opcję (można to zrobić za pomocą menu podręcznego) :</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>config.trim_on_minimize = true;
</span></span></code></pre></div><p>Oczywiście typ pola <strong>boolean</strong>.</p>
<p>Na OSX działa ładnie, inne systemy nie wiem.</p>
]]></content:encoded>
    </item>
    <item>
      <title>jQuery, Firebug – console.log()</title>
      <link>https://cynar.ski/2010/05/05/jquery-firebug-console-log/</link>
      <pubDate>Wed, 05 May 2010 20:21:36 +0000</pubDate>
      <guid>https://cynar.ski/2010/05/05/jquery-firebug-console-log/</guid>
      <description>&lt;p&gt;Proces tworzenia kodu zawsze nierozerwalnie łączy się z debugowaniem, sprawdzaniem etc&amp;hellip; firebug ma świetną konsolę do której za pomocą &lt;strong&gt;console.log()&lt;/strong&gt; można pakować co się tylko chce, jednak problem pojawia się w momencie, kiedy wyłączymy firebug&amp;rsquo;a - skrypty niestety walą errorami, czyli zwyczajnie przestają działać. Rozwiązanie problemu jest banalnie proste:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;if(typeof console === &amp;#34;undefined&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  console = { log: function() { } };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Powyższe linijki załatwiają problem braku &lt;strong&gt;console.log()&lt;/strong&gt; przy wyłączonym lub niezainstalowanym firebug&amp;rsquo;u.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Proces tworzenia kodu zawsze nierozerwalnie łączy się z debugowaniem, sprawdzaniem etc&hellip; firebug ma świetną konsolę do której za pomocą <strong>console.log()</strong> można pakować co się tylko chce, jednak problem pojawia się w momencie, kiedy wyłączymy firebug&rsquo;a - skrypty niestety walą errorami, czyli zwyczajnie przestają działać. Rozwiązanie problemu jest banalnie proste:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>if(typeof console === &#34;undefined&#34;)
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>  console = { log: function() { } };
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>Powyższe linijki załatwiają problem braku <strong>console.log()</strong> przy wyłączonym lub niezainstalowanym firebug&rsquo;u.</p>
]]></content:encoded>
    </item>
    <item>
      <title>SVN Tips: get diff with files only</title>
      <link>https://cynar.ski/2010/04/16/svn-tips-get-diff-with-files-only/</link>
      <pubDate>Fri, 16 Apr 2010 09:07:25 +0000</pubDate>
      <guid>https://cynar.ski/2010/04/16/svn-tips-get-diff-with-files-only/</guid>
      <description>&lt;p&gt;Wyciągnięcie tylko nazw plików z SVN&amp;rsquo;a z ostatniej rewizji jest stosnkowo proste, jednak wymaga wyciągnięcia
numeru revizji &amp;ldquo;HEAD&amp;rdquo; i decrementację numerka:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;REV&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;svn info -rHEAD --xml |grep revision |sed &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;s/revision=&amp;#34;//g&amp;#39;&lt;/span&gt; |sed &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;s/&amp;#34;&amp;gt;//g&amp;#39;&lt;/span&gt; |head -n1&lt;span style=&#34;color:#e6db74&#34;&gt;```&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;let &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;REV-=1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;svn diff -r $REV:HEAD --summarize
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;W outpucie jest lista plików.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Wyciągnięcie tylko nazw plików z SVN&rsquo;a z ostatniej rewizji jest stosnkowo proste, jednak wymaga wyciągnięcia
numeru revizji &ldquo;HEAD&rdquo; i decrementację numerka:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e">#!/bin/bash
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>REV<span style="color:#f92672">=</span><span style="color:#e6db74">`</span>svn info -rHEAD --xml |grep revision |sed <span style="color:#e6db74">&#39;s/revision=&#34;//g&#39;</span> |sed <span style="color:#e6db74">&#39;s/&#34;&gt;//g&#39;</span> |head -n1<span style="color:#e6db74">```</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>let <span style="color:#e6db74">&#34;REV-=1&#34;</span>
</span></span><span style="display:flex;"><span>svn diff -r $REV:HEAD --summarize
</span></span></code></pre></div><p>W outpucie jest lista plików.</p>
]]></content:encoded>
    </item>
    <item>
      <title>live headers, httpFox</title>
      <link>https://cynar.ski/2010/04/15/live-headers-httpfox/</link>
      <pubDate>Thu, 15 Apr 2010 13:08:17 +0000</pubDate>
      <guid>https://cynar.ski/2010/04/15/live-headers-httpfox/</guid>
      <description>&lt;p&gt;Czasami przyzwyczajenia okazują się dość mocno ograniczające, od praktycznie zawsze używałem do śledzenia nagłówków &lt;a href=&#34;https://addons.mozilla.org/pl/firefox/addon/3829&#34;&gt;&lt;strong&gt;Live HTTP Headers&lt;/strong&gt;&lt;/a&gt;, narzędzie bardzo przydatne jednak usability średnie. Od jakiegoś czasu zmieniłem stare wysłużone już na coś dla mnie nowego.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://addons.mozilla.org/pl/firefox/addon/6647&#34;&gt;&lt;strong&gt;HttpFox&lt;/strong&gt;&lt;/a&gt; bo o nim tu mowa, potafi dużo więcej, ale przede wszystkim jest świetnie zrobiony pod kątem interfejsu:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;HttpFox screen&#34; loading=&#34;lazy&#34; src=&#34;http://grab.by/3M93&#34;&gt;&lt;/p&gt;
&lt;p&gt;Na razie nie miałem z nim żadnych problemów, więc przeniosłem się na razie zupełnie - czas pokaże czy było warto.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Czasami przyzwyczajenia okazują się dość mocno ograniczające, od praktycznie zawsze używałem do śledzenia nagłówków <a href="https://addons.mozilla.org/pl/firefox/addon/3829"><strong>Live HTTP Headers</strong></a>, narzędzie bardzo przydatne jednak usability średnie. Od jakiegoś czasu zmieniłem stare wysłużone już na coś dla mnie nowego.</p>
<p><a href="https://addons.mozilla.org/pl/firefox/addon/6647"><strong>HttpFox</strong></a> bo o nim tu mowa, potafi dużo więcej, ale przede wszystkim jest świetnie zrobiony pod kątem interfejsu:</p>
<p><img alt="HttpFox screen" loading="lazy" src="http://grab.by/3M93"></p>
<p>Na razie nie miałem z nim żadnych problemów, więc przeniosłem się na razie zupełnie - czas pokaże czy było warto.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Design, jQuery, rapid design js = IxEdit</title>
      <link>https://cynar.ski/2010/04/12/design-jquery-rapid-design-js-ixedit/</link>
      <pubDate>Mon, 12 Apr 2010 16:29:54 +0000</pubDate>
      <guid>https://cynar.ski/2010/04/12/design-jquery-rapid-design-js-ixedit/</guid>
      <description>&lt;p&gt;Każdy kto pracuje bardziej lub mniej przy &lt;strong&gt;jQuerty&lt;/strong&gt; musi grzebać w elementach na stronie tak aby uzyskać żądany efekt. Odnosić się do klasy, znacznika lub ID elementu. Dokładać obsługę eventów, oprogramować efekty etc&amp;hellip; Często jak trzeba zrobić coś szybko to zaczyna się męka.&lt;/p&gt;
&lt;p&gt;Pojawiło się bardzo dobre rozwiązanie pomagające na szybkie projektowanie efektów międzymordzia (aka interfejsu) WEB, mowa o &lt;a href=&#34;http://ixedit.com/&#34;&gt;IxEdit&lt;/a&gt;. Skrypt JS bazujący na jQuery oraz jQuery UI, który pozwala na tworzenie efektów live na stronie www. Informacje przechowuje loklanie na pomocą &lt;strong&gt;Google Gears&lt;/strong&gt; (stąd problemy z Safari na OSX&amp;rsquo;ie - ja polecam i tak Firefox&amp;rsquo;a), całość wygląda mniej więcej tak:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Każdy kto pracuje bardziej lub mniej przy <strong>jQuerty</strong> musi grzebać w elementach na stronie tak aby uzyskać żądany efekt. Odnosić się do klasy, znacznika lub ID elementu. Dokładać obsługę eventów, oprogramować efekty etc&hellip; Często jak trzeba zrobić coś szybko to zaczyna się męka.</p>
<p>Pojawiło się bardzo dobre rozwiązanie pomagające na szybkie projektowanie efektów międzymordzia (aka interfejsu) WEB, mowa o <a href="http://ixedit.com/">IxEdit</a>. Skrypt JS bazujący na jQuery oraz jQuery UI, który pozwala na tworzenie efektów live na stronie www. Informacje przechowuje loklanie na pomocą <strong>Google Gears</strong> (stąd problemy z Safari na OSX&rsquo;ie - ja polecam i tak Firefox&rsquo;a), całość wygląda mniej więcej tak:</p>
<p><img alt="ixedit" loading="lazy" src="http://grab.by/3Ho1"></p>
<p>Całość jak widać przyjemna dla oka, wszystko działa <strong>live</strong> więc można sobie przetestować co się naklikało, albo jak już wszystko jest zrobione dobrze wyeksportować do pliku js:</p>
<p><img alt="ixedit-deploy" loading="lazy" src="http://grab.by/3HoG"></p>
<p>Zacząłem tego używać, styl życia +2 :D</p>
<p>Szybkie użycie tego ustrojstwa w ZF:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>{if $env eq &#34;development&#34;}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>{/if}
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>Onet peering peek…</title>
      <link>https://cynar.ski/2010/04/10/onet-peering-peek/</link>
      <pubDate>Sat, 10 Apr 2010 14:16:16 +0000</pubDate>
      <guid>https://cynar.ski/2010/04/10/onet-peering-peek/</guid>
      <description>&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;http://grab.by/grabs/8540dc85049d7b005eacd9f52e709da8.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;Updated:&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;http://grab.by/grabs/dac438a0ec1e87b333b5975eed6ebf71.png&#34;&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><img loading="lazy" src="http://grab.by/grabs/8540dc85049d7b005eacd9f52e709da8.png"></p>
<p>Updated:</p>
<p><img loading="lazy" src="http://grab.by/grabs/dac438a0ec1e87b333b5975eed6ebf71.png"></p>
]]></content:encoded>
    </item>
    <item>
      <title>Ereg is deprecated PHP 5.3, migracja kodu.</title>
      <link>https://cynar.ski/2010/03/21/ereg-is-deprecated-php-5-3-migracja-kodu/</link>
      <pubDate>Sun, 21 Mar 2010 14:08:45 +0000</pubDate>
      <guid>https://cynar.ski/2010/03/21/ereg-is-deprecated-php-5-3-migracja-kodu/</guid>
      <description>&lt;p&gt;W &lt;strong&gt;PHP 5.3&lt;/strong&gt; rodzina &lt;strong&gt;ereg&lt;/strong&gt; jest już deprecated, czyli w kolejnej wersji zniknie zupełnie, lepiej już teraz zacząć zmieniać kod tak aby było kompatybilny z nową wersją. Dzięki migracji będziemy posiadać kod regex&amp;rsquo;powy kompatybilny z notacją &lt;strong&gt;Perl&amp;rsquo;ową&lt;/strong&gt; czyli musimy nasze wyrażenie &amp;ldquo;opakować&amp;rdquo; w &amp;ldquo;/&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Dla &lt;strong&gt;ereg&lt;/strong&gt; można to zrobić tak:&lt;/p&gt;
&lt;p&gt;Było:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	ereg(&amp;#39;\.([^\.]*$)&amp;#39;, $v1, $v2);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Powinno być:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	preg_match(&amp;#39;/\.([^\.]*$)/&amp;#39;, $v1, $v2);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Dla &lt;strong&gt;ereg_replace&lt;/strong&gt; można to zrobić tak:&lt;/p&gt;
&lt;p&gt;Było:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>W <strong>PHP 5.3</strong> rodzina <strong>ereg</strong> jest już deprecated, czyli w kolejnej wersji zniknie zupełnie, lepiej już teraz zacząć zmieniać kod tak aby było kompatybilny z nową wersją. Dzięki migracji będziemy posiadać kod regex&rsquo;powy kompatybilny z notacją <strong>Perl&rsquo;ową</strong> czyli musimy nasze wyrażenie &ldquo;opakować&rdquo; w &ldquo;/&rdquo;.</p>
<p>Dla <strong>ereg</strong> można to zrobić tak:</p>
<p>Było:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	ereg(&#39;\.([^\.]*$)&#39;, $v1, $v2);
</span></span></code></pre></div><p>Powinno być:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	preg_match(&#39;/\.([^\.]*$)/&#39;, $v1, $v2);
</span></span></code></pre></div><p>Dla <strong>ereg_replace</strong> można to zrobić tak:</p>
<p>Było:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	ereg_replace(&#39;[^A-Za-z0-9_]&#39;, &#39;&#39;, $v1);
</span></span></code></pre></div><p>Powinno być:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span> preg_replace(&#39;/[^A-Za-z0-9_]/&#39;, &#39;&#39;, $v1);
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>MySQL trigger before insert, numery faktur</title>
      <link>https://cynar.ski/2010/03/20/mysql-trigger-before-insert-numery-faktur/</link>
      <pubDate>Sat, 20 Mar 2010 15:28:44 +0000</pubDate>
      <guid>https://cynar.ski/2010/03/20/mysql-trigger-before-insert-numery-faktur/</guid>
      <description>&lt;p&gt;Rozwiązanie proste, ale wymagał jednej zmiany w konfiguracji my.cnf, dokładniej &lt;strong&gt;thread_stack&lt;/strong&gt; bo wartość 64K to deko mało. Całość bazuje na założeniu, że numer faktury to ROK/NUMER, gdzie numer jest autoinkrementowaną wartością.&lt;/p&gt;
&lt;p&gt;Tablica &lt;strong&gt;t_faktury&lt;/strong&gt;, w której numer faktury jest reprezentowany za pomocą pola &lt;strong&gt;fvat_no&lt;/strong&gt; trigger dla niej i procedura poniżej:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;DROP&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;TRIGGER&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;IF&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;EXISTS&lt;/span&gt; fvat_number;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;DROP&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;PROCEDURE&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;IF&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;EXISTS&lt;/span&gt; generuj_fvatno;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;DELIMITER&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;$$&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;CREATE&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;PROCEDURE&lt;/span&gt;  generuj_fvatno(&lt;span style=&#34;color:#66d9ef&#34;&gt;out&lt;/span&gt; numerek VARCHAR(&lt;span style=&#34;color:#ae81ff&#34;&gt;30&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;BEGIN&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;SELECT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    CONCAT(DATE_FORMAT(CURDATE(), &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;%Y&amp;#39;&lt;/span&gt;),&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#66d9ef&#34;&gt;COUNT&lt;/span&gt;(fvat_no) &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;INTO&lt;/span&gt; numerek
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;FROM&lt;/span&gt; t_faktury
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;WHERE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    SUBSTRING_INDEX(fvat_no, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; DATE_FORMAT(CURDATE(), &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;%Y&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;LIMIT&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; ;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;END&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;$$&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;CREATE&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;TRIGGER&lt;/span&gt; fvat_number &lt;span style=&#34;color:#66d9ef&#34;&gt;BEFORE&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;INSERT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;ON&lt;/span&gt; t_faktury
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;FOR&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;EACH&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;ROW&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;BEGIN&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;CALL&lt;/span&gt; generuj_fvatno(&lt;span style=&#34;color:#f92672&#34;&gt;@&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;out&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;IF&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;@&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;out&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;NULL&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;THEN&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;SET&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;NEW&lt;/span&gt;.fvat_no &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; CONCAT(DATE_FORMAT(CURDATE(), &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;%Y&amp;#39;&lt;/span&gt;),&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;ELSE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;SET&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;NEW&lt;/span&gt;.fvat_no &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;@&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;out&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;END&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;IF&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;END&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;$$&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
      <content:encoded><![CDATA[<p>Rozwiązanie proste, ale wymagał jednej zmiany w konfiguracji my.cnf, dokładniej <strong>thread_stack</strong> bo wartość 64K to deko mało. Całość bazuje na założeniu, że numer faktury to ROK/NUMER, gdzie numer jest autoinkrementowaną wartością.</p>
<p>Tablica <strong>t_faktury</strong>, w której numer faktury jest reprezentowany za pomocą pola <strong>fvat_no</strong> trigger dla niej i procedura poniżej:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sql" data-lang="sql"><span style="display:flex;"><span><span style="color:#66d9ef">DROP</span> <span style="color:#66d9ef">TRIGGER</span> <span style="color:#66d9ef">IF</span> <span style="color:#66d9ef">EXISTS</span> fvat_number;
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">DROP</span> <span style="color:#66d9ef">PROCEDURE</span> <span style="color:#66d9ef">IF</span> <span style="color:#66d9ef">EXISTS</span> generuj_fvatno;
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">DELIMITER</span> <span style="color:#960050;background-color:#1e0010">$$</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">CREATE</span> <span style="color:#66d9ef">PROCEDURE</span>  generuj_fvatno(<span style="color:#66d9ef">out</span> numerek VARCHAR(<span style="color:#ae81ff">30</span>))
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">BEGIN</span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">SELECT</span>
</span></span><span style="display:flex;"><span>    CONCAT(DATE_FORMAT(CURDATE(), <span style="color:#e6db74">&#39;%Y&#39;</span>),<span style="color:#e6db74">&#39;/&#39;</span>,<span style="color:#66d9ef">COUNT</span>(fvat_no) <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>) <span style="color:#66d9ef">INTO</span> numerek
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">FROM</span> t_faktury
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">WHERE</span>
</span></span><span style="display:flex;"><span>    SUBSTRING_INDEX(fvat_no, <span style="color:#e6db74">&#39;/&#39;</span>, <span style="color:#ae81ff">1</span>) <span style="color:#f92672">=</span> DATE_FORMAT(CURDATE(), <span style="color:#e6db74">&#39;%Y&#39;</span>)
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">LIMIT</span> <span style="color:#ae81ff">1</span> ;
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">END</span><span style="color:#960050;background-color:#1e0010">$$</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">CREATE</span> <span style="color:#66d9ef">TRIGGER</span> fvat_number <span style="color:#66d9ef">BEFORE</span> <span style="color:#66d9ef">INSERT</span> <span style="color:#66d9ef">ON</span> t_faktury
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">FOR</span> <span style="color:#66d9ef">EACH</span> <span style="color:#66d9ef">ROW</span> <span style="color:#66d9ef">BEGIN</span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">CALL</span> generuj_fvatno(<span style="color:#f92672">@</span><span style="color:#66d9ef">out</span>);
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">IF</span> <span style="color:#f92672">@</span><span style="color:#66d9ef">out</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">NULL</span> <span style="color:#66d9ef">THEN</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">SET</span> <span style="color:#66d9ef">NEW</span>.fvat_no <span style="color:#f92672">=</span> CONCAT(DATE_FORMAT(CURDATE(), <span style="color:#e6db74">&#39;%Y&#39;</span>),<span style="color:#e6db74">&#39;/&#39;</span>, <span style="color:#ae81ff">1</span>);
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">ELSE</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">SET</span> <span style="color:#66d9ef">NEW</span>.fvat_no <span style="color:#f92672">=</span>  <span style="color:#f92672">@</span><span style="color:#66d9ef">out</span>;
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">END</span> <span style="color:#66d9ef">IF</span>;
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">END</span><span style="color:#960050;background-color:#1e0010">$$</span>
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>Reklama kontekstowa….</title>
      <link>https://cynar.ski/2010/03/19/reklama-kontekstowa/</link>
      <pubDate>Fri, 19 Mar 2010 00:01:31 +0000</pubDate>
      <guid>https://cynar.ski/2010/03/19/reklama-kontekstowa/</guid>
      <description>&lt;p&gt;Już wiemy co Penderecki robił w wolnym czasie:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Reklama&#34; loading=&#34;lazy&#34; src=&#34;http://grab.by/39AZ&#34;&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Już wiemy co Penderecki robił w wolnym czasie:</p>
<p><img alt="Reklama" loading="lazy" src="http://grab.by/39AZ"></p>
]]></content:encoded>
    </item>
    <item>
      <title>Beyonce &amp; Lady Gaga Video Phone BEHIND THE SCENES</title>
      <link>https://cynar.ski/2010/03/18/beyonce-lady-gaga-video-phone-behind-the-scenes/</link>
      <pubDate>Thu, 18 Mar 2010 01:59:32 +0000</pubDate>
      <guid>https://cynar.ski/2010/03/18/beyonce-lady-gaga-video-phone-behind-the-scenes/</guid>
      <description>&lt;p&gt;Generalnie jeden z lepszych kawałków, które ostatnio widziałem na YouTube :D&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.youtube.com/watch?v=iVbnAQ8XhOk&#34;&gt;YouTube - Beyonce &amp;amp; Lady Gaga Video Phone BEHIND THE SCENES&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Generalnie jeden z lepszych kawałków, które ostatnio widziałem na YouTube :D</p>
<p><a href="http://www.youtube.com/watch?v=iVbnAQ8XhOk">YouTube - Beyonce &amp; Lady Gaga Video Phone BEHIND THE SCENES</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Viddler.com –      PlayStation Move Developer Diary #2 – Zindagi Games – Uploaded by sceablog</title>
      <link>https://cynar.ski/2010/03/17/viddler-com-playstation-move-developer-diary-2-zindagi-games-uploaded-by-sceablog/</link>
      <pubDate>Wed, 17 Mar 2010 10:42:30 +0000</pubDate>
      <guid>https://cynar.ski/2010/03/17/viddler-com-playstation-move-developer-diary-2-zindagi-games-uploaded-by-sceablog/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.viddler.com/explore/sceablog/videos/847/0&#34;&gt;Viddler.com - PlayStation Move Developer Diary #2 - Zindagi Games - Uploaded by sceablog&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="http://www.viddler.com/explore/sceablog/videos/847/0">Viddler.com - PlayStation Move Developer Diary #2 - Zindagi Games - Uploaded by sceablog</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Webdesign, usability – co jak klientami są ludzie starsi ?</title>
      <link>https://cynar.ski/2010/03/16/webdesign-usability-co-jak-klientami-sa-ludzi-starsi/</link>
      <pubDate>Tue, 16 Mar 2010 11:31:49 +0000</pubDate>
      <guid>https://cynar.ski/2010/03/16/webdesign-usability-co-jak-klientami-sa-ludzi-starsi/</guid>
      <description>&lt;p&gt;Ostatnio zastanawiałem się nad tym problemem, poniżej strona z poradami na co zwracać uwagę projektując strony tak, aby były użyteczne dla ludzi starszych.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.nia.nih.gov/HealthInformation/Publications/website.htm?utm_source=twitterfeed&amp;amp;utm_medium=twitter&#34;&gt;Making Your Website Senior Friendly: Tips from the National Institute on Aging&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Ostatnio zastanawiałem się nad tym problemem, poniżej strona z poradami na co zwracać uwagę projektując strony tak, aby były użyteczne dla ludzi starszych.</p>
<p><a href="http://www.nia.nih.gov/HealthInformation/Publications/website.htm?utm_source=twitterfeed&amp;utm_medium=twitter">Making Your Website Senior Friendly: Tips from the National Institute on Aging</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>AKVPHOTO, czyli coś z zupełnie innej beczki</title>
      <link>https://cynar.ski/2010/03/14/akvphoto-czyli-cos-z-zupelnie-innej-beczki/</link>
      <pubDate>Sun, 14 Mar 2010 17:06:50 +0000</pubDate>
      <guid>https://cynar.ski/2010/03/14/akvphoto-czyli-cos-z-zupelnie-innej-beczki/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;AKVPHOTO&#34; loading=&#34;lazy&#34; src=&#34;http://grab.by/33l4&#34;&gt;&lt;a href=&#34;http://www.akvphoto.com/choking.html&#34;&gt;AKVPHOTO&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><img alt="AKVPHOTO" loading="lazy" src="http://grab.by/33l4"><a href="http://www.akvphoto.com/choking.html">AKVPHOTO</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Social Navigator.</title>
      <link>https://cynar.ski/2010/03/14/social-navigator/</link>
      <pubDate>Sun, 14 Mar 2010 02:14:07 +0000</pubDate>
      <guid>https://cynar.ski/2010/03/14/social-navigator/</guid>
      <description>&lt;p&gt;Wyniki dla owego bloga:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;social navigator&#34; loading=&#34;lazy&#34; src=&#34;http://grab.by/32KL&#34;&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Wyniki dla owego bloga:</p>
<p><img alt="social navigator" loading="lazy" src="http://grab.by/32KL"></p>
]]></content:encoded>
    </item>
    <item>
      <title>Porządki na blogu…</title>
      <link>https://cynar.ski/2010/03/13/porzadki-na-blogu/</link>
      <pubDate>Sat, 13 Mar 2010 22:47:43 +0000</pubDate>
      <guid>https://cynar.ski/2010/03/13/porzadki-na-blogu/</guid>
      <description>&lt;p&gt;Witam, ostatnio moja aktywność blogowa stanowczo wzrosła. Tym samym patrząc na bałagan w kategoriach oraz brak tagów zabrałem się za porządkowanie wszystkiego jak należy. Większość już jest poukładana - chwała bogu, że nie byłem strasznie aktywnym blogerem i nie mam set-wpisów ;)&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Witam, ostatnio moja aktywność blogowa stanowczo wzrosła. Tym samym patrząc na bałagan w kategoriach oraz brak tagów zabrałem się za porządkowanie wszystkiego jak należy. Większość już jest poukładana - chwała bogu, że nie byłem strasznie aktywnym blogerem i nie mam set-wpisów ;)</p>
]]></content:encoded>
    </item>
    <item>
      <title>TinyGrab - szybie współdzielenie zrzutów ekranu</title>
      <link>https://cynar.ski/2010/03/13/tinygrab-szybie-wspoldzielenie-zrzutow-ekranu/</link>
      <pubDate>Sat, 13 Mar 2010 02:23:03 +0000</pubDate>
      <guid>https://cynar.ski/2010/03/13/tinygrab-szybie-wspoldzielenie-zrzutow-ekranu/</guid>
      <description>&lt;p&gt;Zawsze mnie wkurzało przegrywanie ręcznie lub pół automatycznie zrzutów ekranu gdzieś na serwer www/ftp - jestem leniwy więc jest to nie lada wyzwanie ;) jednak jest na to remedium - &lt;a href=&#34;http://tinygrab.com/go/panel&#34;&gt;TinyGrab&lt;/a&gt;. Wersja dla OSX i Windowsa.&lt;/p&gt;
&lt;p&gt;Program instaluje się w doku systemowym pod domyślnym skrórem klawiaturowym &lt;strong&gt;Shift+Jabłko+4&lt;/strong&gt; do pełnego działania wymaga rejestracji konta, ale naprawdę warto bo po zaznaczeniu kawałka ekranu robi zrzut, automatycznie wysyła na serwer i url który odnosi do naszej zrzutu pakuje od razu do schowka systemowego - wiec wystarczy tylko &lt;strong&gt;paste&lt;/strong&gt; np. do blogowego wpisu i mamy graficzkę :)&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Zawsze mnie wkurzało przegrywanie ręcznie lub pół automatycznie zrzutów ekranu gdzieś na serwer www/ftp - jestem leniwy więc jest to nie lada wyzwanie ;) jednak jest na to remedium - <a href="http://tinygrab.com/go/panel">TinyGrab</a>. Wersja dla OSX i Windowsa.</p>
<p>Program instaluje się w doku systemowym pod domyślnym skrórem klawiaturowym <strong>Shift+Jabłko+4</strong> do pełnego działania wymaga rejestracji konta, ale naprawdę warto bo po zaznaczeniu kawałka ekranu robi zrzut, automatycznie wysyła na serwer i url który odnosi do naszej zrzutu pakuje od razu do schowka systemowego - wiec wystarczy tylko <strong>paste</strong> np. do blogowego wpisu i mamy graficzkę :)</p>
<p>Użytkownikom OSX&rsquo;a polecam - na Windowsie nie sprawdzałem bo nie mam ;)</p>
]]></content:encoded>
    </item>
    <item>
      <title>Lithium PHP framework</title>
      <link>https://cynar.ski/2010/03/13/lithium-php-framework/</link>
      <pubDate>Sat, 13 Mar 2010 02:14:11 +0000</pubDate>
      <guid>https://cynar.ski/2010/03/13/lithium-php-framework/</guid>
      <description>&lt;p&gt;Dzisiaj z racji chwili wolnego postanowiłem pobawić się czym nowym i pod ostrzał obrałem &lt;a href=&#34;http://lithify.me/&#34;&gt;Lithium&lt;/a&gt;, czyli mały lekki i &amp;ldquo;bogaty&amp;rdquo; framework w PHP 5.3 i wyższej. Do dzieła.&lt;/p&gt;
&lt;p&gt;Po rejestracji i wyeksportowaniu kluczy do git&amp;rsquo;a zassałem snap&amp;rsquo;a tegoż frameworka. Szybka konfiguracja środowiska, baza i tym podobne zabiegi pojawia sie ekran powitalny:&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;http://grab.by/grabs/bf08b99e8723046ace6e0e8fe09f47ad.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;Bardzo przyjemną sprawą jest interface do testów, który jest standartowo zdefiniowany w routerze jako &lt;strong&gt;/test&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;http://grab.by/grabs/e9e9801c9b5071646da9439ceb8c6e7a.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;Po klikaniu okazało się że framework korzysta z &lt;a href=&#34;http://www.mongodb.org/display/DOCS/Home&#34;&gt;MongoDB&lt;/a&gt;, więc trzeba było doinstalować:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Dzisiaj z racji chwili wolnego postanowiłem pobawić się czym nowym i pod ostrzał obrałem <a href="http://lithify.me/">Lithium</a>, czyli mały lekki i &ldquo;bogaty&rdquo; framework w PHP 5.3 i wyższej. Do dzieła.</p>
<p>Po rejestracji i wyeksportowaniu kluczy do git&rsquo;a zassałem snap&rsquo;a tegoż frameworka. Szybka konfiguracja środowiska, baza i tym podobne zabiegi pojawia sie ekran powitalny:</p>
<p><img loading="lazy" src="http://grab.by/grabs/bf08b99e8723046ace6e0e8fe09f47ad.png"></p>
<p>Bardzo przyjemną sprawą jest interface do testów, który jest standartowo zdefiniowany w routerze jako <strong>/test</strong>:</p>
<p><img loading="lazy" src="http://grab.by/grabs/e9e9801c9b5071646da9439ceb8c6e7a.png"></p>
<p>Po klikaniu okazało się że framework korzysta z <a href="http://www.mongodb.org/display/DOCS/Home">MongoDB</a>, więc trzeba było doinstalować:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>sudo sudo pecl install mongo
</span></span></code></pre></div><p>Po doinstalowaniu można poklikać po testach:</p>
<p><img loading="lazy" src="http://grab.by/grabs/89a5302196c99e6057c7dd508f5d6174.png"></p>
<p>Małe babole, ale rozumiem - w końcu unstable snap z devel ;)</p>
<p>Rzut okiem na przykładowy kontroler:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-gdscript3" data-lang="gdscript3"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>namespace app\controllers;
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">class</span> HelloWorldController <span style="color:#66d9ef">extends</span> \lithium\action\Controller
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>	public function index()
</span></span><span style="display:flex;"><span>	{
</span></span><span style="display:flex;"><span>		<span style="color:#f92672">$</span>this<span style="color:#f92672">-&gt;</span>render(array(<span style="color:#e6db74">&#39;layout&#39;</span> <span style="color:#f92672">=&gt;</span> false));
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>	public function to_string()
</span></span><span style="display:flex;"><span>	{
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">return</span> <span style="color:#e6db74">&#34;Hello World&#34;</span>;
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>	public function to_json()
</span></span><span style="display:flex;"><span>	{
</span></span><span style="display:flex;"><span>		<span style="color:#f92672">$</span>this<span style="color:#f92672">-&gt;</span>render(array(<span style="color:#e6db74">&#39;json&#39;</span> <span style="color:#f92672">=&gt;</span> <span style="color:#e6db74">&#39;Hello World&#39;</span>));
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><h2 id="pierwsze-wrażania">Pierwsze wrażania?</h2>
<p>Dość pozytywne, system jednak jest napisany dla 5.3 i tu może jeszcze być problem z używaniem tego na produkcji, jednak w wolnej chwili mam zamiar się nim pobawić bardziej. Wszystkich zainteresowanych odsyłam na stronkę domową projektu i do tutoriali <a href="http://rad-dev.org/lithium/wiki/drafts/blog-tutorial">http://rad-dev.org/lithium/wiki/drafts/blog-tutorial</a> - na początek idealne.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Steganografia w PHP</title>
      <link>https://cynar.ski/2010/03/13/steganografia-w-php/</link>
      <pubDate>Fri, 12 Mar 2010 23:51:34 +0000</pubDate>
      <guid>https://cynar.ski/2010/03/13/steganografia-w-php/</guid>
      <description>&lt;p&gt;Ciekawe czy ktoś to jeszcze pamięta ;) (bo mnie technika deko kurzem zarosła). Dla niewtajemniczonych i tych których szare komórki zawierające informacje na ten temat poumierały z takich czy innych powodów, słów kilka.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Steganografia&lt;/strong&gt; jest nauką o komunikacji w taki sposób by obecność komunikatu nie mogła zostać wykryta, czyli deko inaczej niż w kryptografii (gdzie fakt zaistnienia informacji jest jawny, ale treść już nie).&lt;/p&gt;
&lt;p&gt;Za &lt;strong&gt;&lt;a href=&#34;http://pl.wikipedia.org/wiki/Steganografia&#34;&gt;Wikipedią&lt;/a&gt;&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Klasyfikacja systemów steganograficznych:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;steganografia czysta (pure steganography) - siła techniki opiera się na nieznajomości metody przez stronę atakującą. Systemy te nie spełniają Zasady Kerckhoffsa dlatego nie są polecane
steganografia z kluczem prywatnym (private key steganography) - metoda jest jawna i powszechnie dostępna, przez rozpoczęciem komunikacji strony uwzględniają klucz steganograficzny wykorzystywany w sposób zależny od metody, istnieje jednek problem przekazania klucza w bezpieczny sposób
steganografia z kluczem publicznym (public key steganography) - podobnie jak w asymetrycznych systemach kryptograficznych używane są dwa klucze - publiczny i prywatny. Klucz publiczny (jawny) wykorzystywany jest przy osadzaniu wiadomości w nośnej, natomiast klucz prywatny przy jej wyodrębnianiu&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Ciekawe czy ktoś to jeszcze pamięta ;) (bo mnie technika deko kurzem zarosła). Dla niewtajemniczonych i tych których szare komórki zawierające informacje na ten temat poumierały z takich czy innych powodów, słów kilka.</p>
<p><strong>Steganografia</strong> jest nauką o komunikacji w taki sposób by obecność komunikatu nie mogła zostać wykryta, czyli deko inaczej niż w kryptografii (gdzie fakt zaistnienia informacji jest jawny, ale treść już nie).</p>
<p>Za <strong><a href="http://pl.wikipedia.org/wiki/Steganografia">Wikipedią</a></strong>:</p>
<p><strong>Klasyfikacja systemów steganograficznych:</strong></p>
<p>steganografia czysta (pure steganography) - siła techniki opiera się na nieznajomości metody przez stronę atakującą. Systemy te nie spełniają Zasady Kerckhoffsa dlatego nie są polecane
steganografia z kluczem prywatnym (private key steganography) - metoda jest jawna i powszechnie dostępna, przez rozpoczęciem komunikacji strony uwzględniają klucz steganograficzny wykorzystywany w sposób zależny od metody, istnieje jednek problem przekazania klucza w bezpieczny sposób
steganografia z kluczem publicznym (public key steganography) - podobnie jak w asymetrycznych systemach kryptograficznych używane są dwa klucze - publiczny i prywatny. Klucz publiczny (jawny) wykorzystywany jest przy osadzaniu wiadomości w nośnej, natomiast klucz prywatny przy jej wyodrębnianiu</p>
<p><strong>Metoda modyfikacji najmniej znaczącego bitu:</strong></p>
<p>Modyfikacja najmniej znaczącego bitu jest klasycznym przedstawicielem metod zastępujących. Wykorzystuje nadmiarowość w nośnej. Ostatni bit (np. wartości składowych piksela) zastępowany jest bitem (lub bitami) z wiadomości. Metoda ta daje się zastosować dla plików grafiki rastrowej oraz cyfrowo zapisanego dźwięku. Większość komercyjnego oprogramowania korzysta właśnie z niej (np. CryptArkan). Przy wykorzystaniu tej metody bardzo łatwo jest wykryć obecność komunikatu. Proste jest także zniszczenie zapisanego komunikatu (wystarczy np. wyzerować najmniej znaczące bity).</p>
<p><strong>O tej ostatniej w ujęciu PHP</strong></p>
<p>W prosty sposób można wykorzystać <strong>modyfikację najmniej znaczącego bitu</strong> w PHP ot tak dla zabawy.</p>
<p>Zapisujemy dane do otwaretgo wcześniej pliku graficznego:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-php" data-lang="php"><span style="display:flex;"><span><span style="color:#66d9ef">function</span> <span style="color:#a6e22e">Write</span>( $data )
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>  $bits<span style="color:#f92672">=</span>$this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">_asc2bin</span>($data);
</span></span><span style="display:flex;"><span>  $lenbit<span style="color:#f92672">=</span><span style="color:#a6e22e">strlen</span>($bits);
</span></span><span style="display:flex;"><span>  $nx<span style="color:#f92672">=</span><span style="color:#a6e22e">imagesx</span>($this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">img_object</span>);
</span></span><span style="display:flex;"><span>  $ny<span style="color:#f92672">=</span><span style="color:#a6e22e">imagesy</span>($this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">img_object</span>);
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">for</span>($x<span style="color:#f92672">=</span><span style="color:#ae81ff">0</span>,$bit<span style="color:#f92672">=</span><span style="color:#ae81ff">0</span>; $x<span style="color:#f92672">&lt;</span>$nx; $x<span style="color:#f92672">++</span>)
</span></span><span style="display:flex;"><span>  {
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">for</span>($y<span style="color:#f92672">=</span><span style="color:#ae81ff">0</span>; $y<span style="color:#f92672">&lt;</span>$ny; $y<span style="color:#f92672">++</span>)
</span></span><span style="display:flex;"><span>    {
</span></span><span style="display:flex;"><span>      $pix<span style="color:#f92672">=</span>$this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">_getcolor</span>($this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">img_object</span>,$x,$y);
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">foreach</span>(<span style="color:#66d9ef">array</span>(<span style="color:#e6db74">&#39;R&#39;</span>,<span style="color:#e6db74">&#39;G&#39;</span>,<span style="color:#e6db74">&#39;B&#39;</span>) <span style="color:#66d9ef">as</span> $C)
</span></span><span style="display:flex;"><span>      $col[$C]<span style="color:#f92672">=</span>$bit<span style="color:#f92672">&lt;</span>$lenbit<span style="color:#f92672">?</span>($pix[$C]<span style="color:#f92672">|</span>$bits[$bit])<span style="color:#f92672">&amp;</span>(<span style="color:#ae81ff">254</span><span style="color:#f92672">|</span>$bits[$bit<span style="color:#f92672">++</span>])<span style="color:#f92672">:</span>$pix[$C];
</span></span><span style="display:flex;"><span>      <span style="color:#a6e22e">imagesetpixel</span>($this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">img_object</span>,$x,$y,$this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">_setcolor</span>($this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">img_object</span>,$col[<span style="color:#e6db74">&#39;R&#39;</span>],$col[<span style="color:#e6db74">&#39;G&#39;</span>],$col[<span style="color:#e6db74">&#39;B&#39;</span>]));
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">imagepng</span>($this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">img_object</span>,$this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">img_path</span>);
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>A jak chcemy odczytać zapisane dane możemy zrobić tak:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-php" data-lang="php"><span style="display:flex;"><span><span style="color:#66d9ef">function</span> <span style="color:#a6e22e">Read</span>()
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>  $nx<span style="color:#f92672">=</span><span style="color:#a6e22e">imagesx</span>($this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">img_object</span>);
</span></span><span style="display:flex;"><span>  $ny<span style="color:#f92672">=</span><span style="color:#a6e22e">imagesy</span>($this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">img_object</span>);
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">for</span>($x<span style="color:#f92672">=</span><span style="color:#ae81ff">0</span>; $x<span style="color:#f92672">&lt;</span>$nx; $x<span style="color:#f92672">++</span> )
</span></span><span style="display:flex;"><span>  {
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">for</span>($y<span style="color:#f92672">=</span><span style="color:#ae81ff">0</span>; $y<span style="color:#f92672">&lt;</span>$ny; $y<span style="color:#f92672">++</span>)
</span></span><span style="display:flex;"><span>    {
</span></span><span style="display:flex;"><span>      $pix<span style="color:#f92672">=</span>$this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">_getcolor</span>($this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">img_object</span>,$x,$y);
</span></span><span style="display:flex;"><span>      $data<span style="color:#f92672">.=</span>($pix[<span style="color:#e6db74">&#39;R&#39;</span>]<span style="color:#f92672">&amp;</span><span style="color:#ae81ff">1</span>)<span style="color:#f92672">.</span>($pix[<span style="color:#e6db74">&#39;G&#39;</span>]<span style="color:#f92672">&amp;</span><span style="color:#ae81ff">1</span>)<span style="color:#f92672">.</span>($pix[<span style="color:#e6db74">&#39;B&#39;</span>]<span style="color:#f92672">&amp;</span><span style="color:#ae81ff">1</span>);
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">return</span> $this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">_bin2asc</span>($data);
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>Powyższe odświerzyło mi moją pamięć i odkurzyło stare rozwiązania tworzone jeszcze na gentoo. Wtedy człowiek miał wiecej czasu na tzw. &ldquo;pierdoły&rdquo;.
Zainteresowanych tematem i samą klasą PHP odsyłam do <strong>PHPClasses</strong>:</p>
<p><a href="http://www.phpclasses.org/browse/package/6027.html">http://www.phpclasses.org/browse/package/6027.html</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Social API</title>
      <link>https://cynar.ski/2010/03/12/social-api/</link>
      <pubDate>Fri, 12 Mar 2010 16:25:53 +0000</pubDate>
      <guid>https://cynar.ski/2010/03/12/social-api/</guid>
      <description>&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://cynar.ski/api.jpg&#34;&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><img loading="lazy" src="/api.jpg"></p>
]]></content:encoded>
    </item>
    <item>
      <title>Facebook peering…</title>
      <link>https://cynar.ski/2010/03/08/facebook-peering/</link>
      <pubDate>Mon, 08 Mar 2010 10:08:41 +0000</pubDate>
      <guid>https://cynar.ski/2010/03/08/facebook-peering/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Thanks for the email!
Facebook would be happy to peer with you at DE-CIX.
(&amp;hellip;)&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Fajna sprawa, tylko czekać jak cynarski.pl będzie miał 2 hopy do &lt;strong&gt;Facebook&amp;rsquo;a&lt;/strong&gt;, będziem się podpinać do API o wiele szybciej ;)&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>Thanks for the email!
Facebook would be happy to peer with you at DE-CIX.
(&hellip;)</p></blockquote>
<p>Fajna sprawa, tylko czekać jak cynarski.pl będzie miał 2 hopy do <strong>Facebook&rsquo;a</strong>, będziem się podpinać do API o wiele szybciej ;)</p>
]]></content:encoded>
    </item>
    <item>
      <title>Web…</title>
      <link>https://cynar.ski/2010/03/01/web/</link>
      <pubDate>Mon, 01 Mar 2010 23:30:21 +0000</pubDate>
      <guid>https://cynar.ski/2010/03/01/web/</guid>
      <description>&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;http://netdna.webdesignerdepot.com/uploads/comics14/8.jpg&#34;&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><img loading="lazy" src="http://netdna.webdesignerdepot.com/uploads/comics14/8.jpg"></p>
]]></content:encoded>
    </item>
    <item>
      <title>Hip-Hop PHP, OSX, Debian, Ubuntu, etc... </title>
      <link>https://cynar.ski/2010/02/24/hip-hop-php-osx-i-debian/</link>
      <pubDate>Tue, 23 Feb 2010 22:59:51 +0000</pubDate>
      <guid>https://cynar.ski/2010/02/24/hip-hop-php-osx-i-debian/</guid>
      <description>&lt;p&gt;Zassałem, zmieniłem &lt;a href=&#34;http://github.com/paramah/hiphop-php-osx&#34;&gt;CMake pod OSX&amp;rsquo;a&lt;/a&gt; żeby ładnie rozpoznawało ścieżki i biblioteki ale niestety chwilowo poległem na CMake bibliotek typowo Facebook&amp;rsquo;owych - jutro reszta, podzielę się na githubie co narzeźbiłem ;]&lt;/p&gt;
&lt;p&gt;Edit:&lt;/p&gt;
&lt;p&gt;Dzień kolejny, ranek, piję kawe w duuużym kubki i zabieram się za Hip-Hop&amp;rsquo;a sprawa na razie stanęła na CMake dla libsów:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	bash-3.2# cmake .
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	-- MySQL Include dir: /opt/local/include/mysql5/mysql  library dir: /opt/local/lib/mysql5/mysql
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	-- MySQL client libraries: mysqlclient
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	-- Found libevent: /opt/local/lib/libevent.dylib
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	-- Found GD: /opt/local/lib/libgd.dylib
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	-- Looking for curl_multi_select
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	-- Looking for curl_multi_select - not found
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	CMake Error at CMake/HPHPFindLibs.cmake:78 (message):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	  Custom libcurl is required with HipHop patches
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	Call Stack (most recent call first):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	  CMake/HPHPSetup.cmake:2 (include)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	  src/CMakeLists.txt:18 (include)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	-- Found ICU header files in /opt/local/include
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	-- Found ICU libraries: /opt/local/lib/libicuuc.dylib
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	-- Found Intel TBB
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	-- Found mcrypt: /opt/local/lib/libmcrypt.dylib
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	-- Found OpenSSL: /usr/lib/libssl.dylib;/usr/lib/libcrypto.dylib
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	CMake Error at CMake/HPHPFindLibs.cmake:153 (message):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	  You need to install libcap
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	Call Stack (most recent call first):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	  CMake/HPHPSetup.cmake:2 (include)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	  src/CMakeLists.txt:18 (include)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	-- Configuring incomplete, errors occurred!
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Zmiana &lt;strong&gt;libcap&lt;/strong&gt; w taki sposób aby działał na OSX&amp;rsquo;ie - no sorry nie da rady ;) aż tyle czasu to ja niestety nie mam, a problem raczej polega na tym - że zamiast zmieniać libcap&amp;rsquo;a to zmienić hip-hopa żeby go nie wymagał, ale to raczej robota dla developerów. Wysłałem już małego posta na listę (okazało się, że moderowaną ehh&amp;hellip; ) ciekaw jestem kiedy będzie jakiś odzew ze strony devel facebookowych.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Zassałem, zmieniłem <a href="http://github.com/paramah/hiphop-php-osx">CMake pod OSX&rsquo;a</a> żeby ładnie rozpoznawało ścieżki i biblioteki ale niestety chwilowo poległem na CMake bibliotek typowo Facebook&rsquo;owych - jutro reszta, podzielę się na githubie co narzeźbiłem ;]</p>
<p>Edit:</p>
<p>Dzień kolejny, ranek, piję kawe w duuużym kubki i zabieram się za Hip-Hop&rsquo;a sprawa na razie stanęła na CMake dla libsów:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	bash-3.2# cmake .
</span></span><span style="display:flex;"><span>	-- MySQL Include dir: /opt/local/include/mysql5/mysql  library dir: /opt/local/lib/mysql5/mysql
</span></span><span style="display:flex;"><span>	-- MySQL client libraries: mysqlclient
</span></span><span style="display:flex;"><span>	-- Found libevent: /opt/local/lib/libevent.dylib
</span></span><span style="display:flex;"><span>	-- Found GD: /opt/local/lib/libgd.dylib
</span></span><span style="display:flex;"><span>	-- Looking for curl_multi_select
</span></span><span style="display:flex;"><span>	-- Looking for curl_multi_select - not found
</span></span><span style="display:flex;"><span>	CMake Error at CMake/HPHPFindLibs.cmake:78 (message):
</span></span><span style="display:flex;"><span>	  Custom libcurl is required with HipHop patches
</span></span><span style="display:flex;"><span>	Call Stack (most recent call first):
</span></span><span style="display:flex;"><span>	  CMake/HPHPSetup.cmake:2 (include)
</span></span><span style="display:flex;"><span>	  src/CMakeLists.txt:18 (include)
</span></span><span style="display:flex;"><span>	-- Found ICU header files in /opt/local/include
</span></span><span style="display:flex;"><span>	-- Found ICU libraries: /opt/local/lib/libicuuc.dylib
</span></span><span style="display:flex;"><span>	-- Found Intel TBB
</span></span><span style="display:flex;"><span>	-- Found mcrypt: /opt/local/lib/libmcrypt.dylib
</span></span><span style="display:flex;"><span>	-- Found OpenSSL: /usr/lib/libssl.dylib;/usr/lib/libcrypto.dylib
</span></span><span style="display:flex;"><span>	CMake Error at CMake/HPHPFindLibs.cmake:153 (message):
</span></span><span style="display:flex;"><span>	  You need to install libcap
</span></span><span style="display:flex;"><span>	Call Stack (most recent call first):
</span></span><span style="display:flex;"><span>	  CMake/HPHPSetup.cmake:2 (include)
</span></span><span style="display:flex;"><span>	  src/CMakeLists.txt:18 (include)
</span></span><span style="display:flex;"><span>	-- Configuring incomplete, errors occurred!
</span></span></code></pre></div><p>Zmiana <strong>libcap</strong> w taki sposób aby działał na OSX&rsquo;ie - no sorry nie da rady ;) aż tyle czasu to ja niestety nie mam, a problem raczej polega na tym - że zamiast zmieniać libcap&rsquo;a to zmienić hip-hopa żeby go nie wymagał, ale to raczej robota dla developerów. Wysłałem już małego posta na listę (okazało się, że moderowaną ehh&hellip; ) ciekaw jestem kiedy będzie jakiś odzew ze strony devel facebookowych.</p>
<p>Teraz spokojnie sobie komplikuję <strong>Hip-Hop</strong> na serwerku (generalnie Debian, ale na Ubuntu będzie podobnie :D ):</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Using built-in specs.
</span></span><span style="display:flex;"><span>Target: x86_64-linux-gnu
</span></span><span style="display:flex;"><span>Configured with: ../src/configure -v --with-pkgversion=&#39;Debian 4.4.2-9&#39; --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --program-suffix=-4.4 --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --with-arch-32=i486 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
</span></span><span style="display:flex;"><span>Thread model: posix
</span></span><span style="display:flex;"><span>gcc version 4.4.3 20100108 (prerelease) (Debian 4.4.2-9)
</span></span></code></pre></div><p>Według wszelkich znaków na niebie i ziemi powinno to bez większych problemów przejść i w efekcie dać mi ładną binarkę.
Minut parę potem&hellip;.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>(...)
</span></span><span style="display:flex;"><span>-- Configuring done
</span></span><span style="display:flex;"><span>-- Generating done
</span></span><span style="display:flex;"><span>-- Build files have been written to: /home/paramah/Projects/hiphop-php
</span></span></code></pre></div><p>Dobra tak więc nadszedł czas na wykonanie magicznej komendy <strong>make</strong> ```</p>
<p>Scanning dependencies of target afdt
[  0%] Building C object src/third_party/libafdt/CMakeFiles/afdt.dir/src/lowlevel.c.o
[  0%] Building C object src/third_party/libafdt/CMakeFiles/afdt.dir/src/strlcpy.c.o
[  0%] Building C object src/third_party/libafdt/CMakeFiles/afdt.dir/src/sync.c.o
[  0%] Building C object src/third_party/libafdt/CMakeFiles/afdt.dir/src/util.c.o
[  0%] Building C object src/third_party/libafdt/CMakeFiles/afdt.dir/src/async.c.o
Linking C static library ../../../bin/libafdt.a</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>I czekamy.... po paru minutach
</span></span></code></pre></div><p>Linking CXX executable hphp
Building hphpi
[ 87%] Built target hphp
(&hellip;)
[100%] Building CXX object src/test/CMakeFiles/test.dir/test_ext_apc.cpp.o
[100%] Building CXX object src/test/CMakeFiles/test.dir/test_transformer.cpp.o
Linking CXX executable test
[100%] Built target test</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Wielkość binarki jest dość imponująca:
</span></span></code></pre></div><p>du -h ./hphp
17M	./hphp</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Nice ;)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Wynik:
</span></span></code></pre></div><p>./hphp hello.php &ndash;keep-tempdir=1 &ndash;log=3
running hphp&hellip;
creating temporary directory /tmp/hphp_839yK9 &hellip;
parsing inputs&hellip;
parsing ./hello.php&hellip;
parsing inputs took 0'00&quot; (6 ms) wall time
pre-optimizing&hellip;
pre-optimizing took 0'00&quot; (0 ms) wall time
inferring types&hellip;
inferring types took 0'00&quot; (0 ms) wall time
post-optimizing&hellip;
post-optimizing took 0'00&quot; (0 ms) wall time
creating CPP files&hellip;
creating CPP files took 0'00&quot; (92 ms) wall time
compiling and linking CPP files&hellip;
compiling and linking CPP files took 1'23&quot; (83851 ms) wall time
running executable /tmp/hphp_839yK9/program &ndash;file hello.php&hellip;
HipHop
all files saved in /tmp/hphp_839yK9 &hellip;
running hphp took 1'24&quot; (84732 ms) wall time</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Reszta testów potem ;)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Działa i to jest dobre, zobaczymy jak kompilacja moich aplikacji, ale o tym następnym razem.
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>Dynamiczne ładowanie Zend Plugins</title>
      <link>https://cynar.ski/2010/02/07/dynamiczne-ladowanie-zend-plugins/</link>
      <pubDate>Sun, 07 Feb 2010 12:52:16 +0000</pubDate>
      <guid>https://cynar.ski/2010/02/07/dynamiczne-ladowanie-zend-plugins/</guid>
      <description>&lt;p&gt;Jak wiadomo Zend vanilia jest nieco toporny i mało przyjazny dla projektanta, dlatego trzeba deko posiedzieć, żeby wszystko zadziałało w miarę przyjemnie i tak jak chcemy.&lt;/p&gt;
&lt;p&gt;Integracja Zend&amp;rsquo;a z Doctrine, Smarty&amp;rsquo;mi jest powszechnie znana i opisywana na różnych stronach, dlatego nie będę tego powielać.&lt;/p&gt;
&lt;p&gt;Wszystko działa fajnie, jednak w przypdku rozbudowy serwisu i chęci automatyzacji obsługi żądań w odniesieniu do &lt;strong&gt;Zend_Loader_PluginLoader&lt;/strong&gt; wymagała implementacji loader&amp;rsquo;a - zamiast wyważać otwarte drzwi, zabuszowałem w internecie i znalazłem całkiem fajny &lt;strong&gt;Loader&lt;/strong&gt; do pluginów, oczywiście wymagał on u mnie pewnych zmian, bo inna idea - ale ogólnie pomysł dobry i działa:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Jak wiadomo Zend vanilia jest nieco toporny i mało przyjazny dla projektanta, dlatego trzeba deko posiedzieć, żeby wszystko zadziałało w miarę przyjemnie i tak jak chcemy.</p>
<p>Integracja Zend&rsquo;a z Doctrine, Smarty&rsquo;mi jest powszechnie znana i opisywana na różnych stronach, dlatego nie będę tego powielać.</p>
<p>Wszystko działa fajnie, jednak w przypdku rozbudowy serwisu i chęci automatyzacji obsługi żądań w odniesieniu do <strong>Zend_Loader_PluginLoader</strong> wymagała implementacji loader&rsquo;a - zamiast wyważać otwarte drzwi, zabuszowałem w internecie i znalazłem całkiem fajny <strong>Loader</strong> do pluginów, oczywiście wymagał on u mnie pewnych zmian, bo inna idea - ale ogólnie pomysł dobry i działa:</p>
<p><a href="http://www.zfsnippets.com/snippets/view/id/57/plugger-a-plugin-manager">http://www.zfsnippets.com/snippets/view/id/57/plugger-a-plugin-manager</a></p>
<p>Ogólnie polecam w celu definiowania różnych pluginów pod względem &ldquo;areas&rdquo;, definiowanych za pomocą obsługi requestów np.
inne pluginy dla modułu &ldquo;admin&rdquo;, inne dla kontrollera &ldquo;users&rdquo; etc&hellip; - wszstko jest opisane.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Szybszy PHP dzięki Facebook, czyli Hip-Hop for PHP</title>
      <link>https://cynar.ski/2010/02/04/szybszy-php-dzieki-facebook-czyli-hip-hop-for-php/</link>
      <pubDate>Thu, 04 Feb 2010 08:48:47 +0000</pubDate>
      <guid>https://cynar.ski/2010/02/04/szybszy-php-dzieki-facebook-czyli-hip-hop-for-php/</guid>
      <description>&lt;p&gt;Wczoraj na &lt;a href=&#34;http://developers.facebook.com/news.php?blog=1&amp;amp;story=358&#34;&gt;blogu developerów Facebook&amp;rsquo;a&lt;/a&gt; pojawiła się informacja o wypuszczeniu ich kompilatora PHP. Sprawa ciekawa i godna zainteresowania szczególnie, że owe ustrojstwo tłumaczy kod PHP na C++, jak to robi w praktyce jeszcze nie wiem - ale mam nadzieję, że niebawem znajdę chwilkę czasu i zgłębię temat bardziej.&lt;/p&gt;
&lt;p&gt;Zasada działania kompilatora:
&lt;img alt=&#34;Facebook blog&#34; loading=&#34;lazy&#34; src=&#34;http://wiki.developers.facebook.com/images/2/23/HipHop_transformation_process.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;Poczekamy zobaczymy - na razie zapowiada się ciekawie.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Wczoraj na <a href="http://developers.facebook.com/news.php?blog=1&amp;story=358">blogu developerów Facebook&rsquo;a</a> pojawiła się informacja o wypuszczeniu ich kompilatora PHP. Sprawa ciekawa i godna zainteresowania szczególnie, że owe ustrojstwo tłumaczy kod PHP na C++, jak to robi w praktyce jeszcze nie wiem - ale mam nadzieję, że niebawem znajdę chwilkę czasu i zgłębię temat bardziej.</p>
<p>Zasada działania kompilatora:
<img alt="Facebook blog" loading="lazy" src="http://wiki.developers.facebook.com/images/2/23/HipHop_transformation_process.png"></p>
<p>Poczekamy zobaczymy - na razie zapowiada się ciekawie.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Doctrine &#43; NestedSet &#43; Ajax &#43; Smarty &#43; ZF</title>
      <link>https://cynar.ski/2010/01/30/doctrine-i-nested-set/</link>
      <pubDate>Sat, 30 Jan 2010 13:43:28 +0000</pubDate>
      <guid>https://cynar.ski/2010/01/30/doctrine-i-nested-set/</guid>
      <description>&lt;p&gt;Na pewno nie raz okazuje się, że na stronie czy w innej aplikacji trzeba umieszczać i zarządzać danymi hierarchicznymi. Jeżeli korzystamy z Doctrine&amp;rsquo;a to mamy do dyspozycji &lt;strong&gt;NestedSet&lt;/strong&gt; - bardzo przydatne narzędzie&lt;/p&gt;
&lt;h4 id=&#34;zaczynamy&#34;&gt;Zaczynamy&lt;/h4&gt;
&lt;p&gt;Po pierwsze określamy strukturę tabeli dla danych hierarchicznych:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;App_Menus:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; actAs:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   NestedSet:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     hasManyRoots: true
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     rootColumnName: parent_id
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; tableName: menus
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; columns:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   id:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     type: integer
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     primary: true
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     autoincrement: true
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   name: string(64)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   type: integer
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Powyżej mamy definicję tabeli w której może występować wiele drzeni drzewa, a pole określające dane drzewo nazwane zostało &lt;strong&gt;parent_id&lt;/strong&gt; (w dokumentacji Doctrine, używają &lt;strong&gt;root_id&lt;/strong&gt; jednak w moim przypadku z racji zaszłości historychnych wolę parent_id)&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Na pewno nie raz okazuje się, że na stronie czy w innej aplikacji trzeba umieszczać i zarządzać danymi hierarchicznymi. Jeżeli korzystamy z Doctrine&rsquo;a to mamy do dyspozycji <strong>NestedSet</strong> - bardzo przydatne narzędzie</p>
<h4 id="zaczynamy">Zaczynamy</h4>
<p>Po pierwsze określamy strukturę tabeli dla danych hierarchicznych:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>App_Menus:
</span></span><span style="display:flex;"><span> actAs:
</span></span><span style="display:flex;"><span>   NestedSet:
</span></span><span style="display:flex;"><span>     hasManyRoots: true
</span></span><span style="display:flex;"><span>     rootColumnName: parent_id
</span></span><span style="display:flex;"><span> tableName: menus
</span></span><span style="display:flex;"><span> columns:
</span></span><span style="display:flex;"><span>   id:
</span></span><span style="display:flex;"><span>     type: integer
</span></span><span style="display:flex;"><span>     primary: true
</span></span><span style="display:flex;"><span>     autoincrement: true
</span></span><span style="display:flex;"><span>   name: string(64)
</span></span><span style="display:flex;"><span>   type: integer
</span></span></code></pre></div><p>Powyżej mamy definicję tabeli w której może występować wiele drzeni drzewa, a pole określające dane drzewo nazwane zostało <strong>parent_id</strong> (w dokumentacji Doctrine, używają <strong>root_id</strong> jednak w moim przypadku z racji zaszłości historychnych wolę parent_id)</p>
<p>Dzięki temu wpisowi orzymujemy takiego SQL&rsquo;q:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-mysql" data-lang="mysql"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">CREATE</span> <span style="color:#66d9ef">TABLE</span> <span style="color:#f92672">`</span>t_menus<span style="color:#f92672">`</span> (
</span></span><span style="display:flex;"><span>   <span style="color:#f92672">`</span>id<span style="color:#f92672">`</span> <span style="color:#66d9ef">bigint</span>(<span style="color:#ae81ff">20</span>) <span style="color:#66d9ef">NOT</span> <span style="color:#66d9ef">NULL</span> <span style="color:#66d9ef">auto_increment</span>,
</span></span><span style="display:flex;"><span>   <span style="color:#f92672">`</span>name<span style="color:#f92672">`</span> <span style="color:#66d9ef">varchar</span>(<span style="color:#ae81ff">64</span>) <span style="color:#66d9ef">default</span> <span style="color:#66d9ef">NULL</span>,
</span></span><span style="display:flex;"><span>   <span style="color:#f92672">`</span>parent_id<span style="color:#f92672">`</span> <span style="color:#66d9ef">bigint</span>(<span style="color:#ae81ff">20</span>) <span style="color:#66d9ef">default</span> <span style="color:#66d9ef">NULL</span>,
</span></span><span style="display:flex;"><span>   <span style="color:#f92672">`</span>type<span style="color:#f92672">`</span> <span style="color:#66d9ef">bigint</span>(<span style="color:#ae81ff">20</span>) <span style="color:#66d9ef">default</span> <span style="color:#66d9ef">NULL</span>,
</span></span><span style="display:flex;"><span>   <span style="color:#f92672">`</span>lft<span style="color:#f92672">`</span> <span style="color:#66d9ef">int</span>(<span style="color:#ae81ff">11</span>) <span style="color:#66d9ef">default</span> <span style="color:#66d9ef">NULL</span>,
</span></span><span style="display:flex;"><span>   <span style="color:#f92672">`</span>rgt<span style="color:#f92672">`</span> <span style="color:#66d9ef">int</span>(<span style="color:#ae81ff">11</span>) <span style="color:#66d9ef">default</span> <span style="color:#66d9ef">NULL</span>,
</span></span><span style="display:flex;"><span>   <span style="color:#f92672">`</span>level<span style="color:#f92672">`</span> <span style="color:#66d9ef">smallint</span>(<span style="color:#ae81ff">6</span>) <span style="color:#66d9ef">default</span> <span style="color:#66d9ef">NULL</span>,
</span></span><span style="display:flex;"><span>   <span style="color:#66d9ef">PRIMARY</span> <span style="color:#66d9ef">KEY</span>  (<span style="color:#f92672">`</span>id<span style="color:#f92672">`</span>)
</span></span><span style="display:flex;"><span> ) <span style="color:#66d9ef">ENGINE</span><span style="color:#f92672">=</span>InnoDB <span style="color:#66d9ef">DEFAULT</span> <span style="color:#66d9ef">CHARSET</span><span style="color:#f92672">=</span>utf8
</span></span></code></pre></div><h4 id="implementacja">Implementacja:</h4>
<p>Dobra wszystko fajnie, ale jak to teraz używać?</p>
<p>Nie ma nic prostrzego, zakładam używanie smartów i to wersji 3, zdaje sobie sprawę że Smarty 3 nie doczekały się jeszcze dobrej dokumentacji, ale zawsze jest kod systemu szablonów - można poczytać :)</p>
<p>Po pierwsze wyciągamy dane z bazy:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>public function getTreeFromRoot()
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span> $treeObject = Doctrine_Core::getTable(&#39;Model_App_Menus&#39;)-&gt;getTree();
</span></span><span style="display:flex;"><span> $rootColumnName = $treeObject-&gt;getAttribute(&#39;rootColumnName&#39;);
</span></span><span style="display:flex;"><span> foreach ($treeObject-&gt;fetchRoots() as $root)
</span></span><span style="display:flex;"><span> {
</span></span><span style="display:flex;"><span>   $options = array(&#39;root_id&#39; =&gt; $root-&gt;$rootColumnName);
</span></span><span style="display:flex;"><span>   return $treeObject-&gt;fetchTree($options)-&gt;toHierarchy()-&gt;toArray();
</span></span><span style="display:flex;"><span> }
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>Wynikiem jest tablica wielowymiarowa z zależnościami</p>
<p>Dla ułatwienia sobie wykorzystania tejże tablicy w systemie szablonów deko sobie poczyśćmy wynik, chodzi głównie o to, że tablica z Doctrine&rsquo;a zawsze zawiera element tablicowy <strong>__children</strong> nawet jeżeli jest on pusty.</p>
<p>Trywialna funkcja wywala nam puste tablice:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>public function flatArray($array)
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span> foreach ($array as $key =&gt; $value)
</span></span><span style="display:flex;"><span> {
</span></span><span style="display:flex;"><span>   if(is_array($value))
</span></span><span style="display:flex;"><span>   {
</span></span><span style="display:flex;"><span>     if(count($value) != 0) $out[$key] = $this-&gt;flatArray($value);
</span></span><span style="display:flex;"><span>   }
</span></span><span style="display:flex;"><span>   else
</span></span><span style="display:flex;"><span>   {
</span></span><span style="display:flex;"><span>     $out[$key] = $value;
</span></span><span style="display:flex;"><span>   }
</span></span><span style="display:flex;"><span> }
</span></span><span style="display:flex;"><span> return $out;
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>Wynik możemy przekazać do Smartów i wyświetlić za pomocą małej rekurencji:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-gdscript3" data-lang="gdscript3"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>{function name<span style="color:#f92672">=</span>menu level<span style="color:#f92672">=</span><span style="color:#ae81ff">0</span>}
</span></span><span style="display:flex;"><span>{strip}
</span></span><span style="display:flex;"><span>{foreach <span style="color:#f92672">$</span>data as <span style="color:#f92672">$</span>fields}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>   {foreach from<span style="color:#f92672">=$</span>fields item<span style="color:#f92672">=</span>field key<span style="color:#f92672">=</span>key}
</span></span><span style="display:flex;"><span>     {<span style="color:#66d9ef">if</span> <span style="color:#f92672">$</span>level neq <span style="color:#e6db74">&#34;0&#34;</span>}
</span></span><span style="display:flex;"><span>       {<span style="color:#66d9ef">if</span> <span style="color:#f92672">$</span>key eq <span style="color:#e6db74">&#34;id&#34;</span>}{assign <span style="color:#66d9ef">var</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;ids&#34;</span> value<span style="color:#f92672">=$</span>field}{<span style="color:#f92672">/</span><span style="color:#66d9ef">if</span>}
</span></span><span style="display:flex;"><span>       {<span style="color:#66d9ef">if</span> <span style="color:#f92672">$</span>key eq <span style="color:#e6db74">&#34;name&#34;</span>}
</span></span><span style="display:flex;"><span>{<span style="color:#f92672">$</span>field}  (lorem ipsum<span style="color:#f92672">...</span>){<span style="color:#f92672">/</span><span style="color:#66d9ef">if</span>}
</span></span><span style="display:flex;"><span>       {<span style="color:#66d9ef">if</span> <span style="color:#f92672">$</span>key eq <span style="color:#e6db74">&#34;level&#34;</span>}{<span style="color:#66d9ef">if</span> <span style="color:#f92672">$</span>fields<span style="color:#f92672">|</span><span style="color:#960050;background-color:#1e0010">@</span>count eq <span style="color:#e6db74">&#39;7&#39;</span>}{<span style="color:#f92672">/</span><span style="color:#66d9ef">if</span>}{<span style="color:#f92672">/</span><span style="color:#66d9ef">if</span>}
</span></span><span style="display:flex;"><span>     {<span style="color:#f92672">/</span><span style="color:#66d9ef">if</span>}
</span></span><span style="display:flex;"><span>     {<span style="color:#66d9ef">if</span> <span style="color:#f92672">$</span>key eq <span style="color:#e6db74">&#34;__children&#34;</span>}
</span></span><span style="display:flex;"><span>       {menu data<span style="color:#f92672">=$</span>field level<span style="color:#f92672">=$</span>level<span style="color:#f92672">+</span><span style="color:#ae81ff">1</span>}
</span></span><span style="display:flex;"><span>       {<span style="color:#66d9ef">if</span> <span style="color:#f92672">$</span>level neq <span style="color:#e6db74">&#34;0&#34;</span>}{<span style="color:#f92672">/</span><span style="color:#66d9ef">if</span>}
</span></span><span style="display:flex;"><span>     {<span style="color:#f92672">/</span><span style="color:#66d9ef">if</span>}
</span></span><span style="display:flex;"><span>   {<span style="color:#f92672">/</span>foreach}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span> {<span style="color:#f92672">/</span>foreach}
</span></span><span style="display:flex;"><span>{<span style="color:#f92672">/</span>strip}
</span></span><span style="display:flex;"><span>{<span style="color:#f92672">/</span>function}
</span></span><span style="display:flex;"><span>{menu data<span style="color:#f92672">=$</span>childs}
</span></span></code></pre></div><p>Dzięki temu otrzymamy ładne rzewko w liście.</p>
<h4 id="zarządzanie">Zarządzanie:</h4>
<p>Budujemy ładną aplikację i chcemy mieć drag-n-drop&rsquo;owe określenie menu, fajnie ale jak?</p>
<p>Najszybciej :)</p>
<p>Ja jestem strasznie leniwy i średnio lubię javascript&rsquo;a, więc korzystam z gotowców :) Trzeba zassać sobie mały kodzik do drag-n-dropowego zarządzania drzewami:<br>
<a href="http://sandbox.tinctuur.be/tree/">Tutaj&hellip;.</a></p>
<p>Fajnie działa, jednak zwraca mało ciekawy wynik, zobacz stronę demo ;)</p>
<p>Nie ma problemu, za pomocą Ajaxa obsługujemy i to (funkcja jeszcze nie zoptymalizowana, ale działa):</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>public function sortmenuAction()
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span> $root_node = $_POST[&#39;menu_id&#39;];
</span></span><span style="display:flex;"><span> $pola  =$_POST[&#39;list&#39;];
</span></span><span style="display:flex;"><span> $childs = 0;
</span></span><span style="display:flex;"><span> foreach ($_POST[&#39;list&#39;] as $key =&gt; $value)
</span></span><span style="display:flex;"><span> {
</span></span><span style="display:flex;"><span>   $run=0;
</span></span><span style="display:flex;"><span>   if($childs != 0)
</span></span><span style="display:flex;"><span>   {
</span></span><span style="display:flex;"><span>     $run = 1;
</span></span><span style="display:flex;"><span>     $childs--;
</span></span><span style="display:flex;"><span>     $parent_pos = $key - 1;
</span></span><span style="display:flex;"><span>     while (strstr($pola[$parent_pos],&#34;_&#34;) == false){
</span></span><span style="display:flex;"><span>       $parent_pos--;
</span></span><span style="display:flex;"><span>     }
</span></span><span style="display:flex;"><span>     $tmp = explode(&#34;_&#34;,$pola[$parent_pos]);
</span></span><span style="display:flex;"><span>     $data = $tmp[0];
</span></span><span style="display:flex;"><span>     if (strstr($value,&#34;_&#34;) != false) {
</span></span><span style="display:flex;"><span>       $tmp = explode(&#34;_&#34;,$value);
</span></span><span style="display:flex;"><span>       $dzieciak = $tmp[0];
</span></span><span style="display:flex;"><span>     }
</span></span><span style="display:flex;"><span>     else{
</span></span><span style="display:flex;"><span>       $dzieciak = $value;
</span></span><span style="display:flex;"><span>     }
</span></span><span style="display:flex;"><span>   }
</span></span><span style="display:flex;"><span>   if($run == 0)
</span></span><span style="display:flex;"><span>   {
</span></span><span style="display:flex;"><span>     if (strstr($value,&#34;_&#34;) != false)
</span></span><span style="display:flex;"><span>     {
</span></span><span style="display:flex;"><span>       $tmp = explode(&#34;_&#34;,$value);
</span></span><span style="display:flex;"><span>       $data = $tmp[0];
</span></span><span style="display:flex;"><span>       $childs = $tmp[1];
</span></span><span style="display:flex;"><span>       $dzieciak = $data;
</span></span><span style="display:flex;"><span>       $data = $root_node;
</span></span><span style="display:flex;"><span>     }
</span></span><span style="display:flex;"><span>     else
</span></span><span style="display:flex;"><span>     {
</span></span><span style="display:flex;"><span>       $dzieciak = $value;
</span></span><span style="display:flex;"><span>       $data = $root_node;
</span></span><span style="display:flex;"><span>     }
</span></span><span style="display:flex;"><span>   }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>   $rootMenu = Doctrine_Core::getTable(&#39;Model_App_Menus&#39;)-&gt;findOneById($data);
</span></span><span style="display:flex;"><span>   $childMenu = Doctrine_Core::getTable(&#39;Model_App_Menus&#39;)-&gt;findOneById($dzieciak);
</span></span><span style="display:flex;"><span>   $childMenu-&gt;getNode()-&gt;moveAsLastChildOf($rootMenu);
</span></span><span style="display:flex;"><span> }
</span></span><span style="display:flex;"><span> echo &#34;Done&#34;;
</span></span><span style="display:flex;"><span> die();
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><h4 id="wsio---działa-sortowanie-ajaxem-i-wyświetlanie---ogólnie-problem-drzewa-załatwiony-w-15-minut-">Wsio - działa, sortowanie Ajax&rsquo;em i wyświetlanie - ogólnie problem drzewa załatwiony w 15 minut :)</h4>
]]></content:encoded>
    </item>
    <item>
      <title>Wyciąganie akcji Zend_Controller w modułach systemu</title>
      <link>https://cynar.ski/2010/01/30/wyciaganie-akcji-zend_controller-w-modulach-systemu/</link>
      <pubDate>Sat, 30 Jan 2010 13:10:13 +0000</pubDate>
      <guid>https://cynar.ski/2010/01/30/wyciaganie-akcji-zend_controller-w-modulach-systemu/</guid>
      <description>&lt;p&gt;Czasami w przypadku tworzenia systemu kontroli dostępu do zasobów aplikacji chcemy mieć wszystko np. w bazie danych. W przypadku kiedy aplikacja jest spora to niestety okazuje się ze ręczne prowadzanie elementów systemu do bazy jest zwyczajnie męczące, a &lt;strong&gt;fixtures&lt;/strong&gt; np. w Doctrine to zbędny wysiłek można posilić się prostą funkcją parsującą nasze pliki.&lt;/p&gt;
&lt;p&gt;Oczywiście kod poniżej jest przystosowany do mojej aplikacji, ale myślę że nie trudno go zmienić pod Wasze potrzeby.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Czasami w przypadku tworzenia systemu kontroli dostępu do zasobów aplikacji chcemy mieć wszystko np. w bazie danych. W przypadku kiedy aplikacja jest spora to niestety okazuje się ze ręczne prowadzanie elementów systemu do bazy jest zwyczajnie męczące, a <strong>fixtures</strong> np. w Doctrine to zbędny wysiłek można posilić się prostą funkcją parsującą nasze pliki.</p>
<p>Oczywiście kod poniżej jest przystosowany do mojej aplikacji, ale myślę że nie trudno go zmienić pod Wasze potrzeby.</p>
<p>Wynikiem jest tablica z pełną ścieżką do akcji w ZF</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-php" data-lang="php"><span style="display:flex;"><span><span style="color:#66d9ef">public</span> <span style="color:#66d9ef">function</span> <span style="color:#a6e22e">getAllSystemResources</span>()
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>  $d <span style="color:#f92672">=</span> <span style="color:#a6e22e">Zend_Registry</span><span style="color:#f92672">::</span><span style="color:#a6e22e">getInstance</span>();
</span></span><span style="display:flex;"><span>  $module_dir <span style="color:#f92672">=</span> $d<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">config</span>[<span style="color:#e6db74">&#39;doctrine&#39;</span>][<span style="color:#e6db74">&#39;models_path&#39;</span>]<span style="color:#f92672">.</span><span style="color:#e6db74">&#34;/../modules&#34;</span>;
</span></span><span style="display:flex;"><span>  $temp <span style="color:#f92672">=</span> <span style="color:#a6e22e">array_diff</span>( <span style="color:#a6e22e">scandir</span>( $module_dir), <span style="color:#66d9ef">Array</span>( <span style="color:#e6db74">&#34;.&#34;</span>, <span style="color:#e6db74">&#34;..&#34;</span>, <span style="color:#e6db74">&#34;.svn&#34;</span>));
</span></span><span style="display:flex;"><span>  $modules <span style="color:#f92672">=</span> <span style="color:#66d9ef">array</span>();
</span></span><span style="display:flex;"><span>  $controller_directorys <span style="color:#f92672">=</span> <span style="color:#66d9ef">array</span>();
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">foreach</span> ($temp <span style="color:#66d9ef">as</span> $module) {
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">is_dir</span>($module_dir <span style="color:#f92672">.</span> <span style="color:#e6db74">&#34;/&#34;</span> <span style="color:#f92672">.</span> $module<span style="color:#f92672">.</span><span style="color:#e6db74">&#34;/controllers/&#34;</span>)) {
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">array_push</span>($modules,$module);
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">array_push</span>($controller_directorys, $module_dir <span style="color:#f92672">.</span> <span style="color:#e6db74">&#34;/&#34;</span> <span style="color:#f92672">.</span> $module<span style="color:#f92672">.</span><span style="color:#e6db74">&#34;/controllers/&#34;</span>);
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">foreach</span> ($controller_directorys <span style="color:#66d9ef">as</span> $dir) {
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">foreach</span> (<span style="color:#a6e22e">scandir</span>($dir) <span style="color:#66d9ef">as</span> $dirstructure) {
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">is_file</span>($dir  <span style="color:#f92672">.</span> <span style="color:#e6db74">&#34;/&#34;</span> <span style="color:#f92672">.</span> $dirstructure)) {
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">strstr</span>($dirstructure,<span style="color:#e6db74">&#34;Controller.php&#34;</span>) <span style="color:#f92672">!=</span> <span style="color:#66d9ef">false</span>) {
</span></span><span style="display:flex;"><span>                <span style="color:#66d9ef">include_once</span>($dir <span style="color:#f92672">.</span> <span style="color:#e6db74">&#34;/&#34;</span> <span style="color:#f92672">.</span> $dirstructure);
</span></span><span style="display:flex;"><span>            }
</span></span><span style="display:flex;"><span>        }
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>  $db_structure <span style="color:#f92672">=</span> <span style="color:#66d9ef">array</span>();
</span></span><span style="display:flex;"><span>  $db_path <span style="color:#f92672">=</span> <span style="color:#66d9ef">array</span>();
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">foreach</span>(<span style="color:#a6e22e">get_declared_classes</span>() <span style="color:#66d9ef">as</span> $c)
</span></span><span style="display:flex;"><span>  {
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span>(<span style="color:#a6e22e">is_subclass_of</span>($c, <span style="color:#e6db74">&#39;App_Controller_Action&#39;</span>))
</span></span><span style="display:flex;"><span>    {
</span></span><span style="display:flex;"><span>      $functions <span style="color:#f92672">=</span> <span style="color:#66d9ef">array</span>();
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">foreach</span> (<span style="color:#a6e22e">get_class_methods</span>($c) <span style="color:#66d9ef">as</span> $f)
</span></span><span style="display:flex;"><span>      {
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">strstr</span>($f,<span style="color:#e6db74">&#34;Action&#34;</span>) <span style="color:#f92672">!=</span> <span style="color:#66d9ef">false</span>)
</span></span><span style="display:flex;"><span>        {
</span></span><span style="display:flex;"><span>          <span style="color:#a6e22e">array_push</span>($functions,<span style="color:#a6e22e">substr</span>($f,<span style="color:#ae81ff">0</span>,<span style="color:#a6e22e">strpos</span>($f,<span style="color:#e6db74">&#34;Action&#34;</span>)));
</span></span><span style="display:flex;"><span>        }
</span></span><span style="display:flex;"><span>      }
</span></span><span style="display:flex;"><span>      $c <span style="color:#f92672">=</span> <span style="color:#a6e22e">strtolower</span>(<span style="color:#a6e22e">substr</span>($c,<span style="color:#ae81ff">0</span>,<span style="color:#a6e22e">strpos</span>($c,<span style="color:#e6db74">&#34;Controller&#34;</span>)));
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">strstr</span>($c,<span style="color:#e6db74">&#34;_&#34;</span>) <span style="color:#f92672">!=</span> <span style="color:#66d9ef">false</span>)
</span></span><span style="display:flex;"><span>      {
</span></span><span style="display:flex;"><span>        $db_structure[<span style="color:#a6e22e">substr</span>($c,<span style="color:#ae81ff">0</span>,<span style="color:#a6e22e">strpos</span>($c,<span style="color:#e6db74">&#34;_&#34;</span>))][<span style="color:#a6e22e">substr</span>($c,<span style="color:#a6e22e">strpos</span>($c,<span style="color:#e6db74">&#34;_&#34;</span>) <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>)] <span style="color:#f92672">=</span> $functions;
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">foreach</span>($functions <span style="color:#66d9ef">as</span> $fun)
</span></span><span style="display:flex;"><span>        {
</span></span><span style="display:flex;"><span>          $index <span style="color:#f92672">=</span> <span style="color:#a6e22e">substr</span>($c,<span style="color:#ae81ff">0</span>,<span style="color:#a6e22e">strpos</span>($c,<span style="color:#e6db74">&#34;_&#34;</span>))<span style="color:#f92672">.</span><span style="color:#a6e22e">substr</span>($c,<span style="color:#a6e22e">strpos</span>($c,<span style="color:#e6db74">&#34;_&#34;</span>) <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>)<span style="color:#f92672">.</span>$fun;
</span></span><span style="display:flex;"><span>          $db_path[$index] <span style="color:#f92672">=</span> <span style="color:#a6e22e">substr</span>($c,<span style="color:#ae81ff">0</span>,<span style="color:#a6e22e">strpos</span>($c,<span style="color:#e6db74">&#34;_&#34;</span>))<span style="color:#f92672">.</span><span style="color:#e6db74">&#34;/&#34;</span><span style="color:#f92672">.</span><span style="color:#a6e22e">substr</span>($c,<span style="color:#a6e22e">strpos</span>($c,<span style="color:#e6db74">&#34;_&#34;</span>) <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>)<span style="color:#f92672">.</span><span style="color:#e6db74">&#34;/&#34;</span><span style="color:#f92672">.</span>$fun;
</span></span><span style="display:flex;"><span>        }
</span></span><span style="display:flex;"><span>      }<span style="color:#66d9ef">else</span>
</span></span><span style="display:flex;"><span>      {
</span></span><span style="display:flex;"><span>        $db_structure[$default_module][$c] <span style="color:#f92672">=</span> $functions;
</span></span><span style="display:flex;"><span>        $db_path[] <span style="color:#f92672">=</span> $default_module<span style="color:#f92672">.</span><span style="color:#e6db74">&#34;/&#34;</span><span style="color:#f92672">.</span>$c<span style="color:#f92672">.</span><span style="color:#e6db74">&#34;/&#34;</span><span style="color:#f92672">.</span>$functions;
</span></span><span style="display:flex;"><span>      }
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">return</span> $db_path;
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>Debugowanie PHP i TextMate...</title>
      <link>https://cynar.ski/2010/01/29/debugowanie-php-i-textmate/</link>
      <pubDate>Fri, 29 Jan 2010 17:26:05 +0000</pubDate>
      <guid>https://cynar.ski/2010/01/29/debugowanie-php-i-textmate/</guid>
      <description>&lt;p&gt;Prosta acz przydatna funkcja XDEbug&amp;rsquo;a czyli określenie linku:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-gdscript3&#34; data-lang=&#34;gdscript3&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	[xdebug]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	zend_extension&lt;span style=&#34;color:#f92672&#34;&gt;=/&lt;/span&gt;Applications&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;MAMP&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;bin&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;php5&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;lib&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;php&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;extensions&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;no&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;debug&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;non&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;zts&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;20050922&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;xdebug&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;so
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	xdebug&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;file_link_format &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;txmt://open?url=file://&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;%f&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;amp;line=%l&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	xdebug&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;profiler_enable&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	xdebug&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;profiler_output_dir&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/Users/paramah/Sites/Debug&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	xdebug&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;trace_format&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	xdebug&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;trace_output_dir&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/Users/paramah/Sites/Debug&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	xdebug&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;var_display_max_children&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	xdebug&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;extended_info&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	xdebug&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;collect_vars&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	; cgi&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;force_redirect &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
      <content:encoded><![CDATA[<p>Prosta acz przydatna funkcja XDEbug&rsquo;a czyli określenie linku:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-gdscript3" data-lang="gdscript3"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	[xdebug]
</span></span><span style="display:flex;"><span>	zend_extension<span style="color:#f92672">=/</span>Applications<span style="color:#f92672">/</span>MAMP<span style="color:#f92672">/</span>bin<span style="color:#f92672">/</span>php5<span style="color:#f92672">/</span>lib<span style="color:#f92672">/</span>php<span style="color:#f92672">/</span>extensions<span style="color:#f92672">/</span>no<span style="color:#f92672">-</span>debug<span style="color:#f92672">-</span>non<span style="color:#f92672">-</span>zts<span style="color:#f92672">-</span><span style="color:#ae81ff">20050922</span><span style="color:#f92672">/</span>xdebug<span style="color:#f92672">.</span>so
</span></span><span style="display:flex;"><span>	xdebug<span style="color:#f92672">.</span>file_link_format <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;txmt://open?url=file://</span><span style="color:#e6db74">%f</span><span style="color:#e6db74">&amp;line=%l&#34;</span>
</span></span><span style="display:flex;"><span>	xdebug<span style="color:#f92672">.</span>profiler_enable<span style="color:#f92672">=</span><span style="color:#ae81ff">1</span>
</span></span><span style="display:flex;"><span>	xdebug<span style="color:#f92672">.</span>profiler_output_dir<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;/Users/paramah/Sites/Debug&#34;</span>
</span></span><span style="display:flex;"><span>	xdebug<span style="color:#f92672">.</span>trace_format<span style="color:#f92672">=</span><span style="color:#ae81ff">1</span>
</span></span><span style="display:flex;"><span>	xdebug<span style="color:#f92672">.</span>trace_output_dir<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;/Users/paramah/Sites/Debug&#34;</span>
</span></span><span style="display:flex;"><span>	xdebug<span style="color:#f92672">.</span>var_display_max_children<span style="color:#f92672">=</span><span style="color:#ae81ff">3</span>
</span></span><span style="display:flex;"><span>	xdebug<span style="color:#f92672">.</span>extended_info<span style="color:#f92672">=</span><span style="color:#ae81ff">1</span>
</span></span><span style="display:flex;"><span>	xdebug<span style="color:#f92672">.</span>collect_vars<span style="color:#f92672">=</span><span style="color:#ae81ff">1</span>
</span></span><span style="display:flex;"><span>	; cgi<span style="color:#f92672">.</span>force_redirect <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>OSX i kodowanie w PHP</title>
      <link>https://cynar.ski/2010/01/27/osx-i-kodowanie-w-php/</link>
      <pubDate>Wed, 27 Jan 2010 09:39:22 +0000</pubDate>
      <guid>https://cynar.ski/2010/01/27/osx-i-kodowanie-w-php/</guid>
      <description>&lt;p&gt;Złammy przerwę ;)&lt;/p&gt;
&lt;h4 id=&#34;niebawem-4-lata-jak-używam-sprzętów-z-pod-znaku-jabłka-muszę-pomyśleć-jak-to-uczcić&#34;&gt;Niebawem 4 lata jak używam sprzętów z pod znaku jabłka, muszę pomyśleć jak to uczcić&amp;hellip;&lt;/h4&gt;
&lt;p&gt;Niedawno przeszedłem na czyściutką instalację &lt;a href=&#34;http://www.apple.com/pl/macosx/&#34;&gt;Leoparda Snow&lt;/a&gt; na moim wysłużonym już MacBook&amp;rsquo;u (polecam wszystkim - druga młodość laptopa).&lt;/p&gt;
&lt;p&gt;Na szybko musiałem strorzyć sobie platformę do klikania w PHP, sami wiecie jak to jest - projekty, projekty i jeszcze raz projekty. Dobrze więc jest mieć wszystko czego tylko dusza zapragnie
do szybkiego budowania kodu.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Złammy przerwę ;)</p>
<h4 id="niebawem-4-lata-jak-używam-sprzętów-z-pod-znaku-jabłka-muszę-pomyśleć-jak-to-uczcić">Niebawem 4 lata jak używam sprzętów z pod znaku jabłka, muszę pomyśleć jak to uczcić&hellip;</h4>
<p>Niedawno przeszedłem na czyściutką instalację <a href="http://www.apple.com/pl/macosx/">Leoparda Snow</a> na moim wysłużonym już MacBook&rsquo;u (polecam wszystkim - druga młodość laptopa).</p>
<p>Na szybko musiałem strorzyć sobie platformę do klikania w PHP, sami wiecie jak to jest - projekty, projekty i jeszcze raz projekty. Dobrze więc jest mieć wszystko czego tylko dusza zapragnie
do szybkiego budowania kodu.</p>
<h3 id="co-zassywałem">Co zassywałem:</h3>
<ul>
<li>Serwer www, ja preferuję MAMP&rsquo;a - <a href="http://www.mamp.info/en/index.html">Strona domowa projektu</a></li>
<li>Pakiet XCode - do ściągnięcia po rejestracji <a href="http://developer.apple.com/tools/xcode/">tutaj</a></li>
<li>Opcjonalnie <strong>MacPorts</strong> - <a href="http://www.macports.org/">Strona domowa</a> (jak macie Snow&rsquo;a to pamiętajcie o dobrej wersji dla tego systemu)</li>
<li>Program <strong>MacCallGrind</strong> - dość stary bo z 2008 roku <a href="http://www.maccallgrind.com/">dostępny tutaj</a>, jednak bardzo dobrze działa</li>
<li>Program <strong>MacDGBp</strong> - dostępny <a href="http://www.bluestatic.org/software/macgdbp/">tutaj</a></li>
<li>IDE do PHP, ja jestem fanem <strong>TextMate&rsquo;a</strong>, jednak każdy używa czego lubi.</li>
<li>Do testów <strong>PHPUnit</strong> - <a href="http://www.phpunit.de/">strona domowa projektu</a></li>
<li>Dostęp do bazy danych <strong>Sequel Pro</strong> - <a href="http://www.sequelpro.com/">strona domowa projektu</a></li>
<li>Projektowanie bazy danych <strong>MySQL Workbench</strong> - <a href="http://wb.mysql.com/">strona domowa projektu</a></li>
<li>Opcjonalnie dla przyśpieszenia projektowania <strong>Zend-Framework</strong> - <a href="http://framework.zend.com/">strona domowa</a></li>
<li>Opcjonalnie <strong>Doctrine</strong> - <a href="http://www.doctrine-project.org/">strona domowa</a></li>
</ul>
<p>Generalnie przygotowanie na szybko środowiska nie jest trudne, szczególnie jak używa się gotowców.</p>
<p><strong>Ctags w TextMate</strong>Dla przyśpieszenia pracy przy projektach, szczególnie tych wykorzystujących jakieś Zendy czy inne Symfony polecam <strong><a href="http://www.cocoabits.com/TmCodeBrowser/">TmCodeBrowser</a></strong>, u mnie na Snow niestety nie ruszył z palca, powodem problemów było wpisanie w sktypcie parsującym pliki tagów <em>ctags</em> kodu zmieniającego wielkość znaków katalogów. Skrypt jest w Ruby&rsquo;m więc
zmiana go nie powinna być dla nikogo problematyczna (a jeżeli tak, to może warto deko poczytać o ruby&rsquo;m - bo to fajny język jest).</p>
]]></content:encoded>
    </item>
    <item>
      <title>Telemarketing</title>
      <link>https://cynar.ski/2009/11/10/telemarketing/</link>
      <pubDate>Tue, 10 Nov 2009 09:30:45 +0000</pubDate>
      <guid>https://cynar.ski/2009/11/10/telemarketing/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;telemarketing&#34; loading=&#34;lazy&#34; src=&#34;http://www.wulffmorgenthaler.com/striphandler.ashx?stripid=3cd3757a-1617-4a5d-843c-ec132942ceac&#34;&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><img alt="telemarketing" loading="lazy" src="http://www.wulffmorgenthaler.com/striphandler.ashx?stripid=3cd3757a-1617-4a5d-843c-ec132942ceac"></p>
]]></content:encoded>
    </item>
    <item>
      <title>Old school Atari poster.</title>
      <link>https://cynar.ski/2009/09/05/old-school-atari-poster/</link>
      <pubDate>Sat, 05 Sep 2009 21:35:47 +0000</pubDate>
      <guid>https://cynar.ski/2009/09/05/old-school-atari-poster/</guid>
      <description>&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;http://cargocollective.com/media/9534/dubmood_1_o.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;Źródło: &lt;a href=&#34;http://cargocollective.com/erikjonsson&#34;&gt;http://cargocollective.com/erikjonsson&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><img loading="lazy" src="http://cargocollective.com/media/9534/dubmood_1_o.jpg"></p>
<p>Źródło: <a href="http://cargocollective.com/erikjonsson">http://cargocollective.com/erikjonsson</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Pomysły Tesli wprowadzane w życie.</title>
      <link>https://cynar.ski/2009/09/01/pomysly-tesli-wprowadzane-w-zycie/</link>
      <pubDate>Tue, 01 Sep 2009 22:19:58 +0000</pubDate>
      <guid>https://cynar.ski/2009/09/01/pomysly-tesli-wprowadzane-w-zycie/</guid>
      <description>&lt;p&gt;Źródło: &lt;a href=&#34;http://www.ted.com/&#34;&gt;www.ted.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Świetna sprawa, szczególnie kiedy okablowanie jest jedyną rzeczą, która tak naprawdę ogranicza.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Źródło: <a href="http://www.ted.com/">www.ted.com</a></p>
<p>Świetna sprawa, szczególnie kiedy okablowanie jest jedyną rzeczą, która tak naprawdę ogranicza.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Font’s for programmers</title>
      <link>https://cynar.ski/2009/07/16/fonts-for-programmers/</link>
      <pubDate>Thu, 16 Jul 2009 08:06:01 +0000</pubDate>
      <guid>https://cynar.ski/2009/07/16/fonts-for-programmers/</guid>
      <description>&lt;p&gt;To co widzisz w swoim ulubionym edytorze jest ważne i to nie tylko dlatego, że ma działać, ale też dlatego żeby &amp;ldquo;łagodziło oko&amp;rdquo;. Nuda jest straszna to prawda, dlatego zmieniłem sobie font&amp;rsquo;y w TextMate na
&lt;a href=&#34;http://www.levien.com/type/myfonts/inconsolata.html&#34;&gt;Inconsolata&lt;/a&gt; jest naprawdę świetna i wygląda doskonale w małych jak i dużych rozmiarach:&lt;br&gt;
&lt;img loading=&#34;lazy&#34; src=&#34;https://cynar.ski/inconsolata.png&#34;&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>To co widzisz w swoim ulubionym edytorze jest ważne i to nie tylko dlatego, że ma działać, ale też dlatego żeby &ldquo;łagodziło oko&rdquo;. Nuda jest straszna to prawda, dlatego zmieniłem sobie font&rsquo;y w TextMate na
<a href="http://www.levien.com/type/myfonts/inconsolata.html">Inconsolata</a> jest naprawdę świetna i wygląda doskonale w małych jak i dużych rozmiarach:<br>
<img loading="lazy" src="/inconsolata.png"></p>
]]></content:encoded>
    </item>
    <item>
      <title>ctags i TextMate</title>
      <link>https://cynar.ski/2009/07/15/ctags-i-textmate/</link>
      <pubDate>Wed, 15 Jul 2009 06:58:16 +0000</pubDate>
      <guid>https://cynar.ski/2009/07/15/ctags-i-textmate/</guid>
      <description>&lt;p&gt;Dostałem dość spory kawałek kodu do analizy, jestem leniwy, a jakoże kiedyś (jeszcze za czasów korzystania głównie i przede wszystkich z &lt;strong&gt;vim&lt;/strong&gt;) klikałem &lt;strong&gt;ctags&lt;/strong&gt;
stwierdziłem, że teraz mi to będzie potrzebne i to baardzo. google w dłoń i rezultat:&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://github.com/sbenhaim/tm-ctags-tmbundle/tree/master&#34;&gt;http://github.com/sbenhaim/tm-ctags-tmbundle/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Działa świetnie (no prawie idealnie) - parę małych zmian i będzie git (he he he jak sama nazwa wskazuje git-hub :P )&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Dostałem dość spory kawałek kodu do analizy, jestem leniwy, a jakoże kiedyś (jeszcze za czasów korzystania głównie i przede wszystkich z <strong>vim</strong>) klikałem <strong>ctags</strong>
stwierdziłem, że teraz mi to będzie potrzebne i to baardzo. google w dłoń i rezultat:</p>
<p><a href="http://github.com/sbenhaim/tm-ctags-tmbundle/tree/master">http://github.com/sbenhaim/tm-ctags-tmbundle/</a></p>
<p>Działa świetnie (no prawie idealnie) - parę małych zmian i będzie git (he he he jak sama nazwa wskazuje git-hub :P )</p>
]]></content:encoded>
    </item>
    <item>
      <title>Java, GUI  i thread’s</title>
      <link>https://cynar.ski/2009/06/29/java-gui-i-threads/</link>
      <pubDate>Mon, 29 Jun 2009 01:29:58 +0000</pubDate>
      <guid>https://cynar.ski/2009/06/29/java-gui-i-threads/</guid>
      <description>&lt;p&gt;Klasycznie tworząc aplikacje GUI musimy mieć na uwadze jej wielowątkowątkowość. W &lt;strong&gt;ActionListener&lt;/strong&gt; implementować prywatne klasy runnable, thread etc.. metoda sprawdzona i działająca jednak w Java 6 mamy coś nowego, co pozwala na szybkie &amp;ldquo;oblikanie&amp;rdquo; wątków. Mowa tutaj o &lt;strong&gt;SwingWorker&lt;/strong&gt;, świetna funkcjonalność - zajmuje się pbsługą wątków za nas, np:&lt;/p&gt;
&lt;p&gt;Przykład &lt;strong&gt;ActionPerformed&lt;/strong&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;private void jButton1ActionPerformed(java.awt.event.ActionEvent evt)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	if(praca != null &amp;amp;&amp;amp; !praca.isDone()) return;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	praca  = new pracuje();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	praca.execute();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Implementacja klasy &lt;strong&gt;pracuje&lt;/strong&gt;:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Klasycznie tworząc aplikacje GUI musimy mieć na uwadze jej wielowątkowątkowość. W <strong>ActionListener</strong> implementować prywatne klasy runnable, thread etc.. metoda sprawdzona i działająca jednak w Java 6 mamy coś nowego, co pozwala na szybkie &ldquo;oblikanie&rdquo; wątków. Mowa tutaj o <strong>SwingWorker</strong>, świetna funkcjonalność - zajmuje się pbsługą wątków za nas, np:</p>
<p>Przykład <strong>ActionPerformed</strong>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>private void jButton1ActionPerformed(java.awt.event.ActionEvent evt)
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>	if(praca != null &amp;&amp; !praca.isDone()) return;
</span></span><span style="display:flex;"><span>	praca  = new pracuje();
</span></span><span style="display:flex;"><span>	praca.execute();
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>Implementacja klasy <strong>pracuje</strong>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-gdscript3" data-lang="gdscript3"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>private <span style="color:#66d9ef">class</span> pracuje <span style="color:#66d9ef">extends</span> SwingWorker
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>	<span style="color:#960050;background-color:#1e0010">@</span>Override
</span></span><span style="display:flex;"><span>	public Integer doInBackground()
</span></span><span style="display:flex;"><span>	{
</span></span><span style="display:flex;"><span>		<span style="color:#f92672">//</span>Robie duzo obliczen
</span></span><span style="display:flex;"><span>		wynik <span style="color:#f92672">=</span> jakiesobliczenia();
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">return</span> wynik;
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	<span style="color:#960050;background-color:#1e0010">@</span>Override
</span></span><span style="display:flex;"><span>	protected void done()
</span></span><span style="display:flex;"><span>	{
</span></span><span style="display:flex;"><span>		System<span style="color:#f92672">.</span>out<span style="color:#f92672">.</span>println(<span style="color:#e6db74">&#34;done&#34;</span>);
</span></span><span style="display:flex;"><span>		jLabel5<span style="color:#f92672">.</span>setText( <span style="color:#e6db74">&#34;Zrobione&#34;</span> );
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>Czyś nie przyjemnie ?
Mnie się bardzo ta metoda podoba.</p>
]]></content:encoded>
    </item>
    <item>
      <title>JavaFX – jeszcze trochę i będzie efektywniej.</title>
      <link>https://cynar.ski/2009/06/28/javafx-jeszcze-troche-i-bedzie-efektywniej/</link>
      <pubDate>Sun, 28 Jun 2009 17:27:02 +0000</pubDate>
      <guid>https://cynar.ski/2009/06/28/javafx-jeszcze-troche-i-bedzie-efektywniej/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://javafx.com&#34;&gt;JavaFX&lt;/a&gt; daje bardzo duże możliwości budowania RIA, szybko i stosunkowo łatwo, a po zobaczeni efektów:&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://blip.tv/file/get/Joshmarinacci-JavaFXParticleORama273.flv&#34;&gt;&lt;img alt=&#34;Video thumbnail. Click to play&#34; loading=&#34;lazy&#34; src=&#34;http://blip.tv/file/get/Joshmarinacci-JavaFXParticleORama273.flv.jpg&#34;&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href=&#34;http://blip.tv/file/get/Joshmarinacci-JavaFXParticleORama273.flv&#34;&gt;Click To Play&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;czekam na kod ;)&lt;/p&gt;
&lt;p&gt;Enjoy.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="http://javafx.com">JavaFX</a> daje bardzo duże możliwości budowania RIA, szybko i stosunkowo łatwo, a po zobaczeni efektów:</p>
<p><a href="http://blip.tv/file/get/Joshmarinacci-JavaFXParticleORama273.flv"><img alt="Video thumbnail. Click to play" loading="lazy" src="http://blip.tv/file/get/Joshmarinacci-JavaFXParticleORama273.flv.jpg"></a><br>
<a href="http://blip.tv/file/get/Joshmarinacci-JavaFXParticleORama273.flv">Click To Play</a></p>
<p>czekam na kod ;)</p>
<p>Enjoy.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Nokia i Apple ;)</title>
      <link>https://cynar.ski/2009/06/15/nokia-i-apple/</link>
      <pubDate>Mon, 15 Jun 2009 12:26:47 +0000</pubDate>
      <guid>https://cynar.ski/2009/06/15/nokia-i-apple/</guid>
      <description>&lt;p&gt;Cyb0org&amp;rsquo;owa komórka, moja myszka, wynik jak poniżej:&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://vimeo.com/5164222&#34;&gt;Nokia communicator + Mighty Mouse BT = quake fuun ;)&lt;/a&gt; from &lt;a href=&#34;http://vimeo.com/user1905947&#34;&gt;Aleksander Cynarski&lt;/a&gt; on &lt;a href=&#34;http://vimeo.com&#34;&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Cyb0org&rsquo;owa komórka, moja myszka, wynik jak poniżej:</p>
<p><a href="http://vimeo.com/5164222">Nokia communicator + Mighty Mouse BT = quake fuun ;)</a> from <a href="http://vimeo.com/user1905947">Aleksander Cynarski</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Pomysły i rozmyślenia.</title>
      <link>https://cynar.ski/2009/06/15/pomysly-i-rozmyslenia/</link>
      <pubDate>Mon, 15 Jun 2009 10:55:48 +0000</pubDate>
      <guid>https://cynar.ski/2009/06/15/pomysly-i-rozmyslenia/</guid>
      <description>&lt;p&gt;Poniedziałek po dłuższym weekendzie to dobry moment na pewne rozmyślenia. Aktualnie panoszy się wszędzie widmo potencjalnego kryzysu, swoją drogą patrząc na często absurdalne założenia unijnych projektów zastanawiam się czy aby na pewno coś takiego jak kryzys jest, a jeżeli tak to jaki. Niektóre projektuy zakładają ot np. wydawanie na potrzeby biurowe (mały sprzęt biurowy typu: długopisy, kartki, ołówki; bez tzw. ciężkiego sprzętu, czyli FAX, telefon, komputer etc&amp;hellip;) miesięcznie 16 tyś. złotych - ja się pytam po co, dlaczego i czy to jest w ogóle możliwe wydać na długopisy dla powiedzmy 25 osób 16 tys. PLN miesięcznie (zaznaczam miesięcznie.).&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Poniedziałek po dłuższym weekendzie to dobry moment na pewne rozmyślenia. Aktualnie panoszy się wszędzie widmo potencjalnego kryzysu, swoją drogą patrząc na często absurdalne założenia unijnych projektów zastanawiam się czy aby na pewno coś takiego jak kryzys jest, a jeżeli tak to jaki. Niektóre projektuy zakładają ot np. wydawanie na potrzeby biurowe (mały sprzęt biurowy typu: długopisy, kartki, ołówki; bez tzw. ciężkiego sprzętu, czyli FAX, telefon, komputer etc&hellip;) miesięcznie 16 tyś. złotych - ja się pytam po co, dlaczego i czy to jest w ogóle możliwe wydać na długopisy dla powiedzmy 25 osób 16 tys. PLN miesięcznie (zaznaczam miesięcznie.).</p>
<p>Kolejne w naszym kraju absudry to np.</p>
<blockquote>
<p>Samorządy lokalne odgrywają zasadniczą rolę w rozpowszechnianiu infrastruktury światłowodowej – twierdzi <strong>Gabrielle Gauthey</strong>, wiceprezes firmy Alcatel Lucent</p></blockquote>
<p>Zgodzę się, w innych krajach unijnych może i tak - ale w Polsce, ciężko to widzę. Może za wyjątkiem miast i dużych gmin, ale tam gdzie aż się o taką infrastrukturę prosi to nie ma nic. Providerom nie opłaca się inwestować w podobne tematy - sam pracuję w takiej firmie i wcale się nie dziwię, że nie inwestują - bo po co ? Przychód jest znikoumy, koszty duże. Pamiętam, jak parę miesięcy temu rozmawailem ze znajomym na temat tworzenia sieci szkieletowych w małych gminach - to się da zrobić i to całkiem prosto, pomysł jest <strong>szukamy wykonawcy</strong> ;)</p>
<p>Ciekawą wzmianką, która napawa optymizmem:</p>
<blockquote>
<p>Gabrielle Gauthey zwraca też uwagę, że w 27 krajach Unii Europejskiej aż 75 proc. aktywnych światłowodowych sieci dostępowych to tzw. sieci miejskie, które są administrowane przez przedsiębiorstwa komunalne lub inne przedsiębiorstwa użyteczności publicznej.</p></blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>A teraz coś z zupełnie innej beczki...</title>
      <link>https://cynar.ski/2009/06/08/a-teraz-cos-z-zupelnie-innej-beczki/</link>
      <pubDate>Mon, 08 Jun 2009 04:01:18 +0000</pubDate>
      <guid>https://cynar.ski/2009/06/08/a-teraz-cos-z-zupelnie-innej-beczki/</guid>
      <description>&lt;p&gt;Runaway &amp;hellip;. runaway &amp;hellip; !!!&lt;/p&gt;
&lt;p&gt;No ale do rzeczy:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Runaway &hellip;. runaway &hellip; !!!</p>
<p>No ale do rzeczy:</p>
]]></content:encoded>
    </item>
    <item>
      <title>SVN hooks i autoupdate’y</title>
      <link>https://cynar.ski/2009/06/03/svn-hooks-i-autoupdatey/</link>
      <pubDate>Wed, 03 Jun 2009 19:31:48 +0000</pubDate>
      <guid>https://cynar.ski/2009/06/03/svn-hooks-i-autoupdatey/</guid>
      <description>&lt;p&gt;Czsami problemy są nieco ukryte, jednak jak zawsze debug daje radę. Hooks w svn&amp;rsquo;ie to rzecz bardzo przydatna, jeszcze bardziej jak chcemy po każdym commit&amp;rsquo;owaniu otrzymać działającą kopię na stronie testowej, klasyczne wykorzystanie cron&amp;rsquo;a jest często uciążliwe, a hook post-commit wykonywany jest jak sama nazwa wskazuje po commit&amp;rsquo;owaniu, autoupdate można zrobic tak:&lt;/p&gt;
&lt;p&gt;{REPO}/hooks/post-commit (skrypt z bitem wykonywalności)&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#!/bin/sh
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;/usr/local/bin/update
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sam skrypt update w moim przypadku to C:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;int main(void)&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#a6e22e&#34;&gt;execl&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/path/to/svn&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;svn&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;update&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;--username&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;USERNAME&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;--password&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;PASSWORD&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;--no-auth-cache&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/path/to/svnsite/&amp;#34;&lt;/span&gt;,  (&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;) NULL);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt;(EXIT_FAILURE);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gcc update.c -o update
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cp update /usr/local/bin
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;chmod +s /usr/local/bin/update
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;W całym kodzie ważny jest &amp;ndash;no-auth-cache, ponieważ bez tego system będzie prosić o dopowiedź w jaki sposób przchowywać hasła w pliku cache, jakoże wykonywane jest to przez użytkownika apache (w moim przypadku), który nie posiada własnego shella i home (oczywiste), pytanie takie jest powodem nie działania skryptu.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Czsami problemy są nieco ukryte, jednak jak zawsze debug daje radę. Hooks w svn&rsquo;ie to rzecz bardzo przydatna, jeszcze bardziej jak chcemy po każdym commit&rsquo;owaniu otrzymać działającą kopię na stronie testowej, klasyczne wykorzystanie cron&rsquo;a jest często uciążliwe, a hook post-commit wykonywany jest jak sama nazwa wskazuje po commit&rsquo;owaniu, autoupdate można zrobic tak:</p>
<p>{REPO}/hooks/post-commit (skrypt z bitem wykonywalności)</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e">#!/bin/sh
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>/usr/local/bin/update
</span></span></code></pre></div><p>Sam skrypt update w moim przypadku to C:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-c" data-lang="c"><span style="display:flex;"><span><span style="color:#75715e">#include</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">#include</span><span style="color:#75715e">
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">#include</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">int main(void)</span><span style="color:#75715e">
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>{
</span></span><span style="display:flex;"><span>	<span style="color:#a6e22e">execl</span>(<span style="color:#e6db74">&#34;/path/to/svn&#34;</span>, <span style="color:#e6db74">&#34;svn&#34;</span>, <span style="color:#e6db74">&#34;update&#34;</span>, <span style="color:#e6db74">&#34;--username&#34;</span>,
</span></span><span style="display:flex;"><span>	<span style="color:#e6db74">&#34;USERNAME&#34;</span>, <span style="color:#e6db74">&#34;--password&#34;</span>, <span style="color:#e6db74">&#34;PASSWORD&#34;</span>, <span style="color:#e6db74">&#34;--no-auth-cache&#34;</span>,
</span></span><span style="display:flex;"><span>	<span style="color:#e6db74">&#34;/path/to/svnsite/&#34;</span>,  (<span style="color:#66d9ef">const</span> <span style="color:#66d9ef">char</span> <span style="color:#f92672">*</span>) NULL);
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">return</span>(EXIT_FAILURE);
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>gcc update.c -o update
</span></span><span style="display:flex;"><span>cp update /usr/local/bin
</span></span><span style="display:flex;"><span>chmod +s /usr/local/bin/update
</span></span></code></pre></div><p>W całym kodzie ważny jest &ndash;no-auth-cache, ponieważ bez tego system będzie prosić o dopowiedź w jaki sposób przchowywać hasła w pliku cache, jakoże wykonywane jest to przez użytkownika apache (w moim przypadku), który nie posiada własnego shella i home (oczywiste), pytanie takie jest powodem nie działania skryptu.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Wieedziałem….</title>
      <link>https://cynar.ski/2009/04/21/wieedzialem/</link>
      <pubDate>Tue, 21 Apr 2009 19:16:45 +0000</pubDate>
      <guid>https://cynar.ski/2009/04/21/wieedzialem/</guid>
      <description>&lt;p&gt;Jak to ktoś kiedyś powiedział: znajdziesz kobietę swoich marzeń to zapomnij o innych, oczywiście marzeniach. No może nie tak brutalnie, ale szczypta prawdy w tym jest. Pragmatyzm w życiu codziennym jest często, a raczej nie żadko bardzo użyteczny, jednak przeglądając czasami feed&amp;rsquo;y ot tak z nudów potrafię ów pragmatyzm szczerze znienawidzić.&lt;/p&gt;
&lt;p&gt;Od pewnego czasu z mą małżonką (najczęściej w żartach) kłócę się o &amp;ldquo;najważniejsze zakupy&amp;rdquo;, od paru miesięcy dla mnie najważniejszym zakupem był przenośny EEG - mam strasznego wkręta na stworzenie prostego interfejsu opartego o EEG problem to nie jest bo rozwiązania takie są, jednak mnie bardzo zależało na jakiejś bardziej &amp;ldquo;nie życiowej&amp;rdquo; implementacji. Powszechnie znany już chyba wygaszacz Soundstream (OSX) wykorzystujący mikrofon do wizualizacji dżwięku. Bardzo ładnie napisane, a przede wszystkim ładnie wygląda - ot taki ficzer. O ile było by przyjemne dla oka i ucha stworzenie prostego interfejsu bazującego na EEG do wizualizacji - substancje psychoaktywne i można spokojnie podpinać to do iChat&amp;rsquo;a, tak aby rozmówca widział dokładnie co się z naszym mózgu dzieje - może w danym momencie da nam święty spokój.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Jak to ktoś kiedyś powiedział: znajdziesz kobietę swoich marzeń to zapomnij o innych, oczywiście marzeniach. No może nie tak brutalnie, ale szczypta prawdy w tym jest. Pragmatyzm w życiu codziennym jest często, a raczej nie żadko bardzo użyteczny, jednak przeglądając czasami feed&rsquo;y ot tak z nudów potrafię ów pragmatyzm szczerze znienawidzić.</p>
<p>Od pewnego czasu z mą małżonką (najczęściej w żartach) kłócę się o &ldquo;najważniejsze zakupy&rdquo;, od paru miesięcy dla mnie najważniejszym zakupem był przenośny EEG - mam strasznego wkręta na stworzenie prostego interfejsu opartego o EEG problem to nie jest bo rozwiązania takie są, jednak mnie bardzo zależało na jakiejś bardziej &ldquo;nie życiowej&rdquo; implementacji. Powszechnie znany już chyba wygaszacz Soundstream (OSX) wykorzystujący mikrofon do wizualizacji dżwięku. Bardzo ładnie napisane, a przede wszystkim ładnie wygląda - ot taki ficzer. O ile było by przyjemne dla oka i ucha stworzenie prostego interfejsu bazującego na EEG do wizualizacji - substancje psychoaktywne i można spokojnie podpinać to do iChat&rsquo;a, tak aby rozmówca widział dokładnie co się z naszym mózgu dzieje - może w danym momencie da nam święty spokój.</p>
<p>Wracając do pragmatyzmu, bardzo miłym aspektem dzisiejszej podróży pociągiem do Krakowa okazał się news na <a href="http://hackaday.com/2009/04/20/twitter-brain-interface/">Hack a day</a> o właśnie takim interfejsie do Twitter&rsquo;a - bu szkoda, że na takie rzeczy mają czas tylko na uczelniach technicznych. Swoją drogą ciekawy jestem co by powiedział mój czif, że na pytanie &ldquo;co aktualnie wykonuję&rdquo;, odpowiedział bym: &ldquo;wlaśnie podłączam sobie encefalogram do parsowania danych.&rdquo;</p>
<p>A może to jest myśl ? :)</p>
]]></content:encoded>
    </item>
    <item>
      <title>Dynamic Asterisk na PostgreSQL (cz.1)</title>
      <link>https://cynar.ski/2009/03/07/dynamic-asterisk-na-postgresql-cz1/</link>
      <pubDate>Sat, 07 Mar 2009 17:04:10 +0000</pubDate>
      <guid>https://cynar.ski/2009/03/07/dynamic-asterisk-na-postgresql-cz1/</guid>
      <description>&lt;p&gt;Ostatnio a dokładniej w piątek postawiono mi zadanie stworzenie zupełnie dynamicznego rozwiązania dla platformy Asterisk
(osobiście polecam ostatnią stabilną wersję o numerku 1.4.23.1).
Stworzenie konfiguracji dla składownia CDR&amp;rsquo;ów w psql nie jest problemem, jednak kiedy chcemy mieć klientów sip, iax &amp;ldquo;tworzyć&amp;rdquo; zupełnie dynamicznie bez
potrzeby restartowania serwera lub modułów jest to deko problem.
Łącząc Asteriska z bazą danym mamy aktualnie parę możliwych sterowników baz danych:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ODBCM&lt;/li&gt;
&lt;li&gt;mysql&lt;/li&gt;
&lt;li&gt;pgsql&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Chcąc mieć bazę jak najbardziej jak to nazywam &amp;ldquo;strict&amp;rdquo; oraz mieć ją zupełnie za darmo stwierdziłem, że idealny będzie &lt;strong&gt;pgsql&lt;/strong&gt;. Wstępna konfiguracja danych
potrzebnych do połączenia z bazą danych znajdują się w /etc/asterisk/res_pgsql.conf:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Ostatnio a dokładniej w piątek postawiono mi zadanie stworzenie zupełnie dynamicznego rozwiązania dla platformy Asterisk
(osobiście polecam ostatnią stabilną wersję o numerku 1.4.23.1).
Stworzenie konfiguracji dla składownia CDR&rsquo;ów w psql nie jest problemem, jednak kiedy chcemy mieć klientów sip, iax &ldquo;tworzyć&rdquo; zupełnie dynamicznie bez
potrzeby restartowania serwera lub modułów jest to deko problem.
Łącząc Asteriska z bazą danym mamy aktualnie parę możliwych sterowników baz danych:</p>
<ul>
<li>ODBCM</li>
<li>mysql</li>
<li>pgsql</li>
</ul>
<p>Chcąc mieć bazę jak najbardziej jak to nazywam &ldquo;strict&rdquo; oraz mieć ją zupełnie za darmo stwierdziłem, że idealny będzie <strong>pgsql</strong>. Wstępna konfiguracja danych
potrzebnych do połączenia z bazą danych znajdują się w /etc/asterisk/res_pgsql.conf:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	[general]
</span></span><span style="display:flex;"><span>	dbhost=127.0.0.1
</span></span><span style="display:flex;"><span>	dbport=5432
</span></span><span style="display:flex;"><span>	dbname=asterisk
</span></span><span style="display:flex;"><span>	dbuser=asterisk
</span></span><span style="display:flex;"><span>	dbpass=asterisk
</span></span></code></pre></div><p>Poniżej pełny scheme wraz z założeniem odpowiedniej bazy i roli w psql:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-gdscript3" data-lang="gdscript3"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	<span style="color:#f92672">--</span> ASTERISK psql Scheme by paramah
</span></span><span style="display:flex;"><span>	CREATE DATABASE  asterisk;
</span></span><span style="display:flex;"><span>	CREATE USER asterisk WITH PASSWORD <span style="color:#e6db74">&#39;asterisk&#39;</span>;
</span></span><span style="display:flex;"><span>	GRANT ALL PRIVILEGES ON DATABASE asterisk to asterisk;
</span></span><span style="display:flex;"><span>	<span style="color:#f92672">--</span> Asterisk SIP <span style="color:#f92672">and</span> IAX accounts
</span></span><span style="display:flex;"><span>	CREATE TABLE t_conf_sip (
</span></span><span style="display:flex;"><span>	  id serial NOT NULL,
</span></span><span style="display:flex;"><span>	  name character varying(<span style="color:#ae81ff">80</span>) DEFAULT <span style="color:#e6db74">&#39;&#39;</span> NOT NULL,
</span></span><span style="display:flex;"><span>	  accountcode character varying(<span style="color:#ae81ff">20</span>),
</span></span><span style="display:flex;"><span>	  amaflags character varying(<span style="color:#ae81ff">7</span>),
</span></span><span style="display:flex;"><span>	  callgroup character varying(<span style="color:#ae81ff">10</span>),
</span></span><span style="display:flex;"><span>	  callerid character varying(<span style="color:#ae81ff">80</span>),
</span></span><span style="display:flex;"><span>	  canreinvite character varying(<span style="color:#ae81ff">3</span>) DEFAULT <span style="color:#e6db74">&#39;yes&#39;</span>,
</span></span><span style="display:flex;"><span>	  context character varying(<span style="color:#ae81ff">80</span>) DEFAULT <span style="color:#e6db74">&#39;default&#39;</span>,
</span></span><span style="display:flex;"><span>	  defaultip character varying(<span style="color:#ae81ff">15</span>),
</span></span><span style="display:flex;"><span>	  dtmfmode character varying(<span style="color:#ae81ff">7</span>),
</span></span><span style="display:flex;"><span>	  fromuser character varying(<span style="color:#ae81ff">80</span>),
</span></span><span style="display:flex;"><span>	  fromdomain character varying(<span style="color:#ae81ff">80</span>),
</span></span><span style="display:flex;"><span>	  host character varying(<span style="color:#ae81ff">31</span>) DEFAULT <span style="color:#e6db74">&#39;&#39;</span> NOT NULL,
</span></span><span style="display:flex;"><span>	  insecure character varying(<span style="color:#ae81ff">4</span>),
</span></span><span style="display:flex;"><span>	  <span style="color:#e6db74">&#34;language&#34;</span> character varying(<span style="color:#ae81ff">2</span>),
</span></span><span style="display:flex;"><span>	  mailbox character varying(<span style="color:#ae81ff">50</span>),
</span></span><span style="display:flex;"><span>	  md5secret character varying(<span style="color:#ae81ff">80</span>),
</span></span><span style="display:flex;"><span>	  nat character varying(<span style="color:#ae81ff">5</span>) DEFAULT <span style="color:#e6db74">&#39;yes&#39;</span> NOT NULL,
</span></span><span style="display:flex;"><span>	  permit character varying(<span style="color:#ae81ff">95</span>),
</span></span><span style="display:flex;"><span>	  deny character varying(<span style="color:#ae81ff">95</span>),
</span></span><span style="display:flex;"><span>	  mask character varying(<span style="color:#ae81ff">95</span>),
</span></span><span style="display:flex;"><span>	  pickupgroup character varying(<span style="color:#ae81ff">10</span>),
</span></span><span style="display:flex;"><span>	  port character varying(<span style="color:#ae81ff">5</span>) DEFAULT <span style="color:#e6db74">&#39;&#39;</span> NOT NULL,
</span></span><span style="display:flex;"><span>	  qualify character varying(<span style="color:#ae81ff">3</span>),
</span></span><span style="display:flex;"><span>	  restrictcid character varying(<span style="color:#ae81ff">1</span>),
</span></span><span style="display:flex;"><span>	  rtptimeout character varying(<span style="color:#ae81ff">3</span>),
</span></span><span style="display:flex;"><span>	  rtpholdtimeout character varying(<span style="color:#ae81ff">3</span>),
</span></span><span style="display:flex;"><span>	  secret character varying(<span style="color:#ae81ff">80</span>),
</span></span><span style="display:flex;"><span>	  <span style="color:#e6db74">&#34;type&#34;</span> character varying DEFAULT <span style="color:#e6db74">&#39;friend&#39;</span> NOT NULL,
</span></span><span style="display:flex;"><span>	  username character varying(<span style="color:#ae81ff">80</span>) DEFAULT <span style="color:#e6db74">&#39;&#39;</span> NOT NULL,
</span></span><span style="display:flex;"><span>	  disallow character varying(<span style="color:#ae81ff">100</span>) DEFAULT <span style="color:#e6db74">&#39;all&#39;</span>,
</span></span><span style="display:flex;"><span>	  allow character varying(<span style="color:#ae81ff">100</span>) DEFAULT <span style="color:#e6db74">&#39;g729;ilbc;gsm;ulaw;alaw&#39;</span>,
</span></span><span style="display:flex;"><span>	  musiconhold character varying(<span style="color:#ae81ff">100</span>),
</span></span><span style="display:flex;"><span>	  regseconds bigint DEFAULT <span style="color:#ae81ff">0</span>::bigint NOT NULL,
</span></span><span style="display:flex;"><span>	  ipaddr character varying(<span style="color:#ae81ff">15</span>) DEFAULT <span style="color:#e6db74">&#39;&#39;</span> NOT NULL,
</span></span><span style="display:flex;"><span>	  regexten character varying(<span style="color:#ae81ff">80</span>) DEFAULT <span style="color:#e6db74">&#39;&#39;</span> NOT NULL,
</span></span><span style="display:flex;"><span>	  cancallforward character varying(<span style="color:#ae81ff">3</span>) DEFAULT <span style="color:#e6db74">&#39;yes&#39;</span>
</span></span><span style="display:flex;"><span>	);
</span></span><span style="display:flex;"><span>	ALTER TABLE t_conf_sip OWNER TO asterisk;
</span></span><span style="display:flex;"><span>	<span style="color:#f92672">--</span> Asterisk Extensions
</span></span><span style="display:flex;"><span>	CREATE TABLE t_conf_extensions (
</span></span><span style="display:flex;"><span>	 id serial NOT NULL,
</span></span><span style="display:flex;"><span>	 context character varying(<span style="color:#ae81ff">20</span>) DEFAULT <span style="color:#e6db74">&#39;&#39;</span> NOT NULL,
</span></span><span style="display:flex;"><span>	 exten character varying(<span style="color:#ae81ff">20</span>) DEFAULT <span style="color:#e6db74">&#39;&#39;</span> NOT NULL,
</span></span><span style="display:flex;"><span>	 priority smallint DEFAULT <span style="color:#ae81ff">0</span> NOT NULL,
</span></span><span style="display:flex;"><span>	 app character varying(<span style="color:#ae81ff">20</span>) DEFAULT <span style="color:#e6db74">&#39;&#39;</span> NOT NULL,
</span></span><span style="display:flex;"><span>	 appdata character varying(<span style="color:#ae81ff">128</span>)
</span></span><span style="display:flex;"><span>	);
</span></span><span style="display:flex;"><span>	ALTER TABLE t_conf_extensions OWNER TO asterisk;
</span></span><span style="display:flex;"><span>	<span style="color:#f92672">--</span> Asterisk VoiceMail users
</span></span><span style="display:flex;"><span>	CREATE TABLE t_voicemail_users (
</span></span><span style="display:flex;"><span>	  id serial NOT NULL,
</span></span><span style="display:flex;"><span>	  customer_id bigint DEFAULT (<span style="color:#ae81ff">0</span>)::bigint NOT NULL,
</span></span><span style="display:flex;"><span>	  context character varying(<span style="color:#ae81ff">50</span>) DEFAULT <span style="color:#e6db74">&#39;&#39;</span> NOT NULL,
</span></span><span style="display:flex;"><span>	  mailbox bigint DEFAULT (<span style="color:#ae81ff">0</span>)::bigint NOT NULL,
</span></span><span style="display:flex;"><span>	  <span style="color:#e6db74">&#34;password&#34;</span> character varying(<span style="color:#ae81ff">4</span>) DEFAULT <span style="color:#e6db74">&#39;0&#39;</span> NOT NULL,
</span></span><span style="display:flex;"><span>	  fullname character varying(<span style="color:#ae81ff">50</span>) DEFAULT <span style="color:#e6db74">&#39;&#39;</span> NOT NULL,
</span></span><span style="display:flex;"><span>	  email character varying(<span style="color:#ae81ff">50</span>) DEFAULT <span style="color:#e6db74">&#39;&#39;</span> NOT NULL,
</span></span><span style="display:flex;"><span>	  pager character varying(<span style="color:#ae81ff">50</span>) DEFAULT <span style="color:#e6db74">&#39;&#39;</span> NOT NULL,
</span></span><span style="display:flex;"><span>	  stamp timestamp(<span style="color:#ae81ff">6</span>) without time zone NOT NULL
</span></span><span style="display:flex;"><span>	);
</span></span><span style="display:flex;"><span>	ALTER TABLE t_voicemail_users OWNER TO asterisk;
</span></span><span style="display:flex;"><span>	<span style="color:#f92672">--</span> Asterisk queue
</span></span><span style="display:flex;"><span>	CREATE TABLE t_queue (
</span></span><span style="display:flex;"><span>	  name varchar(<span style="color:#ae81ff">128</span>),
</span></span><span style="display:flex;"><span>	  musiconhold varchar(<span style="color:#ae81ff">128</span>),
</span></span><span style="display:flex;"><span>	  announce varchar(<span style="color:#ae81ff">128</span>),
</span></span><span style="display:flex;"><span>	  context varchar(<span style="color:#ae81ff">128</span>),
</span></span><span style="display:flex;"><span>	  timeout int8,
</span></span><span style="display:flex;"><span>	  monitor_join <span style="color:#a6e22e">bool</span>,
</span></span><span style="display:flex;"><span>	  monitor_format varchar(<span style="color:#ae81ff">128</span>),
</span></span><span style="display:flex;"><span>	  queue_youarenext varchar(<span style="color:#ae81ff">128</span>),
</span></span><span style="display:flex;"><span>	  queue_thereare varchar(<span style="color:#ae81ff">128</span>),
</span></span><span style="display:flex;"><span>	  queue_callswaiting varchar(<span style="color:#ae81ff">128</span>),
</span></span><span style="display:flex;"><span>	  queue_holdtime varchar(<span style="color:#ae81ff">128</span>),
</span></span><span style="display:flex;"><span>	  queue_minutes varchar(<span style="color:#ae81ff">128</span>),
</span></span><span style="display:flex;"><span>	  queue_seconds varchar(<span style="color:#ae81ff">128</span>),
</span></span><span style="display:flex;"><span>	  queue_lessthan varchar(<span style="color:#ae81ff">128</span>),
</span></span><span style="display:flex;"><span>	  queue_thankyou varchar(<span style="color:#ae81ff">128</span>),
</span></span><span style="display:flex;"><span>	  queue_reporthold varchar(<span style="color:#ae81ff">128</span>),
</span></span><span style="display:flex;"><span>	  announce_frequency int8,
</span></span><span style="display:flex;"><span>	  announce_round_seconds int8,
</span></span><span style="display:flex;"><span>	  announce_holdtime varchar(<span style="color:#ae81ff">128</span>),
</span></span><span style="display:flex;"><span>	  retry int8,
</span></span><span style="display:flex;"><span>	  wrapuptime int8,
</span></span><span style="display:flex;"><span>	  maxlen int8,
</span></span><span style="display:flex;"><span>	  servicelevel int8,
</span></span><span style="display:flex;"><span>	  strategy varchar(<span style="color:#ae81ff">128</span>),
</span></span><span style="display:flex;"><span>	  joinempty varchar(<span style="color:#ae81ff">128</span>),
</span></span><span style="display:flex;"><span>	  leavewhenempty varchar(<span style="color:#ae81ff">128</span>),
</span></span><span style="display:flex;"><span>	  eventmemberstatus <span style="color:#a6e22e">bool</span>,
</span></span><span style="display:flex;"><span>	  eventwhencalled <span style="color:#a6e22e">bool</span>,
</span></span><span style="display:flex;"><span>	  reportholdtime <span style="color:#a6e22e">bool</span>,
</span></span><span style="display:flex;"><span>	  memberdelay int8,
</span></span><span style="display:flex;"><span>	  weight int8,
</span></span><span style="display:flex;"><span>	  timeoutrestart <span style="color:#a6e22e">bool</span>,
</span></span><span style="display:flex;"><span>	  PRIMARY KEY (name)
</span></span><span style="display:flex;"><span>	) WITHOUT OIDS;
</span></span><span style="display:flex;"><span>	ALTER TABLE t_queue OWNER TO asterisk;
</span></span><span style="display:flex;"><span>	<span style="color:#f92672">--</span> Asterisk queue member
</span></span><span style="display:flex;"><span>	CREATE TABLE t_queue_member
</span></span><span style="display:flex;"><span>	(
</span></span><span style="display:flex;"><span>	  queue_name varchar(<span style="color:#ae81ff">128</span>),
</span></span><span style="display:flex;"><span>	  interface varchar(<span style="color:#ae81ff">128</span>),
</span></span><span style="display:flex;"><span>	  penalty int8,
</span></span><span style="display:flex;"><span>	  PRIMARY KEY (queue_name, interface)
</span></span><span style="display:flex;"><span>	) WITHOUT OIDS;
</span></span><span style="display:flex;"><span>	ALTER TABLE t_queue_member OWNER TO asterisk;
</span></span><span style="display:flex;"><span>	<span style="color:#f92672">--</span> Asterisk CDR
</span></span><span style="display:flex;"><span>	CREATE TABLE t_cdr (
</span></span><span style="display:flex;"><span>	  calldate timestamp with time zone DEFAULT now() NOT NULL,
</span></span><span style="display:flex;"><span>	  clid character varying(<span style="color:#ae81ff">80</span>) DEFAULT <span style="color:#e6db74">&#39;&#39;</span> NOT NULL,
</span></span><span style="display:flex;"><span>	  src character varying(<span style="color:#ae81ff">80</span>) DEFAULT <span style="color:#e6db74">&#39;&#39;</span> NOT NULL,
</span></span><span style="display:flex;"><span>	  dst character varying(<span style="color:#ae81ff">80</span>) DEFAULT <span style="color:#e6db74">&#39;&#39;</span> NOT NULL,
</span></span><span style="display:flex;"><span>	  dcontext character varying(<span style="color:#ae81ff">80</span>) DEFAULT <span style="color:#e6db74">&#39;&#39;</span> NOT NULL,
</span></span><span style="display:flex;"><span>	  channel character varying(<span style="color:#ae81ff">80</span>) DEFAULT <span style="color:#e6db74">&#39;&#39;</span> NOT NULL,
</span></span><span style="display:flex;"><span>	  dstchannel character varying(<span style="color:#ae81ff">80</span>) DEFAULT <span style="color:#e6db74">&#39;&#39;</span> NOT NULL,
</span></span><span style="display:flex;"><span>	  lastapp character varying(<span style="color:#ae81ff">80</span>) DEFAULT <span style="color:#e6db74">&#39;&#39;</span> NOT NULL,
</span></span><span style="display:flex;"><span>	  lastdata character varying(<span style="color:#ae81ff">80</span>) DEFAULT <span style="color:#e6db74">&#39;&#39;</span> NOT NULL,
</span></span><span style="display:flex;"><span>	  duration bigint DEFAULT <span style="color:#ae81ff">0</span>::bigint NOT NULL,
</span></span><span style="display:flex;"><span>	  billsec bigint DEFAULT <span style="color:#ae81ff">0</span>::bigint NOT NULL,
</span></span><span style="display:flex;"><span>	  disposition character varying(<span style="color:#ae81ff">45</span>) DEFAULT <span style="color:#e6db74">&#39;&#39;</span> NOT NULL,
</span></span><span style="display:flex;"><span>	  amaflags bigint DEFAULT <span style="color:#ae81ff">0</span>::bigint NOT NULL,
</span></span><span style="display:flex;"><span>	  accountcode character varying(<span style="color:#ae81ff">20</span>) DEFAULT <span style="color:#e6db74">&#39;&#39;</span> NOT NULL,
</span></span><span style="display:flex;"><span>	  uniqueid character varying(<span style="color:#ae81ff">32</span>) DEFAULT <span style="color:#e6db74">&#39;&#39;</span> NOT NULL,
</span></span><span style="display:flex;"><span>	  userfield character varying(<span style="color:#ae81ff">255</span>) DEFAULT <span style="color:#e6db74">&#39;&#39;</span> NOT NULL
</span></span><span style="display:flex;"><span>	);
</span></span><span style="display:flex;"><span>	ALTER TABLE t_cdr OWNER TO asterisk;
</span></span><span style="display:flex;"><span>	GRANT ALL ON TABLE t_cdr TO asterisk;
</span></span><span style="display:flex;"><span>	GRANT ALL ON TABLE t_conf_extensions TO asterisk;
</span></span><span style="display:flex;"><span>	GRANT ALL ON TABLE t_conf_sip TO asterisk;
</span></span><span style="display:flex;"><span>	GRANT ALL ON TABLE t_voicemail_users TO asterisk;
</span></span><span style="display:flex;"><span>	GRANT ALL ON TABLE t_queue_member TO asterisk;
</span></span><span style="display:flex;"><span>	GRANT ALL ON TABLE t_queue TO asterisk;
</span></span></code></pre></div><p>Tutaj wszystko jest jasne, ale jak zrobić aby poszczególne funkcjonalności były przechowywane w bazie i realizowane były w trybie RealTime - nic prostrzego:</p>
<p>W pierwszej kolejności edytujemy sobie pliczek /etc/aterisk/extconfig.conf:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	[settings]
</span></span><span style="display:flex;"><span>	extensions =&gt; pgsql,asterisk,extensions_conf
</span></span><span style="display:flex;"><span>	ext_test =&gt; pgsql,asterisk,t_conf_extensions
</span></span><span style="display:flex;"><span>	;Reszta
</span></span><span style="display:flex;"><span>	sipusers   =&gt; pgsql,asterisk,t_conf_sip
</span></span><span style="display:flex;"><span>	sippeers   =&gt; pgsql,asterisk,t_conf_sip
</span></span><span style="display:flex;"><span>	iaxusers   =&gt; pgsql,asterisk,t_conf_sip
</span></span><span style="display:flex;"><span>	iaxpeers   =&gt; pgsql,asterisk,t_conf_sip
</span></span><span style="display:flex;"><span>	voicemail  =&gt; pgsql,asterisk,t_voicemail_users
</span></span><span style="display:flex;"><span>	queues     =&gt; pgsql,asterisk,t_queue
</span></span><span style="display:flex;"><span>	queue_members =&gt; pgsql,asterisk,t_queue_member
</span></span><span style="display:flex;"><span>	;meetme =&gt; mysql,conferences
</span></span></code></pre></div><p>Dla pewności proponuję wyzerować /etc/asterisk/sip.conf</p>
<p>Dla testu można dodać użytkownika:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	INSERT INTO t_conf_sip (name, nat, secret, host, context) VALUES (&#39;666&#39;, &#39;yes&#39;, &#39;dupa&#39;, &#39;dynamic&#39;, &#39;default&#39;);
</span></span></code></pre></div><p>Teraz zajmiemy się dialplanem i ogólnie extensions.conf:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-gdscript3" data-lang="gdscript3"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	[general]
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">static</span><span style="color:#f92672">=</span>no
</span></span><span style="display:flex;"><span>	writeprotect<span style="color:#f92672">=</span>no
</span></span><span style="display:flex;"><span>	clearglobalvars<span style="color:#f92672">=</span>no
</span></span><span style="display:flex;"><span>	[globals]
</span></span><span style="display:flex;"><span>	CONSOLE<span style="color:#f92672">=</span>Console<span style="color:#f92672">/</span>dsp
</span></span><span style="display:flex;"><span>	IAXINFO<span style="color:#f92672">=</span>guest
</span></span><span style="display:flex;"><span>	TRUNK<span style="color:#f92672">=</span>Zap<span style="color:#f92672">/</span>G2
</span></span><span style="display:flex;"><span>	TRUNKMSD<span style="color:#f92672">=</span><span style="color:#ae81ff">1</span>
</span></span><span style="display:flex;"><span>	[default]
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">switch</span> <span style="color:#f92672">=&gt;</span> Realtime<span style="color:#f92672">/</span>default<span style="color:#960050;background-color:#1e0010">@</span>extensions
</span></span><span style="display:flex;"><span>	[test]
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">switch</span> <span style="color:#f92672">=&gt;</span> Realtime<span style="color:#f92672">/</span>default<span style="color:#960050;background-color:#1e0010">@</span>ext_test
</span></span><span style="display:flex;"><span>	[dynivr]
</span></span><span style="display:flex;"><span>	exten <span style="color:#f92672">=&gt;</span> test,<span style="color:#ae81ff">1</span>,AGI(agi:<span style="color:#f92672">//</span>localhost)
</span></span></code></pre></div><p>Prosty extension:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	INSERT INTO t_conf_extensions VALUES (2,&#39;default&#39;, 700, 1, &#39;Playback&#39; ,&#39;demo-echotest&#39;);
</span></span></code></pre></div><p>I to wszystko :)</p>
<p>Smacznego, bo Asterisk teraz jest w 100% dynamiczny, oczwiście można jeszcze dodać do tego queue, voicemail etc&hellip;</p>
<p>Pisane w sumie na wykładach z zupełnie czegoś innego, jak znajdę znowu chwilkę czasu na następnych wykładach dopieszczę.</p>
<p>Dla ułatwienia i dla leniwych umieszczam SQL: <a href="/dasterisk/asterisk.sql">/dasterisk/asterisk.sql</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Rozwiązywanie problemów.</title>
      <link>https://cynar.ski/2009/03/03/rozwiazywanie-problemow/</link>
      <pubDate>Tue, 03 Mar 2009 01:17:14 +0000</pubDate>
      <guid>https://cynar.ski/2009/03/03/rozwiazywanie-problemow/</guid>
      <description>&lt;p&gt;W normalnym trybie pracy, rozwiązywanie problemów w kategorii &amp;ldquo;zarabiania&amp;rdquo;, czyli w jako takiej formie wykonywania zadań zlecanych, jest po prostu niczym innym jak zrobieniem czegoś po prostu. Otrzymując zadanie, wykonujemy je bez myślenia, jak, po co, dlaczego(&amp;hellip;) zwyczajnie tworzymy rozwiązanie. W nienormalnym trybie pracy traktujemy zadanie jako wyzwanie intelektualne i jako takie staramy się dojść do rozwiązania najbardziej optymalnego jakie tylko może istnieć.&lt;/p&gt;
&lt;p&gt;Proste porównywanie danych można wykonać na wiele sposobów, możemy zastosować metody leksykalne w celu parowania danych, możemy stosować proste i oczywiste relacje na danych, możemy w miarę oczywisty sposób stworzyć proste rekurencje w algorytmach klasyfikujących tak aby zwyczajnie zawężały swoje przestrzenie, mogą również z pomocą przyjść nam metody adaptacyjne. Wtedy praca okazuje się nawet ciekawa i w pewnym momencie potrafi w dość oczywisty sposób skierować na &lt;a href=&#34;http://archive.ics.uci.edu/ml/&#34;&gt;http://archive.ics.uci.edu/ml/&lt;/a&gt;, swoją drogą bardzo ciekawą lekturę, dlatego pracę czasami można zwyczajnie polubić.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>W normalnym trybie pracy, rozwiązywanie problemów w kategorii &ldquo;zarabiania&rdquo;, czyli w jako takiej formie wykonywania zadań zlecanych, jest po prostu niczym innym jak zrobieniem czegoś po prostu. Otrzymując zadanie, wykonujemy je bez myślenia, jak, po co, dlaczego(&hellip;) zwyczajnie tworzymy rozwiązanie. W nienormalnym trybie pracy traktujemy zadanie jako wyzwanie intelektualne i jako takie staramy się dojść do rozwiązania najbardziej optymalnego jakie tylko może istnieć.</p>
<p>Proste porównywanie danych można wykonać na wiele sposobów, możemy zastosować metody leksykalne w celu parowania danych, możemy stosować proste i oczywiste relacje na danych, możemy w miarę oczywisty sposób stworzyć proste rekurencje w algorytmach klasyfikujących tak aby zwyczajnie zawężały swoje przestrzenie, mogą również z pomocą przyjść nam metody adaptacyjne. Wtedy praca okazuje się nawet ciekawa i w pewnym momencie potrafi w dość oczywisty sposób skierować na <a href="http://archive.ics.uci.edu/ml/">http://archive.ics.uci.edu/ml/</a>, swoją drogą bardzo ciekawą lekturę, dlatego pracę czasami można zwyczajnie polubić.</p>
<p>Ciekawe jak wiele osób zastanawiających się nad doskonałym IVR&rsquo;em pomyślało o selekcji osoby dzwoniącej za pomocą cech głosu, hmm.. jak zawsze statystykę pozwala nam określić google</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>Wyniki <span style="color:#ae81ff">1</span> - <span style="color:#ae81ff">10</span> spośród około 773,000,000 dla zapytania sex.
</span></span><span style="display:flex;"><span>Wyniki <span style="color:#ae81ff">1</span> - <span style="color:#ae81ff">10</span> spośród około 3,430 dla zapytania genetic algorithm in IVR.
</span></span></code></pre></div><p>i tak sobie myślę, że mnie to właściwie nie dziwi.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Balsamizacja.</title>
      <link>https://cynar.ski/2009/03/01/balsamizacja/</link>
      <pubDate>Sun, 01 Mar 2009 04:16:05 +0000</pubDate>
      <guid>https://cynar.ski/2009/03/01/balsamizacja/</guid>
      <description>&lt;p&gt;Przed momentem, w natłoku sobotnich zadań oglądając jakiś tam muzyczny kanał ujrzeliśmy z Mirelą teledysk zespołu Kombii, na co moja żona stwierdziła:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;To jest dopiero cud współczesnej balsamizacji, bo mówi się że Rosjanie tacy wielcy bo mają Lenina. Wielkie mi co, on tylko leży, a u nas zespół Kombii nie dość że się nie rozkłada w trakcie teledysku, to się jeszcze rusza.&lt;/p&gt;&lt;/blockquote&gt;</description>
      <content:encoded><![CDATA[<p>Przed momentem, w natłoku sobotnich zadań oglądając jakiś tam muzyczny kanał ujrzeliśmy z Mirelą teledysk zespołu Kombii, na co moja żona stwierdziła:</p>
<blockquote>
<p>To jest dopiero cud współczesnej balsamizacji, bo mówi się że Rosjanie tacy wielcy bo mają Lenina. Wielkie mi co, on tylko leży, a u nas zespół Kombii nie dość że się nie rozkłada w trakcie teledysku, to się jeszcze rusza.</p></blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>Simple Power over Ethernet</title>
      <link>https://cynar.ski/2009/01/30/simple-power-over-ethernet/</link>
      <pubDate>Fri, 30 Jan 2009 15:30:20 +0000</pubDate>
      <guid>https://cynar.ski/2009/01/30/simple-power-over-ethernet/</guid>
      <description>&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;http://englishrussia.com/images/daily_jan_23/6.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;Źródło: http://englishrussia.com/?p=642&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><img loading="lazy" src="http://englishrussia.com/images/daily_jan_23/6.jpg"></p>
<p>Źródło: http://englishrussia.com/?p=642</p>
]]></content:encoded>
    </item>
    <item>
      <title>9  – Robot killer</title>
      <link>https://cynar.ski/2009/01/27/9-robot-killer/</link>
      <pubDate>Tue, 27 Jan 2009 10:43:48 +0000</pubDate>
      <guid>https://cynar.ski/2009/01/27/9-robot-killer/</guid>
      <description></description>
    </item>
    <item>
      <title>Techniczni solipsyści</title>
      <link>https://cynar.ski/2009/01/27/techniczni-solipsysci/</link>
      <pubDate>Tue, 27 Jan 2009 10:22:52 +0000</pubDate>
      <guid>https://cynar.ski/2009/01/27/techniczni-solipsysci/</guid>
      <description>&lt;p&gt;Siedzisz sobie w pracy, która tak naprawdę ani cię już nie bawi, ani nie uczy. Otwierasz przeglądarkę, czytnik RSS, program pocztowy i zasysasz. Wlatuje w Ciebie masa informacji, czytasz zajmuje to około 10% dniówki. W tak zwanym międzyczasie ktoś zadzwoni, czegoś zechce lub po prostu powie Ci, że jest ładny lub nieładny dzień. Ty siedzisz dlalej i zastanawiasz się co tak naprawdę tu robisz. Po pierwsze zdajesz sobie sprawę, że jeszcze rok czy półtorej temu to co robisz było dla Ciebie dość ciekawe i sprawiało, że po pracy czułeś się całkiem fajnie.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Siedzisz sobie w pracy, która tak naprawdę ani cię już nie bawi, ani nie uczy. Otwierasz przeglądarkę, czytnik RSS, program pocztowy i zasysasz. Wlatuje w Ciebie masa informacji, czytasz zajmuje to około 10% dniówki. W tak zwanym międzyczasie ktoś zadzwoni, czegoś zechce lub po prostu powie Ci, że jest ładny lub nieładny dzień. Ty siedzisz dlalej i zastanawiasz się co tak naprawdę tu robisz. Po pierwsze zdajesz sobie sprawę, że jeszcze rok czy półtorej temu to co robisz było dla Ciebie dość ciekawe i sprawiało, że po pracy czułeś się całkiem fajnie.</p>
<p>Zastanawiasz się dlaczego tak jest, ostatnimi czasy większość informacji dostarczana jest pod nos, ludzie popadają w &ldquo;tryndy&rdquo; bo tak jest fajnie, dobre technologie to takie które posiadają tutoriale, dużo screencastów oraz przynajmniej jeden portal &ldquo;społecznościowy&rdquo; dla wymiany doświadczeń. Widać, że ludziom się nie chce i nie jest to jednak &ldquo;zasada 10k godzin&rdquo; to jest zwyczajne lenistwo. Po co grzebać w poszukiwaniu fukncji, której działanie jest dla nas nie do końca poprawne - poczekajmy może będzie lepiej. Hakowanie możliwości aplikacji stało się czymś abstrakcyjnym, dla większości &ldquo;młodego pokolenia&rdquo; bezsensem - bo jak nie mam tutoriala znaczy, że soft jest do dupy. Czas jakiś temu zacząłem studiować, ot po prostu, trochę dla papiera, trochę aby uciec. Pod jednym kątem studia są miejscem wymiany doświadczeń, przynajmniej tak mnie uczono na filozofii - spotykasz się z ludźmi o podobnych zainteresowaniach i możesz z nimi wymienić wiedzę i poglądy. Jak się słyszy od osoby, że &ldquo;nie będzie zaglądać do logów, wyłączy albo przeinstaluje&rdquo; - lub też &ldquo;to mnie nie kręci&rdquo; myslę sobie, po co&hellip;</p>
<p>Od dłuższego czasu brakuje mi pożywki intelektualnej w pracy zawodowej, jedyną pożywką dla umysłu jaką ostatnio spożywam są dyskusje z moją małżonką i znajomymi na tematy nie techniczne, filozofia, sztuka - co prawda po dłuższym czasie ostrego sporu, połowa ludzi w gronie przynaje się do solipsyzmu i na tym kończy się płonna wymiana zdań - bo z solipsystą nie można dyskutować :)</p>
<p>Poznawanie nowych rzeczy związanych <em>stricte</em> z pracą jest praktycznie czynnością fizjologiczną - ot po prostu wlatuje lub wylatuje. Myślę nad zmianą zawodu na korzenio-plastykę, bo wszystko co cię otacza to i tak wytwór Twojej wyobraźni.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Jak wylistować sobie miasta u pewnego dużego dostawcy usług internetowych ?</title>
      <link>https://cynar.ski/2009/01/02/jak-wylistowac-sobie-miasta-u-pewnego-duzego-dostawcy-uslug-internetowych/</link>
      <pubDate>Fri, 02 Jan 2009 11:23:06 +0000</pubDate>
      <guid>https://cynar.ski/2009/01/02/jak-wylistowac-sobie-miasta-u-pewnego-duzego-dostawcy-uslug-internetowych/</guid>
      <description>&lt;p&gt;Oczywiście prezentowany sktypt jest banalny, jednak można go sobie ładnie rozbudować, niestety strony znanych mi providerów takich jak UPC i innych podobnoych są bardzo słabo zabezpieczone pod wieloma względami i oto mała prezentacja co można zrobić ze stronami &amp;ldquo;user frendly&amp;rdquo;, których jest coraz więcej.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#!/usr/local/bin/ruby
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;require &amp;#39;rubygems&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;require &amp;#39;curl-multi&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;require &amp;#39;json&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl = Curl::Multi.new
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;towns = Array.new
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;letters = (&amp;#39;a&amp;#39;..&amp;#39;z&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;on_success_town = lambda do |body|
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;puts JSON.parse(body)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;end
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;on_failure = lambda do |ex|
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;puts &amp;#39;Failure.&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;puts ex
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;end
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;letters.each do |letter|
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl.get(&amp;#39;http://strefaklienta.upc.pl/cckservices/rfs/city?q=&amp;#39;+letter+&amp;#39;&amp;amp;limit=999&amp;#39;, on_success_town, on_failure)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl.select([],[]) while curl.size &amp;gt; 0;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;end
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;W wyniku otrzymamy listę miast w zasięku sieci UPC, oczywiście można pójść kawałek dalej i otrzymać listę ulic, a nawet numery bloków dołożyć do tego googlemaps i w parę minut mamy bardzo dokładną mapkę zasięgu sieci UPC, dane na pozór mało istotne, ale jak się tak głębiej zastanowić to mogą się okazać przydatne.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Oczywiście prezentowany sktypt jest banalny, jednak można go sobie ładnie rozbudować, niestety strony znanych mi providerów takich jak UPC i innych podobnoych są bardzo słabo zabezpieczone pod wieloma względami i oto mała prezentacja co można zrobić ze stronami &ldquo;user frendly&rdquo;, których jest coraz więcej.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>#!/usr/local/bin/ruby
</span></span><span style="display:flex;"><span>require &#39;rubygems&#39;
</span></span><span style="display:flex;"><span>require &#39;curl-multi&#39;
</span></span><span style="display:flex;"><span>require &#39;json&#39;
</span></span><span style="display:flex;"><span>curl = Curl::Multi.new
</span></span><span style="display:flex;"><span>towns = Array.new
</span></span><span style="display:flex;"><span>letters = (&#39;a&#39;..&#39;z&#39;)
</span></span><span style="display:flex;"><span>on_success_town = lambda do |body|
</span></span><span style="display:flex;"><span>puts JSON.parse(body)
</span></span><span style="display:flex;"><span>end
</span></span><span style="display:flex;"><span>on_failure = lambda do |ex|
</span></span><span style="display:flex;"><span>puts &#39;Failure.&#39;
</span></span><span style="display:flex;"><span>puts ex
</span></span><span style="display:flex;"><span>end
</span></span><span style="display:flex;"><span>letters.each do |letter|
</span></span><span style="display:flex;"><span>curl.get(&#39;http://strefaklienta.upc.pl/cckservices/rfs/city?q=&#39;+letter+&#39;&amp;limit=999&#39;, on_success_town, on_failure)
</span></span><span style="display:flex;"><span>curl.select([],[]) while curl.size &gt; 0;
</span></span><span style="display:flex;"><span>end
</span></span></code></pre></div><p>W wyniku otrzymamy listę miast w zasięku sieci UPC, oczywiście można pójść kawałek dalej i otrzymać listę ulic, a nawet numery bloków dołożyć do tego googlemaps i w parę minut mamy bardzo dokładną mapkę zasięgu sieci UPC, dane na pozór mało istotne, ale jak się tak głębiej zastanowić to mogą się okazać przydatne.</p>
<p>Kawałek output&rsquo;u z powyższego sktyptu:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	(...)
</span></span><span style="display:flex;"><span>	Bukowno k. Olkusza
</span></span><span style="display:flex;"><span>	Bydgoszcz
</span></span><span style="display:flex;"><span>	Bytom
</span></span><span style="display:flex;"><span>	Chęciny
</span></span><span style="display:flex;"><span>	Chełm
</span></span><span style="display:flex;"><span>	Chorzów
</span></span><span style="display:flex;"><span>	Ciechanów
</span></span><span style="display:flex;"><span>	Czeladź
</span></span><span style="display:flex;"><span>	Czerwionka Leszczyny
</span></span><span style="display:flex;"><span>	Częstochowa
</span></span><span style="display:flex;"><span>	Dąbrowa Górnicza
</span></span><span style="display:flex;"><span>	Dzierżoniów
</span></span><span style="display:flex;"><span>	Gdańsk
</span></span><span style="display:flex;"><span>	Gdynia
</span></span><span style="display:flex;"><span>	Gliwice
</span></span><span style="display:flex;"><span>	(...)
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>Trafne</title>
      <link>https://cynar.ski/2009/01/02/trafne/</link>
      <pubDate>Fri, 02 Jan 2009 09:45:33 +0000</pubDate>
      <guid>https://cynar.ski/2009/01/02/trafne/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;humor&#34; loading=&#34;lazy&#34; src=&#34;http://blogs.warwick.ac.uk/images/darrenjames/2006/10/25/humor00196.jpg&#34;&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><img alt="humor" loading="lazy" src="http://blogs.warwick.ac.uk/images/darrenjames/2006/10/25/humor00196.jpg"></p>
]]></content:encoded>
    </item>
    <item>
      <title>Stare czasy :)</title>
      <link>https://cynar.ski/2009/01/02/stare-czasy/</link>
      <pubDate>Fri, 02 Jan 2009 09:39:08 +0000</pubDate>
      <guid>https://cynar.ski/2009/01/02/stare-czasy/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;Atari&#34; loading=&#34;lazy&#34; src=&#34;http://www.huguesjohnson.com/features/atari_catalog_1981/AtariCatalog1981_22-Back.jpg&#34;&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><img alt="Atari" loading="lazy" src="http://www.huguesjohnson.com/features/atari_catalog_1981/AtariCatalog1981_22-Back.jpg"></p>
]]></content:encoded>
    </item>
    <item>
      <title>Zewnętrzne repozytorium git</title>
      <link>https://cynar.ski/2008/12/27/zewnetrzne-repozytorium-git/</link>
      <pubDate>Sat, 27 Dec 2008 21:22:02 +0000</pubDate>
      <guid>https://cynar.ski/2008/12/27/zewnetrzne-repozytorium-git/</guid>
      <description>&lt;p&gt;Od pewnego czasu zacząłem używać git&amp;rsquo;a do kontrolowania wersji, git wyparł mercurial&amp;rsquo;a. Git okazał się dla mnie bardziej elastycznym systemem zarządzania wersjami, nie wyprze on co prawda na razie subversion&amp;rsquo;a którego używam w bardzo wielu projektach, ale jak na razie dobrze sobie radzi z loklanymi projektami. W szczególności świetnie współgra z ruby on rails, w których robię coraz więcej &amp;ldquo;szybkich&amp;rdquo; projektów.&lt;/p&gt;
&lt;p&gt;Dzisiaj okazało się, że potrzebuję mieć zdalnego dostępu do repo (znowu lenistwo) stwierdziłem, że użyjemy git&amp;rsquo;a. Jak to zrobić ?&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Od pewnego czasu zacząłem używać git&rsquo;a do kontrolowania wersji, git wyparł mercurial&rsquo;a. Git okazał się dla mnie bardziej elastycznym systemem zarządzania wersjami, nie wyprze on co prawda na razie subversion&rsquo;a którego używam w bardzo wielu projektach, ale jak na razie dobrze sobie radzi z loklanymi projektami. W szczególności świetnie współgra z ruby on rails, w których robię coraz więcej &ldquo;szybkich&rdquo; projektów.</p>
<p>Dzisiaj okazało się, że potrzebuję mieć zdalnego dostępu do repo (znowu lenistwo) stwierdziłem, że użyjemy git&rsquo;a. Jak to zrobić ?</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>bash&gt; ssh example.com
</span></span><span style="display:flex;"><span>example:~&gt; mkdir git
</span></span><span style="display:flex;"><span>example:~&gt; cd git
</span></span><span style="display:flex;"><span>example:~/git/&gt; mkdir app.git
</span></span><span style="display:flex;"><span>example:~/git/&gt; cd app.git
</span></span><span style="display:flex;"><span>example:~/git/app.git/&gt; git --bare init
</span></span><span style="display:flex;"><span>example:~/git/app.git/&gt; ls -l
</span></span><span style="display:flex;"><span>total <span style="color:#ae81ff">16</span>
</span></span><span style="display:flex;"><span>-rw-r--r--  <span style="color:#ae81ff">1</span> <span style="color:#ae81ff">1005</span>  <span style="color:#ae81ff">0</span>   <span style="color:#ae81ff">23</span> <span style="color:#ae81ff">27</span> gru 20:10 HEAD
</span></span><span style="display:flex;"><span>drwxr-xr-x  <span style="color:#ae81ff">2</span> <span style="color:#ae81ff">1005</span>  <span style="color:#ae81ff">0</span>  <span style="color:#ae81ff">512</span> <span style="color:#ae81ff">27</span> gru 20:10 branches
</span></span><span style="display:flex;"><span>-rw-r--r--  <span style="color:#ae81ff">1</span> <span style="color:#ae81ff">1005</span>  <span style="color:#ae81ff">0</span>   <span style="color:#ae81ff">66</span> <span style="color:#ae81ff">27</span> gru 20:10 config
</span></span><span style="display:flex;"><span>-rw-r--r--  <span style="color:#ae81ff">1</span> <span style="color:#ae81ff">1005</span>  <span style="color:#ae81ff">0</span>   <span style="color:#ae81ff">58</span> <span style="color:#ae81ff">27</span> gru 20:10 description
</span></span><span style="display:flex;"><span>drwxr-xr-x  <span style="color:#ae81ff">2</span> <span style="color:#ae81ff">1005</span>  <span style="color:#ae81ff">0</span>  <span style="color:#ae81ff">512</span> <span style="color:#ae81ff">27</span> gru 20:10 hooks
</span></span><span style="display:flex;"><span>drwxr-xr-x  <span style="color:#ae81ff">2</span> <span style="color:#ae81ff">1005</span>  <span style="color:#ae81ff">0</span>  <span style="color:#ae81ff">512</span> <span style="color:#ae81ff">27</span> gru 20:10 info
</span></span><span style="display:flex;"><span>drwxr-xr-x  <span style="color:#ae81ff">4</span> <span style="color:#ae81ff">1005</span>  <span style="color:#ae81ff">0</span>  <span style="color:#ae81ff">512</span> <span style="color:#ae81ff">27</span> gru 20:10 objects
</span></span><span style="display:flex;"><span>drwxr-xr-x  <span style="color:#ae81ff">4</span> <span style="color:#ae81ff">1005</span>  <span style="color:#ae81ff">0</span>  <span style="color:#ae81ff">512</span> <span style="color:#ae81ff">27</span> gru 20:10 refs
</span></span><span style="display:flex;"><span>example:~/git/app.git/&gt; exit
</span></span><span style="display:flex;"><span>bash&gt; cd ~/MyProj/app
</span></span><span style="display:flex;"><span>bash&gt; git remote add origin ssh://example.com/~/git/app.git
</span></span><span style="display:flex;"><span>bash&gt; git push origin master
</span></span><span style="display:flex;"><span>bash&gt; cat .git/config
</span></span><span style="display:flex;"><span><span style="color:#f92672">[</span>core<span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>        repositoryformatversion <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>
</span></span><span style="display:flex;"><span>        filemode <span style="color:#f92672">=</span> true
</span></span><span style="display:flex;"><span>        bare <span style="color:#f92672">=</span> false
</span></span><span style="display:flex;"><span>        logallrefupdates <span style="color:#f92672">=</span> true
</span></span><span style="display:flex;"><span>        ignorecase <span style="color:#f92672">=</span> true
</span></span><span style="display:flex;"><span><span style="color:#f92672">[</span>remote <span style="color:#e6db74">&#34;origin&#34;</span><span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>        url <span style="color:#f92672">=</span> ssh://example.com/~/git/app.git
</span></span><span style="display:flex;"><span>        fetch <span style="color:#f92672">=</span> +refs/heads/*:refs/remotes/origin/*
</span></span><span style="display:flex;"><span><span style="color:#f92672">[</span>branch <span style="color:#e6db74">&#34;master&#34;</span><span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>        remote <span style="color:#f92672">=</span> origin
</span></span><span style="display:flex;"><span>        merge <span style="color:#f92672">=</span> refs/heads/master
</span></span></code></pre></div><p>Ot i wszystko, po ssh szybkie repo.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Passenger – apache mod for ruby</title>
      <link>https://cynar.ski/2008/12/24/passenger-apache-mod-for-ruby/</link>
      <pubDate>Wed, 24 Dec 2008 14:21:52 +0000</pubDate>
      <guid>https://cynar.ski/2008/12/24/passenger-apache-mod-for-ruby/</guid>
      <description>&lt;p&gt;Strona domowa &lt;a href=&#34;http://www.modrails.com/&#34;&gt;passenger&amp;rsquo;a&lt;/a&gt;.
Instalacja modułu do apache nigdy nie była tak prosta:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gem install passenger
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;passenger-install-apache2-module
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Skrypt sam wyszuka źródła apache, skomplikuje sobie modulik i poprosi o wklejenie kodu do konfoguracji apache:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;LoadModule passenger_module /usr/local/lib/ruby/gems/1.8/gems/passenger-2.0.6/ext/apache2/mod_passenger.so
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;PassengerRoot /usr/local/lib/ruby/gems/1.8/gems/passenger-2.0.6
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;PassengerRuby /usr/local/bin/ruby18
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Działa i śmiga.&lt;/p&gt;
&lt;p&gt;Dla debianowców (Ubuntu):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;deb http://apt.brightbox.net hardy main
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
      <content:encoded><![CDATA[<p>Strona domowa <a href="http://www.modrails.com/">passenger&rsquo;a</a>.
Instalacja modułu do apache nigdy nie była tak prosta:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>gem install passenger
</span></span><span style="display:flex;"><span>passenger-install-apache2-module
</span></span></code></pre></div><p>Skrypt sam wyszuka źródła apache, skomplikuje sobie modulik i poprosi o wklejenie kodu do konfoguracji apache:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>LoadModule passenger_module /usr/local/lib/ruby/gems/1.8/gems/passenger-2.0.6/ext/apache2/mod_passenger.so
</span></span><span style="display:flex;"><span>PassengerRoot /usr/local/lib/ruby/gems/1.8/gems/passenger-2.0.6
</span></span><span style="display:flex;"><span>PassengerRuby /usr/local/bin/ruby18
</span></span></code></pre></div><p>Działa i śmiga.</p>
<p>Dla debianowców (Ubuntu):</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>deb http://apt.brightbox.net hardy main
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>Merb &#43; Ruby on Rails = Rails 3</title>
      <link>https://cynar.ski/2008/12/23/merb-ruby-on-rails-rails-3/</link>
      <pubDate>Tue, 23 Dec 2008 23:41:23 +0000</pubDate>
      <guid>https://cynar.ski/2008/12/23/merb-ruby-on-rails-rails-3/</guid>
      <description>&lt;p&gt;Dzisiaj ukazała się informacja o połączeniu tych dwóch doskonałych frameworków. Czyli już niebawem trzeba będzie upgradeować wszystkie projekty i siągnąć mah 3 :) Co nam da rails 3 ? Otóż pozwoli na pisanie &amp;ldquo;lżejszych&amp;rdquo; aplikacji, kod zostanie zoptymalizowany, railsy będą bardziej otwarte na alternatwne rozwiązania niż dotychczas. No i co chyba najlepsze dla developerów pojawi się oficjalne API do testowania i tworzenia pluginów dla railsów, co niechybnie ucieszy wszystkich tych, którzy musieli robić szybkie &amp;ldquo;haki&amp;rdquo; do swoich aplikacji po upgradzie core&amp;rsquo;a railsów. Dużo pozytywnych informacji i to tuż przed świętami. Wszystkich zainteresowanych odsyłam do źródeł:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Dzisiaj ukazała się informacja o połączeniu tych dwóch doskonałych frameworków. Czyli już niebawem trzeba będzie upgradeować wszystkie projekty i siągnąć mah 3 :) Co nam da rails 3 ? Otóż pozwoli na pisanie &ldquo;lżejszych&rdquo; aplikacji, kod zostanie zoptymalizowany, railsy będą bardziej otwarte na alternatwne rozwiązania niż dotychczas. No i co chyba najlepsze dla developerów pojawi się oficjalne API do testowania i tworzenia pluginów dla railsów, co niechybnie ucieszy wszystkich tych, którzy musieli robić szybkie &ldquo;haki&rdquo; do swoich aplikacji po upgradzie core&rsquo;a railsów. Dużo pozytywnych informacji i to tuż przed świętami. Wszystkich zainteresowanych odsyłam do źródeł:</p>
<ul>
<li><a href="http://weblog.rubyonrails.org/2008/12/23/merb-gets-merged-into-rails-3">Ruby On Rails - Weblog</a></li>
<li><a href="http://merbivore.com/">Merb Homepage</a></li>
<li><a href="http://rubyonrails.org/merb">Ruby on Rail - Merb</a></li>
</ul>
<p>Swoją drogą informacja daje jeszcze jeden pozytywny aspekt, że dwa zupełnie odrębne projekty, których użytkownicy toczyli mniejsze lub większe boje, zaś twórcy mieli deko inne podejście do rozwiązywanych problemów mogły się połączyć. Ciekawe czy ten krok poniesie za sobą inne ciekawe fuzje.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Motorola Cable Modems</title>
      <link>https://cynar.ski/2008/12/16/motorola-cable-modems/</link>
      <pubDate>Tue, 16 Dec 2008 21:49:46 +0000</pubDate>
      <guid>https://cynar.ski/2008/12/16/motorola-cable-modems/</guid>
      <description>&lt;p&gt;Dla pamięci, Piotrze przydać się może :D :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cmConfigFreq1. 1.3.6.1.4.1.1166.1.19.3.1.1.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cmConfigFreq2. 1.3.6.1.4.1.1166.1.19.3.1.2.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cmConfigFreq3. 1.3.6.1.4.1.1166.1.19.3.1.3.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cmQam16Preamble. 1.3.6.1.4.1.1166.1.19.3.1.7.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cmFreqPlanType. 1.3.6.1.4.1.1166.1.19.3.1.8.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cmUpstreamChannelId 1.3.6.1.4.1.1166.1.19.3.1.11.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cmCarrierFrequencyOffset 1.3.6.1.4.1.1166.1.19.3.1.12.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cmBabbleControl 1.3.6.1.4.1.1166.1.19.3.1.13.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cmSnmpHFCPort 1.3.6.1.4.1.1166.1.19.3.1.14.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cmSnmpHFCTrapPort 1.3.6.1.4.1.1166.1.19.3.1.15.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cmSnmpHFCSetPort 1.3.6.1.4.1.1166.1.19.3.1.16.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cmSnmpDisplayHtml 1.3.6.1.4.1.1166.1.19.3.1.17.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cmResetToDefaults 1.3.6.1.4.1.1166.1.19.3.1.18.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cmStandbyMode  1.3.6.1.4.1.1166.1.19.3.1.19.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cmCustomerSpecificScanPlan 1.3.6.1.4.1.1166.1.19.3.1.28.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sb2100FactoryVersion  1.3.6.1.4.1.1166.1.19.4.1.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sb2100FactoryDbgBootEnable 1.3.6.1.4.1.1166.1.19.4.2.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sb2100FactoryEnetMacAddr 1.3.6.1.4.1.1166.1.19.4.3.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sb2100FactoryHfcMacAddr 1.3.6.1.4.1.1166.1.19.4.4.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sb2100FactoryEnetAddrByte 1.3.6.1.4.1.1166.1.19.4.5.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sb2100FactorySerialNumber 1.3.6.1.4.1.1166.1.19.4.6.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sb2100FactoryRSAPublicKey 1.3.6.1.4.1.1166.1.19.4.7.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sb2100FactoryRSAPrivateKey 1.3.6.1.4.1.1166.1.19.4.8.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sb2100FactoryClearFreq 1.3.6.1.4.1.1166.1.19.4.9.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sb2100FactoryClearFreq 1.3.6.1.4.1.1166.1.19.4.10.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sb2100FactoryClearFreq 1.3.6.1.4.1.1166.1.19.4.11.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sb2100FactorySetReset  1.3.6.1.4.1.1166.1.19.4.12.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sb2100FactoryClrConfigAndLog 1.3.6.1.4.1.1166.1.19.4.13.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sb2100FactoryPingIpAddr   1.3.6.1.4.1.1166.1.19.4.14.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sb2100FactoryPingNumPkts    1.3.6.1.4.1.1166.1.19.4.15.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sb2100FactoryPingNow 1.3.6.1.4.1.1166.1.19.4.16.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sb2100FactoryPingCount 1.3.6.1.4.1.1166.1.19.4.17.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sb2100FactoryTMStatus 1.3.6.1.4.1.1166.1.19.4.18.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sb2100FactoryTMMessage 1.3.6.1.4.1.1166.1.19.4.19.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sb2100FactoryTMBaudRate 1.3.6.1.4.1.1166.1.19.4.20.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sb2100FactoryTMOpen 1.3.6.1.4.1.1166.1.19.4.21.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sb2100FactoryTMWriteString 1.3.6.1.4.1.1166.1.19.4.22.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sb2100FactoryTMWrite 1.3.6.1.4.1.1166.1.19.4.23.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sb2100FactoryTMReadTimeOut 1.3.6.1.4.1.1166.1.19.4.24.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sb2100FactoryTMReadString 1.3.6.1.4.1.1166.1.19.4.25.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sb2100FactoryTMRead  1.3.6.1.4.1.1166.1.19.4.26.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sb2100FactoryTMClose 1.3.6.1.4.1.1166.1.19.4.27.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sb2100FactoryCliFlag 1.3.6.1.4.1.1166.1.19.4.28.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sb2100FactoryDisableMib 1.3.6.1.4.1.1166.1.19.4.29.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sb2100FactoryUpstreamPowerCalibration 1.3.6.1.4.1.1166.1.19.4.30.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sb2100FactorySuspendStartup 1.3.6.1.4.1.1166.1.19.4.31.1.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sb2100FactoryDownstreamFrequency 1.3.6.1.4.1.1166.1.19.4.31.2.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sb2100FactoryDownstreamAcquire 1.3.6.1.4.1.1166.1.19.4.31.3.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sb2100FactoryTunerAGC 1.3.6.1.4.1.1166.1.19.4.31.4.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sb2100FactoryIfAGC 1.3.6.1.4.1.1166.1.19.4.31.5.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sb2100FactoryQamLock 1.3.6.1.4.1.1166.1.19.4.31.6.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sb2100FactoryBCMCommandType 1.3.6.1.4.1.1166.1.19.4.32.1.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sb2100FactoryBCMAddressOrOpcode 1.3.6.1.4.1.1166.1.19.4.32.2.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sb2100FactoryBCMByteCount 1.3.6.1.4.1.1166.1.19.4.32.3.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sb2100FactoryBCMData 1.3.6.1.4.1.1166.1.19.4.32.4.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sb2100FactoryBCMActivate 1.3.6.1.4.1.1166.1.19.4.32.5.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sb2100FactoryBigRSAPublicKey 1.3.6.1.4.1.1166.1.19.4.50.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sb2100FactoryBigRSAPrivateKey 1.3.6.1.4.1.1166.1.19.4.51.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sb2100FactoryCMCertificate  1.3.6.1.4.1.1166.1.19.4.52.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sb2100FactoryManCertificate  1.3.6.1.4.1.1166.1.19.4.53.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sb2100FactoryRootPublicKey 1.3.6.1.4.1.1166.1.19.4.54.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sb2100FactoryCodeSigningTime 1.3.6.1.4.1.1166.1.19.4.55.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sb2100FactoryCVCValidityStartTime  1.3.6.1.4.1.1166.1.19.4.56.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sb2100FactoryMSOId 1.3.6.1.4.1.1166.1.19.4.57.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sb2100FactoryCMManufacturerName 1.3.6.1.4.1.1166.1.19.4.58.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sb2100FactoryHtmlReadOnly 1.3.6.1.4.1.1166.1.19.4.59.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sb2100FactoryCmUsbMacAddr 1.3.6.1.4.1.1166.1.19.4.60.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sb2100FactoryCpeUsbMacAddr 1.3.6.1.4.1.1166.1.19.4.61.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sb2100FactoryCmAuxMacAddr 1.3.6.1.4.1.1166.1.19.4.62.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sb2100FactoryTunerId  1.3.6.1.4.1.1166.1.19.4.63.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sb2100FactoryHwRevision 1.3.6.1.4.1.1166.1.19.4.64.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sb2100FactoryUsAmpId  1.3.6.1.4.1.1166.1.19.4.65.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cm.6.1.1.2.0  MaxDown 1.3.6.1.4.1.1166.1.19.6.1.1.2.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cm.6.1.1.3.0  MaxUp 1.3.6.1.4.1.1166.1.19.6.1.1.3.0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
      <content:encoded><![CDATA[<p>Dla pamięci, Piotrze przydać się może :D :</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>cmConfigFreq1. 1.3.6.1.4.1.1166.1.19.3.1.1.0
</span></span><span style="display:flex;"><span>cmConfigFreq2. 1.3.6.1.4.1.1166.1.19.3.1.2.0
</span></span><span style="display:flex;"><span>cmConfigFreq3. 1.3.6.1.4.1.1166.1.19.3.1.3.0
</span></span><span style="display:flex;"><span>cmQam16Preamble. 1.3.6.1.4.1.1166.1.19.3.1.7.0
</span></span><span style="display:flex;"><span>cmFreqPlanType. 1.3.6.1.4.1.1166.1.19.3.1.8.0
</span></span><span style="display:flex;"><span>cmUpstreamChannelId 1.3.6.1.4.1.1166.1.19.3.1.11.0
</span></span><span style="display:flex;"><span>cmCarrierFrequencyOffset 1.3.6.1.4.1.1166.1.19.3.1.12.0
</span></span><span style="display:flex;"><span>cmBabbleControl 1.3.6.1.4.1.1166.1.19.3.1.13.0
</span></span><span style="display:flex;"><span>cmSnmpHFCPort 1.3.6.1.4.1.1166.1.19.3.1.14.0
</span></span><span style="display:flex;"><span>cmSnmpHFCTrapPort 1.3.6.1.4.1.1166.1.19.3.1.15.0
</span></span><span style="display:flex;"><span>cmSnmpHFCSetPort 1.3.6.1.4.1.1166.1.19.3.1.16.0
</span></span><span style="display:flex;"><span>cmSnmpDisplayHtml 1.3.6.1.4.1.1166.1.19.3.1.17.0
</span></span><span style="display:flex;"><span>cmResetToDefaults 1.3.6.1.4.1.1166.1.19.3.1.18.0
</span></span><span style="display:flex;"><span>cmStandbyMode  1.3.6.1.4.1.1166.1.19.3.1.19.0
</span></span><span style="display:flex;"><span>cmCustomerSpecificScanPlan 1.3.6.1.4.1.1166.1.19.3.1.28.0
</span></span><span style="display:flex;"><span>sb2100FactoryVersion  1.3.6.1.4.1.1166.1.19.4.1.0
</span></span><span style="display:flex;"><span>sb2100FactoryDbgBootEnable 1.3.6.1.4.1.1166.1.19.4.2.0
</span></span><span style="display:flex;"><span>sb2100FactoryEnetMacAddr 1.3.6.1.4.1.1166.1.19.4.3.0
</span></span><span style="display:flex;"><span>sb2100FactoryHfcMacAddr 1.3.6.1.4.1.1166.1.19.4.4.0
</span></span><span style="display:flex;"><span>sb2100FactoryEnetAddrByte 1.3.6.1.4.1.1166.1.19.4.5.0
</span></span><span style="display:flex;"><span>sb2100FactorySerialNumber 1.3.6.1.4.1.1166.1.19.4.6.0
</span></span><span style="display:flex;"><span>sb2100FactoryRSAPublicKey 1.3.6.1.4.1.1166.1.19.4.7.0
</span></span><span style="display:flex;"><span>sb2100FactoryRSAPrivateKey 1.3.6.1.4.1.1166.1.19.4.8.0
</span></span><span style="display:flex;"><span>sb2100FactoryClearFreq 1.3.6.1.4.1.1166.1.19.4.9.0
</span></span><span style="display:flex;"><span>sb2100FactoryClearFreq 1.3.6.1.4.1.1166.1.19.4.10.0
</span></span><span style="display:flex;"><span>sb2100FactoryClearFreq 1.3.6.1.4.1.1166.1.19.4.11.0
</span></span><span style="display:flex;"><span>sb2100FactorySetReset  1.3.6.1.4.1.1166.1.19.4.12.0
</span></span><span style="display:flex;"><span>sb2100FactoryClrConfigAndLog 1.3.6.1.4.1.1166.1.19.4.13.0
</span></span><span style="display:flex;"><span>sb2100FactoryPingIpAddr   1.3.6.1.4.1.1166.1.19.4.14.0
</span></span><span style="display:flex;"><span>sb2100FactoryPingNumPkts    1.3.6.1.4.1.1166.1.19.4.15.0
</span></span><span style="display:flex;"><span>sb2100FactoryPingNow 1.3.6.1.4.1.1166.1.19.4.16.0
</span></span><span style="display:flex;"><span>sb2100FactoryPingCount 1.3.6.1.4.1.1166.1.19.4.17.0
</span></span><span style="display:flex;"><span>sb2100FactoryTMStatus 1.3.6.1.4.1.1166.1.19.4.18.0
</span></span><span style="display:flex;"><span>sb2100FactoryTMMessage 1.3.6.1.4.1.1166.1.19.4.19.0
</span></span><span style="display:flex;"><span>sb2100FactoryTMBaudRate 1.3.6.1.4.1.1166.1.19.4.20.0
</span></span><span style="display:flex;"><span>sb2100FactoryTMOpen 1.3.6.1.4.1.1166.1.19.4.21.0
</span></span><span style="display:flex;"><span>sb2100FactoryTMWriteString 1.3.6.1.4.1.1166.1.19.4.22.0
</span></span><span style="display:flex;"><span>sb2100FactoryTMWrite 1.3.6.1.4.1.1166.1.19.4.23.0
</span></span><span style="display:flex;"><span>sb2100FactoryTMReadTimeOut 1.3.6.1.4.1.1166.1.19.4.24.0
</span></span><span style="display:flex;"><span>sb2100FactoryTMReadString 1.3.6.1.4.1.1166.1.19.4.25.0
</span></span><span style="display:flex;"><span>sb2100FactoryTMRead  1.3.6.1.4.1.1166.1.19.4.26.0
</span></span><span style="display:flex;"><span>sb2100FactoryTMClose 1.3.6.1.4.1.1166.1.19.4.27.0
</span></span><span style="display:flex;"><span>sb2100FactoryCliFlag 1.3.6.1.4.1.1166.1.19.4.28.0
</span></span><span style="display:flex;"><span>sb2100FactoryDisableMib 1.3.6.1.4.1.1166.1.19.4.29.0
</span></span><span style="display:flex;"><span>sb2100FactoryUpstreamPowerCalibration 1.3.6.1.4.1.1166.1.19.4.30.0
</span></span><span style="display:flex;"><span>sb2100FactorySuspendStartup 1.3.6.1.4.1.1166.1.19.4.31.1.0
</span></span><span style="display:flex;"><span>sb2100FactoryDownstreamFrequency 1.3.6.1.4.1.1166.1.19.4.31.2.0
</span></span><span style="display:flex;"><span>sb2100FactoryDownstreamAcquire 1.3.6.1.4.1.1166.1.19.4.31.3.0
</span></span><span style="display:flex;"><span>sb2100FactoryTunerAGC 1.3.6.1.4.1.1166.1.19.4.31.4.0
</span></span><span style="display:flex;"><span>sb2100FactoryIfAGC 1.3.6.1.4.1.1166.1.19.4.31.5.0
</span></span><span style="display:flex;"><span>sb2100FactoryQamLock 1.3.6.1.4.1.1166.1.19.4.31.6.0
</span></span><span style="display:flex;"><span>sb2100FactoryBCMCommandType 1.3.6.1.4.1.1166.1.19.4.32.1.0
</span></span><span style="display:flex;"><span>sb2100FactoryBCMAddressOrOpcode 1.3.6.1.4.1.1166.1.19.4.32.2.0
</span></span><span style="display:flex;"><span>sb2100FactoryBCMByteCount 1.3.6.1.4.1.1166.1.19.4.32.3.0
</span></span><span style="display:flex;"><span>sb2100FactoryBCMData 1.3.6.1.4.1.1166.1.19.4.32.4.0
</span></span><span style="display:flex;"><span>sb2100FactoryBCMActivate 1.3.6.1.4.1.1166.1.19.4.32.5.0
</span></span><span style="display:flex;"><span>sb2100FactoryBigRSAPublicKey 1.3.6.1.4.1.1166.1.19.4.50.0
</span></span><span style="display:flex;"><span>sb2100FactoryBigRSAPrivateKey 1.3.6.1.4.1.1166.1.19.4.51.0
</span></span><span style="display:flex;"><span>sb2100FactoryCMCertificate  1.3.6.1.4.1.1166.1.19.4.52.0
</span></span><span style="display:flex;"><span>sb2100FactoryManCertificate  1.3.6.1.4.1.1166.1.19.4.53.0
</span></span><span style="display:flex;"><span>sb2100FactoryRootPublicKey 1.3.6.1.4.1.1166.1.19.4.54.0
</span></span><span style="display:flex;"><span>sb2100FactoryCodeSigningTime 1.3.6.1.4.1.1166.1.19.4.55.0
</span></span><span style="display:flex;"><span>sb2100FactoryCVCValidityStartTime  1.3.6.1.4.1.1166.1.19.4.56.0
</span></span><span style="display:flex;"><span>sb2100FactoryMSOId 1.3.6.1.4.1.1166.1.19.4.57.0
</span></span><span style="display:flex;"><span>sb2100FactoryCMManufacturerName 1.3.6.1.4.1.1166.1.19.4.58.0
</span></span><span style="display:flex;"><span>sb2100FactoryHtmlReadOnly 1.3.6.1.4.1.1166.1.19.4.59.0
</span></span><span style="display:flex;"><span>sb2100FactoryCmUsbMacAddr 1.3.6.1.4.1.1166.1.19.4.60.0
</span></span><span style="display:flex;"><span>sb2100FactoryCpeUsbMacAddr 1.3.6.1.4.1.1166.1.19.4.61.0
</span></span><span style="display:flex;"><span>sb2100FactoryCmAuxMacAddr 1.3.6.1.4.1.1166.1.19.4.62.0
</span></span><span style="display:flex;"><span>sb2100FactoryTunerId  1.3.6.1.4.1.1166.1.19.4.63.0
</span></span><span style="display:flex;"><span>sb2100FactoryHwRevision 1.3.6.1.4.1.1166.1.19.4.64.0
</span></span><span style="display:flex;"><span>sb2100FactoryUsAmpId  1.3.6.1.4.1.1166.1.19.4.65.0
</span></span><span style="display:flex;"><span>cm.6.1.1.2.0  MaxDown 1.3.6.1.4.1.1166.1.19.6.1.1.2.0
</span></span><span style="display:flex;"><span>cm.6.1.1.3.0  MaxUp 1.3.6.1.4.1.1166.1.19.6.1.1.3.0
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>Z zupełnie innej beczki.</title>
      <link>https://cynar.ski/2008/12/08/z-zupelnie-innej-beczki/</link>
      <pubDate>Mon, 08 Dec 2008 20:05:20 +0000</pubDate>
      <guid>https://cynar.ski/2008/12/08/z-zupelnie-innej-beczki/</guid>
      <description>&lt;p&gt;Teraz coś z zupełnie innej beczki, nie technicznie. Przez zupełny przypadek wpasła mi w łapy płyta Metamorfozy Kory, z lekką nieśmiałością wkładałem ją do CD ale po przesłuchaniu paru kawałków jestem zachwycony. Bardzo dobre nowe aranżacje starych przebojów, naprawdę zupełnie inne, ale za razem wprowadzają w nie nową jakość i to naprawdę dobrą jakość. Wszystkim szczerze polecam.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Teraz coś z zupełnie innej beczki, nie technicznie. Przez zupełny przypadek wpasła mi w łapy płyta Metamorfozy Kory, z lekką nieśmiałością wkładałem ją do CD ale po przesłuchaniu paru kawałków jestem zachwycony. Bardzo dobre nowe aranżacje starych przebojów, naprawdę zupełnie inne, ale za razem wprowadzają w nie nową jakość i to naprawdę dobrą jakość. Wszystkim szczerze polecam.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Google AdWords przeginają</title>
      <link>https://cynar.ski/2008/12/07/google-adwords-przeginaja/</link>
      <pubDate>Sun, 07 Dec 2008 12:43:56 +0000</pubDate>
      <guid>https://cynar.ski/2008/12/07/google-adwords-przeginaja/</guid>
      <description>&lt;p&gt;Dzisiaj wchodząc na moje konto Last.fm deko się zdziwiłem, potem zdegustowałem. Zastanawiam się czy serwowanie wszytkich treści na Google AdWords jest fajne. Jako ateista i osoba będąca daleko od dewocjonaliów na swojej stronie domowej widzę coś takiego:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Reklamy w Last.fm&#34; loading=&#34;lazy&#34; src=&#34;https://cynar.ski/lastfm.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;Przykro mi bardzo, ale mnie się to zupełnie nie podoba. Rozumiem, że serwisy sołecznościowe muszą jakoś zarabiać na swoje utrzymanie, jednakże czy użytkownik nie powinien wyrażać zgody na serwowanie pewnych treści na jego stronie domowej? W końcu jest to, i tu posłużę się pewnym uogólnieniem, strona prywatna - przynajmniej &amp;ldquo;profil&amp;rdquo; tak traktuję. Osobiście nie mam nic przeciwko AdWords&amp;rsquo;om ale chciałbym mieć możliwość wykluczania pewnych treści. Jestem za wolnością informacji, ale na Marduk&amp;rsquo;a nie dewocjonalia.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Dzisiaj wchodząc na moje konto Last.fm deko się zdziwiłem, potem zdegustowałem. Zastanawiam się czy serwowanie wszytkich treści na Google AdWords jest fajne. Jako ateista i osoba będąca daleko od dewocjonaliów na swojej stronie domowej widzę coś takiego:</p>
<p><img alt="Reklamy w Last.fm" loading="lazy" src="/lastfm.png"></p>
<p>Przykro mi bardzo, ale mnie się to zupełnie nie podoba. Rozumiem, że serwisy sołecznościowe muszą jakoś zarabiać na swoje utrzymanie, jednakże czy użytkownik nie powinien wyrażać zgody na serwowanie pewnych treści na jego stronie domowej? W końcu jest to, i tu posłużę się pewnym uogólnieniem, strona prywatna - przynajmniej &ldquo;profil&rdquo; tak traktuję. Osobiście nie mam nic przeciwko AdWords&rsquo;om ale chciałbym mieć możliwość wykluczania pewnych treści. Jestem za wolnością informacji, ale na Marduk&rsquo;a nie dewocjonalia.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Finder i hidden files</title>
      <link>https://cynar.ski/2008/12/06/finder-i-hidden-files/</link>
      <pubDate>Sat, 06 Dec 2008 13:29:40 +0000</pubDate>
      <guid>https://cynar.ski/2008/12/06/finder-i-hidden-files/</guid>
      <description>&lt;p&gt;Czasami denerwujący jest fakt, że w Finderze nie widać plików ukrytych, tą prostą komendą można to zmienić:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;defaults write com.apple.finder AppleShowAllFiles Yes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;killall Finder
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Po ponownym odpaleniu Finder&amp;rsquo;a mamy już pliczki w okienkach.&lt;/p&gt;
&lt;p&gt;Smacznego.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Czasami denerwujący jest fakt, że w Finderze nie widać plików ukrytych, tą prostą komendą można to zmienić:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>defaults write com.apple.finder AppleShowAllFiles Yes
</span></span><span style="display:flex;"><span>killall Finder
</span></span></code></pre></div><p>Po ponownym odpaleniu Finder&rsquo;a mamy już pliczki w okienkach.</p>
<p>Smacznego.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Ruby LDAP</title>
      <link>https://cynar.ski/2008/12/06/ruby-ldap/</link>
      <pubDate>Sat, 06 Dec 2008 12:32:44 +0000</pubDate>
      <guid>https://cynar.ski/2008/12/06/ruby-ldap/</guid>
      <description>&lt;p&gt;Ogólnie wyklikanie obsługi LDAP&amp;rsquo;a w ruby&amp;rsquo;m jest bajecznie proste, osoby które twierdzą, że stara wersja &lt;a href=&#34;http://rubyforge.org/projects/net-ldap/&#34;&gt;Ruby-net-ldap&lt;/a&gt; jest zła bo jest stara, wyjaśniam że LDAP jako usługa jest raczej projektem statycznym i jako taki nie zmienia się co miesiąc. Wersja net-ldap z roku 2006 jest jak najbardziej ok i wspira właściwie wszystkie możliwości protokołu LDAP.&lt;/p&gt;
&lt;p&gt;Pierwsze co trzeba zrobić to zainstalować bliblioteki LDAP dla Ruby&amp;rsquo;ego:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gem install ruby-net-ldap
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jak już mamy biblioteki to piszemy nasz pierwszy skrypt, powiedzmy LDAP&amp;rsquo;owy &amp;ldquo;Hello World&amp;rdquo;:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Ogólnie wyklikanie obsługi LDAP&rsquo;a w ruby&rsquo;m jest bajecznie proste, osoby które twierdzą, że stara wersja <a href="http://rubyforge.org/projects/net-ldap/">Ruby-net-ldap</a> jest zła bo jest stara, wyjaśniam że LDAP jako usługa jest raczej projektem statycznym i jako taki nie zmienia się co miesiąc. Wersja net-ldap z roku 2006 jest jak najbardziej ok i wspira właściwie wszystkie możliwości protokołu LDAP.</p>
<p>Pierwsze co trzeba zrobić to zainstalować bliblioteki LDAP dla Ruby&rsquo;ego:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>gem install ruby-net-ldap
</span></span></code></pre></div><p>Jak już mamy biblioteki to piszemy nasz pierwszy skrypt, powiedzmy LDAP&rsquo;owy &ldquo;Hello World&rdquo;:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-ruby" data-lang="ruby"><span style="display:flex;"><span>require <span style="color:#e6db74">&#39;rubygems&#39;</span>
</span></span><span style="display:flex;"><span>require <span style="color:#e6db74">&#39;net/ldap&#39;</span>
</span></span><span style="display:flex;"><span>username <span style="color:#f92672">=</span> <span style="color:#e6db74">&#39;user&#39;</span>
</span></span><span style="display:flex;"><span>password <span style="color:#f92672">=</span> <span style="color:#e6db74">&#39;passwd&#39;</span>
</span></span><span style="display:flex;"><span>ldap <span style="color:#f92672">=</span> <span style="color:#66d9ef">Net</span><span style="color:#f92672">::</span><span style="color:#66d9ef">LDAP</span><span style="color:#f92672">.</span>new(<span style="color:#e6db74">:host</span> <span style="color:#f92672">=&gt;</span> <span style="color:#e6db74">&#39;ldap.example.com&#39;</span>, <span style="color:#e6db74">:base</span> <span style="color:#f92672">=&gt;</span> <span style="color:#e6db74">&#39;ou=Users,dc=example,dc=com&#39;</span>)
</span></span><span style="display:flex;"><span>filter <span style="color:#f92672">=</span> <span style="color:#66d9ef">Net</span><span style="color:#f92672">::</span><span style="color:#66d9ef">LDAP</span><span style="color:#f92672">::</span><span style="color:#66d9ef">Filter</span><span style="color:#f92672">.</span>eq(<span style="color:#e6db74">&#39;uid&#39;</span>, username)
</span></span><span style="display:flex;"><span>ldap<span style="color:#f92672">.</span>search(<span style="color:#e6db74">:filter</span> <span style="color:#f92672">=&gt;</span> filter) {<span style="color:#f92672">|</span>entry<span style="color:#f92672">|</span> username <span style="color:#f92672">=</span> entry<span style="color:#f92672">.</span>dn}
</span></span><span style="display:flex;"><span>ldap<span style="color:#f92672">.</span>auth(username, password)
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">if</span> ldap<span style="color:#f92672">.</span>bind
</span></span><span style="display:flex;"><span>  print <span style="color:#e6db74">&#34;Hello World :D&#34;</span>;
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">else</span>
</span></span><span style="display:flex;"><span>  print <span style="color:#e6db74">&#34;Bye World !!!&#34;</span>;
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">end</span>
</span></span></code></pre></div><p>Właściwie to wszystko - działa.
Reszta już powiedzmy jest prosta, szukanie, dodawanie, usuwanie - jak w LDAP&rsquo;ie :)</p>
<p>Polecam również wątek na <a href="http://groups.google.com/group/rubyonrails-talk/browse_thread/thread/056b4f38ce625c21/fa6fdf0a529b2354?#fa6fdf0a529b2354">Google Groups</a> na ten temat.</p>
<p>Smacznego.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Keychain reaktywacja.</title>
      <link>https://cynar.ski/2008/11/25/keychain-reaktywacja/</link>
      <pubDate>Tue, 25 Nov 2008 21:30:36 +0000</pubDate>
      <guid>https://cynar.ski/2008/11/25/keychain-reaktywacja/</guid>
      <description>&lt;p&gt;Czas jakiś temu używałem, ale przestałem (ot po prostu) zdarza się. Ale jako, że ostatnio coraz częściej zwykłem logować się na różne maszynki po ssh wróciłem do ssh-keychain.&lt;/p&gt;
&lt;p&gt;Jak to zrobić i tak aby działało ? (specjalnie dla ciebie misiek zeby nie było - Debian like)
co .zshrc (lub .bashrc) wiem wiem jak to niejaki ktoś mówi bash jest lepszy ;P&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;keychain --eval id_rsa
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;host&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;uname -n&lt;span style=&#34;color:#e6db74&#34;&gt;```&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;. $HOME/.keychain/$host-sh
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;. $HOME/.keychain/$host-sh-gpg
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Oczywiście nazwa id_rsa będzie różna w zależności od nazwy wygenerowanych wcześniej kluczy.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Czas jakiś temu używałem, ale przestałem (ot po prostu) zdarza się. Ale jako, że ostatnio coraz częściej zwykłem logować się na różne maszynki po ssh wróciłem do ssh-keychain.</p>
<p>Jak to zrobić i tak aby działało ? (specjalnie dla ciebie misiek zeby nie było - Debian like)
co .zshrc (lub .bashrc) wiem wiem jak to niejaki ktoś mówi bash jest lepszy ;P</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>keychain --eval id_rsa
</span></span><span style="display:flex;"><span>host<span style="color:#f92672">=</span><span style="color:#e6db74">`</span>uname -n<span style="color:#e6db74">```</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>. $HOME/.keychain/$host-sh
</span></span><span style="display:flex;"><span>. $HOME/.keychain/$host-sh-gpg
</span></span></code></pre></div><p>Oczywiście nazwa id_rsa będzie różna w zależności od nazwy wygenerowanych wcześniej kluczy.</p>
<p>do <code>~/.ssh/config</code> (lub globalnie <code>/etc/ssh/ssh_config</code>)</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>Host *
</span></span><span style="display:flex;"><span>   ForwardAgent yes
</span></span></code></pre></div><p>Wsio.</p>
<p>Smacznego misiek.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Odzyskaj multimedia.</title>
      <link>https://cynar.ski/2008/11/13/odzyskaj-multimedia/</link>
      <pubDate>Thu, 13 Nov 2008 23:52:18 +0000</pubDate>
      <guid>https://cynar.ski/2008/11/13/odzyskaj-multimedia/</guid>
      <description>&lt;p&gt;Lenistwo matką potrzeby, czyli babcią wynalazku. Pewnie nie tylko mnie zdarzyło się stracić zdjęcia z pamięci flash, lub podobnej. Niedawno tak mi się właśnie zdarzyło, klasycznie szukanie i próbowanie odzyskania danych jest pracochłonne i czasożerne, ale od czego jest internet ;) szukałem, szukałem i znalazłem bardzo przydatne narzędzie. &lt;a href=&#34;http://www.cgsecurity.org/wiki/PhotoRec&#34;&gt;PhotoRec&lt;/a&gt;, bo o nim tu mowa to doskonałe narzędzie, jak piszą autorzy &amp;ldquo;PhotoRec is file data recovery software designed to recover lost files including video, documents and archives from Hard Disks and CDRom and lost pictures (thus, its &amp;lsquo;Photo Recovery&amp;rsquo; name) from digital camera memory.&amp;rdquo; i generalnie tak właśnie jest ;) naprawdę pomocne.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Lenistwo matką potrzeby, czyli babcią wynalazku. Pewnie nie tylko mnie zdarzyło się stracić zdjęcia z pamięci flash, lub podobnej. Niedawno tak mi się właśnie zdarzyło, klasycznie szukanie i próbowanie odzyskania danych jest pracochłonne i czasożerne, ale od czego jest internet ;) szukałem, szukałem i znalazłem bardzo przydatne narzędzie. <a href="http://www.cgsecurity.org/wiki/PhotoRec">PhotoRec</a>, bo o nim tu mowa to doskonałe narzędzie, jak piszą autorzy &ldquo;PhotoRec is file data recovery software designed to recover lost files including video, documents and archives from Hard Disks and CDRom and lost pictures (thus, its &lsquo;Photo Recovery&rsquo; name) from digital camera memory.&rdquo; i generalnie tak właśnie jest ;) naprawdę pomocne.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Trac AUTH PLAIN</title>
      <link>https://cynar.ski/2008/11/13/trac-auth-plain/</link>
      <pubDate>Thu, 13 Nov 2008 12:43:45 +0000</pubDate>
      <guid>https://cynar.ski/2008/11/13/trac-auth-plain/</guid>
      <description>&lt;p&gt;Niestety czasami jest tak, że trzeba wymusić PLAIN w SMTP ;) domyślnie TRAC tego nie potrafi, więc trzeba było dodać mały hack do konfiguracji, żeby wymuszać.&lt;/p&gt;
&lt;p&gt;Hack:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;trac:/home/trac/sites# diff /usr/share/python-support/trac/trac/notification-orig.py /usr/share/python-support/trac/trac/notification.py
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;87c87,90
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt;     force_plain &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; BoolOption&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;notification&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;force_plain&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;false&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt;         &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Force AUTH PLAIN in SMTP Authentication.&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;162a166
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt;         self._force_plain &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; self.env.config.getbool&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;notification&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;force_plain&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;279c283
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;         &lt;span style=&#34;color:#75715e&#34;&gt;# self.server.set_debuglevel(True)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt;         self.server.set_debuglevel&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;True&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;285a290,292
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt;         &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; self._force_plain:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt;             self.server.ehlo&lt;span style=&#34;color:#f92672&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt;             self.server.esmtp_features&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;auth&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;LOGIN PLAIN&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;W trac.ini dodajemy:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	[notification]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	force_plain = true
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I wszystko powinno ładnie klikać.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Niestety czasami jest tak, że trzeba wymusić PLAIN w SMTP ;) domyślnie TRAC tego nie potrafi, więc trzeba było dodać mały hack do konfiguracji, żeby wymuszać.</p>
<p>Hack:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>trac:/home/trac/sites# diff /usr/share/python-support/trac/trac/notification-orig.py /usr/share/python-support/trac/trac/notification.py
</span></span><span style="display:flex;"><span>87c87,90
</span></span><span style="display:flex;"><span>&lt;
</span></span><span style="display:flex;"><span>---
</span></span><span style="display:flex;"><span>&gt;
</span></span><span style="display:flex;"><span>&gt;     force_plain <span style="color:#f92672">=</span> BoolOption<span style="color:#f92672">(</span><span style="color:#e6db74">&#39;notification&#39;</span>, <span style="color:#e6db74">&#39;force_plain&#39;</span>, <span style="color:#e6db74">&#39;false&#39;</span>,
</span></span><span style="display:flex;"><span>&gt;         <span style="color:#e6db74">&#34;&#34;&#34;Force AUTH PLAIN in SMTP Authentication.&#34;&#34;&#34;</span><span style="color:#f92672">)</span>
</span></span><span style="display:flex;"><span>&gt;
</span></span><span style="display:flex;"><span>162a166
</span></span><span style="display:flex;"><span>&gt;         self._force_plain <span style="color:#f92672">=</span> self.env.config.getbool<span style="color:#f92672">(</span><span style="color:#e6db74">&#39;notification&#39;</span>, <span style="color:#e6db74">&#39;force_plain&#39;</span><span style="color:#f92672">)</span>
</span></span><span style="display:flex;"><span>279c283
</span></span><span style="display:flex;"><span>&lt;         <span style="color:#75715e"># self.server.set_debuglevel(True)</span>
</span></span><span style="display:flex;"><span>---
</span></span><span style="display:flex;"><span>&gt;         self.server.set_debuglevel<span style="color:#f92672">(</span>True<span style="color:#f92672">)</span>
</span></span><span style="display:flex;"><span>285a290,292
</span></span><span style="display:flex;"><span>&gt;         <span style="color:#66d9ef">if</span> self._force_plain:
</span></span><span style="display:flex;"><span>&gt;             self.server.ehlo<span style="color:#f92672">()</span>
</span></span><span style="display:flex;"><span>&gt;             self.server.esmtp_features<span style="color:#f92672">[</span><span style="color:#e6db74">&#34;auth&#34;</span><span style="color:#f92672">]</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;LOGIN PLAIN&#34;</span>
</span></span></code></pre></div><p>W trac.ini dodajemy:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	[notification]
</span></span><span style="display:flex;"><span>	force_plain = true
</span></span></code></pre></div><p>I wszystko powinno ładnie klikać.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Jakość wykonywanych projektów</title>
      <link>https://cynar.ski/2008/11/12/jakosc-wykonywanych-projektow/</link>
      <pubDate>Wed, 12 Nov 2008 23:27:34 +0000</pubDate>
      <guid>https://cynar.ski/2008/11/12/jakosc-wykonywanych-projektow/</guid>
      <description>&lt;p&gt;Ostatnimi czasy troszkę bardziej śledzę rynek &amp;ldquo;freelancingowy&amp;rdquo; w polsce i jestem coraz bardziej przerażony tym co widzę. Namnożyło się dziwnych firm, które świadczą usługi typu &amp;ldquo;identyfikacja wizualna&amp;rdquo;. Co to jest, szczerze powiem nie wiem, może jestem za stary na takie &amp;ldquo;dynamicznie&amp;rdquo; rozwijające się &amp;ldquo;młode&amp;rdquo; grona cybernetycznych wilków. Będąc po tej drugiej stronie widzę, jak tego typu firmy zajmują się &amp;ldquo;profesjonalnie&amp;rdquo; tematem. Ostatnio znajomy, oferujący hosting opowiadał o takich &amp;ldquo;dynamicznych młodych orłach&amp;rdquo;, naprawdę miło się słuchało.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Ostatnimi czasy troszkę bardziej śledzę rynek &ldquo;freelancingowy&rdquo; w polsce i jestem coraz bardziej przerażony tym co widzę. Namnożyło się dziwnych firm, które świadczą usługi typu &ldquo;identyfikacja wizualna&rdquo;. Co to jest, szczerze powiem nie wiem, może jestem za stary na takie &ldquo;dynamicznie&rdquo; rozwijające się &ldquo;młode&rdquo; grona cybernetycznych wilków. Będąc po tej drugiej stronie widzę, jak tego typu firmy zajmują się &ldquo;profesjonalnie&rdquo; tematem. Ostatnio znajomy, oferujący hosting opowiadał o takich &ldquo;dynamicznych młodych orłach&rdquo;, naprawdę miło się słuchało.</p>
<p>Przegrane dane na serwer po FTP, wszystko niby okey, ale uups coś nie tak provider zawalił, przecież oni mają dobrze napisany kod aplikacji.</p>
<p>- Tak, tak proszę Pana, zmieniłem duże litery w nazwach plików na małe i powinno działać - rzecze admin do &ldquo;młodego dynamicznego orła&rdquo;.</p>
<p>A to serwer nie jest na windowsie ?</p>
<p>&ldquo;Jesteśmy dynamicznie rozwijającymi się programistami, korzystamy z jedynie słusznych systemów Open Source&rdquo;, Joomla i Mambo. I tu mam niestety za złe ruchowi Open Source, niestety rewolucja technologiczna poszła nieco w innym kierunku, niż Oni sobie to wyobrażali i co gorsza ma się dobrze. Patrząc ostatnio na strony poświęcone freelancingowi zaciekawia mnie fakt, że OpenSource stał się teraz swoistą szmatką do wycierania niedoskonałości twórców oprogramowania. Zgadzam się z twierdzeniem, że nie ma sensu wyłamywać otwartych drzwi, ale na boga niech przynajmniej wiadomo co to są drzwi!</p>
<p>Jak to teraz wygląda, jestem młody, dynamiczny, klik klik, google.pl, klik klik, darmowy CMS, klik klik, tak, taak, ehe&hellip;. klik klik. Joomla, klik klik, forum, klik klik, tap tap klik. Jak zainstalować Joomle, co potrzebuje? klik, klik, tap tap tap, oo dzięki. No jestem już wymiataczem, klik klik, zumi.pl klik klik tap tap, urząd skarbowy klkk klik, google.pl tap tap zakładanie firmy, klik ok. Jestem wymiataczem i mam firmę. Klikk, klik, albo nie.
Taato masz znajomych z firmami, może chcą stronę ? Klik klik, o dzięki. Tak, zrobilem już wiele dużych projektów. Klik, tap tap, oo dziękuję. A potem na serwisach freelanceingowych jest informacja:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	Interesuje mnie zleceniee komus pocięcia nieskomplikowanego (trudność: 5/10) layoutu WWW.
</span></span><span style="display:flex;"><span>	Nie tabele, lecz DIVy. KOD NIE MUSI SIE WALIDIOWAĆ.
</span></span><span style="display:flex;"><span>	Praca, że tak powiem, może byc zrobiona na &#34;od**al się&#34;, poniewaz zależy mi na czasie.
</span></span><span style="display:flex;"><span>	Wazne żeby były DIVy :)
</span></span><span style="display:flex;"><span>	Firmom dziękuje, cena odgrywa decydująca rolę. najchętniej freenalcer, który chce liczyć na jeszcze kilka (może kilkanaście) takich zleceń, na które ja nie mam czasu.)
</span></span></code></pre></div><p>Przykre. A jest tego wiecej. Nie tak dawno bo jakieś 3 miesiące temu miałem wątpliwą przyjemność z tzw. fachowcami webmasterami, jachwe uchowaj. Chcieli oni zdalny dostęp do bazy MySQL, zostali poproszeni o IP z jakiego będą się łączyć. Nie trudno było przewidzieć, że otrzymam ip w postaci 192.168.x.y - no pięknie. Ale to nie koniec całej sprawy, poproszeni o zewnętrzny ip ucichli na około 3 dni, uff po przeczytaniu chyba całego internetu i nauczeniu się na pamięć parunastu haseł z wiki i nonsenso-pedii wysłali adres ip. Ok, jest dobrze. Ale cóż to, email od fachowca nr. 2 oczywiście z tzw. opierdolem, że nie działa połączenie z bazą danych. Patrzę w logi, żadnych prób. Odpowiadam na zarzuty, pytaniem o konfigurację klienta. W odpowiedzi dostaję adres bazy danych: 127.0.0.1 - ARGH&hellip;.. A potem się ludzie dziwią, że admini to taka dziwna grupa społeczna. Przepraszam bardzo, ale zanim ktoś weźmie firmę &ldquo;dynamiczną&rdquo; to niech sprawdzi ich poziom IQ, pogrzebie w IPN&rsquo;ie - bo to może być, nie daj boże firma &ldquo;fachowa i dynamiczna&rdquo;, a nie dość tego &ldquo;młoda&rdquo;.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Przyśpiesz pingwina.</title>
      <link>https://cynar.ski/2008/11/12/przyspiesz-pingwina/</link>
      <pubDate>Wed, 12 Nov 2008 00:54:28 +0000</pubDate>
      <guid>https://cynar.ski/2008/11/12/przyspiesz-pingwina/</guid>
      <description>&lt;p&gt;Kerneltrap &lt;a href=&#34;http://kerneltrap.org/node/14148&#34;&gt;donosi&lt;/a&gt;, że wykorzystanie realtime zamiast atime poprawia wydajność systemu plików,
aby dokonać owej zmiany wystarczy w &lt;strong&gt;/etc/fstab&lt;/strong&gt; do definicji dysków dopisać:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;noatime,nodiratime
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Zmiana widocznie poprawi szybkość działania.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Kerneltrap <a href="http://kerneltrap.org/node/14148">donosi</a>, że wykorzystanie realtime zamiast atime poprawia wydajność systemu plików,
aby dokonać owej zmiany wystarczy w <strong>/etc/fstab</strong> do definicji dysków dopisać:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>noatime,nodiratime
</span></span></code></pre></div><p>Zmiana widocznie poprawi szybkość działania.</p>
]]></content:encoded>
    </item>
    <item>
      <title>PowerDNS, psql – prosto i przyjemnie.</title>
      <link>https://cynar.ski/2008/11/03/powerdns-psql-prosto-i-przyjemnie/</link>
      <pubDate>Mon, 03 Nov 2008 23:40:44 +0000</pubDate>
      <guid>https://cynar.ski/2008/11/03/powerdns-psql-prosto-i-przyjemnie/</guid>
      <description>&lt;p&gt;Strukturę deko zmieniłem, bo ta dostępna w examples jest do bani.&lt;/p&gt;
&lt;p&gt;Wygląda to tak:&lt;/p&gt;
&lt;p&gt;parenaście razy wywalałem baze (szybciej) bo nie wychodziło jak miało
wychodzić ;) do tego prosty zbiór komend na użytkowniku postgres:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dropdb   masterdns  &lt;span style=&#34;color:#75715e&#34;&gt;#kasyjemy baze&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;createdb masterdns  &lt;span style=&#34;color:#75715e&#34;&gt;#tworzymy baze&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;createlang plpgsql masterdns &lt;span style=&#34;color:#75715e&#34;&gt;#dodajemy obsługę perl&amp;#39;a dla bazy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ostatnia wymagała doinstalowania bibliotek ;)&lt;/p&gt;
&lt;p&gt;Struktura bazy:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;CREATE&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;TABLE&lt;/span&gt; dns_zones (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  id                 SERIAL8 &lt;span style=&#34;color:#66d9ef&#34;&gt;PRIMARY&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;KEY&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  origin             VARCHAR(&lt;span style=&#34;color:#ae81ff&#34;&gt;255&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;UNIQUE&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;NOT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;NULL&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ns                 VARCHAR(&lt;span style=&#34;color:#ae81ff&#34;&gt;255&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;NOT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;NULL&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  mbox               VARCHAR(&lt;span style=&#34;color:#ae81ff&#34;&gt;255&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;NOT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;NULL&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  serial             INT8 &lt;span style=&#34;color:#66d9ef&#34;&gt;NOT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;NULL&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;DEFAULT&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;1&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  refresh            INT4 &lt;span style=&#34;color:#66d9ef&#34;&gt;NOT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;NULL&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;DEFAULT&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;10800&amp;#39;&lt;/span&gt;,  &lt;span style=&#34;color:#75715e&#34;&gt;-- 3 hours
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;  retry              INT4 &lt;span style=&#34;color:#66d9ef&#34;&gt;NOT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;NULL&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;DEFAULT&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;3600&amp;#39;&lt;/span&gt;,   &lt;span style=&#34;color:#75715e&#34;&gt;-- 1 hour
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;  expire             INT4 &lt;span style=&#34;color:#66d9ef&#34;&gt;NOT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;NULL&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;DEFAULT&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;604800&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#75715e&#34;&gt;-- 1 week
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;  ttl                INT4 &lt;span style=&#34;color:#66d9ef&#34;&gt;NOT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;NULL&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;DEFAULT&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;3600&amp;#39;&lt;/span&gt;);  &lt;span style=&#34;color:#75715e&#34;&gt;-- 1 hour
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;CREATE&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;TABLE&lt;/span&gt; dns_resource_types (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  id                 SERIAL8 &lt;span style=&#34;color:#66d9ef&#34;&gt;PRIMARY&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;KEY&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  name               VARCHAR(&lt;span style=&#34;color:#ae81ff&#34;&gt;255&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;NOT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;NULL&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  description        TEXT
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;INSERT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;INTO&lt;/span&gt; dns_resource_types (name, description) &lt;span style=&#34;color:#66d9ef&#34;&gt;VALUES&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;A&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;INSERT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;INTO&lt;/span&gt; dns_resource_types (name, description) &lt;span style=&#34;color:#66d9ef&#34;&gt;VALUES&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;AAAA&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;INSERT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;INTO&lt;/span&gt; dns_resource_types (name, description) &lt;span style=&#34;color:#66d9ef&#34;&gt;VALUES&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;CNAME&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;INSERT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;INTO&lt;/span&gt; dns_resource_types (name, description) &lt;span style=&#34;color:#66d9ef&#34;&gt;VALUES&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;HINFO&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;INSERT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;INTO&lt;/span&gt; dns_resource_types (name, description) &lt;span style=&#34;color:#66d9ef&#34;&gt;VALUES&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;MX&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;INSERT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;INTO&lt;/span&gt; dns_resource_types (name, description) &lt;span style=&#34;color:#66d9ef&#34;&gt;VALUES&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;NS&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;INSERT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;INTO&lt;/span&gt; dns_resource_types (name, description) &lt;span style=&#34;color:#66d9ef&#34;&gt;VALUES&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;PTR&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;INSERT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;INTO&lt;/span&gt; dns_resource_types (name, description) &lt;span style=&#34;color:#66d9ef&#34;&gt;VALUES&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;SRV&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;INSERT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;INTO&lt;/span&gt; dns_resource_types (name, description) &lt;span style=&#34;color:#66d9ef&#34;&gt;VALUES&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;TXT&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;CREATE&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;TABLE&lt;/span&gt; dns_resources (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  id                 SERIAL8 &lt;span style=&#34;color:#66d9ef&#34;&gt;PRIMARY&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;KEY&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  dns_zone_id        INT8 &lt;span style=&#34;color:#66d9ef&#34;&gt;NOT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;NULL&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;REFERENCES&lt;/span&gt; dns_zones &lt;span style=&#34;color:#66d9ef&#34;&gt;ON&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;DELETE&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;CASCADE&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;ON&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;UPDATE&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;CASCADE&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  dns_resource_type_id INT8 &lt;span style=&#34;color:#66d9ef&#34;&gt;NOT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;NULL&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;REFERENCES&lt;/span&gt; dns_resource_types,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  name               VARCHAR(&lt;span style=&#34;color:#ae81ff&#34;&gt;64&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;NOT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;NULL&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;data&lt;/span&gt;               VARCHAR(&lt;span style=&#34;color:#ae81ff&#34;&gt;255&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;NOT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;NULL&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  aux                INT4 &lt;span style=&#34;color:#66d9ef&#34;&gt;NULL&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;DEFAULT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;NULL&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ttl                INT4 &lt;span style=&#34;color:#66d9ef&#34;&gt;NULL&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;DEFAULT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;NULL&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Należy stworzyć użytkownika pdns, nadać prawa etc..&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Strukturę deko zmieniłem, bo ta dostępna w examples jest do bani.</p>
<p>Wygląda to tak:</p>
<p>parenaście razy wywalałem baze (szybciej) bo nie wychodziło jak miało
wychodzić ;) do tego prosty zbiór komend na użytkowniku postgres:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>dropdb   masterdns  <span style="color:#75715e">#kasyjemy baze</span>
</span></span><span style="display:flex;"><span>createdb masterdns  <span style="color:#75715e">#tworzymy baze</span>
</span></span><span style="display:flex;"><span>createlang plpgsql masterdns <span style="color:#75715e">#dodajemy obsługę perl&#39;a dla bazy</span>
</span></span></code></pre></div><p>ostatnia wymagała doinstalowania bibliotek ;)</p>
<p>Struktura bazy:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sql" data-lang="sql"><span style="display:flex;"><span><span style="color:#66d9ef">CREATE</span> <span style="color:#66d9ef">TABLE</span> dns_zones (
</span></span><span style="display:flex;"><span>  id                 SERIAL8 <span style="color:#66d9ef">PRIMARY</span> <span style="color:#66d9ef">KEY</span>,
</span></span><span style="display:flex;"><span>  origin             VARCHAR(<span style="color:#ae81ff">255</span>) <span style="color:#66d9ef">UNIQUE</span> <span style="color:#66d9ef">NOT</span> <span style="color:#66d9ef">NULL</span>,
</span></span><span style="display:flex;"><span>  ns                 VARCHAR(<span style="color:#ae81ff">255</span>) <span style="color:#66d9ef">NOT</span> <span style="color:#66d9ef">NULL</span>,
</span></span><span style="display:flex;"><span>  mbox               VARCHAR(<span style="color:#ae81ff">255</span>) <span style="color:#66d9ef">NOT</span> <span style="color:#66d9ef">NULL</span>,
</span></span><span style="display:flex;"><span>  serial             INT8 <span style="color:#66d9ef">NOT</span> <span style="color:#66d9ef">NULL</span> <span style="color:#66d9ef">DEFAULT</span> <span style="color:#e6db74">&#39;1&#39;</span>,
</span></span><span style="display:flex;"><span>  refresh            INT4 <span style="color:#66d9ef">NOT</span> <span style="color:#66d9ef">NULL</span> <span style="color:#66d9ef">DEFAULT</span> <span style="color:#e6db74">&#39;10800&#39;</span>,  <span style="color:#75715e">-- 3 hours
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>  retry              INT4 <span style="color:#66d9ef">NOT</span> <span style="color:#66d9ef">NULL</span> <span style="color:#66d9ef">DEFAULT</span> <span style="color:#e6db74">&#39;3600&#39;</span>,   <span style="color:#75715e">-- 1 hour
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>  expire             INT4 <span style="color:#66d9ef">NOT</span> <span style="color:#66d9ef">NULL</span> <span style="color:#66d9ef">DEFAULT</span> <span style="color:#e6db74">&#39;604800&#39;</span>, <span style="color:#75715e">-- 1 week
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>  ttl                INT4 <span style="color:#66d9ef">NOT</span> <span style="color:#66d9ef">NULL</span> <span style="color:#66d9ef">DEFAULT</span> <span style="color:#e6db74">&#39;3600&#39;</span>);  <span style="color:#75715e">-- 1 hour
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#66d9ef">CREATE</span> <span style="color:#66d9ef">TABLE</span> dns_resource_types (
</span></span><span style="display:flex;"><span>  id                 SERIAL8 <span style="color:#66d9ef">PRIMARY</span> <span style="color:#66d9ef">KEY</span>,
</span></span><span style="display:flex;"><span>  name               VARCHAR(<span style="color:#ae81ff">255</span>) <span style="color:#66d9ef">NOT</span> <span style="color:#66d9ef">NULL</span>,
</span></span><span style="display:flex;"><span>  description        TEXT
</span></span><span style="display:flex;"><span>);
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">INSERT</span> <span style="color:#66d9ef">INTO</span> dns_resource_types (name, description) <span style="color:#66d9ef">VALUES</span>
</span></span><span style="display:flex;"><span>    (<span style="color:#e6db74">&#39;A&#39;</span>, <span style="color:#e6db74">&#39;&#39;</span>);
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">INSERT</span> <span style="color:#66d9ef">INTO</span> dns_resource_types (name, description) <span style="color:#66d9ef">VALUES</span>
</span></span><span style="display:flex;"><span>    (<span style="color:#e6db74">&#39;AAAA&#39;</span>, <span style="color:#e6db74">&#39;&#39;</span>);
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">INSERT</span> <span style="color:#66d9ef">INTO</span> dns_resource_types (name, description) <span style="color:#66d9ef">VALUES</span>
</span></span><span style="display:flex;"><span>    (<span style="color:#e6db74">&#39;CNAME&#39;</span>, <span style="color:#e6db74">&#39;&#39;</span>);
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">INSERT</span> <span style="color:#66d9ef">INTO</span> dns_resource_types (name, description) <span style="color:#66d9ef">VALUES</span>
</span></span><span style="display:flex;"><span>    (<span style="color:#e6db74">&#39;HINFO&#39;</span>, <span style="color:#e6db74">&#39;&#39;</span>);
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">INSERT</span> <span style="color:#66d9ef">INTO</span> dns_resource_types (name, description) <span style="color:#66d9ef">VALUES</span>
</span></span><span style="display:flex;"><span>    (<span style="color:#e6db74">&#39;MX&#39;</span>, <span style="color:#e6db74">&#39;&#39;</span>);
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">INSERT</span> <span style="color:#66d9ef">INTO</span> dns_resource_types (name, description) <span style="color:#66d9ef">VALUES</span>
</span></span><span style="display:flex;"><span>    (<span style="color:#e6db74">&#39;NS&#39;</span>, <span style="color:#e6db74">&#39;&#39;</span>);
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">INSERT</span> <span style="color:#66d9ef">INTO</span> dns_resource_types (name, description) <span style="color:#66d9ef">VALUES</span>
</span></span><span style="display:flex;"><span>    (<span style="color:#e6db74">&#39;PTR&#39;</span>, <span style="color:#e6db74">&#39;&#39;</span>);
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">INSERT</span> <span style="color:#66d9ef">INTO</span> dns_resource_types (name, description) <span style="color:#66d9ef">VALUES</span>
</span></span><span style="display:flex;"><span>    (<span style="color:#e6db74">&#39;SRV&#39;</span>, <span style="color:#e6db74">&#39;&#39;</span>);
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">INSERT</span> <span style="color:#66d9ef">INTO</span> dns_resource_types (name, description) <span style="color:#66d9ef">VALUES</span>
</span></span><span style="display:flex;"><span>    (<span style="color:#e6db74">&#39;TXT&#39;</span>, <span style="color:#e6db74">&#39;&#39;</span>);
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">CREATE</span> <span style="color:#66d9ef">TABLE</span> dns_resources (
</span></span><span style="display:flex;"><span>  id                 SERIAL8 <span style="color:#66d9ef">PRIMARY</span> <span style="color:#66d9ef">KEY</span>,
</span></span><span style="display:flex;"><span>  dns_zone_id        INT8 <span style="color:#66d9ef">NOT</span> <span style="color:#66d9ef">NULL</span> <span style="color:#66d9ef">REFERENCES</span> dns_zones <span style="color:#66d9ef">ON</span> <span style="color:#66d9ef">DELETE</span> <span style="color:#66d9ef">CASCADE</span> <span style="color:#66d9ef">ON</span> <span style="color:#66d9ef">UPDATE</span> <span style="color:#66d9ef">CASCADE</span>,
</span></span><span style="display:flex;"><span>  dns_resource_type_id INT8 <span style="color:#66d9ef">NOT</span> <span style="color:#66d9ef">NULL</span> <span style="color:#66d9ef">REFERENCES</span> dns_resource_types,
</span></span><span style="display:flex;"><span>  name               VARCHAR(<span style="color:#ae81ff">64</span>) <span style="color:#66d9ef">NOT</span> <span style="color:#66d9ef">NULL</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">data</span>               VARCHAR(<span style="color:#ae81ff">255</span>) <span style="color:#66d9ef">NOT</span> <span style="color:#66d9ef">NULL</span>,
</span></span><span style="display:flex;"><span>  aux                INT4 <span style="color:#66d9ef">NULL</span> <span style="color:#66d9ef">DEFAULT</span> <span style="color:#66d9ef">NULL</span>,
</span></span><span style="display:flex;"><span>  ttl                INT4 <span style="color:#66d9ef">NULL</span> <span style="color:#66d9ef">DEFAULT</span> <span style="color:#66d9ef">NULL</span>);
</span></span></code></pre></div><p>Należy stworzyć użytkownika pdns, nadać prawa etc..</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sql" data-lang="sql"><span style="display:flex;"><span><span style="color:#75715e">-- Create pdns role
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#66d9ef">CREATE</span> <span style="color:#66d9ef">SCHEMA</span> pdns <span style="color:#66d9ef">AUTHORIZATION</span> pdns;
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">SET</span> search_path <span style="color:#66d9ef">TO</span> pdns,<span style="color:#66d9ef">public</span>;
</span></span><span style="display:flex;"><span><span style="color:#75715e">-- Pole możemy oczywiście dowolnie zmieniać i modyfikować:
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#66d9ef">CREATE</span> <span style="color:#66d9ef">TYPE</span> record_type <span style="color:#66d9ef">AS</span> ENUM (<span style="color:#e6db74">&#39;A&#39;</span>, <span style="color:#e6db74">&#39;AAAA&#39;</span>, <span style="color:#e6db74">&#39;AFSDB&#39;</span>, <span style="color:#e6db74">&#39;CERT&#39;</span>, <span style="color:#e6db74">&#39;CNAME&#39;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#39;DNSKEY&#39;</span>, <span style="color:#e6db74">&#39;DS&#39;</span>, <span style="color:#e6db74">&#39;HINFO&#39;</span>, <span style="color:#e6db74">&#39;KEY&#39;</span>, <span style="color:#e6db74">&#39;LOC&#39;</span>, <span style="color:#e6db74">&#39;MX&#39;</span>, <span style="color:#e6db74">&#39;NAPTR&#39;</span>, <span style="color:#e6db74">&#39;NS&#39;</span>, <span style="color:#e6db74">&#39;NSEC&#39;</span>, <span style="color:#e6db74">&#39;PTR&#39;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#39;RP&#39;</span>, <span style="color:#e6db74">&#39;RRSIG&#39;</span>, <span style="color:#e6db74">&#39;SOA&#39;</span>, <span style="color:#e6db74">&#39;SPF&#39;</span>, <span style="color:#e6db74">&#39;SSHFP&#39;</span>, <span style="color:#e6db74">&#39;SRV&#39;</span>, <span style="color:#e6db74">&#39;TXT&#39;</span>);
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">CREATE</span> <span style="color:#66d9ef">TYPE</span> domain_type <span style="color:#66d9ef">AS</span> ENUM (<span style="color:#e6db74">&#39;NATIVE&#39;</span>, <span style="color:#e6db74">&#39;MASTER&#39;</span>, <span style="color:#e6db74">&#39;SLAVE&#39;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#39;SUPERSLAVE&#39;</span>);
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">CREATE</span> <span style="color:#66d9ef">TABLE</span> domains (
</span></span><span style="display:flex;"><span>  id                 INT8 <span style="color:#66d9ef">PRIMARY</span> <span style="color:#66d9ef">KEY</span>,
</span></span><span style="display:flex;"><span>  name               VARCHAR(<span style="color:#ae81ff">255</span>) <span style="color:#66d9ef">UNIQUE</span> <span style="color:#66d9ef">NOT</span> <span style="color:#66d9ef">NULL</span>,
</span></span><span style="display:flex;"><span>  master             VARCHAR(<span style="color:#ae81ff">255</span>) <span style="color:#66d9ef">DEFAULT</span> <span style="color:#66d9ef">NULL</span>,
</span></span><span style="display:flex;"><span>  last_check         INT <span style="color:#66d9ef">DEFAULT</span> <span style="color:#66d9ef">NULL</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">type</span>               DOMAIN_TYPE <span style="color:#66d9ef">NOT</span> <span style="color:#66d9ef">NULL</span>,
</span></span><span style="display:flex;"><span>  notified_serial    INT <span style="color:#66d9ef">DEFAULT</span> <span style="color:#66d9ef">NULL</span>,
</span></span><span style="display:flex;"><span>  account            VARCHAR(<span style="color:#ae81ff">40</span>) <span style="color:#66d9ef">DEFAULT</span> <span style="color:#66d9ef">NULL</span>
</span></span><span style="display:flex;"><span>);
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">CREATE</span> <span style="color:#66d9ef">TABLE</span> records (
</span></span><span style="display:flex;"><span>  id                 SERIAL8 <span style="color:#66d9ef">PRIMARY</span> <span style="color:#66d9ef">KEY</span>,
</span></span><span style="display:flex;"><span>  domain_id          INT8 <span style="color:#66d9ef">NOT</span> <span style="color:#66d9ef">NULL</span> <span style="color:#66d9ef">REFERENCES</span> domains <span style="color:#66d9ef">ON</span> <span style="color:#66d9ef">DELETE</span> <span style="color:#66d9ef">CASCADE</span>,
</span></span><span style="display:flex;"><span>  name               VARCHAR(<span style="color:#ae81ff">255</span>) <span style="color:#66d9ef">NOT</span> <span style="color:#66d9ef">NULL</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">type</span>               RECORD_TYPE <span style="color:#66d9ef">NOT</span> <span style="color:#66d9ef">NULL</span>,
</span></span><span style="display:flex;"><span>  content            VARCHAR(<span style="color:#ae81ff">255</span>) <span style="color:#66d9ef">NOT</span> <span style="color:#66d9ef">NULL</span>,
</span></span><span style="display:flex;"><span>  ttl                INT <span style="color:#66d9ef">DEFAULT</span> <span style="color:#66d9ef">NULL</span>,
</span></span><span style="display:flex;"><span>  prio               INT <span style="color:#66d9ef">DEFAULT</span> <span style="color:#66d9ef">NULL</span>,
</span></span><span style="display:flex;"><span>  change_date        INT <span style="color:#66d9ef">DEFAULT</span> <span style="color:#66d9ef">NULL</span>,
</span></span><span style="display:flex;"><span>  ref_id             INT8 <span style="color:#66d9ef">DEFAULT</span> <span style="color:#66d9ef">NULL</span>
</span></span><span style="display:flex;"><span>);
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">CREATE</span> <span style="color:#66d9ef">INDEX</span> records_name_index <span style="color:#66d9ef">ON</span> records (name);
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">CREATE</span> <span style="color:#66d9ef">INDEX</span> records_name_type_index <span style="color:#66d9ef">ON</span> records (name, <span style="color:#66d9ef">type</span>);
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">CREATE</span> <span style="color:#66d9ef">INDEX</span> records_domain_id_index <span style="color:#66d9ef">ON</span> records (domain_id);
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">SET</span> search_path <span style="color:#66d9ef">TO</span> <span style="color:#e6db74">&#34;$user&#34;</span>,<span style="color:#66d9ef">public</span>;
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">GRANT</span> <span style="color:#66d9ef">ALL</span> <span style="color:#66d9ef">PRIVILEGES</span> <span style="color:#66d9ef">ON</span> pdns.domains <span style="color:#66d9ef">TO</span> pdns;
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">GRANT</span> <span style="color:#66d9ef">ALL</span> <span style="color:#66d9ef">PRIVILEGES</span> <span style="color:#66d9ef">ON</span> pdns.records <span style="color:#66d9ef">TO</span> pdns;
</span></span></code></pre></div><p>A teraz najtrudniejsza sprawa, czyli zdefiniowanie logiki dla danych</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sql" data-lang="sql"><span style="display:flex;"><span><span style="color:#66d9ef">CREATE</span> <span style="color:#66d9ef">OR</span> <span style="color:#66d9ef">REPLACE</span> <span style="color:#66d9ef">FUNCTION</span> concat_hosts_func(text, text) <span style="color:#66d9ef">RETURNS</span> text <span style="color:#66d9ef">AS</span> <span style="color:#960050;background-color:#1e0010">$$</span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">DECLARE</span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">BEGIN</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">IF</span> (<span style="color:#960050;background-color:#1e0010">$</span><span style="color:#ae81ff">1</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#39;&#39;</span> <span style="color:#66d9ef">OR</span> <span style="color:#960050;background-color:#1e0010">$</span><span style="color:#ae81ff">1</span> <span style="color:#66d9ef">IS</span> <span style="color:#66d9ef">NULL</span>) <span style="color:#66d9ef">THEN</span>
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">RETURN</span> <span style="color:#960050;background-color:#1e0010">$</span><span style="color:#ae81ff">2</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">END</span> <span style="color:#66d9ef">IF</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">RETURN</span> (<span style="color:#960050;background-color:#1e0010">$</span><span style="color:#ae81ff">1</span> <span style="color:#f92672">||</span> <span style="color:#e6db74">&#39;.&#39;</span> <span style="color:#f92672">||</span> <span style="color:#960050;background-color:#1e0010">$</span><span style="color:#ae81ff">2</span>);
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">END</span>;
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">$$</span> <span style="color:#66d9ef">LANGUAGE</span> plpgsql;
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">CREATE</span> <span style="color:#66d9ef">OR</span> <span style="color:#66d9ef">REPLACE</span> <span style="color:#66d9ef">FUNCTION</span> dns_zones_update_increment_serial_func () <span style="color:#66d9ef">RETURNS</span> <span style="color:#66d9ef">TRIGGER</span> <span style="color:#66d9ef">AS</span> <span style="color:#960050;background-color:#1e0010">$$</span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">DECLARE</span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">BEGIN</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">IF</span> (<span style="color:#66d9ef">NEW</span>.serial <span style="color:#f92672">&lt;=</span> <span style="color:#66d9ef">OLD</span>.serial) <span style="color:#66d9ef">THEN</span>
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">NEW</span>.serial :<span style="color:#f92672">=</span> <span style="color:#66d9ef">OLD</span>.serial <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">END</span> <span style="color:#66d9ef">IF</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">RETURN</span> <span style="color:#66d9ef">NEW</span>;
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">END</span>
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">$$</span> <span style="color:#66d9ef">LANGUAGE</span> plpgsql;
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">CREATE</span> <span style="color:#66d9ef">OR</span> <span style="color:#66d9ef">REPLACE</span> <span style="color:#66d9ef">FUNCTION</span> dns_resources_increment_dns_zones_serial_func () <span style="color:#66d9ef">RETURNS</span> <span style="color:#66d9ef">TRIGGER</span> <span style="color:#66d9ef">AS</span> <span style="color:#960050;background-color:#1e0010">$$</span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">DECLARE</span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">BEGIN</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">IF</span> (TG_OP <span style="color:#f92672">=</span> <span style="color:#e6db74">&#39;INSERT&#39;</span> <span style="color:#66d9ef">OR</span> TG_OP <span style="color:#f92672">=</span> <span style="color:#e6db74">&#39;UPDATE&#39;</span>) <span style="color:#66d9ef">THEN</span>
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">UPDATE</span> dns_zones <span style="color:#66d9ef">SET</span> serial<span style="color:#f92672">=</span>serial<span style="color:#f92672">+</span><span style="color:#ae81ff">1</span> <span style="color:#66d9ef">WHERE</span> id<span style="color:#f92672">=</span><span style="color:#66d9ef">NEW</span>.dns_zone_id;
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">RETURN</span> <span style="color:#66d9ef">NEW</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">ELSIF</span> (TG_OP <span style="color:#f92672">=</span> <span style="color:#e6db74">&#39;DELETE&#39;</span>) <span style="color:#66d9ef">THEN</span>
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">UPDATE</span> dns_zones <span style="color:#66d9ef">SET</span> serial<span style="color:#f92672">=</span>serial<span style="color:#f92672">+</span><span style="color:#ae81ff">1</span> <span style="color:#66d9ef">WHERE</span> id<span style="color:#f92672">=</span><span style="color:#66d9ef">OLD</span>.dns_zone_id;
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">RETURN</span> <span style="color:#66d9ef">OLD</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">END</span> <span style="color:#66d9ef">IF</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">RETURN</span> <span style="color:#66d9ef">NULL</span>;
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">END</span>
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">$$</span> <span style="color:#66d9ef">LANGUAGE</span> plpgsql;
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">CREATE</span> <span style="color:#66d9ef">TRIGGER</span> dns_zones_update_increment_serial_trigger
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">BEFORE</span> <span style="color:#66d9ef">UPDATE</span> <span style="color:#66d9ef">ON</span> dns_zones
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">FOR</span> <span style="color:#66d9ef">EACH</span> <span style="color:#66d9ef">ROW</span> <span style="color:#66d9ef">EXECUTE</span> <span style="color:#66d9ef">PROCEDURE</span>
</span></span><span style="display:flex;"><span>    dns_zones_update_increment_serial_func();
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">CREATE</span> <span style="color:#66d9ef">TRIGGER</span> dns_resources_increment_dns_zones_serial_trigger
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">AFTER</span> <span style="color:#66d9ef">INSERT</span> <span style="color:#66d9ef">OR</span> <span style="color:#66d9ef">UPDATE</span> <span style="color:#66d9ef">OR</span> <span style="color:#66d9ef">DELETE</span> <span style="color:#66d9ef">ON</span> dns_resources
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">FOR</span> <span style="color:#66d9ef">EACH</span> <span style="color:#66d9ef">ROW</span> <span style="color:#66d9ef">EXECUTE</span> <span style="color:#66d9ef">PROCEDURE</span>
</span></span><span style="display:flex;"><span>    dns_resources_increment_dns_zones_serial_func();
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">CREATE</span> <span style="color:#66d9ef">OR</span> <span style="color:#66d9ef">REPLACE</span> <span style="color:#66d9ef">FUNCTION</span> dns_zones_powerdns_func () <span style="color:#66d9ef">RETURNS</span> <span style="color:#66d9ef">TRIGGER</span> <span style="color:#66d9ef">AS</span> <span style="color:#960050;background-color:#1e0010">$$</span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">DECLARE</span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">BEGIN</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">IF</span> (TG_OP <span style="color:#f92672">=</span> <span style="color:#e6db74">&#39;INSERT&#39;</span>) <span style="color:#66d9ef">THEN</span>
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">INSERT</span> <span style="color:#66d9ef">INTO</span> pdns.domains (id, name, <span style="color:#66d9ef">type</span>) <span style="color:#66d9ef">VALUES</span> (<span style="color:#66d9ef">NEW</span>.id, <span style="color:#66d9ef">NEW</span>.origin, <span style="color:#e6db74">&#39;MASTER&#39;</span>);
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">INSERT</span> <span style="color:#66d9ef">INTO</span> pdns.records (domain_id, name, <span style="color:#66d9ef">type</span>, content, ttl) <span style="color:#66d9ef">VALUES</span> (<span style="color:#66d9ef">NEW</span>.id, <span style="color:#66d9ef">NEW</span>.origin, <span style="color:#e6db74">&#39;SOA&#39;</span>,
</span></span><span style="display:flex;"><span>        (<span style="color:#66d9ef">NEW</span>.ns <span style="color:#f92672">||</span> <span style="color:#e6db74">&#39; &#39;</span> <span style="color:#f92672">||</span> <span style="color:#66d9ef">NEW</span>.mbox <span style="color:#f92672">||</span> <span style="color:#e6db74">&#39; &#39;</span> <span style="color:#f92672">||</span> <span style="color:#66d9ef">NEW</span>.serial <span style="color:#f92672">||</span> <span style="color:#e6db74">&#39; &#39;</span> <span style="color:#f92672">||</span> <span style="color:#66d9ef">NEW</span>.refresh <span style="color:#f92672">||</span> <span style="color:#e6db74">&#39; &#39;</span> <span style="color:#f92672">||</span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">NEW</span>.retry <span style="color:#f92672">||</span> <span style="color:#e6db74">&#39; &#39;</span> <span style="color:#f92672">||</span> <span style="color:#66d9ef">NEW</span>.expire <span style="color:#f92672">||</span> <span style="color:#e6db74">&#39; &#39;</span> <span style="color:#f92672">||</span> <span style="color:#66d9ef">NEW</span>.ttl), <span style="color:#66d9ef">NEW</span>.ttl);
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">RETURN</span> <span style="color:#66d9ef">NEW</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">ELSIF</span> (TG_OP <span style="color:#f92672">=</span> <span style="color:#e6db74">&#39;UPDATE&#39;</span>) <span style="color:#66d9ef">THEN</span>
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">IF</span> (<span style="color:#66d9ef">NEW</span>.origin <span style="color:#f92672">&lt;&gt;</span> <span style="color:#66d9ef">OLD</span>.origin) <span style="color:#66d9ef">THEN</span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">UPDATE</span> pdns.domains <span style="color:#66d9ef">SET</span> name<span style="color:#f92672">=</span><span style="color:#66d9ef">NEW</span>.origin <span style="color:#66d9ef">WHERE</span> id<span style="color:#f92672">=</span><span style="color:#66d9ef">NEW</span>.id;
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">UPDATE</span> pdns.records <span style="color:#66d9ef">SET</span> name<span style="color:#f92672">=</span><span style="color:#66d9ef">NEW</span>.origin <span style="color:#66d9ef">WHERE</span> domain_id<span style="color:#f92672">=</span><span style="color:#66d9ef">NEW</span>.id <span style="color:#66d9ef">AND</span> <span style="color:#66d9ef">type</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#39;SOA&#39;</span>;
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">END</span> <span style="color:#66d9ef">IF</span>;
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">IF</span> (<span style="color:#66d9ef">NEW</span>.ns <span style="color:#f92672">&lt;&gt;</span> <span style="color:#66d9ef">OLD</span>.ns <span style="color:#66d9ef">OR</span>
</span></span><span style="display:flex;"><span>          <span style="color:#66d9ef">NEW</span>.mbox <span style="color:#f92672">&lt;&gt;</span> <span style="color:#66d9ef">OLD</span>.mbox <span style="color:#66d9ef">OR</span>
</span></span><span style="display:flex;"><span>          <span style="color:#66d9ef">NEW</span>.serial <span style="color:#f92672">&lt;&gt;</span> <span style="color:#66d9ef">OLD</span>.serial <span style="color:#66d9ef">OR</span>
</span></span><span style="display:flex;"><span>          <span style="color:#66d9ef">NEW</span>.refresh <span style="color:#f92672">&lt;&gt;</span> <span style="color:#66d9ef">OLD</span>.refresh <span style="color:#66d9ef">OR</span>
</span></span><span style="display:flex;"><span>          <span style="color:#66d9ef">NEW</span>.retry <span style="color:#f92672">&lt;&gt;</span> <span style="color:#66d9ef">OLD</span>.retry <span style="color:#66d9ef">OR</span>
</span></span><span style="display:flex;"><span>          <span style="color:#66d9ef">NEW</span>.expire <span style="color:#f92672">&lt;&gt;</span> <span style="color:#66d9ef">OLD</span>.expire <span style="color:#66d9ef">OR</span>
</span></span><span style="display:flex;"><span>          <span style="color:#66d9ef">NEW</span>.ttl <span style="color:#f92672">&lt;&gt;</span> <span style="color:#66d9ef">OLD</span>.ttl) <span style="color:#66d9ef">THEN</span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">UPDATE</span> pdns.records <span style="color:#66d9ef">SET</span> content<span style="color:#f92672">=</span>(<span style="color:#66d9ef">NEW</span>.ns <span style="color:#f92672">||</span> <span style="color:#e6db74">&#39; &#39;</span> <span style="color:#f92672">||</span>
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">NEW</span>.mbox <span style="color:#f92672">||</span> <span style="color:#e6db74">&#39; &#39;</span> <span style="color:#f92672">||</span> <span style="color:#66d9ef">NEW</span>.serial <span style="color:#f92672">||</span> <span style="color:#e6db74">&#39; &#39;</span> <span style="color:#f92672">||</span> <span style="color:#66d9ef">NEW</span>.refresh <span style="color:#f92672">||</span> <span style="color:#e6db74">&#39; &#39;</span> <span style="color:#f92672">||</span>
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">NEW</span>.retry <span style="color:#f92672">||</span> <span style="color:#e6db74">&#39; &#39;</span> <span style="color:#f92672">||</span> <span style="color:#66d9ef">NEW</span>.expire <span style="color:#f92672">||</span> <span style="color:#e6db74">&#39; &#39;</span> <span style="color:#f92672">||</span> <span style="color:#66d9ef">NEW</span>.ttl),
</span></span><span style="display:flex;"><span>            ttl<span style="color:#f92672">=</span><span style="color:#66d9ef">NEW</span>.ttl
</span></span><span style="display:flex;"><span>          <span style="color:#66d9ef">WHERE</span> domain_id<span style="color:#f92672">=</span><span style="color:#66d9ef">NEW</span>.id <span style="color:#66d9ef">AND</span> <span style="color:#66d9ef">type</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#39;SOA&#39;</span>;
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">END</span> <span style="color:#66d9ef">IF</span>;
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">RETURN</span> <span style="color:#66d9ef">NEW</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">ELSIF</span> (TG_OP <span style="color:#f92672">=</span> <span style="color:#e6db74">&#39;DELETE&#39;</span>) <span style="color:#66d9ef">THEN</span>
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">DELETE</span> <span style="color:#66d9ef">FROM</span> pdns.domains <span style="color:#66d9ef">WHERE</span> id<span style="color:#f92672">=</span><span style="color:#66d9ef">OLD</span>.id;
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">RETURN</span> <span style="color:#66d9ef">OLD</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">END</span> <span style="color:#66d9ef">IF</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">RETURN</span> <span style="color:#66d9ef">NULL</span>;
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">END</span>
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">$$</span> <span style="color:#66d9ef">LANGUAGE</span> plpgsql;
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">CREATE</span> <span style="color:#66d9ef">OR</span> <span style="color:#66d9ef">REPLACE</span> <span style="color:#66d9ef">FUNCTION</span> dns_resources_powerdns_func () <span style="color:#66d9ef">RETURNS</span> <span style="color:#66d9ef">TRIGGER</span> <span style="color:#66d9ef">AS</span> <span style="color:#960050;background-color:#1e0010">$$</span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">DECLARE</span>
</span></span><span style="display:flex;"><span>    origin_l VARCHAR(<span style="color:#ae81ff">255</span>);
</span></span><span style="display:flex;"><span>    type_l pdns.RECORD_TYPE;
</span></span><span style="display:flex;"><span>    ttl_l INT4;
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">BEGIN</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">IF</span> (TG_OP <span style="color:#f92672">=</span> <span style="color:#e6db74">&#39;DELETE&#39;</span>) <span style="color:#66d9ef">THEN</span>
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">DELETE</span> <span style="color:#66d9ef">FROM</span> pdns.records <span style="color:#66d9ef">WHERE</span> ref_id<span style="color:#f92672">=</span><span style="color:#66d9ef">OLD</span>.id;
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">RETURN</span> <span style="color:#66d9ef">OLD</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">END</span> <span style="color:#66d9ef">IF</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">IF</span> (<span style="color:#66d9ef">NEW</span>.ttl <span style="color:#66d9ef">IS</span> <span style="color:#66d9ef">NULL</span>) <span style="color:#66d9ef">THEN</span>
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">SELECT</span> ttl <span style="color:#66d9ef">INTO</span> ttl_l <span style="color:#66d9ef">FROM</span> dns_zones <span style="color:#66d9ef">WHERE</span> id<span style="color:#f92672">=</span><span style="color:#66d9ef">NEW</span>.dns_zone_id;
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">ELSE</span>
</span></span><span style="display:flex;"><span>      ttl_l :<span style="color:#f92672">=</span> <span style="color:#66d9ef">NEW</span>.ttl;
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">END</span> <span style="color:#66d9ef">IF</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">IF</span> (TG_OP <span style="color:#f92672">=</span> <span style="color:#e6db74">&#39;INSERT&#39;</span>) <span style="color:#66d9ef">THEN</span>
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">SELECT</span> origin <span style="color:#66d9ef">INTO</span> origin_l <span style="color:#66d9ef">FROM</span> dns_zones <span style="color:#66d9ef">WHERE</span> id<span style="color:#f92672">=</span><span style="color:#66d9ef">NEW</span>.dns_zone_id;
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">SELECT</span> name <span style="color:#66d9ef">INTO</span> type_l <span style="color:#66d9ef">FROM</span> dns_resource_types <span style="color:#66d9ef">WHERE</span> id<span style="color:#f92672">=</span><span style="color:#66d9ef">NEW</span>.dns_resource_type_id;
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">INSERT</span> <span style="color:#66d9ef">INTO</span> pdns.records (domain_id, name, <span style="color:#66d9ef">type</span>, content, ttl, prio, ref_id) <span style="color:#66d9ef">VALUES</span>
</span></span><span style="display:flex;"><span>        (<span style="color:#66d9ef">NEW</span>.dns_zone_id, concat_hosts_func(<span style="color:#66d9ef">NEW</span>.name, origin_l), type_l,
</span></span><span style="display:flex;"><span>         <span style="color:#66d9ef">NEW</span>.<span style="color:#66d9ef">data</span>, ttl_l, <span style="color:#66d9ef">NEW</span>.aux, <span style="color:#66d9ef">NEW</span>.id);
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">RETURN</span> <span style="color:#66d9ef">NEW</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">ELSIF</span> (TG_OP <span style="color:#f92672">=</span> <span style="color:#e6db74">&#39;UPDATE&#39;</span>) <span style="color:#66d9ef">THEN</span>
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">SELECT</span> origin <span style="color:#66d9ef">INTO</span> origin_l <span style="color:#66d9ef">FROM</span> dns_zones <span style="color:#66d9ef">WHERE</span> id<span style="color:#f92672">=</span><span style="color:#66d9ef">NEW</span>.dns_zone_id;
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">SELECT</span> name <span style="color:#66d9ef">INTO</span> type_l <span style="color:#66d9ef">FROM</span> dns_resource_types <span style="color:#66d9ef">WHERE</span> id<span style="color:#f92672">=</span><span style="color:#66d9ef">NEW</span>.dns_resource_type_id;
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">UPDATE</span> pdns.records <span style="color:#66d9ef">SET</span> domain_id<span style="color:#f92672">=</span><span style="color:#66d9ef">NEW</span>.dns_zone_id,
</span></span><span style="display:flex;"><span>        name<span style="color:#f92672">=</span>concat_hosts_func(<span style="color:#66d9ef">NEW</span>.name, origin_l), <span style="color:#66d9ef">type</span><span style="color:#f92672">=</span>type_l,
</span></span><span style="display:flex;"><span>        content<span style="color:#f92672">=</span><span style="color:#66d9ef">NEW</span>.<span style="color:#66d9ef">data</span>, ttl<span style="color:#f92672">=</span>ttl_l, prio<span style="color:#f92672">=</span><span style="color:#66d9ef">NEW</span>.aux <span style="color:#66d9ef">WHERE</span> ref_id<span style="color:#f92672">=</span><span style="color:#66d9ef">NEW</span>.id;
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">RETURN</span> <span style="color:#66d9ef">NEW</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">END</span> <span style="color:#66d9ef">IF</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">RETURN</span> <span style="color:#66d9ef">NULL</span>;
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">END</span>
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">$$</span> <span style="color:#66d9ef">LANGUAGE</span> plpgsql;
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">CREATE</span> <span style="color:#66d9ef">TRIGGER</span> dns_zones_powerdns_trigger
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">AFTER</span> <span style="color:#66d9ef">INSERT</span> <span style="color:#66d9ef">OR</span> <span style="color:#66d9ef">UPDATE</span> <span style="color:#66d9ef">OR</span> <span style="color:#66d9ef">DELETE</span> <span style="color:#66d9ef">ON</span> dns_zones
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">FOR</span> <span style="color:#66d9ef">EACH</span> <span style="color:#66d9ef">ROW</span> <span style="color:#66d9ef">EXECUTE</span> <span style="color:#66d9ef">PROCEDURE</span>
</span></span><span style="display:flex;"><span>    dns_zones_powerdns_func();
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">CREATE</span> <span style="color:#66d9ef">TRIGGER</span> dns_resources_powerdns_trigger
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">AFTER</span> <span style="color:#66d9ef">INSERT</span> <span style="color:#66d9ef">OR</span> <span style="color:#66d9ef">UPDATE</span> <span style="color:#66d9ef">OR</span> <span style="color:#66d9ef">DELETE</span> <span style="color:#66d9ef">ON</span> dns_resources
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">FOR</span> <span style="color:#66d9ef">EACH</span> <span style="color:#66d9ef">ROW</span> <span style="color:#66d9ef">EXECUTE</span> <span style="color:#66d9ef">PROCEDURE</span>
</span></span><span style="display:flex;"><span>    dns_resources_powerdns_func();
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>Własności relacji (test renderowania LaTeX’a)</title>
      <link>https://cynar.ski/2008/10/26/wlasnosci-relacji-test-renderowania-latexa/</link>
      <pubDate>Sun, 26 Oct 2008 01:12:01 +0000</pubDate>
      <guid>https://cynar.ski/2008/10/26/wlasnosci-relacji-test-renderowania-latexa/</guid>
      <description>&lt;p&gt;Ciekawe czy zadziała ? (pobawmy się, renderowanie chwile trwa niestety.)&lt;/p&gt;
&lt;p&gt;Własności relacji:
Relacja zwrotna:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;\forall x \in A  \qquad  xRx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Relacja przeciwzwrotna:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;\forall x \in A  \qquad   x\not Rx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Relacja symetryczna:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;xRy \Rightarrow yRx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Relacja przeciwsymetryczna:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;xRy \Rightarrow y\not Rx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Relacja antysymetryczna:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;xRy \cap yRx \Rightarrow x=y
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(xRy \cap y\neq x \Rightarrow y \not Rx)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Relacja przechodnia:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;xRy \cap yRz \Rightarrow xRz
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jak widać działa, oczywiście nie wszystko dokładnie tak jak chcemy bo znaki negacji są przesunięte, ale tak czy inaczej można pisać wzory na stronie w prosty sposób i to jest bardzo miła funkcjonalność.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Ciekawe czy zadziała ? (pobawmy się, renderowanie chwile trwa niestety.)</p>
<p>Własności relacji:
Relacja zwrotna:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>\forall x \in A  \qquad  xRx
</span></span></code></pre></div><p>Relacja przeciwzwrotna:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>\forall x \in A  \qquad   x\not Rx
</span></span></code></pre></div><p>Relacja symetryczna:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>xRy \Rightarrow yRx
</span></span></code></pre></div><p>Relacja przeciwsymetryczna:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>xRy \Rightarrow y\not Rx
</span></span></code></pre></div><p>Relacja antysymetryczna:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>xRy \cap yRx \Rightarrow x=y
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>(xRy \cap y\neq x \Rightarrow y \not Rx)
</span></span></code></pre></div><p>Relacja przechodnia:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>xRy \cap yRz \Rightarrow xRz
</span></span></code></pre></div><p>Jak widać działa, oczywiście nie wszystko dokładnie tak jak chcemy bo znaki negacji są przesunięte, ale tak czy inaczej można pisać wzory na stronie w prosty sposób i to jest bardzo miła funkcjonalność.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Kryzys ?</title>
      <link>https://cynar.ski/2008/10/24/34/</link>
      <pubDate>Fri, 24 Oct 2008 13:20:22 +0000</pubDate>
      <guid>https://cynar.ski/2008/10/24/34/</guid>
      <description>&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;http://www.kaltoons.com/zencart/images/Book!%20Buy!%20Sell!%20Sell%20sm.jpg&#34;&gt;.&lt;/p&gt;
&lt;p&gt;Dość trafne :))&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><img loading="lazy" src="http://www.kaltoons.com/zencart/images/Book!%20Buy!%20Sell!%20Sell%20sm.jpg">.</p>
<p>Dość trafne :))</p>
]]></content:encoded>
    </item>
    <item>
      <title>Tacy jesteśmy ?</title>
      <link>https://cynar.ski/2008/09/30/tacy-jestesmy/</link>
      <pubDate>Tue, 30 Sep 2008 14:11:49 +0000</pubDate>
      <guid>https://cynar.ski/2008/09/30/tacy-jestesmy/</guid>
      <description>&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://cynar.ski/4chanvenndiagramme4.gif&#34;&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><img loading="lazy" src="/4chanvenndiagramme4.gif"></p>
]]></content:encoded>
    </item>
    <item>
      <title>Perl – readresacja w DHCP</title>
      <link>https://cynar.ski/2008/09/16/perl-readresacja-w-dhcp/</link>
      <pubDate>Tue, 16 Sep 2008 02:15:25 +0000</pubDate>
      <guid>https://cynar.ski/2008/09/16/perl-readresacja-w-dhcp/</guid>
      <description>&lt;p&gt;Prosty skrypt, który readresuje wpisy w DHCP:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-perl&#34; data-lang=&#34;perl&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#!/usr/bin/perl&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#  readresor.pl&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#  Created by  on 2008-09-15.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;use&lt;/span&gt; Socket;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;sub&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ip2ipn&lt;/span&gt; { &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; unpack &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;N&amp;#39;&lt;/span&gt;, inet_aton(shift); }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;sub&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ipn2ip&lt;/span&gt; { &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; inet_ntoa( pack &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;N&amp;#39;&lt;/span&gt;, shift ); }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;my&lt;/span&gt; $FILE;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;my&lt;/span&gt; $err &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;($ARGV[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;eq&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;) { $err &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;; &lt;span style=&#34;color:#66d9ef&#34;&gt;print&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;qq(Brak pliku wejsciowego \n)&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;($ARGV[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;eq&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;) { $err &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;; &lt;span style=&#34;color:#66d9ef&#34;&gt;print&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;qq(Brak pierwszego adresu ip \n)&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;($ARGV[&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;eq&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;) { $err &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;; &lt;span style=&#34;color:#66d9ef&#34;&gt;print&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;qq(Brak typu 1 - increment 2 - decrement \n)&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;($err &lt;span style=&#34;color:#f92672&#34;&gt;eq&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;print&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;qq(Usage: \n \t readresor.pl   \n\n\n)&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	open(FILE, $ARGV[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	$first_ip &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; $ARGV[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	$ipn &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; ip2ipn($first_ip);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;/^(.+)(fixed-address)(.+)(;)/&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			$ip &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; ipn2ip($ipn);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#66d9ef&#34;&gt;print&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;qq(\t\tfixed-address $ip \n)&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;($ARGV[&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;eq&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;1&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				$ipn&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#66d9ef&#34;&gt;elsif&lt;/span&gt;($ARGV[&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;eq&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;2&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				$ipn&lt;span style=&#34;color:#f92672&#34;&gt;--&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#66d9ef&#34;&gt;print&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;qq($_)&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;print&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;qq(\n)&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Smacznego.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Prosty skrypt, który readresuje wpisy w DHCP:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-perl" data-lang="perl"><span style="display:flex;"><span><span style="color:#75715e">#!/usr/bin/perl</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">#</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">#  readresor.pl</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">#</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">#  Created by  on 2008-09-15.</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">#</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">use</span> Socket;
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">sub</span> <span style="color:#a6e22e">ip2ipn</span> { <span style="color:#66d9ef">return</span> unpack <span style="color:#e6db74">&#39;N&#39;</span>, inet_aton(shift); }
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">sub</span> <span style="color:#a6e22e">ipn2ip</span> { <span style="color:#66d9ef">return</span> inet_ntoa( pack <span style="color:#e6db74">&#39;N&#39;</span>, shift ); }
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">my</span> $FILE;
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">my</span> $err <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">if</span>($ARGV[<span style="color:#ae81ff">0</span>] <span style="color:#f92672">eq</span> <span style="color:#e6db74">&#39;&#39;</span>) { $err <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>; <span style="color:#66d9ef">print</span> <span style="color:#e6db74">qq(Brak pliku wejsciowego \n)</span>; }
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">if</span>($ARGV[<span style="color:#ae81ff">1</span>] <span style="color:#f92672">eq</span> <span style="color:#e6db74">&#39;&#39;</span>) { $err <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>; <span style="color:#66d9ef">print</span> <span style="color:#e6db74">qq(Brak pierwszego adresu ip \n)</span>; }
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">if</span>($ARGV[<span style="color:#ae81ff">2</span>] <span style="color:#f92672">eq</span> <span style="color:#e6db74">&#39;&#39;</span>) { $err <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>; <span style="color:#66d9ef">print</span> <span style="color:#e6db74">qq(Brak typu 1 - increment 2 - decrement \n)</span>; }
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">if</span>($err <span style="color:#f92672">eq</span> <span style="color:#ae81ff">1</span>)
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">print</span> <span style="color:#e6db74">qq(Usage: \n \t readresor.pl   \n\n\n)</span>;
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">else</span>
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>	open(FILE, $ARGV[<span style="color:#ae81ff">0</span>]);
</span></span><span style="display:flex;"><span>	$first_ip <span style="color:#f92672">=</span> $ARGV[<span style="color:#ae81ff">1</span>];
</span></span><span style="display:flex;"><span>	$ipn <span style="color:#f92672">=</span> ip2ipn($first_ip);
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">while</span>()
</span></span><span style="display:flex;"><span>	{
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">if</span>(<span style="color:#e6db74">/^(.+)(fixed-address)(.+)(;)/</span>)
</span></span><span style="display:flex;"><span>		{
</span></span><span style="display:flex;"><span>			$ip <span style="color:#f92672">=</span> ipn2ip($ipn);
</span></span><span style="display:flex;"><span>			<span style="color:#66d9ef">print</span> <span style="color:#e6db74">qq(\t\tfixed-address $ip \n)</span>;
</span></span><span style="display:flex;"><span>			<span style="color:#66d9ef">if</span>($ARGV[<span style="color:#ae81ff">2</span>] <span style="color:#f92672">eq</span> <span style="color:#e6db74">&#34;1&#34;</span>)
</span></span><span style="display:flex;"><span>			{
</span></span><span style="display:flex;"><span>				$ipn<span style="color:#f92672">++</span>;
</span></span><span style="display:flex;"><span>			}
</span></span><span style="display:flex;"><span>			<span style="color:#66d9ef">elsif</span>($ARGV[<span style="color:#ae81ff">2</span>] <span style="color:#f92672">eq</span> <span style="color:#e6db74">&#34;2&#34;</span>)
</span></span><span style="display:flex;"><span>			{
</span></span><span style="display:flex;"><span>				$ipn<span style="color:#f92672">--</span>;
</span></span><span style="display:flex;"><span>			}
</span></span><span style="display:flex;"><span>		}
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">else</span>
</span></span><span style="display:flex;"><span>		{
</span></span><span style="display:flex;"><span>			<span style="color:#66d9ef">print</span> <span style="color:#e6db74">qq($_)</span>;
</span></span><span style="display:flex;"><span>		}
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">print</span> <span style="color:#e6db74">qq(\n)</span>;
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>Smacznego.</p>
]]></content:encoded>
    </item>
    <item>
      <title>OpenID - opanowanie chaosu.</title>
      <link>https://cynar.ski/2008/09/04/openid-opanowanie-chaosu/</link>
      <pubDate>Thu, 04 Sep 2008 21:35:44 +0000</pubDate>
      <guid>https://cynar.ski/2008/09/04/openid-opanowanie-chaosu/</guid>
      <description>&lt;p&gt;Jak już pisałem na tym blogu OpenID już działa, chcąc iść za ciosem stwierdziłem, że dobrze by było wykorzystać technologię w innych usługach, które wykorzystuje na codzień.&lt;/p&gt;
&lt;p&gt;Największym problemem, jest aktualnie utrzymanie listy użytkowników &lt;strong&gt;trac&amp;rsquo;ów&lt;/strong&gt; jakie prowadzę, więc czemu by nie wymusić na użytkownikach posiadania OpenID aby z nich korzystali ?&lt;/p&gt;
&lt;p&gt;Na &lt;a href=&#34;http://trac-hacks.org/&#34; title=&#34;TracHacks&#34;&gt;TracHacks&lt;/a&gt; znalazłem &lt;a href=&#34;http://trac-hacks.org/wiki/OpenidPlugin&#34; title=&#34;OpenIDPlugin&#34;&gt;OpenIDPlugin&lt;/a&gt; wymaga on &lt;strong&gt;OpenID library&lt;/strong&gt;. Na razie walczę z nim, o postępach niechybnie napiszę (o ile nie pozwoli na to czas).&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Jak już pisałem na tym blogu OpenID już działa, chcąc iść za ciosem stwierdziłem, że dobrze by było wykorzystać technologię w innych usługach, które wykorzystuje na codzień.</p>
<p>Największym problemem, jest aktualnie utrzymanie listy użytkowników <strong>trac&rsquo;ów</strong> jakie prowadzę, więc czemu by nie wymusić na użytkownikach posiadania OpenID aby z nich korzystali ?</p>
<p>Na <a href="http://trac-hacks.org/" title="TracHacks">TracHacks</a> znalazłem <a href="http://trac-hacks.org/wiki/OpenidPlugin" title="OpenIDPlugin">OpenIDPlugin</a> wymaga on <strong>OpenID library</strong>. Na razie walczę z nim, o postępach niechybnie napiszę (o ile nie pozwoli na to czas).</p>
]]></content:encoded>
    </item>
    <item>
      <title>OpenID</title>
      <link>https://cynar.ski/2008/09/04/openid/</link>
      <pubDate>Thu, 04 Sep 2008 20:57:31 +0000</pubDate>
      <guid>https://cynar.ski/2008/09/04/openid/</guid>
      <description>&lt;p&gt;W chwili wolnego czasu i przypływie nastroju w blogu dostępna już jest autoryzacja OpenID.&lt;/p&gt;
&lt;p&gt;Smacznego ;)&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>W chwili wolnego czasu i przypływie nastroju w blogu dostępna już jest autoryzacja OpenID.</p>
<p>Smacznego ;)</p>
]]></content:encoded>
    </item>
    <item>
      <title>Upgrade WP.</title>
      <link>https://cynar.ski/2008/07/27/upgrade-wp/</link>
      <pubDate>Sun, 27 Jul 2008 20:45:48 +0000</pubDate>
      <guid>https://cynar.ski/2008/07/27/upgrade-wp/</guid>
      <description>&lt;p&gt;Postanowiłem dokonać aktualizacji WP, wszystko poszło by fajnie gdyby nie &lt;a href=&#34;http://www.hardened-php.net/&#34;&gt;suhoshin&lt;/a&gt;, parę zmian w kodzie i TARA :) działa :D&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Postanowiłem dokonać aktualizacji WP, wszystko poszło by fajnie gdyby nie <a href="http://www.hardened-php.net/">suhoshin</a>, parę zmian w kodzie i TARA :) działa :D</p>
]]></content:encoded>
    </item>
    <item>
      <title>Nowy TrueCrypt</title>
      <link>https://cynar.ski/2008/07/11/nowy-truecrypt/</link>
      <pubDate>Fri, 11 Jul 2008 01:57:17 +0000</pubDate>
      <guid>https://cynar.ski/2008/07/11/nowy-truecrypt/</guid>
      <description>&lt;p&gt;Jeżeli nie znacie jeszcze narzędzia &lt;a href=&#34;http://www.truecrypt.org/&#34;&gt;TrueCrypt&lt;/a&gt; to warto poznać. W nowej wersji 6.0a już jest naprawdę warte zainteresowania, nie dość że działa na OSX&amp;rsquo;ach, Linuxach i Windowsach to pozwala na:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;tworzenie partycji&lt;/li&gt;
&lt;li&gt;tworzenie ukrytych partycji&lt;/li&gt;
&lt;li&gt;tworzenie plikopartycji&lt;/li&gt;
&lt;li&gt;ukrywanie i kodowanie istniejących partycji&lt;/li&gt;
&lt;li&gt;kryptowanie on-fly&lt;/li&gt;
&lt;li&gt;nowa wersja obsługuje wiele procesorów&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Oczywiście jak sama nazwa programu wskazuje partycje są kodowane, soft ma spory wybór algorytmów kryptowania, między innymi &lt;strong&gt;AES&lt;/strong&gt;, &lt;strong&gt;Serpent&lt;/strong&gt;, &lt;strong&gt;Twofish&lt;/strong&gt; i wariacje. Prosty interface pozwala na używanie go nawet przez osoby nie będące &amp;ldquo;zaklikanymi&amp;rdquo;, mama, tata i pies powini sobie z nim poradzić. Dobra dokumentacja projektu też jest godna polecenia, licencja pozwala na korzytanie z jego możliwości za darmo dla użytku prywatnego jak i komercyjnego.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Jeżeli nie znacie jeszcze narzędzia <a href="http://www.truecrypt.org/">TrueCrypt</a> to warto poznać. W nowej wersji 6.0a już jest naprawdę warte zainteresowania, nie dość że działa na OSX&rsquo;ach, Linuxach i Windowsach to pozwala na:</p>
<ul>
<li>tworzenie partycji</li>
<li>tworzenie ukrytych partycji</li>
<li>tworzenie plikopartycji</li>
<li>ukrywanie i kodowanie istniejących partycji</li>
<li>kryptowanie on-fly</li>
<li>nowa wersja obsługuje wiele procesorów</li>
</ul>
<p>Oczywiście jak sama nazwa programu wskazuje partycje są kodowane, soft ma spory wybór algorytmów kryptowania, między innymi <strong>AES</strong>, <strong>Serpent</strong>, <strong>Twofish</strong> i wariacje. Prosty interface pozwala na używanie go nawet przez osoby nie będące &ldquo;zaklikanymi&rdquo;, mama, tata i pies powini sobie z nim poradzić. Dobra dokumentacja projektu też jest godna polecenia, licencja pozwala na korzytanie z jego możliwości za darmo dla użytku prywatnego jak i komercyjnego.</p>
<p>Co tu dużo więcej pisać, po prostu zapoznać się z możliwościami i ściągnąć.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Dlaczego tak? </title>
      <link>https://cynar.ski/dlaczego-tak/</link>
      <pubDate>Fri, 11 Jul 2008 00:15:13 +0000</pubDate>
      <guid>https://cynar.ski/dlaczego-tak/</guid>
      <description>&lt;p&gt;&amp;ldquo;My brain is my enemy&amp;hellip;&amp;rdquo; dlaczego tak?&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://cynar.ski/wp-content/uploads/2008/07/cam_0047.jpg&#34;&gt;&lt;img alt=&#34;Tak Było&#34; loading=&#34;lazy&#34; src=&#34;https://cynar.ski/wp-content/uploads/2008/07/cam_0047-225x300.jpg&#34;&gt;&lt;/a&gt; Praktycznie jak każdy, dla którego praca nie jest pracą lecz hobby mam problem z rozgraniczeniem zadań czysto zawodowych (rzemieślniczych) z tymi które są czystą formą rozrywki intelektualnej. Wrogość mojego umysłu jest przyczyną zagłębiania się w błahe problemy na tyle głęboko, że urastają do miana wielkiego przedsięwzięcia, na którego wykonanie potrzeba co najmniej worka pieniędzy i godzin pracy. Oczywiście da się z tym walczyć - mój sposób jest prosty - zrobić to jak najszybciej jak się tylko da, w taki sposób, żeby wrogi umysł nie zaczął wynajdywać nowych i coraz to ciekawszych rozwiązań problemu przed którym stoi.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>&ldquo;My brain is my enemy&hellip;&rdquo; dlaczego tak?</p>
<p><a href="/wp-content/uploads/2008/07/cam_0047.jpg"><img alt="Tak Było" loading="lazy" src="/wp-content/uploads/2008/07/cam_0047-225x300.jpg"></a> Praktycznie jak każdy, dla którego praca nie jest pracą lecz hobby mam problem z rozgraniczeniem zadań czysto zawodowych (rzemieślniczych) z tymi które są czystą formą rozrywki intelektualnej. Wrogość mojego umysłu jest przyczyną zagłębiania się w błahe problemy na tyle głęboko, że urastają do miana wielkiego przedsięwzięcia, na którego wykonanie potrzeba co najmniej worka pieniędzy i godzin pracy. Oczywiście da się z tym walczyć - mój sposób jest prosty - zrobić to jak najszybciej jak się tylko da, w taki sposób, żeby wrogi umysł nie zaczął wynajdywać nowych i coraz to ciekawszych rozwiązań problemu przed którym stoi.</p>
<p><img loading="lazy" src="/wp-content/uploads/2008/07/IMG_0718-150x150.jpg"></p>
<p>&ldquo;My brain is my enemy&hellip;&rdquo; oj tak, przecież prawie za każdym razem latając nieopodal plejad i kwazarów (nie mylić proszę z &ldquo;dziećmi indigo&rdquo; i innymi &ldquo;galaktycznymi wędrowcami&rdquo;) złowrogość umysłu daje się we znaki tworząc coraz to bardziej zagmatwane konstrukcje logiczne, w sposób nieodgadniony i nieokiełznany - powstają potem tzw. &ldquo;ciemne strony pracy&rdquo;.</p>
<p>Kiedyś jak widać na załączonym obrazku kolekcjonowałem sprzęt, na każdym był inny system operacyjny, wszystko &ldquo;ładnie&rdquo; spięte w sieć - poznawałem, uczyłem się i wkręcałem - teraz jest podobnie, ale wszystko zwirtualizowane. Tylko jedno się zmieniło - na klawiaturze trzymam żyletki bo nie mam czasu na nic więcej niż pracę - zabawa niestety musiała odejść na dalszy plan. Meandry mojego rozumu dalej są jak nieprzyjaciel próbujący powiedzieć jak Daft Punk &ldquo;faster, better&hellip; &quot;</p>
<p>&quot; <strong>My brain is my enemy&hellip;</strong>&rdquo;  bo tak.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Mail.app i sqlite</title>
      <link>https://cynar.ski/2008/07/08/mailapp-i-sqlite/</link>
      <pubDate>Tue, 08 Jul 2008 08:29:29 +0000</pubDate>
      <guid>https://cynar.ski/2008/07/08/mailapp-i-sqlite/</guid>
      <description>&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Samael:Mail paramah$ ls -lah ~/Library/Mail | grep -E &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Envelope Index$&amp;#39;&lt;/span&gt; | awk &lt;span style=&#34;color:#f92672&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;print $5&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;54M
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Samael:Mail paramah$ sqlite3 Envelope&lt;span style=&#34;color:#ae81ff&#34;&gt;\ &lt;/span&gt;Index
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;SQLite version 3.4.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Enter &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;.help&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; instructions
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sqlite&amp;gt; vacuum subjects;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sqlite&amp;gt; .exit
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Samael:Mail paramah$ ls -lah ~/Library/Mail | grep -E &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Envelope Index$&amp;#39;&lt;/span&gt; | awk &lt;span style=&#34;color:#f92672&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;print $5&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;53M
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
      <content:encoded><![CDATA[<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>Samael:Mail paramah$ ls -lah ~/Library/Mail | grep -E <span style="color:#e6db74">&#39;Envelope Index$&#39;</span> | awk <span style="color:#f92672">{</span><span style="color:#e6db74">&#39;print $5&#39;</span><span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>54M
</span></span><span style="display:flex;"><span>Samael:Mail paramah$ sqlite3 Envelope<span style="color:#ae81ff">\ </span>Index
</span></span><span style="display:flex;"><span>SQLite version 3.4.0
</span></span><span style="display:flex;"><span>Enter <span style="color:#e6db74">&#34;.help&#34;</span> <span style="color:#66d9ef">for</span> instructions
</span></span><span style="display:flex;"><span>sqlite&gt; vacuum subjects;
</span></span><span style="display:flex;"><span>sqlite&gt; .exit
</span></span><span style="display:flex;"><span>Samael:Mail paramah$ ls -lah ~/Library/Mail | grep -E <span style="color:#e6db74">&#39;Envelope Index$&#39;</span> | awk <span style="color:#f92672">{</span><span style="color:#e6db74">&#39;print $5&#39;</span><span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>53M
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>SOAP, PHP i Introspekcja</title>
      <link>https://cynar.ski/2008/05/26/soap-php-i-introspekcja/</link>
      <pubDate>Mon, 26 May 2008 02:00:03 +0000</pubDate>
      <guid>https://cynar.ski/2008/05/26/soap-php-i-introspekcja/</guid>
      <description>&lt;p&gt;Tworzę ostatnio parę systemów do których potrzebny jest mechanizm RPC lub SOAP. Wertując google mój wybór padł na nieco bardziej skomplikowany SOAP głównie z faktu, że jest on natywnie wspierany prze PHP5 jest oczywiście dostępny poprzez &lt;em&gt;extensions&lt;/em&gt; tak więc wypada sprawdzić czy owe wsparcie mamy&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;extension_loaded&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;soap&amp;#39;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;HURAAA!!!&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;U mnie pokazał się zbawienny &lt;strong&gt;HURAA!!!!&lt;/strong&gt; mogłem zabrać się do pracy z &lt;strong&gt;SoapClient&lt;/strong&gt; oraz &lt;strong&gt;SoapServer&lt;/strong&gt; (w przypadku braku możliwości użycia soap extension na waszym serwerze z php proponuję projekt &lt;a href=&#34;http://sourceforge.net/projects/nusoap/&#34;&gt;NuSOAP&lt;/a&gt; o której napisano wiele, ale uprzedzam jest pisana pod kątem PHP4, jednak nie wymaga żadnych dodatkowych zewnętrznych bibliotek i też działa oferując dużo możliwości tworzenia serwerów i klientów SOAP ) do pełni szczęścia potrzebny był jeszcze jakiś tool pozwalający na szybkie generowanie &lt;strong&gt;WSDL&lt;/strong&gt; (Web Services Description Language) którego sładnia jest nieco zawiła w szczególności przy większych projektach, tutaj z pomocą przychodzą możliwości PHP5 związane z &lt;strong&gt;introspekcją&lt;/strong&gt; lub jak kto woli &lt;em&gt;reverse engineering&lt;/em&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Tworzę ostatnio parę systemów do których potrzebny jest mechanizm RPC lub SOAP. Wertując google mój wybór padł na nieco bardziej skomplikowany SOAP głównie z faktu, że jest on natywnie wspierany prze PHP5 jest oczywiście dostępny poprzez <em>extensions</em> tak więc wypada sprawdzić czy owe wsparcie mamy</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-php" data-lang="php"><span style="display:flex;"><span><span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">extension_loaded</span>(<span style="color:#e6db74">&#39;soap&#39;</span>))
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">echo</span> <span style="color:#e6db74">&#34;HURAAA!!!&#34;</span>;
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>U mnie pokazał się zbawienny <strong>HURAA!!!!</strong> mogłem zabrać się do pracy z <strong>SoapClient</strong> oraz <strong>SoapServer</strong> (w przypadku braku możliwości użycia soap extension na waszym serwerze z php proponuję projekt <a href="http://sourceforge.net/projects/nusoap/">NuSOAP</a> o której napisano wiele, ale uprzedzam jest pisana pod kątem PHP4, jednak nie wymaga żadnych dodatkowych zewnętrznych bibliotek i też działa oferując dużo możliwości tworzenia serwerów i klientów SOAP ) do pełni szczęścia potrzebny był jeszcze jakiś tool pozwalający na szybkie generowanie <strong>WSDL</strong> (Web Services Description Language) którego sładnia jest nieco zawiła w szczególności przy większych projektach, tutaj z pomocą przychodzą możliwości PHP5 związane z <strong>introspekcją</strong> lub jak kto woli <em>reverse engineering</em>.</p>
<p>Jednym z moich założeń jest serwowanie WSDL&rsquo;a z zewnętrznego źródła (czywiście z zachowaniem odpowiednich założeń polityki bezpieczeństwa, ale ten wpis nie traktuje o nich) co nieco upraszca cały proceder bo WSDL będziemy tworzyć statycznie dla usługi a nie dynamicznie jak to często jest praktykowane (patrz: NuSOAP). Mając napisaną klasę w PHP jedteśmy teoretycznie w stanie parsować pod kątem wygenerowania odpowiednich plików WSDL. Jak większość kod klas które tworze mam udokumentowany całościowo lub w najgorszym przypadku szczątkowe informacje na temat co jest co. Niestety do wygenerowania dobrych plików WSDL potrzebna będzie solidna dokumentacja klasy którą chcemy przerobić na zjadliwą dla SOAP&rsquo;a.</p>
<p>Poniższy kod nie jest moim kodem został napisany przez <a href="http://www.schlossnagle.org/~george/"><strong>George&rsquo;a Schlossnagle&rsquo;a</strong></a> , ale po małych zmianach (które wyjaśnię poniżej) jest używalny w moich warunkach.</p>
<p>Kod George&rsquo;a działa jedynie dla klas dokumentowanych za pomocą PHPDoc&rsquo;a, którego osobiście nie lubie użwać - wolę starą dobrą składnię /param używaną w Doxygen&rsquo;nie tak więc musiałem parę rzeczy zmienić.
Klasa WSDL_Gen korzysta z cudownego ficzera którym jest <strong>ReflectionClass</strong> pozwalający przemielić klasę którą otrzyma w konstruktorze pod kątem metod, typów etc&hellip;</p>
<p>Ja do swoich potrzeb zmieniłem regexpy przy <strong>var</strong>, <strong>param</strong> i <strong>return</strong> tak aby paowały do /param a nie @param i wszystko zaczęło śmigać jak należy.</p>
<p>Na sam koniec podczepiłem wszystko do systemu zdalnych bakcupów (bo do tego między innymi wykorzystuję SOAP) i wszystko zaczęło śmigać aż miło.</p>
<p>Klient:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-php" data-lang="php"><span style="display:flex;"><span>$client <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> <span style="color:#a6e22e">SoapClient</span>(<span style="color:#e6db74">&#39;http://localhost/www/1test.wsdl&#39;</span>);
</span></span><span style="display:flex;"><span>$data <span style="color:#f92672">=</span> $client<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">dbdump</span>();
</span></span><span style="display:flex;"><span>$dump <span style="color:#f92672">=</span> <span style="color:#a6e22e">base64_decode</span>($data);
</span></span><span style="display:flex;"><span>$fp<span style="color:#f92672">=</span><span style="color:#a6e22e">fopen</span>(<span style="color:#e6db74">&#39;soap_dump.sql&#39;</span>,<span style="color:#e6db74">&#34;w&#34;</span>);
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">fwrite</span>($fp,$dump);
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">fclose</span>($fp);
</span></span></code></pre></div><p>Server jeszcze banalniejszy:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-php" data-lang="php"><span style="display:flex;"><span><span style="color:#66d9ef">function</span> <span style="color:#a6e22e">dbdump</span>()
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>  $backup <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> <span style="color:#a6e22e">MySqlBackup</span>();
</span></span><span style="display:flex;"><span>  $backup <span style="color:#f92672">-&gt;</span> <span style="color:#a6e22e">list_tables</span>();
</span></span><span style="display:flex;"><span>  $backup <span style="color:#f92672">-&gt;</span> <span style="color:#a6e22e">droptableifexists</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">true</span>;
</span></span><span style="display:flex;"><span>  $buffer <span style="color:#f92672">=</span> <span style="color:#e6db74">&#39;&#39;</span>;
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">foreach</span> ($backup<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">tables</span> <span style="color:#66d9ef">as</span> $table) {
</span></span><span style="display:flex;"><span>    $buffer <span style="color:#f92672">.=</span> $backup<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">dump_table</span>($table);
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">return</span> <span style="color:#a6e22e">base64_encode</span>($buffer);
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>$server <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> <span style="color:#a6e22e">SoapServer</span>(<span style="color:#e6db74">&#34;http://localhost/www/1test.wsdl&#34;</span>);
</span></span><span style="display:flex;"><span>$server <span style="color:#f92672">-&gt;</span> <span style="color:#a6e22e">addFunction</span>(<span style="color:#e6db74">&#34;dbdump&#34;</span>);
</span></span><span style="display:flex;"><span>$server <span style="color:#f92672">-&gt;</span> <span style="color:#a6e22e">handle</span>();
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>Rekursywne wyświetlanie katalogów (PHP SPL)</title>
      <link>https://cynar.ski/2008/05/18/rekursywne-wyswietlanie-katalogow-php-spl/</link>
      <pubDate>Sun, 18 May 2008 13:40:47 +0000</pubDate>
      <guid>https://cynar.ski/2008/05/18/rekursywne-wyswietlanie-katalogow-php-spl/</guid>
      <description>&lt;p&gt;SPL to dość fajne narzędzie do implementacji szczególnie iteracji w PHP, warte poznania. Za pmocą SPL&amp;rsquo;a da się
pewne uciążliwe funkcje napisać prościej. Poniżej przykład funkcji, która wypisuje drzewo katalogów:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;DirectoryAdapter&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;RecursiveIteratorIterator&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; $dirArray;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; $path;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; __construct($path)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		$this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;path&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; $path;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#66d9ef&#34;&gt;parent&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;__construct&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;RecursiveDirectoryIterator&lt;/span&gt;($path), &lt;span style=&#34;color:#66d9ef&#34;&gt;parent&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;CHILD_FIRST&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;getDirs&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#66d9ef&#34;&gt;foreach&lt;/span&gt;($this &lt;span style=&#34;color:#66d9ef&#34;&gt;as&lt;/span&gt; $item)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;($item&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;isDir&lt;/span&gt;())
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				$current &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;count&lt;/span&gt;($this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;dirArray&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				$mtime &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;date&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Y-m-d H:m&amp;#34;&lt;/span&gt;, $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;getMTime&lt;/span&gt;());
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				$this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;dirArray&lt;/span&gt;[$current][&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;mtime&amp;#39;&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; $mtime;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				$atime &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;date&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Y-m-d H:m&amp;#34;&lt;/span&gt;, $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;getATime&lt;/span&gt;());
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				$this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;dirArray&lt;/span&gt;[$current][&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;atime&amp;#39;&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; $atime;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				$this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;dirArray&lt;/span&gt;[$current][&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;dir&amp;#39;&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;str_replace&lt;/span&gt;($this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;path&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;, $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;());
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;dirArray&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;deleteDir&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#66d9ef&#34;&gt;foreach&lt;/span&gt; ($this &lt;span style=&#34;color:#66d9ef&#34;&gt;as&lt;/span&gt; $item)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; ($item&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;isDir&lt;/span&gt;())
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#a6e22e&#34;&gt;rmdir&lt;/span&gt;($this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;());
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#a6e22e&#34;&gt;unlink&lt;/span&gt;($this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;key&lt;/span&gt;());
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#a6e22e&#34;&gt;rmdir&lt;/span&gt;($this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;path&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Wykorzystanie:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>SPL to dość fajne narzędzie do implementacji szczególnie iteracji w PHP, warte poznania. Za pmocą SPL&rsquo;a da się
pewne uciążliwe funkcje napisać prościej. Poniżej przykład funkcji, która wypisuje drzewo katalogów:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-php" data-lang="php"><span style="display:flex;"><span><span style="color:#66d9ef">class</span> <span style="color:#a6e22e">DirectoryAdapter</span> <span style="color:#66d9ef">extends</span>  <span style="color:#a6e22e">RecursiveIteratorIterator</span>
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">private</span> $dirArray;
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">private</span> $path;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">public</span> <span style="color:#66d9ef">function</span> __construct($path)
</span></span><span style="display:flex;"><span>    {
</span></span><span style="display:flex;"><span>		$this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">path</span> <span style="color:#f92672">=</span> $path;
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">parent</span><span style="color:#f92672">::</span><span style="color:#a6e22e">__construct</span>(<span style="color:#66d9ef">new</span> <span style="color:#a6e22e">RecursiveDirectoryIterator</span>($path), <span style="color:#66d9ef">parent</span><span style="color:#f92672">::</span><span style="color:#a6e22e">CHILD_FIRST</span>);
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">public</span> <span style="color:#66d9ef">function</span> <span style="color:#a6e22e">getDirs</span>()
</span></span><span style="display:flex;"><span>	{
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">foreach</span>($this <span style="color:#66d9ef">as</span> $item)
</span></span><span style="display:flex;"><span>		{
</span></span><span style="display:flex;"><span>			<span style="color:#66d9ef">if</span>($item<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">isDir</span>())
</span></span><span style="display:flex;"><span>			{
</span></span><span style="display:flex;"><span>				$current <span style="color:#f92672">=</span> <span style="color:#a6e22e">count</span>($this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">dirArray</span>);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>				$mtime <span style="color:#f92672">=</span> <span style="color:#a6e22e">date</span>(<span style="color:#e6db74">&#34;Y-m-d H:m&#34;</span>, $this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">getMTime</span>());
</span></span><span style="display:flex;"><span>				$this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">dirArray</span>[$current][<span style="color:#e6db74">&#39;mtime&#39;</span>] <span style="color:#f92672">=</span> $mtime;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>				$atime <span style="color:#f92672">=</span> <span style="color:#a6e22e">date</span>(<span style="color:#e6db74">&#34;Y-m-d H:m&#34;</span>, $this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">getATime</span>());
</span></span><span style="display:flex;"><span>				$this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">dirArray</span>[$current][<span style="color:#e6db74">&#39;atime&#39;</span>] <span style="color:#f92672">=</span> $atime;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>				$this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">dirArray</span>[$current][<span style="color:#e6db74">&#39;dir&#39;</span>] <span style="color:#f92672">=</span> <span style="color:#a6e22e">str_replace</span>($this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">path</span>,<span style="color:#e6db74">&#39;&#39;</span>, $this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">key</span>());
</span></span><span style="display:flex;"><span>			}
</span></span><span style="display:flex;"><span>		}
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">return</span> $this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">dirArray</span>;
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">public</span> <span style="color:#66d9ef">function</span> <span style="color:#a6e22e">deleteDir</span>()
</span></span><span style="display:flex;"><span>	{
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">foreach</span> ($this <span style="color:#66d9ef">as</span> $item)
</span></span><span style="display:flex;"><span>		{
</span></span><span style="display:flex;"><span>			<span style="color:#66d9ef">if</span> ($item<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">isDir</span>())
</span></span><span style="display:flex;"><span>			{
</span></span><span style="display:flex;"><span>				<span style="color:#a6e22e">rmdir</span>($this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">key</span>());
</span></span><span style="display:flex;"><span>			}
</span></span><span style="display:flex;"><span>			<span style="color:#66d9ef">else</span>
</span></span><span style="display:flex;"><span>			{
</span></span><span style="display:flex;"><span>				<span style="color:#a6e22e">unlink</span>($this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">key</span>());
</span></span><span style="display:flex;"><span>			}
</span></span><span style="display:flex;"><span>		}
</span></span><span style="display:flex;"><span>		<span style="color:#a6e22e">rmdir</span>($this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">path</span>);
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>Wykorzystanie:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-php" data-lang="php"><span style="display:flex;"><span>$path <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;/Users/paramah/test&#34;</span>;
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">if</span>(<span style="color:#a6e22e">is_Dir</span>($path))
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>	$direct <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> <span style="color:#a6e22e">DirectoryAdapter</span>($path);
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">echo</span> <span style="color:#e6db74">&#34;```&#34;</span>;
</span></span><span style="display:flex;"><span>	<span style="color:#a6e22e">print_r</span>($direct<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">getDirs</span>());
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">echo</span> <span style="color:#e6db74">&#34;&#34;</span>;
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">else</span>
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">echo</span> <span style="color:#e6db74">&#34;brak katalogu&#34;</span>;
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>Małe zmiany</title>
      <link>https://cynar.ski/2008/05/03/male-zmiany/</link>
      <pubDate>Sat, 03 May 2008 22:19:57 +0000</pubDate>
      <guid>https://cynar.ski/2008/05/03/male-zmiany/</guid>
      <description>&lt;p&gt;Jak widać małe zmiany na blogu, mniej zbędnych bajerów, prostota i przejrzystość.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Jak widać małe zmiany na blogu, mniej zbędnych bajerów, prostota i przejrzystość.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Kolorowa składnia w WP</title>
      <link>https://cynar.ski/2008/05/03/kolorowa-skladnia-w-wp/</link>
      <pubDate>Sat, 03 May 2008 20:33:01 +0000</pubDate>
      <guid>https://cynar.ski/2008/05/03/kolorowa-skladnia-w-wp/</guid>
      <description>&lt;p&gt;W technicznym blogu nie może się obyć bez kolorowania składni publikowanego w postach kodu źródłowego, po zaaplikowaniu pluginu &lt;a href=&#34;http://mediakey.dk/~cc/files/wp-codesnippet.tar.bz2&#34;&gt;Syntax Hightligh Code&lt;/a&gt; opartego na &lt;a href=&#34;http://qbnz.com/highlighter/&#34;&gt;GeSHi&lt;/a&gt; i włączeniu go w WP wszystko działa super, ogólnie polecam.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>W technicznym blogu nie może się obyć bez kolorowania składni publikowanego w postach kodu źródłowego, po zaaplikowaniu pluginu <a href="http://mediakey.dk/~cc/files/wp-codesnippet.tar.bz2">Syntax Hightligh Code</a> opartego na <a href="http://qbnz.com/highlighter/">GeSHi</a> i włączeniu go w WP wszystko działa super, ogólnie polecam.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Wiele demonów DHCP</title>
      <link>https://cynar.ski/2008/05/03/wiele-demonow-dhcp/</link>
      <pubDate>Sat, 03 May 2008 20:30:24 +0000</pubDate>
      <guid>https://cynar.ski/2008/05/03/wiele-demonow-dhcp/</guid>
      <description>&lt;p&gt;Dzisiaj pojawił się problem, jak na jednej maszynie postawić wiele demonów dhcp jako osobne procesy, tak aby każdy obsługiwał inny kawałek sieci.&lt;/p&gt;
&lt;p&gt;Rozwiązanie nader banalne (RTFM dhcpd3) :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dhcpd  &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt; -pf pid-file &lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;czyli co ? Zmieniamy pid-file i możemy sobie odpalić n instancji &lt;strong&gt;dhcpd&lt;/strong&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Dzisiaj pojawił się problem, jak na jednej maszynie postawić wiele demonów dhcp jako osobne procesy, tak aby każdy obsługiwał inny kawałek sieci.</p>
<p>Rozwiązanie nader banalne (RTFM dhcpd3) :</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>dhcpd  <span style="color:#f92672">[</span> -pf pid-file <span style="color:#f92672">]</span>
</span></span></code></pre></div><p>czyli co ? Zmieniamy pid-file i możemy sobie odpalić n instancji <strong>dhcpd</strong></p>
]]></content:encoded>
    </item>
    <item>
      <title>Trac i problem z fBSD</title>
      <link>https://cynar.ski/2008/03/12/trac-i-problem-z-fbsd/</link>
      <pubDate>Wed, 12 Mar 2008 16:01:36 +0000</pubDate>
      <guid>https://cynar.ski/2008/03/12/trac-i-problem-z-fbsd/</guid>
      <description>&lt;p&gt;Ogólnie rzecz biorąc problem występował już od jakiegoś czasu ale nigdy nie miałem chwili żeby do tego porządnie usiąść. Sam fakt debugowania python&amp;rsquo;a mnie przerażał no ale musiałem coś z tym zrobić bo jaki TRAC jest każdy widzi - czasami cholernie potrzebny ;) tak więc zabrałem się do rozgryzania problemu z segfaultem przy trac-admin, po pierwsze czekało mnie uruchomienie &lt;strong&gt;gdb&lt;/strong&gt; oto rezultat:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#75715e&#34;&gt;#0  0x285b6603 in sqlite3Fts2InitHashTable () from /usr/local/lib/libsqlite3.so.8&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;No wszystko wiadomo odpowiedzialny okazał się sqlite, aktualnie przbudować trzeba było configurację sqlite&amp;rsquo;a tak aby nie używał &lt;strong&gt;FTS2&lt;/strong&gt;, czyli Full Text Search no ok, za pomocą&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Ogólnie rzecz biorąc problem występował już od jakiegoś czasu ale nigdy nie miałem chwili żeby do tego porządnie usiąść. Sam fakt debugowania python&rsquo;a mnie przerażał no ale musiałem coś z tym zrobić bo jaki TRAC jest każdy widzi - czasami cholernie potrzebny ;) tak więc zabrałem się do rozgryzania problemu z segfaultem przy trac-admin, po pierwsze czekało mnie uruchomienie <strong>gdb</strong> oto rezultat:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>	<span style="color:#75715e">#0  0x285b6603 in sqlite3Fts2InitHashTable () from /usr/local/lib/libsqlite3.so.8</span>
</span></span></code></pre></div><p>No wszystko wiadomo odpowiedzialny okazał się sqlite, aktualnie przbudować trzeba było configurację sqlite&rsquo;a tak aby nie używał <strong>FTS2</strong>, czyli Full Text Search no ok, za pomocą</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>cd /usr/ports/databases/sqlite3/ <span style="color:#f92672">&amp;&amp;</span> make config
</span></span></code></pre></div><p>Zmieniłem co trzeba, potem tylko:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>cd /usr/ports/databases/sqlite3/ <span style="color:#f92672">&amp;&amp;</span> make deinstall
</span></span></code></pre></div><p>A na koniec</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>portinstall sqlite3-threads
</span></span></code></pre></div><p>No trac działa super ;-)</p>
]]></content:encoded>
    </item>
    <item>
      <title>Nowa kicia.</title>
      <link>https://cynar.ski/2008/01/17/nowa-kicia/</link>
      <pubDate>Thu, 17 Jan 2008 20:59:53 +0000</pubDate>
      <guid>https://cynar.ski/2008/01/17/nowa-kicia/</guid>
      <description>&lt;p&gt;Właśnie instaluję Leoparda. Mały hint dla wszystkich posiadających zbackupowaną płytkę DVD Mac OX Leopard i nie mają za bardzo ochoty kupować drogich DVD-DL otóż da się zainstalować system z ISO bez żadnego problemu pod warunkiem, że posiadamy zewnętrzny dysk na FireWire. Rozwiązanie:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Montujemy dysk zewnętrzny&lt;/li&gt;
&lt;li&gt;Formatujemy go, tworzymy sobie partycję wielkości DVD-DL lub większą ;) (ja sobie zrobiłem 10Gb)&lt;/li&gt;
&lt;li&gt;w Disk Utility zaznaczamy sobie partycję na dysku zewnętrznym, którą stworzyliśmy.&lt;/li&gt;
&lt;li&gt;klikamy na Restore&lt;/li&gt;
&lt;li&gt;na pole Source drag&amp;rsquo;n dropowo przeciągamy sobie nasz obrazek ISO, a na pole Destination zrobioną partycję&lt;/li&gt;
&lt;li&gt;klikamy restore (robi sie to jakieś 10-20 minut)&lt;/li&gt;
&lt;li&gt;Enjoy&lt;/li&gt;
&lt;/ol&gt;</description>
      <content:encoded><![CDATA[<p>Właśnie instaluję Leoparda. Mały hint dla wszystkich posiadających zbackupowaną płytkę DVD Mac OX Leopard i nie mają za bardzo ochoty kupować drogich DVD-DL otóż da się zainstalować system z ISO bez żadnego problemu pod warunkiem, że posiadamy zewnętrzny dysk na FireWire. Rozwiązanie:</p>
<ol>
<li>Montujemy dysk zewnętrzny</li>
<li>Formatujemy go, tworzymy sobie partycję wielkości DVD-DL lub większą ;) (ja sobie zrobiłem 10Gb)</li>
<li>w Disk Utility zaznaczamy sobie partycję na dysku zewnętrznym, którą stworzyliśmy.</li>
<li>klikamy na Restore</li>
<li>na pole Source drag&rsquo;n dropowo przeciągamy sobie nasz obrazek ISO, a na pole Destination zrobioną partycję</li>
<li>klikamy restore (robi sie to jakieś 10-20 minut)</li>
<li>Enjoy</li>
</ol>
]]></content:encoded>
    </item>
    <item>
      <title>Przydatne SQL’e</title>
      <link>https://cynar.ski/2007/10/23/przydatne-sqle/</link>
      <pubDate>Tue, 23 Oct 2007 01:51:54 +0000</pubDate>
      <guid>https://cynar.ski/2007/10/23/przydatne-sqle/</guid>
      <description>&lt;p&gt;Poniżej dla potomoności, parę przydatnych funkcji w MySQL służących do oblicznia danych sieciowych:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;DROP&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;FUNCTION&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;IF&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;EXISTS&lt;/span&gt; check_network;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;DROP&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;FUNCTION&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;IF&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;EXISTS&lt;/span&gt; get_network;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;DROP&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;FUNCTION&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;IF&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;EXISTS&lt;/span&gt; get_broadcast;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;delimiter&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;CREATE&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;FUNCTION&lt;/span&gt;  check_network(ip1 VARCHAR(&lt;span style=&#34;color:#ae81ff&#34;&gt;25&lt;/span&gt;), ip_netmask VARCHAR(&lt;span style=&#34;color:#ae81ff&#34;&gt;25&lt;/span&gt;), ip2 VARCHAR(&lt;span style=&#34;color:#ae81ff&#34;&gt;25&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;RETURNS&lt;/span&gt; INT
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;DETERMINISTIC&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;BEGIN&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;IF&lt;/span&gt;((INET_ATON(ip2) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; INET_ATON(ip_netmask)) &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (INET_ATON(ip1) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; INET_ATON(ip_netmask)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;THEN&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;RETURN&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;ELSE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;RETURN&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;END&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;IF&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;END&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;CREATE&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;FUNCTION&lt;/span&gt;  get_network(ip1 VARCHAR(&lt;span style=&#34;color:#ae81ff&#34;&gt;25&lt;/span&gt;), ip_netmask VARCHAR(&lt;span style=&#34;color:#ae81ff&#34;&gt;25&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;RETURNS&lt;/span&gt; VARCHAR(&lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;DETERMINISTIC&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;BEGIN&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;RETURN&lt;/span&gt; INET_ATON(ip1) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; INET_ATON(ip_netmask);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;END&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;CREATE&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;FUNCTION&lt;/span&gt;  get_broadcast(ip1 VARCHAR(&lt;span style=&#34;color:#ae81ff&#34;&gt;25&lt;/span&gt;), ip_netmask VARCHAR(&lt;span style=&#34;color:#ae81ff&#34;&gt;25&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;RETURNS&lt;/span&gt; VARCHAR(&lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;DETERMINISTIC&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;BEGIN&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;RETURN&lt;/span&gt;  INET_NTOA(INET_ATON(ip1) &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; (INET_ATON(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;255.255.255.255&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; INET_ATON(ip_netmask)));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;END&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;delimiter&lt;/span&gt; ;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
      <content:encoded><![CDATA[<p>Poniżej dla potomoności, parę przydatnych funkcji w MySQL służących do oblicznia danych sieciowych:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sql" data-lang="sql"><span style="display:flex;"><span><span style="color:#66d9ef">DROP</span> <span style="color:#66d9ef">FUNCTION</span> <span style="color:#66d9ef">IF</span> <span style="color:#66d9ef">EXISTS</span> check_network;
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">DROP</span> <span style="color:#66d9ef">FUNCTION</span> <span style="color:#66d9ef">IF</span> <span style="color:#66d9ef">EXISTS</span> get_network;
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">DROP</span> <span style="color:#66d9ef">FUNCTION</span> <span style="color:#66d9ef">IF</span> <span style="color:#66d9ef">EXISTS</span> get_broadcast;
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">delimiter</span> <span style="color:#f92672">|</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">CREATE</span> <span style="color:#66d9ef">FUNCTION</span>  check_network(ip1 VARCHAR(<span style="color:#ae81ff">25</span>), ip_netmask VARCHAR(<span style="color:#ae81ff">25</span>), ip2 VARCHAR(<span style="color:#ae81ff">25</span>))
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">RETURNS</span> INT
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">DETERMINISTIC</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">BEGIN</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">IF</span>((INET_ATON(ip2) <span style="color:#f92672">&amp;</span> INET_ATON(ip_netmask)) <span style="color:#f92672">=</span> (INET_ATON(ip1) <span style="color:#f92672">&amp;</span> INET_ATON(ip_netmask)))
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">THEN</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">RETURN</span> <span style="color:#ae81ff">1</span>;
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">ELSE</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">RETURN</span> <span style="color:#ae81ff">0</span>;
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">END</span> <span style="color:#66d9ef">IF</span>;
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">END</span><span style="color:#f92672">|</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">CREATE</span> <span style="color:#66d9ef">FUNCTION</span>  get_network(ip1 VARCHAR(<span style="color:#ae81ff">25</span>), ip_netmask VARCHAR(<span style="color:#ae81ff">25</span>))
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">RETURNS</span> VARCHAR(<span style="color:#ae81ff">20</span>)
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">DETERMINISTIC</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">BEGIN</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">RETURN</span> INET_ATON(ip1) <span style="color:#f92672">&amp;</span> INET_ATON(ip_netmask);
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">END</span><span style="color:#f92672">|</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">CREATE</span> <span style="color:#66d9ef">FUNCTION</span>  get_broadcast(ip1 VARCHAR(<span style="color:#ae81ff">25</span>), ip_netmask VARCHAR(<span style="color:#ae81ff">25</span>))
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">RETURNS</span> VARCHAR(<span style="color:#ae81ff">20</span>)
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">DETERMINISTIC</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">BEGIN</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">RETURN</span>  INET_NTOA(INET_ATON(ip1) <span style="color:#f92672">+</span> (INET_ATON(<span style="color:#e6db74">&#39;255.255.255.255&#39;</span>) <span style="color:#f92672">-</span> INET_ATON(ip_netmask)));
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">END</span><span style="color:#f92672">|</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">delimiter</span> ;
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>Debugowanie PHP</title>
      <link>https://cynar.ski/2007/07/01/debugowanie-php/</link>
      <pubDate>Sun, 01 Jul 2007 19:40:36 +0000</pubDate>
      <guid>https://cynar.ski/2007/07/01/debugowanie-php/</guid>
      <description>&lt;p&gt;Przy większych projektach wiadomym jest fakt, że głęboka analiza jakości kodu jest podstawą, szczególnie jak pracuje się w grupie i nie zawsze mamy czas na sprawdzanie kto i jak zmienił funkcjonalność. PHP nie jest prosty do debugowania, ale narzędzia które ostatnimi czasy pojawiły się w sieci są naprawdę niezłe, mowa tutaj o rozszerzeniu &lt;a href=&#34;http://xdebug.org/&#34;&gt;xdebug 2.0 RC4&lt;/a&gt; najfajniejszym dodatkiem w nowej wersji opisywanego jest dołożenie obsługi &lt;strong&gt;DBGp&lt;/strong&gt; czyli protokołu zdalnego debugowania aplikacji, który jest następcą &lt;strong&gt;GDB&lt;/strong&gt; klika naprawdę fajnie. Klientów jest trochę, na stronie xdebug&amp;rsquo;a są opisane.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Przy większych projektach wiadomym jest fakt, że głęboka analiza jakości kodu jest podstawą, szczególnie jak pracuje się w grupie i nie zawsze mamy czas na sprawdzanie kto i jak zmienił funkcjonalność. PHP nie jest prosty do debugowania, ale narzędzia które ostatnimi czasy pojawiły się w sieci są naprawdę niezłe, mowa tutaj o rozszerzeniu <a href="http://xdebug.org/">xdebug 2.0 RC4</a> najfajniejszym dodatkiem w nowej wersji opisywanego jest dołożenie obsługi <strong>DBGp</strong> czyli protokołu zdalnego debugowania aplikacji, który jest następcą <strong>GDB</strong> klika naprawdę fajnie. Klientów jest trochę, na stronie xdebug&rsquo;a są opisane.</p>
<p>Poniżej moja konfiguracja Xdebug&rsquo;a:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>zend_extension=/Applications/MAMP/bin/php5/lib/php/extensions/no-debug-non-zts-20050922/xdebug.so
</span></span><span style="display:flex;"><span>xdebug.remote_enable=1
</span></span><span style="display:flex;"><span>xdebug.remote_handler=dbgp
</span></span><span style="display:flex;"><span>xdebug.remote_mode=req
</span></span><span style="display:flex;"><span>xdebug.remote_port=9000
</span></span><span style="display:flex;"><span>xdebug.profiler_enable=1
</span></span><span style="display:flex;"><span>xdebug.profiler_output_dir=&#34;/Users/paramah/Sites/Debug&#34;
</span></span><span style="display:flex;"><span>cgi.force_redirect = 0
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>MAMP i poprawki</title>
      <link>https://cynar.ski/2007/06/28/mamp-i-poprawki/</link>
      <pubDate>Thu, 28 Jun 2007 00:08:23 +0000</pubDate>
      <guid>https://cynar.ski/2007/06/28/mamp-i-poprawki/</guid>
      <description>&lt;p&gt;Jakiś czas temu dorwałem w łapki dość przyjemny pak z apache&amp;rsquo;m, php&amp;rsquo;em i mysql&amp;rsquo;em o nazwie &lt;a href=&#34;http://www.mamp.info/en/home.php&#34;&gt;MAMP&lt;/a&gt; działa dobrze i nie &amp;ldquo;brudzi&amp;rdquo; w systemie, jednakże okazało się, że nie posiada paru modułów w php, których używam - stwierdziłem, że nie ma sensu bawić się portami i przebudowałem MAMP&amp;rsquo;a tak, aby można było korzystać z PECL&amp;rsquo;a i powiem szczerze da się :)&lt;/p&gt;
&lt;p&gt;Do MAMP&amp;rsquo;a dodałem:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;xdebug 1.3.2&lt;/li&gt;
&lt;li&gt;apd 0.9&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Myślę, że zrobię z tego małe .dmg - ale jakby ktoś chciał szybciej to dawać znać. :)&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Jakiś czas temu dorwałem w łapki dość przyjemny pak z apache&rsquo;m, php&rsquo;em i mysql&rsquo;em o nazwie <a href="http://www.mamp.info/en/home.php">MAMP</a> działa dobrze i nie &ldquo;brudzi&rdquo; w systemie, jednakże okazało się, że nie posiada paru modułów w php, których używam - stwierdziłem, że nie ma sensu bawić się portami i przebudowałem MAMP&rsquo;a tak, aby można było korzystać z PECL&rsquo;a i powiem szczerze da się :)</p>
<p>Do MAMP&rsquo;a dodałem:</p>
<ul>
<li>xdebug 1.3.2</li>
<li>apd 0.9</li>
</ul>
<p>Myślę, że zrobię z tego małe .dmg - ale jakby ktoś chciał szybciej to dawać znać. :)</p>
]]></content:encoded>
    </item>
    <item>
      <title>Elektroniczne bąbelki ?</title>
      <link>https://cynar.ski/2007/06/25/elektroniczne-babelki/</link>
      <pubDate>Mon, 25 Jun 2007 02:04:59 +0000</pubDate>
      <guid>https://cynar.ski/2007/06/25/elektroniczne-babelki/</guid>
      <description>&lt;p&gt;Czasami naprawdę zastanawiam się czy &amp;ldquo;pomysłowość&amp;rdquo; ludzka ma jakieś granice. Bo przecież co za chory umysł mógł wpaść na genialny pomysł wyprodukowania czegoś takiego jak elektroniczna bąbelkowana folia. W sumie jak dla mnie bomba, każdy z nas chyba lubi &amp;ldquo;poklikać&amp;rdquo; czasami na folii, dla tych którzy nie potrafią się oprzeć to polecam:&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.kilian-nakamura.com/blog-english/index.php/portable-bubble-wrap-toy-from-bandai-asovision-puchipuchi/&#34;&gt;Portable Bubble Wrap toy from Bandai Asovision - Puchipuchi&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Czyżby chęć &amp;ldquo;prześcignięcia&amp;rdquo; pomysłowości marketingowców z Sony?&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.marketing-alternatif.com/index.php?p=322&#34;&gt;SONY PS2 en Malaisie&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Czasami naprawdę zastanawiam się czy &ldquo;pomysłowość&rdquo; ludzka ma jakieś granice. Bo przecież co za chory umysł mógł wpaść na genialny pomysł wyprodukowania czegoś takiego jak elektroniczna bąbelkowana folia. W sumie jak dla mnie bomba, każdy z nas chyba lubi &ldquo;poklikać&rdquo; czasami na folii, dla tych którzy nie potrafią się oprzeć to polecam:</p>
<p><a href="http://www.kilian-nakamura.com/blog-english/index.php/portable-bubble-wrap-toy-from-bandai-asovision-puchipuchi/">Portable Bubble Wrap toy from Bandai Asovision - Puchipuchi</a></p>
<p>Czyżby chęć &ldquo;prześcignięcia&rdquo; pomysłowości marketingowców z Sony?</p>
<p><a href="http://www.marketing-alternatif.com/index.php?p=322">SONY PS2 en Malaisie</a></p>
<p>Mnie powaliło. :)</p>
]]></content:encoded>
    </item>
    <item>
      <title>SQL i graficzne interface’y… Knoda</title>
      <link>https://cynar.ski/2007/05/28/sql-i-graficzne-interfacey-knoda/</link>
      <pubDate>Mon, 28 May 2007 16:00:40 +0000</pubDate>
      <guid>https://cynar.ski/2007/05/28/sql-i-graficzne-interfacey-knoda/</guid>
      <description>&lt;p&gt;Mielenie po bazach SQL&amp;rsquo;owych za pomocą shell&amp;rsquo;a zaczęło mnie trochę męczyć, różne bazy,
wiele zależności, widoki i inne pierdoły. Tak więc zabrałem się za poszukiwanie czegoś co mi ułatwi żywot, a zarazem będzie w stanie obsłużyć wiele baz jednocześnie. Znalazłem coś co zowie się &lt;a href=&#34;http://www.knoda.org/&#34;&gt;Knoda&lt;/a&gt; typowy &amp;ldquo;database frontend&amp;rdquo;. Na debianie działa mi bardzo przyjemnie, co prawda w celu dodania nowych baz danych (domyślnie tylko MySQL) trzeba doinstalować sobie libhk-classes-*:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gnosis:~# apt-cache search libhk-classes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;libhk-classes-dev - C++ library &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; database applications &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;development files&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;libhk-classes-mdb - MS Access driver plugin &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; hk_classes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;libhk-classes-mysql - MySQL driver plugin &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; hk_classes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;libhk-classes-odbc - ODBC driver plugin &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; hk_classes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;libhk-classes-paradox - paradox plugin &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; libhk-classes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;libhk-classes-postgres - PostgreSQL driver plugin &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; libhk-classes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;libhk-classes-sqlite - SQLite &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt; driver plugin &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; hk_classes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;libhk-classes-sqlite3 - SQLite &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt; driver plugin &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; hk_classes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;libhk-classes-xbase - XBase/DBase plugin &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; hk_classes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;libhk-classes15 - C++ library &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; database applications
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Które jak widać są, do obsługi baz takich jak np. Sybase idealnie działa odbc.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Mielenie po bazach SQL&rsquo;owych za pomocą shell&rsquo;a zaczęło mnie trochę męczyć, różne bazy,
wiele zależności, widoki i inne pierdoły. Tak więc zabrałem się za poszukiwanie czegoś co mi ułatwi żywot, a zarazem będzie w stanie obsłużyć wiele baz jednocześnie. Znalazłem coś co zowie się <a href="http://www.knoda.org/">Knoda</a> typowy &ldquo;database frontend&rdquo;. Na debianie działa mi bardzo przyjemnie, co prawda w celu dodania nowych baz danych (domyślnie tylko MySQL) trzeba doinstalować sobie libhk-classes-*:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>gnosis:~# apt-cache search libhk-classes
</span></span><span style="display:flex;"><span>libhk-classes-dev - C++ library <span style="color:#66d9ef">for</span> database applications <span style="color:#f92672">(</span>development files<span style="color:#f92672">)</span>
</span></span><span style="display:flex;"><span>libhk-classes-mdb - MS Access driver plugin <span style="color:#66d9ef">for</span> hk_classes
</span></span><span style="display:flex;"><span>libhk-classes-mysql - MySQL driver plugin <span style="color:#66d9ef">for</span> hk_classes
</span></span><span style="display:flex;"><span>libhk-classes-odbc - ODBC driver plugin <span style="color:#66d9ef">for</span> hk_classes
</span></span><span style="display:flex;"><span>libhk-classes-paradox - paradox plugin <span style="color:#66d9ef">for</span> libhk-classes
</span></span><span style="display:flex;"><span>libhk-classes-postgres - PostgreSQL driver plugin <span style="color:#66d9ef">for</span> libhk-classes
</span></span><span style="display:flex;"><span>libhk-classes-sqlite - SQLite <span style="color:#ae81ff">2</span> driver plugin <span style="color:#66d9ef">for</span> hk_classes
</span></span><span style="display:flex;"><span>libhk-classes-sqlite3 - SQLite <span style="color:#ae81ff">3</span> driver plugin <span style="color:#66d9ef">for</span> hk_classes
</span></span><span style="display:flex;"><span>libhk-classes-xbase - XBase/DBase plugin <span style="color:#66d9ef">for</span> hk_classes
</span></span><span style="display:flex;"><span>libhk-classes15 - C++ library <span style="color:#66d9ef">for</span> database applications
</span></span></code></pre></div><p>Które jak widać są, do obsługi baz takich jak np. Sybase idealnie działa odbc.</p>
<p>Powiem tak: zadowolenie +4, styl życia +6 :)</p>
]]></content:encoded>
    </item>
    <item>
      <title>Na dzieńdobry...</title>
      <link>https://cynar.ski/2007/05/21/na-dziendobry/</link>
      <pubDate>Mon, 21 May 2007 21:38:53 +0000</pubDate>
      <guid>https://cynar.ski/2007/05/21/na-dziendobry/</guid>
      <description>&lt;p&gt;Stwierdziłem, że muszę trochę usystematyzować parę spraw i dlatego powstał ten weblog, w którym będę się starać publikować bardziej techniczne aspekty mojego życia.&lt;/p&gt;
&lt;p&gt;Postanowienie dość twarde, ciekawe jak długo.&lt;/p&gt;
&lt;p&gt;Stary blog znajdziecie pod adresem &lt;a href=&#34;http://paramah.jogger.pl/&#34; title=&#34;Paramah.jogger.pl&#34;&gt;http://paramah.jogger.pl/&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Stwierdziłem, że muszę trochę usystematyzować parę spraw i dlatego powstał ten weblog, w którym będę się starać publikować bardziej techniczne aspekty mojego życia.</p>
<p>Postanowienie dość twarde, ciekawe jak długo.</p>
<p>Stary blog znajdziecie pod adresem <a href="http://paramah.jogger.pl/" title="Paramah.jogger.pl">http://paramah.jogger.pl/</a></p>
]]></content:encoded>
    </item>
  </channel>
</rss>
