<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Nandito.hu's RSS Feed]]></title><description><![CDATA[JavaScript, React, GraphQL, testing, etc. blog]]></description><link>https://nandito.hu</link><generator>GatsbyJS</generator><lastBuildDate>Wed, 08 Apr 2026 08:14:46 GMT</lastBuildDate><item><title><![CDATA[Create a site with Gatsby + Sanity + Tailblocks]]></title><description><![CDATA[In this post I share my learnings on how to create Sanity schemas, deploy them and use as data source for a Gatsby site. To save time on…]]></description><link>https://nandito.hu/2020-06-10-gatsby-sanity-tailblocks/</link><guid isPermaLink="false">https://nandito.hu/2020-06-10-gatsby-sanity-tailblocks/</guid><pubDate>Wed, 10 Jun 2020 04:45:59 GMT</pubDate><content:encoded>&lt;p&gt;In this post I share my learnings on how to create Sanity schemas, deploy them and use as data source for a Gatsby site. To save time on coding design, I’m going to use the ready-to-use Tailwind CSS blocks: Tailblocks.&lt;/p&gt;
&lt;h2&gt;Sanity&lt;/h2&gt;
&lt;p&gt;For more details, follow the official docs’ instructions on &lt;a href=&quot;https://www.sanity.io/docs/getting-started-with-sanity-cli&quot;&gt;Getting started with Sanity CLI&lt;/a&gt;. TL;DR here’s the code:&lt;/p&gt;
&lt;h3&gt;Bootstrap project&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-g&lt;/span&gt; @sanity/cli
$ sanity init
$ sanity start&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Schema defs&lt;/h3&gt;
&lt;p&gt;Schemas needs to be defined in the &lt;code class=&quot;language-text&quot;&gt;schemas/schema.js&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;It’s practical to add each schema document or object in separated files and include them in the schema types list:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;jsx&quot;&gt;&lt;pre class=&quot;language-jsx&quot;&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; createSchema &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;part:@sanity/base/schema-creator&apos;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; schemaTypes &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;all:part:@sanity/base/schema-type&apos;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; feature &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;./feature&apos;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; portfolioImage &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;./portfolio-image&apos;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;createSchema&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;default&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;types&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; schemaTypes&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;concat&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// here&lt;/span&gt;
    feature&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    portfolioImage&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Read more: &lt;a href=&quot;https://www.sanity.io/docs/content-modelling&quot;&gt;Content modelling in Sanity Studio&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Types&lt;/h4&gt;
&lt;p&gt;Sanity has the following types:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;string, number, boolean, datetime, url&lt;/li&gt;
&lt;li&gt;custom types via object types&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Read more: &lt;a href=&quot;https://www.sanity.io/docs/the-building-blocks&quot;&gt;Understanding content types&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Create document type&lt;/h4&gt;
&lt;p&gt;These will appear in the studio and we can create multiple docs using their structure.&lt;/p&gt;
&lt;p&gt;Here as example (&lt;code class=&quot;language-text&quot;&gt;schemas/feature.js&lt;/code&gt;)&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;jsx&quot;&gt;&lt;pre class=&quot;language-jsx&quot;&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Feature&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;feature&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;document&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;fields&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Title&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;title&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;string&apos;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Description&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;description&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;string&apos;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Cover&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;cover&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;image&apos;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;Create object type&lt;/h4&gt;
&lt;p&gt;This defines a shape of a field, can be assigned to a document.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;jsx&quot;&gt;&lt;pre class=&quot;language-jsx&quot;&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Portfolio image&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;portfolioImage&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;object&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;fields&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Image&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;image&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;image&apos;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Caption&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;caption&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;string&apos;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Date of creation&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;dateOfCreation&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;datetime&apos;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Add this to the &lt;code class=&quot;language-text&quot;&gt;schemas/schema.js&lt;/code&gt; file’s &lt;code class=&quot;language-text&quot;&gt;schemaTypes.concat()&lt;/code&gt;. Then we can add field to another schema.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;jsx&quot;&gt;&lt;pre class=&quot;language-jsx&quot;&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Images&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;images&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;array&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;of&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;portfolioImage&apos;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Deploy Sanity Studio&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ sanity deploy&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then our Studio will be available on the &lt;code class=&quot;language-text&quot;&gt;&amp;lt;project&gt;.sanity.studio&lt;/code&gt; URL. If we change something in the studio locally, this is also how we would upload changes.&lt;/p&gt;
&lt;h2&gt;Gatsby&lt;/h2&gt;
&lt;h3&gt;Create app, set up source&lt;/h3&gt;
&lt;p&gt;Create bare Gatsby app using the hello world starter. This one doesn’t contain any boostrap code and dependencies, but it’s ok, we can add them. First let’s add Sanity source plugin.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ gatsby new my-site https://github.com/gatsbyjs/gatsby-starter-hello-world
$ &lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; i gatsby-source-sanity &lt;span class=&quot;token parameter variable&quot;&gt;--save&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Configure Sanity plugin in &lt;code class=&quot;language-text&quot;&gt;gatsby-config.js&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;jsx&quot;&gt;&lt;pre class=&quot;language-jsx&quot;&gt;&lt;code class=&quot;language-jsx&quot;&gt;module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exports &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;plugins&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;resolve&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;gatsby-source-sanity&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;options&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// these values can be found in manage.sanity.io once the app is deployed&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;projectId&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;project-id&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;dataset&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;production&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Deploy GraphQL API for Sanity&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ sanity graphql deploy&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;See data in Gatsby&lt;/h3&gt;
&lt;p&gt;Now the Sanity data should be visible in Gatsby’s GraphiQL. Start the app by running&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ gatsby develop&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Explore schema and query data on the &lt;a href=&quot;http://localhost:8000/__graphql&quot;&gt;http://localhost:8000/__graphql&lt;/a&gt; site&lt;/p&gt;
&lt;p&gt;Find more info in the source plugin’s site: &lt;a href=&quot;https://www.gatsbyjs.org/packages/gatsby-source-sanity/&quot;&gt;gatsby-source-sanity&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Tailblocks&lt;/h2&gt;
&lt;h3&gt;Setup Tailwind CSS&lt;/h3&gt;
&lt;p&gt;Install dependencies in the repo&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--save&lt;/span&gt; gatsby-plugin-postcss tailwindcss autoprefixer&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Update Gatsby config (&lt;code class=&quot;language-text&quot;&gt;gatsby-config.js&lt;/code&gt;)&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;jsx&quot;&gt;&lt;pre class=&quot;language-jsx&quot;&gt;&lt;code class=&quot;language-jsx&quot;&gt;module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exports &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;plugins&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;gatsby-plugin-postcss&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Add postcss config: create a &lt;code class=&quot;language-text&quot;&gt;postcss.config.js&lt;/code&gt; file in the project root with the following content:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;jsx&quot;&gt;&lt;pre class=&quot;language-jsx&quot;&gt;&lt;code class=&quot;language-jsx&quot;&gt;module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;exports&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;plugins&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;tailwindcss&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;autoprefixer&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Create a css file (eg. &lt;code class=&quot;language-text&quot;&gt;root.css&lt;/code&gt;) with these imports&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;tailwindcss/base&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;tailwindcss/components&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;tailwindcss/utilities&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Import the recently created css to our app, somewhere on the top of the tree to make it available everywhere&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;jsx&quot;&gt;&lt;pre class=&quot;language-jsx&quot;&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; React &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;react&apos;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;../components/root.css&apos;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;App&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;className&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;bg-gray-900&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
      Tailwind classes should work now! 🎉
    &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Using Tailblocks&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Visit &lt;a href=&quot;https://mertjf.github.io/tailblocks/&quot;&gt;https://mertjf.github.io/tailblocks/&lt;/a&gt; site and select an element&lt;/li&gt;
&lt;li&gt;Click “View code” in the top bar and then copy the code&lt;/li&gt;
&lt;li&gt;Paste it to your app&lt;/li&gt;
&lt;li&gt;Rename all &lt;code class=&quot;language-text&quot;&gt;class=&quot;&quot;&lt;/code&gt; attributes to &lt;code class=&quot;language-text&quot;&gt;className=&quot;&quot;&lt;/code&gt; and transform “kebab-case” attributes names with “camelCase”.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Resources&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://tailwindcss.com/docs/installation/&quot;&gt;Installation - Tailwind CSS&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.gatsbyjs.org/docs/tailwind-css/&quot;&gt;Tailwind CSS&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/gatsbyjs/gatsby/tree/master/packages/gatsby-plugin-postcss&quot;&gt;gatsbyjs/gatsby&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mertjf.github.io/tailblocks/&quot;&gt;tailblocks - Ready-to-use Tailwind CSS blocks&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Replace hardcoded data&lt;/h2&gt;
&lt;p&gt;Once we have built the site using Tailblocks, it’s time to replace the hardcoded example text with data we get from Sanity.&lt;/p&gt;
&lt;p&gt;Let’s say we have a &lt;code class=&quot;language-text&quot;&gt;Features&lt;/code&gt; block. We can create a &lt;code class=&quot;language-text&quot;&gt;Features&lt;/code&gt; component in React, get and map data right in the component like this:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;jsx&quot;&gt;&lt;pre class=&quot;language-jsx&quot;&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; React &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;react&apos;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; graphql&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; useStaticQuery &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;gatsby&apos;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Img &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;gatsby-image&apos;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Features&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; allSanityFeature &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;useStaticQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;graphql&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;
    {
      allSanityFeature {
        nodes {
          title
          description
          id
          cover {
            asset {
              fixed(width: 80) {
                ...GatsbySanityImageFixed
              }
            }
          }
        }
      }
    }
  &lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;section&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;className&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;text-gray-500 bg-gray-900 body-font&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;className&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;container px-5 py-24 mx-auto&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;className&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;flex flex-wrap sm:-m-4 -mx-4 -mb-10 -mt-4&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
          &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;allSanityFeature&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;nodes&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;feature&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
            &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;
              &lt;span class=&quot;token attr-name&quot;&gt;className&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;p-4 md:w-1/3 md:mb-0 mb-6 flex flex-col text-center items-center&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
              &lt;span class=&quot;token attr-name&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;feature&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;id&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
              &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;className&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;w-20 h-20 inline-flex items-center justify-center rounded-full bg-gray-800 text-purple-400 mb-5 flex-shrink-0&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Img&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;fixed&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;feature&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cover&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;asset&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;fixed&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
              &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;

              &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;className&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;flex-grow&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h2&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;className&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;text-white text-lg title-font font-medium mb-3&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
                  &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;feature&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;title&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;

                &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;className&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;leading-relaxed text-base&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
                  &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;feature&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;description&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
              &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;section&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt; Features&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Don’t forget to install &lt;code class=&quot;language-text&quot;&gt;gatsby-image&lt;/code&gt; to make responsive, lazy-loaded image rendering work.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; gatsby-image &lt;span class=&quot;token parameter variable&quot;&gt;--save&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Summary&lt;/h2&gt;
&lt;p&gt;Now we have a real Jamstack site with a headless CMS and a server side rendered responsive frontend! As a next step we can set up hosting and auto rebuild using webhooks.&lt;/p&gt;
&lt;h3&gt;Other resources&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Cover image by &lt;a href=&quot;https://www.pexels.com/photo/action-adventure-beach-clouds-414247/&quot;&gt;PixaBay&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Self-hosted, cookieless analytics for free]]></title><description><![CDATA[Cover image is copied from the Ackee’s GitHub repo Why? Most sites I’ve built are using Google Analytics (GA), the free and very feature…]]></description><link>https://nandito.hu/2020-05-04-self-hosted-cookieless-analytics/</link><guid isPermaLink="false">https://nandito.hu/2020-05-04-self-hosted-cookieless-analytics/</guid><pubDate>Mon, 04 May 2020 19:03:53 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;Cover image is copied from the Ackee’s GitHub repo&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Why?&lt;/h2&gt;
&lt;p&gt;Most sites I’ve built are using Google Analytics (GA), the &lt;em&gt;free&lt;/em&gt; and very feature-rich website analytics tool. It’s easy to set up and shows real time data on complex charts. But GA tracks the users more extensively than I need for a personal blog. It also requires a strict privacy policy and users need to accept that notice to let the tracking start.&lt;/p&gt;
&lt;p&gt;I did think of the “No tracking” option. The browsers’ tracking blockers make client-side trackers less and less accurate.
However, seeing even a little bit (maybe not-that-accurate) activity on my site still motivates me to keep going with it.&lt;/p&gt;
&lt;p&gt;Another option was server-side analytics. They are fast, private and accurate. But for a non-profit personal blog with very few visitors it simply isn’t worth paying $7-9/mo to see the stats.&lt;/p&gt;
&lt;h2&gt;Goals&lt;/h2&gt;
&lt;p&gt;I defined what would be the ideal tracking for my site:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Open source&lt;/li&gt;
&lt;li&gt;Does not use cookies (no cookies -&gt; no cookie policy overhead)&lt;/li&gt;
&lt;li&gt;Cheap (possibly free) hosting&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;My choice&lt;/h2&gt;
&lt;p&gt;When I was searching for alternatives I found Alec Brunelle’s &lt;a href=&quot;https://medium.com/better-programming/quit-google-analytics-self-hosted-gatsby-statistics-with-ackee-846a2b4be634&quot;&gt;Quit Google Analytics and use self-hosted Gatsby statistics with Ackee&lt;/a&gt; post on Medium. I tried Ackee’s demo and it collects exactly the data I need.&lt;/p&gt;
&lt;p&gt;So I decided to try:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Analytics tool: &lt;a href=&quot;https://github.com/electerious/Ackee&quot;&gt;Ackee&lt;/a&gt; (✅ open source; ✅ no cookies)&lt;/li&gt;
&lt;li&gt;Hosting: Google Cloud Platform’s (GCP) &lt;a href=&quot;https://cloud.google.com/free/docs/gcp-free-tier#always-free&quot;&gt;always free tier&lt;/a&gt; (f1-micro)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I tried to deploy to Heroku (as Alec did in his post) but as Heroku asked for my credit card data, I was not sure if it can run on a free dyno. Or maybe I’ve just reached the free limit with other hobby projects.&lt;/p&gt;
&lt;h2&gt;Steps&lt;/h2&gt;
&lt;h3&gt;Set up the Virtual Machine (VM)&lt;/h3&gt;
&lt;p&gt;During the VM creation GCP asked for my credit card details but promised not to charge without permission. They gave $300 free credit for the first year, too.&lt;/p&gt;
&lt;p&gt;The services I’m using cost $0.00 / mo.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;It’s up and running for 8 days now and billing report shows $0.00 for this month. I still have all of the $300 free credit.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/92d252908656c8f2de546862acc9a360/54c3a/zero-dollar-billing.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 48.64864864864865%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsTAAALEwEAmpwYAAAA3klEQVR42qVS0Q6DIAzk/z/VmLmACi3gra3DMbY3m1xqC1xPOJdSQggB3nvkzEiU8fSEsDG2yCg5I5eCWuuFrD1Bkb6i1QoXfDBCJdbQA8dxGIDDejFGTNOE5fHAsixWM8vwRCDirwFOyXSDFkqSKBk5y8Yi5Br7vmOeZxus30SETbKd3U/yBoebocpUZUxyHSLIfX7vjFb3vb4/1navksv7qm4rHAe4XtEd1F7huIgGvHHVuF6+V9a7w1GuYAFx+cr/eppP6PrpzebF5hLH8krrupodetP+YDDwiEb4AiJiFdqEWNw8AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Screenshot of the billing page&quot;
        title=&quot;Screenshot of the billing page&quot;
        src=&quot;/static/92d252908656c8f2de546862acc9a360/fcda8/zero-dollar-billing.png&quot;
        srcset=&quot;/static/92d252908656c8f2de546862acc9a360/12f09/zero-dollar-billing.png 148w,
/static/92d252908656c8f2de546862acc9a360/e4a3f/zero-dollar-billing.png 295w,
/static/92d252908656c8f2de546862acc9a360/fcda8/zero-dollar-billing.png 590w,
/static/92d252908656c8f2de546862acc9a360/efc66/zero-dollar-billing.png 885w,
/static/92d252908656c8f2de546862acc9a360/c83ae/zero-dollar-billing.png 1180w,
/static/92d252908656c8f2de546862acc9a360/54c3a/zero-dollar-billing.png 1257w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Log in to Google Cloud Platform: &lt;a href=&quot;https://console.cloud.google.com/getting-started&quot;&gt;https://console.cloud.google.com/getting-started&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Create project (name could be anything you want)&lt;/li&gt;
&lt;li&gt;Go to Compute Engine &gt;&gt; VM Instances&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/71883a77f674230e4df91c34792f9f82/9f21b/goto-vm-instances.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 86.48648648648648%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAARCAYAAADdRIy+AAAACXBIWXMAAAsTAAALEwEAmpwYAAAB4klEQVR42o2U626CUBCEef+X0cQf3kUfRKPGKIKA3AXFLd+2xxBa224yQY6c2Zk5C1aU1eJHpTheLEc3krOfiutnEue1XJNSzuez7HY7cV1X8jyX6/Uqk8lEhsOhjEajb7CS4iFhUsmpITs4gTiXWPwwl7SoJckqJYD0crnI8/mUqqpkMBhIr9eTfr//DRZdkyQRr1HgNhvv97u0K4oiJYOUZx+Ph0yn0x8VsmZlWWMvjiUIQ1VAmStlFIKyLJVwuVzKfD6XxWLxAvfj8fhTIYRsYDMNTNV1k6/vSxAEEn41NISz2UxJ2iBb63a7SVEUahvwu00IEQ2NaiJ5R0gUahkcj0eBvF1GIer/TYgiCNlI+ORkcoSQGNqq/yQkwzRNNSfP89Reu4iB/zhtY3+1Wv1OyCYe5toeG1SyzlCjHBRNLLb9i0IIsIS6tl2TIcrIkGbGsm3buhnSNvSUmXwOAyXdoTYKIWNcKJ5nM4PM3HWhY4NtDgSVqIHEFPmxxhW8yxDFSkhnLGPP2DS/KchPp9MrDlxA2H1TgGaIQnKiM0q7lhkbx3FUPdMAsXnNyKwLCyKAZYACwEbyohlWaQZY+4mQe/18bTYb2W63ivV6LdxDsN/vVd3hcFCY95k8330cUPgBOtbRpTBDOhoAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Go to VM Instances screenshot&quot;
        title=&quot;Go to VM Instances screenshot&quot;
        src=&quot;/static/71883a77f674230e4df91c34792f9f82/fcda8/goto-vm-instances.png&quot;
        srcset=&quot;/static/71883a77f674230e4df91c34792f9f82/12f09/goto-vm-instances.png 148w,
/static/71883a77f674230e4df91c34792f9f82/e4a3f/goto-vm-instances.png 295w,
/static/71883a77f674230e4df91c34792f9f82/fcda8/goto-vm-instances.png 590w,
/static/71883a77f674230e4df91c34792f9f82/9f21b/goto-vm-instances.png 706w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;
&lt;p&gt;Enable free tier&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create new VM: for the always-free, select:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;us-central1&lt;/code&gt; (Iowa) region (&lt;code class=&quot;language-text&quot;&gt;us-west1&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;us-east1&lt;/code&gt; is free, too)&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;f1-micro&lt;/code&gt; (1 vCPU, 0.6 GB memory)&lt;/li&gt;
&lt;li&gt;Debian 9 (other Linux distro could also work but make sure to use one with free license if you want to keep it free)&lt;/li&gt;
&lt;li&gt;“Allow full access to all Cloud APIs” access scope&lt;/li&gt;
&lt;li&gt;Enable both HTTP and HTTPS traffic on the Firewall&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/86308527edd4bb3ea66f94532e957673/0b79a/create-vm.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 59.45945945945946%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsTAAALEwEAmpwYAAABYElEQVR42p2TC2+DMAyE+f8/cpq0jQ06IG9IgNx8bqk2qV2nVbryMPlsn5MmxohpHGCmEcs8Y12LqpSCbdtual1Xjeecr+I7xprJzbB+gQ0LfJgRUkacMyZJsMlHqBXyd5beAyxiGD7hnENKSZ/3fddY89InPL0aPLcGb51FNyaBF1gXseRVtMP4glnuc9mxbhUhJkk4CSggSVeELkvRWDOniL7vRL1kHTTIdk6nE0IImtU5D++DVFEvbVe9Z8X1h6RC7z26rsM4jpqVQC56/+gEOihcJT7t+3Zp//6vYf8EEsaKuJgGj5OF81H9YZIjVusDICts2xbGGPFhUc3iSwheRRinSBiNP8y/C+TH3xfxyukaF2QwZ+jx/k/Ao8XDq5xZyYohVNgkU71URuBh/kPgLVnLPbZcn4/J/gvIkzIary3TY26ZXDZd8C8gPZSDI5N2ciQnHRi3DK1h678BvwCFNKu/gEt1kQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Create VM screenshot&quot;
        title=&quot;Create VM screenshot&quot;
        src=&quot;/static/86308527edd4bb3ea66f94532e957673/fcda8/create-vm.png&quot;
        srcset=&quot;/static/86308527edd4bb3ea66f94532e957673/12f09/create-vm.png 148w,
/static/86308527edd4bb3ea66f94532e957673/e4a3f/create-vm.png 295w,
/static/86308527edd4bb3ea66f94532e957673/fcda8/create-vm.png 590w,
/static/86308527edd4bb3ea66f94532e957673/efc66/create-vm.png 885w,
/static/86308527edd4bb3ea66f94532e957673/c83ae/create-vm.png 1180w,
/static/86308527edd4bb3ea66f94532e957673/0b79a/create-vm.png 1331w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;ol start=&quot;6&quot;&gt;
&lt;li&gt;Reserve Static IP: go to VPC network &gt; External IP addresses on the GCP dashboard, then select the instance and hit “Reserve Static Address” in the top bar.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/905a996ccef60924d492db03204c55bc/105d8/reserve-static-address.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 15.54054054054054%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAADCAIAAAAcOLh5AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAgklEQVR42hWKBw7DQAgE/f9nRkri4KtwlCu2g0dopWVnI6opRWeMAYl/Af2QtOmyPoVZH+S6zvu+Pa8Hz3OtuX2AKqKIwnG4RYSuEpLj1SeV3vuk1lwQVV/UTGxQ4+0FltBitT1QpnEUDcVCtYg9t/GG/N0p5h5RIXPh5c/CE4rn+gN936uEYs67jAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Reserve static IP Address screenshot&quot;
        title=&quot;Reserve static IP Address screenshot&quot;
        src=&quot;/static/905a996ccef60924d492db03204c55bc/fcda8/reserve-static-address.png&quot;
        srcset=&quot;/static/905a996ccef60924d492db03204c55bc/12f09/reserve-static-address.png 148w,
/static/905a996ccef60924d492db03204c55bc/e4a3f/reserve-static-address.png 295w,
/static/905a996ccef60924d492db03204c55bc/fcda8/reserve-static-address.png 590w,
/static/905a996ccef60924d492db03204c55bc/efc66/reserve-static-address.png 885w,
/static/905a996ccef60924d492db03204c55bc/105d8/reserve-static-address.png 1170w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;Install Ackee&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;SSH to the VM in the web by clicking the SSH button in the instance list of the VM Instances page.&lt;/li&gt;
&lt;li&gt;Install Node 12 LTS (code is copied from &lt;a href=&quot;https://github.com/nodesource/distributions/blob/master/README.md#debinstall&quot;&gt;here&lt;/a&gt;)
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Using Debian, as root&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-sL&lt;/span&gt; https://deb.nodesource.com/setup_12.x &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;bash&lt;/span&gt; -
&lt;span class=&quot;token function&quot;&gt;apt-get&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-y&lt;/span&gt; nodejs&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Install yarn
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-g&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;yarn&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Install Mongo DB: follow the &lt;a href=&quot;https://docs.mongodb.com/manual/tutorial/install-mongodb-on-debian/&quot;&gt;instructions in their official docs&lt;/a&gt;. For me it worked without any issue, here are the commands:
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;wget&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-qO&lt;/span&gt; - https://www.mongodb.org/static/pgp/server-4.2.asc &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; apt-key &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; -
&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;deb http://repo.mongodb.org/apt/debian stretch/mongodb-org/4.2 main&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;tee&lt;/span&gt; /etc/apt/sources.list.d/mongodb-org-4.2.list
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt-get&lt;/span&gt; update
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt-get&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-y&lt;/span&gt; mongodb-org
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; systemctl start mongod
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; systemctl status mongod &lt;span class=&quot;token comment&quot;&gt;# just to see if it works&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; systemctl &lt;span class=&quot;token builtin class-name&quot;&gt;enable&lt;/span&gt; mongod &lt;span class=&quot;token comment&quot;&gt;# start mongo after reboot&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Make the site available&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Set a domain: my domain uses a different DNS provider. I just created a subdomain and set an &lt;code class=&quot;language-text&quot;&gt;A&lt;/code&gt; record that points to the VM’s reserved static IP address.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install NGINX (I used &lt;a href=&quot;https://linuxize.com/post/how-to-install-nginx-on-debian-9/&quot;&gt;this instructions&lt;/a&gt;)&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt-get&lt;/span&gt; update
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt-get&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; nginx
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; systemctl &lt;span class=&quot;token builtin class-name&quot;&gt;enable&lt;/span&gt; nginx&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Set NGINX config, details &lt;a href=&quot;https://github.com/electerious/Ackee/blob/master/docs/SSL%20and%20HTTPS.md&quot;&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install Certbot for Let’s Encrypt (more details &lt;a href=&quot;https://certbot.eff.org/lets-encrypt/debianstretch-nginx&quot;&gt;here&lt;/a&gt;)&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt-get&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; certbot python-certbot-nginx
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; certbot &lt;span class=&quot;token parameter variable&quot;&gt;--nginx&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; certbot renew --dry-run &lt;span class=&quot;token comment&quot;&gt;# To test automatic renewal&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run the app as a service: I followed &lt;a href=&quot;https://tibbo.com/linux/nodejs/service-file.html&quot;&gt;these instuctions&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Create the file &lt;code class=&quot;language-text&quot;&gt;/lib/systemd/system/ackee.service&lt;/code&gt; with the following contents:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;[Unit]
Description=Ackee App
After=network-online.target

[Service]
Restart=on-failure
WorkingDirectory=/home/nandor/Ackee
ExecStart=/usr/bin/node src/index.js

[Install]
WantedBy=mutli-user.target&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Reload daemon&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;systemctl daemon-reload&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Let it run on reboot&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;systemctl &lt;span class=&quot;token builtin class-name&quot;&gt;enable&lt;/span&gt; ackee&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Trial and error&lt;/h2&gt;
&lt;p&gt;First I wanted to run the Dockerized app in the f1-micro instance. I used the Container-optimized OS. But it seems that ~580 MB RAM is not enough to run the Mongo DB and the Ackee containers at the same time (+ an nginx reverse proxy + the GCP’s logger container).&lt;/p&gt;
&lt;p&gt;After struggling for a few hours I decided to try to install the apps directly to Debian. This way everything worked on the first try.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Well, I’ve spent several evenings to move my analytics from Google Analytics to another Google service (Google Cloud Platform). It’s still Google, but the data now is inside a VM’s database, not in GA directly.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Testing React render props with Enzyme]]></title><description><![CDATA[In React 16.3.0 they announced the new, official context API as a replacement of the previous, experimental one. Here, the context consumer…]]></description><link>https://nandito.hu/2018-06-07-testing-react-render-props-with-enzyme/</link><guid isPermaLink="false">https://nandito.hu/2018-06-07-testing-react-render-props-with-enzyme/</guid><pubDate>Thu, 07 Jun 2018 18:50:00 GMT</pubDate><content:encoded>&lt;p&gt;In React 16.3.0 they &lt;a href=&quot;https://reactjs.org/blog/2018/03/29/react-v-16-3.html&quot;&gt;announced&lt;/a&gt; the new, official context API as a replacement of the previous, experimental one. Here, the context consumer requires function as a child to use values from the context. Testing these consumers seemed a bit tricky but here’s a workaround to do that.&lt;/p&gt;
&lt;p&gt;In the examples I use Jest with Enzyme to test an app created by &lt;a href=&quot;https://github.com/facebook/create-react-app&quot;&gt;Create React App&lt;/a&gt;. The official documentation has a &lt;a href=&quot;https://github.com/facebook/create-react-app/blob/master/packages/react-scripts/template/README.md#testing-components&quot;&gt;step-by-step guide&lt;/a&gt; how to set up these framework easily.&lt;/p&gt;
&lt;h2&gt;The problem&lt;/h2&gt;
&lt;p&gt;When we have a render prop in the shallow rendered React component test, we cannot see its name.&lt;/p&gt;
&lt;p&gt;So when we have this in the Header component:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;Header&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Consumer&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; language &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
      &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;header&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
        &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;h1&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;dictionary&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;GREETING&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;language&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;h1&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
      &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;header&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;Consumer&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;this in the test:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token function&quot;&gt;describe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Header&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;it&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;renders the Header&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; wrapper &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;shallow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Header &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;wrapper&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;debug&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;we get this as a result:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;object Object&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;undefined&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;object Object&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Neither find() nor findWhere() functions work here as currently they cannot get the header or h1 tags in this state.&lt;/p&gt;
&lt;h2&gt;A solution&lt;/h2&gt;
&lt;p&gt;When we use render props, the wrapped component will be the result of the wrapper’s children prop function and it gets some values as a parameter. In the preceding example the consumer passes an object with the language code to the header to show the greeting in the current language.&lt;/p&gt;
&lt;p&gt;When we need to test this children prop, we can do that by getting and rendering it again:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token function&quot;&gt;it&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;renders the Header&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; outer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;shallow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Header &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; Children &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; outer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;prop&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;children&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; wrapper &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;shallow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Children &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;wrapper&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;debug&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Here, the output shows the correct element names:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;header&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;h1 &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;header&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now we can use the Enzyme’s &lt;code class=&quot;language-text&quot;&gt;find()&lt;/code&gt; function to write some tests and make sure the Header component always works.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token function&quot;&gt;it&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;renders the Header&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; outer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;shallow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Header &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; Children &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; outer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;prop&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;children&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; wrapper &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;shallow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Children &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;wrapper&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;header&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toHaveLength&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;wrapper&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;h1&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toHaveLength&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;It is working! Now we can be sure that our Header component will always have header and h1 tags in the future - or else this test will fail.&lt;/p&gt;
&lt;h2&gt;Testing the passed values&lt;/h2&gt;
&lt;p&gt;The h1 tags do not render any value in this current state because there is no value passed by the consumer. Luckily we can also manipulate this passed value directly from our test.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token function&quot;&gt;it&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;renders the title on the proper language&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; outer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;shallow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Header&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; Children &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; outer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;prop&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;children&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; wrapper &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;shallow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Children language&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;en&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;wrapper&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;debug&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now as we can see in the console, heading tag gets value:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;header&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;h1&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
    Hello World&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;h1&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;header&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Let’s write some test expectations to make sure it works in the future:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token function&quot;&gt;it&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;renders the title on the proper language&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; outer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;shallow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Header&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; Children &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; outer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;prop&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;children&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; wrapper &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;shallow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Children language&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;en&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;wrapper&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;h1&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toBe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;dictionary&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;GREETING&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;en&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;wrapper&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;h1&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toBe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Hello World!&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In the snippet above you may prefer to expect the rendered translated text defined as a reference to the dictionary (&lt;code class=&quot;language-text&quot;&gt;dictionary[&apos;GREETING&apos;][&apos;en&apos;]&lt;/code&gt;) or as a string (&lt;code class=&quot;language-text&quot;&gt;&apos;Hello World!&apos;&lt;/code&gt;). If you use the former, your test won’t break when someone updates the dictionary, while the latter will do.&lt;/p&gt;
&lt;p&gt;This way we test that:&lt;/p&gt;
&lt;p&gt;Header component does not crash
It renders all the expected tags: header and h1
It uses the value it gets from the context&lt;/p&gt;
&lt;p&gt;I’m not sure if this is the best way to test components with the new context API. But currently it is good enough to make sure my components work as expected.&lt;/p&gt;
&lt;p&gt;If we have several components using the context consumer, it is a good practice to create a helper function for the tests. Here’s an example:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;shallowRenderProps&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;Component&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; injectedProps&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; outer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;shallow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Component&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; Children &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; outer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;prop&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;children&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; childrenWrapper &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;shallow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Children&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;injectedProps&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; wrapper &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; childrenWrapper&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;shallow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; wrapper
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now we can render the Heading components in the test like this:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token function&quot;&gt;it&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;renders the title on the proper language&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; wrapper &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;shallowRenderProps&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Header&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token literal-property property&quot;&gt;language&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;en&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;wrapper&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;h1&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toBe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;dictionary&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;GREETING&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;en&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;wrapper&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;h1&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toBe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Hello World!&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/nandito/react-test&quot;&gt;You can find the code on GitHub&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[How to learn React]]></title><description><![CDATA[A couple days ago I was asked to give some ideas about how to dig into JavaScript and React to be able to join a team and deliver code as a…]]></description><link>https://nandito.hu/2018-04-26-how-to-learn-react/</link><guid isPermaLink="false">https://nandito.hu/2018-04-26-how-to-learn-react/</guid><pubDate>Thu, 26 Apr 2018 18:54:00 GMT</pubDate><content:encoded>&lt;p&gt;A couple days ago I was asked to give some ideas about how to dig into JavaScript and React to be able to join a team and deliver code as a frontend developer. I’ve collected my favorite resources, feel free to check them out.&lt;/p&gt;
&lt;h2&gt;Videos&lt;/h2&gt;
&lt;p&gt;A screencast tutorial is like sitting next to a teacher who explains what she/he is doing. If something is not clear it can be replayed or the playing speed can be adjusted.&lt;/p&gt;
&lt;p&gt;The first React tutorial I saw is &lt;a href=&quot;https://reactforbeginners.com/&quot;&gt;React for Beginners&lt;/a&gt; by Wes Bos. It was a good start and as I see Wes Bos keeps it up-to-date.&lt;/p&gt;
&lt;p&gt;I’ve learnt a lot from &lt;a href=&quot;https://egghead.io/?rc=kkns8a&quot;&gt;Egghead.io&lt;/a&gt; videos. They have free resources from big names of the JavaScript community, for example&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://egghead.io/courses/the-beginner-s-guide-to-reactjs&quot;&gt;The Beginner’s Guide to ReactJS&lt;/a&gt; by Kent C. Dodds&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://egghead.io/courses/start-learning-react&quot;&gt;Start Learning React&lt;/a&gt; by Joe Maddalone&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://egghead.io/courses/getting-started-with-redux&quot;&gt;Getting Started with Redux&lt;/a&gt; by Dan Abramov&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I also have an annual subscription here, they upload quality content frequently and for me this is absolutely worth its price.&lt;/p&gt;
&lt;p&gt;I also recommend the &lt;a href=&quot;https://www.udemy.com/understand-javascript/&quot;&gt;JavaScript: Understanding the Weird Parts&lt;/a&gt; course on Udemy. This is a huge collection of videos about JavaScript in general. It helped me a lot to write code with more confidence.&lt;/p&gt;
&lt;h2&gt;Books&lt;/h2&gt;
&lt;p&gt;I’ve bought some React books, it feels good to have some on my e-book reader. Here are my favorites:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.packtpub.com/web-development/react-design-patterns-and-best-practices&quot;&gt;React Design Patterns and Best Practices&lt;/a&gt; by Michele Bertoli&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://leanpub.com/survivejs-react&quot;&gt;SurviveJS&lt;/a&gt; - React by Juho Vepsäläinen&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.packtpub.com/web-development/progressive-web-apps-react&quot;&gt;Progressive Web Apps with React&lt;/a&gt; by Scott Domes&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship-ebook/dp/B001GSTOAM&quot;&gt;Clean Code: A Handbook of Agile Software Craftsmanship&lt;/a&gt; by Robert C. Martin&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The Clean Code book is not about React but it is a mandatory book for all developers. I recommend the whole Robert C. Martin series.&lt;/p&gt;
&lt;h2&gt;Blogs&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://medium.com/&quot;&gt;Medium&lt;/a&gt; is one of the best resources to follow technologies, influencers, developers. You can read announcements, case studies, tutorials, best practices, general and unique problems with solutions. This platform has a pretty good recommending engine, it will show you posts based on your “claps”.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://reactjs.org/blog&quot;&gt;Official React Blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://react-etc.net/&quot;&gt;React, etc. Tech Stack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mxstbr.blog/&quot;&gt;Max Stoiber’s Blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.isquaredsoftware.com/&quot;&gt;Mark’s Dev Blog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;YouTube channels&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/channel/UCO1cgjhGzsSYb1rsB4bFe4Q&quot;&gt;Fun Fun Function&lt;/a&gt; - This is definitely my favorite YouTube channel. This guy has many high quality videos not just in React, but also in pure JavaScript.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/channel/UCsFrt8oKNYXGspSlX9u6uXw&quot;&gt;React Amsterdam&lt;/a&gt; - They upload the React Amsterdam conference talks here.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/channel/UCyU5wkjgQYGRB0hIHMwm2Sg&quot;&gt;LevelUpTuts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/channel/UCbxzdZTDn4YB4Z-ukch2ivw&quot;&gt;Front End Center&lt;/a&gt; - This channel’s videos are about concepts, they are very useful if you want to write clean code.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/channel/UCbxzdZTDn4YB4Z-ukch2ivw&quot;&gt;ReactCasts&lt;/a&gt; - Quick screencasts with nice narrations.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/channel/UCtxCXg-UvSnTKPOzLH4wJaQ&quot;&gt;Coding Tech&lt;/a&gt; - You can find all kinds of coding videos here, not just React - mostly conference talks.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;GitHub&lt;/h2&gt;
&lt;p&gt;I follow some developers on GitHub to see their activities and recommendations (stars) on my GitHub feed.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/gaearon&quot;&gt;Dan Abramov&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/kentcdodds&quot;&gt;Kent C. Dodds&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/peggyrayzis&quot;&gt;Peggy Rayzis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/jbaxleyiii&quot;&gt;James Baxley&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/mpj&quot;&gt;Mattias Petter Johansson&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/stubailo&quot;&gt;Sashko Stubailo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/nandito?tab=following&quot;&gt;etc..&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Do it&lt;/h2&gt;
&lt;p&gt;Of course, reading all the books and watching all the videos won’t transform anyone to a decent developer. It is mandatory to practice writing code so I encourage everyone to type (not just copy-paste, type!) the code and try them out. This is the best way to learn and strengthen the muscle memory.&lt;/p&gt;
&lt;p&gt;Later, if you encounter a problem that you’d solved before in one of your practices or tutorials, it is much easier to find the solution in your developer machine’s folder than to find that video and that part of it where they solve that problem. And for sure it is even harder if you watched it weeks or months ago.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Set up GraphiQL IDE for Tipe]]></title><description><![CDATA[In a previous article I mentioned Tipe which is a GraphQL software as a service provider “under construction”. Well, their beta version has…]]></description><link>https://nandito.hu/2018-02-05-set-up-graphiql-ide-for-tipe/‎index/</link><guid isPermaLink="false">https://nandito.hu/2018-02-05-set-up-graphiql-ide-for-tipe/‎index/</guid><pubDate>Mon, 05 Feb 2018 05:08:00 GMT</pubDate><content:encoded>&lt;p&gt;In a previous article I mentioned &lt;a href=&quot;https://tipe.io/&quot;&gt;Tipe&lt;/a&gt; which is a GraphQL software as a service provider “under construction”. Well, their beta version has been available since the 2nd of February and as they have a cute cat logo, I signed up immediately. I saw that currently it’s quite hard to check the GraphQL schema of the endpoint. Although the GraphQL playground implementation is on their roadmap, it’s not available yet. So I decided to set up a &lt;a href=&quot;https://github.com/graphql/graphiql&quot;&gt;GraphiQL&lt;/a&gt; IDE locally for Tipe.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The code is available on GitHub: &lt;a href=&quot;https://github.com/nandito/tipe-graphiql&quot;&gt;https://github.com/nandito/tipe-graphiql&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Tipe&lt;/h2&gt;
&lt;p&gt;So far I’ve just been playing with the Tipe’s admin interface. I’ve created some folders, templates and documents. I miss many things from their service but I know they are in beta phase so I would not complain about anything.&lt;/p&gt;
&lt;h2&gt;Create React App&lt;/h2&gt;
&lt;p&gt;Tipe provides an API endpoint and we have to use custom request headers to get our project’s data. I used &lt;a href=&quot;https://github.com/facebook/create-react-app&quot;&gt;create-react-app&lt;/a&gt; for bootstrapping the project. This way I saved the time of the build configuration.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; create-react-app &lt;span class=&quot;token parameter variable&quot;&gt;-g&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# install create-react-app globally&lt;/span&gt;
$ create-react-app tipe-graphiql&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This creates the &lt;code class=&quot;language-text&quot;&gt;tipe-graphiql&lt;/code&gt; project folder with all the necessary React configurations.&lt;/p&gt;
&lt;h2&gt;Add GraphiQL dependency&lt;/h2&gt;
&lt;p&gt;Next I added &lt;code class=&quot;language-text&quot;&gt;graphiql&lt;/code&gt; as a dependency and ran the installer script.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ &lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; tipe-graphiql
$ &lt;span class=&quot;token function&quot;&gt;yarn&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; graphiql &lt;span class=&quot;token comment&quot;&gt;# or npm install graphiql --save&lt;/span&gt;
$ &lt;span class=&quot;token function&quot;&gt;yarn&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# or npm install&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now that everything is installed, it’s time to add GraphiQL to the app and remove all the unused Create React App code.&lt;/p&gt;
&lt;h2&gt;Replace sample React code with GraphiQL&lt;/h2&gt;
&lt;p&gt;Edit the &lt;code class=&quot;language-text&quot;&gt;src/index.js&lt;/code&gt; file: remove the service worker and the imported &lt;code class=&quot;language-text&quot;&gt;App&lt;/code&gt; component, then paste the code from the GraphiQL’s GitHub page.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; React &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;react&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; ReactDOM &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;react-dom&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; GraphiQL &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;graphiql&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; fetch &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;isomorphic-fetch&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;./index.css&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;../node_modules/graphiql/graphiql.css&apos;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;API_KEY&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;your_api_key&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;ORG_SECRET_KEY&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;your_org_secret&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;graphQLFetcher&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;graphQLParams&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;https://api.tipe.io/graphql&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;post&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;headers&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token string-property property&quot;&gt;&apos;Content-Type&apos;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;application/json&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string-property property&quot;&gt;&apos;Authorization&apos;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;API_KEY&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string-property property&quot;&gt;&apos;Tipe-Id&apos;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;ORG_SECRET_KEY&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;stringify&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;graphQLParams&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;response&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

ReactDOM&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getElementById&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;root&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I used the &lt;a href=&quot;https://docs.tipe.io/docs/graphql-api-request&quot;&gt;Tipe’s GraphQL API request docs&lt;/a&gt; to set up the request credentials. The endpoint url (&lt;code class=&quot;language-text&quot;&gt;https://api.tipe.io/graphql&lt;/code&gt;) seems generic, that’s why I didn’t extract it as a constant. The &lt;code class=&quot;language-text&quot;&gt;API_KEY&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;ORG_SECRET_KEY&lt;/code&gt; constants should be replaced with your own credentials. You can find some guides in the linked docs to get them.&lt;/p&gt;
&lt;p&gt;I also had to include the GraphiQL styles by importing its css file from the &lt;code class=&quot;language-text&quot;&gt;node_modules&lt;/code&gt; folder.&lt;/p&gt;
&lt;p&gt;Then I set the height in the &lt;code class=&quot;language-text&quot;&gt;src/index.css&lt;/code&gt; to stretch the IDE to fill the whole page.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;body&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;margin&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-family&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; sans-serif&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;html, body, #root&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 100%&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Clean up&lt;/h2&gt;
&lt;p&gt;As I don’t use the &lt;code class=&quot;language-text&quot;&gt;App&lt;/code&gt; component and the service worker, their files can be removed.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;rm&lt;/span&gt; ./src/App.*
$ &lt;span class=&quot;token function&quot;&gt;rm&lt;/span&gt; ./src/logo.svg
$ &lt;span class=&quot;token function&quot;&gt;rm&lt;/span&gt; ./src/registerServiceWorker.js&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Run the app locally&lt;/h2&gt;
&lt;p&gt;Now the app server can be started and when it runs, the GraphiQL IDE is available in the browser (&lt;a href=&quot;http://localhost:3000/&quot;&gt;http://localhost:3000/&lt;/a&gt;).&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ &lt;span class=&quot;token function&quot;&gt;yarn&lt;/span&gt; start &lt;span class=&quot;token comment&quot;&gt;# or npm start&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now I can browse the schema and test the queries!&lt;/p&gt;
&lt;h5&gt;GraphiQL with schema explorer in a browser&lt;/h5&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/607d90b783cf06540b35854836f8ad78/8ec0a/graphiql-on-localhost.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 60.810810810810814%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAMABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAEDAgX/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIQAxAAAAHsKyMFA//EABgQAAMBAQAAAAAAAAAAAAAAAAADExAR/9oACAEBAAEFApLJLIr3p//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABgQAAMBAQAAAAAAAAAAAAAAAAIykQAg/9oACAEBAAY/AkGZBmQZx//EABgQAAIDAAAAAAAAAAAAAAAAAAEQESAh/9oACAEBAAE/IRSlGTqf/9oADAMBAAIAAwAAABBwz//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8QP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8QP//EABwQAQACAgMBAAAAAAAAAAAAAAEAESFhMUFxwf/aAAgBAQABPxBQWhsTPRf4gB8cHHEv0JbU/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;GraphiQL with schema explorer in a browser&quot;
        title=&quot;GraphiQL with schema explorer in a browser&quot;
        src=&quot;/static/607d90b783cf06540b35854836f8ad78/1c72d/graphiql-on-localhost.jpg&quot;
        srcset=&quot;/static/607d90b783cf06540b35854836f8ad78/a80bd/graphiql-on-localhost.jpg 148w,
/static/607d90b783cf06540b35854836f8ad78/1c91a/graphiql-on-localhost.jpg 295w,
/static/607d90b783cf06540b35854836f8ad78/1c72d/graphiql-on-localhost.jpg 590w,
/static/607d90b783cf06540b35854836f8ad78/a8a14/graphiql-on-localhost.jpg 885w,
/static/607d90b783cf06540b35854836f8ad78/fbd2c/graphiql-on-localhost.jpg 1180w,
/static/607d90b783cf06540b35854836f8ad78/8ec0a/graphiql-on-localhost.jpg 2560w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h5&gt;Example query with query variables in GraphiQL&lt;/h5&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/23b1c5003e2ce767749a1607d34d8bca/8ec0a/graphiql-query-test.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 60.810810810810814%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAMABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAEDAgX/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIQAxAAAAHsKyMFQ//EABcQAAMBAAAAAAAAAAAAAAAAAAADEyD/2gAIAQEAAQUCisksivH/xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAYEAADAQEAAAAAAAAAAAAAAAACMpEAIP/aAAgBAQAGPwJBmQZkGcf/xAAYEAEBAAMAAAAAAAAAAAAAAAAAEQEQIf/aAAgBAQABPyHgGNWZVV//2gAMAwEAAgADAAAAEJgP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHRAAAgIBBQAAAAAAAAAAAAAAAAERIWExQVGB4f/aAAgBAQABPxBap3FDdMeFF4clHQnlUieD/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Example query with query variables in GraphiQL&quot;
        title=&quot;Example query with query variables in GraphiQL&quot;
        src=&quot;/static/23b1c5003e2ce767749a1607d34d8bca/1c72d/graphiql-query-test.jpg&quot;
        srcset=&quot;/static/23b1c5003e2ce767749a1607d34d8bca/a80bd/graphiql-query-test.jpg 148w,
/static/23b1c5003e2ce767749a1607d34d8bca/1c91a/graphiql-query-test.jpg 295w,
/static/23b1c5003e2ce767749a1607d34d8bca/1c72d/graphiql-query-test.jpg 590w,
/static/23b1c5003e2ce767749a1607d34d8bca/a8a14/graphiql-query-test.jpg 885w,
/static/23b1c5003e2ce767749a1607d34d8bca/fbd2c/graphiql-query-test.jpg 1180w,
/static/23b1c5003e2ce767749a1607d34d8bca/8ec0a/graphiql-query-test.jpg 2560w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[GraphQL backend providers]]></title><description><![CDATA[There’s a list of GraphQL services on the official website of GraphQL. Most of these are backend as a service solutions. At first look, it…]]></description><link>https://nandito.hu/2018-01-26-graphql-backend-providers/</link><guid isPermaLink="false">https://nandito.hu/2018-01-26-graphql-backend-providers/</guid><pubDate>Fri, 26 Jan 2018 05:48:07 GMT</pubDate><content:encoded>&lt;p&gt;There’s a &lt;a href=&quot;http://graphql.org/code/#services&quot;&gt;list&lt;/a&gt; of GraphQL services on the &lt;a href=&quot;http://graphql.org/&quot;&gt;official website of GraphQL&lt;/a&gt;. Most of these are backend as a service solutions. At first look, it might seem like a good idea to use them.&lt;/p&gt;
&lt;h3&gt;BaaS concept&lt;/h3&gt;
&lt;p&gt;In short, the &lt;a href=&quot;https://en.wikipedia.org/wiki/Mobile_backend_as_a_service&quot;&gt;backend as a service&lt;/a&gt; (BaaS) grants a cloud based backend for our mobile or web app - or for only some parts of them. This can be for example user management, social media integration or any function we have defined. Some providers let us create full-featured &lt;a href=&quot;https://en.wikipedia.org/wiki/Create,_read,_update_and_delete&quot;&gt;CRUD&lt;/a&gt; application backend using only their web graphical user interface.&lt;/p&gt;
&lt;p&gt;We can use this backend through an API. If we have a CRUD app we can create, read, update and delete data via usual client-server communication.&lt;/p&gt;
&lt;p&gt;The BaaS providers charge their customers for the service. This can be a monthly, annual or usage based fee.&lt;/p&gt;
&lt;p&gt;Nowadays - as the market has expanded - basically everything is available through a BaaS. There are traditional &lt;a href=&quot;https://en.wikipedia.org/wiki/Representational_state_transfer&quot;&gt;REST&lt;/a&gt; API and GraphQL API providers. This article is about the latter ones.&lt;/p&gt;
&lt;h3&gt;Most of them has transformed or the development has stopped&lt;/h3&gt;
&lt;p&gt;This is the current list of BaaS services on the official GraphQL website:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;del&gt;GraphCMS&lt;/del&gt; Hygraph&lt;/li&gt;
&lt;li&gt;Graphcool&lt;/li&gt;
&lt;li&gt;Reindex&lt;/li&gt;
&lt;li&gt;Scaphold&lt;/li&gt;
&lt;li&gt;Tipe (this one is marked as software as a service)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Probably the best-known of the services above is &lt;a href=&quot;https://www.graph.cool/&quot;&gt;Graphcool&lt;/a&gt;. Their extremely ambitious team is in Berlin and they have acquired well deserved reputation in no time. The GraphQL backend can be defined through their well-designed web console without deep coding knowledge.&lt;/p&gt;
&lt;p&gt;In October, 2017 they announced that they would change the business model of Graphcool and in the future it would be transformed to an open source backend framework. Although they are also keeping their existing BaaS, the web console with 3rd party integrations has noticeably taken a back seat.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://scaphold.io/&quot;&gt;Scaphold&lt;/a&gt; is very similar to Graphcool. There are more 3rd party provider integration options in their web console and it is possible to define custom interfaces for the schema. Nevertheless it is not hard to find bugs on this web interface, saving changes fails several times due to server error.&lt;/p&gt;
&lt;p&gt;The Scaphold’s Slack is like a ghost town where a pinned message says:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;IMPORTANT&lt;/em&gt;: We’re currently going through some product changes. Until further notice, we are under maintenance mode. We really appreciate your patience and support!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The founders (and owners?) are members of this Slack group, however they don’t respond to any questions and don’t try to dispel rumours that have been spreading around on Scaphold’s death. There are rumours about both acquisition and litigation. Anyhow, it seems risky to use Scaphold as BaaS for a new, greenfield project.&lt;/p&gt;
&lt;p&gt;The url of the &lt;a href=&quot;https://www.reindex.io/baas/&quot;&gt;Reindex BaaS&lt;/a&gt; navigates to a 404 Not Found page. They announced in an &lt;a href=&quot;https://www.reindex.io/blog/discontinuing-backend-as-a-service/&quot;&gt;article&lt;/a&gt; on their blog that because of the strong competition they are discontinuing the hosted service and they make the source code available under open source license. Unfortunately I did not have the opportunity to try the Reindex BaaS.&lt;/p&gt;
&lt;p&gt;I haven’t tried &lt;del&gt;&lt;a href=&quot;https://graphcms.com/&quot;&gt;GraphCMS&lt;/a&gt;&lt;/del&gt; &lt;a href=&quot;https://hygraph.com/&quot;&gt;Hygraph&lt;/a&gt; either. Those who tried recommend it: they say it has great support, an active developer team and they would like to work as BaaS provider in the future. Maybe I’ll write an article about my experience if I try it in the future. Until then good luck for them!&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://tipe.io/&quot;&gt;Tipe&lt;/a&gt; is in &lt;em&gt;request access&lt;/em&gt; phase. Anyone can register and request an invitation to use their service. This email address collecting is a common practice, sometimes they do this when there is a business idea and they want to measure and predict how large the possible user base is. Then they can decide whether to start the business or not based on this result. I don’t say that Tipe works like this but I haven’t received the invitation I requested 2 months ago.&lt;/p&gt;
&lt;p&gt;The question arises based on the above: why do these providers transform or discontinue their development?&lt;/p&gt;
&lt;h3&gt;It’s easy to reach their limits&lt;/h3&gt;
&lt;p&gt;The services I have tried mostly have the same functionality. Generally each software is similar in some aspects of development until a &lt;em&gt;certain point&lt;/em&gt;. Data can be created, read, modified and deleted through an interface. Maybe some of these need user registration and different permissions.&lt;/p&gt;
&lt;p&gt;After the _certain point _the business logic starts to get complicated, therefore the software needs more complicated and unique development solutions. Hence the need for custom backend functions. BaaS providers let their users define these functions in the web console.&lt;/p&gt;
&lt;p&gt;However, if not just one developer but an entire team works on the project at the same time, they have to use the same console. This makes development more difficult as writing tests for the functions is not available (at least currently) and simultaneous editing can cause data (code) loss.&lt;/p&gt;
&lt;p&gt;Likewise, version control is also missing, it’s hard to track what is changed, when and why and by whom.&lt;/p&gt;
&lt;h3&gt;For how long is it worth using them?&lt;/h3&gt;
&lt;p&gt;I think BaaS could save the time and cost of the backend development of a &lt;em&gt;greenfield&lt;/em&gt; or prototype application. Thus, using a BaaS for a not too complicated &lt;a href=&quot;https://en.wikipedia.org/wiki/Minimum_viable_product&quot;&gt;MVP&lt;/a&gt; (Minimum Viable Product) application can be considered a good option.&lt;/p&gt;
&lt;p&gt;Later, when we find out during the test phase of our MVP application that it has potential, and there’s a need to continue the development, it might be worth dedicating backend developers to the project. The GraphQL schema can be exported from both Graphcool and Scaphold, using them makes the backend development easier.&lt;/p&gt;
&lt;h3&gt;Foresight: Amazon appears on the stage&lt;/h3&gt;
&lt;p&gt;At the end of November 2017, Amazon &lt;a href=&quot;https://aws.amazon.com/about-aws/whats-new/2017/11/introducing-aws-appsync-a-managed-graphql-service-with-real-time-data-and-offline-programming/&quot;&gt;announced&lt;/a&gt; that they would start their managed GraphQL service. AWS AppSync can be a huge competitor for most of the currently available BaaS providers. Mostly because Amazon has several experienced developers (the dev power) who can help the company to catch up with GraphQL. On the other hand, if the AppSync is integrated easily into the existing Amazon architecture, it can be a decision point for a developer team: using a well-known and already used provider instead of a smaller, startup-like BaaS.&lt;/p&gt;
&lt;p&gt;Currently the AWS AppSync is in preview phase, to use it an invitation request needs to be submitted. So far I haven’t done that, as the request form asks for credit card data.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[GraphQL backend szolgáltatók]]></title><description><![CDATA[A GraphQL hivatalos oldalán van egy lista a GrahpQL technológián alapuló szolgáltatókról. Ezek nagyrésze backend as a service (BaaS)…]]></description><link>https://nandito.hu/2018-01-09-graphql-backend-szolgaltatok/</link><guid isPermaLink="false">https://nandito.hu/2018-01-09-graphql-backend-szolgaltatok/</guid><pubDate>Tue, 09 Jan 2018 05:51:07 GMT</pubDate><content:encoded>&lt;p&gt;A &lt;a href=&quot;http://graphql.org/&quot;&gt;GraphQL hivatalos oldalán&lt;/a&gt; van egy &lt;a href=&quot;http://graphql.org/code/#services&quot;&gt;lista&lt;/a&gt; a GrahpQL technológián alapuló szolgáltatókról. Ezek nagyrésze backend as a service (BaaS) megoldás. Első ránézésre remek ötlet ilyet használni.&lt;/p&gt;
&lt;h3&gt;BaaS koncepció&lt;/h3&gt;
&lt;p&gt;A &lt;a href=&quot;https://en.wikipedia.org/wiki/Mobile_backend_as_a_service&quot;&gt;backend as a service&lt;/a&gt; lényege, hogy a telefonon vagy böngészőben futó alkalmazáshoz tartozó backend-et - vagy annak bizonyos részeit - egy felhőalapú szolgáltató biztosítja. Ilyen lehet például a felhasználó-kezelés, integráció a közösségi médiával vagy bármi általunk definiált funkció. Néhány szolgáltató lehetőséget biztosít arra, hogy webes felületükön akár pár perc kattingatás után egy komplex &lt;a href=&quot;https://en.wikipedia.org/wiki/Create,_read,_update_and_delete&quot;&gt;CRUD&lt;/a&gt; alkalmazás backend-et kapjunk.&lt;/p&gt;
&lt;p&gt;A backend-et az alkalmazásunkból egy API-n keresztül érjük el. Egy CRUD alkamazás esetén a szokásos kliens-szerver kommunikáció révén tudunk adatot létrehozni, lekérni, módosítani vagy törölni.&lt;/p&gt;
&lt;p&gt;A BaaS szolgáltatók pénzt kérnek a szolgáltatásukért. Ez lehet havi vagy használat, forgalom alapú díj is.&lt;/p&gt;
&lt;p&gt;A BaaS piac nagyra nőtt már, szinte mindenre létezik ilyen megoldás. Vannak tradícionális &lt;a href=&quot;https://en.wikipedia.org/wiki/Representational_state_transfer&quot;&gt;REST&lt;/a&gt; API-t biztosítók és GraphQL API-t biztosítók is, ebben a cikkben az utóbbiakkal foglalkozok.&lt;/p&gt;
&lt;h3&gt;A legtöbb fejlesztése leáll vagy átalakul&lt;/h3&gt;
&lt;p&gt;A GraphQL oldalán ma felsorolt BaaS szolgáltatók:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GraphCMS&lt;/li&gt;
&lt;li&gt;Graphcool&lt;/li&gt;
&lt;li&gt;Reindex&lt;/li&gt;
&lt;li&gt;Scaphold&lt;/li&gt;
&lt;li&gt;Tipe (ez igazából software as a service-nek van megjelölve)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ezek közül talán a legismertebb a &lt;a href=&quot;https://www.graph.cool/&quot;&gt;Graphcool&lt;/a&gt;. Roppant ambíciózus csapatuk Berlinben van, hamar nagy népszerűségre tettek szert, nem is véletlenül. Szépen megrajzolt weboldalon biztosítanak egy konzolt, melyben kódolási ismeretek nélkül létre lehet hozni egy GraphQL backended.&lt;/p&gt;
&lt;p&gt;2017 októberében &lt;a href=&quot;https://blog.graph.cool/introducing-the-graphcool-framework-d9edab2a7816&quot;&gt;bejelentették&lt;/a&gt;, hogy üzleti modelljük átalakul és a továbbiakban backend framework-ként szeretnének tovább működni. Bár megtartják a BaaS szolgáltatást is - a korábbi, 3rd party szolgáltatás integrációkkal és webes szerkesztővel működő verzió érezhetően háttérbe szorult.&lt;/p&gt;
&lt;p&gt;A &lt;a href=&quot;https://scaphold.io/&quot;&gt;Scaphold&lt;/a&gt; nagyon hasonlít a Graphcool-hoz. Webes felületükön valamivel több 3rd party szolgátató integrációjára adnak lehetőséget, illetve lehet egyéni interface-eket létrehozni a sémához. Viszont nem nehéz bug-ot találni ezen a webes felületen, többször valamiféle szerverhiba miatt sikertelen a mentés.&lt;/p&gt;
&lt;p&gt;A Scaphold szellemvároshoz hasonlító Slack csoportjában kitűzött üzenet, hogy a szolgáltató nagy átalakításon megy keresztül, addig is “karbantartás módban” üzemelnek, kérik az ügyfelek szíves türelmét és megértését. Az alapítók, tulajdonosok - bár tagjai a Slack csoportnak -, nem válaszolnak a kérdésekre és nem is próbálják eloszlatni a pletykákat, miszerint a Scaphold meghal(t). A csoportban egyébként vannak pletykák felvásárlásról és perről is. Mindenesetre egy újonnan fejlesztett szoftverhez a Scaphold-ot választani BaaS-nek kockázatos vállalkozásnak bizonyul.&lt;/p&gt;
&lt;p&gt;A &lt;a href=&quot;https://www.reindex.io/baas/&quot;&gt;Reindex BaaS&lt;/a&gt;-re mutató link 404 Not Found oldalra visz. A blogjukra térve van egy &lt;a href=&quot;https://www.reindex.io/blog/discontinuing-backend-as-a-service/&quot;&gt;bejegyzés&lt;/a&gt;, mely szerint a BaaS-t - főleg az erős konkurencia miatt - leállítják, a kódbázisukat nyílt forráskódúvá alakítják, az eddigi támogatást köszönik. Sajnos a Reindex BaaS-et még ereje teljében nem sikerült kipróbálnom.&lt;/p&gt;
&lt;p&gt;A &lt;a href=&quot;https://graphcms.com/&quot;&gt;GraphCMS&lt;/a&gt;-t sem próbáltam még ki. Akik kipróbálták, dicsérik: jó a támogatottsága, aktív fejlesztői csapat áll mögötte és továbbra is BaaS-ként szeretnének működni. Ha majd kipróbálom, lehet, hogy megírom a tapasztalatimat, addig is sok sikert nekik!&lt;/p&gt;
&lt;p&gt;A &lt;a href=&quot;https://tipe.io/&quot;&gt;Tipe&lt;/a&gt; ma még “request access” fázisban van, vagyis nem regisztrálhat akárki, fel kell iratkozni meghívóra. Bevett szokás egy ilyen feliratkozós rendszert már akkor közzétenni, amikor a szolgáltatás - amire fel lehet iratkozni - még csak fejben vagy papíron létezik. Így annak függvényében, hogy hányan iratkoznak fel - vagyis mennyien érdeklődnek - vágnak bele a fejlesztésbe vagy néznek új üzleti lehetőségek után. Persze egyáltalán nem biztos, hogy a Tipe is ezt játssza, mindenesetre eddig én nem kaptam meghívót, pedig kb 2 hónapja feliratkoztam rá.&lt;/p&gt;
&lt;p&gt;A fent leírtak alapján felmerült bennem a kérdés, hogy miért tűnnek el vagy alakulnak át ezek a szolgáltatók?&lt;/p&gt;
&lt;h3&gt;Könnyű elérni ezek határát&lt;/h3&gt;
&lt;p&gt;Az általam kipróbált szolgáltatók többnyire ugyanazokat a lehetőségeket biztosítják a fejlesztők számára. A szoftverek egy bizonyos pontig nagyon hasonlítanak. Adatot lehet bennük létrehozni, megtekinteni, módosítani és törölni. Esetleg ezek regisztrációhoz vannak kötve és felhasználók különféle jogkörökkel rendelkeznek.&lt;/p&gt;
&lt;p&gt;Egy pont után, ahol a program értelmét adó üzleti modell elkezd bonyolódni, ott következésképpen az alkalmazás is komplikáltabb fejlesztői megoldásokat igényel. Itt jönnek képbe jellemzően az egyéni backend függvények, melyekkel ez megvalósítható és erre a BaaS lehetőséget is ad a webes felületen keresztül.&lt;/p&gt;
&lt;p&gt;Ha azonban nem csak egy fejlesztő, hanem egy csapat dolgozik ezen, akkor ugyanazt a felületet módosítanák többen - akár egyidőben is. Így a fejlesztők hamar egymás lábára léphetnek, főleg, hogy ezek a felületek nem adnak (ma még) lehetőséget, hogy ezekhez a függvényekhez tesztet írjunk.&lt;/p&gt;
&lt;p&gt;Ugyanitt merül fel problémaként a verziókövetés hiánya: nehéz dokumentálni és visszakövetni, hogy melyik változás, mikor, ki által és miért következett be.&lt;/p&gt;
&lt;h3&gt;Akkor meddig jó?&lt;/h3&gt;
&lt;p&gt;Úgy gondolom, hogy egy zöldmezős vagy prototípus alkalmazás létrehozásakor sok, backend fejlesztésre szánt idő (és pénz) megspórolható a BaaS által. Egy nem túl komplex, &lt;a href=&quot;https://en.wikipedia.org/wiki/Minimum_viable_product&quot;&gt;MVP&lt;/a&gt; (Minimum Viable Product, minimum elvárásokat teljesítő termék) alkalmazáshoz jó választás lehet egy ilyen szolgáltatás használata.&lt;/p&gt;
&lt;p&gt;Ha erről az MVP alkalmazásról a piacra kerülést követően vagy a tesztfázisban kiderül, hogy “van benne potenciál”, azaz van igény a továbbfejlesztésre, akkor érdemes lehet backend fejlesztőket dedikálni a projektre. A Graphcool és Scaphold felületén is van lehetőség kiexportálni a sémát, azok felhasználásával a saját backend fejlesztése már nem nulláról indul.&lt;/p&gt;
&lt;h3&gt;Előretekintés: az Amazon színrelép&lt;/h3&gt;
&lt;p&gt;November végén az Amazon &lt;a href=&quot;https://aws.amazon.com/about-aws/whats-new/2017/11/introducing-aws-appsync-a-managed-graphql-service-with-real-time-data-and-offline-programming/&quot;&gt;bejelentette&lt;/a&gt;, hogy ők is “beszállnak a GraphQL-be”. AWS AppSync szolgáltatásuk konkurenciát jelenthet valamennyi jelenlegi GraphQL BaaS számára. Főleg azért, mert az Amazon-nál rengeteg a tapasztalt, jól képzett fejlesztő, akik segítségével igen hamar behozható a cég lemaradása a GraphQL területén. Másrészt, ha az AppSync integrálódik a meglévő Amazon szolgáltatásaikba, akkor ez is döntési pont lehet egy fejlesztőcsapat számára, hogy a már amúgy is használt és ismert szolgáltatót választják a kisebb, start-up hangulatú BaaS-ekkel szemben.&lt;/p&gt;
&lt;p&gt;Az AWS AppSync jelenleg még kipróbálási szakaszban van, igényelni kell hozzáférést. Mivel ez a bankkártya adatok megadásával jár, én ezt egyelőre nem tettem meg.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Gitlab CI beállítás Rails projekthez]]></title><description><![CDATA[GitHub helyett a hobbiprojektekhez inkább a GitLab-ot használom. Többek között azért, mert ingyen lehet benne private repository-kat…]]></description><link>https://nandito.hu/2016-05-03-gitlab-ci-beallitas-rails-projekthez/</link><guid isPermaLink="false">https://nandito.hu/2016-05-03-gitlab-ci-beallitas-rails-projekthez/</guid><pubDate>Tue, 03 May 2016 21:07:39 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://github.com/&quot;&gt;GitHub&lt;/a&gt; helyett a hobbiprojektekhez inkább a &lt;a href=&quot;https://gitlab.com/&quot;&gt;GitLab&lt;/a&gt;-ot használom. Többek között azért, mert ingyen lehet benne private repository-kat létrehozni (Github-on azt hiszem, 1 ilyen lehet ingyen). Másrészt számomra kényelmesebb a használata, a felülete jobban tetszik. Egyik újítás, hogy 2016. április közepe óta a GitLab összefogott a DigitalOcean-nal és lehetőséget adnak arra, hogy ingyenesen futtassunk job-okat a GitLab CI keretein belül.&lt;/p&gt;
&lt;p&gt;A folyamat úgy néz ki, hogy GitLab-ra push-olt kód egy Runner-en lefut és a futás eredménye megjelenik a GitLab-on. A Runner-ek azok a környezet, melyeken a buildelés / futtatás történik. Ilyne Runner-t lehet futtatni egy helyi Docker konténerben is, de a DigitalOcean a nép rendelkezésére bocsát néhány úgynevezett “Shared Runner”-t, melyet lehet használni bátran.&lt;/p&gt;
&lt;h3&gt;Mire jó ez?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Automata tesztek futtatására&lt;/li&gt;
&lt;li&gt;Deploy-álásra például sikeres futás esetén egy adott production környezetre&lt;/li&gt;
&lt;li&gt;Kódminőség ellenőrzésre&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A fentieken kívül és túl használható egyéb olyan építésekhez, melyeket úgy általában a CI rendszereken szoktak végezni. A példa projektben az automata tesztek futtatása és kódminőség ellenőrzése lesz történik a GitLab-on keresztül DigitalOcean Runner-ben.&lt;/p&gt;
&lt;h3&gt;Projekt részletek&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Ruby 2.2.3-p173&lt;/li&gt;
&lt;li&gt;Rails 4.2.6&lt;/li&gt;
&lt;li&gt;JavaScript Runtime: Node.js (V8)&lt;/li&gt;
&lt;li&gt;Database: PostgreSQL&lt;/li&gt;
&lt;li&gt;Kódminőség ellenőrzés: Rubocop&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;CI konfigurálása&lt;/h3&gt;
&lt;p&gt;Először a projekt gyökérkönyvtárában létre kell hozni egy gitlab-ci konfigurációs fájlt: &lt;code class=&quot;language-text&quot;&gt;.gitlab-ci.yml&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Ebben a fájlban definiáljuk, hogy miket szeretnénk futtatni milyen job-ok keretein belül.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yml&quot;&gt;&lt;pre class=&quot;language-yml&quot;&gt;&lt;code class=&quot;language-yml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ruby&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2.2&lt;/span&gt;

&lt;span class=&quot;token key atrule&quot;&gt;services&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; postgres&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;9.3&lt;/span&gt;

&lt;span class=&quot;token key atrule&quot;&gt;variables&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;# Configure postgres service (https://hub.docker.com/_/postgres/)&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;POSTGRES_DB&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; custom_db
  &lt;span class=&quot;token key atrule&quot;&gt;POSTGRES_USER&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; custom_user
  &lt;span class=&quot;token key atrule&quot;&gt;POSTGRES_PASSWORD&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; custom_pass
  
&lt;span class=&quot;token key atrule&quot;&gt;before_script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; apt&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;get update &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;qq &lt;span class=&quot;token important&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;get install &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;y &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;qq nodejs
  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; bundle install

&lt;span class=&quot;token key atrule&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; bundle exec rake db&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;drop RAILS_ENV=gitlabci
  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; bundle exec rake db&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;create RAILS_ENV=gitlabci
  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; bundle exec rake db&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;migrate RAILS_ENV=gitlabci
  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; bundle exec rake test RAILS_ENV=gitlabci

&lt;span class=&quot;token key atrule&quot;&gt;rubocop&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; bundle exec rubocop&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Az &lt;strong&gt;image&lt;/strong&gt; résznél definiáljuk, hogy milyen környezetben szeretnénk futtatni a job-okat. Ez job szinten is megadható, jelenesetben globálisan értendő. A &lt;strong&gt;services&lt;/strong&gt;-en belül olyan szolgáltatást listázhatunk, melyet a futtatások során használni szeretnénk. Jelenleg ez egy &lt;em&gt;postgres&lt;/em&gt;-t tartalmaz: ilyenkor egy postgres konténer is elindul, melynek a tesztadatbázisa a &lt;strong&gt;variables&lt;/strong&gt;-ben megadott változókkal érhetők el. A &lt;strong&gt;before_script&lt;/strong&gt; az összes job előtt lefut. A &lt;strong&gt;test&lt;/strong&gt; és &lt;strong&gt;rubocop&lt;/strong&gt; egy-egy job-ot jelöl, ez a nevük. Ezeken belül a &lt;strong&gt;script&lt;/strong&gt; alatt kell definiálni az egyes lépéseket, melyek a job keretein belül futtatandók - ezek a parancssorban is megadható utasítások:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# JavaScript runtime telepítése&lt;/span&gt;
$ &lt;span class=&quot;token function&quot;&gt;apt-get&lt;/span&gt; update &lt;span class=&quot;token parameter variable&quot;&gt;-qq&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt-get&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-y&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-qq&lt;/span&gt; nodejs
&lt;span class=&quot;token comment&quot;&gt;# projekt telepítése, szükséges dependenciák letöltése&lt;/span&gt;
$ bundle &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# korábbi custom_db tábla tartalmának eldobása&lt;/span&gt;
$ bundle &lt;span class=&quot;token builtin class-name&quot;&gt;exec&lt;/span&gt; rake db:drop &lt;span class=&quot;token assign-left variable&quot;&gt;RAILS_ENV&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;gitlabci
&lt;span class=&quot;token comment&quot;&gt;# tábla létrehozása újból és a szükséges migrációk futtatása&lt;/span&gt;
$ bundle &lt;span class=&quot;token builtin class-name&quot;&gt;exec&lt;/span&gt; rake db:create &lt;span class=&quot;token assign-left variable&quot;&gt;RAILS_ENV&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;gitlabci_ és _bundle &lt;span class=&quot;token builtin class-name&quot;&gt;exec&lt;/span&gt; rake db:migrate &lt;span class=&quot;token assign-left variable&quot;&gt;RAILS_ENV&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;gitlabci
&lt;span class=&quot;token comment&quot;&gt;# tesztek futtatása&lt;/span&gt;
$ bundle &lt;span class=&quot;token builtin class-name&quot;&gt;exec&lt;/span&gt; rake &lt;span class=&quot;token builtin class-name&quot;&gt;test&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;RAILS_ENV&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;gitlabci
&lt;span class=&quot;token comment&quot;&gt;# kódminőség-ellenőrzés futtatása&lt;/span&gt;
$ bundle &lt;span class=&quot;token builtin class-name&quot;&gt;exec&lt;/span&gt; rubocop&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;CI-specifikus környezet definiálása&lt;/h3&gt;
&lt;p&gt;A fenti részben feltűnhet, hogy az egyes utasítások mögött szerepel a &lt;code class=&quot;language-text&quot;&gt;RAILS_ENV=gitlabci&lt;/code&gt; argumentum. Erre az adatbázis-kapcsolat és a környezettől függő &lt;em&gt;Gemfile&lt;/em&gt; group miatt van szükség, mivel ugyanúgy szeretném megőrizni a fejlesztői környezethez és a helyi tesztfuttatáshoz használt, helyi Docker konténerben futó PostgreSQL beállításokat.&lt;/p&gt;
&lt;p&gt;Új környezet létrehozásának lépései:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;config/environments&lt;/code&gt; mappában &lt;code class=&quot;language-text&quot;&gt;test.rb&lt;/code&gt; duplikálása &lt;code class=&quot;language-text&quot;&gt;gitlabci.rb&lt;/code&gt; néven&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;config/database.yml&lt;/code&gt; fájlhoz &lt;code class=&quot;language-text&quot;&gt;gitlabci&lt;/code&gt; beállítások hozzáadása&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;Gemfile&lt;/code&gt;-ban csoportok frissítése&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;A &lt;code class=&quot;language-text&quot;&gt;.gitlab-ci.yml&lt;/code&gt; fájlban megadottaknak megfelelően a &lt;code class=&quot;language-text&quot;&gt;database.yml&lt;/code&gt;-ben a &lt;code class=&quot;language-text&quot;&gt;gitlabci&lt;/code&gt; beállítások:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yml&quot;&gt;&lt;pre class=&quot;language-yml&quot;&gt;&lt;code class=&quot;language-yml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;gitlabci&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;adapter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; postgresql
  &lt;span class=&quot;token key atrule&quot;&gt;encoding&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; unicode
  &lt;span class=&quot;token key atrule&quot;&gt;pool&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;host&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; postgres
  &lt;span class=&quot;token key atrule&quot;&gt;username&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; custom_user
  &lt;span class=&quot;token key atrule&quot;&gt;password&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; custom_pass
  &lt;span class=&quot;token key atrule&quot;&gt;database&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; custom_db&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Esetemben a &lt;code class=&quot;language-text&quot;&gt;Gemfile&lt;/code&gt;-ben az alábbiak módosultak:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;gemfile&quot;&gt;&lt;pre class=&quot;language-gemfile&quot;&gt;&lt;code class=&quot;language-gemfile&quot;&gt;group :test, :gitlabci do
  # Mock API with webmock
  gem &amp;#39;webmock&amp;#39;
  # Test framework
  gem &amp;#39;rspec&amp;#39;
end

group :development, :gitlabci do
  # Static code analyzer
  gem &amp;#39;rubocop&amp;#39;, require: false
end&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;A &lt;strong&gt;webmock&lt;/strong&gt;-ot és &lt;strong&gt;rspec&lt;/strong&gt;-et csak a &lt;strong&gt;test&lt;/strong&gt; és &lt;strong&gt;gitlabci&lt;/strong&gt; környezeteken használom, mivel ezekben történik a tesztek futtatása. Ezzel szemben a &lt;strong&gt;rubocop&lt;/strong&gt;-ot csak &lt;strong&gt;development&lt;/strong&gt; és &lt;strong&gt;gitlabci&lt;/strong&gt; környezeteken futtatom, így a &lt;strong&gt;test&lt;/strong&gt; környezeten a &lt;code class=&quot;language-text&quot;&gt;bundle install&lt;/code&gt; idejét nem növelem feleslegesen ennek függőségnek a telepítésével.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Megjegyzés:&lt;/strong&gt; másik elterjedt módszer, hogy egy másik, CI adatbázisadatokat leíró &lt;code class=&quot;language-text&quot;&gt;database.yml&lt;/code&gt; fájlt is létrehoznak, melyet &lt;code class=&quot;language-text&quot;&gt;copy&lt;/code&gt; paranccsal a CI környezetben aktiválnak oly módon, hogy felülírják vele az eredeti &lt;code class=&quot;language-text&quot;&gt;database.yml&lt;/code&gt;-t.&lt;/p&gt;
&lt;p&gt;További információk, felhasznált irodalom:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://gitlab.com/help/ci/quick_start/README.md&quot;&gt;https://gitlab.com/help/ci/quick_start/README.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://doc.gitlab.com/ce/ci/examples/test-and-deploy-ruby-application-to-heroku.html&quot;&gt;http://doc.gitlab.com/ce/ci/examples/test-and-deploy-ruby-application-to-heroku.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Légkondi készítése házilag]]></title><description><![CDATA[Mikor nagyon melegem volt a lakásban, egyszer csak beírtam a Google-be, hogy “DIY air condition” és a találatok között erre alapozva én is…]]></description><link>https://nandito.hu/2015-08-09-legkondi-keszitese-hazilag/</link><guid isPermaLink="false">https://nandito.hu/2015-08-09-legkondi-keszitese-hazilag/</guid><pubDate>Sun, 09 Aug 2015 10:28:59 GMT</pubDate><content:encoded>&lt;p&gt;Mikor nagyon melegem volt a lakásban, egyszer csak beírtam a Google-be, hogy “DIY air condition” és a találatok között &lt;a href=&quot;https://www.youtube.com/watch?v=FaC0dlRENk0&quot;&gt;erre&lt;/a&gt; alapozva én is elkészítettem a sajátomat.&lt;/p&gt;
&lt;h3&gt;Nem igazi hűtés ez.&lt;/h3&gt;
&lt;p&gt;Azért nem, mert a “hideg energiát” tároló jégakkut a lakásban lévő hűtőben “töltöm fel”. Így a hűtés során a hűtő hátul melegít - és a nem 100%-os hatásfok miatt még több energiát használ el a hűtés során, mint amennyit a jégakku nyer. Ezzel szemben a beszerelt légkondik a kinti egységük által az előállítás során a meleget a lakásból kifelé nyomják, a hideget pedig befelé. Akkor mire jó mégis ez? Lokális hűtésre, afféle “tűzoltásra”. A hűtő a lakás egyik pontján van, én pedig egy másik pontján ülök vagy fekszek. Ez a kis doboz szállítható, oda teszem, ahová épp a hűvös levegőt szeretném. Azért jobb, mint egy sima ventilátor, mert míg az a meleg levegőt keringeti, ez a jégakku által hűtött levegőt fújja.&lt;/p&gt;
&lt;h3&gt;Hozzávalók:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Hungarocell doboz&lt;/li&gt;
&lt;li&gt;Processzor hűtő (pl egy régóta használaton kívüli)&lt;/li&gt;
&lt;li&gt;Telefontöltő (régi telefoné vagy olyan, aminek a telefon felőli csatlakozója sérült)&lt;/li&gt;
&lt;li&gt;Jégakku vagy jégkocka&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Elkészítés:&lt;/h3&gt;
&lt;p&gt;Első lépésként nézzük meg, hogy működik-e a ventilátor az adapterrel. Én egy régi, 12V-os Intel hűtőt találtam, meg egy utángyártott, kontakt hibás 5V-os telefontöltőt. A töltőről a microUSB csatlakozót levágva hozzáérintettem a CPU csatlakozásához és pörög is. Nyilván lassabban, de átmeneti megoldásnak jó lesz.&lt;/p&gt;
&lt;p&gt;Tervezzük meg, hogy hová vágjuk a lyukakat. Én a doboz tetejére vágtam a ventilátornak nyílást, a doboz oldalára pedig a kiáramló levegőnek. A ventilátor helyét egyszerűen úgy jelöltem, hogy rátettem és filctollal körberajzoltam. A lehetőségekhez mérten érdemes inkább belső íven rajzolni, mert a vágás során 1-2 mm vastagságú vágás során nagyobb lehet a lyuk, mint tervezzük. Ilyenkor a ventilátor beleesik a dobozba, az pedig úgy nem hatékony.&lt;/p&gt;
&lt;p&gt;A doboz oldalára a lyukat körzőbe befogott filctollal rajzoltam, de egy pénzérme vagy pohár körberajzolása által is elérhető ugyanaz az eredmény. Láttam olyat, hogy kályhacső könyökidomot épített be valaki egy ilyenbe. Eredetileg én is terveztem, de túl drágának és nagynak találtam azokat ahhoz a dobozhoz, amit én használok, így beérem sima lyukakkal.&lt;/p&gt;
&lt;p&gt;A vágást legtöbbször késsel vagy fűrészlappal csinálják, engem ennek a hangjától a hideg ráz. Édesapám javaslatára egy felforrósított szeggel oldottam ezt meg. Úgy szalad a hungarocellben a forró szeg, mint a meleg kés a vajban. Gyorsan és szépen lehet így alakzatokat kivágni.&lt;/p&gt;
&lt;p&gt;Annyit tettem még, hogy a telefontöltő levágott végén a rézszálakat bevontam ónnal egy forrasztópáka segítségével, hogy könnyebben bedughassam a CPU ventilátor hűtőjébe. Akár le is lehet vágni a CPU hűtő csatlakozóját és hozzáforrasztani a tápvezetéket. Én ezt azért nem tettem meg, mert egyrészt így a CPU hűtő bármikor visszaszerelhető egy PC-be - bár nem hiszem, hogy erre sor kerül valaha is -, másrészt tervezem egy 12V-os adapter beszerzését, amivel majd gyorsabban pöröghet a ventilátor.&lt;/p&gt;
&lt;p&gt;A “rendszer” skálázható, mehet bele több jég vagy jégakku, lehet befogni több ventilátort, vágni több lyukat a kiáramló levegőnek. Nekem a következő lépésben annyi a tervem, hogy az adaptert 12V-osra cserélem és szabályozhatóvá teszem a fordulatot.&lt;/p&gt;
&lt;h3&gt;Eredmény:&lt;/h3&gt;
&lt;p&gt;Bemegy a meleg, kijön a hideg.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Rails lista/grid nézet kapcsolás]]></title><description><![CDATA[Hasznos és gyakori az olyan kapcsolók használata a weboldalakon, melyekkel egy lista nézetét lehet állítani. Találtam egy egyszerű és gyors…]]></description><link>https://nandito.hu/2015-05-14-rails-listagrid-nezet-kapcsolas/</link><guid isPermaLink="false">https://nandito.hu/2015-05-14-rails-listagrid-nezet-kapcsolas/</guid><pubDate>Thu, 14 May 2015 21:05:33 GMT</pubDate><content:encoded>&lt;p&gt;Hasznos és gyakori az olyan kapcsolók használata a weboldalakon, melyekkel egy lista nézetét lehet állítani. Találtam egy egyszerű és gyors módot arra, hogy miképp lehet ezt egyszerűen kivitelezni Rails-ben.&lt;/p&gt;
&lt;p&gt;A példában egy videóadatbázis nézeteit lehet állítani: listanézetben a “hagyományos” generált scaffold elrendezés látható, grid nézetben pedig mondjuk csak a film borítóképe, címe, kategóriája és játékideje látszik, responsive módon.&lt;/p&gt;
&lt;h3&gt;Hozzávalók:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Controller (&lt;code class=&quot;language-text&quot;&gt;app/controllers/videos_controller.rb&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Index view (&lt;code class=&quot;language-text&quot;&gt;app/views/videos/index.html.erb&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Partial-ok a nézetekhez (&lt;code class=&quot;language-text&quot;&gt;app/views/videos/_grid_view.html.erb&lt;/code&gt; és &lt;code class=&quot;language-text&quot;&gt;app/views/videos/_list_view.html.erb&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Először készítsük el a partial-okat. Ezek a ”_“-al kezdődő fájlok, amiket &lt;code class=&quot;language-text&quot;&gt;&amp;lt;%= render &quot;név&quot; %&gt;&lt;/code&gt; módon illeszthetünk a view-ba.&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;app/views/videos/_grid_view.html.erb&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ruby&quot;&gt;&lt;pre class=&quot;language-ruby&quot;&gt;&lt;code class=&quot;language-ruby&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@videos&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;each&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;video&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;%&gt;
  &amp;lt;div class=&quot;col-md-6 col-lg-4 col-xl-3&quot;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;div &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;row extra-space-between-rows&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
      &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;div &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;col-md-4 col-lg-4&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
        &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%=&lt;/span&gt; image_tag&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;http://placekitten.com/140/140&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;:size&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;135x135&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;:class&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;img-rounded img-responsive&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;%&gt;
      &amp;lt;/div&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;div &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;col-md-8 col-lg-8&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
        &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;h5&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%=&lt;/span&gt; link_to video&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;title&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; video&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;%&gt;&amp;lt;/h5&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;i&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%=&lt;/span&gt; video&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;subject&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;%&gt;&amp;lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;br&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
        &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;strong&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;Release date&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;strong&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;i&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%=&lt;/span&gt; video&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;release_date&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;strftime&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;%Y. %m. %d.&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;%&gt;&amp;lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;br&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
        &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;strong&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;Length&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;strong&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;i&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%=&lt;/span&gt; video&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;strftime&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;%H hours %M minutes&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;%&gt;&amp;lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;br&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;

        &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%=&lt;/span&gt; link_to &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Edit&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; edit_video_path&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;video&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;:class&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;btn-xs btn-info&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;%&gt;
        &amp;lt;%= link_to &apos;Destroy&apos;, video, method: :delete, data: { confirm: &apos;Are you sure?&apos; }, :class =&gt;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;btn-xs btn-danger&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;%&gt;
      &amp;lt;/div&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;div&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;div&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;app/views/videos/_list_view.html.erb&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ruby&quot;&gt;&lt;pre class=&quot;language-ruby&quot;&gt;&lt;code class=&quot;language-ruby&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;table&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;thead&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;tr&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;th&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;Title&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;th&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;th&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;Company&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;th&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;th&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;Release date&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;th&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;th&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;Length&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;th&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;th&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;Description&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;th&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;th&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;Subject&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;th&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;th colspan&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;th&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;tr&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;thead&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;

  &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;tbody&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@videos&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;each&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;video&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;%&gt;
    &amp;lt;tr&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;td&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%=&lt;/span&gt; video&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;title &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;%&gt;&amp;lt;/td&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;td&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%=&lt;/span&gt; video&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;company_id &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;%&gt;&amp;lt;/td&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;td&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%=&lt;/span&gt; video&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;release_date &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;%&gt;&amp;lt;/td&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;td&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%=&lt;/span&gt; video&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;%&gt;&amp;lt;/td&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;td&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%=&lt;/span&gt; video&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;description &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;%&gt;&amp;lt;/td&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;td&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%=&lt;/span&gt; video&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;subject_id &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;%&gt;&amp;lt;/td&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;td&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%=&lt;/span&gt; link_to &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Show&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; video &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;%&gt;&amp;lt;/td&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;td&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%=&lt;/span&gt; link_to &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Edit&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; edit_video_path&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;video&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;%&gt;&amp;lt;/td&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;td&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%=&lt;/span&gt; link_to &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Destroy&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; video&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;:delete&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;confirm&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Are you sure?&apos;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;%&gt;&amp;lt;/td&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;tr&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;%&gt;
  &amp;lt;/tbody&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;table&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Következő lépésben a controller-t felkészítjük arra, hogy mi nézetet váltunk néha. Ehhez bevezetünk egy új paramétert. Az ”||” után pedig a default értéket adjuk meg (ha esetleg nem lenne paraméter, akkor se dőljön össze a rendszer). (&lt;code class=&quot;language-text&quot;&gt;app/controllers/videos_controller.rb&lt;/code&gt;)&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ruby&quot;&gt;&lt;pre class=&quot;language-ruby&quot;&gt;&lt;code class=&quot;language-ruby&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token method-definition&quot;&gt;&lt;span class=&quot;token function&quot;&gt;index&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token variable&quot;&gt;@videos&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Video&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;all
  &lt;span class=&quot;token variable&quot;&gt;@partial&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; params&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:view&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;grid_view&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Végül az &lt;code class=&quot;language-text&quot;&gt;index.html.erb&lt;/code&gt;-ban végzünk pár módosítást. Betesszük a kívánt helyre a renderelést:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ruby&quot;&gt;&lt;pre class=&quot;language-ruby&quot;&gt;&lt;code class=&quot;language-ruby&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;div &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;row&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%=&lt;/span&gt; render &lt;span class=&quot;token variable&quot;&gt;@partial&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;%&gt;
&amp;lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;És a linkeket vagy button-okat, amikkel állítjuk a nézetet.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ruby&quot;&gt;&lt;pre class=&quot;language-ruby&quot;&gt;&lt;code class=&quot;language-ruby&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;div &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;btn-group&quot;&lt;/span&gt;&lt;/span&gt; role&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;group&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;button type&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;button&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;btn btn-default dropdown-toggle&quot;&lt;/span&gt;&lt;/span&gt; data&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;toggle&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;dropdown&quot;&lt;/span&gt;&lt;/span&gt; aria&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;expanded&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;false&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
    View
    &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;span &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;caret&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;span&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;button&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;ul &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;dropdown-menu&quot;&lt;/span&gt;&lt;/span&gt; role&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;menu&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%=&lt;/span&gt; link_to &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Grid&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; videos_path&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;view&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;grid_view&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;%&gt;&amp;lt;/li&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%=&lt;/span&gt; link_to &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;List&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; videos_path&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;view&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;list_view&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;%&gt;&amp;lt;/li&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;ul&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;div&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[Lapozás Rails-ben Kaminari-val]]></title><description><![CDATA[Ha egy lista túl sok elemet tartalmaz, érdemes lapozással kisebb szeletekre vágni a megjelenített tartalmat. Ennek több előnye is van,…]]></description><link>https://nandito.hu/2015-04-12-lapozas-rails-ben-kaminari-val/</link><guid isPermaLink="false">https://nandito.hu/2015-04-12-lapozas-rails-ben-kaminari-val/</guid><pubDate>Sun, 12 Apr 2015 10:17:34 GMT</pubDate><content:encoded>&lt;p&gt;Ha egy lista túl sok elemet tartalmaz, érdemes lapozással kisebb szeletekre vágni a megjelenített tartalmat. Ennek több előnye is van, például: kicsit kímélhetjük az adatbázist, rövidíthetjük az oldalbetöltés idejét, stb. A kaminari gem lehetővé teszi, hogy ezt roppant egyszerűen megoldjuk.&lt;/p&gt;
&lt;p&gt;Adjuk hát hozzá a Rails projektünk Gemfile-jához a kaminarit, majd telepítsük is azt bundler-rel.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;gem &apos;kaminari&apos;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;bundle &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Generáljuk a szükséges konfigurációs fájlokat:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;rails generate kaminari:config&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Állítsuk be az alapértelmezett oldalméretet abban a model-ben, aminek a elemeit listázzuk. Ha például egy blog post-jait szeretnénk oldalanként megjeleníteni, akkor az &lt;code class=&quot;language-text&quot;&gt;app/models/post.rb&lt;/code&gt;-ba írjuk bele ezt:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ruby&quot;&gt;&lt;pre class=&quot;language-ruby&quot;&gt;&lt;code class=&quot;language-ruby&quot;&gt;paginates_per &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ez elintézi nekünk, hogy oldalanként 10 post jelenjen meg. (Persze ha 15-öt szeretnénk oldalanként, akkor 10 helyett 15-öt kell írnunk).&lt;/p&gt;
&lt;p&gt;Következő lépésként a controller-ben kell módosítanunk a listázást. Ez esetünkben az &lt;code class=&quot;language-text&quot;&gt;app/controller/posts_controller.rb&lt;/code&gt; fájl, melynek az index method-ját módosítjuk:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ruby&quot;&gt;&lt;pre class=&quot;language-ruby&quot;&gt;&lt;code class=&quot;language-ruby&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Ezt egészítsük ki&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token method-definition&quot;&gt;&lt;span class=&quot;token function&quot;&gt;index&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token variable&quot;&gt;@posts&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Post&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;all
&lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Erre&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token method-definition&quot;&gt;&lt;span class=&quot;token function&quot;&gt;index&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token variable&quot;&gt;@posts&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Post&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;order&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:created_at&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;page&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;params&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:page&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Végül a view-ban jelenítsük meg a lapozót, ahol szeretnénk. Ezt a példában az &lt;em&gt;app/views/posts/index.html.erb&lt;/em&gt; fájlban az alábbi módon tehetjük meg:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ruby&quot;&gt;&lt;pre class=&quot;language-ruby&quot;&gt;&lt;code class=&quot;language-ruby&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%=&lt;/span&gt; paginate &lt;span class=&quot;token variable&quot;&gt;@posts&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ezzel meg is volnánk, az oldalon megjelenik a lapozó!&lt;/p&gt;
&lt;p&gt;Részletesebb leírás és sok példa elérhető Github-on: &lt;a href=&quot;https://github.com/amatsuda/kaminari&quot;&gt;amatsuda/kaminari&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Keresőbarát URL-ek Rails-ben]]></title><description><![CDATA[Van egy nagyon tuti gem, ami hozzásegít ahhoz, hogy az URL-ben számok helyett szöveg jelenjen meg. Például: www.example.com/posts/2 helyett…]]></description><link>https://nandito.hu/2015-03-18-keresobarat-url-ek-rails-ben/</link><guid isPermaLink="false">https://nandito.hu/2015-03-18-keresobarat-url-ek-rails-ben/</guid><pubDate>Wed, 18 Mar 2015 21:47:42 GMT</pubDate><content:encoded>&lt;p&gt;Van egy nagyon tuti gem, ami hozzásegít ahhoz, hogy az URL-ben számok helyett szöveg jelenjen meg. Például: &lt;em&gt;&lt;a href=&quot;http://www.example.com/posts/2&quot;&gt;www.example.com/posts/2&lt;/a&gt;&lt;/em&gt; helyett &lt;em&gt;&lt;a href=&quot;http://www.example.com/posts/super-post&quot;&gt;www.example.com/posts/super-post&lt;/a&gt;&lt;/em&gt;. Ez azért is jó, mert a keresők jobban szeretik az ilyet - így akár előrébb is kerülhet az oldal a találati listákban. Másrészt, ha könyvjelzőkhöz adja egy felhasználó, vagy bemásolja valahová (például e-mailbe) a címet, akkor sokkal beszédesebb az URL-ben a bejegyzés címe, mintha csak egy ID-t tartalmazna.&lt;/p&gt;
&lt;p&gt;A gem neve &lt;strong&gt;friendly_id&lt;/strong&gt;. A dokumentációja &lt;a href=&quot;http://norman.github.io/friendly_id/file.Guide.html&quot;&gt;itt&lt;/a&gt; található, a github oldala pedig &lt;a href=&quot;https://github.com/norman/friendly_id&quot;&gt;itt&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A parancssorba/terminálba beírva telepíthetjük a legfrissebb verziót. Rails 4-hez legalább 5.0.0 kell. Nekem ma 5.1.0-t telepített. Pipa.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;gem &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; friendly_id&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Telepítés után adjuk hozzá az aktuális projektünk &lt;em&gt;Gemfile&lt;/em&gt;-jához a friendly_id-t:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;gem &apos;friendly_id&apos;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Majd futtassunk parancssorban egy bundle-t, hogy települjön szépen:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;bundle &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Következő lépésként a már meglévő táblánkhoz - amelyikből jelenleg ID-t mutatunk URL-ben - adjunk hozzá egy új oszlopot. Ezt - ahogy &lt;a href=&quot;/2015-03-14-oszlop-hozzaadasa-tablahoz-vagy-oszlop-torlese-tablabol-rails-ben/&quot;&gt;korábban bővebben leírtam&lt;/a&gt; - az alábbi módon tehetjük meg:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;rails generate migration add_slug_to_posts slug:string&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Hajtsuk végre a migrációt, parancssorba írjuk:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;rake db:migrate&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ezután a model-ben kell megadnunk, hogy melyik oszlop tartalma jelenjen meg ID helyett az URL-ben. Jelenlegi példában a bejegyzés címét (title) adjuk meg (&lt;em&gt;app/models/post.rb&lt;/em&gt;):&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ruby&quot;&gt;&lt;pre class=&quot;language-ruby&quot;&gt;&lt;code class=&quot;language-ruby&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;extend&lt;/span&gt; FriendlyId
  friendly_id &lt;span class=&quot;token symbol&quot;&gt;:title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;:slugged&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Így már az újonnan létrehozott bejegyzéseknek az URL-jében a cím jelenik meg. Ahhoz, hogy ezt meg is tudjuk nyitni, szükséges némiképp módosítani is az &lt;code class=&quot;language-text&quot;&gt;app/controllers/posts_controller.rb&lt;/code&gt;-t. A &lt;code class=&quot;language-text&quot;&gt;private&lt;/code&gt; method-ok között módosítanunk kell, hogy ne közvetlenül használja a title-t ID-ként, mert úgy sosem találja meg.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ruby&quot;&gt;&lt;pre class=&quot;language-ruby&quot;&gt;&lt;code class=&quot;language-ruby&quot;&gt;  &lt;span class=&quot;token comment&quot;&gt;# ezt egészítsük ki:&lt;/span&gt;
  &lt;span class=&quot;token variable&quot;&gt;@post&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Post&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;find&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;params&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:id&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  
  &lt;span class=&quot;token comment&quot;&gt;# erre:&lt;/span&gt;
  &lt;span class=&quot;token variable&quot;&gt;@post&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Post&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;friendly&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;find&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;params&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:id&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Figyelni érdemes arra is, hogy akár több bejegyzés is lehet azonos címmel. Ennek kezelése érdekében kapcsoljuk be a history-t a slug-okra. Ehhez annyi kell, hogy generálunk egy új migrációt és futtatjuk:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;rails generate friendly_id
rake db:migrate&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Bónusz&lt;/strong&gt;: amennyiben vannak már korábbi bejegyzéseink, melyeknek az URL-je még nem szép, akkor &lt;em&gt;rails console&lt;/em&gt;-ban átalakíthatjuk őket. Lépjünk be tehát a konzolba:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;rails console&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;És frissítsük a bejegyzéseket:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ruby&quot;&gt;&lt;pre class=&quot;language-ruby&quot;&gt;&lt;code class=&quot;language-ruby&quot;&gt;  irb&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;main&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;001&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; Post&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;find_each&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:save&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[Autentikáció Rails-ben Devise gem-mel]]></title><description><![CDATA[A Devise gem lehetőséget nyújt arra, hogy Rails alkalmazásunk bizonyos funkció egyszerűen és profin védve legyenek - csak regisztrációt és…]]></description><link>https://nandito.hu/2015-03-16-autentikacio-rails-ben-devise-gem-mel/</link><guid isPermaLink="false">https://nandito.hu/2015-03-16-autentikacio-rails-ben-devise-gem-mel/</guid><pubDate>Mon, 16 Mar 2015 20:53:24 GMT</pubDate><content:encoded>&lt;p&gt;A Devise gem lehetőséget nyújt arra, hogy Rails alkalmazásunk bizonyos funkció egyszerűen és profin védve legyenek - csak regisztrációt és bejelentkezést követően legyenek elérhetők.&lt;/p&gt;
&lt;h3&gt;Telepítés&lt;/h3&gt;
&lt;p&gt;Hozzáadjuk a &lt;code class=&quot;language-text&quot;&gt;Gemfile&lt;/code&gt;-hoz a Devise-t:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;gem &apos;devise&apos;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Futtatunk egy bundle telepítést parancssorban:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;bundle &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Generálunk egy alap konfigurációt az alkalmazáshoz:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;rails generate devise:install&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Következő lépésként létrehozzuk a User model-t:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;rails generate devise user&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ez a &lt;code class=&quot;language-text&quot;&gt;config/routes.rb&lt;/code&gt; fájlba is beírja, hogy van ilyen devise dolog.&lt;/p&gt;
&lt;h3&gt;Védelem a controller-ben&lt;/h3&gt;
&lt;p&gt;Következő lépésként beállíthatjuk, hogy melyik controller-nek melyik method-jait akarjuk autentikációhoz kötni. Íme egy példa (&lt;code class=&quot;language-text&quot;&gt;app/controllers/testcases_controller.rb&lt;/code&gt;)&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ruby&quot;&gt;&lt;pre class=&quot;language-ruby&quot;&gt;&lt;code class=&quot;language-ruby&quot;&gt;before_filter &lt;span class=&quot;token symbol&quot;&gt;:authenticate_user!&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;only&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token symbol&quot;&gt;:new&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;:edit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;:create&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;:update&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;:destroy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;A fenti példában a szögletes zárójelben felsoroltak lesznek bejelentkezéshez kötve. Tehát a _CRUD-_ból (Create Read Update Destroy) az &lt;em&gt;R&lt;/em&gt; kivételével minden (tehát csak megtekinteni lehet anélkül, hogy bejelentkeznénk).&lt;/p&gt;
&lt;h3&gt;Védelem a view-ban&lt;/h3&gt;
&lt;p&gt;A view-okban is beállíthatjuk, hogy egyes elemek csak akkor jelenjenek meg, ha bejelentkezett a kedves felhasználó. Például az &lt;em&gt;app/views/testcases/index.html.erb&lt;/em&gt; fájlban:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ruby&quot;&gt;&lt;pre class=&quot;language-ruby&quot;&gt;&lt;code class=&quot;language-ruby&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; user_signed_in&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;%&gt;
  &amp;lt;%= link_to &apos;Edit&apos;, edit_testcase_path(testcase)  %&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%=&lt;/span&gt; link_to &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Delete&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; testcase&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;:delete&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;confirm&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Are you sure?&apos;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;%&gt;
&amp;lt;% end %&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Így a szerkesztés és törlés gombok bejelentkezés nélkül nem is lesznek láthatóak.&lt;/p&gt;
&lt;h3&gt;További információ a Devise-ról&lt;/h3&gt;
&lt;p&gt;Getting started GitHub-on: &lt;a href=&quot;https://github.com/plataformatec/devise#getting-started&quot;&gt;https://github.com/plataformatec/devise#getting-started&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Rubydoc dokumentáció: &lt;a href=&quot;http://www.rubydoc.info/github/plataformatec/devise/&quot;&gt;http://www.rubydoc.info/github/plataformatec/devise/&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Oszlop hozzáadása táblához vagy oszlop törlése táblából Rails-ben]]></title><description><![CDATA[Gyakran járok úgy, hogy utólag hozzá kell adni egy Rails alkalmazás adatbázisának valamelyik táblájához még egy oszlopot - vagy módosítani…]]></description><link>https://nandito.hu/2015-03-14-oszlop-hozzaadasa-tablahoz-vagy-oszlop-torlese-tablabol-rails-ben/</link><guid isPermaLink="false">https://nandito.hu/2015-03-14-oszlop-hozzaadasa-tablahoz-vagy-oszlop-torlese-tablabol-rails-ben/</guid><pubDate>Sat, 14 Mar 2015 20:24:41 GMT</pubDate><content:encoded>&lt;p&gt;Gyakran járok úgy, hogy utólag hozzá kell adni egy Rails alkalmazás adatbázisának valamelyik táblájához még egy oszlopot - vagy módosítani, törölni kell egy már meglévőt. Lássuk, mik a lehetőségek.&lt;/p&gt;
&lt;p&gt;A Rails alkalmazás mappájába navigálva parancssorba írom ezt:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;rails generate migration add_coolfields_to_tablename fieldname:string otherfield:string&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Az &lt;code class=&quot;language-text&quot;&gt;add_&lt;/code&gt; utáni szó (fenti példában &lt;code class=&quot;language-text&quot;&gt;_coolfields_&lt;/code&gt;)a migration-t nevezi el tapasztalatom szerint, túl sok jelentősége nincs . A &lt;code class=&quot;language-text&quot;&gt;_to_&lt;/code&gt; utána szó (fenti példában &lt;code class=&quot;language-text&quot;&gt;_tablename_&lt;/code&gt;) viszont fontos, ez a tábla neve, ahová injektálni szeretnénk.&lt;/p&gt;
&lt;p&gt;Itt egy konkrétabb példa:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;rails generate migration add_contact_details_to_customers work_email:string private_email:string&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;CamelCase-t is használhatunk:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;rails generate migration AddContactDetailsToCustomers work_email:string private_email:string&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ennek hatására a projekt db/migrate mappájában születik egy új fájl &lt;code class=&quot;language-text&quot;&gt;[dátumidő]_addfieldname_to_tablename.rb&lt;/code&gt; néven. Azt, hogy eddig milyen nevű és típusú oszlopok vannak a táblában, azt a &lt;code class=&quot;language-text&quot;&gt;db/schema.rb&lt;/code&gt; fájlból szoktam kihalászni. Ott látszik, hogy a táblák neve többesszámban van, így emlékeztet arra, hogy a migráció létrehozásakor is azt használjak.&lt;/p&gt;
&lt;p&gt;Az oszlop törlése hasonlóképp működik, ott ez a varázsige:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;rails generate migration RemovePhoneFromCustomers phone:string&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Hogy az elvégzett módosítás életbe lépjen, szükséges egy migrációt futtatni az adatbázison, erre jó a következő parancs:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;rake db:migrate&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Vagy ha mondjuk csak a TEST környezethez belőtt adatbázison szeretnénk először:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;rake db:migrate &lt;span class=&quot;token assign-left variable&quot;&gt;RAILS_ENV&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;test&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Bővebb infó: &lt;a href=&quot;http://edgeguides.rubyonrails.org/active_record_migrations.html&quot;&gt;http://edgeguides.rubyonrails.org/active_record_migrations.html&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Ruby on Rails telepítése Windows 8-ra]]></title><description><![CDATA[Az Interneten hozzáférhető tutorial-ok alapján úgy tűnik, hogy Ruby on Rails alapú honlapokat kevesen fejlesztenek Windows rendszereken. Bár…]]></description><link>https://nandito.hu/2013-05-01-ruby-on-rails-telepitese-windows-8-ra/</link><guid isPermaLink="false">https://nandito.hu/2013-05-01-ruby-on-rails-telepitese-windows-8-ra/</guid><pubDate>Wed, 01 May 2013 10:24:07 GMT</pubDate><content:encoded>&lt;p&gt;Az Interneten hozzáférhető tutorial-ok alapján úgy tűnik, hogy Ruby on Rails alapú honlapokat kevesen fejlesztenek Windows rendszereken. Bár én is használok Ubuntu-t is, jobban szeretem a Windows-t. Elhatároztam, hogy feltelepítem most legfrissebb Ruby-t, Gem-t, Rails-t és hozzá MySQL-t a 64 bites Windows 8 rendszeremre. Mivel természetesen nem úsztam meg hibaüzenet nélkül, szükségesnek éreztem, hogy dokumentáljam az eseményt, hogy legközelebb ne kelljen annyit keresgélni a probléma oka és megoldása után.&lt;/p&gt;
&lt;h3&gt;1. lépés: Ruby telepítése&lt;/h3&gt;
&lt;p&gt;Windows-ra ez egész könnyen megy, a &lt;a href=&quot;http://rubyinstaller.org/&quot;&gt;http://rubyinstaller.org/&lt;/a&gt; website &lt;a href=&quot;http://rubyinstaller.org/downloads/&quot;&gt;letöltés&lt;/a&gt; oldaláról kiválasztottam a Ruby 2.0.0-p0 (x64)-t letöltöttem, majd gyakorlatilag “Next, Next, Next” módszerrel telepítettem, annyi a különbség, hogy a telepítés helyének kiválasztásánál kipipáltam, hogy rendelje a hozzá a .rb és .rbw fájlokat és hogy adja hozzá a Ruby-t a “PATH”-hoz.&lt;/p&gt;
&lt;p&gt;Telepítés után parancssorba beírva a ruby -v parancsot látható, hogy sikeres volt-e a telepítés, ugyanis ha igen, a telepített Ruby verziószámát kapjuk eredményül.&lt;/p&gt;
&lt;h3&gt;2. lépés: RubyGems telepítése&lt;/h3&gt;
&lt;p&gt;Ez a csomagkezelő, amit a Ruby használ. A Ruby-val együtt ez is fel lett telepítve, így ezt nem kell külön telepíteni. Egy frissítést érdemes ellenőrizni parancssorban: gem update —system&lt;/p&gt;
&lt;p&gt;Ha mégsem lenne telepítve valamiért, akkor a rubygems.org honlapról letölthető.&lt;/p&gt;
&lt;h3&gt;3. lépés: Rails telepítése&lt;/h3&gt;
&lt;p&gt;Mivel ez is egy gem, ezért telepítése egyszerűen, parancssorból történik: gem install rails&lt;/p&gt;
&lt;p&gt;Miután telepítettük, jócskán megnő a telepített gem-ek listája: gem list paranccsal ellenőrizhetjük, hogy ott van-e a Rails.&lt;/p&gt;
&lt;h3&gt;4. lépés: MySQL telepítése&lt;/h3&gt;
&lt;p&gt;Ezzel volt a legtöbb gond, de a végén jó lett.&lt;/p&gt;
&lt;p&gt;Először telepíteni kellett a MySQL Community Server-t, amit érdemes az .msi kiterjesztésű telepítővel végezni, ami elérhető: &lt;a href=&quot;http://dev.mysql.com/downloads/installer/&quot;&gt;http://dev.mysql.com/downloads/installer/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A telepítés során elég kiválasztani, hogy csak a Server-t telepítse, a többire nincs szükség most.&lt;/p&gt;
&lt;p&gt;Ezt követően a Ruby-hoz kell kapcsolni. Ehhez le kell tölteni egy C Connector-t a &lt;a href=&quot;http://dev.mysql.com/downloads/connector/c/&quot;&gt;MySQL honlapjáról&lt;/a&gt;, nekem a mysql-connector-c-noinstall-6.0.2-winx64.zip működött végül. Ezt ki kell csomagolni, majd parancssorba ezeket a sorokat írni:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;gem &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; mysql2 &lt;span class=&quot;token parameter variable&quot;&gt;--platform&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;ruby -- --with-mysql-include&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;D:&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;mysql-connector-c-noinstall-6.0.2-winx64&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;include --with-mysql-lib&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;D:&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;mysql-connector-c-noinstall-6.0.2-winx64&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;lib --with-mysql-dir&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;D:&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;mysql-connector-c-noinstall-6.0.2-winx64&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;A Connectort én a D: meghajtómra csomagoltam ki, így az elérési út nálam “D:\mysql-connector-c-noinstall-6.0.2-winx64”.&lt;/p&gt;
&lt;p&gt;Ha &lt;code class=&quot;language-text&quot;&gt;ERROR: Failed to build gem native extension.&lt;/code&gt;-t kapunk érdemes kipróbálni a 32 bites C Connector-t, van akinek azzal működik.&lt;/p&gt;
&lt;p&gt;Így más sikeresen összeállt a kép és a rendszer, lehet Windows 8-on is készíteni RoR rendszereket.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[12 reggeli dolog]]></title><description><![CDATA[Egy érdekes kutatás eredményét tette közzé a Business Insider. Több, mint 700 főt (17 és 79 év közötti embereket) kérdeztek meg az egészségi…]]></description><link>https://nandito.hu/2012-08-14-12-reggeli-dolog/</link><guid isPermaLink="false">https://nandito.hu/2012-08-14-12-reggeli-dolog/</guid><pubDate>Tue, 14 Aug 2012 20:08:53 GMT</pubDate><content:encoded>&lt;p&gt;Egy &lt;a href=&quot;https://www.businessinsider.com/12-things-killer-employees-do-before-noon-2012-8&quot;&gt;érdekes kutatás eredményét&lt;/a&gt; tette közzé a &lt;a href=&quot;https://www.businessinsider.com&quot;&gt;Business Insider&lt;/a&gt;. Több, mint 700 főt (17 és 79 év közötti embereket) kérdeztek meg az egészségi-, érzelmi állapotukról és arról, hogy melyik napszakot kedvelik. Kiderült, hogy a koránkelők vidámabbak, egészségesebbek és hatékonyabban dolgoznak, mint azok, akik “éjjeli baglyok” - vagyis az éjjel egy részét ébren töltik és inkább reggel alszanak tovább.&lt;/p&gt;
&lt;p&gt;A felmérés eredményeként 12 pontba gyűjtötték össze azokat a tevékenységeket, amelyet a sikeres emberek reggelente elvégeznek. Ezek a következők:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Mindig már előző nap elkészítik a következő napi teendők listáját&lt;/li&gt;
&lt;li&gt;Egész éjszaka alszanak&lt;/li&gt;
&lt;li&gt;Nem nyomogatják a “szundi” gombot&lt;/li&gt;
&lt;li&gt;Végeznek valamilyen testmozgást reggelente&lt;/li&gt;
&lt;li&gt;Rutinszerűen végzik a reggeli dolgaikat&lt;/li&gt;
&lt;li&gt;Reggeliznek&lt;/li&gt;
&lt;li&gt;Időben bemennek a munkahelyre&lt;/li&gt;
&lt;li&gt;Jelentkeznek a főnöküknél vagy a munkavállalóiknál (napi feladatok miatt)&lt;/li&gt;
&lt;li&gt;A nagy feladatokkal kezdenek először&lt;/li&gt;
&lt;li&gt;Kerülik a megbeszélések reggelre történő időzítését&lt;/li&gt;
&lt;li&gt;Szakítanak időt az levelek/üzenetek nyomon követésére&lt;/li&gt;
&lt;li&gt;Tartanak délelőtti szünetet&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;p&gt;Az eredeti szöveg a &lt;a href=&quot;https://www.usnews.com/&quot;&gt;U.S. News &amp;#x26; World Report&lt;/a&gt; tulajdona. A fenti fordítás nem teljes, a listából csak a címmondatokat emeltem át, a rövid magyarázatokat nem. Akit érdekelnek fenti pontok bővebben kifejtve, a &lt;a href=&quot;https://www.businessinsider.com/12-things-killer-employees-do-before-noon-2012-8&quot;&gt;Business Insider&lt;/a&gt; honlapján eredeti nyelven megtalálja. Az esetleges fordítási hibákért felelősséget nem vállalok.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Társasházi számladíj-csökkentés odafigyeléssel 2. rész]]></title><description><![CDATA[Az előző rész tartalmából: Lakásomban egy év alatt a gázszámla 5752 Ft-ról 4952-re, a villanyszámla 4136 Ft-ról 3715-re csökkent. A…]]></description><link>https://nandito.hu/2012-05-13-tarsashazi-szamladij-csokkentes-odafigyelessel-2-resz/</link><guid isPermaLink="false">https://nandito.hu/2012-05-13-tarsashazi-szamladij-csokkentes-odafigyelessel-2-resz/</guid><pubDate>Sun, 13 May 2012 17:33:37 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;Az előző rész tartalmából:&lt;/em&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Lakásomban egy év alatt a gázszámla 5752 Ft-ról 4952-re, a villanyszámla 4136 Ft-ról 3715-re csökkent. A vízfogyasztás is mérséklődött 10%-al.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Villanyáram&lt;/h2&gt;
&lt;p&gt;Az elektromos áramot az ELMŰ szolgáltatja 38.191 Ft/kWh áron (ebbe már beleszámoltam a rendszerhasználati alapdíjat is). Az optimalizáláshoz és méréshez egy boltban vásárolt fogyasztásmérőt használok. Ez mutatja a pillanatnyi- és az időszaki fogyasztást, illetve ha be van programozva, akkor az elhasznált áram árát is.&lt;/p&gt;
&lt;p&gt;Ezen a területen tudok a leghatékonyabban spórolni, bár a fogyasztásom nem szembetűnően kevesebb a nővéreméhez képest. Ez azért van, mivel többet vagyok otthon, és ilyenkor mindig van használatban néhány elektromos eszköz. Ilyen például a laptop, amihez kiterjesztésként egy 24”-os LED-es monitor van kötve, valamint az internethozzáférést biztosító router és modem. Ez utóbbi kettőt már nővérem is használta, azonban én - vele ellentétben - ha elmegyek otthonról, akkor egy billenőkapcsolóval leáramtalanítom a routert és modemet. Ezek nem nagy fogyasztású eszközök, a kettő együtt 12 W. Ez 0.458 Ft-ba kerül óránként. Egy nap átlagosan 12 órán át van áram alatt ez a két eszköz. Éves szinten számolva (0.458 (Ft) *12 (óra) *365 (nap)) legalább 2000 Ft-ot spórolok meg azzal, hogy leáramtalanítom ezt a két eszközt. Hasonló a helyzet a DVD lejátszó, TV és Hi-Fi esetében. Ez a 3 berendezés is egy billenőkapcsolós elosztóra van kötve, így csak akkor világít rajtuk a készenléti jel, ha a kapcsolót felkapcsolom. Ezeket az eszközöket naponta maximum 1 órát használom, így 23 órán át ki vannak kapcsolva. Mérésem szerint a készenléti állapotot visszajelző LED-ek és kijelzők a készülék kikapcsolt állapotában is összegezve 8W-ot fogyasztanak, ez óránként 0.305 Ft-ba kerül. Az előbbi számítási metódussal könnyen belátható, hogy a kapcsolgatásnak köszönhetően (0.305 (Ft) * 23 (óra) * 365 (nap)) kb. 2500 Ft-tal több marad a zsebben évente.&lt;/p&gt;
&lt;h3&gt;IT és média&lt;/h3&gt;
&lt;p&gt;Egyetemistaként és informatikusként sok időt kell a számítógép előtt töltenem. Híreket, leveleket olvasok, kapcsolatot tartok ismerősökkel, barátokkal, zenét hallgatok, weblapokat készítek, stb. Tehát nekem a laptop a munka és a szórakozás eszköze is. A laptop magában 80W-ot fogyaszt monitorral együtt, tehát energiatakarékosabb egy asztali PC-nél, ami esetében csak az alapgép 100-110W-ot fogyaszt (aktív használat esetén pedig ennél sokkal többet). Mivel a laptopom már elég régi darab és állandóan sok szolgáltatás fut rajta, így elég sokáig tart, míg bekapcsolás után használhatóvá válik a rendszer. Ennek gyorsítása végett jó ideje nem használom a “kikapcsolás” menüpontot, helyette a “hibernálást” választom. Ekkor a memória aktuális tartalma a merevlemezre íródik, és a gép kikapcsol. Bekapcsoláskor a merevlemezről minden visszakerül a memóriába, és onnan folytatódhat minden munka, ahol a hibernálás történt. Ezzel alkalmanként legalább 3-5 percet spórolok.&lt;/p&gt;
&lt;p&gt;Az sem véletlen, hogy 2 monitort használok. Többek - például a BME Távközlési és Médiainformatikai Tanszék szerint is a több monitor használata növeli a hatékonyságot (10-42%-al), csökkenti a hibák számát, segíti a párhuzamos tevékenységeket, az adatok átvitelét alkalmazások között és a párhuzamos kommunikációt, valamint lényegesen megkönnyíti az összehasonlításokat. A BenQ G2420HDBL típusú LED monitor energiafelhasználását 36%-al csökkentették (a hagyományos LCD monitorokkal szemben), így a fogyasztása 24W. Ez a többlet viszont szükséges és meg is térül, ugyanis a grafikai munkákhoz és a nagy táblázatok kezeléséhez ez elengedhetetlen. Ha a laptopot bekapcsolva hagyom, de a monitort nem szükséges működtetni, akkor azt ki is kapcsolom. Mivel LED-es, nem árt neki, ha csak 2 percre kapcsolom ki.&lt;/p&gt;
&lt;p&gt;Az egyetemen legtöbbször az oktató által kiadott jegyzetből kell tanulni. Ezek Interneten keresztül pdf formátumban érhetők el. Tantárgyanként általában 1 dolgozat megírásához 30-60 oldalas jegyzetek áttanulmányozása szükséges. Ezt kinyomtatni - az olcsónak számító, BME Copy 5 Ft/oldal árával számolva - 150-300 Ft zh-nként. Éjszakai tanulás esetén ehhez még hozzájön a 40W-os olvasólámpa költsége. Ráadásul ezek a jegyzetek csak pár napig “hasznosak”, utána a polcra kerülnek (vagy a kukába), ami pazarlás. Megoldás lehetne a jegyzetek továbbadása a következő évfolyamnak, de ez azért nem működik, mert egyrészt legtöbben tanulás közben összefirkálják a jegyzetet szövegkiemelőkkel és megjegyzésekkel, ami más számára lehet, hogy nem logikus. Másrészt, úgy gondolhatják, hogy még kellhet a jegyzet, esetleg lehet olyan indok is, hogy “ha ők kinyomtatták, nyomtassa ki más is”. Ráadásul a jegyzetekben lehetnek kisebb-nagyobb változtatások is évente. A fentiek tükrében hatékonyabbnak vélem, ha monitorról vagy tabletPC-ről tanulok. A monitor előnye, hogy egyszerre nagy felületet látok, így több slide-ot vagy oldalt is nézhetek egyszerre. Viszont ez óránként kb. 80W (laptop + monitor). Másik megoldás a tabletPC, amire akármennyi jegyzetet rátölthetek, bármikor és bárhol elérem azokat. LED-es érintőkijelzője van, melynek fényerejét szenzorok segítségével automatikusan a szemnek legoptimálisabbra szabályozza. Így tanulhatok ágyban, vonaton, vagy íróasztalnál is anélkül, hogy magammal hordanék sok-sok “egyszer használatos” papíralapú jegyzetet vagy könyvet. A tabletPC-m egy Motorola Xoom 3G. Egy töltéssel kevés használat mellett, készenlétben több mint 8 napig működik. Aktív használat mellett a kijelző kb. 10 órán át képes világítani. A töltő kimeneti feszültsége 12V, az áramerősség 1.5A. Innen számolható a teljesítmény, ami e két érték szorzata, azaz 18W. A teljes töltési idő (0-ról 100%-ra) 2 óra, azaz 1 feltöltés áramdíja 1.35 Ft (ennyibe kerül 10 óra aktív használat). Összehasonlítva ezt az olvasólámpa óránként elhasznált áramával látható, hogy a tabletPC-használat 1 órára (1.53/0.135) = 11-ed annyiba kerül, mint az olvasólámpa.&lt;/p&gt;
&lt;p&gt;Nővérem minden este bekapcsolta a tv-t 2-3 órára. Nálam hetente megy maximum 2-3 órát a tv - vizsgaidőszakban vagy sok zárthelyi idején pedig annyit sem. Régi típusú, katódsugárcsöves Orion tv van, aminek a fogyasztása elég nagy, de nem ezért nem nézek tv-t, hanem mert nem érdekel. Amikor bekapcsolom, akkor is csak 1-1 DVD filmet nézek.&lt;/p&gt;
&lt;h3&gt;Világítás&lt;/h3&gt;
&lt;p&gt;A lakásban a fürdőszobai lámpákat és 2 olvasólámpát kivéve, mindenhol energiatakarékos izzó van. A fürdőszobában 2 db 50W-os izzó van. Alternatívaként még a LED-es lámpa jöhetne szóba, de annak fényereje jóval kisebb, ára pedig sokkal magasabb - nagyon soká térülne meg. Ahhoz itt kicsi a foglalat, hogy energiatakarékos izzót lehessen betenni, ráadásul ez tipikusan az a hely, ahová nem is érdemes. Ablaka nincs, így alapesetben állandóan sötét van és leggyakrabban 1-1 kézmosás, vagy zuhanyzás erejéig vagyok bent, illetve míg elindítom a mosógépet vagy kipakolok belőle. Ezek közül egyik sem több 5-10 percnél. Ez idő alatt egy energiatakarékos izzó még talán épp elérné a teljes fényerejét, már le is lenne kapcsolva, így az élettartama lényegesen csökkenne. Az energiatakarékos izzók hátránya, hogy hidegfényűek. Szemmel láthatóan fehér fényt bocsátanak ki, míg a hagyományos izzók sárgát. Ez utóbbi pihentetőbb a szemnek és kevésbé okoz stresszt. Ez az oka annak, hogy az olvasólámpákban a régebbi típusú izzó maradt. A szobai csillárban lévő energiatakarékos izzók fehér fénye sárgának tűnik, mivel a fal is sárga.&lt;/p&gt;
&lt;p&gt;Az olvasólámpára szinte csak a feladatmegoldások gyakorlásánál van szükség. Ez azonban néha több órát vesz igénybe. Mivel azonban az íróasztalt az ablak mellé tettem, így csak esti/éjszakai gyakorlásnál szükséges a lámpát felkapcsolni, nappal elég az ablakon beszűrődő természetes fény. Ebben 40W-os izzó van, ami óránként 1.53 Ft-ért világít.&lt;/p&gt;
&lt;p&gt;A konyhában is energiatakarékos izzó van a csillárban, de a szekrényekre még LIDL-ben vett elemes, öntapadós LED lámpákat ragasztottam. Ezek fénye nem nagy ugyan, de ha este kimegyek egy pohár vízért, akkor ahhoz elég fényt ad, nem kell emiatt fél percre felkapcsolni a nagylámpát. 6 db ilyen lámpám van mind a két faliszekrény alján 3-3, így azok még esztétikailag is jól mutatnak. Egyelőre csak külön-külön kapcsolhatók, de tervezem, hogy összekötöm őket, hogy egy kapcsolóval egyszerre fel lehessen őket kapcsolni. Ezekből 3 db került 1000 Ft-ba elemmel együtt. Egy éve vettem őket, azóta nem kellett elemet cserélni egyikben sem és fényerejükből sem veszítettek.&lt;/p&gt;
&lt;h3&gt;Konyha&lt;/h3&gt;
&lt;p&gt;Reggelente főzök egy kancsó teát és egy adag kávét. Van külön elektromos kávé- és teafőzőm is. Igaz, ezek az eszközök pörgetik kicsit a villanyórát, de ha kiszámolva a költségeket úgy látszik, így sokkal jobban megéri, mintha automatából, vagy büféből vennék. Nővérem ott tartózkodása alatt mindig forró vizet öntött a teafőző tartályába, mivel úgy gondolta, hogy akkor nem kell annyit melegítenie a teafőzőnek és gyorsabban, illetve kevesebb árammal lefő a tea. Lemértem hideg és forró vízzel egyaránt az időt és az áramfelvételt. Különbség nem volt, mind a két érték ugyanannyi lett mind a két esetben, így “olcsóbb” hideg vizet tölteni a tartályba. Egy tea lefőzése 0.15 kW áramot igényel, míg a kávéfőző csak 0.02 kW-t. 1 doboz Teekanne teafiltert (ami szerintem közepes minőségűnek mondható) 300 Ft-ért szoktam venni, ennyiből 20 adag főzhető (15 Ft/db). Az áramdíj ~5.73 Ft. Ehhez hozzáadódik az 1.2 liter hideg víz, amiből főzök és az a pár dl, amivel utána elmosom a kancsót. Így az áram + teafű + vízdíj együttesen nem haladja meg a 25 Ft-ot és kapok érte 1.2 l teát. Az édesítőt nem számoltam, ebből 9 db-ot teszek a kancsóba. Az ára 1200 db-os kiszerelésben max. 500 Ft, így ez még alkalmanként +3.75 Ft. A teafőző értékcsökkenését nem kalkuláltam bele az árba, de ez sem rontaná nagymértékben a végösszeget, mivel ez az eszköz legalább 4 éves és az ára még 4000 Ft sem volt. Napi használat mellett is hibátlanul működik.&lt;/p&gt;
&lt;p&gt;A kávéfőzés esetében a 250g Omnia őrölt kávé 800 Ft-ért megvehető, ebből - adagonként 8g kávéval számolva - körülbelül 31 adag főzhető. Az anyagár tehát 25.6 Ft. Az elhasznált 0.02 kW ára 0.77 Ft, a minimális kakaó és 1 db kockacukor együtt max 3 Ft (kockacukor: 6g = 1.8 Ft, mivel 1 kg cukor 300 Ft). Tehát az otthon főzött, friss kávé is sokkal olcsóbb, mintha automatából venném.&lt;/p&gt;
&lt;p&gt;A lakás egyik nagyfogyasztó berendezése a hűtő. Nem régi, “A” energiaosztályú Indesit. Nincs vele minden rendben, néha kicsit jobban hűt a kelleténél. A fagyasztó belső falán gyakran vastagon áll a hó és jég. Ezzel az a baj, hogy a belső falhoz hozzátapadva azt leszigeteli és a fagyasztó érzékelője nem tudja a benti levegő hőmérsékletét mérni, így még jobban fagyaszt, ami hatására a villanyóra csak pörög, a jégdarabok pedig nőnek. Hogy ezt a rekurzív folyamatot megállítsam (vagy legalább tompítsam), gyakran kikaparom a jeget a fagyasztó faláról. Így ez a berendezés is kevesebbet fogyaszt, mint korábban.&lt;/p&gt;
&lt;h3&gt;Fürdőszoba&lt;/h3&gt;
&lt;p&gt;A korábban említett 2 db 50W-os izzó óránként 0.1 kWh-t fogyaszt. Ez percenként 0.0636 Ft-ot jelent. A fogkefém elektromos, egy töltéssel 5-6 alkalommal tudom használni. A töltő 3W-ot fogyaszt óránként és a teljes töltési idő 3 óra. Ezekből az adatokból kiszámoltam, hogy maximum 0.0686 Ft-ba kerül percenként az elektromos fogkefe használata. A fogaszat.org információi szerint - és saját tapasztalat alapján is - az elektromos fogkefék számos előnye közül az egyik az, hogy a lepedéket gyorsabban és hatékonyabban távolítja el, mint hagyományosak - tehát hamarabb végzek. Így gyakorlatilag, amit nyerek a vámon, elvesztem a réven - és fordítva: a fogkefe által elhasznált áramot megspórolom a világítással.&lt;/p&gt;
&lt;p&gt;Mivel a ház régi építésű, sokáig - egészen tavaly tavaszig - nem volt bekötve a 110-es szennyvízcső. Így úgynevezett WC darálóra volt szükség, aminek a lényege az, hogy a szennyvízcsatorna-rendszer és a WC közé behelyezve áram alatt kell tartani. Valahányszor a WC tartály öblít, a daráló az azon átömlő tartalmat szó szerint ledarálja, hogy az ne dugítsa el a szennyvízcsövet. Ennyi felújítás történt a házban tavaly, hogy a csatornarendszer fel lett újítva, így a darálót ki lehet szedni a rendszerből. Eredmény: egy fogyasztóval kevesebb.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Társasházi számladíj-csökkentés odafigyeléssel 1. rész]]></title><description><![CDATA[Lakásomban egy év alatt a gázszámla 5752 Ft-ról 4952-re, a villanyszámla 4136 Ft-ról 3715-re csökkent. A vízfogyasztás is mérséklődött 1…]]></description><link>https://nandito.hu/2012-05-10-tarsashazi-szamladij-csokkentes-odafigyelessel-1-resz/</link><guid isPermaLink="false">https://nandito.hu/2012-05-10-tarsashazi-szamladij-csokkentes-odafigyelessel-1-resz/</guid><pubDate>Thu, 10 May 2012 12:12:57 GMT</pubDate><content:encoded>&lt;p&gt;Lakásomban egy év alatt a gázszámla 5752 Ft-ról 4952-re, a villanyszámla 4136 Ft-ról 3715-re csökkent. A vízfogyasztás is mérséklődött 10%-al.&lt;/p&gt;
&lt;p&gt;A lakásban 1 évig lakott nővérem (24 éves, egyedül élő, dolgozó nő). A lakást 7.30-kor hagyta el és általában 17.00 körül ért haza. Mikor Budapestre kerültem, akkor ő összeköltözött barátjával, akivel már össze is házasodtak, és vidékre költöztek. A lakásba be tudtam költözni, most én lakom itt egyetemistaként egyedül.&lt;/p&gt;
&lt;p&gt;A nővérem sem folytat energiapazarló életmódot, átlagos fogyasztónak nevezném. Számos - energiafogyasztási szempontból lényeges -, alapvető különbség van a közte és közöttem. Napközben többet vagyok itthon. Egyrészt, mert közel lakom az egyetemhez és 1-1 szabad órára is haza tudok jönni – például ebédelni, másrészt, nincs előadás egész nap. Nővéremmel ellentétben, én nem nézek tv-t, ritkán használok hajszárítót, rövidebb ideig zuhanyozok, nem használok olvasólámpát elalvás előtt olvasáshoz. Viszont többet vagyok PC előtt és elalvás előtt tabletPC-n olvasok.&lt;/p&gt;
&lt;h3&gt;Tények&lt;/h3&gt;
&lt;p&gt;Adott egy 27 m2-es lakás a Budapesten egy belvárosi utca egyik társasházában. Az épület műemlékvédelem alatt áll, így a szigetelés és a nyílászárók cseréje nehezen – vagy egyáltalán nem megoldható. Az épület 4 szintes, belső udvaros, körfolyosós. A lakás a 3. emeleten van, mindkét oldalt van szomszéd, akárcsak a lakás alatt és felett is. Így csak 2 oldali fűtetlen fal van – egy a folyosó felől, egy pedig az épület másik oldala. A beltér magas és mivel az alapterület kicsi, így galériát építettünk be, ahová egy matrac került.&lt;/p&gt;
&lt;h3&gt;Motiváció, alapelvek&lt;/h3&gt;
&lt;p&gt;Egyetemistaként minimális önálló jövedelemmel rendelkezem, így a lakás rezsi-költségét a szüleim fizetik. Szeretnék legalább az által terhet levenni a vállukról, hogy odafigyelek arra, hogy mikor mivel tudom minimalizálni a kiadásokat. Másrészt régebb óta érdeklődöm az energetika iránt. Figyelem a megújuló energiahordozókra irányuló kutatásokat és elképzelhetőnek tartom, hogy ezen a területen dolgozom majd. Zavar a jelenlegi fenntarthatatlan fejlődés és úgy döntöttem, hogy legalább a saját lehetőséghez képest mindent megteszek, hogy a Föld ne menjen tönkre - bár tisztában vagyok vele, 27 m2-en nem fogom megváltani a világot.&lt;/p&gt;
&lt;p&gt;“Minden számít”. Ezt a mondatot egy motivációs trénertől hallottam és úgy gondoltam, hogy ez igaz lehet az energiatakarékosságra is. Ezért törekszem a legapróbb részletekre is odafigyelni és mindent nagyobb hatásfokkal végezni, még akkor is, ha az eredetihez képest csak kicsi megtakarítást jelent. Sok kicsi sokra megy. Azonban a kényelmi szempontokat nem adom fel, értem ezt úgy, hogy nem fogok fagyoskodni a lakásban, és nem olvasok gyertyafénynél, mert bár a gáz és a villanyáram nem olcsó, még mindig olcsóbb, mint a gyógyszer a megfázásra vagy a szemüveg a látásra.&lt;/p&gt;
&lt;p&gt;A lakásban 3 fogyasztásmérő van: a villany-, a gáz- és a vízóra. Mindegyiknek az állását március közepe óta egy alkalmazás segítségével naponta rögzítem (legalábbis amikor Budapesten vagyok). Ezáltal kimutatást készíthetek az időszaki energiafelhasználásokról.&lt;/p&gt;
&lt;h2&gt;Gáz&lt;/h2&gt;
&lt;p&gt;A gázt a Fővárosi Gázművek Zrt. szolgáltatja köbméterenként bruttó 117.5 Ft-ért. Ehhez még hozzáadódik évente 12312 Ft éves alapdíj (ami havonta nagyjából 1000 Ft) és némi készletezési díj. A gáz elsődleges felhasználása természetesen a fűtés, de a sütés-főzés is azzal történik, mivel csak egy nagyjából 40 éves, lábon álló gáztűzhellyel rendelkezem. Bár a sütés-főzés nincs évszakhoz kötve, volumenét tekintve mégis elhanyagolható a fűtéshez képest. Sem nővérem, sem én nem sütünk-főzünk rendszeresen, csak nagyjából hetente 1-2x. Esetemben még van példa arra, hogy szenet gyújtok be a tűzhelyen vízipipához. Ehhez - legutóbbi mérésem szerint - 0.069 m^3 gáz elégetése szükséges, aminek ára maximum 9 Ft.&lt;/p&gt;
&lt;p&gt;A fűtés már többe kerül. Tény, hogy a lakás hőmérsékletének 1 °C-al történő emelése esetén a kiadás 6%-al nő. Nővérem jellemzően 21-22 °C-ban érezte jól magát, ezért ilyen hőmérsékletet tartott a lakásban, ha otthon volt. Azzal tisztában volt, hogy érdemes lejjebb venni a fűtést, ha hosszabb időre elmegy otthonról. Ilyenkor télvíz idején  - ha el nem felejtette - kicsit visszábbtekerte a szabályzót, így biztosítva, hogy mikor hazaért akkor sem lesz hidegebb 19-20 °C-nál, de azért mégis spórolt.&lt;/p&gt;
&lt;p&gt;Vele ellentétben én megelégszem a 20 °C-al. Aludni a fent, a galériában szoktam, ahol melegebb van (mivel magasabban van). Ezért lefekvés előtt is kicsivel lejjebb veszem a fűtést. Több tanulmány készült arról, hogy mi az optimális hőmérséklet az alváshoz. Legtöbb azt vallja, hogy a 18-21 °C között a legpihentetőbb az alvás. Ha melegebb van, akkor az ember nem tud nyugodtan aludni, úgynevezett mikroébredések jelentkeznek, ami másnap fáradságot, hosszabb távon pedig stresszt okozhat. A konvektor leszabályozásakor azonban nem szabad túlzásba esni, ugyanis minél hűvösebb van a szobában, annál nagyobb valószínűséggel lesz az ott alvó embernek rémálma.&lt;/p&gt;
&lt;p&gt;Ha a lakást hétvégére, vagy hosszabb időre elhagyom, akkor a konvektort csak gyújtólángon hagyom, ami kb. 17 °C-ig engedi lehűlni a lakást. Ezt sosem felejtem el, van egy “teendők a lakás elhagyása előtt” listám, amin mindig átfutok, ha elutazom.&lt;/p&gt;
&lt;p&gt;A párologtatás a hőérzetet javítja. Emellett egészségesebb is a párásabb levegő a száraznál - ez utóbbi a szem és a nyálkahártya száradását okozhatja, ami megbetegedések oka lehet. A lakás szellőztetése is fontos, melynek ideje alatt a fűtést érdemes letekerni. 5 perc szellőztetéssel a levegő kicserélődik, de a falak és bútorok nem hűlnek le.&lt;/p&gt;
&lt;p&gt;Érdekesnek és hasznosnak találom a sörkollektort. Ez egy házi készítésű napkollekektor. Elkészítése nem túl bonyolult, csak az üres sörös dobozok alját és tetejét kell levágni, majd a hengereket csővé összeilleszteni és lefújni fekete festékkel. Az elkészített csöveket a háztetőre fel kell tenni, majd a cső mindkét végét be kell vezetni a fűtendő helyiségbe, ahol egy - például régi, 12 Voltos processzorhűtő - ventillátorral a cső egyik végén a levegőt befelé, a másik végén pedig onnan kifelé kell fújni. Így a levegő a tetőn lévő fekete sörös dobozokon átáramolva felmelegszik, és úgy kerül vissza a helyiségbe. Sajnos a budapesti lakásban ilyen rendszer kiépítésére lehetőségem nincs.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Épület falazatának EPS szigetelése]]></title><description><![CDATA[Egyetemen hallgatok építőmérnöki alapismereteket is. E tárgy keretében házi feladatot kellett készíteni: a feladat egy épület építési…]]></description><link>https://nandito.hu/2012-04-23-epulet-falazatanak-eps-szigetelese/</link><guid isPermaLink="false">https://nandito.hu/2012-04-23-epulet-falazatanak-eps-szigetelese/</guid><pubDate>Mon, 23 Apr 2012 19:05:35 GMT</pubDate><content:encoded>&lt;p&gt;Egyetemen hallgatok építőmérnöki alapismereteket is. E tárgy keretében házi feladatot kellett készíteni: a feladat egy épület építési folyamatának tetszőlegesen kiválasztott szerkezeti részletét bemutatni egy általam kiválasztott anyag segítségével. A szerkezeti részlet, amit választottam a &lt;strong&gt;falazat külső hőszigetelése&lt;/strong&gt;. A szerkezeti elem anyaga: &lt;strong&gt;expandált polisztirol hab&lt;/strong&gt;. És íme:&lt;/p&gt;
&lt;p&gt;A családi házak 80 év alatt várható energiafelhasználásának kimutatása szerint a legtöbb energiát a fűtés igényli (6x annyit, mint a második helyen álló használati meleg víz). A kisebb hőszigetelő képességű falazat építési költsége rendszerint kisebb, viszont az üzemeltetési költség nagyobb, mint a nagyobb hőszigetelő képességű falazaté. Helyes tervezés esetén a feladat tehát az optimumkeresés és hatékony hőszigetelő anyagokkal lehet megoldani (hivatkozás: Tk. 16.1 fej., 595. old., 2. bek.). Másik fontos és járulékos szempont a fenntartható fejlődés, miáltal a megújuló források fogyasztása kevesebb, mint amit a természet újrateremteni képes. A helyesen tervezett szigetelés következményeképpen a fűtésenergia csökkenése ehhez hozzájárul.&lt;/p&gt;
&lt;p&gt;Az környezeti hőmérséklettartomány -20 és +70°C közötti, tehát az építészeti hőmérséklettartományban van (hivatkozás: Tk. 16.2.4. fej., 599.old., 3. bek.). A legfontosabb hőtechnikai anyagjellemző a hővezetési tényező (λ), amivel az anyagok hővezetési képességét jellemezzük. Ez az a hőmennyiség J-ban kifejezve, ami 1 m2 felületű, 1 m vastag falon állandósult hőáramban 1 óra alatt átvezetődik, ha a fal két oldalán a hőmérsékletkülönbség 1°C. Mértékegysége: W/(m*K). Minél kisebb valamely anyag hővezetési tényezője, annál jobb hőszigetelő (hivatkozás: Tk. 2.2.6. fej., 85. old., 7. bek.).  A hővezetési tényezőt első sorban az anyag vegyi összetétele, kristályos, ill. amorf felépítése, testsűrűsége határozza meg (hivatkozás: Tk. 16.2.1. fej., 597. old., 16.2. ábr.), de nagymértékben függ a nedvességtartalomtól, hőmérséklettől és lemezes anyagok esetén a hőáramlás irányától is. A hőszigetelő anyagok pórusos szerkezetűek, azaz szilárd anyagokból és levegőből tevődnek össze. Ebből következik, hogy nem tisztán jelentkezik a hővezetés, hanem azt többé-kevésbé torzítja a hőáramlás és a hősugárzás is (hivatkozás: Tk. 2.2.6 fej., 87. old, 1. bek.).&lt;/p&gt;
&lt;p&gt;A választott szerves hőszigetelő-anyag a polisztirol hab. Maga a polisztirol (PS) amorf műanyag. Lágyuláspontja 65-100°C. Vízálló, igen jó vegyszerálló, fényálló, éghető. Legtöbb oldószer oldja. Jól forgácsolható, hegeszthető, ragasztható. Az építőiparban elsősorban hab, csempék, lemezek, fóliák formájában használják (hivatkozás: Tk. 13.2.1. fej., 497. old., 6. bek.). A polisztirol habot Magyarországon két lépésben állítanak elő. Az első lépésben az előhabosítás során sztirolszemcsék gőzben (vagy melegben) a bennük lévő kelesztőanyag hatására 1-8 mm-es gyöngyökké duzzadnak. Ez szemcsés anyagként felhasználható hőszigetelésre is. A polisztirol gyöngy pihentetése után a második lépésben zárt sablonban tovább habosítják és kapják a polisztirol hab tömböt, amely testsűrűsége hat csoportba sorolható. Ez az érték 12-40 kg/m3 között változik. Hővezetési tényezője 0,03-0-0,04 W/(m*K). Tartósan 80°C-ig hőálló. Pórusrendszere majdnem teljesen zárt, nem áll ellen a tömény savaknak, szerves oldószereknek, ásványolajoknak, kőszénkátránynak (hivatkozás: Tk. 16.2.6. fej., 607. old., 5. bek.).&lt;/p&gt;
&lt;p&gt;A célra megfelel pl. a MasterPlast Kft. által forgalmazott ISOMASTER EPS-30 márkajelű, 0.25 m3/bála = 5 m2/bála kiszerelésben kapható EPS (röv. Expanded Polystyrene - Expandált Polisztirol). A lapok falazatra történő felragasztása EPS habarccsal történik. A falazóhabarcsok feladata a falazóelemek közötti együttműködés létrehozása, a teherelosztás, a hézagkitöltés és az építőelemek összeragasztása (hivatkozás: Tk. 8.5.1., 348. old., 4. bek.). Az említett habarcs megfelelő mennyiségű mészkő és agyag zsugorodásig való égetése által előállított klinker és kötésszabályozás céljából hozzáadott gipszkő együttes finomra őrölése révén készített portlandcementen (hivatkozás: Tk. 6.3.1. fej., 215. old., 5. bek.) és polimeren alapszik. A becsült átlagos ragasztóhabarcs-anyagszükséglet: 4.5 kg/m2.&lt;/p&gt;
&lt;p&gt;A felhelyezés módja: a ragasztóanyag egyoldalra kerül felhordásra, a lemez hátoldalára rozsdamentes acél spaklival a lemez széle mentén folyamatos sávokban és még középen 4-6 helyen pontszerűen vagy két sávban. A felhordott ragasztó mennyisége akkora, hogy amikor a lemezt felnyomják a felületre, a lemez legalább 40 %-át borítja be. A lemezeket szorosan egymás mellé kerülnek úgy, hogy a ragasztó nem folyik bele az érintkező résekbe. A burkolat külső felületének egyenessége ragasztás közben folyamatosan ellenőrizendő. A szomszédos sorokban elhelyezkedő lemezek a téglakötés szabályainak megfelelően tolódnak (hivatkozás: &lt;a href=&quot;http://www.jub.hu&quot;&gt;www.jub.hu&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Felhasznált irodalom:&lt;/strong&gt;&lt;em&gt;Dr. Balázs György - Építőanyagok és kémia, Műegyetemi Kiadó, 1983&lt;/em&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Ingyen repülőjegy a Westendben]]></title><description><![CDATA[Pont 2012. február 14-én hívott egy nem Budapesten lévő ismerősöm: az index.hu-n most olvasta, hogy 1000 db ingyen repülőjegyet oszt szét a…]]></description><link>https://nandito.hu/2012-02-17-ingyen-repulojegy-a-westendben/</link><guid isPermaLink="false">https://nandito.hu/2012-02-17-ingyen-repulojegy-a-westendben/</guid><pubDate>Fri, 17 Feb 2012 20:54:12 GMT</pubDate><content:encoded>&lt;p&gt;Pont 2012. február 14-én hívott egy nem Budapesten lévő ismerősöm: az &lt;a href=&quot;http://index.hu/gazdasag/magyar/2012/02/14/feljelenti_a_wizz_air-t_a_ryanair/?rnd=320&quot;&gt;index.hu&lt;/a&gt;-n most olvasta, hogy 1000 db ingyen repülőjegyet oszt szét a Ryanair, ha ráérek, menjek én is, hátha jut. Pont ráértem, szóltam is pár ismerősnek, akikről gondoltam, hogy érdekelheti őket. Egy ismerőssel 2-en mentünk.&lt;/p&gt;
&lt;p&gt;Tudtuk, hogy 16:00-tól osztják és hogy viselni kell valami kéket. Nem találtuk első körben a hostesseket, de - mint később kiderült - azért, mert nem jó szinten kerestük. 4 óra előtt kb. 10 perccel viszont odataláltunk és szemmel láthatóan jó helyen jártunk, ugyanis elég nagy volt tömeg. Saccoltuk, vajon benne leszünk-e az első 1000-ben. Végül úgy döntöttünk, várunk, max. nem jut jegy. Mögöttünk is hosszúra nyúlt a sor, lassan is haladtunk, de kb. 1 óra 10 perc sorban állás után kaptunk 1-1 vouchert, 1 lapot az utazási feltételekről és gyors szóbeli tájékoztatást, hogy hogyan is kell foglalni.&lt;/p&gt;
&lt;p&gt;A voucher-re rá van írva, hogy az utazás 1 alkalomra szól, oda-vissza érvényes a következő városok valamelyikére (természetesen Budapestről): Brüsszel, Baden Baden, Göthenburg, Hamburg, Memmingen, Milánó. Értelemszerűen és angolul kell kitölteni a mezőket és szkennelve elküldeni a megadott e-mail címre. 1 úti célt és 3 lehetséges utazási- és érkezési időpontot kell megadni.&lt;/p&gt;
&lt;p&gt;A voucher felhasználására kapott időintervallum nem nagy, tehát mindenkinek kapkodnia kell, hogy kapjon jegyet. Mi is így tettünk, amint meglett a jegy, jöttünk  hozzám, &lt;em&gt;kikerestük a Ryanair honlapján&lt;/em&gt;, hogy mikor indulnak gépek Brüsszelbe - és vissza. A voucher &lt;em&gt;lejártáig 2 hétvége&lt;/em&gt; van. Nekünk a soron következő semmiképp nem lenne jó, így az azt követőt pályáztuk meg: február 24-én indulás, 26-án vissza. Útitársammal egyforma sorrendben tüntettük fel az időpontokat és a szkennelt vouchert nagyjából 1-2 perc különbséggel küldtük el a megadott e-mail címre. Másnap kaptam is két levelet: egyik magyar nyelvű volt és írta, hogy köszönik, hogy részt veszek a promócióban és másik levélben küldik a foglalási kódot és a további részleteket. A másik levél hosszú volt és angol, de ott volt a tetején a foglalási kód az elsőnek megjelölt hétvégi gépre. Felhívtam hát partnerem és kérdeztem, ő kapott-e levelet. Csak a magyar nyelvűt kapta meg, a másikat nem. Estére aztán megkapta az angol nyelvűt is, viszont ő a harmadikként megjelölt hétköznapi időpontokra. Így mehetünk mind a ketten külön, de együtt nem - az átfoglalás költséges.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;/* A következő sorok saját elmélkedésen alapulnak, nem kérdeztem meg sem a Ryanair-, sem a Liszt Ferenc Nemzetközi Repülőtér illetékes szerveit, csak építek egyetemi tanulmányaimra és józan eszemre. Ez egy blog, nem hírportál. */&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;Miért osztogatnak csak úgy repjegyet?&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Biztosan lesz majd jó sok illeték meg minden!&lt;/em&gt; - mondják a “jól értesültek”. Nem hiszem. De tény, hogy nem fenékig tejfel itt minden. Egy kézipoggyászt vihet az ember ingyen, a többi már fizetős. Ez oké, 2 napra elég is annyi. Ezt nem tartom átverésnek. A lényeg a marketing. Amint a MALÉV csődöt jelentett, a Ryanair egyből bejelentette, hogy sok új járatot indít Magyarországról - nyilván a MALÉV jelentésekből látszott, hogy nem jól megy a szekér és várható volt a csőd. Ezt kihasználta a Ryanair - nagyon okosan. A fiókban már ott lehetett a kész stratégiai terv, hogy milyen lépéseket tesznek egy komoly szereplőt elvesztő piacon. Akik korábban nem hallottak a Ryanairről, azok február 14-én a Westend City Centerben biztosan megtudták, hogy mi az. Elég volt elhinteni az index.hu-n utolsó bejegyzésként, hogy lesz néhány ingyen jegy és máris odament néhány ezer ember sorba állni, mert hát habzsi-dőzsi, meg ingyen jegy, pedig egy részük feltehetően amúgy &lt;em&gt;nem is akart utazni&lt;/em&gt;, csak ha már ingyen van. Viszont az emberek ritkán utaznak egyedül, inkább ketten, vagy többen együtt. Ha a voucher-t felhasználók között a jegyeket kiosztják, akkor valószínűleg véletlenül, de előfordulhat (ahogy nálunk is előfordult), hogy az útitársak külön gépre kaptak jegyet. Mit lehet ilyenkor tenni? Az átfoglalás költséges (azt hiszem, drágább, mint új jegyet venni). Másik lehetőség - egy páros utazásra gondolva -, hogy a preferáltabb időpontot kapott utazó és a szerencsétlenebb útitársa azt mondja, &lt;em&gt;vegyünk még egy jegyet&lt;/em&gt; arra az időpontra, amikor neked van jegyed és felét te fizeted, felét én, még így is féláron utazunk. Ne felejtsük el: lehet, hogy egy hete még nem is akartak utazni. Már itt is nyer a légitársaság. Arról nem is beszélve, hogy ha egy társaság 2 tagjának sikerül azonos gépre kerülni, akkor lehet, hogy a barátok megkívánják a lehetőséget és csatlakoznak önköltségen.&lt;/p&gt;
&lt;p&gt;Ahhoz, hogy lássuk, milyen időpontokban indulnak gépek (ezt a voucher-eseknek kötelező), fel kell menni a Ryanair honlapjára és ki kell keresni. Itt az árak is fel vannak tüntetve. A mi brüsszeli hétvégi utazásunk fejenként 14800 Ft lett volna, de nézelődés közben olyat is láttunk, ahol 2500(!)-3000-5000 Ft-ért oda-vissza meg lehet járni Brüsszelt. Ezekről a szerintem igencsak pénztárcabarát árakról én nem tájékozódtam volna, ha nem nyerek voucher-t és nem lépek fel a honlapra. És én ezt elmondtam azóta legalább 20 ismerősömnek. Ebből kiindulva, ha mind az 1000 ember, aki jegyet kapott, csak 2 embernek mondja el, akkor is már 3000-en tudják, hogy a Ryanairnél mennyibe kerül a repülőjegy. Így már nem is annyira nagy érvágás, ha az adott záros határidőn belül nem tudunk gépre szállni, majd elmegyünk márciusban, vagy később - nem egy ökör ára.&lt;/p&gt;
&lt;p&gt;Az is biztos, hogy az 1000 kiosztott ingyen jegyből nem fog 1000 ember utazni - 2-vel már biztosan kevesebb lesz, mert mi nem megyünk. A Ryanair jól csinálja: ott támad, ahol lehet. Nem hiszem, hogy így a sallangokkal együtt ez az eljárás sokszorosába került egy tartós rádió- vagy tévéreklámnak, de volt olyan - vagy nagyobb hatása. Ugyanúgy bekerültek a tévébe és rádióba, csak nem a reklámblokkba, hanem a híradóba.&lt;/p&gt;
&lt;h3&gt;Nincs minden ingyen&lt;/h3&gt;
&lt;p&gt;Azt azért hozzá kell tenni, hogy aki felhasználja a jegyet, ő sem fog valószínűleg 0 Ft-ból kijönni. Ki kell jutni a Liszt Ferenc reptérre, ahol leszáll, onnan valószínűleg elmegy valahová, nézelődik, vesz csecse-becsét, esetleg megszáll egy hotelben/motelben/panzióban/stb, majd visszamegy a reptérre, hazarepül ingyen és a hazai reptérről is hazamegy. Ahogy számolgattuk nem a repülőjegy vásárlásnál kell a zsebbe nyúlni, hanem a szállásnál és az euró-vásárlásnál. Viszont fenntartom: (nekem) jó, hogy ennyibe kerülnek a repülőjegyek, mert legalább azon lehet spórolni.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Napi motiváció 1.]]></title><description><![CDATA[Megérdemled, hogy boldog légy! Hogyan lehet az ember boldogabb és sikeresebb? A Brian Tracy International szerint van rá tanulható módszer…]]></description><link>https://nandito.hu/2012-02-16-napi-motivacio-1/</link><guid isPermaLink="false">https://nandito.hu/2012-02-16-napi-motivacio-1/</guid><pubDate>Thu, 16 Feb 2012 11:20:10 GMT</pubDate><content:encoded>&lt;h3&gt;Megérdemled, hogy boldog légy!&lt;/h3&gt;
&lt;p&gt;Hogyan lehet az ember boldogabb és sikeresebb? A Brian Tracy International szerint van rá tanulható módszer. Elmondom, hogyan.&lt;/p&gt;
&lt;h3&gt;Minden ember különbözik&lt;/h3&gt;
&lt;p&gt;Nem mindenkinek ugyanaz jelenti a boldogságot. Olyan ez, mint egy terített svédasztal. Odamegy hozzá sok ember és mindenki mást szed a tányérjára, a rengeteg hús, zöldség és köret segítségével sok különböző kombinációban lehet megpakolni az egyes tányérokat. A boldogsággal is ez a helyzet, minden ember magának találja meg a boldogságának összetevőit és az alapján „rakja meg tányérját” – vagyis tölti meg életét.&lt;/p&gt;
&lt;h3&gt;Hallgass a szívedre&lt;/h3&gt;
&lt;p&gt;Az ebéded összetétele azonban változik, ha minden nap ugyanabból a kínálatból választasz. Ilyenkor megkérdezed magadtól, hogy mi is az, amit ma kívánsz? Így van ez a boldogsággal is, kérdezd meg magadtól, mitől leszel boldog, mire vágysz? Ez a legjobb módja annak, hogy kiderítsd, milyen munkára, kapcsolatra, befektetésre vágysz. Ez alapján tudsz helyes döntéseket hozni. Hallgass a szívedre.&lt;/p&gt;
&lt;h3&gt;Légy őszinte önmagadhoz&lt;/h3&gt;
&lt;p&gt;Csak akkor vagy őszinte önmagadhoz, ha azt teszed, amit a „belső hangod” diktál. Figyelj oda erre a belső hangra, légy bátor és fogadd el, amit ajánl.&lt;/p&gt;
&lt;h3&gt;Nincsenek határok&lt;/h3&gt;
&lt;p&gt;A boldogságot megérdemled. Ha ezt a kijelentést elfogadod, használod a tehetségedet és képességeidet, akkor nagyon jó úton jársz ahhoz, hogy boldog légy. Minél jobban szereted és tiszteled önmagad, annál jobban kiérdemled a jó dolgokat az életben. Tudod, vonzás törvénye: amire sokat gondolsz, megtörténik, így, ha jó dologra gondolsz, jó dolog történik veled.&lt;/p&gt;
&lt;h3&gt;A boldogság a legfontosabb&lt;/h3&gt;
&lt;p&gt;Remek módszer, ha megtervezed, hogyan legyél boldog. Pontosabban eldöntöd, mitől leszel boldog és azt tervezed meg, hogy hogyan éred el azokat, amiktől boldog leszel. Hasonlíts össze, minden lehetséges tevékenységet és döntést, ami boldoggá vagy boldogtalanná tehet. Rá fogsz jönni, hogy minden problémádért te vagy a felelős, te döntöttél úgy, hogy azt teszed, illetve hogy nem teszel ellene. Miután erre rájöttél, ideje elgondolkozni azon, hogyan tudod elgörgetni ezeket az akadályokat a boldogságod elől.&lt;/p&gt;
&lt;h3&gt;Fizesd meg az árát&lt;/h3&gt;
&lt;p&gt;Természetesen számtalan olyan eset van, amit muszáj megtenned, de tudod, hogy nem leszel tőle boldogabb. Mivel azonban meg kell tenned, meg is teszed, de utána abból a szempontból jobb lesz, hogy túl leszel rajta. Ezeket az ideiglenes lépéseket – melyek közvetlenül nem boldogítanak - meg kell tenned ahhoz, hogy utána foglalkozhass a kellemesebb dolgokkal, hogy boldog lehess. Ez a siker ára. Ezt ki kell fizetni.&lt;/p&gt;
&lt;h3&gt;Gyakorlatban&lt;/h3&gt;
&lt;p&gt;Itt van 3 lépés, amit már most meg tudsz tenni, hogy ezeket a fenti ötleteket a gyakorlatba ültesd:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Fogadd el, hogy megérdemled a boldogságot és saját erőfeszítésed révén elérheted azt&lt;/li&gt;
&lt;li&gt;Készíts saját tervet a boldogság eléréséhez&lt;/li&gt;
&lt;li&gt;Légy hajlandó keményen dolgozni a boldogságért és fizesd is meg annak árát.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Gondolkozz előre és figyelj a céljaidra és a sikeres leszel.&lt;/p&gt;
&lt;h4&gt;Forrás&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;http://www.briantracy.com/&quot;&gt;Brian Tracy&lt;/a&gt; hírlevél 2012. február 6. „You deserve to be happy” | &lt;em&gt;A használat engedélyezett a Brian Tracy International Support Team által.&lt;/em&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[jQuery 30 nap alatt II. rész]]></title><description><![CDATA[Az előző rész tartalmából: Tutsplus.com ajánlata a következő: megtanítja nekem (és bárki másnak is) 30 nap alatt a jQuery használatát ingyen…]]></description><link>https://nandito.hu/2012-02-15-jquery-30-nap-alatt-ii-resz/</link><guid isPermaLink="false">https://nandito.hu/2012-02-15-jquery-30-nap-alatt-ii-resz/</guid><pubDate>Wed, 15 Feb 2012 19:07:31 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;&lt;em&gt;Az előző rész tartalmából:&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;http://tutsplus.com/&quot;&gt;Tutsplus.com&lt;/a&gt; ajánlata a következő: megtanítja nekem (és bárki másnak is) 30 nap alatt a jQuery használatát ingyen.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;7. nap&lt;/h3&gt;
&lt;p&gt;3 fontos metódus kerül ma bemutatásra, így:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;.bind()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;.live()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;.delegate()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;E 3 eljárás mindegyike gyakorlatilag egy pointer (mutató) az &lt;code class=&quot;language-text&quot;&gt;.on()&lt;/code&gt;-ra. Szó esik még a &lt;code class=&quot;language-text&quot;&gt;.clone()&lt;/code&gt; és &lt;code class=&quot;language-text&quot;&gt;.appendTo()&lt;/code&gt; funkciókról is.&lt;/p&gt;
&lt;h3&gt;8.nap&lt;/h3&gt;
&lt;p&gt;A DOM-hoz adás eljárásairól van szó. Azaz, például hogyan lehet a HTML kódhoz hozzátenni új tartalmat jQuery-vel.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;.append()&lt;/code&gt; : utána fűzi a zárójelben lévő tartalmat a kijelölt terület végéhez&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;.prepend()&lt;/code&gt;: annyiban más az .append()-nél, hogy nem a „this” után, hanem elé fűz&lt;/li&gt;
&lt;li&gt;Az &lt;code class=&quot;language-text&quot;&gt;.after()&lt;/code&gt; és &lt;code class=&quot;language-text&quot;&gt;.before()&lt;/code&gt; arra szolgál, hogy közvetlenül egy megkeresett tag/osztály után és elé szúrja be a zárójel tartalmát, nem pedig a kijelölt tag-en belülre (ahogyan azt az &lt;code class=&quot;language-text&quot;&gt;.append()&lt;/code&gt; és &lt;code class=&quot;language-text&quot;&gt;.prepend()&lt;/code&gt; teszik).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Új tartalom hozzáadás tag-gel együtt egy „&lt;em&gt;article&lt;/em&gt;”-höz:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;’&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;h2&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;h2&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;’&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; ’ez lesz a h2 tag&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;eken belül’&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; ’osztaly’&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;appendTo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;’article’&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Az &lt;code class=&quot;language-text&quot;&gt;.appendTo()&lt;/code&gt; a végére illeszt az article-nek, a &lt;code class=&quot;language-text&quot;&gt;.prependTo()&lt;/code&gt; pedig az elejére.
Használható még az &lt;code class=&quot;language-text&quot;&gt;.appendTo()&lt;/code&gt; helyett az &lt;code class=&quot;language-text&quot;&gt;.insertBefore()&lt;/code&gt; vagy &lt;code class=&quot;language-text&quot;&gt;.insertAfter()&lt;/code&gt; is, ilyenkor a zárójelben megadott tag/osztály elé vagy utána teszi az új tartalmat.&lt;/p&gt;
&lt;p&gt;Végül egy olyan scriptet írt Jeffrey, ami például blog-bejegyzéseknél használatos: a &lt;code class=&quot;language-text&quot;&gt;&amp;lt;span class=”co”&gt;&amp;lt;/span&gt;&lt;/code&gt; tag-ek közötti szöveget oldalra igazítva, felnagyítva és egyéni háttérrel ellátva blokkidézetként jeleníti meg. Egész jól néz ki.&lt;/p&gt;
&lt;h3&gt;9. nap&lt;/h3&gt;
&lt;p&gt;A slide-ról és fade-ről lesz ma szó. A példában egy „contact me” gombra kattintva lecsúszik a weblap tetejéről egy űrlap. Amit már az elején leszögez Jeffrey, hogy mindig a HTML-el kezdjünk (és CSS-el). Ne ugorjunk neki egyből a JavaScriptnek vagy jQuerynek. Jelen esetben ez azt jelenti, hogy először egy „nyers” HTML váz készült, ahol rendre megjelenik az adott szöveg és &lt;em&gt;contact me&lt;/em&gt; gomb, alatta pedig az űrlap, ami majd a script elkészítése után csak a gombra kattintva jelenik meg.&lt;/p&gt;
&lt;p&gt;Érdekes a JavaScript (JS) engedélyezettségének ellenőrzése. A formot (űrlapot) „fel kell ragasztani” az oldal tetejére. Ennek definiálása egy css osztályban történik (&lt;em&gt;.js body #form&lt;/em&gt;). Alapból a html-hez nincs hozzáadva semmilyen osztály. A script úgy kezdődik, hogy &lt;code class=&quot;language-text&quot;&gt;$(’html’).addClass(’js’)&lt;/code&gt;. Ezáltal aktívvá válik a &lt;em&gt;.js body #form&lt;/em&gt; definíció a css-ben és felragad a form a weboldal tetejére és eltűnik (gombnyomásra pedig előjön). Ha a böngészőben nincs engedélyezve a JS, akkor viszont a html tag-hez sem lesz hozzárendelve a js osztály, így a definíció sem lesz érvényes, tehát a form nem takarja el a tartalmat.&lt;/p&gt;
&lt;p&gt;Ha ugyanazokkal a paraméterekkel használjuk a &lt;code class=&quot;language-text&quot;&gt;.slideUp()&lt;/code&gt; és &lt;code class=&quot;language-text&quot;&gt;.slideDown()&lt;/code&gt;-t vagy a &lt;code class=&quot;language-text&quot;&gt;.fadeIn()&lt;/code&gt; és &lt;code class=&quot;language-text&quot;&gt;.fadeOut()&lt;/code&gt;-ot, akkor helyettük használható a &lt;code class=&quot;language-text&quot;&gt;.slideToggle()&lt;/code&gt; és &lt;code class=&quot;language-text&quot;&gt;.fadeToggle()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Megjegyzem, ez az eddigi legbonyolultabb rész. Kicsit hosszú is a korábbiakhoz képest (~24 perc) és eléggé belemegy itt a call funkcióba, ide-oda hivatkozik. A végén ezt el is ismeri és ajánlja, hogy nézzük meg újból, ha nem volt minden tiszta elsőre. Igencsak élek a lehetősséggel.&lt;/p&gt;
&lt;h3&gt;10. nap&lt;/h3&gt;
&lt;p&gt;Jeffrey egy 10 perces előadást szentel most a this megértetésének. Tüzetesen vizsgálgatjuk, hogy mi változik, ha változtatjuk a this környezetét, vagy helyét a scriptben. Amiről már tegnap is volt szó, de nem ejtettem róla szót az az, hogy van egy számomra új módja is a funkciókészítésnek:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt;  cif &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function-variable function&quot;&gt;akarmi&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ez esetben az akarmi meghívása így történik (például): &lt;code class=&quot;language-text&quot;&gt;$(’a’).on(’click’, cif.akarmi);&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Szó esik a &lt;code class=&quot;language-text&quot;&gt;.preventDefault()&lt;/code&gt;-ról, a &lt;code class=&quot;language-text&quot;&gt;.call()&lt;/code&gt;-ról és a &lt;code class=&quot;language-text&quot;&gt;.proxy()&lt;/code&gt;-ról is.&lt;/p&gt;
&lt;h3&gt;11. nap&lt;/h3&gt;
&lt;p&gt;Rövid előadás következik az effektek sebességéről. A jQuery forrásfájlban lévő .fx.speeds-ben található értékeket figyeljük meg, majd módosítjuk azokat. Ezek a módosítások természetesen nem magában a jquery-1-7-1.js-ben, hanem a mi HTML állományunkban történik. A forrást nem piszkáljuk. Vannak előre definiált sebességek. Például: &lt;code class=&quot;language-text&quot;&gt;.slideDown(’slow’)&lt;/code&gt; az &lt;em&gt;600ms&lt;/em&gt;, de ha a zárójelbe &lt;code class=&quot;language-text&quot;&gt;fast&lt;/code&gt;-et írunk, akkor az &lt;em&gt;200ms&lt;/em&gt; lesz. Az &lt;strong&gt;alapértelmezett&lt;/strong&gt; érték &lt;em&gt;400ms&lt;/em&gt;. Újat is definiálhatunk a &lt;code class=&quot;language-text&quot;&gt;$.fx.speeds.nagyonlassu = 6000;&lt;/code&gt;-el például. Ilyenkor, ha a &lt;code class=&quot;language-text&quot;&gt;.slideDown()&lt;/code&gt; zárójelébe a ’&lt;em&gt;nagyonlassu&lt;/em&gt;’-t írjuk, akkor ugyanaz történik, mintha 6000-et írtunk volna.&lt;/p&gt;
&lt;h3&gt;12. nap&lt;/h3&gt;
&lt;p&gt;Megtanulhatjuk, hogyan írjunk saját scriptet arra, hogy egy &lt;code class=&quot;language-text&quot;&gt;&amp;lt;h1&gt;&lt;/code&gt; elemre kattintva automatikusan megjelenjen néhány bekezdés, majd pár másodperc múlva tűnjön is el. Ehhez a jQuery forrásból kimásoljuk a slideDown definíciója után következő &lt;code class=&quot;language-text&quot;&gt;jQuery.fn[]&lt;/code&gt; kezdetű részt és azt módosítjuk.&lt;/p&gt;
&lt;p&gt;Azt szeretnénk, hogy addig ne fusson le a következő parancs, amíg az aktuális effekt le nem fut teljesen. Ezt úgy valósítjuk meg, hogy hozzáfűzzük a 2. parancsot az effekthez:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;slideDown&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;300&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;//ez csak akkor fut le, ha már a slidedown lefutott.&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;A várakoztatásra van előre elkészített eljárás jQuery-ben: a &lt;code class=&quot;language-text&quot;&gt;.delay()&lt;/code&gt;, ahol a zárójelben megadható, hogy mennyi idő teljen el addig (milliszekundumban), míg a következő utasítás lefut.&lt;/p&gt;
&lt;h3&gt;Összegzés&lt;/h3&gt;
&lt;p&gt;Fenntartom továbbra is, hogy érdemes elkezdeni és folytatni ezt a sorozatot. Hasznos időtöltés, nem megerőltető, de azért igényel némi gondolkodást, ha tényleg meg akarja valaki érteni. Ez a kivonat, amit itt publikálok, közel sem helyettesíti a videókat, nem azért csinálom. Inkább arra jó, hogy emlékeztet engem - és bárkit, aki a végigcsinálja a tanfolyamot -, hogy melyik részben mi is volt. Így, ha kérdés merülne fel, akkor gyorsabban megtalálható az a rész, amelyikben a kérdésre választ kaphatunk. 12 napnyi videót néztem meg eddig, az utóbbiak 10 percnél is kevesebbek. Mégis úgy érzem, jQuery-vel gyakorlatilag bármit meg lehet tenni és máris hasznosítható tudással rendelkezem. DE természetesen megnézem a többi részt is!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Mi az az energia?]]></title><description><![CDATA[Szükségesnek érzem, hogy ebben a témában először tegyük tisztába, hogy mi is az az energia és milyen fajtái vannak. Energia: munkavégző…]]></description><link>https://nandito.hu/2012-02-14-mi-az-az-energia/</link><guid isPermaLink="false">https://nandito.hu/2012-02-14-mi-az-az-energia/</guid><pubDate>Tue, 14 Feb 2012 09:16:39 GMT</pubDate><content:encoded>&lt;p&gt;Szükségesnek érzem, hogy ebben a témában először tegyük tisztába, hogy mi is az az energia és milyen fajtái vannak.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Energia&lt;/strong&gt;: munkavégző képesség&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Kicsit hétköznapiasabban fogalmazva: azért van, hogy el tudjuk végezni a dolgainkat, mivel a társadalom és a gazdaság működése energiát igényel.&lt;/p&gt;
&lt;h2&gt;Energiahordozók&lt;/h2&gt;
&lt;h3&gt;Primer&lt;/h3&gt;
&lt;h4&gt;Fosszilis&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;szén&lt;/li&gt;
&lt;li&gt;kőolaj&lt;/li&gt;
&lt;li&gt;földgáz&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Megújuló&lt;/h4&gt;
&lt;h5&gt;Feltétel nélkül megújuló&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Nap&lt;/li&gt;
&lt;li&gt;szél&lt;/li&gt;
&lt;li&gt;geotermia&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Feltételesen megújuló&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;biomassza&lt;/li&gt;
&lt;li&gt;tűzifa&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Atomenergia&lt;/h3&gt;
&lt;h3&gt;Szekunder&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;hőenergia&lt;/li&gt;
&lt;li&gt;villamos energia&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A primer energiahordozók a természetben megtalálhatók. Ezek közül a fosszilis kategóriában vannak azok, melyekből a készlet gyakorlatilag véges. A megújulók között a feltételesen megújulók azok, melyek az emberektől függetlenül “működnek”, ha az ember kihasználja, akkor nyer vele, ha nem, akkor nem - de azok akkor is működnek. A feltételesen megújuló annyiban más, hog ezek is megtalálhatók a természetben és újra lehet termelni, de ehhez mesterséges beavatkozás szükséges - tehát ha egy erdőt kivágunk tűzifának, akkor sok energiát nyerünk vele, de ha nem ültetünk a helyére új fákat, akkor ez a forrás kiapad. Viszont azáltal, hogy fennáll az újraültetés lehetősége, maga a forrás megújítható. A primer energiák előnye, hogy jól tárolhatók, viszont hátránya, hogy nehezen és/vagy költségesen szállíthatók.&lt;/p&gt;
&lt;p&gt;Az energia azért kell, hogy valamilyen szükségletet kielégítsen. Viszont, a társadalomnak és a gazdaságnak nem közvetlenlenül az energiára van szüksége, hanem az azáltal létrehozott előnyre/könnyítésre - ami az ahhoz kapcsoldó szükségelet kielégíti -, ez többnyire mechanikai- vagy hőenergia formájában jelenik meg (mozogjon az autó, legyen fűtés a házban). A szekunder energiahordozó már az, amit a primer energiahordozókból előállítottak az “erőmű” által: hő- és villamos energia. Ezek könnyeben szállíthatók (vezetéken), viszont a szállítás sok esetben veszteséggel jár. Ráadásul a szekunder energia tárolása nehézkes és szintén veszteséges.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[jQuery 30 nap alatt I. rész]]></title><description><![CDATA[Tutsplus.com ajánlata a következő: megtanítja nekem (és bárki másnak is) 30 nap alatt a jQuery használatát ingyen. Ez az ajánlat több…]]></description><link>https://nandito.hu/2012-02-09-jquery-30-nap-alatt-i-resz/</link><guid isPermaLink="false">https://nandito.hu/2012-02-09-jquery-30-nap-alatt-i-resz/</guid><pubDate>Thu, 09 Feb 2012 20:52:39 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;http://tutsplus.com/&quot;&gt;Tutsplus.com&lt;/a&gt; ajánlata a következő: megtanítja nekem (és bárki másnak is) 30 nap alatt a jQuery használatát ingyen.&lt;/p&gt;
&lt;p&gt;Ez az ajánlat több szempontból is vonzó számomra:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Érdekel a jQuery&lt;/li&gt;
&lt;li&gt;Anyagi vonzattól mentes&lt;/li&gt;
&lt;li&gt;Nincs semmi veszítenivaló&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Az oktatás úgy működik, hogy e-mail címünk megadása és megerősítő e-mailben megfelelő linkre kattintás után naponta kapunk egy linket, ami egy videóra mutat. &lt;a href=&quot;http://notes.envato.com/team/meet-the-staff-jeffrey-way/&quot;&gt;Jeffrey Way&lt;/a&gt; tartja az “előadásokat”, aki az &lt;a href=&quot;http://envato.com/&quot;&gt;Envato&lt;/a&gt; online oktatóközpont egyik tanára. Korábban már találkoztam vele egy &lt;a href=&quot;http://www.youtube.com/watch?v=cMcEgOPza8A&quot;&gt;Rails videóban&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Úgy döntöttem, hogy nagy vonalakban, vázlatosan leírom az aktuális napi videó tartalmát. Ez abból a szempontból is jó, hogy emlékeztet arra, hogy mit hol is láttam, így egyszerűbb lesz a visszakeresés vagy utánanézés. Mivel ezek a kis vázlatok nem hosszúak, tényleg csak pár címszó, esetleg megjegyzendő példa, így nem minden nap születik róla bejegyzés, hanem mondjuk 6 részenként.&lt;/p&gt;
&lt;h4&gt;Íme az első hat nap tanulsága:&lt;/h4&gt;
&lt;h3&gt;1. nap&lt;/h3&gt;
&lt;p&gt;Egyből 2 videót is kaptam (mármint linket, amin keresztül online nézhetem, nem kell letölteni). Egyik egy rövid (38 másodperces) ismertető Jeffrey Way-től, az oktatótól. Itt elmondja, hogy adjak neki napi 15 percet és 30 nap múlva jQuery pro leszek. Jó.&lt;/p&gt;
&lt;p&gt;A második videó már 11 perces (1 mp híján). Lehetőség van a videó letöltésére és a projekt fáljok letöltésére is. Ez a rész a jQuery library-król, letöltésükről és html kódba illesztésükről, és a selector-okról szól. Teljesen jól érthető, követhető és logikus. Az alapoktól kezdi a tanfolyamot (nagyon helyesen), de tény, hogy ezekkel már tisztában voltam, mivel kicsit tanultam jQuery-t. Viszont, ha nem tanultam volna, akkor most megértettem volna.&lt;/p&gt;
&lt;h3&gt;2. nap&lt;/h3&gt;
&lt;p&gt;7 perces videó, abból is csak egy. Tarthatónak tűnik a napi 15 perc – nyilván ha magam is végig próbálom a videóban bemutatottakat, akkor máris megvan a negyedóra. A document.ready kerül bemutatásra. Egy html oldal betöltésekor a böngésző soronként értelmezi a html-t így, ha a jQuery kód előbb van, mint az kódrész, amin változtatni kell, akkor „meg kell neki mondani”, hogy várjon, amíg a teljes oldal (DOM – Document Object Model) be nem tölt, és csak aztán fusson le. Erre szolgál a &lt;strong&gt;$(document).ready(funtion{});&lt;/strong&gt;, vagy rövidebben: &lt;strong&gt;$(function(){});&lt;/strong&gt; (előbbi érthetőbb, utóbbi rövidebb). Innen eredhet a napi tananyag elnevezése is: „Not so fast, jQuery” – azaz „Ne olyan gyorsan, Tudjukki”.&lt;/p&gt;
&lt;h3&gt;3. nap&lt;/h3&gt;
&lt;p&gt;Bizonyos metódusok (eljárások) kerülnek bemutatásra. Ezeket össze lehet keverni, - tapasztalatom szerint - kis gyakorlást igényelnek, de logikusak. Azért itt van pár példa:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;$(’ul’).children(’li’);&lt;/code&gt; csak a közvetlen li-t jelöli ki, ami az ul-on belül van. Ha az ul-on belüli li-ben van egy másik lista elemekkel, akkor azok nem lesznek kijelölve.&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;$(’ul’).find(’li’);&lt;/code&gt; nem csak a közvetlen listaelemeket jelöli ki, hanem azokat is, amik egy, vagy több szinttel lejjebb vannak, tehát az mindazt, ami az &lt;code class=&quot;language-text&quot;&gt;&amp;lt;ul&gt;&lt;/code&gt; és &lt;code class=&quot;language-text&quot;&gt;&amp;lt;/ul&gt;&lt;/code&gt; tag között van.&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;$(’ul’).children(’li’).eq(2);&lt;/code&gt; a 3. listaelemet jelöli ki (mivel a számozás 0-tól indul).&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;$(’ul’).children(’li’).eq(1).next();&lt;/code&gt; ez is a 3. listaelemet jelöli ki. A next() a következő a soron következő, ugyanazon tulajdonságú elemre mutat.&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;$(’ul’).children(’li’).eq(3).prev();&lt;/code&gt; ez is a 3. listaelemet jelöli ki.&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;$(’li’).parent();&lt;/code&gt; a közvetlen szülő kijelölése (zárójelben megadható a tag neve, ID-je vagy osztálya)&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;$(’li’).parents(.container);&lt;/code&gt; nem csak a közvetlen szülő, hanem az összes &lt;code class=&quot;language-text&quot;&gt;&amp;lt;li&gt;&lt;/code&gt;-t közbezáró tag között keresi az összes container osztállyal rendelkezőt és azt/azokat jelöli ki.&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;$(’li’).closest(.container);&lt;/code&gt; annyiban tér el az előzőtől, hogy csak az adott listaelemhez legközelebbit jelöli ki, ha esetleg attól távolabb is van, azt már nem.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4. nap&lt;/h3&gt;
&lt;p&gt;Ez a nap az eseményekről (events) szól. Az oktató (Jeffrey) egy alapszintű honlaphoz készít css stíluslap cserélő scriptet. Szó esik a this-ről. Ez a következőképp néz ki:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;’button’&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;click&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ilyenkor, ha egy gombra kattintunk, akkor a konzolban megjelenik az a gomb (html formában), amelyikre kattintottunk. Tehát a this egy olyan érték a függvényen belül, ami az aktuálisan kiválasztott/folyamatban lévő értéket adja vissza. Különbség van a sima this és a &lt;code class=&quot;language-text&quot;&gt;$(this)&lt;/code&gt; között!&lt;/p&gt;
&lt;p&gt;Másik fontos dolog, amire rámutat ez a videó, az a változók használata. Pl.:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;var uls = $(’ul’);&lt;/code&gt; ezáltal nem kell állandóan leírni, hogy &lt;code class=&quot;language-text&quot;&gt;$(’ul’)&lt;/code&gt;, ha újra azt akarjuk használni, hanem helyette csak azt, hogy uls. Ez azért is jó, mert nem kell mindig az eseménynek DOM-ba „ugrani”, vagyis kevésbé terheli a böngészőt.&lt;/li&gt;
&lt;li&gt;Adott elem attribútuma módosítható az attr-al a következőképp: &lt;code class=&quot;language-text&quot;&gt;$(’.link’).attr(’href’,’jaj.css’);&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;.siblings()&lt;/code&gt;: a kiválasztott elemmel azonos tulajdonságú és azonos szinten (pl.: ugyanazon div-ben) lévő másik elemet/elemeket választja ki.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5. nap&lt;/h3&gt;
&lt;p&gt;Ma egy táblázatszerű listát készítünk, ahol az egyes cellák felé mozgatva az egeret, jQuery-szerűen lenyílik egy kis sáv – lejjebb tolva az alatta lévő cellákat. Ha másik cella felé mozgunk, akkor a korábban lenyitott visszacsúszik (eltűnik) és lenyílik az éppen aktuális. A létrehozás ismét a váz megalkotásával kezdődik. Itt számomra új elem jelent meg, a &lt;dl&gt;&lt;dt&gt;&lt;/dt&gt;&lt;dd&gt;&lt;/dd&gt;&lt;/dl&gt; felépítésű „definíciós lista”. Szegyén-nem szégyen, nem láttam még ilyet (vagy legalábbis nem tűnt fel) és nem is volt rá szükségem. Példa rá a w3schoolból:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;dl&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;dt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Coffee&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;dt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;dd&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;- black hot drink&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;dd&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;dt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Milk&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;dt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;dd&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;- white cold drink&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;dd&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;dl&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Másik érdekesség számomra a Chrome Autosave plugin, ami lehetővé teszi, hogy a Chrome-on belül szerkesszük a CSS fájlt, ezáltal gyakorlatilag WYSIWYG (What You See Is What You Get - Kapod, amit látsz) szerkesztőt készítve a böngészőből.&lt;/p&gt;
&lt;p&gt;CSS-el egész ügyes kereteket (border)-t állít össze Jeffrey. Kiderült, hogy a CSS3-ban már van olyan, hogy &lt;code class=&quot;language-text&quot;&gt;:nth-last-child(2)&lt;/code&gt; – ami az adott felsorolásban az utolsó előtti elemet jelenti.&lt;/p&gt;
&lt;p&gt;Használt effektek: a &lt;code class=&quot;language-text&quot;&gt;.slideDown()&lt;/code&gt; és a &lt;code class=&quot;language-text&quot;&gt;.slideUp()&lt;/code&gt;. A zárójelbe írt szám az animáció sebessége ms-ban.&lt;/p&gt;
&lt;h3&gt;6. nap&lt;/h3&gt;
&lt;p&gt;Ma nincs videó. Helyette kisZH – vagyis gyors kvíz az eddig tanult alapokból. Nem nehéz, tényleg csak azokat kérdezte, amiket elmondott. 1 hibám volt, ami igazából annyira nem is volt hiba, csak a kérdésre, hogy „Mivel jelölök ki azonos szinten az aktuális elemen kívül minden mást?” annyit írtam, hogy „siblings” és lehet, azt kellett volna, hogy „siblings()”. Ezzel együtt is 92% lett a teszt, jó lenne egyetemen is ilyeneket írni, de hát az élet nem habostorta és a BME nem diplomagyár.&lt;/p&gt;
&lt;h3&gt;Konklúzió&lt;/h3&gt;
&lt;p&gt;Eddig egy napot sem hagytam ki és nem is tervezem a továbbiakban sem. A léptékek, ahogyan Jeffrey Way halad, teljesen jók, érthetően beszél és jól elmagyarázza a dolgokat. Láthatóan remek szakember, legtöbb apróságra kitér és elmondja, mi miért úgy működik ahogyan, és mi lenne másképp, ha mást máshogyan csinálna.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[RubyMine telepítés és beállítás]]></title><description><![CDATA[Elmondom én mi a bajom nekem a Ruby on Rails-el (RoR-ral). A telepítése és beállítása. Jól lehet, én vagyok primitív, de nekem gyakorlatilag…]]></description><link>https://nandito.hu/2012-02-05-rubymine-telepites-es-beallitas/</link><guid isPermaLink="false">https://nandito.hu/2012-02-05-rubymine-telepites-es-beallitas/</guid><pubDate>Sun, 05 Feb 2012 21:34:08 GMT</pubDate><content:encoded>&lt;p&gt;Elmondom én mi a bajom nekem a Ruby on Rails-el (RoR-ral). A telepítése és beállítása. Jól lehet, én vagyok primitív, de nekem gyakorlatilag semmi nem sikerült elsőre eddig, amikor valamely tutorialt csináltam végig, vagy saját ötletet próbáltam számomra logikus módon megvalósítani.&lt;/p&gt;
&lt;p&gt;Valahol mindig gubanc volt/van. Arra tippelek, hogy direkt csinálják ezt a fejlesztők, hogy ne lehessen Windows 7 alatt bárkinek csak úgy Ruby on Rails-el webes alkalmazásokat készíteni. Mikor egyetemen tanultam RoR-t, akkor Linuxon mutatták, hogy mi merre, így virtuális gépre feltéve egy Ubuntu Linuxot én is azon keresztül készítettem a házi feladatomat. Kényelmetlennek tartottam ezt, mivel - bár nem ismeretlen számomra a Linux, de Windowshoz vagyok szokva. Nem szeretek parancssorban zsonglőrködni, kattintgatni szeretek.&lt;/p&gt;
&lt;p&gt;Nézelődés közben ma ráakadtam a &lt;a href=&quot;http://www.jetbrains.com/ruby/index.html&quot;&gt;Jetbrains RubyMine&lt;/a&gt; Ruby on Rails &lt;a href=&quot;http://hu.wikipedia.org/wiki/Integr%C3%A1lt_fejleszt%C5%91i_k%C3%B6rnyezet&quot;&gt;IDE&lt;/a&gt;-re (Integrated Development Environment). Az integrált fejlesztői környezet - mint a nevéből is kiderül - tartalmazza a fejlesztéshez szükséges eszközöket, mint például egy szövegszerkesztőt, fordítót, hibakeresőt, stb. Ez a RubyMine 30 napig ingyenes, gondoltam kipróbálom, nincs mit veszíteni. Elég terjedelmesre csinálta a cseh fejlesztőcsapat, mérete majdnem 100 mb. Telepítése nem bonyolult, setup.exe &gt; pipa + next &gt; next &gt; stb. Első indításkor ajánlja, hogy adjuk meg a licenszkódot, vagy aktiváljuk a 30 napos próbalicenszet.&lt;/p&gt;
&lt;p&gt;Akkor készítsünk egy próbaprojektet! (Azaz Create new projekt). A projektnév, elérési út megadása és a “Rails Application” kiválasztása után kéri, hogy adjuk meg a Ruby interpretert (egészségedre), Rails verziót, Rails template-et, JavaScript library-t és van még két jelölőnégyzet: egyik adatbázist, másik a test fájlok kihagyását ajánlja. Itt kicsit megfőttem, mivel az első mezőben (az interpreteresnél) valami [No SDK] (vagy hasonló) jelent meg, Rails verziót sem talált, és gondolom ezek miatt a többi opció nem is volt elérhető/módosítható, még az OK gomb sem. Rájöttem, hogy bár összeszedett programnak tűnik ez a RubyMine, de annyira mégsem hülyebiztos, hogy csak úgy sipsupp kész legyen. A &lt;a href=&quot;http://rubyonrails.org/download&quot;&gt;rubyonrails.org/download&lt;/a&gt; oldalról le kell tölteni a windows-os telepítőjét a Ruby-nak (én a legújabb, 1.9.3-at töltöttem). Telepítőfájl, rákattintva és a megszokott next &gt; next &gt; next &gt; finish-el telepíthető. Visszalépve a RubyMine projekthez interpreternek adjuk meg a feltelepített Ruby-nkat. Ehhez tallózással keressük meg a &amp;#x3C;ahová a ruby-t tetted&gt;\bin\ruby.exe-t. Nálam tehát így néz ki: C:\Ruby193\bin\ruby.exe. Erre kattintva már varázslatszerűen elindult mindenféle egyéb folyamat, települt a Rails (még meg is kérdezte, hogy melyik verziót szeretném - de drága). Lehetőségem akadt már adatbázist és JavaScript library-t is választani. JQuery és MySql teljesen jó lesz nekem.&lt;/p&gt;
&lt;p&gt;A projekt mappájában végre megjelentek a RoR-nál szokásos struktúrában rendezett fájlok. A RubyMine kis üzenetek formájában kiabált, hogy hiányoznak bizonyos gem fájlok, kattintsak oda a telepítéshez. Így is tettem, de a konzolban és az újra megjelenő üzenetben láttam, hogy nem ért a végére. Ajánlotta, hogy telepítsem fel a Development Kit-et, aminek a letöltési útvonalát is megadta és azt is, hogy a &lt;a href=&quot;https://github.com/oneclick/rubyinstaller/wiki/Development-Kit&quot;&gt;github&lt;/a&gt;-on találok leírást a telepítéshez. Egy önkicsomagoló 7z fájlt találtam, ez kicsomagolta magát és parancssorral ide navigálva itt kell kiadni a ruby dk.rb init parancsot. A parancssor azonban visszaszólt, hogy nem ismer olyan parancsot, hogy “ruby”. Némi keresgélés után rátaláltam, hogy ahhoz, hogy ismerje a parancsot, meg kell adni annak az elérési útvonalát. Ennek a menete a következő: start menü - computer (jobb klikk) - properties - advenced system settings - environment variables gomb (advanced fülön) és itt a system variables között a Path nevűt kell megkeresni és szerkeszteni. A jelenleg ott lévő sor végére pontosvesszőt kell tenni, aztán odamásolni a ruby.exe lelőhelyét - ami nálam továbbra is C:\Ruby193\bin. Ezután zárjuk be a parancssort, ha korábban megnyitva hagytuk és indítsunk egy újat, hogy frissüljön fel a fantáziája. Ekkor már működött a ruby parancs és a github-os leírást követve sikerült a Development Kit telepítése. A tálcára tett RubyMine-ba visszalépve láttam, hogy megint aktivizálta magát - gondolom észlelte, hogy meglett a hiányzó láncszem és le tudott futni a bundle install, amivel a probléma volt.&lt;/p&gt;
&lt;p&gt;Egyáltalán nem biztos, hogy másnál is fellépnek ugyanezek a hibák. Azt nem értem igazából, hogy miért kell ez a sok kínlódás, miért nem tud valami egyből normálisan működni. Innentől kezdve aztán mehet minden rendesen, ez az IDE tényleg jónak látszik - a beállításokban jól testreszabhatjuk és komfortossá tehetjük, sőt, még az általam újabban egyre kedveltebb Zen Coding-ot is ismeri.&lt;/p&gt;
&lt;p&gt;Az a legtöbb, hogy a RubyMine fejlesztők a honlapon a Quick Guide (gyors útmutató) alatt még írják is, hogy mielőtt elkezdesz valamit is csinálni, telepíts ezt-azt. Persze nem olvastam el, pedig olvashattam volna, így nem is lenne jogos a felháborodásom - nem is háborodok fel.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Weboldalkészítés]]></title><description><![CDATA[Ha beszélgetek valakivel és szóba kerül, hogy foglalkozom weboldalak készítésével, akkor gyakran ráugranak a témára, hogy csináljak nekik…]]></description><link>https://nandito.hu/2012-02-01-weboldalkeszites/</link><guid isPermaLink="false">https://nandito.hu/2012-02-01-weboldalkeszites/</guid><pubDate>Wed, 01 Feb 2012 16:49:09 GMT</pubDate><content:encoded>&lt;p&gt;Ha beszélgetek valakivel és szóba kerül, hogy foglalkozom weboldalak készítésével, akkor gyakran ráugranak a témára, hogy csináljak nekik, vagy mondjam el, hogyan kell csinálni. Már ott járnak, hogy letöltöttek egy HTML-szerkesztőt, vagy MS FrontPage-et, csak nem tudják, hogy mi mivel van, illetve hogy mit kell beírni a böngészőbe, hogy az jelenjen meg, amit ők csináltak.&lt;/p&gt;
&lt;p&gt;A weboldal készítés nem olyan nagy ördöngösség, de lehet úgy is csinálni, hogy az legyen. Minél több időt szán rá az ember, annál jobb lesz/lehet - ez persze nem minden esetben igaz, mert előfordulhat, hogy túlzásba esik az illető akár design, akár kódolás terén. Abban azonban egyet érthetünk, hogy egy weboldalnak ma már nem elég az, hogy csak HTML és CSS legyen, kell valami, ami aktívvá teszi, működésbe hozza és lehetőséget biztosít a dinamikus bővítésre. Szét lehet tehát választani a weboldalkészítést kinézetre és az azt futtató programra (motorra).&lt;/p&gt;
&lt;h2&gt;Nézzük, mik a lehetőségek&lt;/h2&gt;
&lt;h3&gt;Készítesz weboldalt magadtól, nulláról&lt;/h3&gt;
&lt;p&gt;Legtöbben ezt gondolják a legkézenfekvőbbnek. Előnye, hogy a kész weboldal valószínűleg teljesen egyedi lesz és érteni biztosan fogja a készítő, hogy mi hogyan működik. A hátránya viszont, hogy rajta kívül más nem biztos, hogy érti és ami nagyobb “baj”, hogy az igényes munka rengeteg időbe telik és szaktudást igényel. Egy hatékony módja ennek a folyamatnak, ha először megrajzolja az ember a weboldalt, majd az alapján megírja a HTML és CSS fájlokat, leellenőrzi a leghasználtabb böngészőkben, hogy jól jelenik-e meg, majd php, asp.net, ruby on rails, vagy akármi mással dinamikussá és működőképessé teszi. Ezeket a lépéseket lehet keverni - például egyből HTML-t ír a készítő és menet közben dönti el, hogy mi hol legyen -, de akkor előfordulhat, hogy nem látja a végét és elfelejti, mit is akar. Ráun a készítésre és bajlódásra, folyton újrakezdi egy új ötlet alapján (tapasztalat) - persze nem minden esetben.&lt;/p&gt;
&lt;h3&gt;Letöltesz sablont és azt módosítgatod, majd készítesz hozzá egy motort&lt;/h3&gt;
&lt;p&gt;Ezt a módszert azok használják, akik nem értenek eléggé a HTML/CSS-hez, vagy nincs hozzá türelmük. Az Interneten ingyenes HTML/CSS weboldal-sablonok tömkelege fellelhető (például: Google: free html template). A letöltött sablon alá egy motort ír a készítő - ehhez szintén kell a programozási ismeret. A sablon készítői gyakran feltüntetik nevüket és esetleg elérhetőségüket a sablon alján (vagy akárhol máshol). Ezt természetesen ki lehet törölni, de határozottan nem etikus. Olyan is előfordul, hogy a készítő csak a forráskódban hagyja ott lábnyomát kommentként. Ami viszont még jó ezekben a sablonokban, hogy lehet tanulni belőlük. Ha az ember érdeklődik a HTML és CSS iránt, akkor ez egy jó tanulási lehetőség lehet: például letölt egy sablont átnézi a kódot, majd megpróbálja magától leírni és folyamatosan figyeli, hogy mi történik az egyes kódsorok beírása után. Ha elakad, ott az eredeti sablon, abból lehet lesni, vagy ellenőrizni.&lt;/p&gt;
&lt;h3&gt;Használsz egy kész motort és töltesz le hozzá sablont&lt;/h3&gt;
&lt;p&gt;Ezt szoktam leginkább ajánlani annak, aki nem foglalkozik - és nem is akar foglalkozni - HTML, CSS és programnyelvek tanulásával. Előnye, hogy gyorsan, látványos weboldalt lehet létrehozni. Ezzel viszont az jár, hogy jó esély van rá, hogy néhány másik weboldal pont úgy fog kinézni, mint a miénk - mivel azt a sablont, amit mi letöltöttünk, más is ugyanúgy letöltheti és használhatja. Erre létezik megoldás: meg lehet venni a kinézet használatának kizárólagos jogát, vagy eleve rendelésre készítettünk kinézetet - vagy akár motort is. Visszatérve az ingyenes megoldásokhoz: ott vannak a CMS-ek (Content Management System). Ezeknek előnyük, hogy szakemberek készítik őket, az esetleges hibákat folyamatosan javítják, újításokat eszközölnek és biztosítják az új verziót a használóknak. Emellett moduláris felépítésük révén tetszőlegesen bővíthetők úgynevezett pluginokkal (bővítményekkel), melyeket legtöbb esetben szintén elérhetünk a CMS honlapján. Ilyen CMS például a &lt;a href=&quot;http://wordpress.org&quot;&gt;WordPress&lt;/a&gt; (kedvencem, én is ezt használom), a &lt;a href=&quot;http://drupal.org/&quot;&gt;Drupal&lt;/a&gt;, a &lt;a href=&quot;http://www.joomla.org/&quot;&gt;Joomla&lt;/a&gt;, stb. Ezek szinte mindenre jók - webáruház, blog, fórum, bemutatkozó oldal, közösségi oldal, stb. üzemeltetésére. Vannak specifikus CMS-ek, melyek adott funkció ellátására szolgálnak, például dedikált fórummotor a &lt;a href=&quot;http://www.phpbb.com/&quot;&gt;PHPBB&lt;/a&gt;, &lt;a href=&quot;http://www.invisionpower.com/products/board/&quot;&gt;Invision Power Board&lt;/a&gt; (ez utóbbi fizetős).&lt;/p&gt;
&lt;h3&gt;Használsz egy kész motort és készítesz hozzá kinézetet, vagy módosítod az eredetit&lt;/h3&gt;
&lt;p&gt;Ez a nekem való megoldás :). Labilis php és Ruby on Rails tudással a fejemben leginkább a WordPress CMS-t használom. Elég sok oktató leírás (tutorial) található arról, hogy mit hogyan lehet módosítani az egyéni kinézet kialakításához. Ez is igen időigényes és kell hozzá némi programozási ismeret is. (Most a Radontastic sablont használom ezen a blogon.) Motornak ugyanazokat a CMS-eket ajánlom, mint az előző bekezdésben. Olyanra is van lehetőség, hogy egy tetsző témát letöltesz és ami nem tetszik, kiveszed belőle, vagy átteszed máshová, esetleg új dolgokat adsz hozzá. Ilyenkor is figyelni kell azonban, hogy az eredeti szerző nevét ne tüntessük el teljesen.&lt;/p&gt;
&lt;h2&gt;Na de mit kell beírni a böngészőbe, hogy megjelenjen az oldalam?&lt;/h2&gt;
&lt;h3&gt;Ingyenes lehetőség&lt;/h3&gt;
&lt;p&gt;Regisztrálsz egy ingyenes tárhelyet és domaint - például az &lt;a href=&quot;http://atw.hu/&quot;&gt;atw.hu&lt;/a&gt;-nál, vagy &lt;a href=&quot;http://uw.hu/index.jsp&quot;&gt;uw.hu&lt;/a&gt;-nál. Ilyenkor kapsz némi tárhelyet, egy adatbázist és a hozzáféréshez szükséges címeket, felhasználóneveket, jelszavakat. Például: van egy Figaro Szalon nevű fodrászatod, amihez egy bemutató honlapot készítesz, akkor beregisztrálhatod ingyen a figaroszalon.atw.hu címet. Ide FTP-n keresztül kerül fel a honlap. Azt még tudni érdemes az ingyenes tárhelyekkel kapcsolatban, hogy leggyakrabban a tulajdonosok abból tartják fenn a szolgáltatást, hogy a honlapod fölött a böngészőben reklámcsíkot jelenítenek meg.&lt;/p&gt;
&lt;h3&gt;Fizetős lehetőség&lt;/h3&gt;
&lt;p&gt;Itt jönnek be a képbe az úgynevezett hoszting cégek. Szükség van egy domain névre és tárhelyre. A domain név ez esetben már tetszőleges - az előző példánál maradva: figaroszalon.hu, .com, .eu, akár több is ugyanahhoz a weboldalhoz. A domain név regisztrálása - legtöbb esetben - nem pár perc és nem ingyenes. A .hu végződés 3000 Ft/2 év, a .com 2000 Ft/év körüli áron érhető el. A tárhelyről és a kapott szolgáltatásokról szerződést szoktak írni a hoszting céggel. Tárhelytől függően, havi 800-1000 Ft-tól (egészen havi sok ezerig) kaphatunk szolgáltatáscsomagot. A csomag árába szintén beleszól az, hogy milyen alkalmazások futtatását engedélyezi (php, perl, stb.), hányféle adatbázist biztosít, mennyi aldomaint, illetve mennyi saját postafiókot engedélyez(ami például: &lt;a href=&quot;mailto:info@figaroszalon.hu&quot;&gt;info@figaroszalon.hu&lt;/a&gt; - tehát tetszőlegesen választható, egyedi).&lt;/p&gt;
&lt;p&gt;Az ingyenes lehetőség arra tökéletes, hogy valaki megértse, hogy mi hogyan működik. Azonban cégeknek, vagy komolyabb szándék esetében érdemes rááldozni a fizetős szolgáltatás igénybevételére. Nem mutat jól egy céges honlap tetején a reklám és az is rontja az imázst, hogy a honlap címében is van reklám (mert hát a .atw.hu-ban az “atw” bizony reklám). Ráadásul nem szólhatunk bele, hogy milyen hirdetés jelenjen meg oldalunkon, így előfordulhat, hogy pont a konkurencia hirdetése jelenik meg.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[WordPress RSS kategóriák szerint]]></title><description><![CDATA[Előfordul - mint jelen esetben is -, hogy egy blog több témában publikál bejegyzéseket. Az ide tévedő olvasó esetleg érdekesnek találhat 1-…]]></description><link>https://nandito.hu/2012-01-25-wordpress-rss-kategoriak-szerint/</link><guid isPermaLink="false">https://nandito.hu/2012-01-25-wordpress-rss-kategoriak-szerint/</guid><pubDate>Wed, 25 Jan 2012 22:24:29 GMT</pubDate><content:encoded>&lt;p&gt;Előfordul - mint jelen esetben is -, hogy egy blog több témában publikál bejegyzéseket. Az ide tévedő olvasó esetleg érdekesnek találhat 1-1 témát, de ez az olvasó nem feltétlenül kíváncsi az összes téma összes bejegyzésére. Ha ez az olvasó gyakorta látogatja a honlapot és nem RSS olvasót használ, akkor ezzel nincs is gond, mivel oda kattint, ami számára érdekes.&lt;/p&gt;
&lt;p&gt;Azonban, ha RSS Feed Reader-rel - azaz hírolvasóval - böngészi az újdonságokat, akkor zavaró lehet, hogy azok is megjelennek, amire amúgy egyáltalán nem is kíváncsi.&lt;/p&gt;
&lt;p&gt;A WordPress alapból generál külön Feed-et minden kategóriának. Például, ha van egy “bútorok” kategóriánk, akkor annak az RSS csatornája a következő URL-en érhető el: &lt;a href=&quot;http://domain.com/category/butorok&quot;&gt;http://domain.com/category/butorok&lt;/a&gt;. (Amennyiben közvetlen linkeket használunk az alapértelmezett ?p=20, stb. linkek helyett. Ezek  beállítása: Beállítások (Settings) - Közvetlen linkek (Permalinks))&lt;/p&gt;
&lt;p&gt;Itt, ezen a blogon is elég eltérő témákban készítek bejegyzéseket, ezért jártam utána ezeknek. Létezik egy plugin: &lt;a href=&quot;http://wordpress.org/extend/plugins/category-specific-rss-feed-menu/&quot;&gt;Category Specific RSS feed Subscription&lt;/a&gt; néven. Ezt próbáltam először, de feltűnt, hogy az általa generált linkek a plugin kikapcsolt állapotában is működnek, így magam is elkészíthetek egy “Kategóriák szerinti RSS” menüt. Ehhez az admin felületen kell a Megjelenés (Appearance) - Menük (Menus) ponthoz navigálni magunkat, itt létrehozni egy új egyéni menüt és egyenként beírva az URL-eket már el is készítettük. Ezek után annyi csak a feladat, hogy a Widgetek menüben az “Egyéni menü” (Custom menu) névre hallgató widgetet a kívánt helyre mozgatjuk (például oldalsávra), kiválasztjuk a kis listában az előbb elkészített egyéni menüt és mentjük.&lt;/p&gt;
&lt;p&gt;A korábban említett plugin annyival tudott többet ennél, hogy egy RSS ikont tett a menüpontok elé, de cserébe alul a készítő a saját weboldalára mutató linket tett. Ráadásul a plugin beállításainál megadott kategóriaelnevezésekre és sorrendre nem is figyel.&lt;/p&gt;
&lt;p&gt;Később feltehetőleg kitalálok valamilyen színesítést, hogy valahol ebben a boxban jelenjen meg egy RSS ikon. Lehet a megoldás nem is az egyéni menü használata lesz, hanem egyszerű szöveg (HTML kód) hozzáadása az oldalsávhoz.&lt;/p&gt;
&lt;p&gt;Maga az RSS egyébként az RDF Site Summary-nek, vagy a Really Simple Syndication-nek a rövidítése. Akit érdekel, hogy pontosan mi is az és hogyan működik, az a &lt;a href=&quot;http://wordpress.org/extend/plugins/category-specific-rss-feed-menu/&quot;&gt;Wikipédián&lt;/a&gt; talál róla leírást.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[SiteBuild++]]></title><description><![CDATA[Többnyire sitebuilddel foglalkozom, de bele-bele fogok az ezt megelőző - grafikai, tervezési - és az ezt követő programozási munkálatokba is…]]></description><link>https://nandito.hu/2012-01-23-sitebuild/</link><guid isPermaLink="false">https://nandito.hu/2012-01-23-sitebuild/</guid><pubDate>Mon, 23 Jan 2012 21:15:28 GMT</pubDate><content:encoded>&lt;p&gt;Többnyire sitebuilddel foglalkozom, de bele-bele fogok az ezt megelőző - grafikai, tervezési - és az ezt követő programozási munkálatokba is.&lt;/p&gt;
&lt;p&gt;Egy weboldal elkészítése alapesetben a következő lépésekből áll:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Megrajzolják a weboldalt egy grafikus programmal&lt;/li&gt;
&lt;li&gt;A rajzból megcsinálják a HTML, CSS és JavaScript fájlokat tartalmazó vázat&lt;/li&gt;
&lt;li&gt;A vázat működőképessé és aktívvá teszik valamilyen rendszerrel (pl. PHP-val, ASP.net-tel, Ruby-val, stb.)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Jelen felsorolásban az egyszerűség kedvéért kihagytam a weboldal megrajzolását megelőző folyamatokat, mint például megrendelői igényfelmérés, tartalom szerinti átgondolás, stb. Ezekre külön oda kell figyelni, hogy ha megrendelésre dolgozik valaki, akkor pontosan azt kell kapnia a vevőnek, amit szeretne - esetleg annál többet, de kevesebbet nem. Ez a cégszerű sikeres működés egyik alapszabálya.&lt;/p&gt;
&lt;p&gt;Maga a sitebuilding (nyersfordításban: oldalépítés) az a folyamat, ahol egy weboldalt előkészítenek ahhoz, hogy egy programozó működőképessé tegye. Hasonlóképp: autógyártásnál egy tervező megrajzol egy autót, egy csapat megalkotja a karosszériát, egy másik csapat pedig legyártja a motort és beleteszi a vázba. A sitebuilder az, aki megalkotja a weboldal karosszériáját.&lt;/p&gt;
&lt;h3&gt;Munkaeszközök&lt;/h3&gt;
&lt;p&gt;A sitebuild abból a szempontból szerencsés, hogy nem igényel komoly befektetést, gyakorlatilag egy notepaddel is el lehet készíteni. Vannak az úgynevezett WYSIWYG (What you see is what you get - kapod, amit látsz) programok, amikkel a készülő weboldal megjelenési alakját folyamatosan látjuk. Ilyen (funkcióval is rendelkezik) a &lt;a href=&quot;http://www.adobe.com/products/dreamweaver.html&quot;&gt;Dreamweaver&lt;/a&gt;, a &lt;a href=&quot;http://panic.com/coda/&quot;&gt;Coda&lt;/a&gt;, ingyenesek közül a régen NVU, most &lt;a href=&quot;http://kompozer.net/&quot;&gt;Kompozer&lt;/a&gt;, stb. Ezek kezelése (is) tanulást igényel. Én nemes egyszerűséggel &lt;a href=&quot;http://notepad-plus-plus.org/&quot;&gt;&lt;strong&gt;NotePad++&lt;/strong&gt;&lt;/a&gt;-t használok, itt csak a kódot látom és kell nyomnom egy CTRL+S, ALT+Tab, CTRL+R kombinációt ahhoz, hogy lássam a munkám eredményét, de nekem ez jön be.&lt;/p&gt;
&lt;p&gt;Legtöbb esetben a grafikai állomány megnyitásához jól jön egy &lt;a href=&quot;http://www.adobe.com/hu/products/photoshop.html&quot;&gt;&lt;strong&gt;Photoshop&lt;/strong&gt;&lt;/a&gt;, ami megoldás, de ingyenes megoldásnak ott a &lt;a href=&quot;http://www.gimp.hu/&quot;&gt;GIMP&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Kell még &lt;strong&gt;néhány böngésző&lt;/strong&gt; is, a legnépszerűbbeket mindenképpen érdemes feltelepíteni: Firefox, Chrome, Safari, Internet Explorer, Opera. Az sem árt - ha a rendszer engedi -, ha a népszerű böngészők több, még a felhasználók körében fellelhető verziót is feltelepítünk, hogy lássuk, hogyan jelenik meg azokban a weboldal. Az Internet Explorer 9 esetében például ez már beépített eszköz, itt kapcsolgathatjuk a kompatibilitást.&lt;/p&gt;
&lt;p&gt;Ami még nagyon hasznos - főleg a tesztelésnél- , az  a böngészők fejlesztői eszköztára. Legtöbb böngészőben megtalálható. Számomra a leggyakrabban használt a &lt;a href=&quot;http://getfirebug.com/&quot;&gt;&lt;strong&gt;FireBug&lt;/strong&gt;&lt;/a&gt;, ami a Firefox kiegészítője.&lt;/p&gt;
&lt;p&gt;Előfordul, hogy egy kész, már php alapú rendszer (pl. Wordpress) témáját kell módosítani. Ez esetben érdemes feltelepíteni az adott tartalomkezelőt a localhostra. Ehhez persze kell néhány dolog (Apache, SQL) - a &lt;a href=&quot;http://www.apachefriends.org/en/xampp.html&quot;&gt;XAMPP&lt;/a&gt;, vagy &lt;a href=&quot;http://www.wampserver.com/en/&quot;&gt;WAMP&lt;/a&gt; tartalmaz minden szükséges eszközt, használata ilyenkor megkönnyíti a munkát, mivel nem kell mindig FTP-vel feltöltögetni a frissített fájlokat.&lt;/p&gt;
&lt;h3&gt;Állományok&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;HTML&lt;/strong&gt;: HyperText Markup Language. Ezt úgy tanultam még anno, hogy ez nem programnyelv, hanem csak jelölőnyelv (mint a nevében is benne van). Itt csak megjelenést írunk le, hogy mi mit követ és mit tartalmaz. Adhatunk meg formázási tulajdonságokat is, de ezt elegánsabb külön állományban megadni. Legújabb verziója az 5.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CSS&lt;/strong&gt;: Cascading Style Sheets. Kaszkádolt stíluslapok. Ezek írhatóak a HTML-be közvetlenül, vagy külön .css kiterjesztésű fájlba - ez utóbbi esetben szükséges hivatkozni a helyére a HTML kódon belül. A stíluslapokban kerülnek definiálásra az oldalon helyezkedő elemek tulajdonságai, mint például: szín, méret, elhelyezkedés, stb. Legújabb verziója a 3.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JS&lt;/strong&gt;: JavaScript. Ezekkel az oldal aktívvá tehető, dinamikusan tölthető be a tartalom, optimalizálható az oldal betöltése, különböző megjelenítési mód eszközölhető a különböző böngészőkhöz, stb. Ez már programozás. Objektumorientált, hasonlít a C-re.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;jQuery&lt;/strong&gt;: Az egyik legnépszerűbb JavaScript library (könyvtár). Ez azt jelenti, hogy letölthető a jQuery honlapjáról a legújabb, aktuális jquery.js, aminek használatával könnyen és gyorsan lehet látványos elemekkel (pl.: effektekkel, slideshow-val) gazdagítani az oldalt. A jquery.js gyakorlatilag egy JavaScript fájl, amiben egy fejlesztőcsoport előre megírt sok “funkciót”, amit mi egyszerűsítve meghívhatunk a mi weboldalunkra. Ezáltal egyedi nyelvezete van, de elég logikus, így gyorsan és könnyen tanulható.&lt;/p&gt;
&lt;p&gt;Ezeket használom én. Nem említettem, de van még rengeteg egyéb is. Ha majd azokkal is foglalkozok, azokról is írok.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[TabletPC körkép]]></title><description><![CDATA[A tabletPC piac egy feltörekvő piac, újabb és újabb szereplőkkel, ahol mindenki jobbat vagy többet akar nyújtani a fogyasztónak azonos áron…]]></description><link>https://nandito.hu/2012-01-22-tabletpc-korkep/</link><guid isPermaLink="false">https://nandito.hu/2012-01-22-tabletpc-korkep/</guid><pubDate>Sun, 22 Jan 2012 15:40:49 GMT</pubDate><content:encoded>&lt;p&gt;A tabletPC piac egy feltörekvő piac, újabb és újabb szereplőkkel, ahol mindenki jobbat vagy többet akar nyújtani a fogyasztónak azonos áron, vagy azonos hardverrel rendelkező eszközt adna el alacsonyabb áron. Ennek a versenynek köszönhetően az árak egyre lejjebb mennek.&lt;/p&gt;
&lt;p&gt;Másrészt, egy új, fejlettebb tablet megjelenése a régi tablet árát lejjebb nyomja. Pl.: az Apple kb $6-800-ért adta az ipad-et, de mikor megjelent az ipad2, akkor azt adták annyiért, így a raktáron maradt ipadeket nyilván olcsóbban adták, mint az újat.&lt;/p&gt;
&lt;p&gt;Mivel látható, hogy a fejlődés nagy ütemben történik, így tudható, hogy a most megvett tablet hamar elévültnek számíthat, ennek megfelelően az értéke is folyamatosan csökken – akárcsak a telefonoknál.&lt;/p&gt;
&lt;p&gt;Ez a fejlődés nem áll meg egyhamar, szóval azt várni, hogy „na mikor vegyek, amikor nem jelenik meg új”, hiba. Kivéve, ha egy jelentősen új termék jelenik meg, ami már nem tablet, hanem még annál is könnyebb, gyorsabb, menőbb. Ilyenre volt példa a laptopok térnyerése az asztali számítógépekkel szemben. Marketing szempontból a termékeknek meghatározható életgörbéje van, így: bevezetés, növekedés, érettség, hanyatlás. A bevezetési szakaszon szerintem már túljutottunk az első ipad megjelenésével. Nehéz meghatározni, de úgy gondolom még a növekedési szakaszban van a termék, tehát még nem érte el az érettség szintjét. Egyre több a vásárló, már nem csak az innovátorok vesznek tabletet, hanem a korai elfogadók is – de még közel sem terjedt el olyan széles körben, mint a laptop vagy a mobiltelefon.&lt;/p&gt;
&lt;p&gt;Az árat a gyárakat érő természeti katasztrófák, a szabadalmi perek és a gyárak dolgozói sztrájkjai növelhetik, de ez nem gyakori, inkább a túlzott raktárkészlet a jellemző, mint a hiány.&lt;/p&gt;
&lt;p&gt;Ezek tükrében mindenki mérlegelheti, hogy mennyire van neki szüksége tabletre. Az idő a vásárlónak dolgozik. Külföldön olcsóbb. Íme a jelenleg népszerűek közül néhány (szubjektív véleménnyel):&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;3g-s&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;SIM-kártya foglalattal rendelkeznek, így ha beleteszünk egy Internet-előfizetéssel rendelkező SIM-et, akkor ahol van térerő, tudunk netezni.&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;Motorola Xoom 3G&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;előny&lt;/strong&gt;: ilyen van nekem, gyors, jön rá frissítés, sokáig bírja az akkumulátor, szép kép, 32GB belső tárhely + bővíthető microSD-vel
&lt;strong&gt;hátrány&lt;/strong&gt;: viszonylag nehéz, nem tölthető USB-ről
&lt;strong&gt;ár&lt;/strong&gt;: 116 500 Ft&lt;/p&gt;
&lt;h3&gt;Motorola Xoom 2&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;előny&lt;/strong&gt;: adnak hozzá Motorola Stylus-t (ceruza), 200 mhz-el nagyobb órajelű processzor az elődhöz képest, strapabíró Gorilla Glass kijelző
&lt;strong&gt;hátrány&lt;/strong&gt;: nagyon drága ahhoz képest, hogy nem sokkal több az 1. xoom-nál.
&lt;strong&gt;ár&lt;/strong&gt;: 174 670 Ft&lt;/p&gt;
&lt;h3&gt;Archos 101 G9&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;előny&lt;/strong&gt;: felszereltséghez képest kedvező ár, ua felszereltség, mint a xoomnak, bővíthető tárhely (alapból 8 gb)
&lt;strong&gt;hátrány&lt;/strong&gt;: kevésbé ismert, új gyártó
&lt;strong&gt;ár&lt;/strong&gt;: 94 500 Ft&lt;/p&gt;
&lt;h3&gt;Apple iPad 2 16Gb 3G&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;előny&lt;/strong&gt;: gyors, nagyon össze van rakva, könnyű, vékony, menő és kényelmes kezelés
&lt;strong&gt;hátrány&lt;/strong&gt;: nem lehet rá tört alkalmazást telepíteni, rátölteni dolgokat iTunessal lehet csak (azt hiszem)
&lt;strong&gt;ár&lt;/strong&gt;: 141 990 Ft&lt;/p&gt;
&lt;h3&gt;Samsung Galaxy Tab 10.1 16Gb&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;előny&lt;/strong&gt;: könnyű és vékony, szokásos jó hardver
&lt;strong&gt;hátrány&lt;/strong&gt;: nincs USB port és SD-kártya bővítési lehetőség
&lt;strong&gt;ár&lt;/strong&gt;: 123 650 Ft&lt;/p&gt;
&lt;h2&gt;Wi-Fi only&lt;/h2&gt;
&lt;p&gt;Csak akkor tudunk rajta netezni, ha van a közelben Wi-Fi hotspot, amihez csatlakozhatunk.&lt;/p&gt;
&lt;h3&gt;Asus Transformer TF101 16Gb&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;előny&lt;/strong&gt;: lehet hozzá dokkolható billentyűzetet venni, jól bírja az akkumulátor, könnyű, jó anyagból készült, gyors
&lt;strong&gt;hátrány&lt;/strong&gt;: drága, ASUS magyar supportot nem nagyon dicsérik
&lt;strong&gt;ár&lt;/strong&gt;: 189 900 Ft&lt;/p&gt;
&lt;h3&gt;Toshiba AT100&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;előny&lt;/strong&gt;: szinte ugyanaz a hardver, mint a xoomnak
&lt;strong&gt;ár&lt;/strong&gt;:  129 899 Ft&lt;/p&gt;
&lt;h3&gt;Apple iPad 2 16 Gb WiFi-only&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;előny&lt;/strong&gt;: gyors, nagyon össze van rakva, könnyű, vékony, menő és kényelmes kezelés
&lt;strong&gt;hátrány&lt;/strong&gt;: nem lehet rá tört alkalmazást telepíteni, rátölteni dolgokat iTunessal lehet csak (azt hiszem)
&lt;strong&gt;ár&lt;/strong&gt;: 119 550 Ft Magyarországon, külföldön $499&lt;/p&gt;
&lt;h3&gt;Amazon Kindle Fire&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;előny&lt;/strong&gt;: hardvereihez képest igen jó árban van
&lt;strong&gt;hátrány&lt;/strong&gt;: szerintem a 7 colos kijelző kicsi, néhány ember szerint kényelmetlen helyen van a gombja
&lt;strong&gt;ár&lt;/strong&gt;: 74 500 Ft Magyarországon, külföldön $199&lt;/p&gt;
&lt;p&gt;&lt;em&gt;(az árak Google-ben, árukereső.hu-n, árgépen talált magyar boltok árai)&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Váratnak magukra, de ígéretesek:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Apple iPad 3&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Google Nexus Tablet&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Windows 8 megjelenése&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Android, iOS, Windows 8&lt;/h2&gt;
&lt;p&gt;A tableteken operációs rendszer fut. A címben szereplők közül az első kettő terjedt el. A legnépszerűbb tableteken – ami az ipad, azokon az Apple iOS-e fut. Ezeknek előnye, hogy nagyon gyorsak, szerintem ritkábban fagynak, mivel minden ipad egyforma, ezért az alkalmazásoknál nincs felbontás- és kompatibilitás-probléma. Kezelésükre ötletes gesztusok használhatók, például az alkalmazásváltáshoz 4 ujjal a kijelzőt érintve egyszerűen lapozhatunk, valamint összezúzó mozdulattal bezárhatjuk. Hátrányuk (?), hogy csak az appStore-ból letöltött alkalmazások telepíthetők rá, tehát az alkalmazást meg kell venni mindenkinek. Ehhez szerintem (aljas módon) nincsenek hozzászokva az emberek. Egyébként az alkalmazások nem olyan drágák, 1-10 dollárba kerülnek általában, de rengeteg ingyenes változat van. Másik hátrány, hogy nem támogat widgeteket, így nem tehető ki a kezdőképernyőre kis képecske, időjárás-jelentés, bejövő levelek előnézete, stb.&lt;/p&gt;
&lt;p&gt;Az Android a Google-é, az pénzeli, birtokolja. A sokféle kijelző eltérő mérete miatt az alkalmazások korábban nem, vagy csak rosszul jelentek meg. Erre a fejlesztők már a terjedés miatt jobban odafigyelnek, így ez a probléma háttérbe szorul. Mivel az operációs rendszer és a hardver gyártója nem ugyanaz, így a frissítések általában késnek, egy idő után pedig elmaradnak. Viszont az Androidos tabletek olcsóbbak, lehet rájuk widgeteket pakolni, telepíteni rá mindenféle kétes eredetű alkalmazást. Magam is ezt a megoldást választottam. Ráadásul nagyon jól összeszinkronizálható PC-vel és androidos telefonnal.&lt;/p&gt;
&lt;p&gt;A Windows 8 még meg sem jelent, de már ígérgetik. A Microsoft újabbak kissé szét van esve, több bevétele van az Androidért kapott licenszdíjakból, mint a saját mobiltelefon operációs rendszeréből (Windows Mobile 7). Jósolják, hogy a Windows 8 is felforgatja majd a tablet piacot, de ha ez olyan mértékű felforgatás lesz, mint annak idején a Windows Phone 7-tel történő mobilpiac felforgatás volt, akkor nem kell nagy bummra számítani.&lt;/p&gt;
&lt;p&gt;További operációs rendszerek a HP által használt webOS, vagy a RIM (Blackberry gyártó) QNX-alapú rendszere, de az ezeket futtató készülékek (HP Touch és RIM PlayBook) gyakorlatilag csak veszteséget hoztak a gyártóknak – a korábban aranyárban meghirdetett tableteket most fillérekért próbálják kiszórni a raktárból.&lt;/p&gt;</content:encoded></item></channel></rss>