<?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>/var/log/balo</title><link>https://vbalazs.info/</link><description>Recent content on /var/log/balo</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Thu, 27 Feb 2025 22:48:38 +0100</lastBuildDate><atom:link href="https://vbalazs.info/atom.xml" rel="self" type="application/rss+xml"/><item><title>How to Send Logs from FluentBit to AWS OpenSearch Serverless</title><link>https://vbalazs.info/2025/03/how-to-send-logs-from-fluent-bit-to-aws-opensearch-serverless.html</link><pubDate>Tue, 04 Mar 2025 18:40:11 +0100</pubDate><guid>https://vbalazs.info/2025/03/how-to-send-logs-from-fluent-bit-to-aws-opensearch-serverless.html</guid><description>&lt;p>While exploring alternatives to Datadog for logging, I created a proof of
concept using OpenSearch (an Elasticsearch fork since 2021). I opted for the
&lt;a href="https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless.html">Serverless&lt;/a> option to avoid cluster management and tuning, allowing me to
focus on integration and developer experience.&lt;/p>
&lt;p>I couldn’t find a comprehensive guide covering all the necessary components to
get this working, so I decided to write one. However, this post is not a
step-by-step tutorial; it assumes familiarity with FluentBit, AWS and OpenSearch
Serverless configuration options.&lt;/p></description><content:encoded><![CDATA[<p>While exploring alternatives to Datadog for logging, I created a proof of
concept using OpenSearch (an Elasticsearch fork since 2021). I opted for the
<a href="https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless.html">Serverless</a> option to avoid cluster management and tuning, allowing me to
focus on integration and developer experience.</p>
<p>I couldn’t find a comprehensive guide covering all the necessary components to
get this working, so I decided to write one. However, this post is not a
step-by-step tutorial; it assumes familiarity with FluentBit, AWS and OpenSearch
Serverless configuration options.</p>
<h2 id="networking">Networking</h2>
<p>I kept the dashboard publicly accessible (authenticated via the AWS web console
session) and created an OpenSearch Serverless network policy with a managed VPC
endpoint for API access. This enabled an internal AWS network connection between
the OpenSearch API and our ECS Fargate containers.</p>
<p>For this setup to work, the VPC endpoint requires a security group that allows
inbound HTTPS access from the ECS container&rsquo;s security group.</p>
<h2 id="iam">IAM</h2>
<p>The role under which FluentBit runs (in our case, <code>task_role_arn</code> in the ECS task
definition), <a href="https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-data-access.html#serverless-data-access-vs-iam">requires the following permission</a>:</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">    <span class="nt">&#34;Version&#34;</span><span class="p">:</span> <span class="s2">&#34;2012-10-17&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">    <span class="nt">&#34;Statement&#34;</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">        <span class="p">{</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">            <span class="nt">&#34;Sid&#34;</span><span class="p">:</span> <span class="s2">&#34;VisualEditor0&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">            <span class="nt">&#34;Effect&#34;</span><span class="p">:</span> <span class="s2">&#34;Allow&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">            <span class="nt">&#34;Action&#34;</span><span class="p">:</span> <span class="s2">&#34;aoss:APIAccessAll&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">            <span class="nt">&#34;Resource&#34;</span><span class="p">:</span> <span class="s2">&#34;arn:aws:aoss:&lt;region&gt;:&lt;account-id&gt;:collection/&lt;collection-id&gt;&#34;</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">    <span class="p">]</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="p">}</span></span></span></code></pre></div><p>This might raise some concerns, but it only grants the role access to data plane
APIs for a specified collection in the account. More details <a href="https://docs.aws.amazon.com/opensearch-service/latest/developerguide/security-iam-serverless.html#security_iam_id-based-policy-examples-data-plane">here</a>.</p>
<p>The actual access control is enforced through the OpenSearch Serverless data
access policy, where we need to define the following permissions for the
role and collection above:</p>





<pre tabindex="0"><code>aoss:CreateIndex
aoss:UpdateIndex
aoss:WriteDocument</code></pre><h2 id="create-the-index">Create the index</h2>
<ol>
<li>Visit OpenSearch Dashboards URL for the collection. The URL follows this format:
<code>https://dashboards.&lt;region&gt;.aoss.amazonaws.com/_login/?collectionId=&lt;collection-id&gt;</code>.</li>
<li>In OpenSearch Dashboards, open the left navigation pane and select Dev Tools.</li>
<li>Create an index using the query: <code>PUT &lt;index-name&gt;</code></li>
</ol>
<h2 id="fluentbit">FluentBit</h2>
<p>Add the following output configuration as per the <a href="https://docs.fluentbit.io/manual/pipeline/outputs/opensearch#aws-opensearch-serverless">FluentBit documentation</a>:</p>





<pre tabindex="0"><code>[OUTPUT]
    Name  opensearch
    Match *
    Host &lt;collection-id&gt;.&lt;region&gt;.aoss.amazonaws.com
    Port 443
    Index &lt;index-name&gt;
    Trace_Error On
    Trace_Output Off
    AWS_Auth On
    AWS_Region ${AWS_REGION}
    AWS_Service_Name aoss
    tls On
    Suppress_Type_Name On</code></pre><p><strong>Ensure you can read and tail FluentBit engine logs to monitor for delivery
errors.</strong></p>
<h2 id="verification">Verification</h2>
<p>In OpenSearch Dev Tools, check the index information using the query:
<code>GET _cat/indices/&lt;index-name&gt;?v</code></p>
<p>Once the document count increases and no errors appear in FluentBit, proceed to
create an index pattern in the <em>Stack Management</em> menu to explore your data in
<em>Discover</em>.</p>
<h2 id="results">Results</h2>
<p>As an interesting data point, with approximately 650 logs per second and an
average log size of ~6KB, indexing scaled to ~10 OCUs on average. Search
capacity remained mostly at 1 OCU, peaking at 5 OCUs during active searches.</p>
<p>We decided not to proceed with this project due to its pricing and challenges in
handling schema-less JSON logs, particularly those with high cardinality and
varying data types. While it was roughly half the cost of Datadog, in our
current context, the trade-offs were not justified.</p>
]]></content:encoded></item><item><title>From Jekyll to Hugo</title><link>https://vbalazs.info/2025/02/from-jekyll-to-hugo.html</link><pubDate>Thu, 27 Feb 2025 22:48:38 +0100</pubDate><guid>https://vbalazs.info/2025/02/from-jekyll-to-hugo.html</guid><description>&lt;h2 id="motivation">Motivation&lt;/h2>
&lt;p>After seven years, I decided to write a blog post again, only to find that my old
toolchain hadn’t aged well. My blog was built on Jekyll, specifically the
&lt;a href="https://github.com/github/pages-gem">GitHub Pages gem&lt;/a>. Over time, as I continually updated my local Ruby
installation, I had to update the blog&amp;rsquo;s gems as well.
After falling down a rabbit hole of troubleshooting gem and theme updates, I
realized that GitHub Pages &lt;a href="https://github.com/github/pages-gem/issues/651">doesn’t keep up with Jekyll&lt;/a> either. I could have
made it work with Jekyll alone, but it felt like the right time to switch to
something leaner and &lt;em>less likely&lt;/em> to break over time.&lt;/p></description><content:encoded><![CDATA[<h2 id="motivation">Motivation</h2>
<p>After seven years, I decided to write a blog post again, only to find that my old
toolchain hadn’t aged well. My blog was built on Jekyll, specifically the
<a href="https://github.com/github/pages-gem">GitHub Pages gem</a>. Over time, as I continually updated my local Ruby
installation, I had to update the blog&rsquo;s gems as well.
After falling down a rabbit hole of troubleshooting gem and theme updates, I
realized that GitHub Pages <a href="https://github.com/github/pages-gem/issues/651">doesn’t keep up with Jekyll</a> either. I could have
made it work with Jekyll alone, but it felt like the right time to switch to
something leaner and <em>less likely</em> to break over time.</p>
<p>I ultimately chose <a href="https://gohugo.io">Hugo</a>. It’s fast, feature-rich, and doesn’t require Ruby,
a JavaScript runtime, or any extra dependencies.</p>
<h2 id="theme">Theme</h2>
<p>My <a href="https://github.com/poole/hyde">previous theme</a> was still functional, but over the years, I became
increasingly frustrated with the modern web. Inspired by the
<a href="https://bearblog.dev/">Bear blogging platform</a> and its no-nonsense philosophy, I decided to strip
away external fonts, analytics, and the unnecessary fixed sidebar.</p>
<p>I also wanted a theme that respects the system’s light/dark mode settings for
better readability. I settled on <a href="https://github.com/clente/hugo-bearcub">hugo-bearcub</a>. It offers more than I need,
but I had some issues with the more minimal <a href="https://github.com/janraasch/hugo-bearblog">hugo-bearblog</a>.
I might revisit it later to simplify things further.</p>
<h2 id="posts">Posts</h2>
<p>In Jekyll, I <a href="https://github.com/vbalazs/vbalazs.github.io/blob/22ca8d653f61a971c991fecdd7e5e6d155d311a6/_config.yml#L10">had a custom permalink configuration</a>:</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="ln">1</span><span class="cl"><span class="nt">permalink</span><span class="p">:</span><span class="w"> </span><span class="l">/:year/:month/:title.html</span></span></span></code></pre></div><p>Hugo uses a different default permalink structure, but I wanted to maintain my
old links. While I could have used an alias (redirect) in the front matter, I
decided against it—switching tools shouldn’t force me to change permalinks.
If I migrate to another static site generator in the future, I’d have to juggle
multiple URL schemes, creating a convoluted mess of redirects.</p>
<p>Instead, I configured Hugo like this:</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="c"># [...]</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="c"># Displaying the .html extension is considered &#34;ugly&#34; by some</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="c"># Note: Order matters! This should be defined at the top, above `menus` and `permalinks`</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="nx">uglyURLs</span> <span class="p">=</span> <span class="kc">true</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">
</span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="p">[</span><span class="nx">permalinks</span><span class="p">]</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">  <span class="nx">posts</span> <span class="p">=</span> <span class="s1">&#39;/:year/:month/:slug&#39;</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">
</span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="p">[</span><span class="nx">outputFormats</span><span class="p">]</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">  <span class="p">[</span><span class="nx">outputFormats</span><span class="p">.</span><span class="nx">RSS</span><span class="p">]</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">    <span class="nx">mediatype</span> <span class="p">=</span> <span class="s2">&#34;application/rss&#34;</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">    <span class="nx">baseName</span> <span class="p">=</span> <span class="s2">&#34;atom&#34;</span> <span class="c"># Preserves the `atom.xml` name from Jekyll for the RSS feed</span></span></span></code></pre></div><p>In Hugo, embedding raw HTML in Markdown isn’t allowed (or recommended), so for
some posts, I renamed file extensions to <code>.html</code> to render them as-is. For others,
I rewrote snippets in Markdown or used <a href="https://gohugo.io/content-management/shortcodes/">shortcodes</a>.</p>
<p>Speaking of shortcodes, Hugo only interprets variables and functions in templates,
so I had to use them for handling assets in <a href="https://gohugo.io/content-management/page-bundles/">page bundles</a>:</p>
<ul>
<li>Displaying images using the <a href="https://github.com/gohugoio/hugoDocs/blob/59e057bb43907b3c5675d0d8645d02327f12bef1/layouts/shortcodes/imgproc.html">imgproc shortcode</a></li>
<li>Linking to a resource within a post, such as a full-size image or a downloadable
file

<details>
  <summary>See code</summary>
  




<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go-html-template" data-lang="go-html-template"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="cm">{{- /*
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="cm">  Renders an absolute path to a page bundle or global resource for use in an &lt;a href&gt; attribute.
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="cm">
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="cm">  @returns template.HTML
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="cm">
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="cm">  @example 
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="cm">
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="cm">*/}}</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="cp">{{-</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="na">$.Get</span><span class="w"> </span><span class="s">&#34;path&#34;</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">  <span class="cp">{{-</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="nx">$i</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">or</span><span class="w"> </span><span class="o">(</span><span class="na">$.Page.Resources.Get</span><span class="w"> </span><span class="na">.</span><span class="o">)</span><span class="w"> </span><span class="o">(</span><span class="nx">resources</span><span class="na">.Get</span><span class="w"> </span><span class="na">.</span><span class="o">)</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">    <span class="cp">{{</span><span class="w"> </span><span class="na">.RelPermalink</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">  <span class="cp">{{-</span><span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="cp">}}</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="cp">{{-</span><span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="cp">}}</span></span></span></code></pre></div><p>This workaround seems necessary because of my custom permalink structure.</p>
</details>
</li>
</ul>
<p>While a bit more complex than I’d like, this approach keeps post assets
self-contained, avoiding reliance on external storage or a CDN.</p>
<h2 id="hosting">Hosting</h2>
<p>I’m grateful for the work GitHub has put into GitHub Pages—it served me well for
many years. For now, I’ll continue using it for building and hosting this site.</p>
]]></content:encoded></item><item><title>Thoughts on career, fears and biases</title><link>https://vbalazs.info/2018/02/thoughts-on-career-fears-and-biases.html</link><pubDate>Mon, 19 Feb 2018 23:20:13 +0100</pubDate><guid>https://vbalazs.info/2018/02/thoughts-on-career-fears-and-biases.html</guid><description>&lt;p>As my first anniversary of living in Barcelona is getting closer I am spending
some time looking back and re-evaluating my career and life situation. It is
far too easy to stay busy with everyday tasks and miss the big picture.&lt;/p>
&lt;p>While I was focusing on my personal development in the past year I kind of
accepted that it is OK not having a professionally challenging job. However
this can be a dangerous path, with a trap one can easily fall into: if there
are no challenges, it must be because we already know everything!&lt;/p></description><content:encoded><![CDATA[<p>As my first anniversary of living in Barcelona is getting closer I am spending
some time looking back and re-evaluating my career and life situation. It is
far too easy to stay busy with everyday tasks and miss the big picture.</p>
<p>While I was focusing on my personal development in the past year I kind of
accepted that it is OK not having a professionally challenging job. However
this can be a dangerous path, with a trap one can easily fall into: if there
are no challenges, it must be because we already know everything!</p>
<p>Don&rsquo;t get me wrong I was still learning but that happened outside of daily
work. I see it more clearly now that I could improve much faster if work hours
would be aligned with my professional growth as well.</p>
<p>With this in mind I&rsquo;ve decided to look for new opportunities. I started my
research to find companies I want to work for. It was a crucial moment when I
realized while it&rsquo;s useful, if I want to be honest with myself, I am
procrastinating on sending the applications. I wanted to know more about my
fears and fight them. After some self-introspection it turned out that I&rsquo;m
afraid of being inadequate and being a failure in general.</p>
<p>On an absolute scale which step of the career ladder am I on? It feels like I
see some steps below me and the next one or two above me but I don&rsquo;t know
where this step exactly is in the industry.</p>
<p>If I wanted to sound scientific I would ask where the line is between the
<a href="https://en.wikipedia.org/wiki/Impostor_syndrome">impostor syndrome</a> and the
<a href="https://en.wikipedia.org/wiki/Dunning%E2%80%93Kruger_effect">Dunning–Kruger effect</a>.</p>

        <figure style="text-align: center">
          <img
            src="/2018/02/thoughts-on-career-fears-and-biases/images/impostor_syndrome_hu_ecf3510365a85141.webp"
            width="318"
            height="379"
            alt=""
            title=""
            >
          <figcaption class="not-prose text-sm">
              <i>
<a href="https://xkcd.com/1954/">xkcd</a>: "It's actually worst in people who study the Dunning–Kruger effect. We tried to organize a conference on it, but the only people who would agree to give the keynote were random undergrads."
</i>
          </figcaption>
        </figure>

<p>I am convinced that by going through some interviews again will help me cope
with these feelings. And I want to gain some insights into where I must
improve.</p>
<p>My biggest challenge now is the first company on the list: <a href="https://www.toptal.com/web">Toptal web developers group</a>.
Their famous <a href="https://www.toptal.com/top-3-percent">3% filter</a> will give me an
accurate assessment of my skills on the market. If I can pass, I will be
confident enough to start a new phase of my life as a freelancer developer.
Have a look on their ruby <a href="https://www.toptal.com/ruby?guide=true#hiring-guide">hiring guide</a> :)</p>
]]></content:encoded></item><item><title>Polyconf 2014</title><link>https://vbalazs.info/2014/11/polyconf-2014.html</link><pubDate>Sun, 02 Nov 2014 18:00:00 +0100</pubDate><guid>https://vbalazs.info/2014/11/polyconf-2014.html</guid><description>&lt;p>Last week, with the &lt;a href="http://www.digitalnatives.hu">company&lt;/a>&amp;rsquo;s support, we had the chance to visit PolyConf.&lt;/p>
&lt;blockquote>
&lt;p>PolyConf is a two-day, single track, multi-disciplinary conference on advanced
technologies for programmers interested in polyglot approach to software development.
Our goal is to foster exchange between programming languages.&lt;/p>&lt;/blockquote>

 &lt;figure style="text-align: center">
 &lt;img
 src="https://vbalazs.info/2014/11/polyconf-2014/images/polyconf_hu_d8344e30cc95a8ce.webp"
 width="282"
 height="240"
 alt=""
 title=""
 >
 &lt;figcaption class="not-prose text-sm">
 &lt;i>
PolyConf logo
&lt;/i>
 &lt;/figcaption>
 &lt;/figure>

&lt;p>The conference was great, I will highlight some of my favourite talks.&lt;/p>
&lt;h3 id="garret-smith---the-value-of-diversity-and-other-lessons-from-biology">&lt;a href="http://twitter.com/gar1t">Garret Smith&lt;/a> - The Value Of Diversity And Other Lessons From Biology&lt;/h3>
&lt;p>We usually look to software as an engineered bridge or building (structure) but
maybe we oversimplify it. Garret took a different approach and look to software
as a biological organization. He pointed out that in biology, diversity is driving
adoption which is the driving force of innovation. Could we change our view about
software development process? Could we apply evolutionary models to our job?
I highly recommend this talk, we should talk about it more.&lt;/p></description><content:encoded><![CDATA[<p>Last week, with the <a href="http://www.digitalnatives.hu">company</a>&rsquo;s support, we had the chance to visit PolyConf.</p>
<blockquote>
<p>PolyConf is a two-day, single track, multi-disciplinary conference on advanced
technologies for programmers interested in polyglot approach to software development.
Our goal is to foster exchange between programming languages.</p></blockquote>

        <figure style="text-align: center">
          <img
            src="/2014/11/polyconf-2014/images/polyconf_hu_d8344e30cc95a8ce.webp"
            width="282"
            height="240"
            alt=""
            title=""
            >
          <figcaption class="not-prose text-sm">
              <i>
PolyConf logo
</i>
          </figcaption>
        </figure>

<p>The conference was great, I will highlight some of my favourite talks.</p>
<h3 id="garret-smith---the-value-of-diversity-and-other-lessons-from-biology"><a href="http://twitter.com/gar1t">Garret Smith</a> - The Value Of Diversity And Other Lessons From Biology</h3>
<p>We usually look to software as an engineered bridge or building (structure) but
maybe we oversimplify it. Garret took a different approach and look to software
as a biological organization. He pointed out that in biology, diversity is driving
adoption which is the driving force of innovation. Could we change our view about
software development process? Could we apply evolutionary models to our job?
I highly recommend this talk, we should talk about it more.</p>
<h3 id="justyna-walkowska---should-everybody-learn-to-code"><a href="http://girllostinit.com">Justyna Walkowska</a> - Should Everybody Learn to Code?</h3>
<p>It&rsquo;s a hot topic in every community and also in <a href="http://www.bbc.com/news/technology-29010511">education politics</a>.
Justyna is a teacher herself who taught computer science to different ages
(from children to elderly). She shared her experiences and stated that teaching
programming to children can be useful to strengthen their basic logical thinking.</p>
<h3 id="david-nolen---immutability-putting-the-dream-machine-to-work"><a href="http://twitter.com/swannodette">David Nolen</a> - Immutability: Putting The Dream Machine to Work</h3>
<p>It was a great presentation about old and often forgotten concepts, such as
<a href="http://en.wikipedia.org/wiki/Persistent_data_structure">persistent data structure</a> and immutable bitmapped vector trie. He also
presented some real-life examples on how we could apply these techniques to be
more memory and CPU efficient. He mentioned a 50 years old paper I&rsquo;ll definitely
read: Man-Computer Symbiosis by J. C. R. Licklider <a href="http://groups.csail.mit.edu/medg/people/psz/Licklider.html">link</a>.</p>
<h3 id="jack-franklin---dependency-and-module-management-with-javascript"><a href="http://twitter.com/Jack_Franklin">Jack Franklin</a> - Dependency And Module Management With JavaScript</h3>
<p>I don&rsquo;t consider myself a javascript developer so I can&rsquo;t really evaluate this
talk but for me it was a good summary of the current situtation and the possible
future. Spoiler alert: <a href="http://jspm.io">jspm.io</a> ftw!</p>
<p><a href="https://speakerdeck.com/jackfranklin/polyconf-js-modules">https://speakerdeck.com/jackfranklin/polyconf-js-modules</a></p>
<h3 id="alexander-solovyov---writing-snake-game-in-clojurescript-with-react"><a href="http://twitter.com/asolovyov">Alexander Solovyov</a> - Writing Snake game in ClojureScript with React</h3>
<p>Alexander was a genius on stage, he was live coding in ClojureScript and presented
its capabilities to the audience. I liked his style a lot and he showed that how
to do an entertaining and useful live coding session on a conference.</p>
<h3 id="john-hughes---testing-the-hard-stuff-and-staying-sane"><a href="http://twitter.com/rjmh">John Hughes</a> - Testing the Hard Stuff and Staying Sane</h3>
<p>I have already seen this presentation from John on <a href="http://craft-conf.com/2014/#speakers/JohnHughes">Craft conference</a>
(<a href="http://www.ustream.tv/recorded/46638775">recording</a>), the concept is promising, I&rsquo;m planning to give
<a href="https://github.com/mcandre/rubycheck">rubycheck</a> a shot.</p>
<h3 id="irina-bednova---using-boolean-logic-to-deal-with-dates"><a href="https://twitter.com/jafrog">Irina Bednova</a> - Using boolean logic to deal with dates</h3>
<p>It was a short quicktalk, I liked it because she reduced a complex boolean expression
with <a href="http://en.wikipedia.org/wiki/Karnaugh_map">Karnaugh map</a>. I learnt about it in high school, we used it for
solving logic circuits but I&rsquo;ve never thought about applying it in my everyday job :)</p>
<p><a href="https://speakerdeck.com/jafrog/using-boolean-logic-to-deal-with-dates">https://speakerdeck.com/jafrog/using-boolean-logic-to-deal-with-dates</a></p>
<h3 id="michał-taszycki---commodore-64-could-do-that"><a href="https://twitter.com/mehowte">Michał Taszycki</a> - Commodore 64 could do that?</h3>
<p>This was a funny talk about how we can do asynchronous programming on our beloved
C64 with a neat trick. Subscribe to <a href="http://signup.64bites.com">64bites screencasts</a> to learn how.
Long live C64!</p>
<p><a href="https://speakerdeck.com/mehowte/commodore-64-could-do-that">https://speakerdeck.com/mehowte/commodore-64-could-do-that</a></p>
<p>I don&rsquo;t know if you are interested in the food on conferences but beat this:</p>

        <figure style="text-align: center">
          <img
            src="/2014/11/polyconf-2014/images/528136828742676480_hu_9996d0a551c30b46.webp"
            width="566"
            height="286"
            alt=""
            title=""
            >
          <figcaption class="not-prose text-sm">
              <i>
<a href="https://twitter.com/Jack_Franklin/status/528136828742676480">Tweet</a> by @Jack_Franklin: So #polyconf has croissants filled with nutella. Easily the best food at a conference ever! :D
</i>
          </figcaption>
        </figure>

<p><strong>Thanks for the organizers, everybody who came and I hope we will meet next year :)</strong></p>
]]></content:encoded></item><item><title>Adventures of tracking down a database pool leak</title><link>https://vbalazs.info/2014/08/my-adventures-with-tracking-down-a-database-leak.html</link><pubDate>Wed, 20 Aug 2014 12:05:00 +0200</pubDate><guid>https://vbalazs.info/2014/08/my-adventures-with-tracking-down-a-database-leak.html</guid><description>&lt;p>&lt;em>This page was first published on August 20th 2014 and was last updated on September 7th 2014. See the update below.&lt;/em>&lt;/p>
&lt;p>Occasionally I still work on the &lt;a href="http://openam.forgerock.org">OpenAM&lt;/a> instance of &lt;a href="http://kir-dev.sch.bme.hu/about/">Kir-Dev&lt;/a> because they are transitioning to a custom OAuth2 provider solution and they need support for its plugins I wrote.&lt;/p>
&lt;h2 id="few-words-about-my-use-case">Few words about my use-case&lt;/h2>
&lt;p>My latest addition was a bigger refactor and an OAuth2 AttributeMapper implementation. With this plugin, users are able to sign in on &lt;a href="http://openam.forgerock.org/openam-documentation/openam-doc-source/doc/admin-guide/index/chap-federation.html#about-federation">federated&lt;/a> sites which still use OpenAM, through the new OAuth2 provider.&lt;/p></description><content:encoded><![CDATA[<p><em>This page was first published on August 20th 2014 and was last updated on September 7th 2014. See the update below.</em></p>
<p>Occasionally I still work on the <a href="http://openam.forgerock.org">OpenAM</a> instance of <a href="http://kir-dev.sch.bme.hu/about/">Kir-Dev</a> because they are transitioning to a custom OAuth2 provider solution and they need support for its plugins I wrote.</p>
<h2 id="few-words-about-my-use-case">Few words about my use-case</h2>
<p>My latest addition was a bigger refactor and an OAuth2 AttributeMapper implementation. With this plugin, users are able to sign in on <a href="http://openam.forgerock.org/openam-documentation/openam-doc-source/doc/admin-guide/index/chap-federation.html#about-federation">federated</a> sites which still use OpenAM, through the new OAuth2 provider.</p>

        <figure style="text-align: center">
          <img
            src="/2014/08/my-adventures-with-tracking-down-a-database-leak/images/saml2-oauth2-bridge_hu_a08f2a847527a474.png"
            width="582"
            height="255"
            alt=""
            title=""
            >
          <figcaption class="not-prose text-sm">
              <i>
Sequence diagram of OpenAM as a SAML2-OAuth2 bridge
</i>
          </figcaption>
        </figure>

<p>With the refactor, I introduced a bug which resulted outages caused by the exhaustion of the database connection pool on Tomcat (the container we use for OpenAM). Make things worse, it wasn&rsquo;t a trivial leak: it happened quite often (every couple of days) but not after some specified number of logins.</p>
<h2 id="dos-it">DoS it!</h2>
<p>Okay, not exactly. I designed an experiment to generate thousands of log in operations with the help of Selenium, PhantomJS and JMeter. I learned a lot on the way - just for a hint from where I started: control Chrome windows with Selenium from a Ruby loop. I improved my setup from 15 ops/min to 50+ ops/min. I ended up with the following:</p>
<h4 id="run-selenium-as-standalone-with-phantomjs-driver">Run Selenium as standalone with PhantomJS driver</h4>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="ln">1</span><span class="cl">$ <span class="nb">export</span> <span class="nv">PATH</span><span class="o">=</span><span class="k">$(</span><span class="nb">echo</span> <span class="nv">$PATH</span><span class="k">)</span>:/home/balo/apps/phantomjs-1.9.7-linux-x86_64/bin
</span></span><span class="line"><span class="ln">2</span><span class="cl">$ java -jar selenium-server-standalone-2.42.2.jar</span></span></code></pre></div><h4 id="ruby-script-which-simulates-a-simple-login-flow">Ruby script which simulates a simple login flow</h4>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="c1"># encoding: utf-8</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="nb">require</span> <span class="s1">&#39;selenium-webdriver&#39;</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">
</span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="no">OPENAM_LOGIN_URI</span> <span class="o">=</span> <span class="s2">&#34;https://HOSTNAME/opensso/UI/Login?service=oauthchain&#34;</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">
</span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="no">CAPS</span> <span class="o">=</span> <span class="no">Selenium</span><span class="o">::</span><span class="no">WebDriver</span><span class="o">::</span><span class="no">Remote</span><span class="o">::</span><span class="no">Capabilities</span><span class="o">.</span><span class="n">phantomjs</span><span class="p">(</span><span class="s2">&#34;phantomjs.cli.args&#34;</span> <span class="o">=&gt;</span> <span class="o">[</span><span class="s1">&#39;--ignore-ssl-errors=true&#39;</span><span class="o">]</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">
</span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="k">def</span> <span class="nf">cleanup</span><span class="p">(</span><span class="n">driver</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">  <span class="n">driver</span><span class="o">.</span><span class="n">manage</span><span class="o">.</span><span class="n">delete_all_cookies</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">  <span class="n">driver</span><span class="o">.</span><span class="n">quit</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="k">end</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">
</span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="k">def</span> <span class="nf">login_process</span><span class="p">(</span><span class="n">driver</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl">  <span class="n">driver</span><span class="o">.</span><span class="n">get</span> <span class="no">OPENAM_LOGIN_URI</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl">
</span></span><span class="line"><span class="ln">16</span><span class="cl">  <span class="c1"># OpenAM automatically redirects to the login form of the custom OAuth2 provider</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl">  <span class="n">user_field</span> <span class="o">=</span> <span class="n">driver</span><span class="o">.</span><span class="n">find_element</span> <span class="nb">id</span><span class="p">:</span> <span class="s2">&#34;LoginForm_username&#34;</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl">  <span class="n">user_field</span><span class="o">.</span><span class="n">send_keys</span> <span class="s2">&#34;&lt;&lt;username&gt;&gt;&#34;</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl">  <span class="n">pass_field</span> <span class="o">=</span> <span class="n">driver</span><span class="o">.</span><span class="n">find_element</span> <span class="nb">id</span><span class="p">:</span> <span class="s2">&#34;LoginForm_password&#34;</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl">  <span class="n">pass_field</span><span class="o">.</span><span class="n">send_keys</span> <span class="s2">&#34;&lt;&lt;password&gt;&gt;&#34;</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl">  <span class="n">pass_field</span><span class="o">.</span><span class="n">submit</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl">
</span></span><span class="line"><span class="ln">23</span><span class="cl">  <span class="nb">sleep</span> <span class="mi">1</span>
</span></span><span class="line"><span class="ln">24</span><span class="cl">
</span></span><span class="line"><span class="ln">25</span><span class="cl">  <span class="c1"># Handle the case when we have to give permission to the application</span>
</span></span><span class="line"><span class="ln">26</span><span class="cl">  <span class="k">if</span> <span class="n">driver</span><span class="o">.</span><span class="n">title</span><span class="o">.</span><span class="n">eql?</span> <span class="s2">&#34;Authorize application&#34;</span>
</span></span><span class="line"><span class="ln">27</span><span class="cl">    <span class="n">driver</span><span class="o">.</span><span class="n">find_element</span><span class="p">(</span><span class="nb">name</span><span class="p">:</span> <span class="s2">&#34;authorized&#34;</span><span class="p">)</span><span class="o">.</span><span class="n">click</span>
</span></span><span class="line"><span class="ln">28</span><span class="cl">  <span class="k">end</span>
</span></span><span class="line"><span class="ln">29</span><span class="cl">
</span></span><span class="line"><span class="ln">30</span><span class="cl">  <span class="n">wait</span> <span class="o">=</span> <span class="no">Selenium</span><span class="o">::</span><span class="no">WebDriver</span><span class="o">::</span><span class="no">Wait</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="ss">timeout</span><span class="p">:</span> <span class="mi">20</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">31</span><span class="cl">  <span class="k">begin</span>
</span></span><span class="line"><span class="ln">32</span><span class="cl">    <span class="n">wait</span><span class="o">.</span><span class="n">until</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">33</span><span class="cl">      <span class="c1"># OpenAM login url or in case of success, the protected app</span>
</span></span><span class="line"><span class="ln">34</span><span class="cl">      <span class="n">driver</span><span class="o">.</span><span class="n">current_url</span><span class="o">.</span><span class="n">start_with?</span> <span class="no">OPENAM_LOGIN_URI</span> <span class="ow">or</span> <span class="n">driver</span><span class="o">.</span><span class="n">current_url</span><span class="o">.</span><span class="n">include?</span> <span class="s2">&#34;myprotectedapp.com&#34;</span>
</span></span><span class="line"><span class="ln">35</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">36</span><span class="cl">
</span></span><span class="line"><span class="ln">37</span><span class="cl">    <span class="c1"># On failure it will redirect to the OpenAM login url which displays the error</span>
</span></span><span class="line"><span class="ln">38</span><span class="cl">    <span class="k">raise</span> <span class="s2">&#34;gotcha: </span><span class="si">#{</span><span class="n">driver</span><span class="o">.</span><span class="n">title</span><span class="si">}</span><span class="s2">&#34;</span> <span class="k">if</span> <span class="n">driver</span><span class="o">.</span><span class="n">current_url</span><span class="o">.</span><span class="n">start_with?</span> <span class="no">OPENAM_LOGIN_URI</span>
</span></span><span class="line"><span class="ln">39</span><span class="cl">  <span class="k">ensure</span>
</span></span><span class="line"><span class="ln">40</span><span class="cl">    <span class="n">cleanup</span><span class="p">(</span><span class="n">driver</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">41</span><span class="cl">  <span class="k">end</span>
</span></span><span class="line"><span class="ln">42</span><span class="cl"><span class="k">end</span>
</span></span><span class="line"><span class="ln">43</span><span class="cl">
</span></span><span class="line"><span class="ln">44</span><span class="cl"><span class="n">driver</span> <span class="o">=</span> <span class="no">Selenium</span><span class="o">::</span><span class="no">WebDriver</span><span class="o">.</span><span class="n">for</span> <span class="ss">:remote</span><span class="p">,</span> <span class="ss">url</span><span class="p">:</span> <span class="s2">&#34;http://127.0.0.1:4444/wd/hub&#34;</span><span class="p">,</span> <span class="ss">desired_capabilities</span><span class="p">:</span> <span class="no">CAPS</span>
</span></span><span class="line"><span class="ln">45</span><span class="cl"><span class="n">login_process</span> <span class="n">driver</span></span></span></code></pre></div><p>Call the script above with JMeter OS Process Sampler a few thousand times on 4 threads and wait for failed login operations</p>





<pre tabindex="0"><code>Command: /home/balo/.rbenv/versions/2.1.2/bin/ruby
Parameter: /home/balo/code/src/github.com/vbalazs/vir-auth/do-logins.rb</code></pre>
        <figure style="text-align: center">
          <img
            src="/2014/08/my-adventures-with-tracking-down-a-database-leak/images/jmeter-auth-graph_results_hu_2edbd7f23efcef68.png"
            width="1920"
            height="1025"
            alt=""
            title=""
            >
          <figcaption class="not-prose text-sm">
              <i>
jmeter graph results showing ~50 logins/minute
</i>
          </figcaption>
        </figure>

<h2 id="about-the-bug">About the bug</h2>
<p>I implemented my database connection class as an <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/AutoCloseable.html">AutoCloseable</a>. My mistake was that I wanted to be smart. I made lazy connection initialization (why?!) and connection validation to make sure I handle every possible corner case in the universe. A friendly suggestion: don&rsquo;t do it.</p>

        <figure style="text-align: center">
          <img
            src="/2014/08/my-adventures-with-tracking-down-a-database-leak/images/twitter_nvining_status_500094840865304577_hu_492db08202b46748.webp"
            width="590"
            height="138"
            alt=""
            title=""
            >
          <figcaption class="not-prose text-sm">
              <i>
<a href="https://twitter.com/nvining/status/500094840865304577">Tweet</a> by @nvining: A Reminder: Kreimeier's Law of Programming states "If you think you are doing something smart, you are probably doing something stupid."
</i>
          </figcaption>
        </figure>

<p>I <a href="https://github.com/kir-dev/vir-auth/pull/6">simplified</a> the code, from now on, it initialises the connection in the constructor and fail early if something went wrong.</p>
<p><strong>Update (07 Sept 2014)</strong>: <a href="https://github.com/aldaris">@aldaris</a> pointed out that my fix didn&rsquo;t completely solve the issue. You can see his PR <a href="https://github.com/kir-dev/vir-auth/pull/7">here</a>. Thanks!</p>
]]></content:encoded></item><item><title>Create application from a specified git SHA on Openshift</title><link>https://vbalazs.info/2014/07/create-application-from-a-specified-git-sha-on-openshift.html</link><pubDate>Sat, 26 Jul 2014 15:05:00 +0200</pubDate><guid>https://vbalazs.info/2014/07/create-application-from-a-specified-git-sha-on-openshift.html</guid><description>&lt;p>Currently there are two options to do this on Openshift. Probably everyone will
meet the web console interface first, where one can specify the location of
an existing source code repository which will be copied and used for the
application. There is also an input for the branch or tag (or SHA) if the
head of master is not adequate.&lt;/p>
&lt;p>The second, less known solution is to use the &lt;code>rhc&lt;/code> ( &lt;strong>R&lt;/strong>ed &lt;strong>H&lt;/strong>at &lt;strong>C&lt;/strong>loud)
command line tool.&lt;/p></description><content:encoded><![CDATA[<p>Currently there are two options to do this on Openshift. Probably everyone will
meet the web console interface first, where one can specify the location of
an existing source code repository which will be copied and used for the
application. There is also an input for the branch or tag (or SHA) if the
head of master is not adequate.</p>
<p>The second, less known solution is to use the <code>rhc</code> ( <strong>R</strong>ed <strong>H</strong>at <strong>C</strong>loud)
command line tool.</p>
<p>It has a <code>--from-code</code> option and you can also specify git ref however I didn&rsquo;t
find this in the documentation. Simply append your branch, tag or SHA after the
git repository, followed by <code>#</code> character.</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="ln">1</span><span class="cl">$ rhc create-app myapp php-5.4 --from-code https://github.com/nick/myapp.git#9fbfc057</span></span></code></pre></div><p>Be aware that there is a <a href="https://bugzilla.redhat.com/show_bug.cgi?id=1122515">bug</a>
which makes this parameter ignored if the name of branch contains <code>/</code> character.</p>
<p>Both methods send requests to the Broker via REST API. You can read about what
happens when you create an application
<a href="https://gist.github.com/Filirom1/6b6aa05a24bf2fcd4a7c">here</a>, thanks to
<a href="https://github.com/Filirom1">Filirom1</a>.</p>
]]></content:encoded></item><item><title>My Simonyi Conference talk</title><link>https://vbalazs.info/2014/04/my-simonyi-conference-talk.html</link><pubDate>Wed, 23 Apr 2014 19:15:00 +0200</pubDate><guid>https://vbalazs.info/2014/04/my-simonyi-conference-talk.html</guid><description>&lt;p>While I was at MLOC.JS I spoke with &lt;a href="https://twitter.com/tmichelberger">Tamas&lt;/a> and &lt;a href="https://twitter.com/SzabolcsVaradi">Szabolcs&lt;/a> about the opportunity to talk at the &lt;a href="http://konferencia.simonyi.bme.hu/">Simonyi Conference&lt;/a> in April.
This post is about my experiences, research and learning processes I went through while I prepared for my presentation.&lt;/p>
&lt;p>TL;DR: you can find my slides &lt;a href="https://www.slideshare.net/slideshow/run-on-the-jvm/33564871">here&lt;/a>:&lt;/p>
&lt;p align="center">
 &lt;iframe src="http://www.slideshare.net/slideshow/embed_code/33564871?rel=0" width="500" height="350" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px 1px 0; margin-bottom:5px; max-width: 100%;" allowfullscreen> &lt;/iframe>
&lt;/p>

&lt;p>I was a bit nervous because I have never presented at a conference before (neither at a meetup at that time) but I thought, here is my chance to take a big step forward. I kind of knew what I&amp;rsquo;d like to talk about. I got excited when I read about OpenJDK Graal and Truffle on the &lt;a href="http://blog.jruby.org/2014/01/truffle_graal_high_performance_backend/">JRuby blog&lt;/a> in January, I wanted to dig deeper into the topic. I sent my abstract and I began to work.&lt;/p></description><content:encoded><![CDATA[<p>While I was at MLOC.JS I spoke with <a href="https://twitter.com/tmichelberger">Tamas</a> and <a href="https://twitter.com/SzabolcsVaradi">Szabolcs</a> about the opportunity to talk at the <a href="http://konferencia.simonyi.bme.hu/">Simonyi Conference</a> in April.
This post is about my experiences, research and learning processes I went through while I prepared for my presentation.</p>
<p>TL;DR: you can find my slides <a href="https://www.slideshare.net/slideshow/run-on-the-jvm/33564871">here</a>:</p>
<p align="center">
  <iframe src="http://www.slideshare.net/slideshow/embed_code/33564871?rel=0" width="500" height="350" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px 1px 0; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe>
</p>

<p>I was a bit nervous because I have never presented at a conference before (neither at a meetup at that time) but I thought, here is my chance to take a big step forward. I kind of knew what I&rsquo;d like to talk about. I got excited when I read about OpenJDK Graal and Truffle on the <a href="http://blog.jruby.org/2014/01/truffle_graal_high_performance_backend/">JRuby blog</a> in January, I wanted to dig deeper into the topic. I sent my abstract and I began to work.</p>
<p>I researched two topics in parallel. On one hand, how to give a good talk and on the other hand, the main subject of my presentation itself.</p>
<h2 id="how-to-give-a-good-talk">How to give a good talk</h2>
<p>I read a ton of article about this and I&rsquo;m still not sure how to be a great performer. There are too much information out there, I can&rsquo;t keep all the rules and &ldquo;advices&rdquo;. I felt I will be the worst on the whole conference&hellip; And not just on this event but every conference ever :D
Then I read Avdi Grimm&rsquo;s post about <a href="http://devblog.avdi.org/2014/04/08/how-to-suck-at-conference-talks/">&ldquo;How to suck at Conference talks&rdquo;</a> and finally, I was able to relax. I couldn&rsquo;t thank him enough for his article.
I also highly recommend <a href="http://speaking.io/">speaking.io</a> as an excellent &ldquo;cut the BS&rdquo; source.</p>
<h2 id="on-the-professional-side">On the professional side</h2>
<p>I knew how JRuby works but this was a new topic so I started with the basics. Fortunately, I found great resources, including some good papers:</p>
<ul>
<li>Christian Wimmer and Chris Seaton speak at the JVM Language Summit, July 31, 2013. <a href="http://medianetwork.oracle.com/video/player/2623645003001">(link)</a></li>
<li>Thomas Würthinger, Christian Wimmer, Andreas Wöß, Lukas Stadler, Gilles Duboscq, Christian Humer, Gregor Richards, Doug Simon, Mario Wolczko: One VM to Rule Them All. In Proceedings of Onward!, ACM Press, 2013. <a href="http://lafo.ssw.uni-linz.ac.at/papers/2013_Onward_OneVMToRuleThemAll.pdf">(link)</a></li>
<li>Thomas Würthinger, Andreas Wöß, Lukas Stadler, Gilles Duboscq, Doug Simon, Christian Wimmer: Self-Optimizing AST Interpreters. In Proceedings of the Dynamic Languages Symposium, pages 73–82. ACM Press, 2012. <a href="http://lafo.ssw.uni-linz.ac.at/papers/2012_DLS_SelfOptimizingASTInterpreters.pdf">(link)</a></li>
<li>Pat Shaughnessy: Ruby Under a Microscope, ISBN-13: 978-1-59327-527-3 <a href="http://patshaughnessy.net/ruby-under-a-microscope">(link)</a></li>
</ul>
<p>I had the oppurtinity to chat with <a href="http://www.chrisseaton.com">Chris Seaton</a> on IRC and on Skype. He helped me to set up a quick development environment and provided good pointers where could I research further. (Thanks!)</p>
<p>After that, the main problem was to how should I structure my talk. The Simonyi conference is an open and free event for everyone, organized by university students every year. I couldn&rsquo;t rely on the programming knowledge of the audience, it wasn&rsquo;t an exclusive event only for coders and engineers. Because the nature of the topic, I had to balance between the fans of dynamic languages and Java too. I wanted my topic to be interesting for everyone so I rewrote my whole talk like 3 times. Finally I found an approach which I could live with.</p>
<p>Then I faced the next problem: my 25 minutes barrier. I needed to be careful about what I will tell to the audience and what I won&rsquo;t, and to stay entertaining and comprehensible at the same time. I finished my talk in 28 minutes so I definitely have room for improvement.</p>
<p>I feel the presentation could be better but I got some promising feedback. Hopefully I shed light on the bright future of JVM and more people will contribute to these projects.</p>
<p>I&rsquo;d like to thank the reviews and support to Szabolcs and Tamas as well as the conference technical help to <a href="https://twitter.com/ghaabor">Gabor</a>.</p>
]]></content:encoded></item><item><title>Use tabs with angular.js</title><link>https://vbalazs.info/2013/12/use-tabs-with-angular-js.html</link><pubDate>Tue, 31 Dec 2013 12:01:00 +0100</pubDate><guid>https://vbalazs.info/2013/12/use-tabs-with-angular-js.html</guid><description>&lt;p>&lt;em>This page was first published on December 31th 2013 and was last updated on January 4th 2014. See the update below.&lt;/em>&lt;/p>
&lt;p>It&amp;rsquo;s not complicated to create tabs with custom templates in angular but I had to research a bit so maybe you won&amp;rsquo;t have to.&lt;/p>
&lt;p>We will use &lt;a href="http://docs.angularjs.org/api/ng.directive:ngSwitch">ngSwitch directive&lt;/a> to check the &lt;code>activeTab&lt;/code> variable and &lt;a href="http://docs.angularjs.org/api/ng.directive:ngInclude">ngInclude&lt;/a> to load the right template. In earlier versions of angular it was a bit simpler to do this because we were able to use the same tag for &lt;code>ng-switch-when&lt;/code> and &lt;code>ng-include&lt;/code> but it&amp;rsquo;s not the case &lt;a href="https://github.com/angular/angular.js/issues/4731">since 1.2 RC3&lt;/a>. You can read the explanation &lt;a href="https://github.com/angular/angular.js/issues/3584#issuecomment-26553693">here&lt;/a>.&lt;/p></description><content:encoded><![CDATA[<p><em>This page was first published on December 31th 2013 and was last updated on January 4th 2014. See the update below.</em></p>
<p>It&rsquo;s not complicated to create tabs with custom templates in angular but I had to research a bit so maybe you won&rsquo;t have to.</p>
<p>We will use <a href="http://docs.angularjs.org/api/ng.directive:ngSwitch">ngSwitch directive</a> to check the <code>activeTab</code> variable and <a href="http://docs.angularjs.org/api/ng.directive:ngInclude">ngInclude</a> to load the right template. In earlier versions of angular it was a bit simpler to do this because we were able to use the same tag for <code>ng-switch-when</code> and <code>ng-include</code> but it&rsquo;s not the case <a href="https://github.com/angular/angular.js/issues/4731">since 1.2 RC3</a>. You can read the explanation <a href="https://github.com/angular/angular.js/issues/3584#issuecomment-26553693">here</a>.</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="p">&lt;</span><span class="nt">ul</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">    <span class="p">&lt;</span><span class="nt">li</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;pure-button&#34;</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">        <span class="na">ng-class</span><span class="o">=</span><span class="s">&#34;{&#39;pure-button-active&#39;: activeTab === &#39;signup&#39;}&#34;</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">        <span class="na">ng-click</span><span class="o">=</span><span class="s">&#34;activeTab = &#39;signup&#39;&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">        Sign Up
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">    <span class="p">&lt;/</span><span class="nt">li</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">    <span class="p">&lt;</span><span class="nt">li</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;pure-button&#34;</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">        <span class="na">ng-class</span><span class="o">=</span><span class="s">&#34;{&#39;pure-button-active&#39;: activeTab === &#39;login&#39;}&#34;</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">        <span class="na">ng-click</span><span class="o">=</span><span class="s">&#34;activeTab = &#39;login&#39;&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">        Log in
</span></span><span class="line"><span class="ln">11</span><span class="cl">    <span class="p">&lt;/</span><span class="nt">li</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="p">&lt;/</span><span class="nt">ul</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;tab-content&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl">    <span class="p">&lt;</span><span class="nt">div</span> <span class="na">ng-switch</span><span class="o">=</span><span class="s">&#34;activeTab&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl">        <span class="p">&lt;</span><span class="nt">div</span> <span class="na">ng-switch-when</span><span class="o">=</span><span class="s">&#34;signup&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl">            <span class="p">&lt;</span><span class="nt">div</span> <span class="na">ng-include</span><span class="o">=</span><span class="s">&#34;&#39;partials/signup.html&#39;&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl">        <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl">        <span class="p">&lt;</span><span class="nt">div</span> <span class="na">ng-switch-when</span><span class="o">=</span><span class="s">&#34;login&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl">            <span class="p">&lt;</span><span class="nt">div</span> <span class="na">ng-include</span><span class="o">=</span><span class="s">&#34;&#39;partials/login-box.html&#39;&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl">        <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl">    <span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl"><span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span></span></span></code></pre></div><p>Of course we will need a default value for <code>activeTab</code> so we set it in the controller.</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-javascript" data-lang="javascript"><span class="line"><span class="ln">1</span><span class="cl"><span class="nx">angular</span><span class="p">.</span><span class="nx">module</span><span class="p">(</span><span class="s1">&#39;frontendApp.controllers&#39;</span><span class="p">,</span> <span class="p">[]).</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl">  <span class="nx">controller</span><span class="p">(</span><span class="s1">&#39;LoginSignUpCtrl&#39;</span><span class="p">,</span> <span class="p">[</span><span class="s1">&#39;$scope&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">$scope</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">3</span><span class="cl">      <span class="nx">$scope</span><span class="p">.</span><span class="nx">activeTab</span> <span class="o">=</span> <span class="s1">&#39;login&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="p">}]);</span></span></span></code></pre></div><p>Angular is pretty smart here, it loads only the default tab and if you reopen an already visited tab it won&rsquo;t download the template again.</p>
<p><strong>Update (04 Jan 2014)</strong>: The solution above works until we don&rsquo;t want to do other operations when a user switches to an other tab. I modified the original code which turned out to be more readable.</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="ln"> 1</span><span class="cl"> <span class="p">&lt;</span><span class="nt">ul</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">    <span class="p">&lt;</span><span class="nt">li</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;pure-button&#34;</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">        <span class="na">ng-class</span><span class="o">=</span><span class="s">&#34;{&#39;pure-button-active&#39;: activeTab === &#39;signup&#39;}&#34;</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">        <span class="na">ng-click</span><span class="o">=</span><span class="s">&#34;switchTabTo(&#39;signup&#39;)&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">        Sign Up
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">    <span class="p">&lt;/</span><span class="nt">li</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">    <span class="p">&lt;</span><span class="nt">li</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;pure-button&#34;</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">        <span class="na">ng-class</span><span class="o">=</span><span class="s">&#34;{&#39;pure-button-active&#39;: activeTab === &#39;login&#39;}&#34;</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">        <span class="na">ng-click</span><span class="o">=</span><span class="s">&#34;switchTabTo(&#39;login&#39;)&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">        Log in
</span></span><span class="line"><span class="ln">11</span><span class="cl">    <span class="p">&lt;/</span><span class="nt">li</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="p">&lt;/</span><span class="nt">ul</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;tab-content&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl">    <span class="p">&lt;</span><span class="nt">div</span> <span class="na">ng-include</span><span class="o">=</span><span class="s">&#34;tabTemplates[activeTab]&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span></span></span></code></pre></div>




<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-javascript" data-lang="javascript"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="nx">angular</span><span class="p">.</span><span class="nx">module</span><span class="p">(</span><span class="s1">&#39;frontendApp.controllers&#39;</span><span class="p">,</span> <span class="p">[]).</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">  <span class="nx">controller</span><span class="p">(</span><span class="s1">&#39;LoginSignUpCtrl&#39;</span><span class="p">,</span> <span class="p">[</span><span class="s1">&#39;$scope&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">$scope</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">      <span class="nx">$scope</span><span class="p">.</span><span class="nx">activeTab</span> <span class="o">=</span> <span class="s1">&#39;login&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">      <span class="nx">$scope</span><span class="p">.</span><span class="nx">tabTemplates</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">        <span class="nx">login</span><span class="o">:</span> <span class="s1">&#39;partials/login-box.html&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">        <span class="nx">signup</span><span class="o">:</span> <span class="s1">&#39;partials/signup.html&#39;</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">      <span class="p">};</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">      <span class="nx">$scope</span><span class="p">.</span><span class="nx">switchTabTo</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">tabId</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">        <span class="nx">$scope</span><span class="p">.</span><span class="nx">activeTab</span> <span class="o">=</span> <span class="nx">tabId</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">        <span class="cm">/* other stuff to do */</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">      <span class="p">};</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="p">}]);</span></span></span></code></pre></div>]]></content:encoded></item><item><title>How not to commit passwords to OpenShift's repository</title><link>https://vbalazs.info/2013/12/how-not-to-commit-passwords-to-openshift.html</link><pubDate>Mon, 23 Dec 2013 13:05:00 +0100</pubDate><guid>https://vbalazs.info/2013/12/how-not-to-commit-passwords-to-openshift.html</guid><description>&lt;p>In the last couple of days I played with &lt;a href="https://www.openshift.com">OpenShift&lt;/a>, a PaaS made by RedHat. I moved one of my ruby application from VPS to there. As you may know, OpenShift is working from git repositories so a push means build and deploy.&lt;/p>
&lt;p>That means (almost&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup>) everything has to be pushed to the repository. We know that to commit &lt;a href="http://blog.shubh.am/prezi-bug-bounty/">passwords&lt;/a> and &lt;a href="http://www.phenoelit.org/blog/archives/2012/12/21/let_me_github_that_for_you/">secret keys&lt;/a> is a bad idea. But don’t worry, use OpenShift’s &lt;a href="https://www.openshift.com/page/openshift-environment-variables">environment variables&lt;/a>! :)&lt;/p></description><content:encoded><![CDATA[<p>In the last couple of days I played with <a href="https://www.openshift.com">OpenShift</a>, a PaaS made by RedHat. I moved one of my ruby application from VPS to there. As you may know, OpenShift is working from git repositories so a push means build and deploy.</p>
<p>That means (almost<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>) everything has to be pushed to the repository. We know that to commit <a href="http://blog.shubh.am/prezi-bug-bounty/">passwords</a> and <a href="http://www.phenoelit.org/blog/archives/2012/12/21/let_me_github_that_for_you/">secret keys</a> is a bad idea. But don’t worry, use OpenShift’s <a href="https://www.openshift.com/page/openshift-environment-variables">environment variables</a>! :)</p>
<p>The nice thing is, you can easily insert these variables into yml files, so your database config can be look like this:</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="nt">production</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="w">  </span><span class="nt">adapter</span><span class="p">:</span><span class="w"> </span><span class="l">mysql2</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="w">  </span><span class="nt">database</span><span class="p">:</span><span class="w"> </span><span class="l">&lt;%= ENV[&#39;OPENSHIFT_APP_NAME&#39;] %&gt;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="w">  </span><span class="nt">host</span><span class="p">:</span><span class="w"> </span><span class="l">&lt;%= ENV[&#39;OPENSHIFT_MYSQL_DB_HOST&#39;] %&gt;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="w">  </span><span class="nt">port</span><span class="p">:</span><span class="w"> </span><span class="l">&lt;%= ENV[&#39;OPENSHIFT_MYSQL_DB_PORT&#39;] %&gt;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="w">  </span><span class="nt">username</span><span class="p">:</span><span class="w"> </span><span class="l">&lt;%= ENV[&#39;OPENSHIFT_MYSQL_DB_USERNAME&#39;] %&gt;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="w">  </span><span class="nt">password</span><span class="p">:</span><span class="w"> </span><span class="l">&lt;%= ENV[&#39;OPENSHIFT_MYSQL_DB_PASSWORD&#39;] %&gt;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="w">  </span><span class="nt">socket</span><span class="p">:</span><span class="w"> </span><span class="l">&lt;%= ENV[&#39;OPENSHIFT_MYSQL_DB_SOCKET&#39;] %&gt;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="w">  </span><span class="nt">encoding</span><span class="p">:</span><span class="w"> </span><span class="l">utf8</span><span class="w">
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="w">  </span><span class="nt">pool</span><span class="p">:</span><span class="w"> </span><span class="m">5</span></span></span></code></pre></div><h3 id="what-about-custom-secrets-and-keys">What about custom secrets and keys?</h3>
<p>Well, you can set custom environment variables with rhc. I made a simple text file with my variables:</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="ln">1</span><span class="cl"><span class="nv">DROPBOX_APP_KEY</span><span class="o">=</span>...
</span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="nv">DROPBOX_APP_SECRET</span><span class="o">=</span>...</span></span></code></pre></div><p>Then add them with set-env command:</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="ln">1</span><span class="cl">$ rhc set-env my/dir/openshift-env-vars -a myappname</span></span></code></pre></div><p>Of course you shouldn’t commit this file to any repository.</p>
<p>You can test it with rhc:</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="ln">1</span><span class="cl">$ rhc ssh -a myappname
</span></span><span class="line"><span class="ln">2</span><span class="cl">$ env <span class="p">|</span> grep DROPBOX</span></span></code></pre></div><p>If you were connected to ssh while adding the variables, you should reconnect or check them from <code>irb</code>.</p>
<p><strong>Tip</strong>: now you can use <a href="https://www.openshift.com/kb/kb-e1006-sync-new-git-repo-with-your-own-existing-git-repo#comment-24175">one repository with more than one remote</a>.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>You have a data folder in the app-root directory, you can store some resources there.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded></item><item><title>Proper JSON output with JAX-RS</title><link>https://vbalazs.info/2013/03/proper-json-output-with-jax-rs.html</link><pubDate>Sun, 10 Mar 2013 12:51:00 +0100</pubDate><guid>https://vbalazs.info/2013/03/proper-json-output-with-jax-rs.html</guid><description>&lt;p>I had to develop a &lt;a href="http://en.wikipedia.org/wiki/Representational_state_transfer#RESTful_web_services">REST webservice&lt;/a> endpoint recently in our JavaEE application. After we figured out what data the client needs we came to an agreement that we will produce &lt;a href="http://www.json.org/">JSON&lt;/a> output. I knew &lt;a href="http://jax-rs-spec.java.net">JAX-RS&lt;/a> can do that, so I simply wrote a method like this:&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-java" data-lang="java">&lt;span class="line">&lt;span class="ln"> 1&lt;/span>&lt;span class="cl">&lt;span class="nd">@GET&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 2&lt;/span>&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nd">@Produces&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">MediaType&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">APPLICATION_JSON&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 3&lt;/span>&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nd">@Path&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;/get/{param1}/{param2}&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 4&lt;/span>&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">List&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">ApprovedEntrant&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nf">getEntrants&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 5&lt;/span>&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nd">@PathParam&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;param1&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kd">final&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">String&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">param1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 6&lt;/span>&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nd">@PathParam&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;param2&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kd">final&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">String&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">param2&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 7&lt;/span>&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 8&lt;/span>&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">final&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">List&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">ApprovedEntrant&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">entrants&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">new&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">LinkedList&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">ApprovedEntrant&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>&lt;span class="p">();&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 9&lt;/span>&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">10&lt;/span>&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c1">// put elements in the list&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">11&lt;/span>&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">12&lt;/span>&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">return&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">entrants&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">13&lt;/span>&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="p">}&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>It seems to work as expected but sometimes we noticed weird results with the default JSON serialization of JAX-RS in Glassfish 3 (maybe &lt;a href="http://jersey.java.net">Jersey&lt;/a>?):&lt;/p></description><content:encoded><![CDATA[<p>I had to develop a <a href="http://en.wikipedia.org/wiki/Representational_state_transfer#RESTful_web_services">REST webservice</a> endpoint recently in our JavaEE application. After we figured out what data the client needs we came to an agreement that we will produce <a href="http://www.json.org/">JSON</a> output. I knew <a href="http://jax-rs-spec.java.net">JAX-RS</a> can do that, so I simply wrote a method like this:</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="nd">@GET</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="w"></span><span class="nd">@Produces</span><span class="p">(</span><span class="n">MediaType</span><span class="p">.</span><span class="na">APPLICATION_JSON</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="w"></span><span class="nd">@Path</span><span class="p">(</span><span class="s">&#34;/get/{param1}/{param2}&#34;</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="w"></span><span class="kd">public</span><span class="w"> </span><span class="n">List</span><span class="o">&lt;</span><span class="n">ApprovedEntrant</span><span class="o">&gt;</span><span class="w"> </span><span class="nf">getEntrants</span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="w">            </span><span class="nd">@PathParam</span><span class="p">(</span><span class="s">&#34;param1&#34;</span><span class="p">)</span><span class="w"> </span><span class="kd">final</span><span class="w"> </span><span class="n">String</span><span class="w"> </span><span class="n">param1</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="w">            </span><span class="nd">@PathParam</span><span class="p">(</span><span class="s">&#34;param2&#34;</span><span class="p">)</span><span class="w"> </span><span class="kd">final</span><span class="w"> </span><span class="n">String</span><span class="w"> </span><span class="n">param2</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="w">     </span><span class="kd">final</span><span class="w"> </span><span class="n">List</span><span class="o">&lt;</span><span class="n">ApprovedEntrant</span><span class="o">&gt;</span><span class="w"> </span><span class="n">entrants</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">LinkedList</span><span class="o">&lt;</span><span class="n">ApprovedEntrant</span><span class="o">&gt;</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="w">     </span><span class="c1">// put elements in the list</span><span class="w">
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="w">     </span><span class="k">return</span><span class="w"> </span><span class="n">entrants</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="w"></span><span class="p">}</span></span></span></code></pre></div><p>It seems to work as expected but sometimes we noticed weird results with the default JSON serialization of JAX-RS in Glassfish 3 (maybe <a href="http://jersey.java.net">Jersey</a>?):</p>
<ul>
<li>in case of an empty list (!), it produces <code>&quot;null&quot;</code> string output</li>
<li>if the list contains only one element, the result is the element in JSON object, instead of a JSON array with one element</li>
</ul>
<p>Of course, I could import the official <a href="http://json.org/java/">JSON Java library</a> and do some <code>toString()</code> or object transform tricks, but I don’t want to introduce another dependency in my widely used domain project. I want to solve it in the webservice layer, without manual object / list JSON transformations. After some research I found the Jackson project which has a smarter JAX-RS JSON provider.</p>
<p>First, I added the new dependency to my webservice project:</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-xml" data-lang="xml"><span class="line"><span class="ln">1</span><span class="cl"><span class="nt">&lt;dependency&gt;</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl">    <span class="nt">&lt;groupId&gt;</span>com.fasterxml.jackson.jaxrs<span class="nt">&lt;/groupId&gt;</span>
</span></span><span class="line"><span class="ln">3</span><span class="cl">    <span class="nt">&lt;artifactId&gt;</span>jackson-jaxrs-json-provider<span class="nt">&lt;/artifactId&gt;</span>
</span></span><span class="line"><span class="ln">4</span><span class="cl">    <span class="nt">&lt;version&gt;</span>2.1.4<span class="nt">&lt;/version&gt;</span>
</span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="nt">&lt;/dependency&gt;</span></span></span></code></pre></div><p>Then I had to modify my code a bit, but I think it&rsquo;s quite normal and doesn’t contain ugly JSON objects and arrays.</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="kd">private</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="n">ObjectMapper</span><span class="w"> </span><span class="n">mapper</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">ObjectMapper</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="w"></span><span class="nd">@GET</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="w"></span><span class="nd">@Produces</span><span class="p">(</span><span class="n">MediaType</span><span class="p">.</span><span class="na">APPLICATION_JSON</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="w"></span><span class="nd">@Path</span><span class="p">(</span><span class="s">&#34;/get/{param1}/{param2}&#34;</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="w"></span><span class="kd">public</span><span class="w"> </span><span class="n">String</span><span class="w"> </span><span class="nf">getEntrants</span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="w">            </span><span class="nd">@PathParam</span><span class="p">(</span><span class="s">&#34;param1&#34;</span><span class="p">)</span><span class="w"> </span><span class="kd">final</span><span class="w"> </span><span class="n">String</span><span class="w"> </span><span class="n">param1</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="w">            </span><span class="nd">@PathParam</span><span class="p">(</span><span class="s">&#34;param2&#34;</span><span class="p">)</span><span class="w"> </span><span class="kd">final</span><span class="w"> </span><span class="n">String</span><span class="w"> </span><span class="n">param2</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="w">     </span><span class="kd">final</span><span class="w"> </span><span class="n">List</span><span class="o">&lt;</span><span class="n">ApprovedEntrant</span><span class="o">&gt;</span><span class="w"> </span><span class="n">entrants</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">LinkedList</span><span class="o">&lt;</span><span class="n">ApprovedEntrant</span><span class="o">&gt;</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="w">     </span><span class="c1">// put elements in the list</span><span class="w">
</span></span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="w">     </span><span class="n">String</span><span class="w"> </span><span class="n">out</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&#34;&#34;</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="w">     </span><span class="k">try</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="w">         </span><span class="n">out</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">mapper</span><span class="p">.</span><span class="na">writeValueAsString</span><span class="p">(</span><span class="n">entrants</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="w">     </span><span class="p">}</span><span class="w"> </span><span class="k">catch</span><span class="w"> </span><span class="p">(</span><span class="n">JsonProcessingException</span><span class="w"> </span><span class="n">ex</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">18</span><span class="cl"><span class="w">         </span><span class="c1">//error handling</span><span class="w">
</span></span></span><span class="line"><span class="ln">19</span><span class="cl"><span class="w">     </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln">20</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln">21</span><span class="cl"><span class="w">     </span><span class="k">return</span><span class="w"> </span><span class="n">out</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln">22</span><span class="cl"><span class="w"></span><span class="p">}</span></span></span></code></pre></div>]]></content:encoded></item><item><title>Trükkös facebook spam - böngésző kiterjesztéssel</title><link>https://vbalazs.info/2012/08/trukkos-facebook-spam-bongeszo.html</link><pubDate>Sat, 04 Aug 2012 13:32:00 +0200</pubDate><guid>https://vbalazs.info/2012/08/trukkos-facebook-spam-bongeszo.html</guid><description>Általában nem írnék meg egy erről szóló bejegyzést, mert minden bokorban terem már egy valamilyen módon spamelő vagy kémkedő alkalmazás. Egy ismerősöm azzal keresett meg, hogy spam üzenetek jelennek meg a falán, amikben random ismerősök vannak betagelve. Gondoltam megint egy spammer facebook alkalmazás, de állította, hogy már minden alkalmazást kitörölt. Nekem is gyanús volt, hogy a feltöltött képek és bejegyzések a saját nevével érkeznek.&lt;br />
Itt még mindig egy primitív dologra gyanakodtam, de amikor jelszóváltoztatás után is érkeztek a bejegyzések már éreztem, hogy itt valami disznóság van, ezért elkezdtem nyomozni :)&lt;br />
&lt;div class="separator" style="clear: both; text-align: center;">
 &lt;a href="
 /2012/08/trukkos-facebook-spam-bongeszo/files/fb-post.png
" style="margin-left: 1em; margin-right: 1em;">
 
 &lt;figure style="">
 &lt;img
 src="https://vbalazs.info/2012/08/trukkos-facebook-spam-bongeszo/files/fb-post_hu_1f4c7a648902481e.webp"
 width="500"
 height="285"
 alt=""
 title=""
 >
 &lt;figcaption class="not-prose text-sm">
 &lt;/figcaption>
 &lt;/figure>

 &lt;/a>
&lt;/div>
A posztban lévő link egy &lt;a href="http://dl.dropbox.com/u/95861912/help.html">dropbox linkre&lt;/a> mutat, ami teljesen leutánozza a youtube kinézetét, azzal a kivétellel, hogy egy plugin telepítését kéri a felhasználótól! Itt már megszólal a vészcsengő egy tapasztaltabb felhasználónál, de a gyanútlan áldozatok rákattintanak. Gondolhatjuk, hogy megint csak egy oldal lájkoló láthatatlan &amp;lt;div&amp;gt;... De nézzük csak meg, hogy mit is csinál ez a link!&lt;br />
&lt;br />
&lt;i>(Sajnos erről képernyőképet nem készítettem először, azóta pedig a dropbox letiltotta, mert elérte a forgalmi korlátot. Ha holnap működik még az oldal, akkor frissítem a bejegyzést, addig higgyétek el nekem :-)&lt;/i>&lt;br />
&lt;br />
Többek között megvizsgálja a böngészőt és letölt egy ennek megfelelő bővítményt (Chrome és Firefox érintett, a többit átirányítja egy másik oldalra).&lt;br />
Kicsit utánajártam a Crome bővítménynek (&lt;a href="
 /2012/08/trukkos-facebook-spam-bongeszo/files/youtube.crx.deleteThis
">letölthető itt&lt;/a>, &lt;a href="
 /2012/08/trukkos-facebook-spam-bongeszo/files/plugin.xpi.deleteThis
">Firefox bővítmény itt&lt;/a>), egy "&lt;i>YouTube Premium Video&lt;/i>" kiterjesztésnek álcázza magát, valódi Youtube ikonokkal.&lt;br />
Az analytics (&lt;i>UA-31861921-1&lt;/i>) és whois.among.us (&lt;i>3bcmg6ofjwms&lt;/i>) statisztikákon kívül még behivatkozik egy, a konkrét spamelést és terjesztést végző javascriptet:&amp;nbsp;&lt;a href="http://feedbuzz.info/js.php">http://feedbuzz.info/js.php&lt;/a> (ha időközben elérhetetlenné válna, a kimenet &lt;a href="
 /2012/08/trukkos-facebook-spam-bongeszo/files/js.php
">letölthető itt&lt;/a>)&lt;br />
&lt;br />
&lt;b>&lt;span style="font-size: large;">Hogyan kerüljük el?&lt;/span>&lt;/b>&lt;br />
&lt;br />
&lt;ol>
&lt;li>&lt;b>Mindig ellenőrizzük a meglátogatott oldalak URL-jét&lt;/b>. Itt is feltűnhetett volna, hogy a szokásos youtube.com helyett dl.dropbox.com van.&lt;/li>
&lt;li>&lt;b>Gyanakodjunk&lt;/b>, ha egy gyakran látogatott, ismert működésű oldal hirtelen valaminek a letöltésére, elvégzésére kér fel.&lt;/li>
&lt;li>&lt;b>Csak megbízható forrásból telepítsünk bővítményeket&lt;/b> és időnként nézzük őket végig, a már nem használtakat töröljük, tiltsuk le!&lt;/li>
&lt;li>Ne higgyünk a &lt;i>kihagyhatatlan, úgy sem tudjuk x másodpercnél tovább nézni, Justin Bieber akasztása (!!!), kígyó megeszik egy embert&lt;/i>, egyéb badarságokat kínáló bejegyzéseknek. Ha mégis nagyon érdekel, akkor legyünk gyanakvóak és használjuk a &lt;i>Chrome jobb gomb a linkre -&amp;gt; Megnyitás inkognitó ablakban &lt;/i>funkcióját, így legalább a bejelentkezett munkamenetünkhöz nem férnek hozzá.&lt;/li>
&lt;/ol>
&lt;br />
&lt;div style="border: 1px solid silver; padding: 5px;">
&lt;b>Tipp&lt;/b>: ne csak a kiegészítőket, hanem a beépülőket is ellenőrizzük (Chrome esetében &lt;i>chrome://plugins&lt;/i>)! A &lt;b>nem használtakat pedig tiltsuk le&lt;/b> (pl. Remoting viewer, Microsoft Office, VLC, Silverlight, Java (!!!))&lt;/div>
&lt;br />
&lt;b>Megjegyzés 1&lt;/b>: nem tisztázott, hogy Chrome 21-re hogyan került fel a bővítmény egy idegen oldalról. Chrome 20-ban még felajánlotta, hogy telepítésre kerüljön-e, de a 21-es verzióban figyelmeztet, hogy csak az áruházból telepíthető bővítmény és emiatt elutasításra kerül. Linux alatti Chrome-ra pedig fel sem sikerült telepítenem, mert hibás bővítményt írt.&lt;br />
&lt;br />
&lt;b>Frissítés(08.05):&lt;/b>&amp;nbsp;a stuff másnak is feltűnt, az érdeklődők az &lt;a href="http://www.exposedbotnets.com/2012/08/feedbuzzinfo-malicious-browser.html">exposedbotnets&lt;/a>&amp;nbsp;oldalán további információkat és kódrészleteket találhatnak a kiterjesztéssel kapcsolatban.</description><content:encoded><![CDATA[
Általában nem írnék meg egy erről szóló bejegyzést, mert minden bokorban terem már egy valamilyen módon spamelő vagy kémkedő alkalmazás. Egy ismerősöm azzal keresett meg, hogy spam üzenetek jelennek meg a falán, amikben random ismerősök vannak betagelve. Gondoltam megint egy spammer facebook alkalmazás, de állította, hogy már minden alkalmazást kitörölt. Nekem is gyanús volt, hogy a feltöltött képek és bejegyzések a saját nevével érkeznek.<br />
Itt még mindig egy primitív dologra gyanakodtam, de amikor jelszóváltoztatás után is érkeztek a bejegyzések már éreztem, hogy itt valami disznóság van, ezért elkezdtem nyomozni :)<br />
<div class="separator" style="clear: both; text-align: center;">
  <a href="
    /2012/08/trukkos-facebook-spam-bongeszo/files/fb-post.png
" style="margin-left: 1em; margin-right: 1em;">
    
            <figure style="">
              <img
                src="/2012/08/trukkos-facebook-spam-bongeszo/files/fb-post_hu_1f4c7a648902481e.webp"
                width="500"
                height="285"
                alt=""
                title=""
                >
              <figcaption class="not-prose text-sm">
              </figcaption>
            </figure>

  </a>
</div>
A posztban lévő link egy <a href="http://dl.dropbox.com/u/95861912/help.html">dropbox linkre</a> mutat, ami teljesen leutánozza a youtube kinézetét, azzal a kivétellel, hogy egy plugin telepítését kéri a felhasználótól! Itt már megszólal a vészcsengő egy tapasztaltabb felhasználónál, de a gyanútlan áldozatok rákattintanak. Gondolhatjuk, hogy megint csak egy oldal lájkoló láthatatlan &lt;div&gt;... De nézzük csak meg, hogy mit is csinál ez a link!<br />
<br />
<i>(Sajnos erről képernyőképet nem készítettem először, azóta pedig a dropbox letiltotta, mert elérte a forgalmi korlátot. Ha holnap működik még az oldal, akkor frissítem a bejegyzést, addig higgyétek el nekem :-)</i><br />
<br />
Többek között megvizsgálja a böngészőt és letölt egy ennek megfelelő bővítményt (Chrome és Firefox érintett, a többit átirányítja egy másik oldalra).<br />
Kicsit utánajártam a Crome bővítménynek (<a href="
    /2012/08/trukkos-facebook-spam-bongeszo/files/youtube.crx.deleteThis
">letölthető itt</a>, <a href="
    /2012/08/trukkos-facebook-spam-bongeszo/files/plugin.xpi.deleteThis
">Firefox bővítmény itt</a>), egy "<i>YouTube Premium Video</i>" kiterjesztésnek álcázza magát, valódi Youtube ikonokkal.<br />
Az analytics (<i>UA-31861921-1</i>) és whois.among.us (<i>3bcmg6ofjwms</i>) statisztikákon kívül még behivatkozik egy, a konkrét spamelést és terjesztést végző javascriptet:&nbsp;<a href="http://feedbuzz.info/js.php">http://feedbuzz.info/js.php</a> (ha időközben elérhetetlenné válna, a kimenet <a href="
    /2012/08/trukkos-facebook-spam-bongeszo/files/js.php
">letölthető itt</a>)<br />
<br />
<b><span style="font-size: large;">Hogyan kerüljük el?</span></b><br />
<br />
<ol>
<li><b>Mindig ellenőrizzük a meglátogatott oldalak URL-jét</b>. Itt is feltűnhetett volna, hogy a szokásos youtube.com helyett dl.dropbox.com van.</li>
<li><b>Gyanakodjunk</b>, ha egy gyakran látogatott, ismert működésű oldal hirtelen valaminek a letöltésére, elvégzésére kér fel.</li>
<li><b>Csak megbízható forrásból telepítsünk bővítményeket</b> és időnként nézzük őket végig, a már nem használtakat töröljük, tiltsuk le!</li>
<li>Ne higgyünk a <i>kihagyhatatlan, úgy sem tudjuk x másodpercnél tovább nézni, Justin Bieber akasztása (!!!), kígyó megeszik egy embert</i>, egyéb badarságokat kínáló bejegyzéseknek. Ha mégis nagyon érdekel, akkor legyünk gyanakvóak és használjuk a <i>Chrome jobb gomb a linkre -&gt; Megnyitás inkognitó ablakban </i>funkcióját, így legalább a bejelentkezett munkamenetünkhöz nem férnek hozzá.</li>
</ol>
<br />
<div style="border: 1px solid silver; padding: 5px;">
<b>Tipp</b>: ne csak a kiegészítőket, hanem a beépülőket is ellenőrizzük (Chrome esetében <i>chrome://plugins</i>)! A <b>nem használtakat pedig tiltsuk le</b> (pl. Remoting viewer, Microsoft Office, VLC, Silverlight, Java (!!!))</div>
<br />
<b>Megjegyzés 1</b>: nem tisztázott, hogy Chrome 21-re hogyan került fel a bővítmény egy idegen oldalról. Chrome 20-ban még felajánlotta, hogy telepítésre kerüljön-e, de a 21-es verzióban figyelmeztet, hogy csak az áruházból telepíthető bővítmény és emiatt elutasításra kerül. Linux alatti Chrome-ra pedig fel sem sikerült telepítenem, mert hibás bővítményt írt.<br />
<br />
<b>Frissítés(08.05):</b>&nbsp;a stuff másnak is feltűnt, az érdeklődők az <a href="http://www.exposedbotnets.com/2012/08/feedbuzzinfo-malicious-browser.html">exposedbotnets</a>&nbsp;oldalán további információkat és kódrészleteket találhatnak a kiterjesztéssel kapcsolatban.
]]></content:encoded></item><item><title>Tíz parancsolat</title><link>https://vbalazs.info/2012/01/tiz-parancsolat.html</link><pubDate>Sat, 07 Jan 2012 21:28:00 +0100</pubDate><guid>https://vbalazs.info/2012/01/tiz-parancsolat.html</guid><description>&lt;p>Ezt a posztot korábban már megírtam a &lt;a href="http://vbalazs.posterous.com/tiz-parancsolat">posterous&lt;/a> oldalamon, ahol azóta sem született új bejegyzés. Egyszerűen nem vált be és amúgy sem szenvedek &lt;em>két blogra való&lt;/em> közléskényszerben. Viszont mindenképp tanulságos, ezért szerettem volna megosztani az év első bejegyzéseként (az &amp;ldquo;ismétlést&amp;rdquo; pedig nézzétek el nekem).&lt;/p>
&lt;p>Néha onnan jön az ötlet, ahonnan legkevésbé várnánk. Ha van lehetőségem, akkor ebéd közben a közszolgálati csatornákat nézem a trubadúrdobozban, így történt ez ma is, az M1-en belebotlottam &lt;a href="http://hu.wikipedia.org/wiki/Szil%C3%A1rd_Le%C3%B3">Szilárd Leó&lt;/a> életéről készült &lt;a href="http://premier.mtv.hu/Hirek/2011/02/09/09/Szilard_Leo__valamilyen_ertelemben_gyermek_tudtam_maradni.aspx">filmbe&lt;/a>.&lt;/p></description><content:encoded><![CDATA[<p>Ezt a posztot korábban már megírtam a <a href="http://vbalazs.posterous.com/tiz-parancsolat">posterous</a> oldalamon, ahol azóta sem született új bejegyzés. Egyszerűen nem vált be és amúgy sem szenvedek <em>két blogra való</em> közléskényszerben. Viszont mindenképp tanulságos, ezért szerettem volna megosztani az év első bejegyzéseként (az &ldquo;ismétlést&rdquo; pedig nézzétek el nekem).</p>
<p>Néha onnan jön az ötlet, ahonnan legkevésbé várnánk. Ha van lehetőségem, akkor ebéd közben a közszolgálati csatornákat nézem a trubadúrdobozban, így történt ez ma is, az M1-en belebotlottam <a href="http://hu.wikipedia.org/wiki/Szil%C3%A1rd_Le%C3%B3">Szilárd Leó</a> életéről készült <a href="http://premier.mtv.hu/Hirek/2011/02/09/09/Szilard_Leo__valamilyen_ertelemben_gyermek_tudtam_maradni.aspx">filmbe</a>.</p>
<p>Nagyon érdekes, ahogy a világot látta, mindenkinek bátran ajánlom a filmet. Kiragadnék belőle egy részletet: megfogalmazta a <em>saját</em> &ldquo;Tíz parancsolatát&rdquo;, ami így hangzik:</p>
<ol>
<li>Ismerd föl a dolgok összefüggéseit és az emberek cselekedeteinek törvényeit, hogy mindig tudd: mit is csinálsz.</li>
<li>Tetteidet egy méltó cél vezérelje, de ne azt kérdezd szüntelenül, hogy elérhető-e ez a cél. Céljaid modellek és mintaképek legyenek, nem pedig cselekedeteid mentségei.</li>
<li>Úgy szólj az emberekhez, ahogy tenmagadhoz szólnál. Ne szavaid várható hatásával törődj, de embertársaidat se zárd ki saját világodból. Mert ha elszigetelődsz, elsiklik szemed elől az élet igazi értelme és elvesztheted a teremtés tökéletességébe vetett hitedet.</li>
<li>Ne rombold le, amit magad nem tudnál megalkotni.</li>
<li>Ne érintsd meg az ételt, hogyha nem vagy éhes.</li>
<li>Ne kívánd, amit úgysem tudsz megkapni.</li>
<li>Ne hazudj, ha nem föltétlenül szükséges.</li>
<li>Tiszteld a gyermeket. Tisztelettel figyeld szavaikat és végtelen szeretettel szólj hozzájuk.</li>
<li>Hat esztendőn át munkálkodjál. A hetedik esztendőben vonulj el magányba vagy idegenek közé, hogy barátaid véleménye ne tartson vissza attól, hogy az légy, amivé váltál.</li>
<li>Gyengéd kézzel vezesd magad az életen át és bármikor légy készen eltávozni belőle, amikor a hívó szó elhangzik.</li>
</ol>
<p><em>Forrás: Fizikai Szemle; LI. évfolyam, 10. szám: 2001. október; 309. o. (<a href="http://matfiz.uw.hu/vendegek/tiz_parancsolat.html">innen</a>)</em></p>
]]></content:encoded></item><item><title>Csökkentsd a várólistádat 2012</title><link>https://vbalazs.info/2011/12/csokkentsd-varolistadat-2012.html</link><pubDate>Wed, 21 Dec 2011 22:46:00 +0100</pubDate><guid>https://vbalazs.info/2011/12/csokkentsd-varolistadat-2012.html</guid><description>&lt;p>Az utóbbi fél évben próbáltam ellensúlyozni a szakbarbárságom némi szépirodalommal, ezt megkönnyítendő elkezdtem használni a korábban regisztrált &lt;a href="http://moly.hu/tagok/vbalazs">moly.hu&lt;/a> profilom.&lt;/p>
&lt;p>Itt értesültem erről az érdekes kezdeményezésről, amelyről részletesebben az &lt;a href="http://olvasonaplo.freeblog.hu/archives/2011/12/12/Csokkentsd_a_varolistadat_2012/">Olvasónapló&lt;/a> blogon olvashattok.&lt;/p>
&lt;p>Kíváncsiaknak egy rövid kivonat:&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Mi is a csökkentsd a várólistádat?&lt;/strong>&lt;/p>&lt;/blockquote>
&lt;blockquote>
&lt;p>Egy nemzetközi példára indított verseny, melynek célja, hogy az olvasásra váró könyvek kupacát csökkentsük minimum 12 kötettel, azaz annyival, ahány hónap van egy évben. Hogy legyen helye virtuális vagy valós polcán az embernek még több kötetnek, meg egy kicsit könnyítsen a lelkiismeretén.&lt;/p></description><content:encoded><![CDATA[<p>Az utóbbi fél évben próbáltam ellensúlyozni a szakbarbárságom némi szépirodalommal, ezt megkönnyítendő elkezdtem használni a korábban regisztrált <a href="http://moly.hu/tagok/vbalazs">moly.hu</a> profilom.</p>
<p>Itt értesültem erről az érdekes kezdeményezésről, amelyről részletesebben az <a href="http://olvasonaplo.freeblog.hu/archives/2011/12/12/Csokkentsd_a_varolistadat_2012/">Olvasónapló</a> blogon olvashattok.</p>
<p>Kíváncsiaknak egy rövid kivonat:</p>
<blockquote>
<p><strong>Mi is a csökkentsd a várólistádat?</strong></p></blockquote>
<blockquote>
<p>Egy nemzetközi példára indított verseny, melynek célja, hogy az olvasásra váró könyvek kupacát csökkentsük minimum 12 kötettel, azaz annyival, ahány hónap van egy évben. Hogy legyen helye virtuális vagy valós polcán az embernek még több kötetnek, meg egy kicsit könnyítsen a lelkiismeretén.</p></blockquote>
<blockquote>
<p>Várólistának hívom azokat a könyveket, amelyeket beszereztél, összegyűjtöttél és már régóta arra várnak, hogy elolvasd őket, de valahogy mindig van valami fontosabb amit szeretnél olvasni.</p></blockquote>
<blockquote>
<p>[&hellip;]</p></blockquote>
<blockquote>
<p>A feladat egyszerű: <em>Olvass el 12 könyvet 12 hónap alatt a várólistádról.</em></p></blockquote>
<p>Ennek apropóján én is összeállítottam egy listát, amiket mindenképp el szeretnék olvasni mielőtt <a href="http://www.idokep.hu/hirek/2012-vilagvege-visszaszamlalas">vége a világnak</a>:</p>
<ul>
<li>Rejtő Jenő (P. Howard): A tizennégy karátos autó</li>
<li>R. A. Salvatore: A klónok támadása</li>
<li>Matthew Stover: Star Wars – A Sith-ek bosszúja</li>
<li>Terry Brooks: Star Wars I. – Baljós árnyak</li>
<li>Cassandra Clare: Hamuváros</li>
<li>Cassandra Clare: Üvegváros</li>
<li>Cassandra Clare: Csontváros</li>
<li>Szergej Lukjanyenko: Világok őre</li>
<li>Gerald Durrell: A véznaujjú maki meg én</li>
<li>Isaac Asimov: Én, a robot</li>
<li>Szabó Magda: Für Elise</li>
<li>Nemere István: A fantasztikus nagynéni</li>
<li>Dan Brown: Digitális erőd</li>
</ul>
<p>Természetesen molyon is létezik <a href="http://moly.hu/kihivasok/csokkentsd-a-varolistadat-2012">kihívás</a>.</p>
<p><em>Olvasásra fel! :)</em></p>
<p><strong>(Ui.: Szorítsatok a vizsgaidőszakban!)</strong></p>
]]></content:encoded></item><item><title>Első vektorgrafikám</title><link>https://vbalazs.info/2011/07/elso-vektorgrafikam.html</link><pubDate>Wed, 27 Jul 2011 23:41:00 +0200</pubDate><guid>https://vbalazs.info/2011/07/elso-vektorgrafikam.html</guid><description>&lt;p>Ezt a mintát egy énekes pólóján láttam egy &lt;a href="http://youtu.be/EkHTsc9PU2A">videoklipjében&lt;/a>.&lt;/p>

 &lt;figure style="">
 &lt;img
 src="https://vbalazs.info/2011/07/elso-vektorgrafikam/drawing_hu_59a3d0493ccdf575.webp"
 width="286"
 height="500"
 alt=""
 title=""
 >
 &lt;figcaption class="not-prose text-sm">
 &lt;/figcaption>
 &lt;/figure>

&lt;p>Mivel ez volt az első próbálkozásom az &lt;a href="http://inkscape.org/">Inkscape&lt;/a>-pel, ezért ne nézzétek, hogy hogyan raktam össze az alakzatokat :)
Szabad felhasználni / módosítani / továbbadni engedély nélkül: &lt;a href="
 /2011/07/elso-vektorgrafikam/drawing.svg
">letöltés&lt;/a> (jobb gomb -&amp;gt; mentés másként)&lt;/p>
&lt;p>Színezzétek át és nyomassátok Ti is pólóra ;)&lt;/p></description><content:encoded><![CDATA[<p>Ezt a mintát egy énekes pólóján láttam egy <a href="http://youtu.be/EkHTsc9PU2A">videoklipjében</a>.</p>

        <figure style="">
          <img
            src="/2011/07/elso-vektorgrafikam/drawing_hu_59a3d0493ccdf575.webp"
            width="286"
            height="500"
            alt=""
            title=""
            >
          <figcaption class="not-prose text-sm">
          </figcaption>
        </figure>

<p>Mivel ez volt az első próbálkozásom az <a href="http://inkscape.org/">Inkscape</a>-pel, ezért ne nézzétek, hogy hogyan raktam össze az alakzatokat :)
Szabad felhasználni / módosítani / továbbadni engedély nélkül: <a href="
    /2011/07/elso-vektorgrafikam/drawing.svg
">letöltés</a> (jobb gomb -&gt; mentés másként)</p>
<p>Színezzétek át és nyomassátok Ti is pólóra ;)</p>
]]></content:encoded></item><item><title>Custom ‘Follow’ button on Blogger</title><link>https://vbalazs.info/2010/11/custom-follow-button-on-blogger.html</link><pubDate>Wed, 10 Nov 2010 22:09:00 +0100</pubDate><guid>https://vbalazs.info/2010/11/custom-follow-button-on-blogger.html</guid><description>&lt;p>Lot of Blogger member use the “&lt;em>Followers&lt;/em>” gadget to display readers who follow his/her blog in the Blogger’s system.
Google doesn’t provide any way to display “&lt;em>Follow&lt;/em>” button only, without the readers (except from the &lt;em>ugly&lt;/em> navbar). It’s an understandable decision, that you don’t want to slow your page loading with laggy iframe, but you’d like to apply a fancy icon to follow. We can find the solution right in the Navbar source.&lt;/p></description><content:encoded><![CDATA[<p>Lot of Blogger member use the “<em>Followers</em>” gadget to display readers who follow his/her blog in the Blogger’s system.
Google doesn’t provide any way  to display “<em>Follow</em>” button only, without the readers (except from the <em>ugly</em> navbar). It’s an understandable decision, that you don’t want to slow your page loading with laggy iframe, but you’d like to apply a fancy icon to follow. We can find the solution right in the Navbar source.</p>
<p><strong>We need your blog ID</strong></p>
<p>After login, go to your Blogger Designer and you can copy the ID from your browser’s address bar.</p>

        <figure style="">
          <img
            src="/2010/11/custom-follow-button-on-blogger/browser-bar_hu_3171571acedd4e0c.webp"
            width="613"
            height="33"
            alt=""
            title=""
            >
          <figcaption class="not-prose text-sm">
          </figcaption>
        </figure>

<p><strong>Paste button to your blog</strong></p>
<p>Add or edit a gadget in HTML mode and paste the following code:</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="ln">1</span><span class="cl"><span class="p">&lt;</span><span class="nt">img</span> <span class="na">alt</span><span class="o">=</span><span class="s">&#34;Follow me on Blogger!&#34;</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl">  <span class="na">onclick</span><span class="o">=</span><span class="s">&#34;window.open(&#39;http://www.blogger.com/follow-blog.g?blogID={BLOG_ID}&#39;,
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="s">     &#39;followblog&#39;,
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="s">     &#39;height=600, width=600, toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, directories=no, status=no&#39;);&#34;</span>
</span></span><span class="line"><span class="ln">5</span><span class="cl">  <span class="na">src</span><span class="o">=</span><span class="s">&#34;icons/your-blogger-icon.png&#34;</span>
</span></span><span class="line"><span class="ln">6</span><span class="cl">  <span class="na">style</span><span class="o">=</span><span class="s">&#34;border: 0px; cursor: pointer; width: 32px;&#34;</span> <span class="p">/&gt;</span></span></span></code></pre></div><p>Replace the <strong>{BLOG_ID}</strong> with your ID.
Of course you can use this JS snippet for almost every HTML element.</p>
]]></content:encoded></item><item><title>Belga sörfesztivál - magyar módra</title><link>https://vbalazs.info/2010/10/belga-sorfesztival-magyar-modra.html</link><pubDate>Sun, 10 Oct 2010 21:26:00 +0200</pubDate><guid>https://vbalazs.info/2010/10/belga-sorfesztival-magyar-modra.html</guid><description>&lt;p style="text-align: justify;">
A belga söröknek nagy &lt;a href="http://matrozkocsma.hu/bsh2/index.php?menu0=magunkrol">hagyománya&lt;/a> van, ennek ellenére kicsiny országunkban nem sokan ismerik ezeket a különlegességeket. Nálunk inkább a hazai, a német, a cseh és a holland sörök dominálnak.
&lt;/p>

&lt;p style="text-align: justify;">
Eddig is kóstoltam már néhányszor a &lt;a href="http://bpex.hu/?obj=3457">Snapszban&lt;/a>, de szombaton lehetőségem volt részt venni a belga sörök fesztiválján a &lt;a href="http://www.mezogazdasagimuzeum.hu/article.php?article_id=322">Mezőgazdasági Múzeumban&lt;/a>.&amp;nbsp;A rendezvény nem volt különösebben médiában, a PesitEstben és a port.hu-n láttam (Facebook event-ig már nem mentek el),&amp;nbsp;de meglepetésemre, rajtunk kívül is rengetegen voltak kíváncsiak az eseményre.&lt;/p></description><content:encoded><![CDATA[
<p style="text-align: justify;">
A belga söröknek nagy <a href="http://matrozkocsma.hu/bsh2/index.php?menu0=magunkrol">hagyománya</a> van, ennek ellenére kicsiny országunkban nem sokan ismerik ezeket a különlegességeket. Nálunk inkább a hazai, a német, a cseh és a holland sörök dominálnak.
</p>

<p style="text-align: justify;">
Eddig is kóstoltam már néhányszor a <a href="http://bpex.hu/?obj=3457">Snapszban</a>, de szombaton lehetőségem volt részt venni a belga sörök fesztiválján a <a href="http://www.mezogazdasagimuzeum.hu/article.php?article_id=322">Mezőgazdasági Múzeumban</a>.&nbsp;A rendezvény nem volt különösebben médiában, a PesitEstben és a port.hu-n láttam (Facebook event-ig már nem mentek el),&nbsp;de meglepetésemre, rajtunk kívül is rengetegen voltak kíváncsiak az eseményre.</p>

<p style="text-align: justify;">
Több, mint 100 fajta belga sörből lehetett választani hatot, 2500 forintért. Nem tudom, hogy a rendezők számítottak-e ekkora létszámra, mert néha nagyon szűknek éreztem a teret (pláne később az időközben <i>túl sokat</i> ivott emberektől).&nbsp;Minden korosztállyal találkozhattunk (kisbabáktól egész az idősekig), a gondos szülők belga édességekkel próbálták lekötni apróbb csemetéiket.</p>

<p style="text-align: justify;">
Az ismerőseimmel való kellemes beszélgetés közben különböző színű, sűrűségű és ízű söröket kortyolgattunk. Úgy gondolom, hogy ezt a 6 pohár sört egy átlagos férfi alkoholbírására kalkulálták, még egy pohár és nem úsztam volna meg egy kellemes zsibbadással ;) Persze azért pohár és pohár között is volt különbség (gyümölcsös vs. Trapistes Rochefort 10°), próbáltam azért az&nbsp;ésszerűség határán belül maradni. Sort kerítettem egy almás és egy ananászos alkotásra is, egészen egzotikus ízük volt. Az itthon kapható citromos sörök a nyomukba sem érnek.</p>

<p style="text-align: justify;">
Nyálcsorgatónak készítettem pár képet:</p>

<div style="float: left;">
  <a href="
    /2010/10/belga-sorfesztival-magyar-modra/photos/IMAG0057.jpg
">
    
            <figure style="">
              <img
                src="/2010/10/belga-sorfesztival-magyar-modra/photos/IMAG0057_hu_a75beadab81677c7.webp"
                width="213"
                height="320"
                alt=""
                title=""
                >
              <figcaption class="not-prose text-sm">
              </figcaption>
            </figure>

  </a>
</div>

<div style="float: left;">
  <a href="
    /2010/10/belga-sorfesztival-magyar-modra/photos/IMAG0058.jpg
">
    
            <figure style="">
              <img
                src="/2010/10/belga-sorfesztival-magyar-modra/photos/IMAG0058_hu_8e652f92657138d6.webp"
                width="213"
                height="320"
                alt=""
                title=""
                >
              <figcaption class="not-prose text-sm">
              </figcaption>
            </figure>

  </a>
</div>

<div style="float: left;">
  <a href="
    /2010/10/belga-sorfesztival-magyar-modra/photos/IMAG0059.jpg
">
    
            <figure style="">
              <img
                src="/2010/10/belga-sorfesztival-magyar-modra/photos/IMAG0059_hu_1d54604dbdbee06c.webp"
                width="480"
                height="320"
                alt=""
                title=""
                >
              <figcaption class="not-prose text-sm">
              </figcaption>
            </figure>

  </a>
</div>

<div style="clear: both;"></div>

<p style="text-align: justify;">
Szerintem ez egy tökéletes szombat délutáni program volt, megérte az árát. Mindenkinek bátran ajánlom (a gyerekeket azért legközelebb hagyjuk otthon:).</p>
]]></content:encoded></item><item><title>Fancy gallery script for Drupal 6</title><link>https://vbalazs.info/2010/08/fancy-gallery-script-for-drupal.html</link><pubDate>Mon, 23 Aug 2010 13:06:00 +0200</pubDate><guid>https://vbalazs.info/2010/08/fancy-gallery-script-for-drupal.html</guid><description>&lt;p>The Drupal is one of the most popular CMSs on the Internet. We often make sites, where we have to give the opportunity to the &lt;em>less advanced users to edit&lt;/em> the contents of the nodes. The procedure of these modifications &lt;em>should be&lt;/em> as simple as possible.&lt;/p>
&lt;p>In most cases, our users would like to get a gallery with &lt;strong>nice effects&lt;/strong> and &lt;strong>modest manageability&lt;/strong>. This feature doesn’t come with Drupal 6, &lt;em>it does not support&lt;/em> galleries well. Sure we can do a lot of magic with modules and CCKs, but it is a nightmare and anything we get as result is complicated to manage and maintain.&lt;/p></description><content:encoded><![CDATA[<p>The Drupal is one of the most popular CMSs on the Internet. We often make sites, where we have to give the opportunity to the <em>less advanced users to edit</em> the contents of the nodes. The procedure of these modifications <em>should be</em> as simple as possible.</p>
<p>In most cases, our users would like to get a gallery with <strong>nice effects</strong> and <strong>modest manageability</strong>. This feature doesn’t come with Drupal 6, <em>it does not support</em> galleries well. Sure we can do a lot of magic with modules and CCKs, but it is a nightmare and anything we get as result is complicated to manage and maintain.</p>
<p>I have searched way too much for the solution, so I just made a decision: I will use Google Picasa Webalbums. I found a <a href="http://sourceforge.net/projects/pwa/">javascript library</a> on SourceForge, that downloads the Picasa’s rss feed and creates the list of the albums and images. The result is OK, but it gives a grim sight. We can redesign it by overwriting the js’s proper sections. I have modified the code:</p>
<ul>
<li>it became easily configurable (with language, and  config. constants)</li>
<li>supports the <a href="http://drupal.org/project/colorbox">Colorbox</a> Drupal module</li>
<li>it does not interfere with jQuery anymore</li>
</ul>
<p>Modified pwa library (right click, save as&hellip;): <a href="
    /2010/08/fancy-gallery-script-for-drupal/pwa-no-picasa-links.js
">download</a></p>
<p>Insert the following code into a new Drupal node:</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="p">&lt;</span><span class="nt">script</span> <span class="na">type</span><span class="o">=</span><span class="s">&#34;text/javascript&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">  <span class="nx">username</span><span class="o">=</span><span class="s1">&#39;yourGoogleAccountName&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">  <span class="nx">photosize</span><span class="o">=</span><span class="s1">&#39;800&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">  <span class="nx">columns</span><span class="o">=</span><span class="s1">&#39;4&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="p">&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="p">&lt;</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">&#34;/sites/all/themes/yourTheme/js/pwa-no-picasa-links.js&#34;</span> <span class="na">type</span><span class="o">=</span><span class="s">&#34;text/javascript&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="p">&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">
</span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="p">&lt;</span><span class="nt">script</span> <span class="na">type</span><span class="o">=</span><span class="s">&#34;text/javascript&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">    <span class="nx">$</span><span class="p">(</span><span class="s2">&#34;a[rel=&#39;myAlbum&#39;]&#34;</span><span class="p">).</span><span class="nx">colorbox</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="p">&lt;/</span><span class="nt">script</span><span class="p">&gt;</span></span></span></code></pre></div>]]></content:encoded></item><item><title>Opel Astra G (classic II) audió rendszere II. rész</title><link>https://vbalazs.info/2010/08/opel-astra-g-classic-ii-audio-rendszere.html</link><pubDate>Thu, 19 Aug 2010 16:11:00 +0200</pubDate><guid>https://vbalazs.info/2010/08/opel-astra-g-classic-ii-audio-rendszere.html</guid><description>&lt;div style="text-align: justify;">Az &lt;a href="https://vbalazs.info/2010/08/opel-astra-g-classic-ii-gyari-audio.html">előző részben&lt;/a> ismertettem a körülményeket és a problémát, miszerint hátulra utólag hangszórót csak drága szervízköltséggel lehet.&lt;/div>&lt;div style="text-align: justify;">A gond az, hogy a hangszórók csak a hátsó ajtóig vannak elvezetve, de a csatlakozóból hiányoznak a tüskék. Gányolósabb kollégák azt tanácsolták, hogy hákoljam bele házilag, de én minél tovább szeretném megtartani az autót a gyári formájában. Szintén a bontót hívtam segítségül (egyébként &lt;a href="http://opelbontottalkatresz.hu/">őket&lt;/a>&amp;nbsp;ajánlom, nagyon korrektek!), ahonnan sikerült közép hangszórókat 2000 Ft/db áron, magas hangsugárzókat&amp;nbsp;1000 Ft/db&amp;nbsp;(ugyanolyanok mint elöl),&amp;nbsp;hátsó kábelkötegeket szerezni 2000 Ft/db áron. Hab a tortán, hogy sikerült full extrás darabokat beszerezni: az elektromos ablak és az oldallégzsák kábelei, tüskéi is benne vannak :-) ezek ugyan nekünk nincsenek kihasználva, de G Astrában igazi kuriózum ;) Ha az olvasónak hátul is elektromos ablakok vannak, akkor sajnos a kábelkötegek beszerzése nehezebb lehet, mi csak szerencsések voltunk. Fontos megjegyezni, hogy a biztonságunk érdekében, &lt;i>ha az autóban van hátul légzsák, ezt a műveletet &lt;b>végeztessük szakszervízben&lt;/b>!&lt;/i>&lt;/div>&lt;div style="text-align: justify;">&lt;br />
&lt;/div>&lt;div style="text-align: justify;">A kárpitot leszedni csak elsőre nehéz. 3 csavar, 7 patent, 3 fém "sínkampó" és az ablaktörlő fogantyú tartja. Utóbbival érdemes kezdeni, itt a kárpitvédő gyűrű és a tekerő között van egy&amp;nbsp;&lt;span style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; font-family: sans-serif; font-size: 15px; line-height: 19px;">&lt;b>Ω&lt;/b>&lt;/span>&amp;nbsp;alakú gyűrű, amit egy célszerszámmal felfelé ki lehet húzni, amikor a tekerő lefelé áll. Célszerszám lehet egy keményebb drót, aminek a végét pár mm-re 90 fokban meghajlítjuk. Ezután kivesszük a 3 csavart (egy lent, egy a becsukó fogantyúban, egy pedig a kilincsnél. Utóbbiakat egy-egy&amp;nbsp;ovális&amp;nbsp;műanyag sapka fedi), oldjuk a patentokat (ezekből is célszerű venni a bontóban, könnyen törnek) és az egészet megemeljük felfelé. Szedjük ki a bowdent a kilincsből és az ajtókárpitot már félre is tehetjük&lt;/div>&lt;div style="text-align: justify;">Találunk egy műanyag ragasztott fóliát, amit elég gusztustalan leszedni és visszatenni, ezért a kevésbé bátrak tényleg végeztessék ezt inkább szervízben. A fólia szerepe nem csak a korrodáció megelőzése, &amp;nbsp;hanem a légzsák ennek segítségével vizsgálja az ajtóban a légnyomásváltozást és lép működésbe. Ha nincs is légzsákunk, akkor is igyekezzünk visszatenni a legeredetibb formában. Leszedésnél illene másikat feltenni, de ez nem kevés pénz.&lt;/div>&lt;div style="text-align: justify;">&lt;br />
&lt;/div>&lt;div style="text-align: justify;">A fólia levétele után láthatjuk a kábelköteget és jön a következő wtf. Hogy a kutyafülébe dugták be a központi zár csatlakozóját? Erre én sem jöttem rá. A külső kilincset sem sikerült kiszerelni, de nem is biztos, hogy segített volna. Vastag kezűek meg se próbálják. Az én kezem épp, hogy befért. A vásárolt kábelkötegen a lila tetejű, elég nagy csatlakozó a központi zár csatlakozója. Ezen tanulmányozhatjuk a működését (ki kell pattintani a tetejét és csak ekkor lehet kihúzni), ezt kell egy kis csavarhúzóval (én STIHL csavarhúzót használtam) kipattintani az eredeti helyén és lehúzni. Való igaz, hogy nem látni semmit, csak a tapintásra hagyatkozhat az ember. Ha valaki tud egy jobb módszert írja le legyen szíves a kommentekben! ;-)&lt;/div>&lt;div style="text-align: justify;">Miután kivettük a régi köteget, az új beszerelése nem nagy művészet, csak figyeljünk a felfogatási pontokra. A központi zár csatlakozója itt is okozhat némi bonyodalmat, ugyanis, ha megvizsgáljuk a működését, akkor láthatjuk, hogy csak akkor csúsztatható a helyére, ha ütközésig fel van húzva a lila fedele. (dugjuk be az ujjunk, hogy ne essen le és így próbáljuk visszadugni (&lt;b>nem egyszerű!&lt;/b>). A hátsó ajtó csipogójához a kábelt "kívül" kell hozni, hiszen belül elakadna az ablaklehúzó mechanikában. A kábelkötegen van egy gumi tölcsér, amin keresztül ki tudjuk hozni a csatlakozót, szinte adja magát. Arra is vigyázzunk, hogy keressük meg neki a legmegfelelőbb utat, nehogy odacsípjük valahova összeszerelésnél. Én a magas hangszórókat szinte a legvégén tettem be, hiszen azt kívülről kell a burkolatba nyomni, miután a fedelet lepattintottuk.&lt;/div>&lt;div style="text-align: justify;">&lt;br />
&lt;/div>&lt;div style="text-align: justify;">Való igaz, hogy egy kicsit macerás, így ha&amp;nbsp;van&amp;nbsp;lehetőségünk (épp vesszük az új autót, bármilyet), próbáljunk az eladóval úgy alkudozni, hogy szereljék be a hangszórókat, de gyári hifit nem kérünk.&lt;/div>&lt;div style="text-align: justify;">Remélem valakinek segít a leírás, nekem nagyon sokat segített volna :)&lt;/div>&lt;div style="text-align: justify;">&lt;br />
&lt;/div>&lt;div style="text-align: justify;">Hozzászólások a témában az opelfórumon &lt;a href="http://www.opelforum.hu/index.php?showtopic=119">itt&lt;/a>.&lt;br />
Hasznos könyv: Opel Astra G így csináld 98 márciustól&lt;/div></description><content:encoded><![CDATA[
<div style="text-align: justify;">Az <a href="/2010/08/opel-astra-g-classic-ii-gyari-audio.html">előző részben</a> ismertettem a körülményeket és a problémát, miszerint hátulra utólag hangszórót csak drága szervízköltséggel lehet.</div><div style="text-align: justify;">A gond az, hogy a hangszórók csak a hátsó ajtóig vannak elvezetve, de a csatlakozóból hiányoznak a tüskék. Gányolósabb kollégák azt tanácsolták, hogy hákoljam bele házilag, de én minél tovább szeretném megtartani az autót a gyári formájában. Szintén a bontót hívtam segítségül (egyébként <a href="http://opelbontottalkatresz.hu/">őket</a>&nbsp;ajánlom, nagyon korrektek!), ahonnan sikerült közép hangszórókat 2000 Ft/db áron, magas hangsugárzókat&nbsp;1000 Ft/db&nbsp;(ugyanolyanok mint elöl),&nbsp;hátsó kábelkötegeket szerezni 2000 Ft/db áron. Hab a tortán, hogy sikerült full extrás darabokat beszerezni: az elektromos ablak és az oldallégzsák kábelei, tüskéi is benne vannak :-) ezek ugyan nekünk nincsenek kihasználva, de G Astrában igazi kuriózum ;) Ha az olvasónak hátul is elektromos ablakok vannak, akkor sajnos a kábelkötegek beszerzése nehezebb lehet, mi csak szerencsések voltunk. Fontos megjegyezni, hogy a biztonságunk érdekében, <i>ha az autóban van hátul légzsák, ezt a műveletet <b>végeztessük szakszervízben</b>!</i></div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">A kárpitot leszedni csak elsőre nehéz. 3 csavar, 7 patent, 3 fém "sínkampó" és az ablaktörlő fogantyú tartja. Utóbbival érdemes kezdeni, itt a kárpitvédő gyűrű és a tekerő között van egy&nbsp;<span style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; font-family: sans-serif; font-size: 15px; line-height: 19px;"><b>Ω</b></span>&nbsp;alakú gyűrű, amit egy célszerszámmal felfelé ki lehet húzni, amikor a tekerő lefelé áll. Célszerszám lehet egy keményebb drót, aminek a végét pár mm-re 90 fokban meghajlítjuk. Ezután kivesszük a 3 csavart (egy lent, egy a becsukó fogantyúban, egy pedig a kilincsnél. Utóbbiakat egy-egy&nbsp;ovális&nbsp;műanyag sapka fedi), oldjuk a patentokat (ezekből is célszerű venni a bontóban, könnyen törnek) és az egészet megemeljük felfelé. Szedjük ki a bowdent a kilincsből és az ajtókárpitot már félre is tehetjük</div><div style="text-align: justify;">Találunk egy műanyag ragasztott fóliát, amit elég gusztustalan leszedni és visszatenni, ezért a kevésbé bátrak tényleg végeztessék ezt inkább szervízben. A fólia szerepe nem csak a korrodáció megelőzése, &nbsp;hanem a légzsák ennek segítségével vizsgálja az ajtóban a légnyomásváltozást és lép működésbe. Ha nincs is légzsákunk, akkor is igyekezzünk visszatenni a legeredetibb formában. Leszedésnél illene másikat feltenni, de ez nem kevés pénz.</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">A fólia levétele után láthatjuk a kábelköteget és jön a következő wtf. Hogy a kutyafülébe dugták be a központi zár csatlakozóját? Erre én sem jöttem rá. A külső kilincset sem sikerült kiszerelni, de nem is biztos, hogy segített volna. Vastag kezűek meg se próbálják. Az én kezem épp, hogy befért. A vásárolt kábelkötegen a lila tetejű, elég nagy csatlakozó a központi zár csatlakozója. Ezen tanulmányozhatjuk a működését (ki kell pattintani a tetejét és csak ekkor lehet kihúzni), ezt kell egy kis csavarhúzóval (én STIHL csavarhúzót használtam) kipattintani az eredeti helyén és lehúzni. Való igaz, hogy nem látni semmit, csak a tapintásra hagyatkozhat az ember. Ha valaki tud egy jobb módszert írja le legyen szíves a kommentekben! ;-)</div><div style="text-align: justify;">Miután kivettük a régi köteget, az új beszerelése nem nagy művészet, csak figyeljünk a felfogatási pontokra. A központi zár csatlakozója itt is okozhat némi bonyodalmat, ugyanis, ha megvizsgáljuk a működését, akkor láthatjuk, hogy csak akkor csúsztatható a helyére, ha ütközésig fel van húzva a lila fedele. (dugjuk be az ujjunk, hogy ne essen le és így próbáljuk visszadugni (<b>nem egyszerű!</b>). A hátsó ajtó csipogójához a kábelt "kívül" kell hozni, hiszen belül elakadna az ablaklehúzó mechanikában. A kábelkötegen van egy gumi tölcsér, amin keresztül ki tudjuk hozni a csatlakozót, szinte adja magát. Arra is vigyázzunk, hogy keressük meg neki a legmegfelelőbb utat, nehogy odacsípjük valahova összeszerelésnél. Én a magas hangszórókat szinte a legvégén tettem be, hiszen azt kívülről kell a burkolatba nyomni, miután a fedelet lepattintottuk.</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Való igaz, hogy egy kicsit macerás, így ha&nbsp;van&nbsp;lehetőségünk (épp vesszük az új autót, bármilyet), próbáljunk az eladóval úgy alkudozni, hogy szereljék be a hangszórókat, de gyári hifit nem kérünk.</div><div style="text-align: justify;">Remélem valakinek segít a leírás, nekem nagyon sokat segített volna :)</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Hozzászólások a témában az opelfórumon <a href="http://www.opelforum.hu/index.php?showtopic=119">itt</a>.<br />
Hasznos könyv: Opel Astra G így csináld 98 márciustól</div>
]]></content:encoded></item><item><title>Opel Astra G (classic II) audió rendszere I. rész</title><link>https://vbalazs.info/2010/08/opel-astra-g-classic-ii-gyari-audio.html</link><pubDate>Tue, 10 Aug 2010 00:42:00 +0200</pubDate><guid>https://vbalazs.info/2010/08/opel-astra-g-classic-ii-gyari-audio.html</guid><description>Adott egy 2008-as modellévű Opel Astra G, amibe gyárilag nem szereltek rádiót. A gyári hifi egyrészt nagyon drága (százezres nagyságrend), másrészt, ha lekötöd az akksi sarujait akkor lezár és csak szervízben tudják a kódját, amivel ismét működésre lehet bírni. Ennek hátrányait nem akarom ecsetelni.&lt;br />
&lt;br />
Egy tetszőleges márkájú és képességű autóriádió beszereléséhez csupán némi ügyességre van szükség, hiszen a gyári antenna a tetőn, a csatlakozó is megtalálható a helyén.&lt;br />
Az eszközt bekötve és bekapcsolva jön a csalódás: ha nem kértünk gyári hifit, akkor csupán egy-egy közép hangszórót kapunk az első ajtókba (ajtónként egy magas és egy közép hangsugárzó helye van kiépítve). A probléma ezzel az, hogy Mozart nem úgy szól, ahogy kellene. Bontóból 1000 Ft/db áron vehetünk magas hangsugárzókat előre, ennek beszerelése annyiból áll, hogy a külső tükör belső borítását (az egész "fekete háromszöget") le kell pattintani. Apró műanyag patentok tartják (3 db), amikre rá van csúsztatva a műanyag burkolat, aminek ez a sínje hajlamos eltörni lefeszítéskor. A leszedésének technikájára még nem sikerült rájönnöm. Elméletileg le-fel + balra-jobbra irányokba való mozgatással lejön, gyakorlatilag ehhez túl szoros. A csipogók csatlakozói oda vannak vezetve, csak vissza van "tűrve", egy csipesszel könnyen kivehetjük, és csatlakoztathatjuk a hangszórót.&lt;br />
&lt;span style="font-size: small;">Tipp: ha a magas hangszórót bontóból vesszük, előfordulhat, hogy vasreszelékes, ezt kompresszorral - nem túl közelről - lefújhatjuk róla, így nem fog recsegni :)&lt;/span>&lt;br />
A fedél visszahelyezése egyszerűbb, ha kiszedjük a patentokat (Vigyázzunk, könnyen megsérthetjük a festést és a patent is eltörhet! Legyünk különösen óvatosak!), becsúsztatjuk a fedél sínjébe őket és visszapattintjuk a helyére.&lt;br />
&lt;br />
Ha ezzel megvagyunk, de&amp;nbsp;vannak utasaink hátul is, akik szintén Mozartra vagy Beethovenre vágynak, csak akkor hallják a zenét, ha elöl már zavaróan hangos.&lt;br />
&lt;br />
Jogosan merül fel az olvasóban, hogy akkor tegyünk hátulra is hangsugárzókat és az autóban ismét béke honol. Az ajtókban látszik a hangszórók helye, a burkolatot levéve jön az újabb csalódás: ha nem kértünk gyári hifit, nem fogunk hangszóró vezetéket és csatlakozót találni, pedig a rádió felőli csatlakozóban be van kötve. A leleményes fórumozó&amp;nbsp;kollégák kimérték, hogy a hátsó ajtóig vitték el ezeket a vezetékeket: ha kihúzzuk az ajtó csatlakozót, akkor az oszlop felőli hatlyukas sorban a két szélső a közép sugárzó. Az ajtó felőli csatlakozót megnézve észrevehetjük, hogy, ezeknek a tüskéi (is) hiányoznak. Ez maga a feketeleves, ugyanis ahhoz, hogy hátulra szereljünk hangszórókat az egész ajtó kábelkötegét cserélni kell.&lt;br />
&lt;br />
Ennek mikéntjét olvashatod el a &lt;a href="https://vbalazs.info/2010/08/opel-astra-g-classic-ii-audio-rendszere.html">II. részben&lt;/a>.</description><content:encoded><![CDATA[
Adott egy 2008-as modellévű Opel Astra G, amibe gyárilag nem szereltek rádiót. A gyári hifi egyrészt nagyon drága (százezres nagyságrend), másrészt, ha lekötöd az akksi sarujait akkor lezár és csak szervízben tudják a kódját, amivel ismét működésre lehet bírni. Ennek hátrányait nem akarom ecsetelni.<br />
<br />
Egy tetszőleges márkájú és képességű autóriádió beszereléséhez csupán némi ügyességre van szükség, hiszen a gyári antenna a tetőn, a csatlakozó is megtalálható a helyén.<br />
Az eszközt bekötve és bekapcsolva jön a csalódás: ha nem kértünk gyári hifit, akkor csupán egy-egy közép hangszórót kapunk az első ajtókba (ajtónként egy magas és egy közép hangsugárzó helye van kiépítve). A probléma ezzel az, hogy Mozart nem úgy szól, ahogy kellene. Bontóból 1000 Ft/db áron vehetünk magas hangsugárzókat előre, ennek beszerelése annyiból áll, hogy a külső tükör belső borítását (az egész "fekete háromszöget") le kell pattintani. Apró műanyag patentok tartják (3 db), amikre rá van csúsztatva a műanyag burkolat, aminek ez a sínje hajlamos eltörni lefeszítéskor. A leszedésének technikájára még nem sikerült rájönnöm. Elméletileg le-fel + balra-jobbra irányokba való mozgatással lejön, gyakorlatilag ehhez túl szoros. A csipogók csatlakozói oda vannak vezetve, csak vissza van "tűrve", egy csipesszel könnyen kivehetjük, és csatlakoztathatjuk a hangszórót.<br />
<span style="font-size: small;">Tipp: ha a magas hangszórót bontóból vesszük, előfordulhat, hogy vasreszelékes, ezt kompresszorral - nem túl közelről - lefújhatjuk róla, így nem fog recsegni :)</span><br />
A fedél visszahelyezése egyszerűbb, ha kiszedjük a patentokat (Vigyázzunk, könnyen megsérthetjük a festést és a patent is eltörhet! Legyünk különösen óvatosak!), becsúsztatjuk a fedél sínjébe őket és visszapattintjuk a helyére.<br />
<br />
Ha ezzel megvagyunk, de&nbsp;vannak utasaink hátul is, akik szintén Mozartra vagy Beethovenre vágynak, csak akkor hallják a zenét, ha elöl már zavaróan hangos.<br />
<br />
Jogosan merül fel az olvasóban, hogy akkor tegyünk hátulra is hangsugárzókat és az autóban ismét béke honol. Az ajtókban látszik a hangszórók helye, a burkolatot levéve jön az újabb csalódás: ha nem kértünk gyári hifit, nem fogunk hangszóró vezetéket és csatlakozót találni, pedig a rádió felőli csatlakozóban be van kötve. A leleményes fórumozó&nbsp;kollégák kimérték, hogy a hátsó ajtóig vitték el ezeket a vezetékeket: ha kihúzzuk az ajtó csatlakozót, akkor az oszlop felőli hatlyukas sorban a két szélső a közép sugárzó. Az ajtó felőli csatlakozót megnézve észrevehetjük, hogy, ezeknek a tüskéi (is) hiányoznak. Ez maga a feketeleves, ugyanis ahhoz, hogy hátulra szereljünk hangszórókat az egész ajtó kábelkötegét cserélni kell.<br />
<br />
Ennek mikéntjét olvashatod el a <a href="/2010/08/opel-astra-g-classic-ii-audio-rendszere.html">II. részben</a>.
]]></content:encoded></item><item><title>Földelni!</title><link>https://vbalazs.info/2010/08/foldelni.html</link><pubDate>Thu, 05 Aug 2010 19:34:00 +0200</pubDate><guid>https://vbalazs.info/2010/08/foldelni.html</guid><description>&lt;/div>&lt;div style="text-align: justify;">A történet egész karácsony előttre nyúlik vissza, amikor megleptem magam egy külső monitorral (Samsung TFT) a laptopom mellé. A koliban nagyon szépen működött a konfiguráció, semmi anomáliát nem észleltem.&lt;/div>&lt;div style="text-align: justify;">&lt;br />
&lt;/div>&lt;div style="text-align: justify;">A tavaszi szemeszter végén hazaköltöztem; a házban nincsenek földelt konnektorok (az egész házban nincs bevezetve a föld), így használtam 1 hónapig, amikor észleltem, hogy az USB-n rádugott telefonom alu háza "&lt;i>ráz&lt;/i>". Először azt hittem, hogy képzelődöm (már igen csak hajnal felé járt...), de másnap is ugyanúgy éreztem, ezért nyomozásba kezdtem.&lt;/div>&lt;div style="text-align: justify;">Ennek első eredménye az volt, hogy a laptop alu keretén is mérhető feszültség volt. A laptop adaptere földeletlen ("&lt;i>vékony dugós"&lt;/i>), így figyelmem a monitor VGA csatlakozója felé fordult. Műszerrel rámérve a csatlakozó testjére 10-15V feszültséget mértem. A jelenség megszűnt, ha lehúztam a gépről a VGA csatlakozót.&lt;/div>&lt;div style="text-align: justify;">Furcsa gondolataim támadtak a monitor garanciális javításáról, illetve a kóboráram lehetőségéről. Ellenőriztem az elosztót, a konnektort, annak a föld érintkezőiről nem kaphatta a feszültséget. Egyértelmű volt, hogy egyedül a monitor felelős a galibáért. Rámértem, hogy nem-e zárlatos belül, szerencsére ezt sikerült kizárni.&lt;/div>&lt;div style="text-align: justify;">&lt;br />
&lt;/div>&lt;div style="text-align: justify;">&lt;b>&lt;u>Eredmény:&lt;/u>&lt;/b>&lt;/div>&lt;div style="text-align: justify;">A monitor generálja ezt a feszültséget (talán valamiféle sztatikus feltöltődés?), amit megpróbál a földelésen keresztül elvezetni. Esetünkben ezt nem sikerült, ezért továbbította a laptopom, az a telefonom felé, végül rajtam keresztül záródott az áramkör.&lt;/div>&lt;div style="text-align: justify;">&lt;br />
&lt;/div>&lt;div style="text-align: justify;">&lt;b>&lt;u>Megoldás:&lt;/u>&lt;/b>&lt;/div>&lt;div style="text-align: justify;">Kb. fél méter betonvas lefúrva az asztalom mellé, zászlószerűen ráhegesztett laposvassal, amire az elosztó föld vezetékét rákötöttem.&lt;/div>&lt;div style="text-align: justify;">&lt;br />
&lt;/div>&lt;div style="text-align: justify;">&lt;b>&lt;u>Konklúzió:&lt;/u>&lt;/b>&lt;/div>&lt;div style="text-align: justify;">Vegyük komolyan a használati utasításban a megfelelő földelésre vonatkozó &lt;i>kövérbetűs &lt;/i>figyelmeztetéseket, mert az elektromos eszközeink láthatják kárát. Neten olvashatunk így kimúlt tévékről és asztali lejátszókról.&lt;/div>&lt;div style="text-align: justify;">Azt hiszem szerencsésnek mondhatom magam, hogy mind a laptopom, mind a telefonom túlélte ezt a &lt;i>megrázó&lt;/i> kalandot, no meg azért, mert apám villanyszerelő ;-)&lt;/div>&lt;div style="text-align: justify;">&lt;br />
&lt;/div>&lt;hr style="width: 100%;" />&lt;div style="text-align: justify;">Aki tudja, hogy a monitorban mi generálja ezt a feszültséget, ne tartsa magában :-)&lt;br />
&lt;span style="font-size: small;">(Monitor típusa: Samsung SyncMaster 2233SN)&lt;/span>&lt;/div></description><content:encoded><![CDATA[
</div><div style="text-align: justify;">A történet egész karácsony előttre nyúlik vissza, amikor megleptem magam egy külső monitorral (Samsung TFT) a laptopom mellé. A koliban nagyon szépen működött a konfiguráció, semmi anomáliát nem észleltem.</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">A tavaszi szemeszter végén hazaköltöztem; a házban nincsenek földelt konnektorok (az egész házban nincs bevezetve a föld), így használtam 1 hónapig, amikor észleltem, hogy az USB-n rádugott telefonom alu háza "<i>ráz</i>". Először azt hittem, hogy képzelődöm (már igen csak hajnal felé járt...), de másnap is ugyanúgy éreztem, ezért nyomozásba kezdtem.</div><div style="text-align: justify;">Ennek első eredménye az volt, hogy a laptop alu keretén is mérhető feszültség volt. A laptop adaptere földeletlen ("<i>vékony dugós"</i>), így figyelmem a monitor VGA csatlakozója felé fordult. Műszerrel rámérve a csatlakozó testjére 10-15V feszültséget mértem. A jelenség megszűnt, ha lehúztam a gépről a VGA csatlakozót.</div><div style="text-align: justify;">Furcsa gondolataim támadtak a monitor garanciális javításáról, illetve a kóboráram lehetőségéről. Ellenőriztem az elosztót, a konnektort, annak a föld érintkezőiről nem kaphatta a feszültséget. Egyértelmű volt, hogy egyedül a monitor felelős a galibáért. Rámértem, hogy nem-e zárlatos belül, szerencsére ezt sikerült kizárni.</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;"><b><u>Eredmény:</u></b></div><div style="text-align: justify;">A monitor generálja ezt a feszültséget (talán valamiféle sztatikus feltöltődés?), amit megpróbál a földelésen keresztül elvezetni. Esetünkben ezt nem sikerült, ezért továbbította a laptopom, az a telefonom felé, végül rajtam keresztül záródott az áramkör.</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;"><b><u>Megoldás:</u></b></div><div style="text-align: justify;">Kb. fél méter betonvas lefúrva az asztalom mellé, zászlószerűen ráhegesztett laposvassal, amire az elosztó föld vezetékét rákötöttem.</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;"><b><u>Konklúzió:</u></b></div><div style="text-align: justify;">Vegyük komolyan a használati utasításban a megfelelő földelésre vonatkozó <i>kövérbetűs </i>figyelmeztetéseket, mert az elektromos eszközeink láthatják kárát. Neten olvashatunk így kimúlt tévékről és asztali lejátszókról.</div><div style="text-align: justify;">Azt hiszem szerencsésnek mondhatom magam, hogy mind a laptopom, mind a telefonom túlélte ezt a <i>megrázó</i> kalandot, no meg azért, mert apám villanyszerelő ;-)</div><div style="text-align: justify;"><br />
</div><hr style="width: 100%;" /><div style="text-align: justify;">Aki tudja, hogy a monitorban mi generálja ezt a feszültséget, ne tartsa magában :-)<br />
<span style="font-size: small;">(Monitor típusa: Samsung SyncMaster 2233SN)</span></div>
]]></content:encoded></item></channel></rss>