<?xml version="1.0" encoding="UTF-8" standalone="no"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" version="2.0">

<channel>
	<title>Mika Koivisto's Stuff that Matters</title>
	<atom:link href="https://mikakoivisto.fi/feed/" rel="self" type="application/rss+xml"/>
	<link>https://mikakoivisto.fi/</link>
	<description></description>
	<lastBuildDate>Sun, 16 Feb 2025 16:04:31 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://mikakoivisto.fi/wp-content/uploads/2016/04/cropped-mk_icon-32x32.png</url>
	<title>Mika Koivisto</title>
	<link>https://mikakoivisto.fi/</link>
	<width>32</width>
	<height>32</height>
</image> 
<atom:link href="https://pubsubhubbub.appspot.com" rel="hub"/>
<atom:link href="https://pubsubhubbub.superfeedr.com" rel="hub"/>
<atom:link href="https://websubhub.com/hub" rel="hub"/>
<atom:link href="https://mikakoivisto.fi/feed/" rel="self"/>
<site xmlns="com-wordpress:feed-additions:1">110570358</site>	<item>
		<title>Dependency Injection in Vert.x with Dagger 2</title>
		<link>https://mikakoivisto.fi/blog/2025/02/dependency-injection-in-vert-x-with-dagger-2/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=dependency-injection-in-vert-x-with-dagger-2</link>
					<comments>https://mikakoivisto.fi/blog/2025/02/dependency-injection-in-vert-x-with-dagger-2/#respond</comments>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Sun, 16 Feb 2025 15:55:39 +0000</pubDate>
				<category><![CDATA[Software & DevOps]]></category>
		<category><![CDATA[dagger2]]></category>
		<category><![CDATA[vert.x]]></category>
		<guid isPermaLink="false">https://mikakoivisto.fi/?p=553401</guid>

					<description><![CDATA[<p><img data-tf-not-load="1" fetchpriority="high" loading="auto" decoding="auto" width="723" height="312" src="https://mikakoivisto.fi/wp-content/uploads/2025/02/dependency-injection-vertx-with-dagger2-featured.png" class="attachment-full size-full wp-post-image" alt="" decoding="async" fetchpriority="high" srcset="https://mikakoivisto.fi/wp-content/uploads/2025/02/dependency-injection-vertx-with-dagger2-featured.png 723w, https://mikakoivisto.fi/wp-content/uploads/2025/02/dependency-injection-vertx-with-dagger2-featured-300x129.png 300w, https://mikakoivisto.fi/wp-content/uploads/2025/02/dependency-injection-vertx-with-dagger2-featured-600x259.png 600w, https://mikakoivisto.fi/wp-content/uploads/2025/02/dependency-injection-vertx-with-dagger2-featured-1158x500.png 1158w, https://mikakoivisto.fi/wp-content/uploads/2025/02/dependency-injection-vertx-with-dagger2-featured-926x400.png 926w" sizes="(max-width: 723px) 100vw, 723px" /></p>
<p>When building asynchronous, event-driven applications with Vert.x, managing dependencies without a full-fledged DI framework can be a challenge. Traditional frameworks like Spring Boot are popular in the microservices world, but they can introduce extra runtime overhead and obscure dependency flows—issues that can be particularly problematic in a high-performance Vert.x environment. In this post, we’ll explore [&#8230;]</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2025/02/dependency-injection-in-vert-x-with-dagger-2/">Dependency Injection in Vert.x with Dagger 2</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><img data-tf-not-load="1" width="723" height="312" src="https://mikakoivisto.fi/wp-content/uploads/2025/02/dependency-injection-vertx-with-dagger2-featured.png" class="attachment-full size-full wp-post-image" alt="" decoding="async" srcset="https://mikakoivisto.fi/wp-content/uploads/2025/02/dependency-injection-vertx-with-dagger2-featured.png 723w, https://mikakoivisto.fi/wp-content/uploads/2025/02/dependency-injection-vertx-with-dagger2-featured-300x129.png 300w, https://mikakoivisto.fi/wp-content/uploads/2025/02/dependency-injection-vertx-with-dagger2-featured-600x259.png 600w, https://mikakoivisto.fi/wp-content/uploads/2025/02/dependency-injection-vertx-with-dagger2-featured-1158x500.png 1158w, https://mikakoivisto.fi/wp-content/uploads/2025/02/dependency-injection-vertx-with-dagger2-featured-926x400.png 926w" sizes="(max-width: 723px) 100vw, 723px" /></p>
<p>When building asynchronous, event-driven applications with Vert.x, managing dependencies without a full-fledged DI framework can be a challenge. Traditional frameworks like Spring Boot are popular in the microservices world, but they can introduce extra runtime overhead and obscure dependency flows—issues that can be particularly problematic in a high-performance Vert.x environment.</p>



<p>In this post, we’ll explore how Dagger 2, a compile-time dependency injection framework, offers an alternative approach that aligns well with Vert.x’s reactive model.</p>



<h3 class="wp-block-heading" id="h-the-challenge-of-di-in-vert-x"><strong>The Challenge of DI in Vert.x</strong></h3>



<p>Unlike many frameworks that offer a fully structured environment, Vert.x is best described as a toolkit. It provides incredible flexibility, but it doesn’t enforce a specific way to manage your dependencies. There’s no built-in DI system, no “Spring-style magic,” and no one-size-fits-all approach to structuring your application.</p>



<p>For some, this freedom is a huge advantage. For others, especially as your application grows, it can become a real challenge.</p>



<p>Many developers working with Vert.x opt for manual dependency wiring, constructor injection, or factory-based methods. While these approaches work well in smaller projects, they can quickly become overwhelming to manage as the complexity of your application increases without a dedicated DI framework.</p>



<p>That’s where Dagger 2 comes in.</p>



<h3 class="wp-block-heading"><strong>Why Not Just Use Spring Boot?</strong></h3>



<p>Spring Boot has become the go-to framework for many microservices thanks to its ease of use and comprehensive features. However, it comes with a few drawbacks that may not suit the needs of high-performance, asynchronous applications:</p>



<ul class="wp-block-list">
<li><strong>Runtime Overhead:</strong> Spring Boot relies on runtime proxies and reflection, which can slow down startup times.</li>



<li><strong>Obscured Dependency Flows:</strong> Autowiring, while convenient, sometimes hides how dependencies are connected, making debugging more challenging.</li>



<li><strong>Startup Delays:</strong> In microservices architectures, slower startup can be a bottleneck, especially when scaling horizontally.</li>



<li><strong>Testability:</strong> Slower startups can hinder rapid end-to-end integration testing and TDD, where fast feedback cycles are essential.</li>
</ul>



<p>For projects where performance and clarity of dependency management are paramount, Vert.x paired with Dagger 2 offers a compelling alternative.</p>



<h3 class="wp-block-heading"><strong>Dagger 2: A Perfect Fit for Vert.x</strong></h3>



<p>Unlike Spring’s runtime DI, Dagger 2 works entirely at compile time. This means:</p>



<p><img loading="lazy" decoding="async" width="72" height="72" src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Zero runtime overhead</strong><br><img loading="lazy" decoding="async" width="72" height="72" src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Explicit control over dependencies</strong><br><img loading="lazy" decoding="async" width="72" height="72" src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Faster startup times</strong><br><img loading="lazy" decoding="async" width="72" height="72" src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Improved testability</strong></p>



<p>With Dagger 2, you get a lightweight, explicit DI system without the downsides of runtime injection. Best of all, it integrates seamlessly with Vert.x—maintaining its reactive, event-driven nature—and generates code that closely resembles manual wiring, making it easy to follow the dependency flow in your IDE.</p>



<h2 class="wp-block-heading" id="h-understanding-dagger-2-and-jsr-330"><strong>Understanding Dagger 2 and JSR 330</strong></h2>



<p>Before diving into integration, let’s briefly cover the core building blocks of Dagger 2. It leverages JSR 330—a set of standard annotations for dependency injection in Java—and introduces a few key concepts:</p>



<ul class="wp-block-list">
<li><strong>@Inject:</strong> Marks constructors, fields, or methods for injection.</li>



<li><strong>@Singleton:</strong> Ensures a single instance is used throughout your application.</li>



<li><strong>@Qualifier:</strong> Differentiates between multiple instances of the same type.</li>
</ul>



<p>For example, here’s a simple service using constructor injection:</p>



<pre class="wp-block-preformatted"><code>import javax.inject.Inject;<br><br>public class MyService {<br>    @Inject<br>    public MyService() {<br>        // Constructor-based injection<br>    }<br>}</code></pre>



<p>And a singleton dependency:</p>



<pre class="wp-block-preformatted"><code>import javax.inject.Singleton;<br>import javax.inject.Inject;<br><br>@Singleton<br>public class DatabaseConnection {<br>    @Inject<br>    public DatabaseConnection() {<br>        // Singleton instance created once and shared<br>    }<br>}</code></pre>



<p>And qualifier:</p>



<pre class="wp-block-preformatted"><code>@Qualifier<br>@Retention(RUNTIME)<br>public @interface ConfigA {}<br><br>@Qualifier<br>@Retention(RUNTIME)<br>public @interface ConfigB {}</code></pre>



<p>In addition to JSR 330, Dagger 2 introduces its own core components:</p>



<ul class="wp-block-list">
<li><strong>@Module</strong>: Defines how dependencies are provided</li>



<li><strong>@Component</strong>: Connects dependencies and acts as bridge between modules and objects that need dependencies</li>
</ul>



<p>Example module that provides a Greeting that can be then injected to a dependency</p>



<pre class="wp-block-preformatted"><code>import dagger.Module;<br>import dagger.Provides;<br><br>@Module<br>public class MyModule {<br>    @Provides<br>    public Greeting provideGreeting() {<br>        return new Greeting("Hello from Dagger!");<br>    }<br>}</code></pre>



<p>And component which exposes Greeting</p>



<pre class="wp-block-preformatted"><code>import dagger.Component;<br><br>@Component(modules = MyModule.class)<br>public interface MyComponent {<br>    Greeting getGreeting();<br>}</code></pre>



<h3 class="wp-block-heading"><strong>How These Concepts Apply to Vert.x</strong></h3>



<p>Now that we understand the basics, how does this fit into Vert.x?</p>



<ul class="wp-block-list">
<li><strong><code>@Module</code></strong> → Defines how Vert.x instances and other dependencies are created.</li>



<li><strong><code>@Component</code></strong> → Manages and retrieves injected dependencies across the application.</li>



<li><strong><code>@Qualifier</code></strong> → Differentiates multiple configurations, such as JSON config values or multiple Vert.x instances.</li>
</ul>



<p>With this foundation, we’re now ready to integrate Dagger 2 into a Vert.x application. </p>



<h2 class="wp-block-heading" id="h-integrating-dagger-2-with-vert-x"><strong>Integrating Dagger 2 with Vert.x</strong></h2>



<p>Dagger 2 works best when we explicitly define our dependencies at compile time, which fits naturally with Vert.x’s non-blocking, event-driven model. In this section, we will:</p>



<ol class="wp-block-list">
<li>Set up a Dagger Module (@Module) to provide Vert.x, EventBus, and configuration.</li>



<li>Create a Dagger Component (@Component) to manage dependency injection.</li>



<li>Inject dependencies into a Vert.x-based application.</li>
</ol>



<h3 class="wp-block-heading" id="h-step-1-creating-a-dagger-module-for-vert-x"><strong>Step 1: Creating a Dagger Module for Vert.x</strong></h3>



<p>Dagger modules define how dependencies are provided. Since Vert.x is managed by us, we need to manually instantiate and provide it. We also need a JSON configuration object (which is common in Vert.x applications) and the EventBus.</p>



<p>Here’s our VertxModule:</p>



<pre class="wp-block-preformatted">package vertx.dagger;<br><br>import javax.inject.Singleton;<br>import dagger.Module;<br>import dagger.Provides;<br>import io.vertx.core.Vertx;<br>import io.vertx.core.eventbus.EventBus;<br>import io.vertx.core.json.JsonObject;<br><br>@Module<br>public class VertxModule {<br>    private final Vertx vertx;<br>    private final JsonObject config;<br><br>    public VertxModule(Vertx vertx, @VertxConfig JsonObject jsonConfig) {<br>        this.vertx = vertx;<br>        this.config = jsonConfig;<br>    }<br><br>    @Provides<br>    @Singleton<br>    public Vertx provideVertx() {<br>        return vertx;<br>    }<br><br>    @Provides<br>    @Singleton<br>    public @VertxConfig JsonObject provideConfig() {<br>        return config;<br>    }<br><br>    @Provides<br>    @Singleton<br>    public EventBus provideEventBus() {<br>        return vertx.eventBus();<br>    }<br>}</pre>



<p><strong>Explanation</strong></p>



<ul class="wp-block-list">
<li>@Module tells Dagger that this class provides dependencies.</li>



<li>@Provides methods define how each dependency is created.</li>



<li>@Singleton ensures one instance is used throughout the application.</li>



<li>@VertxConfig is a custom qualifier that helps distinguish other JsonObject from configurations.</li>
</ul>



<h3 class="wp-block-heading" id="h-step-2-creating-a-dagger-component"><strong>Step 2: Creating a Dagger Component</strong></h3>



<p>A Dagger Component is the bridge between our modules and the application. It tells Dagger what dependencies can be injected.</p>



<p>Here’s our AppComponent:</p>



<pre class="wp-block-preformatted">package vertx.dagger;<br><br>import dagger.Component;<br>import javax.inject.Singleton;<br><br>@Singleton<br>@Component(modules = { VertxModule.class })<br>public interface AppComponent {<br>    Vertx vertx();<br>}</pre>



<p><strong>How It Works</strong></p>



<ul class="wp-block-list">
<li>The @Component annotation tells Dagger this is the DI entry point.</li>



<li>modules = { VertxModule.class } means dependencies will be provided by VertxModule.</li>



<li>The methods expose injectable dependencies, allowing Vert.x, the configuration, and EventBus to be accessed.</li>



<li><strong>Note:</strong> In our application, Vert.x itself doesn’t actually need to be injected since we already control its lifecycle. However, this setup would be useful if VertxModule were responsible for creating and managing the Vertx instance.</li>
</ul>



<h3 class="wp-block-heading" id="h-step-3-using-dependency-injection-in-a-vert-x-verticle"><strong>Step 3: Using Dependency Injection in a Vert.x Verticle</strong></h3>



<p>Now that Dagger is set up, let’s use it inside our MainVerticle.</p>



<pre class="wp-block-preformatted">import io.vertx.core.AbstractVerticle;
import io.vertx.core.Promise;
import vertx.dagger.VertxModule;
import vertx.dagger.AppComponent;
import vertx.dagger.DaggerAppComponent;

public class MainVerticle extends AbstractVerticle {

    @Override
    public void start(Promise&lt;Void> startPromise) {
        // Build the Dagger component, injecting Vert.x and configuration
        AppComponent appComponent = DaggerAppComponent
                .builder()
                .vertxModule(new VertxModule(vertx, config()))
                .build();

        startPromise.complete();
    }
}</pre>



<p><strong>How It Works</strong></p>



<p>Once the dependency graph is built, we can start extending it to inject dependencies into other Verticles.</p>



<ul class="wp-block-list">
<li><code>DaggerAppComponent</code> is a Dagger-generated class that wires all dependencies together.</li>



<li>We create a <code>DaggerAppComponent</code> instance using its builder and pass in the <code>VertxModule</code>, which provides:
<ul class="wp-block-list">
<li>The Vert.x instance (<code>vertx</code>)</li>



<li>The JSON configuration object (<code>config()</code>)</li>
</ul>
</li>



<li>Once the dependency graph is built, we can start extending it to inject dependencies into other Verticles.</li>
</ul>



<h3 class="wp-block-heading" id="h-step-4-application-config-and-verticle"><strong>Step 4: Application config and Verticle</strong></h3>



<p>Now that Dagger 2 is set up to inject dependencies, let’s extend our setup to handle application-specific configurations and inject them into a Verticle.</p>



<h4 class="wp-block-heading"><strong>Mapping Configuration with AppModule</strong></h4>



<p>In most Vert.x applications, configuration is passed as a JSON object (<code>JsonObject</code>). However, it&#8217;s often more convenient to map it to a strongly-typed configuration class.</p>



<p>To do this, we’ll create an <strong><code>AppModule</code></strong> that:</p>



<ul class="wp-block-list">
<li>Maps <code>JsonObject</code> to a configuration class (<code>HelloConfig</code>)</li>



<li>Provides another <code>JsonObject</code> (to show that additional configurations can coexist)</li>
</ul>



<p><strong>AppModule Implementation</strong> </p>



<pre class="wp-block-preformatted">import javax.inject.Singleton;<br>import dagger.Module;<br>import dagger.Provides;<br>import io.vertx.core.json.JsonObject;<br>import vertx.dagger.VertxConfig;<br>import lombok.extern.slf4j.Slf4j;<br><br>@Module<br>@Slf4j<br>public class AppModule {<br><br>    @Singleton<br>    @Provides<br>    HelloConfig helloConfig(@VertxConfig JsonObject jsonObject) {<br>        log.info("Mapping HelloConfig");<br>        return jsonObject.mapTo(HelloConfig.class);<br>    }<br><br>    @Singleton<br>    @Provides<br>    JsonObject foo() {<br>        log.info("Providing foo JsonObject");<br>        return new JsonObject().put("hello", "foo");<br>    }<br>}</pre>



<h4 class="wp-block-heading"><strong>How It Works</strong></h4>



<ul class="wp-block-list">
<li>We use the <code>@VertxConfig</code> qualifier to specify that we’re mapping the Vert.x configuration JSON (<code>JsonObject</code>) into a strongly-typed class (<code>HelloConfig</code>).</li>



<li>The <code>helloConfig()</code> method maps the JSON configuration to <code>HelloConfig</code> using Vert.x&#8217;s <code>mapTo()</code> method.</li>



<li>We also provide another <code>JsonObject</code> (<code>foo</code>) to show that additional configurations won’t interfere with the main Vert.x configuration JSON.</li>
</ul>



<h3 class="wp-block-heading" id="h-step-5-injecting-configuration-into-a-verticle">Step 5: <strong>Injecting Configuration into a Verticle</strong></h3>



<p>Now, let’s inject <code>HelloConfig</code> into a Vert.x Verticle.</p>



<p>HelloVerticle Implementation</p>



<pre class="wp-block-preformatted">import javax.inject.Inject;<br>import io.vertx.core.AbstractVerticle;<br>import io.vertx.core.Promise;<br>import lombok.extern.slf4j.Slf4j;<br><br>@Slf4j<br>public class HelloVerticle extends AbstractVerticle {<br>    public static final String ADDRESS = "hello.service";<br>    private final HelloConfig config;<br><br>    @Inject<br>    public HelloVerticle(HelloConfig config) {<br>        log.info("Instantiating HelloVerticle");<br>        this.config = config;<br>    }<br><br>    @Override<br>    public void start(Promise&lt;Void> startPromise) {<br>        vertx.eventBus().&lt;String>consumer(ADDRESS, message -> {<br>            String name = message.body();<br>            log.info("Received message: {}", name);<br>            String response = String.format(config.hello(), name);<br>            message.reply(response);<br>        });<br>        <br>        startPromise.complete();<br>    }<br>}</pre>



<h4 class="wp-block-heading"><strong>How It Works</strong></h4>



<ul class="wp-block-list">
<li><code>HelloConfig</code> is injected via the constructor (Dagger handles this automatically).</li>



<li>The Verticle listens on <code>hello.service</code> via Vert.x EventBus.</li>



<li>When a message is received, it retrieves the configured response format from <code>HelloConfig</code> and replies.</li>



<li>This method of injecting configuration demonstrates how DI can be applied to any service or component, not just Vert.x-managed classes.</li>
</ul>



<h3 class="wp-block-heading" id="h-step-6-registering-helloverticle-in-dagger">Step 6: <strong>Registering HelloVerticle in Dagger</strong></h3>



<p>Now, we need to add <code>HelloVerticle</code> to <code>AppComponent</code> so that Dagger can wire it along with <code>AppModule</code>.</p>



<p>AppComponent Update</p>



<pre class="wp-block-preformatted">import javax.inject.Singleton;<br>import dagger.Component;<br>import io.vertx.core.Vertx;<br>import vertx.dagger.VertxModule;<br><br>@Singleton<br>@Component(modules = {VertxModule.class, AppModule.class})<br>interface AppComponent {<br>    Vertx vertx();<br><br>    HelloVerticle helloVerticle();<br>}</pre>



<h4 class="wp-block-heading"><strong>How It Works</strong></h4>



<ul class="wp-block-list">
<li>We added <code>AppModule</code> to the <code>@Component</code> modules list.</li>



<li>We exposed <code>HelloVerticle</code> so that Dagger can provide an instance when needed.</li>
</ul>



<h3 class="wp-block-heading" id="h-step-6-deploying-the-helloverticle">Step 6: <strong>Deploying the HelloVerticle</strong></h3>



<p>Finally, we modify <code>MainVerticle</code> to deploy <code>HelloVerticle</code> using Dagger 2.</p>



<p>MainVerticle Update</p>



<pre class="wp-block-preformatted">import io.vertx.core.AbstractVerticle;<br>import io.vertx.core.Promise;<br>import vertx.dagger.VertxModule;<br><br>public class MainVerticle extends AbstractVerticle {<br><br>    @Override<br>    public void start(Promise&lt;Void> startPromise) {<br>        AppComponent appComponent = DaggerAppComponent<br>                .builder()<br>                .vertxModule(new VertxModule(vertx, config()))<br>                .build();<br><br>        vertx<br>                .deployVerticle(appComponent.helloVerticle())<br>                .onSuccess(s -> startPromise.complete())<br>                .onFailure(startPromise::fail);<br>    }</pre>



<h4 class="wp-block-heading"><strong>How It Works</strong></h4>



<ul class="wp-block-list">
<li>We build the Dagger component (<code>DaggerAppComponent.builder()</code>) and pass in the <code>VertxModule</code>.</li>



<li>We deploy <code>HelloVerticle</code> using Dagger, so Vert.x doesn’t need to manage its dependencies manually.</li>



<li>If the Verticle deploys successfully, we call <code>startPromise.complete()</code>. Otherwise, we fail the promise.</li>
</ul>



<h2 class="wp-block-heading" id="h-conclusion-the-power-of-dagger-2-with-vert-x"><strong>Conclusion: The Power of Dagger 2 with Vert.x</strong></h2>



<p>Integrating Dagger 2 with Vert.x provides a powerful combination of explicit dependency management and reactive performance. By using Dagger’s compile-time dependency injection, we can:</p>



<p><img loading="lazy" decoding="async" width="72" height="72" src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Avoid runtime overhead introduced by traditional DI frameworks like Spring.<br><img loading="lazy" decoding="async" width="72" height="72" src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Gain explicit control over dependencies, making our codebase cleaner and easier to debug.<br><img loading="lazy" decoding="async" width="72" height="72" src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Improve testability by clearly defining how dependencies are wired and managed.<br><img loading="lazy" decoding="async" width="72" height="72" src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Maintain the event-driven, non-blocking nature of Vert.x without breaking its reactive model.</p>



<p>While the example here shows how to inject configurations and Verticles into a Vert.x application, the possibilities are far greater. You can extend this setup to inject services, repositories, and other application components, ensuring that your application remains modular, scalable, and easy to maintain as it grows.</p>



<h3 class="wp-block-heading" id="h-when-to-use-dagger-2-in-vert-x"><strong>When to Use Dagger 2 in Vert.x</strong></h3>



<ul class="wp-block-list">
<li>Complex applications with many interconnected services and configurations.</li>



<li>Projects where startup time and performance are critical.</li>



<li>Applications that benefit from compile-time safety and explicit DI management.</li>
</ul>



<h3 class="wp-block-heading"><strong>Full Source Code &amp; Tests</strong></h3>



<p>You can find the full example project, including unit tests, on GitHub:<br><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='72'%20height='72'%20viewBox=%270%200%2072%2072%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" decoding="async" width="72" height="72" data-tf-src="https://s.w.org/images/core/emoji/17.0.2/72x72/27a1.png" alt="➡" class="tf_svg_lazy wp-smiley" style="height: 1em; max-height: 1em;" /><noscript><img data-tf-not-load src="https://s.w.org/images/core/emoji/17.0.2/72x72/27a1.png" alt="➡" class="wp-smiley" style="height: 1em; max-height: 1em;" /></noscript> <a href="https://github.com/mikakoivisto/vertx-dagger-example">GitHub Repository: Vert.x Dagger Example</a></p>


<!-- wp:themify-builder/canvas /--><p>The post <a href="https://mikakoivisto.fi/blog/2025/02/dependency-injection-in-vert-x-with-dagger-2/">Dependency Injection in Vert.x with Dagger 2</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mikakoivisto.fi/blog/2025/02/dependency-injection-in-vert-x-with-dagger-2/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">553401</post-id>	</item>
		<item>
		<title>Connecting RuuviTags to Home Assistant</title>
		<link>https://smarthomeliving.tech/connecting-ruuvitags-to-home-assistant?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=connecting-ruuvitags-to-home-assistant</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Sun, 01 Jan 2023 13:24:10 +0000</pubDate>
				<category><![CDATA[Home Automation]]></category>
		<category><![CDATA[home assistant]]></category>
		<category><![CDATA[Home automation]]></category>
		<category><![CDATA[mqtt]]></category>
		<category><![CDATA[ruuvitag]]></category>
		<guid isPermaLink="false">https://smarthomeliving.tech/?p=39</guid>

					<description><![CDATA[<p>Ruuvi is a Finnish company producing high quality sensors that measure temperature, humidity, air pressure and motion. They have two types of sensors RuuviTag and RuuviTag Pro. The pro sensors are meant for harsher conditions and there’s a version that can be submerged in water. I have both types of sensors and even the non […]</p>
<p>The post <a href="https://smarthomeliving.tech/connecting-ruuvitags-to-home-assistant">Connecting RuuviTags to Home Assistant</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Ruuvi is a Finnish company producing high quality sensors that measure temperature, humidity, air pressure and motion. They have two types of sensors RuuviTag and RuuviTag Pro. The pro sensors are meant for harsher conditions and there&#8217;s a version that can be submerged in water. I have both types of sensors and even the non pro ones have lasted quite well outside in Finnish winter conditions as well as in sauna.  </p>



<p>The sensors use Bluetooth BLE to advertise the measurements. With Home Assistant 2022.12 there&#8217;s <a href="https://www.home-assistant.io/integrations/ruuvitag_ble/"  rel="noreferrer noopener nofollow">native integration for ruuvi</a> that uses Home Assistant bluetooth capabilities. Its downside is short range which can be extended with ESPHome bluetooth proxy. For my house I would need quite a few ESP32 devices to get that to work and that integration was not available when I setup my system. </p>



<figure class="wp-block-image size-full"><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='800'%20height='576'%20viewBox=%270%200%20800%20576%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" fetchpriority="high" decoding="async" width="800" height="576" data-tf-src="https://smarthomeliving.tech/wp-content/uploads/2022/12/Ruuvi-Gateway-800x576-1.png" alt="" class="tf_svg_lazy wp-image-53" data-tf-srcset="https://smarthomeliving.tech/wp-content/uploads/2022/12/Ruuvi-Gateway-800x576-1.png 800w, https://smarthomeliving.tech/wp-content/uploads/2022/12/Ruuvi-Gateway-800x576-1-300x216.png 300w, https://smarthomeliving.tech/wp-content/uploads/2022/12/Ruuvi-Gateway-800x576-1-768x553.png 768w" data-tf-sizes="(max-width: 800px) 100vw, 800px" /><noscript><img fetchpriority="high" decoding="async" width="800" height="576" data-tf-not-load src="https://smarthomeliving.tech/wp-content/uploads/2022/12/Ruuvi-Gateway-800x576-1.png" alt="" class="wp-image-53" srcset="https://smarthomeliving.tech/wp-content/uploads/2022/12/Ruuvi-Gateway-800x576-1.png 800w, https://smarthomeliving.tech/wp-content/uploads/2022/12/Ruuvi-Gateway-800x576-1-300x216.png 300w, https://smarthomeliving.tech/wp-content/uploads/2022/12/Ruuvi-Gateway-800x576-1-768x553.png 768w" sizes="(max-width: 800px) 100vw, 800px" /></noscript><figcaption class="wp-element-caption">Ruuvi Gateway</figcaption></figure>



<p>My setup uses Ruuvi Gateway which amazingly can pickup signal from all of my RuuviTags. The gateway is not cheap but I think it&#8217;s worth it. The gateway transmits the measurements to Ruuvi Station or you can make it just send them to MQTT topic for further processing. I have both not that I use the Ruuvi Station all that often because I send the data to Influx DB also and use Grafana to graph them. </p>



<figure class="wp-block-image size-large"><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='1024'%20height='626'%20viewBox=%270%200%201024%20626%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" decoding="async" width="1024" height="626" data-tf-src="https://smarthomeliving.tech/wp-content/uploads/2022/12/ruuvistation-1024x626.png" alt="" class="tf_svg_lazy wp-image-54" data-tf-srcset="https://smarthomeliving.tech/wp-content/uploads/2022/12/ruuvistation-1024x626.png 1024w, https://smarthomeliving.tech/wp-content/uploads/2022/12/ruuvistation-300x183.png 300w, https://smarthomeliving.tech/wp-content/uploads/2022/12/ruuvistation-768x470.png 768w, https://smarthomeliving.tech/wp-content/uploads/2022/12/ruuvistation.png 1220w" data-tf-sizes="(max-width: 1024px) 100vw, 1024px" /><noscript><img decoding="async" width="1024" height="626" data-tf-not-load src="https://smarthomeliving.tech/wp-content/uploads/2022/12/ruuvistation-1024x626.png" alt="" class="wp-image-54" srcset="https://smarthomeliving.tech/wp-content/uploads/2022/12/ruuvistation-1024x626.png 1024w, https://smarthomeliving.tech/wp-content/uploads/2022/12/ruuvistation-300x183.png 300w, https://smarthomeliving.tech/wp-content/uploads/2022/12/ruuvistation-768x470.png 768w, https://smarthomeliving.tech/wp-content/uploads/2022/12/ruuvistation.png 1220w" sizes="(max-width: 1024px) 100vw, 1024px" /></noscript><figcaption class="wp-element-caption">Ruuvi station</figcaption></figure>



<p>I use <a href="https://github.com/Scrin/RuuviBridge"  rel="noreferrer noopener nofollow">RuuviBridge</a> to do the MQTT measurements and bridge the ruuvitag message to different sources as well as limit the frequency of updates to not flood Home Assistant with measurements. RuuviBridge has built-in Home Assistant support but I found it little lacking because it didn&#8217;t use persistent identifier for the sensors it created. So I still use it to do all the heavy lifting but I adapted my old custom implementation to just do the Home Assistant part with MQTT discovery. You can find the <a href="https://github.com/mikakoivisto/ruuvibridge-ha-mqtt"  rel="noreferrer noopener nofollow">source here</a> and it&#8217;s published as <a href="https://hub.docker.com/r/mikakoivisto/ruuvibridge-ha-mqtt"  rel="noreferrer noopener nofollow">Docker image</a>.</p>



<p>Here&#8217;s a simple docker-compose.yml to put all of them together. </p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" style="font-size:.875rem;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:16.859375px;line-height:1.25rem"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#39404f;color:#c8d0e0">docker-compose.yml</span><span role="button" tabindex="0" data-code="version: &quot;3.4&quot;
services:
  mqtt:
    image: eclipse-mosquitto
    volumes:
      - ./mosquitto.conf:/mosquitto/config/mosquitto.conf
  ruuvibridge:
    image: ghcr.io/scrin/ruuvibridge
    container_name: ruuvibridge
    restart: unless-stopped
    volumes:
      - ./ruuvibridge/config.yml:/config.yml:ro
    links:
     - mqtt
  ruuvibridge-ha-mqtt:
    image: mikakoivisto/ruuvibridge-ha-mqtt:latest
    container_name: ruuvibridge-ha-mqtt
    restart: unless-stopped
    links:
     - mqtt
    env_file:
      - docker.env" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff"><code><span class="line"><span style="color: #8FBCBB">version</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">3.4</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #8FBCBB">services</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #8FBCBB">mqtt</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">image</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">eclipse-mosquitto</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">volumes</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">./mosquitto.conf:/mosquitto/config/mosquitto.conf</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #8FBCBB">ruuvibridge</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">image</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">ghcr.io/scrin/ruuvibridge</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">container_name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">ruuvibridge</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">restart</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">unless-stopped</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">volumes</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">./ruuvibridge/config.yml:/config.yml:ro</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">links</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">     </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">mqtt</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #8FBCBB">ruuvibridge-ha-mqtt</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">image</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">mikakoivisto/ruuvibridge-ha-mqtt:latest</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">container_name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">ruuvibridge-ha-mqtt</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">restart</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">unless-stopped</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">links</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">     </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">mqtt</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">env_file</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">docker.env</span></span></code></pre></div>



<p> This sample mosquitto config allows anonymous access to the broker hence no username or password for ruuvibridge.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" style="font-size:.875rem;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:8.4296875px;line-height:1.25rem"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#39404f;color:#c8d0e0">mosquitto.conf</span><span role="button" tabindex="0" data-code="listener 1883
log_dest stdout
allow_anonymous true" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff"><code><span class="line"><span style="color: #D8DEE9FF">listener </span><span style="color: #B48EAD">1883</span></span>
<span class="line"><span style="color: #D8DEE9FF">log_dest </span><span style="color: #A3BE8C">stdout</span></span>
<span class="line"><span style="color: #D8DEE9FF">allow_anonymous </span><span style="color: #81A1C1">true</span></span></code></pre></div>



<p>This is a minimal configuration for ruuvibridge to listen to MQTT topic for ruuvitag measurements and publish them back to MQTT under topic prefix ruuvitag which is picked up by my Home Assistant MQTT integration. You can also name your tags here and my integration will use those names for RuuviTag sensor attribute names. Using minimum_interval configuration you can prevent RuuviTag from flooding with measurements. For me once every 60 seconds is enough measurements.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" style="font-size:.875rem;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:16.859375px;line-height:1.25rem"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#39404f;color:#c8d0e0">ruuvibridge/config.yml</span><span role="button" tabindex="0" data-code="mqtt_listener:
  enabled: true
  broker_url: tcp://mqtt:1883
  client_id: RuuviBridgeListener
  #username: ruuvibridge
  #password: ruuvipassword
mqtt_publisher:
  enabled: true
  minimum_interval: 60s
  broker_url: tcp://mqtt:1883
  client_id: RuuviBridgePublisher
  #username: ruuvibridge
  #password: ruuvipassword
  topic_prefix: ruuvitag
tag_names:
  C5450489AF76: Bedroom
  CC2BE24AE159: Kids room" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff"><code><span class="line"><span style="color: #8FBCBB">mqtt_listener</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #8FBCBB">enabled</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">true</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #8FBCBB">broker_url</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">tcp://mqtt:1883</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #8FBCBB">client_id</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">RuuviBridgeListener</span></span>
<span class="line"><span style="color: #ECEFF4">  </span><span style="color: #616E88">#username: ruuvibridge</span></span>
<span class="line"><span style="color: #ECEFF4">  </span><span style="color: #616E88">#password: ruuvipassword</span></span>
<span class="line"><span style="color: #8FBCBB">mqtt_publisher</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #8FBCBB">enabled</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">true</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #8FBCBB">minimum_interval</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">60s</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #8FBCBB">broker_url</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">tcp://mqtt:1883</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #8FBCBB">client_id</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">RuuviBridgePublisher</span></span>
<span class="line"><span style="color: #ECEFF4">  </span><span style="color: #616E88">#username: ruuvibridge</span></span>
<span class="line"><span style="color: #ECEFF4">  </span><span style="color: #616E88">#password: ruuvipassword</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #8FBCBB">topic_prefix</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">ruuvitag</span></span>
<span class="line"><span style="color: #8FBCBB">tag_names</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #8FBCBB">C5450489AF76</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">Bedroom</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #8FBCBB">CC2BE24AE159</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">Kids room</span></span></code></pre></div>



<p>Here&#8217;s a docker.env file that is used by ruuvibridge-ha-mqtt for it&#8217;s configuration. In this example I&#8217;ve limited the attributes I will publish to Home Assistant.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" style="font-size:.875rem;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:8.4296875px;line-height:1.25rem"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#39404f;color:#c8d0e0">docker.env</span><span role="button" tabindex="0" data-code="MQTTHOST=mqtt
MQTTPORT=
MQTTUSER=
MQTTPASS=
RUUVITOPIC=ruuvitag
HASSTOPIC=homeassistant/status
DEBUG=app:info,app:error,app:debug
RUUVIATTRIBUTES=temperature,humidity,pressure,dewPoint,batteryVoltage" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff"><code><span class="line"><span style="color: #D8DEE9">MQTTHOST</span><span style="color: #81A1C1">=</span><span style="color: #A3BE8C">mqtt</span></span>
<span class="line"><span style="color: #D8DEE9">MQTTPORT</span><span style="color: #81A1C1">=</span></span>
<span class="line"><span style="color: #D8DEE9">MQTTUSER</span><span style="color: #81A1C1">=</span></span>
<span class="line"><span style="color: #D8DEE9">MQTTPASS</span><span style="color: #81A1C1">=</span></span>
<span class="line"><span style="color: #D8DEE9">RUUVITOPIC</span><span style="color: #81A1C1">=</span><span style="color: #A3BE8C">ruuvitag</span></span>
<span class="line"><span style="color: #D8DEE9">HASSTOPIC</span><span style="color: #81A1C1">=</span><span style="color: #A3BE8C">homeassistant/status</span></span>
<span class="line"><span style="color: #D8DEE9">DEBUG</span><span style="color: #81A1C1">=</span><span style="color: #A3BE8C">app:info,app:error,app:debug</span></span>
<span class="line"><span style="color: #D8DEE9">RUUVIATTRIBUTES</span><span style="color: #81A1C1">=</span><span style="color: #A3BE8C">temperature,humidity,pressure,dewPoint,batteryVoltage</span></span></code></pre></div>



<p>You also need to setup Home Assistant to use MQTT. It&#8217;s activated in Home Assistant configuration.yml simply by adding mqtt: line in it and the in Devices and Integrations UI add the MQTT integration and configure MQTT server host, username and password.</p>
<p>The post <a href="https://smarthomeliving.tech/connecting-ruuvitags-to-home-assistant">Connecting RuuviTags to Home Assistant</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">553320</post-id>	</item>
		<item>
		<title>Integrating ControlMySpa to Home Assistant</title>
		<link>https://smarthomeliving.tech/integrating-controlmyspa-to-home-assistant?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=integrating-controlmyspa-to-home-assistant</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Fri, 30 Dec 2022 22:42:35 +0000</pubDate>
				<category><![CDATA[Home Automation]]></category>
		<category><![CDATA[controlmyspa]]></category>
		<category><![CDATA[homeassistant]]></category>
		<guid isPermaLink="false">https://smarthomeliving.tech/?p=31</guid>

					<description><![CDATA[<p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='1200'%20height='300'%20viewBox=%270%200%201200%20300%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" style="background:linear-gradient(to right,#54c1f1 25%,#0b70bb 25% 50%,#17270e 50% 75%,#1c252b 75%),linear-gradient(to right,#fefefe 25%,#0d3043 25% 50%,#c5c7c2 50% 75%,#1c252b 75%),linear-gradient(to right,#3db0e3 25%,#0d6fb5 25% 50%,#c3e9f1 50% 75%,#c6dce2 75%),linear-gradient(to right,#dee2e4 25%,#bf978f 25% 50%,#94e0ea 50% 75%,#f2f2f3 75%)" width="1200" height="300" data-tf-src="https://mikakoivisto.fi/wp-content/uploads/2022/12/homeassistant-controlmyspa-cover.png" class="tf_svg_lazy attachment-full size-full wp-post-image" alt="" decoding="async" data-tf-srcset="https://mikakoivisto.fi/wp-content/uploads/2022/12/homeassistant-controlmyspa-cover.png 1200w, https://mikakoivisto.fi/wp-content/uploads/2022/12/homeassistant-controlmyspa-cover-300x75.png 300w, https://mikakoivisto.fi/wp-content/uploads/2022/12/homeassistant-controlmyspa-cover-1024x256.png 1024w, https://mikakoivisto.fi/wp-content/uploads/2022/12/homeassistant-controlmyspa-cover-768x192.png 768w, https://mikakoivisto.fi/wp-content/uploads/2022/12/homeassistant-controlmyspa-cover-600x150.png 600w, https://mikakoivisto.fi/wp-content/uploads/2022/12/homeassistant-controlmyspa-cover-1024x256-1600x400.png 1600w, https://mikakoivisto.fi/wp-content/uploads/2022/12/homeassistant-controlmyspa-cover-1024x256-2000x500.png 2000w" data-tf-sizes="(max-width: 1200px) 100vw, 1200px" /><noscript><img width="1200" height="300" data-tf-not-load src="https://mikakoivisto.fi/wp-content/uploads/2022/12/homeassistant-controlmyspa-cover.png" class="attachment-full size-full wp-post-image" alt="" decoding="async" srcset="https://mikakoivisto.fi/wp-content/uploads/2022/12/homeassistant-controlmyspa-cover.png 1200w, https://mikakoivisto.fi/wp-content/uploads/2022/12/homeassistant-controlmyspa-cover-300x75.png 300w, https://mikakoivisto.fi/wp-content/uploads/2022/12/homeassistant-controlmyspa-cover-1024x256.png 1024w, https://mikakoivisto.fi/wp-content/uploads/2022/12/homeassistant-controlmyspa-cover-768x192.png 768w, https://mikakoivisto.fi/wp-content/uploads/2022/12/homeassistant-controlmyspa-cover-600x150.png 600w, https://mikakoivisto.fi/wp-content/uploads/2022/12/homeassistant-controlmyspa-cover-1024x256-1600x400.png 1600w, https://mikakoivisto.fi/wp-content/uploads/2022/12/homeassistant-controlmyspa-cover-1024x256-2000x500.png 2000w" sizes="(max-width: 1200px) 100vw, 1200px" /></noscript></p>
<p>I have a Novitek hot tub that has Balboa ControlMySpa WIFI controller and I wanted to be able add some smarts to when it’s heating with these very volatile electricity prices. Sadly the only Balboa integration I was able to find was for an older controller that was not ControlMySpa compatible. ControlMySpa does have Amazon […]</p>
<p>The post <a href="https://smarthomeliving.tech/integrating-controlmyspa-to-home-assistant">Integrating ControlMySpa to Home Assistant</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='1200'%20height='300'%20viewBox=%270%200%201200%20300%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" style="background:linear-gradient(to right,#54c1f1 25%,#0b70bb 25% 50%,#17270e 50% 75%,#1c252b 75%),linear-gradient(to right,#fefefe 25%,#0d3043 25% 50%,#c5c7c2 50% 75%,#1c252b 75%),linear-gradient(to right,#3db0e3 25%,#0d6fb5 25% 50%,#c3e9f1 50% 75%,#c6dce2 75%),linear-gradient(to right,#dee2e4 25%,#bf978f 25% 50%,#94e0ea 50% 75%,#f2f2f3 75%)" width="1200" height="300" data-tf-src="https://mikakoivisto.fi/wp-content/uploads/2022/12/homeassistant-controlmyspa-cover.png" class="tf_svg_lazy attachment-full size-full wp-post-image" alt="" decoding="async" data-tf-srcset="https://mikakoivisto.fi/wp-content/uploads/2022/12/homeassistant-controlmyspa-cover.png 1200w, https://mikakoivisto.fi/wp-content/uploads/2022/12/homeassistant-controlmyspa-cover-300x75.png 300w, https://mikakoivisto.fi/wp-content/uploads/2022/12/homeassistant-controlmyspa-cover-1024x256.png 1024w, https://mikakoivisto.fi/wp-content/uploads/2022/12/homeassistant-controlmyspa-cover-768x192.png 768w, https://mikakoivisto.fi/wp-content/uploads/2022/12/homeassistant-controlmyspa-cover-600x150.png 600w, https://mikakoivisto.fi/wp-content/uploads/2022/12/homeassistant-controlmyspa-cover-1024x256-1600x400.png 1600w, https://mikakoivisto.fi/wp-content/uploads/2022/12/homeassistant-controlmyspa-cover-1024x256-2000x500.png 2000w" data-tf-sizes="(max-width: 1200px) 100vw, 1200px" /><noscript><img width="1200" height="300" data-tf-not-load src="https://mikakoivisto.fi/wp-content/uploads/2022/12/homeassistant-controlmyspa-cover.png" class="attachment-full size-full wp-post-image" alt="" decoding="async" srcset="https://mikakoivisto.fi/wp-content/uploads/2022/12/homeassistant-controlmyspa-cover.png 1200w, https://mikakoivisto.fi/wp-content/uploads/2022/12/homeassistant-controlmyspa-cover-300x75.png 300w, https://mikakoivisto.fi/wp-content/uploads/2022/12/homeassistant-controlmyspa-cover-1024x256.png 1024w, https://mikakoivisto.fi/wp-content/uploads/2022/12/homeassistant-controlmyspa-cover-768x192.png 768w, https://mikakoivisto.fi/wp-content/uploads/2022/12/homeassistant-controlmyspa-cover-600x150.png 600w, https://mikakoivisto.fi/wp-content/uploads/2022/12/homeassistant-controlmyspa-cover-1024x256-1600x400.png 1600w, https://mikakoivisto.fi/wp-content/uploads/2022/12/homeassistant-controlmyspa-cover-1024x256-2000x500.png 2000w" sizes="(max-width: 1200px) 100vw, 1200px" /></noscript></p>
<p>I have a Novitek hot tub that has Balboa ControlMySpa WIFI controller and I wanted to be able add some smarts to when it&#8217;s heating with these very volatile electricity prices. Sadly the only Balboa integration I was able to find was for an older controller that was not ControlMySpa compatible. ControlMySpa does have Amazon Alexa integration but it&#8217;s quite basic so that could have been a route to explore but I just wasn&#8217;t satisfied with that. </p>



<p>I was able to find a NodeJs library that used the same undocumented API as their app and provided fairly nice API. There hasn&#8217;t been any commits to in few years but it does still work so I started to play around with it. Javascript is not something I typically like to write so my first attempt was a horrible hack that quite frankly was quite unstable. However this fall I took some time make it much better and totally rewrote my first attempt and so was born <a href="https://github.com/mikakoivisto/controlmyspa-ha-mqtt"  rel="noreferrer noopener nofollow">ControlMySpa MQTT integration to Home Assistant</a>. </p>



<p>It uses Home Assistant MQTT discovery to auto create entities in Home Assistant. My Home Assistant is setup as docker container so it&#8217;s not able to use Home Assistant AddOns directly but those are basically docker containers. My integration was made as standalone docker container that uses what ever mqtt you have configured your Home Assistant to use and recently I got a contribution with to transform the repository to a HA AddOn. I don&#8217;t know if and how that works as I&#8217;m running HA in standalone docker mode. </p>



<p>So for the rest of this I am going to assume you are also running HA in standalone docker mode and that you have configured HA to use a MQTT server such as Mosquito. Here&#8217;s an example docker-compose.yml showing how they can be connected.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" style="font-size:.875rem;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:16.859375px;line-height:1.25rem"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#39404f;color:#c8d0e0">docker-compose.yml</span><span role="button" tabindex="0" data-code="version: &quot;3.4&quot;
services:
  mqtt:
    image: eclipse-mosquitto
    volumes:
      - ./mosquitto/config.conf:/mosquitto/config/mosquitto.conf
  controlmyspa-ha-mqtt:
    image: mikakoivisto/controlmyspa-ha-mqtt:latest
    links:
      - mqtt
    env_file: 
      - docker.env" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki" style="background-color: #2e3440ff"><code><span class="line"><span style="color: #8FBCBB">version</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">3.4</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #8FBCBB">services</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #8FBCBB">mqtt</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">image</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">eclipse-mosquitto</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">volumes</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">./mosquitto/config.conf:/mosquitto/config/mosquitto.conf</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #8FBCBB">controlmyspa-ha-mqtt</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">image</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">mikakoivisto/controlmyspa-ha-mqtt:latest</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">links</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">mqtt</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">env_file</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">docker.env</span></span></code></pre></div>



<p>I&#8217;m auto building and publishing the controlmyspa-ha-mqtt docker image to docker hub for every commit. You can refer to latest or a commit hash if you want to lock it down to specific version. Notice that latest may break but that is the version I&#8217;m running so I tend to fix it as soon as possible.</p>



<p>Since it&#8217;s ready made docker image it&#8217;s pretty easy to add and all the relevant configuration is in docker.env file or you can add them to environment section in docker-compose.yml. Most importantly you need to provide your MQTT and CONTROLMYSPA credentials. </p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" style="font-size:.875rem;--cbp-line-number-color:#d8dee9ff;--cbp-line-number-width:8.4296875px;line-height:1.25rem"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#39404f;color:#c8d0e0">docker.env</span><span role="button" tabindex="0" data-code="MQTTHOST=mqtt
MQTTPORT=
MQTTUSER=
MQTTPASS=
CONTROLMYSPA_USER=
CONTROLMYSPA_PASS=
CONTROLMYSPA_CELSIUS=true
HASSTOPIC=homeassistant/status
DEBUG=app:info,*:error,spa:info" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki" style="background-color: #2e3440ff"><code><span class="line"><span style="color: #D8DEE9FF">MQTTHOST=mqtt</span></span>
<span class="line"><span style="color: #D8DEE9FF">MQTTPORT=</span></span>
<span class="line"><span style="color: #D8DEE9FF">MQTTUSER=</span></span>
<span class="line"><span style="color: #D8DEE9FF">MQTTPASS=</span></span>
<span class="line"><span style="color: #D8DEE9FF">CONTROLMYSPA_USER=</span></span>
<span class="line"><span style="color: #D8DEE9FF">CONTROLMYSPA_PASS=</span></span>
<span class="line"><span style="color: #D8DEE9FF">CONTROLMYSPA_CELSIUS=true</span></span>
<span class="line"><span style="color: #D8DEE9FF">HASSTOPIC=homeassistant/status</span></span>
<span class="line"><span style="color: #D8DEE9FF">DEBUG=app:info,</span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF">:error,spa:info</span></span></code></pre></div>



<p>If you configured everything correctly you should see following kind of thermostat and sensors in your home assistant dashboard. It&#8217;s also listed under MQTT devices. </p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='857'%20height='1024'%20viewBox=%270%200%20857%201024%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" decoding="async" width="857" height="1024" data-id="34" data-tf-src="https://smarthomeliving.tech/wp-content/uploads/2022/12/controlmyspa_ha_thermostat-857x1024.png" alt="" class="tf_svg_lazy wp-image-34" data-tf-srcset="https://smarthomeliving.tech/wp-content/uploads/2022/12/controlmyspa_ha_thermostat-857x1024.png 857w, https://smarthomeliving.tech/wp-content/uploads/2022/12/controlmyspa_ha_thermostat-251x300.png 251w, https://smarthomeliving.tech/wp-content/uploads/2022/12/controlmyspa_ha_thermostat-768x918.png 768w, https://smarthomeliving.tech/wp-content/uploads/2022/12/controlmyspa_ha_thermostat.png 1016w" data-tf-sizes="(max-width: 857px) 100vw, 857px" /><noscript><img decoding="async" width="857" height="1024" data-id="34" data-tf-not-load src="https://smarthomeliving.tech/wp-content/uploads/2022/12/controlmyspa_ha_thermostat-857x1024.png" alt="" class="wp-image-34" srcset="https://smarthomeliving.tech/wp-content/uploads/2022/12/controlmyspa_ha_thermostat-857x1024.png 857w, https://smarthomeliving.tech/wp-content/uploads/2022/12/controlmyspa_ha_thermostat-251x300.png 251w, https://smarthomeliving.tech/wp-content/uploads/2022/12/controlmyspa_ha_thermostat-768x918.png 768w, https://smarthomeliving.tech/wp-content/uploads/2022/12/controlmyspa_ha_thermostat.png 1016w" sizes="(max-width: 857px) 100vw, 857px" /></noscript></figure>



<figure class="wp-block-image size-large"><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='857'%20height='1024'%20viewBox=%270%200%20857%201024%27%3E%3C/svg%3E" data-lazy="1" loading="lazy" decoding="async" width="857" height="1024" data-id="35" data-tf-src="https://smarthomeliving.tech/wp-content/uploads/2022/12/controlmyspa_ha_sensors-857x1024.png" alt="" class="tf_svg_lazy wp-image-35" data-tf-srcset="https://smarthomeliving.tech/wp-content/uploads/2022/12/controlmyspa_ha_sensors-857x1024.png 857w, https://smarthomeliving.tech/wp-content/uploads/2022/12/controlmyspa_ha_sensors-251x300.png 251w, https://smarthomeliving.tech/wp-content/uploads/2022/12/controlmyspa_ha_sensors-768x918.png 768w, https://smarthomeliving.tech/wp-content/uploads/2022/12/controlmyspa_ha_sensors.png 1016w" data-tf-sizes="(max-width: 857px) 100vw, 857px" /><noscript><img loading="lazy" decoding="async" width="857" height="1024" data-id="35" data-tf-not-load src="https://smarthomeliving.tech/wp-content/uploads/2022/12/controlmyspa_ha_sensors-857x1024.png" alt="" class="wp-image-35" srcset="https://smarthomeliving.tech/wp-content/uploads/2022/12/controlmyspa_ha_sensors-857x1024.png 857w, https://smarthomeliving.tech/wp-content/uploads/2022/12/controlmyspa_ha_sensors-251x300.png 251w, https://smarthomeliving.tech/wp-content/uploads/2022/12/controlmyspa_ha_sensors-768x918.png 768w, https://smarthomeliving.tech/wp-content/uploads/2022/12/controlmyspa_ha_sensors.png 1016w" sizes="(max-width: 857px) 100vw, 857px" /></noscript></figure>
</figure>



<p>The thermostat buttons basically just toggle between Rest and Ready regardless of which one you press. You should also be aware that controlmyspa is quite slow to react so it may seem its unresponsive. You should also know that the temperature might not be up to date if you have the spa on Rest state as controlmyspa stops reporting the temperature. I&#8217;m putting a Ruuvitag Pro to my spa to get an accurate temperature reading.</p>



<p>I hope you find this integration useful and any improvements are greatly appreciated. Especially the HA addon part as that was contributed and I can&#8217;t test it myself. Just send a pull request on Github or create an issue. </p>


<!-- wp:themify-builder/canvas --><!-- /wp:themify-builder/canvas --><p>The post <a href="https://smarthomeliving.tech/integrating-controlmyspa-to-home-assistant">Integrating ControlMySpa to Home Assistant</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">553322</post-id>	</item>
		<item>
		<title>Saving and investing for your child</title>
		<link>https://mikakoivisto.fi/blog/2018/02/saving-investing-child/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=saving-investing-child</link>
					<comments>https://mikakoivisto.fi/blog/2018/02/saving-investing-child/#respond</comments>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Fri, 09 Feb 2018 07:56:26 +0000</pubDate>
				<category><![CDATA[Finance]]></category>
		<category><![CDATA[compound interest]]></category>
		<category><![CDATA[investing]]></category>
		<guid isPermaLink="false">https://mikakoivisto.fi/?p=70563</guid>

					<description><![CDATA[<p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='600'%20height='371'%20viewBox=%270%200%20600%20371%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" style="background:linear-gradient(to right,#ffffff 25%,#ffffff 25% 50%,#ffffff 50% 75%,#ffffff 75%),linear-gradient(to right,#ffffff 25%,#ffffff 25% 50%,#ffffff 50% 75%,#3366cc 75%),linear-gradient(to right,#ffffff 25%,#ffffff 25% 50%,#ffffff 50% 75%,#ffffff 75%),linear-gradient(to right,#ffffff 25%,#ffffff 25% 50%,#ffffff 50% 75%,#ffffff 75%)" width="600" height="371" data-tf-src="https://mikakoivisto.fi/wp-content/uploads/2018/02/compound_interest_and_fees.png" class="tf_svg_lazy attachment-full size-full wp-post-image" alt="" decoding="async" data-tf-srcset="https://mikakoivisto.fi/wp-content/uploads/2018/02/compound_interest_and_fees.png 600w, https://mikakoivisto.fi/wp-content/uploads/2018/02/compound_interest_and_fees-300x186.png 300w, https://mikakoivisto.fi/wp-content/uploads/2018/02/compound_interest_and_fees-646x400.png 646w, https://mikakoivisto.fi/wp-content/uploads/2018/02/compound_interest_and_fees-808x500.png 808w" data-tf-sizes="(max-width: 600px) 100vw, 600px" /><noscript><img width="600" height="371" data-tf-not-load src="https://mikakoivisto.fi/wp-content/uploads/2018/02/compound_interest_and_fees.png" class="attachment-full size-full wp-post-image" alt="" decoding="async" srcset="https://mikakoivisto.fi/wp-content/uploads/2018/02/compound_interest_and_fees.png 600w, https://mikakoivisto.fi/wp-content/uploads/2018/02/compound_interest_and_fees-300x186.png 300w, https://mikakoivisto.fi/wp-content/uploads/2018/02/compound_interest_and_fees-646x400.png 646w, https://mikakoivisto.fi/wp-content/uploads/2018/02/compound_interest_and_fees-808x500.png 808w" sizes="(max-width: 600px) 100vw, 600px" /></noscript></p>
<p>This week I was featured on Finnish media sites quite prominently. It all started when I gave an interview to the Finnish newspaper Aamulehti about how I invest for son&#8217;s future and how he could become a millionaire with just under 95€/month invested from birth until he turns 17. What makes that news worthy and [&#8230;]</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2018/02/saving-investing-child/">Saving and investing for your child</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='600'%20height='371'%20viewBox=%270%200%20600%20371%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" style="background:linear-gradient(to right,#ffffff 25%,#ffffff 25% 50%,#ffffff 50% 75%,#ffffff 75%),linear-gradient(to right,#ffffff 25%,#ffffff 25% 50%,#ffffff 50% 75%,#3366cc 75%),linear-gradient(to right,#ffffff 25%,#ffffff 25% 50%,#ffffff 50% 75%,#ffffff 75%),linear-gradient(to right,#ffffff 25%,#ffffff 25% 50%,#ffffff 50% 75%,#ffffff 75%)" width="600" height="371" data-tf-src="https://mikakoivisto.fi/wp-content/uploads/2018/02/compound_interest_and_fees.png" class="tf_svg_lazy attachment-full size-full wp-post-image" alt="" decoding="async" data-tf-srcset="https://mikakoivisto.fi/wp-content/uploads/2018/02/compound_interest_and_fees.png 600w, https://mikakoivisto.fi/wp-content/uploads/2018/02/compound_interest_and_fees-300x186.png 300w, https://mikakoivisto.fi/wp-content/uploads/2018/02/compound_interest_and_fees-646x400.png 646w, https://mikakoivisto.fi/wp-content/uploads/2018/02/compound_interest_and_fees-808x500.png 808w" data-tf-sizes="(max-width: 600px) 100vw, 600px" /><noscript><img width="600" height="371" data-tf-not-load src="https://mikakoivisto.fi/wp-content/uploads/2018/02/compound_interest_and_fees.png" class="attachment-full size-full wp-post-image" alt="" decoding="async" srcset="https://mikakoivisto.fi/wp-content/uploads/2018/02/compound_interest_and_fees.png 600w, https://mikakoivisto.fi/wp-content/uploads/2018/02/compound_interest_and_fees-300x186.png 300w, https://mikakoivisto.fi/wp-content/uploads/2018/02/compound_interest_and_fees-646x400.png 646w, https://mikakoivisto.fi/wp-content/uploads/2018/02/compound_interest_and_fees-808x500.png 808w" sizes="(max-width: 600px) 100vw, 600px" /></noscript></p><p>This week I was featured on Finnish media sites quite prominently. It all started when I gave an interview to the Finnish newspaper Aamulehti about how I invest for son&#8217;s future and how he could become a millionaire with just under 95€/month invested from birth until he turns 17. What makes that news worthy and even some what controversial is that it&#8217;s the exact amount every Finnish family gets as a child allowance benefit from the Finnish government.</p>
<p>That is one of the few benefits that you can get no matter how much money you earn or how well off you are. We don&#8217;t actually need it to raise our child so what we have done is get it paid directly to our sons bank account and from there it goes to his investment account. Yes, I opened an investment account for my son right after he was born. One of the most important lesson about money I want to teach him is the wonder of compound interest. This is where the claim that you could make your child a millionaire before his retirement age comes from.</p>
<p>Let&#8217;s assume you invest 94,88€ per month from the time your child is born until he/she turns 17 and let&#8217;s assume you can get 8% annual interest on it. You also need to take into account fees so I&#8217;ve factored in 0,2% fee which what you would pay on a well diversified ETF. By the time your child is 18 you&#8217;ve accumulated 19 355,52€ as principal and the investment would be worth around 41 000€. So you&#8217;ve already doubled the invested amount. Now let&#8217;s say you manage to convince your child to leave that investment alone and they forget it until they are 61 years old. Now the investment value would have already surpassed one million mark and you still haven&#8217;t invested more that that 19 355,52€. That is the power of compound interest.</p>
<p><a href="https://mikakoivisto.fi/wp-content/uploads/2018/02/compound_interest_and_fees.png"><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='600'%20height='371'%20viewBox=%270%200%20600%20371%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" style="background:linear-gradient(to right,#ffffff 25%,#ffffff 25% 50%,#ffffff 50% 75%,#ffffff 75%),linear-gradient(to right,#ffffff 25%,#ffffff 25% 50%,#ffffff 50% 75%,#3366cc 75%),linear-gradient(to right,#ffffff 25%,#ffffff 25% 50%,#ffffff 50% 75%,#ffffff 75%),linear-gradient(to right,#ffffff 25%,#ffffff 25% 50%,#ffffff 50% 75%,#ffffff 75%)" decoding="async" class="tf_svg_lazy aligncenter size-full wp-image-70564" data-tf-src="https://mikakoivisto.fi/wp-content/uploads/2018/02/compound_interest_and_fees.png" alt="" width="600" height="371" data-tf-srcset="https://mikakoivisto.fi/wp-content/uploads/2018/02/compound_interest_and_fees.png 600w, https://mikakoivisto.fi/wp-content/uploads/2018/02/compound_interest_and_fees-300x186.png 300w, https://mikakoivisto.fi/wp-content/uploads/2018/02/compound_interest_and_fees-646x400.png 646w, https://mikakoivisto.fi/wp-content/uploads/2018/02/compound_interest_and_fees-808x500.png 808w" data-tf-sizes="(max-width: 600px) 100vw, 600px" /><noscript><img decoding="async" class="aligncenter size-full wp-image-70564" data-tf-not-load src="https://mikakoivisto.fi/wp-content/uploads/2018/02/compound_interest_and_fees.png" alt="" width="600" height="371" srcset="https://mikakoivisto.fi/wp-content/uploads/2018/02/compound_interest_and_fees.png 600w, https://mikakoivisto.fi/wp-content/uploads/2018/02/compound_interest_and_fees-300x186.png 300w, https://mikakoivisto.fi/wp-content/uploads/2018/02/compound_interest_and_fees-646x400.png 646w, https://mikakoivisto.fi/wp-content/uploads/2018/02/compound_interest_and_fees-808x500.png 808w" sizes="(max-width: 600px) 100vw, 600px" /></noscript></a></p>
<p>Above I have graphed the same investment without fees and with 1% and 2% fee. It shows you how much fees actually matter on the long term even though 1% or 2% might not sound so much. So mind the fees you are paying for your investments.</p>
<p>So where do you invest all that money? Well I&#8217;m not a certified financial planner but the advice I give people is listen to what Warren Buffett tells. He says the best investment for most people is passive index fund and the index he recommends is the S&amp;P 500. It&#8217;s not just something he says there&#8217;s actually studies that show that most active traders loose the the index on long term. It&#8217;s the simplest and most fool proof way to get the average stock market return by doing that. Okay not quite fool proof because there is human element and that is you the investor. What you need to do is never ever sell it no matter how bad the market looks like as it will bounce back. Just look at the MSCI World index from 1970 to 2016. There&#8217;s been quite a few crisis during that time but over the long term it&#8217;s gone up.</p>
<p><a href="https://mikakoivisto.fi/wp-content/uploads/2018/02/markets-have-rewarded-discipline.png"><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='835'%20height='529'%20viewBox=%270%200%20835%20529%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" style="background:linear-gradient(to right,#ffffff 25%,#ffffff 25% 50%,#ffffff 50% 75%,#ffffff 75%),linear-gradient(to right,#ffffff 25%,#ffffff 25% 50%,#7b7b7b 50% 75%,#d6d6d6 75%),linear-gradient(to right,#ffffff 25%,#e4e4e4 25% 50%,#e4e4e4 50% 75%,#e4e4e4 75%),linear-gradient(to right,#ffffff 25%,#ffffff 25% 50%,#ffffff 50% 75%,#ffffff 75%)" decoding="async" class="tf_svg_lazy aligncenter size-full wp-image-70591" data-tf-src="https://mikakoivisto.fi/wp-content/uploads/2018/02/markets-have-rewarded-discipline.png" alt="" width="835" height="529" data-tf-srcset="https://mikakoivisto.fi/wp-content/uploads/2018/02/markets-have-rewarded-discipline.png 835w, https://mikakoivisto.fi/wp-content/uploads/2018/02/markets-have-rewarded-discipline-300x190.png 300w, https://mikakoivisto.fi/wp-content/uploads/2018/02/markets-have-rewarded-discipline-768x487.png 768w, https://mikakoivisto.fi/wp-content/uploads/2018/02/markets-have-rewarded-discipline-600x380.png 600w" data-tf-sizes="(max-width: 835px) 100vw, 835px" /><noscript><img decoding="async" class="aligncenter size-full wp-image-70591" data-tf-not-load src="https://mikakoivisto.fi/wp-content/uploads/2018/02/markets-have-rewarded-discipline.png" alt="" width="835" height="529" srcset="https://mikakoivisto.fi/wp-content/uploads/2018/02/markets-have-rewarded-discipline.png 835w, https://mikakoivisto.fi/wp-content/uploads/2018/02/markets-have-rewarded-discipline-300x190.png 300w, https://mikakoivisto.fi/wp-content/uploads/2018/02/markets-have-rewarded-discipline-768x487.png 768w, https://mikakoivisto.fi/wp-content/uploads/2018/02/markets-have-rewarded-discipline-600x380.png 600w" sizes="(max-width: 835px) 100vw, 835px" /></noscript></a></p>
<p>So where to open an investment account? I&#8217;ve only invested while I was in USA and Finland so those are the two country where I can give recommendations.</p>
<p>If you are in the USA open your investment account on <a href="http://www.schwab.com">Schwab</a>. They don&#8217;t charge any fees on the account and they have a ton of low cost passive index ETFs. Another great place is Vanguard. Bear in mind that USA has Kiddie tax which is there to prevent parents from avoiding tax by stuffing their money to their children. So you need to investigate a bit how not to get hit by that tax.</p>
<p>If you are in Finland the place I recommend is <a href="http://tc.tradetracker.net/?c=10200&amp;amp;m=1201117&amp;amp;a=208930&amp;amp;r=mikakoivistofi&amp;amp;u=">Nordnet</a>. The reason is that they don&#8217;t charge fee for the account and they have ETF savings plan that automates the investing and doesn&#8217;t charge a fee for buying the ETFs.</p>
<p>Here&#8217;s links to the news stories I mentioned in the beginning:</p>
<p><a href="https://www.aamulehti.fi/uutiset/mika-koivisto-40-sijoittaa-kaikki-poikansa-lapsilisat-kaksivuotiasta-voi-odottaa-elakelaisena-kasittamaton-potti-en-tajunnut-millaisia-summia-siita-voi-poikia-200710059/">Aamulehti &#8211; Mika Koivisto, 40, sijoittaa kaikki poikansa lapsilisät</a><br /><a href="https://www.aamulehti.fi/uutiset/perheenisa-sijoittaa-lapsilisat-ja-aikoo-tienata-pojalleen-miljoonapotin-idea-sai-ihmiset-hiiltymaan-irvokasta-tassa-ajassa-200725235/">Aamulehti &#8211; Perheenisä sijoittaa lapsilisät ja aikoo tienata pojalleen miljoonapotin &#8211; idea sai ihmiset hiiltymään</a><br /><a href="https://www.kauppalehti.fi/uutiset/mika--40--haluaa-jalkikasvustaan-elakelaismiljonaarin-sijoittaa-kaikki-2-vuotiaan-poikansa-lapsilisat/x335GnxJ">Kauppalehti &#8211; Mika, 40, haluaa jälkikasvustaan eläkeläismiljonäärin</a><br /><a href="https://www.kauppalehti.fi/uutiset/uutinen/eiKxpvZA">Kauppalehti &#8211; Miten aloitan lapselle säästämisen?</a><br /><a href="https://www.talouselama.fi/uutiset/te/56b833aa-6e88-3046-ac2b-2c568733313b">Talouselämä &#8211; AL: Mika, 40, on laskenut, miten hänen 2-vuotiaasta pojastaan tulee eläkeläisenä miljonääri</a></p>
<p>This is not the first time I&#8217;m on headlines that&#8217;s because I write a personal finance blog in Finnish. It&#8217;s called &#8220;<a href="https://matkallavaurauteen.com">Matkalla vaurauteen</a>&#8221; so directly translated Road to Wealth. </p>
<!--themify_builder_content-->
<div id="themify_builder_content-70563" data-postid="70563" class="themify_builder_content themify_builder_content-70563 themify_builder tf_clear">
    </div>
<!--/themify_builder_content--><p>The post <a href="https://mikakoivisto.fi/blog/2018/02/saving-investing-child/">Saving and investing for your child</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mikakoivisto.fi/blog/2018/02/saving-investing-child/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">70563</post-id>	</item>
		<item>
		<title>How to get Tomcat to see HTTPS when it’s terminated elsewhere</title>
		<link>https://mikakoivisto.fi/blog/2017/10/how-to-get-tomcat-to-see-https-when-its-terminated-elsewhere/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=how-to-get-tomcat-to-see-https-when-its-terminated-elsewhere</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Sat, 07 Oct 2017 09:36:10 +0000</pubDate>
				<category><![CDATA[Software & DevOps]]></category>
		<guid isPermaLink="false">https://jguru.fi/?p=431</guid>

					<description><![CDATA[<p>It&#8217;s very common to terminate HTTPS (TLS) at higher up in your server stack but you still need your webapp running in tomcat to generate the urls using https even though tomcat is called with http internally in your network. This seems to be a very common problem that I keep seeing year after year [&#8230;]</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2017/10/how-to-get-tomcat-to-see-https-when-its-terminated-elsewhere/">How to get Tomcat to see HTTPS when it’s terminated elsewhere</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>It’s very common to terminate HTTPS (TLS) at higher up in your server stack but you still need your webapp running in tomcat to generate the urls using https even though tomcat is called with http internally in your network. This seems to be a very common problem that I keep seeing year after year so this short article will show you how to accomplish that and how to test it’s working.</p>
<p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='585'%20height='94'%20viewBox=%270%200%20585%2094%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" style="background:linear-gradient(to right,#ffffff 25%,#ffffff 25% 50%,#ffffff 50% 75%,#b8bfd1 75%),linear-gradient(to right,#ffffff 25%,#d0d4dd 25% 50%,#d2d6e2 50% 75%,#cdd2dc 75%),linear-gradient(to right,#ffffff 25%,#d0d4dd 25% 50%,#d2d6e2 50% 75%,#abb4c5 75%),linear-gradient(to right,#ffffff 25%,#ffffff 25% 50%,#d2d6e2 50% 75%,#eaeaea 75%)" decoding="async" class="tf_svg_lazy aligncenter size-full wp-image-434" data-tf-src="https://mikakoivisto.fi/wp-content/uploads/2017/10/https_tomcat_diagram.png" data-tf-sizes="(max-width: 585px) 100vw, 585px" data-tf-srcset="https://mikakoivisto.fi/wp-content/uploads/2017/10/https_tomcat_diagram.png 585w, https://mikakoivisto.fi/wp-content/uploads/2017/10/https_tomcat_diagram-300x48.png 300w" alt="" width="585" height="94" /><noscript><img decoding="async" class="aligncenter size-full wp-image-434" data-tf-not-load src="https://mikakoivisto.fi/wp-content/uploads/2017/10/https_tomcat_diagram.png" sizes="(max-width: 585px) 100vw, 585px" srcset="https://mikakoivisto.fi/wp-content/uploads/2017/10/https_tomcat_diagram.png 585w, https://mikakoivisto.fi/wp-content/uploads/2017/10/https_tomcat_diagram-300x48.png 300w" alt="" width="585" height="94" /></noscript></p>
<p>In this diagram https is terminated at firewall but that could as well be loadbalancer or even http server like Nginx or Apache. For the test setup I’m actually using Nginx and for instructions on how to setup HTTPS with Nginx check out my post on setting up <a href="https://mikakoivisto.fi/setting-https-lets-encrypt-nginx.html">Nginx with Let’s Encrypt</a>. Once you’ve setup https with Nginx add following location block to the server block with HTTPS. This will proxy all requests to tomcat http port 8080.</p>
<pre>location ~ / {
      proxy_set_header   Host             $host;
      proxy_set_header   X-Real-IP        $remote_addr;
      proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
      proxy_set_header   REMOTE_ADDR      $remote_addr;

      proxy_pass         http://localhost:8080;
}</pre>
<p>Tomcat is actually really easy to configure so that it is able to generate URLs with https when the https is terminated somewhere higher in the stack. All you need is to add proxyPort, scheme, and secure to the connector in server.xml. Below is an example. If you are using both http and https then just create a new connector for https traffic that is running in different port and proxy only the https traffic to that port.</p>
<pre>&lt;Connector port="8080" protocol="HTTP/1.1"
      connectionTimeout="20000"
      redirectPort="8443" 
      proxyPort="443"
      scheme="https"
      secure="true" /&gt;</pre>
<p>Now to check that it is actually working correctly you need to check your servlet container is seeing those values correctly. For that purpose I’ve created a simple webapp which you can deploy and call through your stack. It shows if each of the three checks pass and additionally shows the request URL and server name so you can also check that any virtual hosts you use are also passed correctly to the servlet container.</p>
<p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='600'%20height='222'%20viewBox=%270%200%20600%20222%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" style="background:linear-gradient(to right,#232323 25%,#232323 25% 50%,#232323 50% 75%,#232323 75%),linear-gradient(to right,#ffffff 25%,#ffffff 25% 50%,#ffffff 50% 75%,#ffffff 75%),linear-gradient(to right,#ffffff 25%,#ffffff 25% 50%,#ffffff 50% 75%,#ffffff 75%),linear-gradient(to right,#ffffff 25%,#ffffff 25% 50%,#ffffff 50% 75%,#ffffff 75%)" decoding="async" class="tf_svg_lazy aligncenter size-full wp-image-438" data-tf-src="https://mikakoivisto.fi/wp-content/uploads/2017/10/https_checker.png" data-tf-sizes="(max-width: 600px) 100vw, 600px" data-tf-srcset="https://mikakoivisto.fi/wp-content/uploads/2017/10/https_checker.png 600w, https://mikakoivisto.fi/wp-content/uploads/2017/10/https_checker-300x111.png 300w" alt="" width="600" height="222" /><noscript><img decoding="async" class="aligncenter size-full wp-image-438" data-tf-not-load src="https://mikakoivisto.fi/wp-content/uploads/2017/10/https_checker.png" sizes="(max-width: 600px) 100vw, 600px" srcset="https://mikakoivisto.fi/wp-content/uploads/2017/10/https_checker.png 600w, https://mikakoivisto.fi/wp-content/uploads/2017/10/https_checker-300x111.png 300w" alt="" width="600" height="222" /></noscript></p>
<p><a href="https://drive.google.com/file/d/0B2d_J9txLVHbSlFMUWVobFZnX2M/view?usp=sharing">Download HTTPS Checker</a> webapp. See the source in <a href="https://github.com/mikakoivisto/https-checker">Github</a>.</p>
<div id="themify_builder_content-431" class="themify_builder_content themify_builder_content-431 themify_builder themify_builder_front" data-postid="431"> </div>
<p><!-- /themify_builder_content --></p>

<!-- wp:themify-builder/canvas /--><p>The post <a href="https://mikakoivisto.fi/blog/2017/10/how-to-get-tomcat-to-see-https-when-its-terminated-elsewhere/">How to get Tomcat to see HTTPS when it’s terminated elsewhere</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">56180</post-id>	</item>
		<item>
		<title>Top 3 reasons why Liferay projects fail</title>
		<link>https://mikakoivisto.fi/blog/2017/02/top-3-reasons-why-liferay-projects-fail/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=top-3-reasons-why-liferay-projects-fail</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Tue, 28 Feb 2017 17:18:16 +0000</pubDate>
				<category><![CDATA[Software & DevOps]]></category>
		<guid isPermaLink="false">https://javaguru.fi/?p=350</guid>

					<description><![CDATA[<p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='1160'%20height='665'%20viewBox=%270%200%201160%20665%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" style="background:linear-gradient(to right,#fefffc 25%,#fefefc 25% 50%,#fefefb 50% 75%,#fefffc 75%),linear-gradient(to right,#e53034 25%,#fc5955 25% 50%,#f5fef9 50% 75%,#da7173 75%),linear-gradient(to right,#f50215 25%,#fefffc 25% 50%,#de1819 50% 75%,#ed1d17 75%),linear-gradient(to right,#fdfefc 25%,#fefffc 25% 50%,#fefffc 50% 75%,#fefffc 75%)" width="1160" height="665" data-tf-src="https://mikakoivisto.fi/wp-content/uploads/2017/02/fail-1160x665.png" class="tf_svg_lazy attachment-full size-full wp-post-image" alt="" decoding="async" data-tf-srcset="https://mikakoivisto.fi/wp-content/uploads/2017/02/fail-1160x665.png 1160w, https://mikakoivisto.fi/wp-content/uploads/2017/02/fail-1160x665-300x172.png 300w, https://mikakoivisto.fi/wp-content/uploads/2017/02/fail-1160x665-768x440.png 768w, https://mikakoivisto.fi/wp-content/uploads/2017/02/fail-1160x665-1024x587.png 1024w, https://mikakoivisto.fi/wp-content/uploads/2017/02/fail-1160x665-600x344.png 600w" data-tf-sizes="(max-width: 1160px) 100vw, 1160px" /><noscript><img width="1160" height="665" data-tf-not-load src="https://mikakoivisto.fi/wp-content/uploads/2017/02/fail-1160x665.png" class="attachment-full size-full wp-post-image" alt="" decoding="async" srcset="https://mikakoivisto.fi/wp-content/uploads/2017/02/fail-1160x665.png 1160w, https://mikakoivisto.fi/wp-content/uploads/2017/02/fail-1160x665-300x172.png 300w, https://mikakoivisto.fi/wp-content/uploads/2017/02/fail-1160x665-768x440.png 768w, https://mikakoivisto.fi/wp-content/uploads/2017/02/fail-1160x665-1024x587.png 1024w, https://mikakoivisto.fi/wp-content/uploads/2017/02/fail-1160x665-600x344.png 600w" sizes="(max-width: 1160px) 100vw, 1160px" /></noscript></p>
<p>I&#8217;ve been using Liferay for well over ten years and I&#8217;ve seen lots of different ways Liferay projects have been done. There&#8217;s been successful projects and then there&#8217;s been failed ones. You typically don&#8217;t hear about the successful projects but rather the failures but you hardly ever hear why the project failed other than of [&#8230;]</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2017/02/top-3-reasons-why-liferay-projects-fail/">Top 3 reasons why Liferay projects fail</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='1160'%20height='665'%20viewBox=%270%200%201160%20665%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" style="background:linear-gradient(to right,#fefffc 25%,#fefefc 25% 50%,#fefefb 50% 75%,#fefffc 75%),linear-gradient(to right,#e53034 25%,#fc5955 25% 50%,#f5fef9 50% 75%,#da7173 75%),linear-gradient(to right,#f50215 25%,#fefffc 25% 50%,#de1819 50% 75%,#ed1d17 75%),linear-gradient(to right,#fdfefc 25%,#fefffc 25% 50%,#fefffc 50% 75%,#fefffc 75%)" width="1160" height="665" data-tf-src="https://mikakoivisto.fi/wp-content/uploads/2017/02/fail-1160x665.png" class="tf_svg_lazy attachment-full size-full wp-post-image" alt="" decoding="async" data-tf-srcset="https://mikakoivisto.fi/wp-content/uploads/2017/02/fail-1160x665.png 1160w, https://mikakoivisto.fi/wp-content/uploads/2017/02/fail-1160x665-300x172.png 300w, https://mikakoivisto.fi/wp-content/uploads/2017/02/fail-1160x665-768x440.png 768w, https://mikakoivisto.fi/wp-content/uploads/2017/02/fail-1160x665-1024x587.png 1024w, https://mikakoivisto.fi/wp-content/uploads/2017/02/fail-1160x665-600x344.png 600w" data-tf-sizes="(max-width: 1160px) 100vw, 1160px" /><noscript><img width="1160" height="665" data-tf-not-load src="https://mikakoivisto.fi/wp-content/uploads/2017/02/fail-1160x665.png" class="attachment-full size-full wp-post-image" alt="" decoding="async" srcset="https://mikakoivisto.fi/wp-content/uploads/2017/02/fail-1160x665.png 1160w, https://mikakoivisto.fi/wp-content/uploads/2017/02/fail-1160x665-300x172.png 300w, https://mikakoivisto.fi/wp-content/uploads/2017/02/fail-1160x665-768x440.png 768w, https://mikakoivisto.fi/wp-content/uploads/2017/02/fail-1160x665-1024x587.png 1024w, https://mikakoivisto.fi/wp-content/uploads/2017/02/fail-1160x665-600x344.png 600w" sizes="(max-width: 1160px) 100vw, 1160px" /></noscript></p><p>I’ve been using Liferay for well over ten years and I’ve seen lots of different ways Liferay projects have been done. There’s been successful projects and then there’s been failed ones. You typically don’t hear about the successful projects but rather the failures but you hardly ever hear why the project failed other than of course that it’s Liferay’s fault. So I wanted to list few of the top reasons in my experience why they fail so that you can avoid them and have higher change of success. These are not really listed in any order of priority but are rather equally important.<span id="more-350"></span></p>
<h2>1. Team does not embrace or know the Liferay way</h2>
<p>If you are not taking full advantage of Liferay features then why are you even using Liferay at all? I see this a lot where people are not willing to commit to Liferay as if you’d be able to just swap it to another product. This leads to having to solve issues that Liferay has already done and provided a nice framework/api to work with. Also in order to take full advantage of Liferay features you need to know about them and that means your team needs to be trained on Liferay.</p>
<h2>2. Use of Liferay CE</h2>
<p>Liferay is an open source project so why shouldn’t I use CE to do my project? Yes, it is an open source project and that means when you encounter a bug you can either fix it yourself or you can file an issue and hope and pray that someone else fixes it and it makes it to the next release 6 months later. Now if it’s not a clear bug or you can’t produce a clear way of reproducing the unexpected behaviour your issue will most likely not get any attention so you are left with asking help from the forums. Now this is all fine if you have no hurry in getting the project to completion so that would most likely be personal website. Now if you are on a tight deadline and don’t have a capable dedicated team acting as your internal support I’d strongly recommend buying the subscription. Also using CE straight away limits you from staffing your project with the most capable people as Liferay Global Services and Liferay Partners are not allowed to work on projects where CE is used.</p>
<h2>3. Use of expert only after there are major issues</h2>
<p>This really comes back to reason #1 also but really you should use a real expert on Liferay already in the very beginning before any final decisions are made to audit your architecture and make sure you are fully embracing the Liferay way and your are in the right track to successfully completing the project. Now some will still refuse to hire an expert at this point because one costs too much but if the expert can solve your issue in say 5 days where as your team it might take 30 days was that really all that expensive.</p>
<h2>Conclusions</h2>
<p>There are many pitfalls with Liferay but having the right people involved in the project from the very beginning will go a long way to making sure the project succeeds.</p>
<p>What are your tips for successful Liferay projects?</p>
<h2></h2>
<div id="themify_builder_content-350" class="themify_builder_content themify_builder_content-350 themify_builder themify_builder_front" data-postid="350"></div>
<p><!-- /themify_builder_content --></p>
<p>The post <a href="https://mikakoivisto.fi/blog/2017/02/top-3-reasons-why-liferay-projects-fail/">Top 3 reasons why Liferay projects fail</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">10968</post-id>	</item>
		<item>
		<title>Liferay Yubikey OTP Login</title>
		<link>https://mikakoivisto.fi/blog/2017/01/liferay-yubikey-otp-login/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=liferay-yubikey-otp-login</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Mon, 30 Jan 2017 20:14:15 +0000</pubDate>
				<category><![CDATA[Software & DevOps]]></category>
		<category><![CDATA[fido u2f]]></category>
		<category><![CDATA[yubico]]></category>
		<category><![CDATA[yubikey]]></category>
		<guid isPermaLink="false">https://javaguru.fi/?p=366</guid>

					<description><![CDATA[<p>I bought a Yubikey 4 last fall but didn&#8217;t have time to play with it until now. Yubikey is awesome and quite cheap USB authentication key. It also support FIDO U2F in addition to one-time-password. So far I&#8217;ve enabled on my Facebook account as well as MacOS Sierra login. &#160;I also wanted to write some [&#8230;]</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2017/01/liferay-yubikey-otp-login/">Liferay Yubikey OTP Login</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>I bought a Yubikey 4 last fall but didn&#8217;t have time to play with it until now. Yubikey is awesome and quite cheap USB authentication key. It also support FIDO U2F in addition to one-time-password. So far I&#8217;ve enabled on my Facebook account as well as MacOS Sierra login.  I also wanted to write some code and integrate it with Liferay. As a result I&#8217;ve implemented a simple <a href="https://jguru.fi/projects/liferay-yubikey-otp-login">Yubikey OTP login</a>.<span id="more-366"></span></p>
<p>I chose to use the OTP instead of FIDO U2F because it was quite simple and I wanted to use it as primary login in place of username and password. It could have also been used as second factor to make the username and password login more secure but I&#8217;m leaving that as a future exercise.</p>
<p>I&#8217;ve posted the code on <a href="https://github.com/mikakoivisto/liferay-yubikey-otp-login">Github</a> and plan on publishing it to Liferay marketplace. Check it out and let me know what you think. Full configuration instructions are on the <a href="https://github.com/mikakoivisto/liferay-yubikey-otp-login/blob/master/README.md">README.md</a></p>
<div id="themify_builder_content-366" data-postid="366" class="themify_builder_content themify_builder_content-366 themify_builder themify_builder_front"></div>
<p><!-- /themify_builder_content --></p>
<p>The post <a href="https://mikakoivisto.fi/blog/2017/01/liferay-yubikey-otp-login/">Liferay Yubikey OTP Login</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		<enclosure length="0" type="" url=""/>

		<post-id xmlns="com-wordpress:feed-additions:1">412</post-id>	</item>
		<item>
		<title>Creating a custom Nginx build for Ubuntu/Debian</title>
		<link>https://mikakoivisto.fi/blog/2016/07/creating-a-custom-nginx-build-for-ubuntudebian/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=creating-a-custom-nginx-build-for-ubuntudebian</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Thu, 07 Jul 2016 16:04:07 +0000</pubDate>
				<category><![CDATA[Software & DevOps]]></category>
		<category><![CDATA[ngx_cache_purge]]></category>
		<category><![CDATA[pagespeed]]></category>
		<guid isPermaLink="false">https://javaguru.fi/?p=174</guid>

					<description><![CDATA[<p>I&#8217;ve been using the RTCamp Ubuntu package for Nginx because it had ngx_cache_purge and ngx_pagespeed modules builtin. The problem with is that it&#8217;s still stuck on Nginx 1.8 version which doesn&#8217;t support HTTP/2 so I had to figure out how to do my own build based on the latest Nginx mainline version. These instructions apply [&#8230;]</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2016/07/creating-a-custom-nginx-build-for-ubuntudebian/">Creating a custom Nginx build for Ubuntu/Debian</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>I&#8217;ve been using the RTCamp Ubuntu package for Nginx because it had ngx_cache_purge and ngx_pagespeed modules builtin. The problem with is that it&#8217;s still stuck on Nginx 1.8 version which doesn&#8217;t support HTTP/2 so I had to figure out how to do my own build based on the latest Nginx mainline version. <span id="more-174"></span></p>
<p>These instructions apply to both Debian and Ubuntu even though for my example I use the Ubuntu 16.04 LTS. I&#8217;ll be adding ngx_cache_purge, ngx_pagespeed and headers-more modules in to the package.</p>
<p><strong>Prepare for the build</strong></p>
<p>I like to work on anything that require compiling in /usr/local/src so we&#8217;ll need to go there and you&#8217;ll need to get the nginx package signing key to make apt happy.</p>
<pre>cd /usr/local/src
wget http://nginx.org/keys/nginx_signing.key
apt-key add nginx_signing.key</pre>
<p>I&#8217;m using the mainline of Nginx which gets more frequent updates than stable but is still just as stable.</p>
<pre>cat &lt;&lt;-EOF &gt; /etc/apt/source.list.d/nginx.list
deb http://nginx.org/packages/mainline/ubuntu/ xenial nginx
deb-src http://nginx.org/packages/mainline/ubuntu/ xenial nginx
EOF

apt-get update</pre>
<p>Get the build dependencies and the source code for nginx.</p>
<pre>apt-get build-dep nginx
apt-get source nginx</pre>
<p>At the time of writing this the latest version of nginx I get from the repository is 1.11.2. So the nginx source I get are in directory nginx-1.11.2. The debian package files are under debian in the source and that&#8217;s where I&#8217;m going to create modules directory for the code of the modules I want included.</p>
<pre>mkdir nginx-1.11.2/debian/modules
cd nginx-1.11.2/debian/modules</pre>
<p><strong>Get the modules</strong></p>
<p>Now in the modules directory I&#8217;m going to download and extract the code for each of the modules I want included.</p>
<pre>wget https://github.com/FRiCKLE/ngx_cache_purge/archive/2.3.tar.gz
tar -zxvf 2.3.tar.gz</pre>
<p>That extracts the ngx_cache_purge module to directory <span class="s1">ngx_cache_purge-2.3 remember that as we&#8217;ll need it later.</span></p>
<pre>wget https://github.com/pagespeed/ngx_pagespeed/archive/v1.11.33.2-beta.tar.gz
tar -zxvf v1.11.33.2-beta.tar.gz
cd ngx_pagespeed-1.11.33.2-beta/
wget https://dl.google.com/dl/page-speed/psol/1.11.33.2.tar.gz
tar -zxvf 1.11.33.2.tar.gz</pre>
<p>For Google Pagespeed you&#8217;ll need to get the nginx module and the pagespeed implementation. Again note the module directory ngx_pagespeed-1.11.33.2-beta.</p>
<pre>wget https://github.com/openresty/headers-more-nginx-module/archive/v0.30.tar.gz
tar -zxvf v0.30.tar.gz</pre>
<p>Again note the directory where headers more is extracted which in this case is <span class="s1">headers-more-nginx-module-0.30.</span></p>
<p><strong>Configure compiler arguments</strong></p>
<p>The last thing to do before we can actually build this thing is we need to add the modules into the actual build. That happens by modifying the rules file under debian directory of nginx. I&#8217;ll simply add the &#8211;add-module lines as the last arguments to COMMON_CONFIGURE_ARGS. Note the backslash  at the end of the line, make sure you remember to add it to the currently last argument which in my case is <span class="s1">&#8211;with-ld-opt=&#8221;$(LDFLAGS)&#8221; so yours should look like this with the added lines bolded. </span></p>
<pre>COMMON_CONFIGURE_ARGS := 
 --prefix=/etc/nginx 
 --sbin-path=/usr/sbin/nginx 
 --modules-path=/usr/lib/nginx/modules 
 --conf-path=/etc/nginx/nginx.conf 
 --error-log-path=/var/log/nginx/error.log 
 --http-log-path=/var/log/nginx/access.log 
 --pid-path=/var/run/nginx.pid 
 --lock-path=/var/run/nginx.lock 
 --http-client-body-temp-path=/var/cache/nginx/client_temp 
 --http-proxy-temp-path=/var/cache/nginx/proxy_temp 
 --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp 
 --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp 
 --http-scgi-temp-path=/var/cache/nginx/scgi_temp 
 --user=nginx 
 --group=nginx 
 --with-http_ssl_module 
 --with-http_realip_module 
 --with-http_addition_module 
 --with-http_sub_module 
 --with-http_dav_module 
 --with-http_flv_module 
 --with-http_mp4_module 
 --with-http_gunzip_module 
 --with-http_gzip_static_module 
 --with-http_random_index_module 
 --with-http_secure_link_module 
 --with-http_stub_status_module 
 --with-http_auth_request_module 
 --with-http_xslt_module=dynamic 
 --with-http_image_filter_module=dynamic 
 --with-http_geoip_module=dynamic 
 --with-http_perl_module=dynamic 
 --add-dynamic-module=debian/extra/njs-ef2b708510b1/nginx 
 --with-threads 
 --with-stream 
 --with-stream_ssl_module 
 --with-http_slice_module 
 --with-mail 
 --with-mail_ssl_module 
 --with-file-aio 
 --with-ipv6 
 $(WITH_HTTP2) 
 --with-cc-opt="$(CFLAGS)" 
 --with-ld-opt="$(LDFLAGS)" <strong></strong>
<strong> --add-module="$(CURDIR)/debian/modules/ngx_cache_purge-2.3" </strong>
<strong> --add-module="$(CURDIR)/debian/modules/ngx_pagespeed-1.11.33.2-beta" </strong>
<strong> --add-module="$(CURDIR)/debian/modules/headers-more-nginx-module-0.30" </strong></pre>
<p><strong>Compile and build the package</strong></p>
<p>Now you are ready to build the deb package. Make sure you are in the nginx source root.</p>
<pre>cd /usr/local/src/nginx-1.11.2
dpkg-buildpackage -uc -b
cd ..</pre>
<p><strong>Install customized Nginx</strong></p>
<p>Now you should have all the nginx packages built and can install them with dpkg but when you install them you need to remember to tell apt to hold the packages and not upgrade them from a newer release from the repository. If there is a new release that you want to upgrade to you need to repeat these steps.</p>
<pre>dpkg --install nginx_1.11.2-1~xenial_amd64.deb
apt-mark hold nginx
dpkg --install nginx-module-geoip_1.11.2-1~xenial_amd64.deb
apt-mark hold nginx-module-geoip</pre>
<p>Once you&#8217;ve installed the package you can verify that it indeed has the modules by running:</p>
<pre>nginx -V 2&gt;&amp;1 | grep ngx_cache_purge -o</pre>
<p>If you got back ngx_cache_purge then congrats it worked. If it didn&#8217;t then make sure your &#8211;add-module argument is correctly done.</p>
<!--themify_builder_content-->
<div id="themify_builder_content-302" data-postid="302" class="themify_builder_content themify_builder_content-302 themify_builder tf_clear">
    </div>
<!--/themify_builder_content-->
<p>The post <a href="https://mikakoivisto.fi/blog/2016/07/creating-a-custom-nginx-build-for-ubuntudebian/">Creating a custom Nginx build for Ubuntu/Debian</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">302</post-id>	</item>
		<item>
		<title>Moving a project from one git repository to another while retaining it’s history</title>
		<link>https://mikakoivisto.fi/blog/2016/06/moving-a-project-from-one-git-repository-to-another-while-retaining-its-history/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=moving-a-project-from-one-git-repository-to-another-while-retaining-its-history</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Sat, 11 Jun 2016 15:36:35 +0000</pubDate>
				<category><![CDATA[Software & DevOps]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[repository]]></category>
		<guid isPermaLink="false">https://javaguru.fi/?p=168</guid>

					<description><![CDATA[<p>I recently had to move a project from one git repository to another existing repository under different source tree and I wanted to retain the history of each file. This is rather easy once you know how to do it but you can easily jack up things if you don&#8217;t know. So I wanted to [&#8230;]</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2016/06/moving-a-project-from-one-git-repository-to-another-while-retaining-its-history/">Moving a project from one git repository to another while retaining it’s history</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>I recently had to move a project from one git repository to another existing repository under different source tree and I wanted to retain the history of each file. This is rather easy once you know how to do it but you can easily jack up things if you don&#8217;t know. So I wanted to write clear instructions for the next time I have to do this and hopefully it also helps someone else.<span id="more-168"></span></p>
<p>So I&#8217;m going to use Liferay as the example for this so that it&#8217;s as clear as it can be. We have two repositories <a href="https://github.com/liferay/liferay-portal">liferay-portal</a> and <a href="https://github.com/liferay/liferay-plugins">liferay-plugins</a> which are both hosted on Github. Lets assume as we are modularizing things we want to move the akismet-portlet plugin from liferay-plugins repository to liferay-portal repository under modules/apps/akismet. The akismet-portlet is currently under portlets in the liferay-plugins repository. We could simply copy it there but then we would loose the whole history of that project. So we&#8217;ll use some git magic to pull the akismet-portlet into the new path under liferay-portal repository. This example assumes you are working with the master branch but the same steps works with any branch.</p>
<p><strong>1.  Clone the liferay-plugins repository</strong></p>
<p>It&#8217;s important to create a fresh clone of the repository as what we are about to do to it will make it unusable. There is a way to recover though I learned that the hard way.</p>
<pre>git clone git@github.com:liferay/liferay-plugins.git tmp-plugins-repo
cd tmp-plugins-repo</pre>
<p><strong>2. Extract the akismet-portlet and it&#8217;s history</strong></p>
<p>In this step we&#8217;ll checkout the branch from which we want to move the project and then we&#8217;ll rewrite the branch so that it only contains commits to the project we want to move. <strong>Word of warning if you skipped step one go back to it since this is destructive operation. </strong></p>
<pre>git checkout master
git filter-branch --subdirectory-filter portlets/akismet-portlet -- --all</pre>
<p>When you&#8217;ve ran the the git filter-branch you&#8217;ll notice that the files from portlets/akismet-portlet are now in the root and nothing else in the repository appears to exist.</p>
<p><strong>3. Move the project to it&#8217;s new path in the new repository</strong></p>
<p>Next we need to move the files to the path they are going to be in the liferay-portal repository which is under modules/apps/akismet.</p>
<pre>mkdir -p modules/apps/akismet/akismet-portlet
git mv -k * modules/apps/akismet/akismet-portlet
git commit -a "Moved akismet-portlet to modules/apps/akismet/akismet-portlet"</pre>
<p>Now the files are in their right place and the changes have been committed to the repository.</p>
<p><strong>4. Pull the akismet-portlet from liferay-plugins to liferay-portal repository</strong></p>
<p>Now you need to clone the liferay-portal repository if you haven&#8217;t done it yet. I&#8217;m assuming that it is next to the tmp-plugins-repo.</p>
<pre>git remote add tmp-plugins-repo ../tmp-plugins-repo
git checkout -b akismet-portlet-move
git pull tmp-plugins-repo master</pre>
<p>Now you are ready to merge it to master or send a pull request to someone who will merge it. The only thing is that it has to be merged and can&#8217;t be rebased.</p>
<p>Now I used Liferay&#8217;s Github repository as example but at Liferay when we move things around we always do it with plain copy followed by massive commit that looses all history. If you don&#8217;t care about file history then that works just fine but don&#8217;t come crying to me when you try to track down why a certain line of code was added.</p>
<!--themify_builder_content-->
<div id="themify_builder_content-300" data-postid="300" class="themify_builder_content themify_builder_content-300 themify_builder tf_clear">
    </div>
<!--/themify_builder_content-->
<p>The post <a href="https://mikakoivisto.fi/blog/2016/06/moving-a-project-from-one-git-repository-to-another-while-retaining-its-history/">Moving a project from one git repository to another while retaining it’s history</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">300</post-id>	</item>
		<item>
		<title>Setting up https with Let’s Encrypt on Nginx</title>
		<link>https://mikakoivisto.fi/blog/2016/05/setting-up-https-with-lets-encrypt-on-nginx/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=setting-up-https-with-lets-encrypt-on-nginx</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Sun, 29 May 2016 15:40:24 +0000</pubDate>
				<category><![CDATA[Software & DevOps]]></category>
		<category><![CDATA[certificate]]></category>
		<category><![CDATA[https]]></category>
		<category><![CDATA[ssl]]></category>
		<category><![CDATA[tls]]></category>
		<guid isPermaLink="false">https://javaguru.fi/?p=162</guid>

					<description><![CDATA[<p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='994'%20height='421'%20viewBox=%270%200%20994%20421%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" style="background:linear-gradient(to right,#f7f7f7 25%,#f7f7f7 25% 50%,#f7f7f7 50% 75%,#f7f7f7 75%),linear-gradient(to right,#fdfdfd 25%,#fdfdfd 25% 50%,#0fcc23 50% 75%,#fdfdfd 75%),linear-gradient(to right,#fdfdfd 25%,#fdfdfd 25% 50%,#fdfdfd 50% 75%,#fdfdfd 75%),linear-gradient(to right,#7cd54c 25%,#7cd54c 25% 50%,#7cd54c 50% 75%,#7cd54c 75%)" width="994" height="421" data-tf-src="https://mikakoivisto.fi/wp-content/uploads/2016/05/ssltest_rating.png" class="tf_svg_lazy attachment-full size-full wp-post-image" alt="" decoding="async" data-tf-srcset="https://mikakoivisto.fi/wp-content/uploads/2016/05/ssltest_rating.png 994w, https://mikakoivisto.fi/wp-content/uploads/2016/05/ssltest_rating-300x127.png 300w, https://mikakoivisto.fi/wp-content/uploads/2016/05/ssltest_rating-768x325.png 768w, https://mikakoivisto.fi/wp-content/uploads/2016/05/ssltest_rating-944x400.png 944w, https://mikakoivisto.fi/wp-content/uploads/2016/05/ssltest_rating-1180x500.png 1180w" data-tf-sizes="(max-width: 994px) 100vw, 994px" /><noscript><img width="994" height="421" data-tf-not-load src="https://mikakoivisto.fi/wp-content/uploads/2016/05/ssltest_rating.png" class="attachment-full size-full wp-post-image" alt="" decoding="async" srcset="https://mikakoivisto.fi/wp-content/uploads/2016/05/ssltest_rating.png 994w, https://mikakoivisto.fi/wp-content/uploads/2016/05/ssltest_rating-300x127.png 300w, https://mikakoivisto.fi/wp-content/uploads/2016/05/ssltest_rating-768x325.png 768w, https://mikakoivisto.fi/wp-content/uploads/2016/05/ssltest_rating-944x400.png 944w, https://mikakoivisto.fi/wp-content/uploads/2016/05/ssltest_rating-1180x500.png 1180w" sizes="(max-width: 994px) 100vw, 994px" /></noscript></p>
<p>Let&#8217;s Encrypt is an awesome free, automated and open way of protecting your site with https. As you may have noticed this site is using Let&#8217;s Encrypt certificate and I&#8217;ve started rolling it out to all my other sites too. With free https certificate there&#8217;s really no excuse not to use https only. In fact [&#8230;]</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2016/05/setting-up-https-with-lets-encrypt-on-nginx/">Setting up https with Let’s Encrypt on Nginx</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='994'%20height='421'%20viewBox=%270%200%20994%20421%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" style="background:linear-gradient(to right,#f7f7f7 25%,#f7f7f7 25% 50%,#f7f7f7 50% 75%,#f7f7f7 75%),linear-gradient(to right,#fdfdfd 25%,#fdfdfd 25% 50%,#0fcc23 50% 75%,#fdfdfd 75%),linear-gradient(to right,#fdfdfd 25%,#fdfdfd 25% 50%,#fdfdfd 50% 75%,#fdfdfd 75%),linear-gradient(to right,#7cd54c 25%,#7cd54c 25% 50%,#7cd54c 50% 75%,#7cd54c 75%)" width="994" height="421" data-tf-src="https://mikakoivisto.fi/wp-content/uploads/2016/05/ssltest_rating.png" class="tf_svg_lazy attachment-full size-full wp-post-image" alt="" decoding="async" data-tf-srcset="https://mikakoivisto.fi/wp-content/uploads/2016/05/ssltest_rating.png 994w, https://mikakoivisto.fi/wp-content/uploads/2016/05/ssltest_rating-300x127.png 300w, https://mikakoivisto.fi/wp-content/uploads/2016/05/ssltest_rating-768x325.png 768w, https://mikakoivisto.fi/wp-content/uploads/2016/05/ssltest_rating-944x400.png 944w, https://mikakoivisto.fi/wp-content/uploads/2016/05/ssltest_rating-1180x500.png 1180w" data-tf-sizes="(max-width: 994px) 100vw, 994px" /><noscript><img width="994" height="421" data-tf-not-load src="https://mikakoivisto.fi/wp-content/uploads/2016/05/ssltest_rating.png" class="attachment-full size-full wp-post-image" alt="" decoding="async" srcset="https://mikakoivisto.fi/wp-content/uploads/2016/05/ssltest_rating.png 994w, https://mikakoivisto.fi/wp-content/uploads/2016/05/ssltest_rating-300x127.png 300w, https://mikakoivisto.fi/wp-content/uploads/2016/05/ssltest_rating-768x325.png 768w, https://mikakoivisto.fi/wp-content/uploads/2016/05/ssltest_rating-944x400.png 944w, https://mikakoivisto.fi/wp-content/uploads/2016/05/ssltest_rating-1180x500.png 1180w" sizes="(max-width: 994px) 100vw, 994px" /></noscript></p><p><a href="https://letsencrypt.org/">Let&#8217;s Encrypt</a> is an awesome free, automated and open way of protecting your site with https. As you may have noticed this site is using Let&#8217;s Encrypt certificate and I&#8217;ve started rolling it out to all my other sites too. With free https certificate there&#8217;s really no excuse not to use https only. In fact if you want to take advantage of HTTP/2 you&#8217;ll need https since no one currently supports it unencrypted even though the spec doesn&#8217;t mandate it.<span id="more-162"></span></p>
<p>Even if your site doesn&#8217;t have any sensitive information if you ever update/login to it from from a untrusted location such as Café your login credential might get disclosed to someone malicious and like most of us you&#8217;ll probably use the same credentials in multiple places that might be a real bad thing. Now I didn&#8217;t come up with all these steps I&#8217;m about to explain here but the credit rather goes to <a href="https://bjornjohansen.no/">Bjørn Johansen</a> whose blog posts I&#8217;ll summarise here. I&#8217;ll link all the posts I used as initial reference to set this up on my server at the end of the post in case you&#8217;ll need more details. Let&#8217;s Encrypt support for Nginx is still experimental and buggy so you&#8217;ll need to use manual method to install it.</p>
<p><strong>Setting up Let&#8217;s Encrypt client</strong></p>
<p>We&#8217;ll use git to get the client and bc is needed later so in Ubuntu/Debian you&#8217;ll install them with apt.</p>
<pre>apt-get install git bc</pre>
<p>Now with git we&#8217;ll clone the Let&#8217;s Encrypt client repo.</p>
<pre>git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt</pre>
<p><strong>Preparing Nginx</strong></p>
<p>To verify the domain Let&#8217;s Encrypt verification server will look for verification files created by the client in a subdirectory of your webroot under:  /.well-know/acme-challenge/</p>
<p>Since I have lots of sites under the same Nginx and I want them all to use https eventually I&#8217;ve created a configuration snippet under /etc/nginx/global named letsencrypt-challenge.conf with the following content:</p>
<pre><code># Allow access to the ACME Challenge for Let’s Encrypt</code>
<code>location ~ /.well-known/acme-challenge {</code>
<code>    allow all;</code>
<code>}</code></pre>
<p>This is not required if you don&#8217;t block files starting with a dot.</p>
<p>The server section for the site could look something like this:</p>
<pre><code>server {
    listen 80;
    server_name example.com;
    root /var/www/example.com;

    include global/letsencrypt-challenge.conf;
}</code></pre>
<p>Once you&#8217;ve added the global/letsencrypt-challenge.conf in don&#8217;t forget to reload your nginx.</p>
<pre><span style="line-height: 24px">service nginx reload</span></pre>
<p><strong>Get the certificate from Let&#8217;s Encrypt</strong></p>
<p>Now you are ready to use the Let&#8217;s Encrypt client to request a certificate for your domain.</p>
<pre><span style="line-height: 24px">/opt/letsencrypt/letsencrypt-auto certonly --agree-tos --webroot -w /var/www/example.com 
-d example.com</span></pre>
<p>If all goes well you&#8217;ll get four files under /etc/letsencrypt/live/example.com. Those files are privkey.pem, cert.pem, chain.pem and fullchain.pem. You&#8217;ll need those to setup ssl in Nginx but before we do that let&#8217;s make sure the certificate is automatically renewed because it will be valid only 90 days.</p>
<p><strong>Setup auto renew for certificate</strong></p>
<p>So like I just mentioned the certificates from Let&#8217;s Encrypt are only valid for 90 days and I&#8217;m sure you don&#8217;t want to try to remember to renew them manually so we&#8217;ll setup a cron job to do that automatically for us. There&#8217;s already a nice script that will do all the heavy lifting for us. Well just need to download it and make it executable for root.</p>
<pre><code>curl https://gist.githubusercontent.com/bjornjohansen/aaf0d29f225ffd1ea222/raw/e1b4bec81d32dba86e2d4e9d70a2b9f4d6cca773/le-renew.sh &gt; /opt/le-renew.sh
chown root:root /opt/le-renew.sh
chmod 0500 /opt/le-renew.sh</code></pre>
<p>Please note that this script assumes you installed Let&#8217;s Encrypt client in /opt/letsencrypt if you didn&#8217;t please adjust the path in the script. It&#8217;s also good idea to try to understand what the script does and not just blindly execute any script you&#8217;ve downloaded from the web as root.</p>
<p>The script tries to renew the certificate for you when the expiration date is less than 30 days away. Well setup cron to run the script once a week so even if it fails for some reason there&#8217;s still plenty of time to get it right. Create a file /etc/cron.d/letsencrypt-renew with following content:</p>
<pre>32 5 * * 1 root /opt/le-renew.sh example.com /var/www/example.com &gt; /dev/null 2&gt;&amp;1</pre>
<p><strong>Setup https in Nginx</strong></p>
<p>In order to https you&#8217;ll need a new server block that listens the port 443 and you&#8217;ll need to tell nginx where the private key and certificate are found for this domain.</p>
<pre><code>server {
    listen 443 ssl;
    server_name example.com;
    root /var/www/example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;</code>
<code>    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;</code><code>

    include global/letsencrypt-challenge.conf;
}</code></pre>
<p>That is what is required at the minimum but we are not going to stop there as there are six more steps we can take to make it more secure and optimize it&#8217;s https performance.</p>
<p><strong>1) Connection credential caching</strong></p>
<p>Most of the https overhead is in the initial connection setup and by caching the parameters we&#8217;ll significantly improve subsequent requests. All you need is following lines in your config:</p>
<pre>ssl_session_cache shared:SSL:20m;
ssl_session_timeout 60m;</pre>
<p>This creates a shared cache between all the worker processes. 1MB cache can store around 4000 sessions so this should be plenty for most sites. You can adjust it smaller if you are concerned but Nginx should be smart enough not to consume all memory just for the cache.</p>
<p><strong>2) Disable SSL</strong></p>
<p>This may seem counterintuitive but https is actually SSL (secure socket layer) and TLS (transport layer security). Technically SSL has been superseded by TLS and SSL shouldn&#8217;t be used because of many weaknesses it has. Disabling SSL means you are making your site not accessible by IE6 but do you really care about that.</p>
<p>The latest version of TLS is 1.2 but there are still modern browsers that only support 1.0 so we should also support it. Just add following line to you nginx config:</p>
<pre>ssl_protocols TLSv1 TLSv1.1 TLSv1.2;</pre>
<p><strong>3) Optimize cipher suites</strong></p>
<p>Encryption is at the core of https and some of the ciphers are more secure and some are not secure at all anymore so we&#8217;ll want to tell the client the preferred order of cipher suites to use. All of the ciphers on this list use forward secrecy but with this list you&#8217;ll loose support for all IE versions on Windows XP but again do you really care.</p>
<pre>ssl_prefer_server_ciphers on;
ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5</pre>
<p><strong>4) Generate DH parameters</strong></p>
<p>DH parameters affect the Diffie-Hellman key exchange which where client and server negotiate the key for the session. By default it&#8217;s only 1024 bit key and our Let&#8217;s Encrypt key is 2048 bits so we need to make Nginx also use 2048 bits for DH key exchange otherwise it&#8217;s not as secure as it could be. The only downside is that Java 6 doesn&#8217;t support anything over 1024 but again do you really care about that.</p>
<p>Generate the DH parameters file with 2048 bit long prime.</p>
<pre>openssl dhparam 2048 -out /etc/nginx/cert/dhparam.pem</pre>
<p>Add the dhparam to your config file:</p>
<pre>ssl_dhparam /etc/nginx/cert/dhparam.pem;</pre>
<p><strong>5) Enable OCSP stapling</strong></p>
<p>When a proper browser is presented with a certificate it will check to see if that certificate is revoked from the issuer and that adds extra overhead. This is where Online Certificate Status Protocol (OCSP) comes to rescue. The web server contacts the certificate authority&#8217;s OCSP server at regular interval to get a signed response which it then staples on the handshake when the connection is setup. This is much more efficient than having the browser go out to do the check.</p>
<p>To make sure the response from the CA is not tampered with nginx needs to check the CA root and intermediate certificates. Let&#8217;s Encrypt client already provides us with all the required certificates so all we need to do is configure stapling and the ssl_trusted_certificate.</p>
<pre>ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;</pre>
<p>The resolver is a must and you can use Google public DNS servers as I&#8217;ve used here or you can use your own.</p>
<p><strong>6) Strict transport security</strong></p>
<p>HTTP Strict Transport Security (HSTS) is a way to tell the browser that this domain should only be used over https. Even though you might setup redirection from http to https any requests that go over http are insecure. This feature is supported in all modern browsers and it&#8217;s really simple to enable you&#8217;ll just add a header Strict-Transport-Security with the maximum age. Then for the specified amount of time the browser doesn&#8217;t even try to access the site via http.</p>
<pre>add_header Strict-Transport-Security "max-age=31536000" always;</pre>
<p><strong>Putting it all together</strong></p>
<p>That&#8217;s a lot of configuration so here is a complete example configuration:</p>
<pre><code>server {
    listen 443 ssl;
    server_name example.com;
    root /var/www/example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;</code>
<code>    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;</code><code>

    include global/letsencrypt-challenge.conf;

    ssl_session_cache shared:SSL:20m;
    ssl_session_timeout 60m;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

</code><code>    ssl_prefer_server_ciphers on;
    ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5

    ssl_dhparam /etc/nginx/cert/dhparam.pem;

    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8 8.8.4.4;
    ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;

    add_header Strict-Transport-Security "max-age=31536000" always;
}</code></pre>
<p><strong>Optional steps</strong></p>
<p>What you most likely want to do is redirect from http to https. That is done by replacing your old server with following:</p>
<pre><code>server {
    listen 80;
    server_name example.com;
    root /var/www/example.com;

    return 301 https://$host$request_uri;
}</code></pre>
<p>Since you have https setup you might want to enable HTTP/2 if you are using new enough Nginx. That is very simple you just add the word http2 after ssl in the listen like this:</p>
<pre><code>listen 443 ssl http2;</code></pre>
<p>But if you are running an older nginx you can still enable SPDY which has been superseded by HTTP/2 but it might still be useful until you can enable HTTP/2. SPDY is enabled similarly to HTTP/2.</p>
<pre><code>listen 443 ssl spdy;</code></pre>
<p><strong>Test your configuration</strong></p>
<p>So how do you know you configured everything correctly. The site might be working in your browser but that still doesn&#8217;t guarantee everything is correct. Qualys SSL Labs provides a nice <a href="https://www.ssllabs.com/ssltest/index.html">scanner</a> to test your setup. If you configured everything correctly you should get A+ rating just as is shown below for this site.</p>
<p><a href="https://javaguru.fi/wp-content/uploads/2016/05/ssltest_rating.png" rel="lightbox[162] attachment wp-att-165"></a></p>
<p><strong>References:</strong><br />
[1] <a href="https://bjornjohansen.no/lets-encrypt-for-nginx">Let&#8217;s Encrypt for Nginx</a><br />
[2] <a href="https://bjornjohansen.no/optimizing-https-nginx">Optimizing HTTPS on Nginx</a></p>
<!--themify_builder_content-->
<div id="themify_builder_content-229" data-postid="229" class="themify_builder_content themify_builder_content-229 themify_builder tf_clear">
    </div>
<!--/themify_builder_content-->
<p>The post <a href="https://mikakoivisto.fi/blog/2016/05/setting-up-https-with-lets-encrypt-on-nginx/">Setting up https with Let’s Encrypt on Nginx</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">229</post-id>	</item>
		<item>
		<title>Welcome to my new site</title>
		<link>https://mikakoivisto.fi/blog/2016/04/welcome-new-site/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=welcome-new-site</link>
					<comments>https://mikakoivisto.fi/blog/2016/04/welcome-new-site/#respond</comments>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Fri, 29 Apr 2016 09:51:07 +0000</pubDate>
				<category><![CDATA[Miscellaneous]]></category>
		<guid isPermaLink="false">http://mikakoivisto.fi/?p=27</guid>

					<description><![CDATA[<p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='1728'%20height='800'%20viewBox=%270%200%201728%20800%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" style="background:linear-gradient(to right,#060606 25%,#8b8c8e 25% 50%,#77787a 50% 75%,#505251 75%),linear-gradient(to right,#858688 25%,#37383a 25% 50%,#f89e9e 50% 75%,#f1f5f6 75%),linear-gradient(to right,#919294 25%,#f99a96 25% 50%,#f58182 50% 75%,#323232 75%),linear-gradient(to right,#565857 25%,#f5797b 25% 50%,#3b3b3b 50% 75%,#292929 75%)" width="1728" height="800" data-tf-src="https://mikakoivisto.fi/wp-content/uploads/2016/04/website-update.jpg" class="tf_svg_lazy attachment-full size-full wp-post-image" alt="" decoding="async" data-tf-srcset="https://mikakoivisto.fi/wp-content/uploads/2016/04/website-update.jpg 1728w, https://mikakoivisto.fi/wp-content/uploads/2016/04/website-update-300x139.jpg 300w, https://mikakoivisto.fi/wp-content/uploads/2016/04/website-update-768x356.jpg 768w, https://mikakoivisto.fi/wp-content/uploads/2016/04/website-update-1024x474.jpg 1024w, https://mikakoivisto.fi/wp-content/uploads/2016/04/website-update-1024x474-864x400.jpg 864w, https://mikakoivisto.fi/wp-content/uploads/2016/04/website-update-1024x474-1080x500.jpg 1080w" data-tf-sizes="(max-width: 1728px) 100vw, 1728px" /><noscript><img width="1728" height="800" data-tf-not-load src="https://mikakoivisto.fi/wp-content/uploads/2016/04/website-update.jpg" class="attachment-full size-full wp-post-image" alt="" decoding="async" srcset="https://mikakoivisto.fi/wp-content/uploads/2016/04/website-update.jpg 1728w, https://mikakoivisto.fi/wp-content/uploads/2016/04/website-update-300x139.jpg 300w, https://mikakoivisto.fi/wp-content/uploads/2016/04/website-update-768x356.jpg 768w, https://mikakoivisto.fi/wp-content/uploads/2016/04/website-update-1024x474.jpg 1024w, https://mikakoivisto.fi/wp-content/uploads/2016/04/website-update-1024x474-864x400.jpg 864w, https://mikakoivisto.fi/wp-content/uploads/2016/04/website-update-1024x474-1080x500.jpg 1080w" sizes="(max-width: 1728px) 100vw, 1728px" /></noscript></p>
<p>In the past I&#8217;ve had several sites for my various interests and many of them had some kind of profile who I am but as there are so many they can easily get out dated and some of them I&#8217;ve had semi anonymous. That changes now. I&#8217;m launching this site to serve two purpose: Serve [&#8230;]</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2016/04/welcome-new-site/">Welcome to my new site</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='1728'%20height='800'%20viewBox=%270%200%201728%20800%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" style="background:linear-gradient(to right,#060606 25%,#8b8c8e 25% 50%,#77787a 50% 75%,#505251 75%),linear-gradient(to right,#858688 25%,#37383a 25% 50%,#f89e9e 50% 75%,#f1f5f6 75%),linear-gradient(to right,#919294 25%,#f99a96 25% 50%,#f58182 50% 75%,#323232 75%),linear-gradient(to right,#565857 25%,#f5797b 25% 50%,#3b3b3b 50% 75%,#292929 75%)" width="1728" height="800" data-tf-src="https://mikakoivisto.fi/wp-content/uploads/2016/04/website-update.jpg" class="tf_svg_lazy attachment-full size-full wp-post-image" alt="" decoding="async" data-tf-srcset="https://mikakoivisto.fi/wp-content/uploads/2016/04/website-update.jpg 1728w, https://mikakoivisto.fi/wp-content/uploads/2016/04/website-update-300x139.jpg 300w, https://mikakoivisto.fi/wp-content/uploads/2016/04/website-update-768x356.jpg 768w, https://mikakoivisto.fi/wp-content/uploads/2016/04/website-update-1024x474.jpg 1024w, https://mikakoivisto.fi/wp-content/uploads/2016/04/website-update-1024x474-864x400.jpg 864w, https://mikakoivisto.fi/wp-content/uploads/2016/04/website-update-1024x474-1080x500.jpg 1080w" data-tf-sizes="(max-width: 1728px) 100vw, 1728px" /><noscript><img width="1728" height="800" data-tf-not-load src="https://mikakoivisto.fi/wp-content/uploads/2016/04/website-update.jpg" class="attachment-full size-full wp-post-image" alt="" decoding="async" srcset="https://mikakoivisto.fi/wp-content/uploads/2016/04/website-update.jpg 1728w, https://mikakoivisto.fi/wp-content/uploads/2016/04/website-update-300x139.jpg 300w, https://mikakoivisto.fi/wp-content/uploads/2016/04/website-update-768x356.jpg 768w, https://mikakoivisto.fi/wp-content/uploads/2016/04/website-update-1024x474.jpg 1024w, https://mikakoivisto.fi/wp-content/uploads/2016/04/website-update-1024x474-864x400.jpg 864w, https://mikakoivisto.fi/wp-content/uploads/2016/04/website-update-1024x474-1080x500.jpg 1080w" sizes="(max-width: 1728px) 100vw, 1728px" /></noscript></p><p>In the past I&#8217;ve had several sites for my various interests and many of them had some kind of profile who I am but as there are so many they can easily get out dated and some of them I&#8217;ve had semi anonymous. That changes now.</p>
<p>I&#8217;m launching this site to serve two purpose:</p>
<ol>
<li>Serve as my single online profile and resume.</li>
<li>Provide a gateway to all the content I write on various subjects</li>
</ol>
<p>I&#8217;m also launching a new Facebook page so that everyone can see what I&#8217;m up to including those whose friend request I&#8217;ve rejected because I&#8217;ve wanted to keep my Facebook profile for only close circle of friends and family. So go and like my new <a href="https://www.facebook.com/mika.koivisto.official">Facebook Page</a>.</p>
<!--themify_builder_content-->
<div id="themify_builder_content-27" data-postid="27" class="themify_builder_content themify_builder_content-27 themify_builder tf_clear">
    </div>
<!--/themify_builder_content-->
<p>The post <a href="https://mikakoivisto.fi/blog/2016/04/welcome-new-site/">Welcome to my new site</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mikakoivisto.fi/blog/2016/04/welcome-new-site/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">27</post-id>	</item>
		<item>
		<title>Monitoring Apache HTTPd with New Relic</title>
		<link>https://mikakoivisto.fi/blog/2015/08/monitoring-apache-httpd-with-new-relic/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=monitoring-apache-httpd-with-new-relic</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Fri, 28 Aug 2015 07:18:47 +0000</pubDate>
				<category><![CDATA[Software & DevOps]]></category>
		<guid isPermaLink="false">http://javaguru.fi/?p=124</guid>

					<description><![CDATA[<p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='1024'%20height='358'%20viewBox=%270%200%201024%20358%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" style="background:linear-gradient(to right,#4f4f4f 25%,#4f4f4f 25% 50%,#4f4f4f 50% 75%,#4f4f4f 75%),linear-gradient(to right,#e6e6e6 25%,#c7b8aa 25% 50%,#eeeeee 50% 75%,#ffffff 75%),linear-gradient(to right,#a5bf7a 25%,#ffffff 25% 50%,#ffffff 50% 75%,#ffffff 75%),linear-gradient(to right,#ffffff 25%,#ffffff 25% 50%,#ffffff 50% 75%,#ffffff 75%)" width="1024" height="358" data-tf-src="https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_apache_listing-1024x358.png" class="tf_svg_lazy attachment-full size-full wp-post-image" alt="" decoding="async" data-tf-srcset="https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_apache_listing-1024x358.png 1024w, https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_apache_listing-1024x358-300x105.png 300w, https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_apache_listing-1024x358-768x269.png 768w" data-tf-sizes="(max-width: 1024px) 100vw, 1024px" /><noscript><img width="1024" height="358" data-tf-not-load src="https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_apache_listing-1024x358.png" class="attachment-full size-full wp-post-image" alt="" decoding="async" srcset="https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_apache_listing-1024x358.png 1024w, https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_apache_listing-1024x358-300x105.png 300w, https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_apache_listing-1024x358-768x269.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></noscript></p>
<p>When figuring out what&#8217;s wrong with a sites performance it&#8217;s important to get facts about every aspect and component involved with that site. Apache is quite often used in front of java applications and it&#8217;s the app server for php applications. Bad apache configuration can make a site seem sluggish even when there are plenty [&#8230;]</p>
<p>The post <a rel="nofollow" href="http://javaguru.fi/monitoring-apache-httpd-with-new-relic.html">Monitoring Apache HTTPd with New Relic</a> appeared first on <a rel="nofollow" href="http://javaguru.fi/">Javaguru</a>.</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2015/08/monitoring-apache-httpd-with-new-relic/">Monitoring Apache HTTPd with New Relic</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='1024'%20height='358'%20viewBox=%270%200%201024%20358%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" style="background:linear-gradient(to right,#4f4f4f 25%,#4f4f4f 25% 50%,#4f4f4f 50% 75%,#4f4f4f 75%),linear-gradient(to right,#e6e6e6 25%,#c7b8aa 25% 50%,#eeeeee 50% 75%,#ffffff 75%),linear-gradient(to right,#a5bf7a 25%,#ffffff 25% 50%,#ffffff 50% 75%,#ffffff 75%),linear-gradient(to right,#ffffff 25%,#ffffff 25% 50%,#ffffff 50% 75%,#ffffff 75%)" width="1024" height="358" data-tf-src="https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_apache_listing-1024x358.png" class="tf_svg_lazy attachment-full size-full wp-post-image" alt="" decoding="async" data-tf-srcset="https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_apache_listing-1024x358.png 1024w, https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_apache_listing-1024x358-300x105.png 300w, https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_apache_listing-1024x358-768x269.png 768w" data-tf-sizes="(max-width: 1024px) 100vw, 1024px" /><noscript><img width="1024" height="358" data-tf-not-load src="https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_apache_listing-1024x358.png" class="attachment-full size-full wp-post-image" alt="" decoding="async" srcset="https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_apache_listing-1024x358.png 1024w, https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_apache_listing-1024x358-300x105.png 300w, https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_apache_listing-1024x358-768x269.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></noscript></p><p>When figuring out what&#8217;s wrong with a sites performance it&#8217;s important to get facts about every aspect and component involved with that site. Apache is quite often used in front of java applications and it&#8217;s the app server for php applications. Bad apache configuration can make a site seem sluggish even when there are plenty of other resources available so it&#8217;s important to see what&#8217;s going on here. From the first screen of Apache HTTPd plugin you&#8217;ll get a nice overview of all your monitored apaches.</p>
<p><a href="http://javaguru.fi/wp-content/uploads/2015/04/new_relic_plugins_apache_listing.png" rel="lightbox[124]"></a></p>
<p>Drilling down to a single server overview shows request velocity, cpu load, busy/idle workers and even bytes sent over time.</p>
<p><a href="http://javaguru.fi/wp-content/uploads/2015/04/new_relic_plugins_apache_overview.png" rel="lightbox[124]"><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='1024'%20height='594'%20viewBox=%270%200%201024%20594%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" class="tf_svg_lazy" decoding="async" data-tf-src="http://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_apache_overview-1024x594-1024x594.png" width="1024" height="594" alt="Monitoring Apache HTTPd with New Relic" /><noscript><img decoding="async" data-tf-not-load src="http://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_apache_overview-1024x594-1024x594.png" width="1024" height="594" alt="Monitoring Apache HTTPd with New Relic" /></noscript></a></p>
<p>Going to throughtput shows throughtput details over time.</p>
<p><a href="http://javaguru.fi/wp-content/uploads/2015/04/new_relic_plugins_apache_throughtput.png" rel="lightbox[124]"><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='1024'%20height='595'%20viewBox=%270%200%201024%20595%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" class="tf_svg_lazy" decoding="async" data-tf-src="http://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_apache_throughtput-1024x595-1024x595.png" width="1024" height="595" alt="Monitoring Apache HTTPd with New Relic" /><noscript><img decoding="async" data-tf-not-load src="http://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_apache_throughtput-1024x595-1024x595.png" width="1024" height="595" alt="Monitoring Apache HTTPd with New Relic" /></noscript></a></p>
<p>Workers section shows you what is happening with the workers. If you have a lot of busy workers you can see in what state their are and that might provide some insight to what is going on.</p>
<p><a href="http://javaguru.fi/wp-content/uploads/2015/04/new_relic_plugins_apache_workers.png" rel="lightbox[124]"><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='1024'%20height='596'%20viewBox=%270%200%201024%20596%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" class="tf_svg_lazy" decoding="async" data-tf-src="http://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_apache_workers-1024x596-1024x596.png" width="1024" height="596" alt="Monitoring Apache HTTPd with New Relic" /><noscript><img decoding="async" data-tf-not-load src="http://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_apache_workers-1024x596-1024x596.png" width="1024" height="596" alt="Monitoring Apache HTTPd with New Relic" /></noscript></a></p>
<p><strong>Installing Apache HTTPd agent for New Relic</strong></p>
<p>1) I&#8217;m using the <a href="https://github.com/MeetMe/newrelic-plugin-agent">MeetMe New Relic Agent</a> to monitor Apache HTTPd. It&#8217;s written in python and we&#8217;ll need to install pip. The following is using the Ubuntu python-pip package. You can find alternative install methods from <a href="https://pip.pypa.io/en/latest/installing.html">pip docs</a>.</p>
<pre>apt-get install python-pip libyaml-dev python-dev</pre>
<p>2) Next use pip to install newrelic-plugin-agent. When I ran it I got some errors but it still worked.</p>
<pre>pip install newrelic-plugin-agent</pre>
<p>3) Next we&#8217;ll need to create the configuration file for the agent. You can start by copying /opt/newrelic-plugin-agent/newrelic-plugin-agent.cfg or just use what I have posted below. The first thing you need is to set license_key. You can find your license key from your account settings page on <a href="http://rpm.newrelic.com/">rpm.newrelic.com</a>. The second one is to add apache_httpd configuration. You can add multiple httpds to monitor.</p>
<pre>cat - &lt;&lt;EOF&gt;&gt; /etc/newrelic/newrelic-plugin-agent.cfg
%YAML 1.2
---
Application:
 license_key: YOUR_LICENSE_KEY
 wake_interval: 60
 #newrelic_api_timeout: 10
 #proxy: http://localhost:8080

 apache_httpd:
  - name: localhost
    scheme: http
    host: localhost
    verify_ssl_cert: true
    port: 80
    path: /server-status

Daemon:
 user: newrelic
 pidfile: /var/run/newrelic/newrelic-plugin-agent.pid

Logging:
 formatters:
   verbose:
     format: '%(levelname) -10s %(asctime)s %(process)-6d %(processName) -15s %(threadName)-10s %(name) -45s %(funcName) -25s L%(lineno)-6d: %(message)s'
 handlers:
   file:
     class : logging.handlers.RotatingFileHandler
     formatter: verbose
     filename: /var/log/newrelic/newrelic-plugin-agent.log
     maxBytes: 10485760
     backupCount: 3
 loggers:
   newrelic_plugin_agent:
     level: INFO
     propagate: True
     handlers: [console, file]
   requests:
     level: ERROR
     propagate: True
     handlers: [console, file]
EOF</pre>
<p>4) Make sure you have enabled mod_status in your apache and you&#8217;ve allowed access from the host your agent is running if it&#8217;s not running in the same host as your apache.</p>
<p>5) Then we need to add a init script for the newrelic-plugin-agent. There&#8217;s one under /opt/newrelic-plugin-agent but for me it was incomplete file so I just downloaded the one from github.</p>
<pre>wget https://raw.githubusercontent.com/MeetMe/newrelic-plugin-agent/master/etc/init.d/newrelic-plugin-agent.deb
mv newrelic-plugin-agent.deb /etc/init.d/newrelic-plugin-agent
chmod 755 /etc/init.d/newrelic-plugin-agent
update-rc.d newrelic-plugin-agent defaults</pre>
<p>Now you can start the newrelic-plugin-agent with</p>
<pre>service newrelic-plugin-agent start</pre>
<p>Now in few minutes you should see your Apache HTTPd server(s) listed under Plugins HTTPd on <a href="http://rpm.newrelic.com/">rpm.newrelic.com</a>.</p>
<p>The post <a rel="nofollow" href="http://javaguru.fi/monitoring-apache-httpd-with-new-relic.html">Monitoring Apache HTTPd with New Relic</a> appeared first on <a rel="nofollow" href="http://javaguru.fi/">Javaguru</a>.</p>
<!--themify_builder_content-->
<div id="themify_builder_content-116" data-postid="116" class="themify_builder_content themify_builder_content-116 themify_builder tf_clear">
    </div>
<!--/themify_builder_content-->
<p>The post <a href="https://mikakoivisto.fi/blog/2015/08/monitoring-apache-httpd-with-new-relic/">Monitoring Apache HTTPd with New Relic</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">116</post-id>	</item>
		<item>
		<title>Monitoring Nginx with New Relic</title>
		<link>https://mikakoivisto.fi/blog/2015/04/monitoring-nginx-with-new-relic/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=monitoring-nginx-with-new-relic</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Wed, 29 Apr 2015 03:20:41 +0000</pubDate>
				<category><![CDATA[Software & DevOps]]></category>
		<guid isPermaLink="false">http://javaguru.fi/?p=100</guid>

					<description><![CDATA[<p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='1024'%20height='273'%20viewBox=%270%200%201024%20273%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" style="background:linear-gradient(to right,#595959 25%,#595959 25% 50%,#595959 50% 75%,#595959 75%),linear-gradient(to right,#f4ebe1 25%,#ffffff 25% 50%,#ffffff 50% 75%,#ffffff 75%),linear-gradient(to right,#bfd1a0 25%,#ffffff 25% 50%,#ffffff 50% 75%,#ffffff 75%),linear-gradient(to right,#ffffff 25%,#ffffff 25% 50%,#ffffff 50% 75%,#ffffff 75%)" width="1024" height="273" data-tf-src="https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_nginx_listing-1024x273.png" class="tf_svg_lazy attachment-full size-full wp-post-image" alt="" decoding="async" data-tf-srcset="https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_nginx_listing-1024x273.png 1024w, https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_nginx_listing-1024x273-300x80.png 300w, https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_nginx_listing-1024x273-768x205.png 768w" data-tf-sizes="(max-width: 1024px) 100vw, 1024px" /><noscript><img width="1024" height="273" data-tf-not-load src="https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_nginx_listing-1024x273.png" class="attachment-full size-full wp-post-image" alt="" decoding="async" srcset="https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_nginx_listing-1024x273.png 1024w, https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_nginx_listing-1024x273-300x80.png 300w, https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_nginx_listing-1024x273-768x205.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></noscript></p>
<p>Apache HTTPd has always been my goto httpd, reverse proxy and load balancer but lately I&#8217;ve grown more interested in Nginx. It&#8217;s very high performance and lightweight not to mention easy to configure. Of course with my currently a single Nginx I wanted to see how could I hook it up my monitoring. Turns our [&#8230;]</p>
<p>The post <a rel="nofollow" href="http://javaguru.fi/monitoring-nginx-new-relic.html">Monitoring Nginx with New Relic</a> appeared first on <a rel="nofollow" href="http://javaguru.fi/">Javaguru</a>.</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2015/04/monitoring-nginx-with-new-relic/">Monitoring Nginx with New Relic</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='1024'%20height='273'%20viewBox=%270%200%201024%20273%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" style="background:linear-gradient(to right,#595959 25%,#595959 25% 50%,#595959 50% 75%,#595959 75%),linear-gradient(to right,#f4ebe1 25%,#ffffff 25% 50%,#ffffff 50% 75%,#ffffff 75%),linear-gradient(to right,#bfd1a0 25%,#ffffff 25% 50%,#ffffff 50% 75%,#ffffff 75%),linear-gradient(to right,#ffffff 25%,#ffffff 25% 50%,#ffffff 50% 75%,#ffffff 75%)" width="1024" height="273" data-tf-src="https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_nginx_listing-1024x273.png" class="tf_svg_lazy attachment-full size-full wp-post-image" alt="" decoding="async" data-tf-srcset="https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_nginx_listing-1024x273.png 1024w, https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_nginx_listing-1024x273-300x80.png 300w, https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_nginx_listing-1024x273-768x205.png 768w" data-tf-sizes="(max-width: 1024px) 100vw, 1024px" /><noscript><img width="1024" height="273" data-tf-not-load src="https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_nginx_listing-1024x273.png" class="attachment-full size-full wp-post-image" alt="" decoding="async" srcset="https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_nginx_listing-1024x273.png 1024w, https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_nginx_listing-1024x273-300x80.png 300w, https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_nginx_listing-1024x273-768x205.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></noscript></p><p>Apache HTTPd has always been my goto httpd, reverse proxy and load balancer but lately I&#8217;ve grown more interested in Nginx. It&#8217;s very high performance and lightweight not to mention easy to configure. Of course with my currently a single Nginx I wanted to see how could I hook it up my monitoring. Turns our there&#8217;s a New Relic agent directly from Nginx.</p>
</p>
<p>From the overview you can see the number of active and idle connections as well as the request rate.</p>
<p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='1024'%20height='548'%20viewBox=%270%200%201024%20548%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" class="tf_svg_lazy" decoding="async" data-tf-src="http://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_nginx_overview-1024x548-1024x548.png" width="1024" height="548" alt="Monitoring Nginx with New Relic" /><noscript><img decoding="async" data-tf-not-load src="http://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_nginx_overview-1024x548-1024x548.png" width="1024" height="548" alt="Monitoring Nginx with New Relic" /></noscript></p>
<p>From connections you&#8217;ll even more connection details. With very little connections and requests my graphs are currently slightly boring. In addition to connection details you can find more details about requests, upstreams, servers and cache.</p>
<p><a href="http://javaguru.fi/wp-content/uploads/2015/04/new_relic_plugins_nginx_connections.png" rel="lightbox[100]"><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='1024'%20height='551'%20viewBox=%270%200%201024%20551%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" class="tf_svg_lazy" decoding="async" data-tf-src="http://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_nginx_connections-1024x551-1024x551.png" width="1024" height="551" alt="Monitoring Nginx with New Relic" /><noscript><img decoding="async" data-tf-not-load src="http://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_nginx_connections-1024x551-1024x551.png" width="1024" height="551" alt="Monitoring Nginx with New Relic" /></noscript></a> <a href="http://javaguru.fi/wp-content/uploads/2015/04/new_relic_plugins_nginx_overview.png" rel="lightbox[100]"><br />
</a><strong>Installing New Relic Monitoring Agent for Nginx</strong></p>
<p>1) First you need to add the Ubuntu package repository for Nginx. If you&#8217;ve done this already when you installed Nginx you can skip to next step. If you are not using Ubuntu 14.04 like I am you can find the other Linux packages from <a href="http://nginx.org/en/linux_packages.html">Nginx website</a>.</p>
<pre>wget http://nginx.org/keys/nginx_signing.key
apt-key add nginx_signing.key

cat - &lt;&lt;-EOF &gt;&gt; /etc/apt/sources.list.d/nginx.list
deb http://nginx.org/packages/ubuntu/ trusty nginx
deb-src http://nginx.org/packages/ubuntu/ trusty nginx
EOF

apt-get update</pre>
<p>2) Next you need to install the Nginx New Relic Agent</p>
<pre>apt-get install nginx-nr-agent</pre>
<p>3) Next you&#8217;ll need to edit the agent configuration file in /etc/nginx-nr-agent/nginx-nr-agent.ini. You need to add your license key which you can find from your account settings page on <a href="http://rpm.newrelic.com/">rpm.newrelic.com</a>.</p>
<pre>newrelic_license_key=YOUR_LICENSE_KEY</pre>
<p>Additionally you need to add a new source which points to your Nginx status url.</p>
<pre>[source1]
name=localhost
url=http://localhost/nginx_stub_status</pre>
<p>4) You&#8217;ll need to add a server block to Nginx for the status. Since I had very simple configuration in my Nginx I just added the following to /etc/nginx/sites-enabled/default</p>
<pre>server {
   listen 127.0.0.1:80;
   server_name localhost;

   location = /nginx_stub_status {
     stub_status on;
     allow 127.0.0.1;
     deny all;
   }
}</pre>
<p>5) Last thing you need to do is reload Nginx and start the Nginx New Relic Agent.</p>
<pre>service nginx reload
service nginx-nr-agent start</pre>
<p>Now in few minutes you should start seeing your Nginx server listed under Plugins Nginx on <a href="http://rpm.newrelic.com/">rpm.newrelic.com</a>.</p>
<p>The post <a rel="nofollow" href="http://javaguru.fi/monitoring-nginx-new-relic.html">Monitoring Nginx with New Relic</a> appeared first on <a rel="nofollow" href="http://javaguru.fi/">Javaguru</a>.</p>
<!--themify_builder_content-->
<div id="themify_builder_content-121" data-postid="121" class="themify_builder_content themify_builder_content-121 themify_builder tf_clear">
    </div>
<!--/themify_builder_content-->
<p>The post <a href="https://mikakoivisto.fi/blog/2015/04/monitoring-nginx-with-new-relic/">Monitoring Nginx with New Relic</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">121</post-id>	</item>
		<item>
		<title>Monitoring MariaDB / MySQL with New Relic</title>
		<link>https://mikakoivisto.fi/blog/2015/04/monitoring-mariadb-mysql-with-new-relic/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=monitoring-mariadb-mysql-with-new-relic</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Mon, 27 Apr 2015 03:32:44 +0000</pubDate>
				<category><![CDATA[Software & DevOps]]></category>
		<guid isPermaLink="false">http://javaguru.fi/?p=98</guid>

					<description><![CDATA[<p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='1024'%20height='331'%20viewBox=%270%200%201024%20331%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" style="background:linear-gradient(to right,#595959 25%,#595959 25% 50%,#595959 50% 75%,#595959 75%),linear-gradient(to right,#ffffff 25%,#ffffff 25% 50%,#ffffff 50% 75%,#ffffff 75%),linear-gradient(to right,#a5bf7a 25%,#ffffff 25% 50%,#ffffff 50% 75%,#ffffff 75%),linear-gradient(to right,#ffffff 25%,#ffffff 25% 50%,#ffffff 50% 75%,#ffffff 75%)" width="1024" height="331" data-tf-src="https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_mysql_listing-1024x331.png" class="tf_svg_lazy attachment-full size-full wp-post-image" alt="" decoding="async" data-tf-srcset="https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_mysql_listing-1024x331.png 1024w, https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_mysql_listing-1024x331-300x97.png 300w, https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_mysql_listing-1024x331-768x248.png 768w" data-tf-sizes="(max-width: 1024px) 100vw, 1024px" /><noscript><img width="1024" height="331" data-tf-not-load src="https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_mysql_listing-1024x331.png" class="attachment-full size-full wp-post-image" alt="" decoding="async" srcset="https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_mysql_listing-1024x331.png 1024w, https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_mysql_listing-1024x331-300x97.png 300w, https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_mysql_listing-1024x331-768x248.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></noscript></p>
<p>In order to size your system correctly you need metrics and you need those also from your database. Not only is it important to know what&#8217;s happening in your database for capacity planning it&#8217;s also invaluable information when something goes wrong. If you have a database related performance problem in your code seeing how the [&#8230;]</p>
<p>The post <a rel="nofollow" href="http://javaguru.fi/monitoring-mariadb-mysql-new-relic.html">Monitoring MariaDB / MySQL with New Relic</a> appeared first on <a rel="nofollow" href="http://javaguru.fi/">Javaguru</a>.</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2015/04/monitoring-mariadb-mysql-with-new-relic/">Monitoring MariaDB / MySQL with New Relic</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='1024'%20height='331'%20viewBox=%270%200%201024%20331%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" style="background:linear-gradient(to right,#595959 25%,#595959 25% 50%,#595959 50% 75%,#595959 75%),linear-gradient(to right,#ffffff 25%,#ffffff 25% 50%,#ffffff 50% 75%,#ffffff 75%),linear-gradient(to right,#a5bf7a 25%,#ffffff 25% 50%,#ffffff 50% 75%,#ffffff 75%),linear-gradient(to right,#ffffff 25%,#ffffff 25% 50%,#ffffff 50% 75%,#ffffff 75%)" width="1024" height="331" data-tf-src="https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_mysql_listing-1024x331.png" class="tf_svg_lazy attachment-full size-full wp-post-image" alt="" decoding="async" data-tf-srcset="https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_mysql_listing-1024x331.png 1024w, https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_mysql_listing-1024x331-300x97.png 300w, https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_mysql_listing-1024x331-768x248.png 768w" data-tf-sizes="(max-width: 1024px) 100vw, 1024px" /><noscript><img width="1024" height="331" data-tf-not-load src="https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_mysql_listing-1024x331.png" class="attachment-full size-full wp-post-image" alt="" decoding="async" srcset="https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_mysql_listing-1024x331.png 1024w, https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_mysql_listing-1024x331-300x97.png 300w, https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_mysql_listing-1024x331-768x248.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></noscript></p><p>In order to size your system correctly you need metrics and you need those also from your database. Not only is it important to know what&#8217;s happening in your database for capacity planning it&#8217;s also invaluable information when something goes wrong. If you have a database related performance problem in your code seeing how the fix effects the database can help you see if you actually solved the problem. Also looking at database statistics you might be able to spot a issue before it becomes a serious problem.</p>
<p>New Relic has a wonderful plugin framework and there&#8217;s a ton of ready made plugins and also SDK and API for things it doesn&#8217;t already support. MySQL plugin is one of those ready made plugins and it provides all the key information you&#8217;ll need. The MySQL plugin page quickly shows what&#8217;s going on all monitored databases.<br />
<a href="http://javaguru.fi/wp-content/uploads/2015/04/new_relic_plugins_mysql_listing-e1429821370840.png" rel="lightbox[98]"></a></p>
<p>When you drill down to a individual database server the overview shows the SQL volume and how it&#8217;s split between reads and writes. More key metrics are displayed under Key Utilizations. You&#8217;ll also find database connections and network traffic on this page.</p>
<p><a href="http://javaguru.fi/wp-content/uploads/2015/04/new_relic_plugins_mysql_overview-e1429820956743.png" rel="lightbox[98]"><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='1024'%20height='597'%20viewBox=%270%200%201024%20597%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" class="tf_svg_lazy" decoding="async" data-tf-src="http://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_mysql_overview-1024x597-1024x597.png" width="1024" height="597" alt="Monitoring MariaDB / MySQL with New Relic" /><noscript><img decoding="async" data-tf-not-load src="http://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_mysql_overview-1024x597-1024x597.png" width="1024" height="597" alt="Monitoring MariaDB / MySQL with New Relic" /></noscript></a></p>
<p>Going further down to Query analysis you&#8217;ll see in more details about the queries.</p>
<p><a href="http://javaguru.fi/wp-content/uploads/2015/04/new_relic_plugins_mysql_queryanalysis-e1429820909509.png" rel="lightbox[98]"><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='1024'%20height='735'%20viewBox=%270%200%201024%20735%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" class="tf_svg_lazy" decoding="async" data-tf-src="http://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_mysql_queryanalysis-1024x735-1024x735.png" width="1024" height="735" alt="Monitoring MariaDB / MySQL with New Relic" /><noscript><img decoding="async" data-tf-not-load src="http://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_mysql_queryanalysis-1024x735-1024x735.png" width="1024" height="735" alt="Monitoring MariaDB / MySQL with New Relic" /></noscript></a></p>
<p>If you are using InnoDB there&#8217;s a separate page to show key metrics from InnoDB.</p>
<p><a href="http://javaguru.fi/wp-content/uploads/2015/04/new_relic_plugins_mysql_innodbmetrics-e1429820882163.png" rel="lightbox[98]"><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='1024'%20height='734'%20viewBox=%270%200%201024%20734%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" class="tf_svg_lazy" decoding="async" data-tf-src="http://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_mysql_innodbmetrics-1024x734-1024x734.png" width="1024" height="734" alt="Monitoring MariaDB / MySQL with New Relic" /><noscript><img decoding="async" data-tf-not-load src="http://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_mysql_innodbmetrics-1024x734-1024x734.png" width="1024" height="734" alt="Monitoring MariaDB / MySQL with New Relic" /></noscript></a></p>
<p><strong>Installing MySQL / MariaDB Monitoring</strong></p>
<p>1) MySQL plugin can easily be installed with <a href="http://blog.newrelic.com/2014/06/24/platforminstaller/">New Relic platform installer</a>. So the first thing you need to do is install the platform installer. You&#8217;ll need your New Relic license key which you can find from account settings on <a href="http://rpm.newrelic.com/">rpm.newrelic.com</a>. Once you have that you can install it with following one liner which is for 64bit Debian and Ubuntu.</p>
<pre><code>LICENSE_KEY=YOUR_LICENSE_KEY bash -c "$(curl -sSL https://download.newrelic.com/npi/release/install-npi-linux-debian-x64.sh)"</code></pre>
<p>2) Next go to the newly created newrelic-npi directory and run install. You&#8217;ll want to answer yes to all the questions and when prompted to configure the plugin grab the configuration from the next step.</p>
<pre><code>./npi install nrmysql</code></pre>
<p>3) If you skipped configuration you can configure the plugin afterward too. You can find the configuration file under newrelic-npi from plugins/com.newrelic.plugins.mysql.instance/newrelic_mysql_plugin-2.0.0/config/plugin.json. Below is a sample configuration for MariaDB (works for MySQL) running on localhost and we&#8217;ll be creating a separate user newrelic with password somepassword which the plugin will use to gather data. You can connect to multiple databases with the same agent. I usually install this agent on the same server my nagios is running on.</p>
<pre>{
 "agents": [
   {
     "name" : "MariaDB on localhost",
     "host" : "localhost",
     "metrics" : "status,newrelic,buffer_pool_stats,innodb_status,innodb_mutex",
     "user" : "newrelic",
     "passwd" : "somepassword"
   }
 ]
}</pre>
<p>4) Now we need to create a user in the database and grant some rights to it.</p>
<pre>cat - &lt;&lt;EOF | mysql -u root -p
CREATE USER newrelic@'%' IDENTIFIED BY 'somepassword';
GRANT PROCESS,REPLICATION CLIENT ON *.* TO newrelic@'%';
EOF</pre>
<p>5) Last thing is to start the service but before we do make sure you have Java installed as this agent is written in Java. If you don&#8217;t have Java installed check my <a title="Unattended Java install on Ubuntu 14.04" href="http://javaguru.fi/unattended-java-install-ubuntu-14-04.html">unattended Java install script</a>. Otherwise you can proceed to start the service that should have been created during npi install if you answered all the questions correctly.</p>
<pre>service newrelic_plugin_com.newrelic.plugins.mysql.instance start</pre>
<p>Now it may take few minutes before you see your server under Plugins MySQL in <a href="http://rpm.newrelic.com/">rpm.newrelic.com</a>. If it doesn&#8217;t check the log under plugins/com.newrelic.plugins.mysql.instance/newrelic_mysql_plugin-2.0.0/logs/ for hints and make sure the agent actually started.</p>
<p>The post <a rel="nofollow" href="http://javaguru.fi/monitoring-mariadb-mysql-new-relic.html">Monitoring MariaDB / MySQL with New Relic</a> appeared first on <a rel="nofollow" href="http://javaguru.fi/">Javaguru</a>.</p>
<!--themify_builder_content-->
<div id="themify_builder_content-127" data-postid="127" class="themify_builder_content themify_builder_content-127 themify_builder tf_clear">
    </div>
<!--/themify_builder_content-->
<p>The post <a href="https://mikakoivisto.fi/blog/2015/04/monitoring-mariadb-mysql-with-new-relic/">Monitoring MariaDB / MySQL with New Relic</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">127</post-id>	</item>
		<item>
		<title>Monitoring Ubuntu / Debian Server with New Relic</title>
		<link>https://mikakoivisto.fi/blog/2015/04/monitoring-ubuntu-debian-server-with-new-relic/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=monitoring-ubuntu-debian-server-with-new-relic</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Fri, 24 Apr 2015 04:00:07 +0000</pubDate>
				<category><![CDATA[Software & DevOps]]></category>
		<guid isPermaLink="false">http://javaguru.fi/?p=96</guid>

					<description><![CDATA[<p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='1024'%20height='429'%20viewBox=%270%200%201024%20429%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" style="background:linear-gradient(to right,#ffffff 25%,#ffffff 25% 50%,#ffffff 50% 75%,#ffffff 75%),linear-gradient(to right,#dfdfdf 25%,#dfdfdf 25% 50%,#dfdfdf 50% 75%,#f8f8f8 75%),linear-gradient(to right,#ffffff 25%,#ffffff 25% 50%,#ffffff 50% 75%,#bebdb7 75%),linear-gradient(to right,#ffffff 25%,#ffffff 25% 50%,#ffffff 50% 75%,#ffffff 75%)" width="1024" height="429" data-tf-src="https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_servers_listing-1024x429.png" class="tf_svg_lazy attachment-full size-full wp-post-image" alt="" decoding="async" data-tf-srcset="https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_servers_listing-1024x429.png 1024w, https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_servers_listing-1024x429-300x126.png 300w, https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_servers_listing-1024x429-768x322.png 768w" data-tf-sizes="(max-width: 1024px) 100vw, 1024px" /><noscript><img width="1024" height="429" data-tf-not-load src="https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_servers_listing-1024x429.png" class="attachment-full size-full wp-post-image" alt="" decoding="async" srcset="https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_servers_listing-1024x429.png 1024w, https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_servers_listing-1024x429-300x126.png 300w, https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_servers_listing-1024x429-768x322.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></noscript></p>
<p>With New Relic Server Monitoring you&#8217;ll see all the important information about your system with just one glance. This is a essential tool for troubleshooting performance issues and also seeing that your system is properly sized. Sometimes poor application performance has nothing to do with the application but rather the system it&#8217;s running. If the [&#8230;]</p>
<p>The post <a rel="nofollow" href="http://javaguru.fi/monitoring-ubuntu-server-new-relic.html">Monitoring Ubuntu / Debian Server with New Relic</a> appeared first on <a rel="nofollow" href="http://javaguru.fi/">Javaguru</a>.</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2015/04/monitoring-ubuntu-debian-server-with-new-relic/">Monitoring Ubuntu / Debian Server with New Relic</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='1024'%20height='429'%20viewBox=%270%200%201024%20429%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" style="background:linear-gradient(to right,#ffffff 25%,#ffffff 25% 50%,#ffffff 50% 75%,#ffffff 75%),linear-gradient(to right,#dfdfdf 25%,#dfdfdf 25% 50%,#dfdfdf 50% 75%,#f8f8f8 75%),linear-gradient(to right,#ffffff 25%,#ffffff 25% 50%,#ffffff 50% 75%,#bebdb7 75%),linear-gradient(to right,#ffffff 25%,#ffffff 25% 50%,#ffffff 50% 75%,#ffffff 75%)" width="1024" height="429" data-tf-src="https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_servers_listing-1024x429.png" class="tf_svg_lazy attachment-full size-full wp-post-image" alt="" decoding="async" data-tf-srcset="https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_servers_listing-1024x429.png 1024w, https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_servers_listing-1024x429-300x126.png 300w, https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_servers_listing-1024x429-768x322.png 768w" data-tf-sizes="(max-width: 1024px) 100vw, 1024px" /><noscript><img width="1024" height="429" data-tf-not-load src="https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_servers_listing-1024x429.png" class="attachment-full size-full wp-post-image" alt="" decoding="async" srcset="https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_servers_listing-1024x429.png 1024w, https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_servers_listing-1024x429-300x126.png 300w, https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_servers_listing-1024x429-768x322.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></noscript></p><p>With New Relic Server Monitoring you&#8217;ll see all the important information about your system with just one glance. This is a essential tool for troubleshooting performance issues and also seeing that your system is properly sized. Sometimes poor application performance has nothing to do with the application but rather the system it&#8217;s running. If the system is not correctly sized you might be running out of memory, cpu or the bottle neck could be disk io. Without proper monitoring it is very hard to pinpoint the cause.</p>
<p>The servers listing gives a nice overview of all servers and you an easily see if there&#8217;s any issues.</p>
<div id="attachment_108" style="width: 635px" class="wp-caption aligncenter"><a href="http://javaguru.fi/wp-content/uploads/2015/04/new_relic_servers_listing.png" rel="lightbox[96]"></a></p>
<p class="wp-caption-text">New Relic Servers</p>
</div>
<p>When looking at a specific server you&#8217;ll see a history of it&#8217;s CPU and memory usage as well as load average and network I/O. If you have any APM enabled applications installed you&#8217;ll see a overview of their response times, throughput and error rate. You&#8217;ll also see some of the top processes running on the server.</p>
<div id="attachment_106" style="width: 635px" class="wp-caption aligncenter"><a href="http://javaguru.fi/wp-content/uploads/2015/04/new_relic_servers_overview.png" rel="lightbox[96]"><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='1024'%20height='594'%20viewBox=%270%200%201024%20594%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" class="tf_svg_lazy" decoding="async" data-tf-src="http://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_servers_overview-1024x594-1024x594.png" width="1024" height="594" alt="Monitoring Ubuntu / Debian Server with New Relic" /><noscript><img decoding="async" data-tf-not-load src="http://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_servers_overview-1024x594-1024x594.png" width="1024" height="594" alt="Monitoring Ubuntu / Debian Server with New Relic" /></noscript></a></p>
<p class="wp-caption-text">New Relic Server Overview</p>
</div>
<p>When you drill down to processes listing you&#8217;ll quickly see the top memory and cpu consumers. You can also look at the history of individual processes.</p>
<div id="attachment_105" style="width: 635px" class="wp-caption aligncenter"><a href="http://javaguru.fi/wp-content/uploads/2015/04/new_relic_servers_processes.png" rel="lightbox[96]"><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='1024'%20height='593'%20viewBox=%270%200%201024%20593%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" class="tf_svg_lazy" decoding="async" data-tf-src="http://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_servers_processes-1024x593-1024x593.png" width="1024" height="593" alt="Monitoring Ubuntu / Debian Server with New Relic" /><noscript><img decoding="async" data-tf-not-load src="http://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_servers_processes-1024x593-1024x593.png" width="1024" height="593" alt="Monitoring Ubuntu / Debian Server with New Relic" /></noscript></a></p>
<p class="wp-caption-text">New Relic Server Processes</p>
</div>
<p><strong>Installing New Relic Server Monitoring on a Ubuntu / Debian Server</strong></p>
<p>1) Add an apt source for New Relic.</p>
<pre><code>cat - &lt;&lt;-EOF &gt;&gt; /etc/apt/sources.list.d/newrelic.list 
# newrelic repository list 
deb http://apt.newrelic.com/debian/ newrelic non-free
EOF</code></pre>
<p>2) You&#8217;ll need to get the key for New Relic repository and then update apt sources. After that you can install newrelic-sysmond.</p>
<pre><code>apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xB31B29E5548C16BF
apt-get update
apt-get install newrelic-sysmond</code></pre>
<p>3) Next you&#8217;ll need to tell it your license key so that it reports the data to your account. You can find your license key from your account settings page on <a href="http://rpm.newrelic.com/">rpm.newrelic.com</a>. You can either edit the configuration file or you can set the license like shown below:</p>
<pre><code>/usr/sbin/nrsysmond-config --set license_key=YOUR_LICENSE_KEY</code></pre>
<p>4) Finally once everything is configured you can start the system monitor daemon.</p>
<pre><code>service newrelic-sysmond start</code></pre>
<p>Now in few minutes you should start seeing your server listed under Servers on <a href="http://rpm.newrelic.com/">rpm.newrelic.com</a></p>
<p>The post <a rel="nofollow" href="http://javaguru.fi/monitoring-ubuntu-server-new-relic.html">Monitoring Ubuntu / Debian Server with New Relic</a> appeared first on <a rel="nofollow" href="http://javaguru.fi/">Javaguru</a>.</p>
<!--themify_builder_content-->
<div id="themify_builder_content-132" data-postid="132" class="themify_builder_content themify_builder_content-132 themify_builder tf_clear">
    </div>
<!--/themify_builder_content-->
<p>The post <a href="https://mikakoivisto.fi/blog/2015/04/monitoring-ubuntu-debian-server-with-new-relic/">Monitoring Ubuntu / Debian Server with New Relic</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">132</post-id>	</item>
		<item>
		<title>Monitoring with New Relic</title>
		<link>https://mikakoivisto.fi/blog/2015/04/monitoring-with-new-relic/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=monitoring-with-new-relic</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Thu, 23 Apr 2015 19:14:45 +0000</pubDate>
				<category><![CDATA[Software & DevOps]]></category>
		<guid isPermaLink="false">http://javaguru.fi/?p=93</guid>

					<description><![CDATA[<p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='300'%20height='174'%20viewBox=%270%200%20300%20174%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" style="background:linear-gradient(to right,#e8e8e8 25%,#e8e8e8 25% 50%,#e8e8e8 50% 75%,#e8e8e8 75%),linear-gradient(to right,#fefefe 25%,#ffffff 25% 50%,#ffffff 50% 75%,#ffffff 75%),linear-gradient(to right,#c3d9d8 25%,#b2c4c1 25% 50%,#ffffff 50% 75%,#ffffff 75%),linear-gradient(to right,#ebf3f7 25%,#ffffff 25% 50%,#ffffff 50% 75%,#ffffff 75%)" width="300" height="174" data-tf-src="https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_apm_java_overview-300x174.png" class="tf_svg_lazy attachment-full size-full wp-post-image" alt="" decoding="async" /><noscript><img width="300" height="174" data-tf-not-load src="https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_apm_java_overview-300x174.png" class="attachment-full size-full wp-post-image" alt="" decoding="async" /></noscript></p>
<p>New Relic is a wonderful software analytics suite that is 100% SaaS. I love it because it&#8217;s so easy to setup compared to Nagios, MRTG and other on premise software. Also&#160;their Lite edition is free with 24 hour data retention and for 30 days you&#8217;ll get to see the power of the Pro version. I [&#8230;]</p>
<p>The post <a rel="nofollow" href="http://javaguru.fi/monitoring-new-relic.html">Monitoring with New Relic</a> appeared first on <a rel="nofollow" href="http://javaguru.fi/">Javaguru</a>.</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2015/04/monitoring-with-new-relic/">Monitoring with New Relic</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='300'%20height='174'%20viewBox=%270%200%20300%20174%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" style="background:linear-gradient(to right,#e8e8e8 25%,#e8e8e8 25% 50%,#e8e8e8 50% 75%,#e8e8e8 75%),linear-gradient(to right,#fefefe 25%,#ffffff 25% 50%,#ffffff 50% 75%,#ffffff 75%),linear-gradient(to right,#c3d9d8 25%,#b2c4c1 25% 50%,#ffffff 50% 75%,#ffffff 75%),linear-gradient(to right,#ebf3f7 25%,#ffffff 25% 50%,#ffffff 50% 75%,#ffffff 75%)" width="300" height="174" data-tf-src="https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_apm_java_overview-300x174.png" class="tf_svg_lazy attachment-full size-full wp-post-image" alt="" decoding="async" /><noscript><img width="300" height="174" data-tf-not-load src="https://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_apm_java_overview-300x174.png" class="attachment-full size-full wp-post-image" alt="" decoding="async" /></noscript></p><p>New Relic is a wonderful software analytics suite that is 100% SaaS. I love it because it&#8217;s so easy to setup compared to Nagios, MRTG and other on premise software. Also their Lite edition is free with 24 hour data retention and for 30 days you&#8217;ll get to see the power of the Pro version. I still use nagios for my main monitoring and create some key graphs with MRTG but the data junkie in me loves all the data New Relic gathers and shows in nice graphs.</p>
<p>New Relic has seven parts or products as they call them. Those are APM, Insights, Mobile, Browser, Synthetics, Servers and Plugins. I have myself used only APM, Browser, Server and Plugins which are included in the free Lite edition.</p>
<p><strong>APM</strong></p>
<p>APM is the application monitoring part. It focuses on providing information about the application itself. The Lite edition shows you response times, throughput, web transaction information. It&#8217;s basically a low impact profiler. With the Pro subscription you get much deeper analysis of time spent on executing SQL, JVM statistics etc.</p>
<p><a href="http://javaguru.fi/wp-content/uploads/2015/04/new_relic_apm_java_overview.png" rel="lightbox[93]"></a></p>
<p><strong>Browser</strong></p>
<p>The browser provides insights on client side performance. Even though your application might respond quickly the users perceived performance could be poor because of network performance or even how the page is rendering on the browser.</p>
<p><strong>Servers</strong></p>
<p>Servers as the name suggests provides performance information about the actual server your applications are running on.</p>
<p><a href="http://javaguru.fi/wp-content/uploads/2015/04/new_relic_servers_overview.png" rel="lightbox[93]"><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='300'%20height='174'%20viewBox=%270%200%20300%20174%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" class="tf_svg_lazy" decoding="async" data-tf-src="http://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_servers_overview-300x174.png" width="300" height="174" alt="Monitoring with New Relic" /><noscript><img decoding="async" data-tf-not-load src="http://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_servers_overview-300x174.png" width="300" height="174" alt="Monitoring with New Relic" /></noscript></a></p>
<p><strong>Plugins</strong></p>
<p>There&#8217;s a ton of plugins to provide monitoring capabilities to systems not otherwise supported by New Relic and with it&#8217;s SDKs and API you can build your own plugins. Some of the plugins I have used are for MySQL/MariaDB, Nginx and Apache.</p>
<p><a href="http://javaguru.fi/wp-content/uploads/2015/04/new_relic_plugins_mysql_overview.png" rel="lightbox[93]"><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='300'%20height='175'%20viewBox=%270%200%20300%20175%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" class="tf_svg_lazy" decoding="async" data-tf-src="http://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_mysql_overview-300x175.png" width="300" height="175" alt="Monitoring with New Relic" /><noscript><img decoding="async" data-tf-not-load src="http://mikakoivisto.fi/wp-content/uploads/2016/04/new_relic_plugins_mysql_overview-300x175.png" width="300" height="175" alt="Monitoring with New Relic" /></noscript></a></p>
<p><strong>Mobile</strong></p>
<p>Mobile is APM for mobile applications.</p>
<p><strong>Synthetics</strong></p>
<p>Synthetics allows you to test your application from around the world. It can check business critical user flows and interaction to make sure your site available and functioning from around the world.</p>
<p><strong>Insights</strong></p>
<p>Insights is a paid feature that combines business metrics with performance data. It can combine data from APM, Browser, Mobile and Synthetics for deeper analysis and segmentation and filtering.</p>
<p>Since I recently installed bunch of new servers and I had to refresh my memory on how I installed and configured each of the agents so I decided to write a series of articles on each of them. Here&#8217;s a list of topics I&#8217;m going to publish and as I publish them I&#8217;ll link the topic to the article. These topics will cover APM with Java and PHP, Servers and Plugins for MySQL, Nginx and Apache</p>
<ul>
<li><a title="Monitoring Ubuntu / Debian Server with New Relic" href="http://javaguru.fi/monitoring-ubuntu-server-new-relic.html">Monitoring Ubuntu / Debian Servers</a></li>
<li><a title="Monitoring MariaDB / MySQL with New Relic" href="http://javaguru.fi/monitoring-mariadb-mysql-new-relic.html">Monitoring MariaDB / MySQL</a></li>
<li><a title="Monitoring Nginx with New Relic" href="http://javaguru.fi/monitoring-nginx-new-relic.html">Monitoring Nginx</a></li>
<li>Monitoring Apache</li>
<li>Monitoring Tomcat</li>
<li>Monitoring PHP Applications</li>
</ul>
<p>The post <a rel="nofollow" href="http://javaguru.fi/monitoring-new-relic.html">Monitoring with New Relic</a> appeared first on <a rel="nofollow" href="http://javaguru.fi/">Javaguru</a>.</p>
<!--themify_builder_content-->
<div id="themify_builder_content-137" data-postid="137" class="themify_builder_content themify_builder_content-137 themify_builder tf_clear">
    </div>
<!--/themify_builder_content-->
<p>The post <a href="https://mikakoivisto.fi/blog/2015/04/monitoring-with-new-relic/">Monitoring with New Relic</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">137</post-id>	</item>
		<item>
		<title>Unattended Java install on Ubuntu 14.04</title>
		<link>https://mikakoivisto.fi/blog/2015/04/unattended-java-install-on-ubuntu-14-04/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=unattended-java-install-on-ubuntu-14-04</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Wed, 22 Apr 2015 18:27:41 +0000</pubDate>
				<category><![CDATA[Software & DevOps]]></category>
		<guid isPermaLink="false">http://javaguru.fi/?p=91</guid>

					<description><![CDATA[<p>I like to to automate all the tasks I do often and of the things many of my virtual servers need is Java JDK. Unfortunately the Oracle JDK is not available as debian package but there&#8217;s a way to make it. This is where WebUpd8 Team PPA comes in as they provide installer for java6, [&#8230;]</p>
<p>The post <a rel="nofollow" href="http://javaguru.fi/unattended-java-install-ubuntu-14-04.html">Unattended Java install on Ubuntu 14.04</a> appeared first on <a rel="nofollow" href="http://javaguru.fi/">Javaguru</a>.</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2015/04/unattended-java-install-on-ubuntu-14-04/">Unattended Java install on Ubuntu 14.04</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>I like to to automate all the tasks I do often and of the things many of my virtual servers need is Java JDK. Unfortunately the Oracle JDK is not available as debian package but there&#8217;s a way to make it. This is where WebUpd8 Team PPA comes in as they provide installer for java6, java7 and java8.</p>
<p>Below is the script I use to install it unattended. You can download it also from <a href="https://gist.github.com/mikakoivisto/8befba49e3413553eb38">github gist</a>. If you want Java6 then just use oracle-java6-installer and for Java 8 oracle-java8-installer. This also works other ubuntu versions just substitute trusty with the code of your ubuntu release like precise for Ubuntu 12.04. Hope you find this useful.</p>
<pre>cat - &lt;&lt;-EOF &gt;&gt; /etc/apt/sources.list.d/webupd8team-java.list
# webupd8team repository list 
deb http://ppa.launchpad.net/webupd8team/java/ubuntu trusty main
# deb-src http://ppa.launchpad.net/webupd8team/java/ubuntu trusty main
EOF

apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xEEA14886

echo debconf shared/accepted-oracle-license-v1-1 select true | /usr/bin/debconf-set-selections
echo debconf shared/accepted-oracle-license-v1-1 seen true | /usr/bin/debconf-set-selections

apt-get update
apt-get install oracle-java7-installer</pre>
<p>The post <a rel="nofollow" href="http://javaguru.fi/unattended-java-install-ubuntu-14-04.html">Unattended Java install on Ubuntu 14.04</a> appeared first on <a rel="nofollow" href="http://javaguru.fi/">Javaguru</a>.</p>
<!--themify_builder_content-->
<div id="themify_builder_content-139" data-postid="139" class="themify_builder_content themify_builder_content-139 themify_builder tf_clear">
    </div>
<!--/themify_builder_content-->
<p>The post <a href="https://mikakoivisto.fi/blog/2015/04/unattended-java-install-on-ubuntu-14-04/">Unattended Java install on Ubuntu 14.04</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">139</post-id>	</item>
		<item>
		<title>Removing DRM from Kindle, ePub and PDF ebooks</title>
		<link>https://mikakoivisto.fi/blog/2015/03/removing-drm-from-kindle-epub-and-pdf-ebooks/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=removing-drm-from-kindle-epub-and-pdf-ebooks</link>
					<comments>https://mikakoivisto.fi/blog/2015/03/removing-drm-from-kindle-epub-and-pdf-ebooks/#respond</comments>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Sun, 22 Mar 2015 17:01:47 +0000</pubDate>
				<category><![CDATA[Miscellaneous]]></category>
		<category><![CDATA[adobe]]></category>
		<category><![CDATA[calibre]]></category>
		<category><![CDATA[drm]]></category>
		<category><![CDATA[ebook]]></category>
		<category><![CDATA[epub]]></category>
		<category><![CDATA[kindle]]></category>
		<guid isPermaLink="false">https://koivisto.me/?p=63</guid>

					<description><![CDATA[<p>I like to read all my books using my iPad mini so I buy all my books from various sources as ebooks but most places tend to add DRM to them and thus making it harder for me to use them on the device I want. Some go as far as requiring you to use their own App [&#8230;]</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2015/03/removing-drm-from-kindle-epub-and-pdf-ebooks/">Removing DRM from Kindle, ePub and PDF ebooks</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>I like to read all my books using my iPad mini so I buy all my books from various sources as ebooks but most places tend to add DRM to them and thus making it harder for me to use them on the device I want. Some go as far as requiring you to use their own App for reading but that&#8217;s not acceptable for me as I like having my books neatly organised in my iBooks. So to do that I need to remove the DRM from the files. Please note that in some countries removing DRM is illegal so know your local laws.</p>
<p><strong>Calibre</strong></p>
<p>I tried couple of different software to remove DRM from ebooks I had bought but <a href="http://calibre-ebook.com/download">Calibre</a> to be the most consistent. It&#8217;s available to Windows, Linux and Mac OS X.</p>
<ol>
<li>Calibre will be the tool that will do most of the heavy lifting for us. So first <a href="http://calibre-ebook.com/download">download</a> and install it.</li>
<li>You&#8217;ll need to add a DRM removing plugin into Calibre and that you can get from <a href="http://apprenticealf.wordpress.com/2012/09/10/drm-removal-tools-for-ebooks/">Apprentice Alf&#8217;s blog</a>. For the impatient here&#8217;s a direct link to <a href="https://github.com/apprenticeharper/DeDRM_tools/releases">DeDRM Tools github releases</a>.  You&#8217;ll need the tools_vX.X.X.zip</li>
<li>Inside the tools_vX.X.X.zip there&#8217;s a DeDRM_calibre_plugin directory extract the DeDRM_plugin.zip from that directory</li>
<li>Install the DeDRM_plugin.zip to Calibre by going to Preferences -&gt; Change Calibre Behaviour, then under Advanced select Plugins, then select Load plugin from file and select the DeDRM_plugin.zip</li>
<li>Restart Calibre.</li>
<li>Now your Calibre is ready to strip DRM from every ebook you add to it. The imported ebooks are without DRM and you can add them to your favourite e-reader. The files you can find directly from Calibre by clicking on the file and then under the preview there&#8217;s Click to open link.</li>
</ol>
<p><strong>Adobe Digital Editions</strong></p>
<p>If you&#8217;ve bought Adobe DRM protected ebooks you&#8217;ll Adobe Digital Editions to download them to your computer. Sometimes all you get is a .acsm file and Adobe Digital Editions downloads the actual ePub or PDF file when you open the .acsm file. You&#8217;ll first need to sign in with your Adobe ID. You can download Adobe Digital Editions from <a href="http://www.adobe.com/support/digitaleditions/downloads.html">Adobe</a>. When you&#8217;ve downloaded a book with ADE you can find it by right clicking on the book and select Show File in Finder. Then add that file to Calibre and no more DRM on that book.</p>
<p><strong>Kindle App (works with version up to 1.17)</strong></p>
<ol>
<li>Download Kindle App.</li>
<li>Disable KFX support in Kindle by running this in terminal:
<p>sudo chmod -x /Applications/Kindle.app/Contents/MacOS/renderer-test</p>
</li>
<li>Download the book inside Kindle app to your computer. </li>
<li>In Mac OS X you can find the Kindle books from Library/Containers/com.amazon.Kindle/Data/Library/Application Support/Kindle/My Kindle Content/ The book files might not have any meaningful name but they all end with extension .azw</li>
<li>Drop the .azw files to Calibre and it will figure out what book it is.</li>
<li>Once it&#8217;s loaded to Calibre you can select the book and click Convert books to convert the AZW3 format to ePub which most readers will support</li>
</ol>
<p><strong>Kindle physical device</strong></p>
<p>This only works if you have a E-Ink Kindle device registered to your account.</p>
<ol>
<li>Go to your <a href="https://www.amazon.com/mn/dcw/myx.html/ref=as_li_ss_tl?ie=UTF8&amp;linkCode=ll2&amp;tag=mskdesign-20">Manage Your Content and Devices</a>.</li>
<li>On the book select more actions -&gt; Download and transfer via USB</li>
<li>Drop the .azw file to Calibre</li>
<li>Once it&#8217;s loaded to Calibre you can select the book and convert it to ePub</li>
</ol>
<p>Happy reading! Please don&#8217;t pirate books using this method it&#8217;s just for your own convenience.</p>

<!-- wp:themify-builder/canvas /--><p>The post <a href="https://mikakoivisto.fi/blog/2015/03/removing-drm-from-kindle-epub-and-pdf-ebooks/">Removing DRM from Kindle, ePub and PDF ebooks</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mikakoivisto.fi/blog/2015/03/removing-drm-from-kindle-epub-and-pdf-ebooks/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">63</post-id>	</item>
		<item>
		<title>Robert Kiyosaki’s Rich Dad Poor Dad ebook for free</title>
		<link>https://mikakoivisto.fi/blog/2015/03/robert-kiyosakis-rich-dad-poor-dad-ebook-for-free/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=robert-kiyosakis-rich-dad-poor-dad-ebook-for-free</link>
					<comments>https://mikakoivisto.fi/blog/2015/03/robert-kiyosakis-rich-dad-poor-dad-ebook-for-free/#respond</comments>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Mon, 16 Mar 2015 21:40:54 +0000</pubDate>
				<category><![CDATA[Finance]]></category>
		<guid isPermaLink="false">http://mymoneymatters.co/?p=69</guid>

					<description><![CDATA[<p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='287'%20height='300'%20viewBox=%270%200%20287%20300%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" style="background:linear-gradient(to right,#ffffff 25%,#67336f 25% 50%,#704277 50% 75%,#dfe0e7 75%),linear-gradient(to right,#ffffff 25%,#fed203 25% 50%,#87658d 50% 75%,#ffffff 75%),linear-gradient(to right,#ffffff 25%,#000000 25% 50%,#1b1310 50% 75%,#ffffff 75%),linear-gradient(to right,#000000 25%,#74645d 25% 50%,#635650 50% 75%,#ffffff 75%)" width="287" height="300" data-tf-src="https://mikakoivisto.fi/wp-content/uploads/2015/03/book-rdpd-287x300.png" class="tf_svg_lazy attachment-full size-full wp-post-image" alt="" decoding="async" /><noscript><img width="287" height="300" data-tf-not-load src="https://mikakoivisto.fi/wp-content/uploads/2015/03/book-rdpd-287x300.png" class="attachment-full size-full wp-post-image" alt="" decoding="async" /></noscript></p>
<p>Robert Kiyosaki is giving away his Rich Dad Poor Dad ebook for free. Download yours today. This is one of those books you should definitely read and now that it&#8217;s free there is absolutely no excuse for not reading it. You should also read the other Rich Dad series books. You can also get the [&#8230;]</p>
<p>The post <a rel="nofollow" href="http://mymoneymatters.co/robert-kiyosakis-rich-dad-poor-dad-ebook-for-free.html">Robert Kiyosaki&#8217;s Rich Dad Poor Dad ebook for free</a> appeared first on <a rel="nofollow" href="http://mymoneymatters.co/">My Money Matters</a>.</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2015/03/robert-kiyosakis-rich-dad-poor-dad-ebook-for-free/">Robert Kiyosaki’s Rich Dad Poor Dad ebook for free</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='287'%20height='300'%20viewBox=%270%200%20287%20300%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" style="background:linear-gradient(to right,#ffffff 25%,#67336f 25% 50%,#704277 50% 75%,#dfe0e7 75%),linear-gradient(to right,#ffffff 25%,#fed203 25% 50%,#87658d 50% 75%,#ffffff 75%),linear-gradient(to right,#ffffff 25%,#000000 25% 50%,#1b1310 50% 75%,#ffffff 75%),linear-gradient(to right,#000000 25%,#74645d 25% 50%,#635650 50% 75%,#ffffff 75%)" width="287" height="300" data-tf-src="https://mikakoivisto.fi/wp-content/uploads/2015/03/book-rdpd-287x300.png" class="tf_svg_lazy attachment-full size-full wp-post-image" alt="" decoding="async" /><noscript><img width="287" height="300" data-tf-not-load src="https://mikakoivisto.fi/wp-content/uploads/2015/03/book-rdpd-287x300.png" class="attachment-full size-full wp-post-image" alt="" decoding="async" /></noscript></p><p>Robert Kiyosaki is giving away his Rich Dad Poor Dad ebook for free. <a href="http://bit.ly/rdadpdad">Download</a> yours today.</p>
<p>This is one of those books you should definitely read and now that it’s free there is absolutely no excuse for not reading it. You should also read the other Rich Dad series books. You can also get the <a title="Robert Kiyosaki’s Increase your Financial IQ ebook for free" href="http://mymoneymatters.co/robert-kiyosakis-increase-your-financial-iq-ebook-for-free.html">Increase your Financial IQ</a> for free.</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2015/03/robert-kiyosakis-rich-dad-poor-dad-ebook-for-free/">Robert Kiyosaki’s Rich Dad Poor Dad ebook for free</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mikakoivisto.fi/blog/2015/03/robert-kiyosakis-rich-dad-poor-dad-ebook-for-free/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">43182</post-id>	</item>
		<item>
		<title>Robert Kiyosaki’s Increase your Financial IQ ebook for free</title>
		<link>https://mikakoivisto.fi/blog/2015/02/robert-kiyosakis-increase-your-financial-iq-ebook-for-free/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=robert-kiyosakis-increase-your-financial-iq-ebook-for-free</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Thu, 19 Feb 2015 07:55:46 +0000</pubDate>
				<category><![CDATA[Finance]]></category>
		<guid isPermaLink="false">http://mymoneymatters.co/?p=63</guid>

					<description><![CDATA[<p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='300'%20height='300'%20viewBox=%270%200%20300%20300%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" style="background:linear-gradient(to right,#000000 25%,#050608 25% 50%,#1a0f0d 50% 75%,#dee0e6 75%),linear-gradient(to right,#000000 25%,#302d2b 25% 50%,#2e2a28 50% 75%,#000000 75%),linear-gradient(to right,#000000 25%,#74487b 25% 50%,#73477a 50% 75%,#000000 75%),linear-gradient(to right,#000000 25%,#926d98 25% 50%,#693771 50% 75%,#000000 75%)" width="300" height="300" data-tf-src="https://mikakoivisto.fi/wp-content/uploads/2015/03/FIQ-book-3d-300x300.png" class="tf_svg_lazy attachment-full size-full wp-post-image" alt="" decoding="async" data-tf-srcset="https://mikakoivisto.fi/wp-content/uploads/2015/03/FIQ-book-3d-300x300.png 300w, https://mikakoivisto.fi/wp-content/uploads/2015/03/FIQ-book-3d-300x300-150x150.png 150w" data-tf-sizes="(max-width: 300px) 100vw, 300px" /><noscript><img width="300" height="300" data-tf-not-load src="https://mikakoivisto.fi/wp-content/uploads/2015/03/FIQ-book-3d-300x300.png" class="attachment-full size-full wp-post-image" alt="" decoding="async" srcset="https://mikakoivisto.fi/wp-content/uploads/2015/03/FIQ-book-3d-300x300.png 300w, https://mikakoivisto.fi/wp-content/uploads/2015/03/FIQ-book-3d-300x300-150x150.png 150w" sizes="(max-width: 300px) 100vw, 300px" /></noscript></p>
<p>Robert Kiyosaki is now giving away his Increase your Financial IQ ebook for free. Dowload yours today. This is one of those books you should definitely read and now that it&#8217;s free there is absolutely no excuse for not reading it. You should also read the other Rich Dad series books.</p>
<p>The post <a rel="nofollow" href="http://mymoneymatters.co/robert-kiyosakis-increase-your-financial-iq-ebook-for-free.html">Robert Kiyosaki&#8217;s Increase your Financial IQ ebook for free</a> appeared first on <a rel="nofollow" href="http://mymoneymatters.co/">My Money Matters</a>.</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2015/02/robert-kiyosakis-increase-your-financial-iq-ebook-for-free/">Robert Kiyosaki’s Increase your Financial IQ ebook for free</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='300'%20height='300'%20viewBox=%270%200%20300%20300%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" style="background:linear-gradient(to right,#000000 25%,#050608 25% 50%,#1a0f0d 50% 75%,#dee0e6 75%),linear-gradient(to right,#000000 25%,#302d2b 25% 50%,#2e2a28 50% 75%,#000000 75%),linear-gradient(to right,#000000 25%,#74487b 25% 50%,#73477a 50% 75%,#000000 75%),linear-gradient(to right,#000000 25%,#926d98 25% 50%,#693771 50% 75%,#000000 75%)" width="300" height="300" data-tf-src="https://mikakoivisto.fi/wp-content/uploads/2015/03/FIQ-book-3d-300x300.png" class="tf_svg_lazy attachment-full size-full wp-post-image" alt="" decoding="async" data-tf-srcset="https://mikakoivisto.fi/wp-content/uploads/2015/03/FIQ-book-3d-300x300.png 300w, https://mikakoivisto.fi/wp-content/uploads/2015/03/FIQ-book-3d-300x300-150x150.png 150w" data-tf-sizes="(max-width: 300px) 100vw, 300px" /><noscript><img width="300" height="300" data-tf-not-load src="https://mikakoivisto.fi/wp-content/uploads/2015/03/FIQ-book-3d-300x300.png" class="attachment-full size-full wp-post-image" alt="" decoding="async" srcset="https://mikakoivisto.fi/wp-content/uploads/2015/03/FIQ-book-3d-300x300.png 300w, https://mikakoivisto.fi/wp-content/uploads/2015/03/FIQ-book-3d-300x300-150x150.png 150w" sizes="(max-width: 300px) 100vw, 300px" /></noscript></p><p>Robert Kiyosaki is now giving away his Increase your Financial IQ ebook for free. <a href="http://bit.ly/fiqfree">Dowload</a> yours today.</p>
<p>This is one of those books you should definitely read and now that it&#8217;s free there is absolutely no excuse for not reading it. You should also read the other Rich Dad series books.</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2015/02/robert-kiyosakis-increase-your-financial-iq-ebook-for-free/">Robert Kiyosaki’s Increase your Financial IQ ebook for free</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">43184</post-id>	</item>
		<item>
		<title>Mobee Magic Charger</title>
		<link>https://mikakoivisto.fi/blog/2015/02/mobee-magic-charger/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=mobee-magic-charger</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Tue, 17 Feb 2015 16:55:46 +0000</pubDate>
				<category><![CDATA[Reviews]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[charger]]></category>
		<category><![CDATA[magic mouse]]></category>
		<category><![CDATA[mobee]]></category>
		<guid isPermaLink="false">https://koivisto.me/?p=51</guid>

					<description><![CDATA[<p>The Mobee Magic Charger for Apple Magic Mouse is something I&#8217;ve been wanting for quite sometime without actually realising it. I accidentally saw it while browsing at a electronics store in Helsinki while waiting for my actual order to be ready and once I saw it I knew I had to have it. I really [&#8230;]</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2015/02/mobee-magic-charger/">Mobee Magic Charger</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><a href="http://www.amazon.com/gp/product/B00GL0Z4IQ/ref=as_li_tl?ie=UTF8&amp;camp=1789&amp;creative=9325&amp;creativeASIN=B00GL0Z4IQ&amp;linkCode=as2&amp;tag=mskdesign-20&amp;linkId=FKGDBNPLMMGE3NGN"><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='300'%20height='176'%20viewBox=%270%200%20300%20176%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" decoding="async" class="tf_svg_lazy alignright wp-image-58 size-medium" data-tf-src="https://koivisto.me/wp-content/uploads/2015/02/magic_charger_01-e1424191795896-300x176.jpg" alt="mobee_batteryPack_magicCharger_120730_BAT" width="300" height="176" data-tf-srcset="https://mikakoivisto.fi/wp-content/uploads/2015/02/magic_charger_01-e1424191795896-300x176.jpg 300w, https://mikakoivisto.fi/wp-content/uploads/2015/02/magic_charger_01-e1424191795896-768x450.jpg 768w, https://mikakoivisto.fi/wp-content/uploads/2015/02/magic_charger_01-e1424191795896.jpg 1017w" data-tf-sizes="(max-width: 300px) 100vw, 300px" /><noscript><img decoding="async" class="alignright wp-image-58 size-medium" data-tf-not-load src="https://koivisto.me/wp-content/uploads/2015/02/magic_charger_01-e1424191795896-300x176.jpg" alt="mobee_batteryPack_magicCharger_120730_BAT" width="300" height="176" srcset="https://mikakoivisto.fi/wp-content/uploads/2015/02/magic_charger_01-e1424191795896-300x176.jpg 300w, https://mikakoivisto.fi/wp-content/uploads/2015/02/magic_charger_01-e1424191795896-768x450.jpg 768w, https://mikakoivisto.fi/wp-content/uploads/2015/02/magic_charger_01-e1424191795896.jpg 1017w" sizes="(max-width: 300px) 100vw, 300px" /></noscript></a><a href="http://www.amazon.com/gp/product/B00GL0Z4IQ/ref=as_li_tl?ie=UTF8&amp;camp=1789&amp;creative=9325&amp;creativeASIN=B00GL0Z4IQ&amp;linkCode=as2&amp;tag=mskdesign-20&amp;linkId=FKGDBNPLMMGE3NGN">The Mobee Magic Charger for Apple Magic Mouse</a> is something I&#8217;ve been wanting for quite sometime without actually realising it. I accidentally saw it while browsing at a electronics store in Helsinki while waiting for my actual order to be ready and once I saw it I knew I had to have it. I really love the Magic Mouse but I&#8217;m so done with rechargeable batteries. The Magic Charger comes with it&#8217;s own custom battery pack for Magic Mouse and inductive charger.</p>
<p>They promise to get up to 8 days of use out of the battery without charging and with my 20 days test I can say that is pretty accurate. I&#8217;ve been leaving my mouse on 24/7 and only charge it once it&#8217;s completely depleted but from now on as my test is concluded I&#8217;ll probably put it on the charging station over night so I never have to worry about running out of juice in the middle of work. The design is very sleek and the charger fits nicely on my table or to be more exact under my rain design mstand. The charger gets it&#8217;s power from USB and I have it connected on my USB hub so I only need to connect one USB cable to my Macbook Pro.</p>
<p>Only time will tell how well the battery will hold it&#8217;s charge but for now I&#8217;d say it&#8217;s a buy for anyone with a Magic Mouse.</p>
<div class="post-video"><iframe loading="lazy" width="1165" height="655" src="https://www.youtube.com/embed/cJ7aflKBltU?feature=oembed" frameborder="0" gesture="media" allowfullscreen></iframe></div>
<p>The post <a href="https://mikakoivisto.fi/blog/2015/02/mobee-magic-charger/">Mobee Magic Charger</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">51</post-id>	</item>
		<item>
		<title>New Site New Focus</title>
		<link>https://mikakoivisto.fi/blog/2015/01/new-site-new-focus/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=new-site-new-focus</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Wed, 28 Jan 2015 08:53:55 +0000</pubDate>
				<category><![CDATA[Software & DevOps]]></category>
		<guid isPermaLink="false">http://javaguru.fi/?p=28</guid>

					<description><![CDATA[<p>It&#8217;s been a while since I last posted anything and the site has been quite stale and out dated. So I thought I&#8217;d update it to a more modern responsive site that looks good on both desktop and mobile. As I wanted to focus more on actual writing and less on building a site I [&#8230;]</p>
<p>The post <a rel="nofollow" href="http://javaguru.fi/new-site-new-focus.html">New Site New Focus</a> appeared first on <a rel="nofollow" href="http://javaguru.fi/">Javaguru</a>.</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2015/01/new-site-new-focus/">New Site New Focus</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>It&#8217;s been a while since I last posted anything and the site has been quite stale and out dated. So I thought I&#8217;d update it to a more modern responsive site that looks good on both desktop and mobile. As I wanted to focus more on actual writing and less on building a site I moved back to WordPress which is still the best blogging platform. My only concern is now security as php apps are much more prone to being hacked than Java ones.</p>
<p>With this new focus I&#8217;m also going to write about much more broad topics than just Liferay. As Liferay is moving it&#8217;s core towards OSGi I&#8217;ve studied it a lot and grown to love it although it doesn&#8217;t come without it&#8217;s own challenges especially for some moving to it from Java EE. As some of you may know I&#8217;ve been running and administering my own Linux servers for more than 15 years so some of the new topics will be about virtualization, containers, monitoring etc. I still read a lot of books so when I read one that deserves a mention I&#8217;ll write a book review. I hope you enjoy what&#8217;s to come.</p>
<p>As I built this new site I only migrated posts that had been read in the past year so if you run into something that&#8217;s no longer available do email me I still have them saved. Also all the old urls should be automatically redirected to the new ones.</p>
<p>The post <a rel="nofollow" href="http://javaguru.fi/new-site-new-focus.html">New Site New Focus</a> appeared first on <a rel="nofollow" href="http://javaguru.fi/">Javaguru</a>.</p>
<!--themify_builder_content-->
<div id="themify_builder_content-141" data-postid="141" class="themify_builder_content themify_builder_content-141 themify_builder tf_clear">
    </div>
<!--/themify_builder_content-->
<p>The post <a href="https://mikakoivisto.fi/blog/2015/01/new-site-new-focus/">New Site New Focus</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">141</post-id>	</item>
		<item>
		<title>Five Financial Figures Everyone Should Know</title>
		<link>https://mikakoivisto.fi/blog/2013/12/five-financial-figures-everyone-should-know/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=five-financial-figures-everyone-should-know</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Sun, 29 Dec 2013 13:12:37 +0000</pubDate>
				<category><![CDATA[Finance]]></category>
		<guid isPermaLink="false">http://mymoneymatters.co/?p=50</guid>

					<description><![CDATA[<p>These five figures give good insight to your financial healthiness. The list comes from MSN Money article 5 financial figures you should know. 1) Credit Score This number is very important maybe the most important number you need to know in US. Your credit score affects how much you pay for credit and even for [&#8230;]</p>
<p>The post <a rel="nofollow" href="http://mymoneymatters.co/five-financial-figures-everyone-should-know.html">Five Financial Figures Everyone Should Know</a> appeared first on <a rel="nofollow" href="http://mymoneymatters.co/">My Money Matters</a>.</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2013/12/five-financial-figures-everyone-should-know/">Five Financial Figures Everyone Should Know</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>These five figures give good insight to your financial healthiness. The list comes from MSN Money article <a href="http://money.msn.com/personal-finance/5-financial-figures-you-need-to-know" data-cke-saved-href="http://money.msn.com/personal-finance/5-financial-figures-you-need-to-know">5 financial figures you should know</a>.</p>
<h4>1) Credit Score</h4>
<p>This number is very important maybe the most important number you need to know in US. Your credit score affects how much you pay for credit and even for apartment rental deposit. Even employers can use the figure in evaluating job applicants. One clear and concrete example is that when I moved to US and basically had no credit history I had to pay over $2000 deposit on my apartment and now last summer when I rented a new place I was able to get their promotional rate of just $99. Even though all the credit rating bureaus sell their credit score to you, you can still get it for free. I use following services to track my score for free. It&#8217;s not necessarily the same score your bank gets but it&#8217;s close enough to give a general idea. I use following two regularly and depending on which one you look my credit score is either 772 or 777 which means I&#8217;m in a range that is considered excellent by lenders.</p>
<ul>
<li><a href="http://www.creditkarma.com/" data-cke-saved-href="http://www.creditkarma.com/">Credit Karma</a> (TransUnion)</li>
<li><a href="http://www.creditsesame.com/" data-cke-saved-href="http://www.creditsesame.com/">Credit Sesame</a> (Experian)</li>
</ul>
<p>You can get a score also from following places for free but they update it very infrequently or requires a paid subscription which can be cancelled immediately for one time free score:</p>
<ul>
<li><a href="http://www.quizzle.com/" data-cke-saved-href="http://www.quizzle.com/">Quizzle</a> (Experian)</li>
<li><a href="http://www.credit.com/" data-cke-saved-href="http://www.credit.com/">Credit.com</a> (Experian)</li>
<li><a href="http://www.myfico.com/" data-cke-saved-href="http://www.myfico.com/">myFico.com</a> (Equifax) &#8211; Starts a monthly subscription but if you cancel it immediately after you&#8217;ve downloaded your report it&#8217;s free.</li>
</ul>
<p>In addition to getting your score for free you can download your full credit report for all three credit bureaus for free once a year from <a href="http://www.annualcreditreport.com/" data-cke-saved-href="http://www.annualcreditreport.com/">AnnualCreditReport.com</a>. It&#8217;s very advisable to get it every year and check that all the information in your credit reports are correct.</p>
<h4>2) Your Tax Bracket</h4>
<p>This is the maximum rate you pay income tax but it is not the effective rate because in US you pay for every step of the rate ladder so you end up actually paying less. It&#8217;s good to know that if your employer is deducting at your tax bracket rate or more you are probably being held too much taxes. This marginal tax rate also affects how much tax you pay for long term capital gains. So if you are investing that is something you need to take into account. My tax bracket is a 25% but my effective rate is 18.25% for both combined federal and state income tax. However social security, medicare etc push my total tax rate to 26.57%.</p>
<h4>3) Your Personal Savings Rate</h4>
<p>This is the rate how much of your net income you save instead of spend. For many people I know this rate is 0% or very close to it. I&#8217;ve been increasing my rate through out 2013 from a mere 8% to 35% by cutting expenses and then saving or investing the difference. That figure doesn&#8217;t even take into account my pre tax 401(k) savings. I&#8217;ve used it to save for future expenses like vacation but also to grow my emergency fund and my investments.</p>
<h4>4) Your Student Loan Debt</h4>
<p>Studying in US is very expensive and many people have 6 figure student loan debt by the time they graduate. It&#8217;s very important to keep this figure in sight before getting any other debt because this is one debt you can&#8217;t wipe out even in a bankruptcy. I was very lucky to be born in a country where all studying is free and even for my US studies I had a sponsor so my total debt was very small which I paid the first thing I got a job.</p>
<h4>5) Your Net Worth</h4>
<p>This number shows have you gathered any wealth or are you just in debt. If you have a negative net worth it means that you have more debt that you have assets. The basic formula for calculating net worth is to sum up all your assets (cash + properties + investments) and then deduct all your liabilities (loans + credit card debt + other outstanding payments of any kind) the result is your net worth. You can do those calculations with spredsheet or you can use some online tools like Mint and Personal Capital to do it for you.</p>
<p>My current net worth is around $220k it fluctuates because of currency conversion rates because all my real estate assets are outside US so I just usually us a constant conversion rate which currently is below the actual rate. I&#8217;ve been mostly using Mint but lately I&#8217;m been starting to use Personal Capital more because it&#8217;s more geared towards investors. Both of them have great mobile apps and can connect to most financial institutions to pull down your data automatically.</p>
<ul>
<li><a href="http://www.personalcapital.com/" data-cke-saved-href="http://www.personalcapital.com/">Personal Capital</a></li>
<li><a href="http://www.mint.com/" data-cke-saved-href="http://www.mint.com/">Mint</a></li>
</ul>
<p>The post <a href="https://mikakoivisto.fi/blog/2013/12/five-financial-figures-everyone-should-know/">Five Financial Figures Everyone Should Know</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">43186</post-id>	</item>
		<item>
		<title>Monitoring and Graphing Liferay with MRTG</title>
		<link>https://mikakoivisto.fi/blog/2013/10/monitoring-and-graphing-liferay-with-mrtg/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=monitoring-and-graphing-liferay-with-mrtg</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Thu, 17 Oct 2013 11:10:01 +0000</pubDate>
				<category><![CDATA[Software & DevOps]]></category>
		<guid isPermaLink="false">http://javaguru.fi/?p=13</guid>

					<description><![CDATA[<p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='497'%20height='139'%20viewBox=%270%200%20497%20139%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" style="background:linear-gradient(to right,#f5f5f5 25%,#ffffff 25% 50%,#ffffff 50% 75%,#ffffff 75%),linear-gradient(to right,#f5f5f5 25%,#ffffff 25% 50%,#00cc00 50% 75%,#00cc00 75%),linear-gradient(to right,#f5f5f5 25%,#2bb92b 25% 50%,#2bb92b 50% 75%,#2bb92b 75%),linear-gradient(to right,#f5f5f5 25%,#f5f5f5 25% 50%,#f5f5f5 50% 75%,#f5f5f5 75%)" width="497" height="139" data-tf-src="https://mikakoivisto.fi/wp-content/uploads/2016/04/dbpool.png" class="tf_svg_lazy attachment-full size-full wp-post-image" alt="" decoding="async" data-tf-srcset="https://mikakoivisto.fi/wp-content/uploads/2016/04/dbpool.png 497w, https://mikakoivisto.fi/wp-content/uploads/2016/04/dbpool-300x84.png 300w" data-tf-sizes="(max-width: 497px) 100vw, 497px" /><noscript><img width="497" height="139" data-tf-not-load src="https://mikakoivisto.fi/wp-content/uploads/2016/04/dbpool.png" class="attachment-full size-full wp-post-image" alt="" decoding="async" srcset="https://mikakoivisto.fi/wp-content/uploads/2016/04/dbpool.png 497w, https://mikakoivisto.fi/wp-content/uploads/2016/04/dbpool-300x84.png 300w" sizes="(max-width: 497px) 100vw, 497px" /></noscript></p>
<p>MRTG (The Multi Router Traffic Grapher) is usually used to monitor SNMP enabled network devices and draw graphs of how much traffic has passed through each interface. It can also be used to graph any two values (in/out) and I use it for graphing cpu usage, loadavg, iowait, used memory, disk space and temperature sensor [&#8230;]</p>
<p>The post <a rel="nofollow" href="http://javaguru.fi/monitoring-and-graphing-liferay-with-mrtg.html">Monitoring and Graphing Liferay with MRTG</a> appeared first on <a rel="nofollow" href="http://javaguru.fi/">Javaguru</a>.</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2013/10/monitoring-and-graphing-liferay-with-mrtg/">Monitoring and Graphing Liferay with MRTG</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='497'%20height='139'%20viewBox=%270%200%20497%20139%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" style="background:linear-gradient(to right,#f5f5f5 25%,#ffffff 25% 50%,#ffffff 50% 75%,#ffffff 75%),linear-gradient(to right,#f5f5f5 25%,#ffffff 25% 50%,#00cc00 50% 75%,#00cc00 75%),linear-gradient(to right,#f5f5f5 25%,#2bb92b 25% 50%,#2bb92b 50% 75%,#2bb92b 75%),linear-gradient(to right,#f5f5f5 25%,#f5f5f5 25% 50%,#f5f5f5 50% 75%,#f5f5f5 75%)" width="497" height="139" data-tf-src="https://mikakoivisto.fi/wp-content/uploads/2016/04/dbpool.png" class="tf_svg_lazy attachment-full size-full wp-post-image" alt="" decoding="async" data-tf-srcset="https://mikakoivisto.fi/wp-content/uploads/2016/04/dbpool.png 497w, https://mikakoivisto.fi/wp-content/uploads/2016/04/dbpool-300x84.png 300w" data-tf-sizes="(max-width: 497px) 100vw, 497px" /><noscript><img width="497" height="139" data-tf-not-load src="https://mikakoivisto.fi/wp-content/uploads/2016/04/dbpool.png" class="attachment-full size-full wp-post-image" alt="" decoding="async" srcset="https://mikakoivisto.fi/wp-content/uploads/2016/04/dbpool.png 497w, https://mikakoivisto.fi/wp-content/uploads/2016/04/dbpool-300x84.png 300w" sizes="(max-width: 497px) 100vw, 497px" /></noscript></p><p>MRTG (The Multi Router Traffic Grapher) is usually used to monitor SNMP enabled network devices and draw graphs of how much traffic has passed through each interface. It can also be used to graph any two values (in/out) and I use it for graphing cpu usage, loadavg, iowait, used memory, disk space and temperature sensor values that I can read through SNMP. Liferay however doesn&#8217;t support SNMP so I developed a perl script that can read JMX MBean values using JMX4Perl and Jolokia. I&#8217;m going to assume you have JMX4Perl and Jolokia setup already the way I describe it in my earlier post: <a href="http://javaguru.fi/blog/-/blogs/monitoring-liferay-with-nagios-jolokia-and-jmx4perl">Monitoring Liferay with Nagios, Jolokia and JMX4Perl</a>. You should also note that MRTG won&#8217;t send you any alerts so it&#8217;s a good idea to setup Nagios to do just that.</p>
<p>Now you might wonder why would you need MRTG if you already have Nagios. Nagios operates on the present value although there&#8217;s a add-on nagios grapher that can create graphs like MRTG does but I like MRTG more because you can see all the graphs on one page. Being able to see a full overview of the system is very important when trying to identify performance problems. This is also why you want to get more information out of the application, Liferay in this case. My script will help in reading connection pool and thread pool utilization as well as heap usage. Those are essential when doing troubleshooting.</p>
<p>First you&#8217;ll need to install and setup MRTG. I&#8217;m not going to go into details on that because it dependes on your system and the internet is full of guides to do it. Once you have it done you&#8217;ll need to download my <a href="https://github.com/mikakoivisto/random-scripts/blob/master/mrtg/mrtg-jmx4perl.pl">mrtg-jmx4perl.pl </a>script which is available in my <a href="https://github.com/mikakoivisto/random-scripts/tree/master/mrtg">github repository</a>. For rest of this post I&#8217;m going to assume it&#8217;s located in /usr/local/bin/mrtg-jmx4perl.pl but it&#8217;s up to you where you put it. Just adjust the script path accordingly.</p>
<h4>Monitoring c3p0 connection pool</h4>
<p>Getting the values for c3p0 is a little bit tricky because it will generate a unique mbean name based on the identity token it generates for the connection pool every time the server is started. Because of this my script assumes you only have one c3p0 connection pool if you have multiple pool you&#8217;ll need to add additional logic in to the mrtg-jmx4perl to find the correct mbean. Notice that this is the case if you configure Liferay to use connection pool from portal-ext.properties instead of using a JNDI resource. We can read the mbean for c3p0 by using mbean name as &#8220;com.mchange.v2.c3p0:type=*,*&#8221; and the attributes we are most interested are numConnectionsAllUsers and numBusyConnectionsAllUsers. Below is a sample mrtg configuration snippet.</p>
<pre><code class="code-snippet">Target[dbpool]: `/usr/local/bin/mrtg-jmx4perl.pl --server=servername --mbean="com.mchange.v2.c3p0:type=*,*" --attribute="numConnectionsAllUsers numBusyConnectionsAllUsers"`
MaxBytes[dbpool]: 20
Title[dbpool]: DB Pool
PageTop[dbpool]: &lt;h1&gt;DB Pool&lt;/h1&gt;
WithPeak[dbpool]: dwmy
Unscaled[dbpool]: dwmy
Options[dbpool]: growright,unknaszero,nopercent,gauge
YLegend[dbpool]: Connections
ShortLegend[dbpool]: 
LegendI[dbpool]: Connections
LegendO[dbpool]: Busy Connections
Legend1[dbpool]: Connections
Legend2[dbpool]: Busy Connections
Legend3[dbpool]: Peak Connections
Legend4[dbpool]: Peak Busy Connections</code></pre>
<p>Here&#8217;s a daily graph from one of my Liferay portal servers.</p>
</p>
<h4>Monitoring Tomcat AJP Thread Pool</h4>
<p>This one is pretty easy because the the mbean name is static but it does vary depending on do tomcat version and connector you are using. In Tomcat 7 with native library the name for ajp thread pool is Catalina:type=ThreadPool,name=&#8221;ajp-apr-8009&#8243;. Without native library it would be ajp-bio-8009. In tomcat 6 my ajp pool mbean name is Catalina:type=ThreadPool,name=jk-8009. Notice the lack of double quotes in the name. You can easily check the name using jconsole. So for this one the config looks like:</p>
<pre><code class="code-snippet">Target[ajp-threadpool]: `/usr/local/bin/mrtg-jmx4perl.pl --server=servername --mbean="Catalina:type=ThreadPool,name="ajp-apr-8009"" --attribute="currentThreadCount currentThreadsBusy"`
MaxBytes[ajp-threadpool]: 50
Title[ajp-threadpool]: AJP Thread Pool
PageTop[ajp-threadpool]: &lt;h1&gt;AJP Thread Pool&lt;/h1&gt;
WithPeak[ajp-threadpool]: dwmy
#Unscaled[ajp-threadpool]: dwmy
Options[ajp-threadpool]:  growright,unknaszero,nopercent,gauge
YLegend[ajp-threadpool]: Threads
ShortLegend[ajp-threadpool]: 
LegendI[ajp-threadpool]: Threads
LegendO[ajp-threadpool]: Busy Threads
Legend1[ajp-threadpool]: Threads
Legend2[ajp-threadpool]: Busy Threads
Legend3[ajp-threadpool]: Peak Threads
Legend4[ajp-threadpool]: Peak Busy Threads</code></pre>
<p>Here&#8217;s a daily graph of a thread pool.</p>
<p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='497'%20height='139'%20viewBox=%270%200%20497%20139%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" class="tf_svg_lazy" decoding="async" data-tf-src="http://mikakoivisto.fi/wp-content/uploads/2016/04/threads.png" width="497" height="139" alt="Monitoring and Graphing Liferay with MRTG" /><noscript><img decoding="async" data-tf-not-load src="http://mikakoivisto.fi/wp-content/uploads/2016/04/threads.png" width="497" height="139" alt="Monitoring and Graphing Liferay with MRTG" /></noscript></p>
<h4>Monitoring Heap Usage</h4>
<p>The last one we are going to monitor is Java Heap usage. It can be read from java.lang:type=Memory using attribute HeapMemoryUsage and path used. Now we are reading only one value.</p>
<pre><code class="code-snippet">Target[heap]: `/usr/local/bin/mrtg-jmx4perl.pl --server=servername --mbean="java.lang:type=Memory" --attribute="HeapMemoryUsage" --path="used"`
MaxBytes[heap]: 1296302080
Title[heap]: Heap
PageTop[heap]: &lt;h1&gt;Heap&lt;/h1&gt;
WithPeak[heap]: dwmy
Unscaled[heap]: dwmy
Options[heap]:  growright,unknaszero,nopercent,gauge,noo
YLegend[heap]: bytes
ShortLegend[heap]: 
kilo[heap]: 1024
LegendI[heap]: Used
Legend1[heap]: Used
Legend3[heap]: Peak Used</code></pre>
<p>Here&#8217;s a daily graph of heap memory usage.</p>
<p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='497'%20height='139'%20viewBox=%270%200%20497%20139%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" class="tf_svg_lazy" decoding="async" data-tf-src="http://mikakoivisto.fi/wp-content/uploads/2016/04/heap.png" width="497" height="139" alt="Monitoring and Graphing Liferay with MRTG" /><noscript><img decoding="async" data-tf-not-load src="http://mikakoivisto.fi/wp-content/uploads/2016/04/heap.png" width="497" height="139" alt="Monitoring and Graphing Liferay with MRTG" /></noscript></p>
<p>You can download the full <a href="https://raw.github.com/mikakoivisto/random-scripts/master/mrtg/sample-mrtg.cfg">sample-mrtg.cfg</a> from <a href="https://github.com/mikakoivisto/random-scripts/blob/master/mrtg/sample-mrtg.cfg">github</a>.</p>
<p>That&#8217;s how easy it is to monitor and graph Liferay or pretty much any Java webapp using MRTG. You could easily use this to monitor ehcache utilization or anything else that&#8217;s accessible via JMX.</p>
<p>The post <a rel="nofollow" href="http://javaguru.fi/monitoring-and-graphing-liferay-with-mrtg.html">Monitoring and Graphing Liferay with MRTG</a> appeared first on <a rel="nofollow" href="http://javaguru.fi/">Javaguru</a>.</p>
<!--themify_builder_content-->
<div id="themify_builder_content-146" data-postid="146" class="themify_builder_content themify_builder_content-146 themify_builder tf_clear">
    </div>
<!--/themify_builder_content-->
<p>The post <a href="https://mikakoivisto.fi/blog/2013/10/monitoring-and-graphing-liferay-with-mrtg/">Monitoring and Graphing Liferay with MRTG</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">146</post-id>	</item>
		<item>
		<title>Liferay Maven Support in Liferay 6.1 GA3</title>
		<link>https://mikakoivisto.fi/blog/2013/06/liferay-maven-support-in-liferay-6-1-ga3/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=liferay-maven-support-in-liferay-6-1-ga3</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Tue, 18 Jun 2013 22:25:20 +0000</pubDate>
				<category><![CDATA[Software & DevOps]]></category>
		<guid isPermaLink="false">https://web.liferay.com/web/mika.koivisto/blog/-/blogs/liferay-maven-support-in-liferay-6-1-ga3</guid>

					<description><![CDATA[<p>
	We've finally released both CE and EE versions of Liferay 6.1 GA3 and along with those releases we've also released the corresponding versions of Liferay Maven Support and Portal artifacts. The version numbers are 6.1.2 for CE GA3 and 6.1.30 for EE GA3. With this release there is one significant improvement in the Liferay Maven Plugin and that is they are no longer directly dependent on a Liferay Portal version. We could have just released one version and it would have worked with either portal version, in fact they both work with any portal version starting from 6.1.0. In the future we will probably move to a single release of Liferay Maven Support which will eventually have it's own release cycle completely independent of the portals release cycle. &#160;</p>
<p>
	All the archetypes will now have a separate property for Liferay Maven Plugin version called liferay.maven.plugin.version. The plugin will also now require you to tell which portal version you are developing against and you'll do that by providing it liferayVersion in the configuration section. Here's a example from liferay-theme-archetype:</p>
<pre>
</pre>
<div>
	&#60;plugin&#62;<br />
	&#160; &#60;groupId&#62;com.liferay.maven.plugins&#60;/groupId&#62;<br />
	&#160; &#60;artifactId&#62;liferay-maven-plugin&#60;/artifactId&#62;<br />
	&#160; &#60;version&#62;${liferay.maven.plugin.version}&#60;/version&#62;<br />
	&#160; &#60;executions&#62;<br />
	&#160; &#160; &#60;execution&#62;<br />
	&#160; &#160; &#160; &#60;phase&#62;generate-sources&#60;/phase&#62;<br />
	&#160; &#160; &#160; &#60;goals&#62;<br />
	&#160; &#160; &#160; &#160; &#60;goal&#62;theme-merge&#60;/goal&#62;<br />
	&#160; &#160; &#160; &#160; &#60;goal&#62;build-css&#60;/goal&#62;<br />
	&#160; &#160; &#160; &#160; &#60;goal&#62;build-thumbnail&#60;/goal&#62;<br />
	&#160; &#160; &#160; &#60;/goals&#62;<br />
	&#160; &#160; &#60;/execution&#62;<br />
	&#160; &#60;/executions&#62;<br />
	&#160; &#60;configuration&#62;<br />
	&#160; &#160; &#60;autoDeployDir&#62;${liferay.auto.deploy.dir}&#60;/autoDeployDir&#62;<br />
	&#160; &#160; &#60;appServerDeployDir&#62;${liferay.app.server.deploy.dir}&#60;/appServerDeployDir&#62;<br />
	&#160; &#160; &#60;appServerLibGlobalDir&#62;${liferay.app.server.lib.global.dir}&#60;/appServerLibGlobalDir&#62;<br />
	&#160; &#160; &#60;appServerPortalDir&#62;${liferay.app.server.portal.dir}&#60;/appServerPortalDir&#62;<br />
	&#160; &#160; &#60;liferayVersion&#62;${liferay.version}&#60;/liferayVersion&#62;<br />
	&#160; &#160; &#60;parentTheme&#62;${liferay.theme.parent}&#60;/parentTheme&#62;<br />
	&#160; &#160; &#60;pluginType&#62;theme&#60;/pluginType&#62;<br />
	&#160; &#160; &#60;themeType&#62;${liferay.theme.type}&#60;/themeType&#62;<br />
	&#160; &#60;/configuration&#62;&#60;/plugin&#62;</div>
<p>
	Please remember that the plugin will still be affected any bugs in the Liferay Portal Version so if you have patches installed you should point the plugin to a patched portal bundle by setting the liferay.app.server.xxx properties. If you discover any bugs in any of the plugin mojos please report them to our <a href="http://issues.liferay.com/browse/MAVEN">MAVEN</a> Jira project.</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2013/06/liferay-maven-support-in-liferay-6-1-ga3/">Liferay Maven Support in Liferay 6.1 GA3</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>We&#8217;ve finally released both CE and EE versions of Liferay 6.1 GA3 and along with those releases we&#8217;ve also released the corresponding versions of Liferay Maven Support and Portal artifacts. The version numbers are 6.1.2 for CE GA3 and 6.1.30 for EE GA3. With this release there is one significant improvement in the Liferay Maven Plugin and that is they are no longer directly dependent on a Liferay Portal version. We could have just released one version and it would have worked with either portal version, in fact they both work with any portal version starting from 6.1.0. In the future we will probably move to a single release of Liferay Maven Support which will eventually have it&#8217;s own release cycle completely independent of the portals release cycle.  <span id="more-266"></span></p>
<p>All the archetypes will now have a separate property for Liferay Maven Plugin version called liferay.maven.plugin.version. The plugin will also now require you to tell which portal version you are developing against and you&#8217;ll do that by providing it liferayVersion in the configuration section. Here&#8217;s a example from liferay-theme-archetype:</p>
<pre></pre>
<style type="text/css">*.blog-snippet {<br />
	border: 1.0px solid rgb(222,222,222);<br />
	font-family: Monaco , "Courier New" , "DejaVu Sans Mono" , "Bitstream Vera Sans Mono" , monospace;<br />
	margin-bottom: 1.0em;<br />
	overflow: auto;<br />
}<br />
</style>
<div class="blog-snippet">&lt;plugin&gt;<br />
&lt;groupId&gt;com.liferay.maven.plugins&lt;/groupId&gt;<br />
&lt;artifactId&gt;liferay-maven-plugin&lt;/artifactId&gt;<br />
&lt;version&gt;${liferay.maven.plugin.version}&lt;/version&gt;<br />
&lt;executions&gt;<br />
&lt;execution&gt;<br />
&lt;phase&gt;generate-sources&lt;/phase&gt;<br />
&lt;goals&gt;<br />
&lt;goal&gt;theme-merge&lt;/goal&gt;<br />
&lt;goal&gt;build-css&lt;/goal&gt;<br />
&lt;goal&gt;build-thumbnail&lt;/goal&gt;<br />
&lt;/goals&gt;<br />
&lt;/execution&gt;<br />
&lt;/executions&gt;<br />
&lt;configuration&gt;<br />
&lt;autoDeployDir&gt;${liferay.auto.deploy.dir}&lt;/autoDeployDir&gt;<br />
&lt;appServerDeployDir&gt;${liferay.app.server.deploy.dir}&lt;/appServerDeployDir&gt;<br />
&lt;appServerLibGlobalDir&gt;${liferay.app.server.lib.global.dir}&lt;/appServerLibGlobalDir&gt;<br />
&lt;appServerPortalDir&gt;${liferay.app.server.portal.dir}&lt;/appServerPortalDir&gt;<br />
&lt;liferayVersion&gt;${liferay.version}&lt;/liferayVersion&gt;<br />
&lt;parentTheme&gt;${liferay.theme.parent}&lt;/parentTheme&gt;<br />
&lt;pluginType&gt;theme&lt;/pluginType&gt;<br />
&lt;themeType&gt;${liferay.theme.type}&lt;/themeType&gt;<br />
&lt;/configuration&gt;&lt;/plugin&gt;</div>
<p>Please remember that the plugin will still be affected any bugs in the Liferay Portal Version so if you have patches installed you should point the plugin to a patched portal bundle by setting the liferay.app.server.xxx properties. If you discover any bugs in any of the plugin mojos please report them to our <a href="http://issues.liferay.com/browse/MAVEN">MAVEN</a> Jira project.</p>
<p>This post was originally published on <a href="https://web.liferay.com/web/mika.koivisto/blog/-/blogs/liferay-maven-support-in-liferay-6-1-ga3">Liferay blog</a>.</p>
<div id="themify_builder_content-266" data-postid="266" class="themify_builder_content themify_builder_content-266 themify_builder themify_builder_front"></div>
<p><!-- /themify_builder_content --></p>
<p>The post <a href="https://mikakoivisto.fi/blog/2013/06/liferay-maven-support-in-liferay-6-1-ga3/">Liferay Maven Support in Liferay 6.1 GA3</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">43254</post-id>	</item>
		<item>
		<title>How to get your credit score for free</title>
		<link>https://mikakoivisto.fi/blog/2013/04/how-to-get-your-credit-score-for-free/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=how-to-get-your-credit-score-for-free</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Wed, 17 Apr 2013 20:47:21 +0000</pubDate>
				<category><![CDATA[Finance]]></category>
		<guid isPermaLink="false">http://mymoneymatters.co/?p=48</guid>

					<description><![CDATA[<p>Knowing your credit score and how to improve it is very important. Your credit score affects how you get credit and at what cost. It affects the interest rate on your mortgage, auto loan, credit card and even the amount of security deposit you have to pay when you rent an apartment. Having a poor [&#8230;]</p>
<p>The post <a rel="nofollow" href="http://mymoneymatters.co/how-to-get-your-credit-score-for-free.html">How to get your credit score for free</a> appeared first on <a rel="nofollow" href="http://mymoneymatters.co/">My Money Matters</a>.</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2013/04/how-to-get-your-credit-score-for-free/">How to get your credit score for free</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Knowing your credit score and how to improve it is very important. Your credit score affects how you get credit and at what cost. It affects the interest rate on your mortgage, auto loan, credit card and even the amount of security deposit you have to pay when you rent an apartment. Having a poor credit score means you&#8217;ll pay more for a lot of things. The three credit bureaus (Experian, Equifax and TransUnion) wants you to buy your credit score and their credit monitoring service but you can get those for free too.</p>
<p>Following two provide a montly credit score update and notify you of any changes in your credit report for free. I use both of the because they pull their data from different credit bureaus and their score is most of the time different but still fairly close which gives an idea what your score is at any given time.</p>
<ul>
<li><a href="http://www.creditkarma.com/" data-cke-saved-href="http://www.creditkarma.com/">Credit Karma</a> (TransUnion)</li>
<li><a href="http://www.creditsesame.com/" data-cke-saved-href="http://www.creditsesame.com/">Credit Sesame</a> (Experian)</li>
</ul>
<p>These two also provide free score but they update very infrequently:</p>
<ul>
<li><a href="http://www.quizzle.com/" data-cke-saved-href="http://www.quizzle.com/">Quizzle</a> (Experian)</li>
<li><a href="http://www.credit.com/" data-cke-saved-href="http://www.credit.com/">Credit.com</a> (Experian)</li>
</ul>
<p>myFico.com is a subscription service but it does have free trial so if you cancel the subscription right after getting your score it&#8217;s free and it&#8217;s the only way I know to get Equifax score for free.</p>
<ul>
<li><a href="http://www.myfico.com/" data-cke-saved-href="http://www.myfico.com/">myFico.com</a> (Equifax)</li>
</ul>
<p>In addition to getting your score you have a right to get a free credit report once per year from all three credit bureaus. You can get that by heading to <a href="http://www.annualcreditreport.com/" data-cke-saved-href="http://www.annualcreditreport.com/">AnnualCreditReport.com</a>.</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2013/04/how-to-get-your-credit-score-for-free/">How to get your credit score for free</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">43188</post-id>	</item>
		<item>
		<title>Five smart ways to use your tax refund</title>
		<link>https://mikakoivisto.fi/blog/2013/03/five-smart-ways-to-use-your-tax-refund/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=five-smart-ways-to-use-your-tax-refund</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Fri, 15 Mar 2013 18:33:21 +0000</pubDate>
				<category><![CDATA[Finance]]></category>
		<guid isPermaLink="false">http://mymoneymatters.co/?p=46</guid>

					<description><![CDATA[<p>If you are getting any tax refund then you should consider these five ways to put that money to work. If you haven&#8217;t done your taxes yet then now is a really good time to do it. 1. Pay off debt If you have any debt especially high interest credit card, auto title loans or [&#8230;]</p>
<p>The post <a rel="nofollow" href="http://mymoneymatters.co/five-smart-ways-to-use-your-tax-refund.html">Five smart ways to use your tax refund</a> appeared first on <a rel="nofollow" href="http://mymoneymatters.co/">My Money Matters</a>.</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2013/03/five-smart-ways-to-use-your-tax-refund/">Five smart ways to use your tax refund</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>If you are getting any tax refund then you should consider these five ways to put that money to work. If you haven’t done your taxes yet then now is a really good time to do it.</p>
<h4>1. Pay off debt</h4>
<p>If you have any debt especially high interest credit card, auto title loans or payday loans you really should use your tax refund to pay as much of those off as you possibly can.</p>
<h4>2. Put it to your emergency fund</h4>
<p>If you haven’t fully funded your emergency fund or if you haven’t even started it then now’s a good time to use your tax refund to kick start it.</p>
<h4>3. Add to your retirement account</h4>
<p>The more you put money early in your IRA the better it will compound until your retirement. If you have a traditional IRA you might also be able to use the contribution as tax deduction next year.</p>
<h4>4. Save for vacation</h4>
<p>It’s always good to have savings in addition to your emergency fund for vacations and occational splurge or pampering yourself. It’s always good to reward yourself for meeting goals and not spending everything the moment you receive money.</p>
<h4>5. Invest</h4>
<p>If you haven’t started investing yet nows a good time. The interest rates are really low currently and you won’t get much of a return on your savings. If you have little extra to spare it’s a good idea to try to get some extra return on your money. I personally like to invest in low maintenance fee ETFs that provide some divident yield. Charles Schwab has bunch of commission free ETFs.</p>
<p>Personally I used my tax refund to pay off my motorcycle loan and put rest of it in my emergency fund. That in turn has freed up more money I can save and invest every month.</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2013/03/five-smart-ways-to-use-your-tax-refund/">Five smart ways to use your tax refund</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">43190</post-id>	</item>
		<item>
		<title>Dealing with high credit card debt</title>
		<link>https://mikakoivisto.fi/blog/2013/03/dealing-with-high-credit-card-debt/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=dealing-with-high-credit-card-debt</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Sat, 09 Mar 2013 23:52:50 +0000</pubDate>
				<category><![CDATA[Finance]]></category>
		<guid isPermaLink="false">http://mymoneymatters.co/?p=42</guid>

					<description><![CDATA[<p>The average American household has $7,122 of credit card debt and the average indebt household has $15,266. &#160;Those are pretty disturbingly high numbers. So it&#8217;s no surprice if you belong to the 1 in 4 households that are struggling to pay off their debt. I&#8217;ve had times in the past when I carried a balance [&#8230;]</p>
<p>The post <a rel="nofollow" href="http://mymoneymatters.co/dealing-with-high-credit-card-debt.html">Dealing with high credit card debt</a> appeared first on <a rel="nofollow" href="http://mymoneymatters.co/">My Money Matters</a>.</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2013/03/dealing-with-high-credit-card-debt/">Dealing with high credit card debt</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>The average American household has $7,122 of credit card debt and the average indebt household has $15,266.  Those are pretty disturbingly high numbers. So it’s no surprice if you belong to the 1 in 4 households that are struggling to pay off their debt.</p>
<p>I’ve had times in the past when I carried a balance on my card for few months or paid it off when I got my paycheck just to use it again. That’s a pretty vicious cycle that’s hard to get out of. In my case I the interest rate was very low compared to the high interest rates most credit cards in the US have. A credit card interest rate can be easily 20% to 25% APR unless you have a good credit score and even then it’s over 10% APR. With that kind of interest if you are just paying off the minimum you are mostly just paying interest.</p>
<p>So what do you do if you’ve gotten into that kind of jam. Do you take a payday loan or car title loan to pay off your credit card? Hell no. Those are even more expensive loans. A payday loan can be up to 1600% APR. That’s what I call loan sharking except no ones probably going to come beat you up for not paying but still. Auto title loans aren’t any better. They charge any where between 60% to 160% APR. Your best bet is to consolidate your high interest loans and debt with a low or at least much lower interest personal loan. If your credit score has already taken a hit from hight credit utilization and balance then paying them off and replaceing them with a single personal loan will help in the long run. You’ll also pay less interest and can pay off your debt faster.</p>
<p>If you are in bad shape financially then it might be difficult to get a loan with decent interest from a bank but there’s some alternatives. I’ve recently discovered peer-to-peer lending which I think is really awesome. In p2p lending you are not getting the money from a traditional bank but rather from other people that act as investors. The loan is applied from a middle man company take takes it’s cut from the interest paid to the investors and they do preliminary screening and classification of your loan application but in the end it’s the investors that decide who gets funded. Your loan is then issued by the company with the funds gathered from multiple investors.</p>
<p>The two companies that do this in US are <a href="http://www.jdoqocy.com/click-7061028-10952425" data-cke-saved-href="http://www.jdoqocy.com/click-7061028-10952425">Prosper</a> and <a href="http://bit.ly/WV5R5X" data-cke-saved-href="http://bit.ly/WV5R5X">Lending Club</a>. <a href="http://www.jdoqocy.com/click-7061028-10952425" data-cke-saved-href="http://www.jdoqocy.com/click-7061028-10952425">Prosper</a> is older and provides 1, 3 and 5 year loans. <a href="http://bit.ly/WV5R5X" data-cke-saved-href="http://bit.ly/WV5R5X">Lending Club</a> is a bit newer but has surpassed <a href="http://www.jdoqocy.com/click-7061028-10952425" data-cke-saved-href="http://www.jdoqocy.com/click-7061028-10952425">Prosper</a> in the amount of loans they issue. <a href="http://bit.ly/WV5R5X" data-cke-saved-href="http://bit.ly/WV5R5X">Lending Club</a> only provides 3 and 5 year loans. With both companies there’s only one time origination fee which is taken from top of your loan and neither one has early payment fees so even if you take a longer term loan to get smaller monthly installment you can still pay it off at any time.</p>
<p>I think both are great alternatives to a regular bank and the application process seems simple enough. I haven’t tried either as a borrower but I am an investor in <a href="http://bit.ly/We1tSj" data-cke-saved-href="http://bit.ly/We1tSj">Lending Club</a>. For me it provides a good return for my investment and at the same time I can help some people get back on track with their finances. As a added bonus the greedy banks don’t get their cut and hopefully at some point it provides some real competition for banks. If you are interested in becoming a investor in Lending Club follow <a href="http://bit.ly/We1tSj" data-cke-saved-href="http://bit.ly/We1tSj">this referral link</a> and you get a $100 bonus with inital funding of $2500.</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2013/03/dealing-with-high-credit-card-debt/">Dealing with high credit card debt</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">43192</post-id>	</item>
		<item>
		<title>Smartphone with or without a contract</title>
		<link>https://mikakoivisto.fi/blog/2013/02/smartphone-with-or-without-a-contract/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=smartphone-with-or-without-a-contract</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Thu, 28 Feb 2013 11:10:35 +0000</pubDate>
				<category><![CDATA[Finance]]></category>
		<guid isPermaLink="false">http://mymoneymatters.co/?p=37</guid>

					<description><![CDATA[<p>Does it make financial sense to get your new smartphone with a 24 month contract? That is something I never even thought about before coming to USA. Back home most people paid full price on the phone and got what ever plan they wanted althought it has become more popular to get subsidiced phones with [&#8230;]</p>
<p>The post <a rel="nofollow" href="http://mymoneymatters.co/smartphone-with-or-without-a-contract.html">Smartphone with or without a contract</a> appeared first on <a rel="nofollow" href="http://mymoneymatters.co/">My Money Matters</a>.</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2013/02/smartphone-with-or-without-a-contract/">Smartphone with or without a contract</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Does it make financial sense to get your new smartphone with a 24 month contract? That is something I never even thought about before coming to USA. Back home most people paid full price on the phone and got what ever plan they wanted althought it has become more popular to get subsidiced phones with 24 month contract. For me I never thought about getting a subsidiced phone until I came here. Back then there was no choise because I had to have an iPhone so it meant signing a 24 month contract with AT&amp;T. Thankfully now there’s choises.</p>
<p>For comparison I’m going to compare few T-Mobile and AT&amp;T plans since I’m most familiar with them. Some of the plans are not going to be equal they are just going to be cheapest vs cheapest type of comparison. The choice of iPhone model doesn’t affect the end result it’s just the up front cost. The difference will between total costs will be the same regardless of picking the cheapest iPhone 4 or the latest and most expensive iPhone 5. So I’ll just use the cheapest iPhone 4 model for comparison as if it was bought new from Apple Store with or without the contract. I’m going to ignore taxes and fees on the contract plans to make the comparison simpler.</p>
<h4>Cheapest T-Mobile prepaid vs cheapest AT&amp;T contract</h4>
<p><strong>T-Mobile prepaid plan:</strong></p>
<ul>
<li>Cost of iPhone 4 8GB $450</li>
<li>Cost $30 per month</li>
<li>Unlimited data (up to 5GB in 4G speeds)</li>
<li>Unlimited text</li>
<li>100 minutes of talk</li>
</ul>
<p><strong>AT&amp;T contract plan:</strong></p>
<ul>
<li>Cost of iPhone 4 8GB $0</li>
<li>Cost $59.99 + fees and taxes</li>
<li>300MB of data</li>
<li>No text messages</li>
<li>450 minutes of talk</li>
</ul>
<p>As you can see these are not quite equal plans. Total cost of T-Mobile prepaid in 24 month period is $1170 and that includes the phone. The AT&amp;T contract cost is $1439.76. So without contract you’ll save almost $270 over 24 months or $11.24 per month. I think that’s a huge win for no contract.</p>
<h4>T-Mobile unlimited everything vs AT&amp;T unlimited talk and text w/ 5GB data</h4>
<p><strong>T<strong>-M</strong>obile prepaid plan:</strong></p>
<ul>
<li>Cost of iPhone 4 8GB $450</li>
<li>Cost $70 per month</li>
<li>Unlimited 4G data</li>
<li>Unlimited text</li>
<li>Unlimited talk</li>
</ul>
<p><strong>AT&amp;T contract plan:</strong></p>
<ul>
<li>Cost of iPhone 4 8GB $0</li>
<li>Cost $139.99 + fees and taxes</li>
<li>5GB 4G data</li>
<li>Unlimited text</li>
<li>Unlimited talk</li>
</ul>
<p>AT&amp;T doesn’t offer unlimited data so these plans match each other the closest. Total cost for T-Mobile prepaid is $2130. The AT&amp;T contract cost is $3359.76. That’s a whopping $1229.76 difference so you your savings are even greater with the no contract T-Mobile. The savings per month comes out to $51.24.</p>
<h4>T-Mobile unlimited prepaid vs T-Mobile classic unlimited 4G</h4>
<p><strong>T<strong>-M</strong>obile prepaid plan:</strong></p>
<ul>
<li>Cost of iPhone 4 8GB $450</li>
<li>Cost $70 per month</li>
<li>Unlimited 4G data</li>
<li>Unlimited text</li>
<li>Unlimited talk</li>
</ul>
<p><strong>T<strong>-M</strong>obile classic contract plan:</strong></p>
<ul>
<li>Cost of iPhone 4 8GB $450</li>
<li>Cost $89.99 per month</li>
<li>Unlimited 4G data</li>
<li>Unlimited text</li>
<li>Unlimited talk</li>
</ul>
<p>This is the fairest comparison because both plans have the same features and there’s no phone subsidicing involved. The prepaid total cost is $2130 and the contract cost is $2609.76. That’s still savings of $479.76 or $19.99 per month on the prepaid.</p>
<p>It’s clear that the no contract is way cheaper over time but it does have higher up front cost. If you are worried about T-Mobile compatiblity with iPhone don’t it’s gotten really good.</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2013/02/smartphone-with-or-without-a-contract/">Smartphone with or without a contract</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">43194</post-id>	</item>
		<item>
		<title>Got a speeding ticket now what</title>
		<link>https://mikakoivisto.fi/blog/2013/02/got-a-speeding-ticket-now-what/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=got-a-speeding-ticket-now-what</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Wed, 27 Feb 2013 21:55:32 +0000</pubDate>
				<category><![CDATA[Finance]]></category>
		<guid isPermaLink="false">http://mymoneymatters.co/?p=34</guid>

					<description><![CDATA[<p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='300'%20height='300'%20viewBox=%270%200%20300%20300%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" style="background:linear-gradient(to right,#464329 25%,#191e26 25% 50%,#1b1909 50% 75%,#121b0a 75%),linear-gradient(to right,#717788 25%,#1c190f 25% 50%,#f5f5f5 50% 75%,#717788 75%),linear-gradient(to right,#997453 25%,#ab8564 25% 50%,#090e13 50% 75%,#1c262a 75%),linear-gradient(to right,#040005 25%,#998557 25% 50%,#666244 50% 75%,#bbae84 75%)" width="300" height="300" data-tf-src="https://mikakoivisto.fi/wp-content/uploads/2013/02/police-writing-ticket.png" class="tf_svg_lazy attachment-full size-full wp-post-image" alt="" decoding="async" data-tf-srcset="https://mikakoivisto.fi/wp-content/uploads/2013/02/police-writing-ticket.png 300w, https://mikakoivisto.fi/wp-content/uploads/2013/02/police-writing-ticket-150x150.png 150w, https://mikakoivisto.fi/wp-content/uploads/2013/02/police-writing-ticket-400x400.png 400w, https://mikakoivisto.fi/wp-content/uploads/2013/02/police-writing-ticket-500x500.png 500w" data-tf-sizes="(max-width: 300px) 100vw, 300px" /><noscript><img width="300" height="300" data-tf-not-load src="https://mikakoivisto.fi/wp-content/uploads/2013/02/police-writing-ticket.png" class="attachment-full size-full wp-post-image" alt="" decoding="async" srcset="https://mikakoivisto.fi/wp-content/uploads/2013/02/police-writing-ticket.png 300w, https://mikakoivisto.fi/wp-content/uploads/2013/02/police-writing-ticket-150x150.png 150w, https://mikakoivisto.fi/wp-content/uploads/2013/02/police-writing-ticket-400x400.png 400w, https://mikakoivisto.fi/wp-content/uploads/2013/02/police-writing-ticket-500x500.png 500w" sizes="(max-width: 300px) 100vw, 300px" /></noscript></p>
<p>The first time I got the little yellow notice to appear that they give out here in California I was really confused. Back home when police gives you a ticket for speeding it has the fee you have to pay which is based on your income so the only time you&#8217;d really complain about it [&#8230;]</p>
<p>The post <a rel="nofollow" href="http://mymoneymatters.co/got-a-speeding-ticket-now-what.html">Got a speeding ticket now what</a> appeared first on <a rel="nofollow" href="http://mymoneymatters.co/">My Money Matters</a>.</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2013/02/got-a-speeding-ticket-now-what/">Got a speeding ticket now what</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='300'%20height='300'%20viewBox=%270%200%20300%20300%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" style="background:linear-gradient(to right,#464329 25%,#191e26 25% 50%,#1b1909 50% 75%,#121b0a 75%),linear-gradient(to right,#717788 25%,#1c190f 25% 50%,#f5f5f5 50% 75%,#717788 75%),linear-gradient(to right,#997453 25%,#ab8564 25% 50%,#090e13 50% 75%,#1c262a 75%),linear-gradient(to right,#040005 25%,#998557 25% 50%,#666244 50% 75%,#bbae84 75%)" width="300" height="300" data-tf-src="https://mikakoivisto.fi/wp-content/uploads/2013/02/police-writing-ticket.png" class="tf_svg_lazy attachment-full size-full wp-post-image" alt="" decoding="async" data-tf-srcset="https://mikakoivisto.fi/wp-content/uploads/2013/02/police-writing-ticket.png 300w, https://mikakoivisto.fi/wp-content/uploads/2013/02/police-writing-ticket-150x150.png 150w, https://mikakoivisto.fi/wp-content/uploads/2013/02/police-writing-ticket-400x400.png 400w, https://mikakoivisto.fi/wp-content/uploads/2013/02/police-writing-ticket-500x500.png 500w" data-tf-sizes="(max-width: 300px) 100vw, 300px" /><noscript><img width="300" height="300" data-tf-not-load src="https://mikakoivisto.fi/wp-content/uploads/2013/02/police-writing-ticket.png" class="attachment-full size-full wp-post-image" alt="" decoding="async" srcset="https://mikakoivisto.fi/wp-content/uploads/2013/02/police-writing-ticket.png 300w, https://mikakoivisto.fi/wp-content/uploads/2013/02/police-writing-ticket-150x150.png 150w, https://mikakoivisto.fi/wp-content/uploads/2013/02/police-writing-ticket-400x400.png 400w, https://mikakoivisto.fi/wp-content/uploads/2013/02/police-writing-ticket-500x500.png 500w" sizes="(max-width: 300px) 100vw, 300px" /></noscript></p><p>The first time I got the little yellow notice to appear that they give out here in California I was really confused. Back home when police gives you a ticket for speeding it has the fee you have to pay which is based on your income so the only time you&#8217;d really complain about it if your income has decreased from previous year. Well here it just states my alleged offence and the court where I need to appear by certain date and time. Depending on your offence you can just pay the fine, appear in court, contest the violation, request traffic school or request trial by written declation.</p>
<p>The first time I just paid the fine and requested traffic school so that I wouldn&#8217;t get a point and have my insurance rate increased. Well it didn&#8217;t take even a year when I got a second one. This time I couldn&#8217;t take traffic school because I had already done it once in the past 18 months. Even if I could have the point would still have shown on my driving record. After doing some research online I decided try my luck with trial by written declaration. According to many people there&#8217;s a change the officer won&#8217;t submit his side of the events and if you follow these simple steps the judge doesn&#8217;t have any other choise but to dismiss the case.</p>
<ol>
<li>Delay, delay, delay<br />
Take your time and ask for all the extensions you can but never miss any deadline. At least here in Los Angeles you can do this online. You can ask one extension for your appearance date.</li>
<li>Request trial by written declaration<br />
Once your time is up you can send your bail amount and ask for trial by written declaration. For me they sent a letter with a form where you could check that you are requesting trial by written declaration. At this time you need to pay your bail amount. Make sure it reaches the court before your appearance date. It&#8217;s better to do this via mail than to go yourself to the courthouse. This will delay it further. You should see your new deadline online but it&#8217;s usually 30 days from your previous deadline. Since it was my first time I didn&#8217;t know how it was supposed to work. So I waited to get some papers in the mail but those never showed up so I sent a separate letter requesting trial by written declaration. I also went to the courthouse in person on the day I saw online that it was due and said that I had not received anything in the mail. The cleark told me that it was due today but I got another 30 day extension and the form I was supposed to get in mail.</li>
<li>Submit your declaration<br />
Again wait until last minute to submit your declaration. Your declaration should be something as simple as &#8220;I stand by my plea of not guilty&#8221;. Don&#8217;t give any excuses or provide anything information that could be later used against you. I literally wrote just that line as my declaration. Now all you can do is wait until the court processes it. At this time they will request the officers declaration and if they don&#8217;t get it the judge can only dismiss the charges unless of course you provided a statement that implicates you. The officer is not paid over time to write the declartion so he probably won&#8217;t do it unless you got some rookie still exited about his job. If you are unlucky to have the officer send in his declaration then all is not lost even though the judge will find you guilty. You can still request a new trial in front of the judge and what&#8217;s best about this is that you can get the officers statement and can then attack it&#8217;s creadibility. At this point it&#8217;s probably a good idea to hire a lawyer specialized in traffic court.</li>
</ol>
<p>In the end I was lucky and the judge dismissed the case and I&#8217;ll get my $360 bail fully refunded in about 6 weeks. I&#8217;m not a lawyer and you should consult a one before taking these steps. They also might not apply to jurisdictions outside Los Angeles.</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2013/02/got-a-speeding-ticket-now-what/">Got a speeding ticket now what</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">43196</post-id>	</item>
		<item>
		<title>Saving for a rainy day</title>
		<link>https://mikakoivisto.fi/blog/2013/02/saving-for-a-rainy-day/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=saving-for-a-rainy-day</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Sat, 02 Feb 2013 19:15:32 +0000</pubDate>
				<category><![CDATA[Finance]]></category>
		<guid isPermaLink="false">http://mymoneymatters.co/?p=28</guid>

					<description><![CDATA[<p>One of the first things most personal finance gurus tell you to do is start an emergency fund. But what is an emergency fund: it&#8217;s a easily accessible stash of money that is dedicated to emergencies only. It&#8217;s not regular savings that you can use as a down payment for a car or something. It&#8217;s [&#8230;]</p>
<p>The post <a rel="nofollow" href="http://mymoneymatters.co/saving-for-a-rainy-day.html">Saving for a rainy day</a> appeared first on <a rel="nofollow" href="http://mymoneymatters.co/">My Money Matters</a>.</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2013/02/saving-for-a-rainy-day/">Saving for a rainy day</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>One of the first things most personal finance gurus tell you to do is start an emergency fund. But what is an emergency fund: it’s a easily accessible stash of money that is dedicated to emergencies only. It’s not regular savings that you can use as a down payment for a car or something. It’s dedicated to real emergencies like sudden unemployment or medical problem not covered by your insurance. So how much should you put away money. That really depends on your situation, some experts suggest saving 6 months to one year salary which is a lot of money. For me it’s just 2 months worth of essential expenses. I’m very well covered by insurance with renters insurance, car insurance, life insurance with AD&amp;D coverage. Against unemployment I combat by being very desirable in the job market. If my current employer would cease to need me I know I can always go back to Europe and find work there very easily. All I need is to be able to handle the relocation costs. Also in addition to all that I have fairly low interest credit available in Europe and I can defer expenses on my Amex which I currently do for everything I possibly can and that even yields to pretty nice cash back once a year.</p>
<p>I’m writing this because I’ve finally replenished my emergency fund as my savings took pretty big hit for moving first from Finland to Germany and then to USA. Both moves had a lot of expenses I hadn’t for seen before. Shipping my stuff from country to country wasn’t cheap but the biggest hit to my finances was caused by the fact that I had absolutely zero credit history in US even though I already had a social security number from the time I was studying here. I had gotten used to certain lifestyle so starting from zero wasn’t easy. I had to pay a huge deposit on my first apartment and getting a car loan wasn’t cheap either and I ended up putting a $12k down payment. On a plus side the car is pretty soon paid off. Also I had to buy furniture and appliances which weren’t cheap either. I guess I could have bought a cheap used car and rent an apartment from a more sketchy side of the city but that’s not why I moved to US. I wanted a better quality of life and it didn’t come cheap.</p>
<p>Now that I have my emergency fund done I can concentrate on saving to down payment on a house. I’ve factored my savings into my budget and as I payoff existing loans that number is just going to increase. Part of my savings include money that I put my brokerage account and that’s dedicated to investments. My Charles Schwab high yield savings account only gives 0.25% interest on my savings so I use my investment fund to try to get better return on the money to combat against inflation. I don’t expect that money to be always available because the investments may loose value. I also like the investments because all the money I have on my brokerage account is hidden from <a href="http://www.mint.com/" data-cke-saved-href="http://www.mint.com/">Mint</a> as available money where as savings are shown so it may make it tempting to spend the money. I may end up putting my emergency fund in a CD or find some other low risk investment that can be liquidated easily.</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2013/02/saving-for-a-rainy-day/">Saving for a rainy day</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">43198</post-id>	</item>
		<item>
		<title>The Importance of Budget and Tracking Spending</title>
		<link>https://mikakoivisto.fi/blog/2013/02/the-importance-of-budget-and-tracking-spending/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=the-importance-of-budget-and-tracking-spending</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Sat, 02 Feb 2013 17:50:50 +0000</pubDate>
				<category><![CDATA[Finance]]></category>
		<guid isPermaLink="false">http://mymoneymatters.co/?p=26</guid>

					<description><![CDATA[<p>Everyone hates doing a budget and tracking their spending but it is really important to in order to make smart financial decisions. Doing a budget doesn&#8217;t have to be that hard and once you&#8217;ve done the inital work keeping it up to date is pretty easy. There&#8217;s a lot of tools that you can use [&#8230;]</p>
<p>The post <a rel="nofollow" href="http://mymoneymatters.co/the-importance-of-budget-and-tracking-spending.html">The Importance of Budget and Tracking Spending</a> appeared first on <a rel="nofollow" href="http://mymoneymatters.co/">My Money Matters</a>.</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2013/02/the-importance-of-budget-and-tracking-spending/">The Importance of Budget and Tracking Spending</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Everyone hates doing a budget and tracking their spending but it is really important to in order to make smart financial decisions. Doing a budget doesn’t have to be that hard and once you’ve done the inital work keeping it up to date is pretty easy. There’s a lot of tools that you can use but I like to keep it simple with a spreadsheet that lists your income and recurring spending such as rent, insurance, utilities etc. I also list all expenses that recur yearly and just dived it up to each paycheck. That way I know exactly how much I have left after all my mandatory expenses. Also if I ever need to cut spending it’s easy to see what are the big expenses I have and if I can lower them. My budget also includes all my savings efforts. I’ve created a Google Spreedsheet <a href="http://bit.ly/MMMCoBudgetTemplate" data-cke-saved-href="http://bit.ly/MMMCoBudgetTemplate">Budget Template</a> which you take and modify it to your needs. It’s quite simplified version of what I use because I have income and expenses in two countries in different currencies. Many of us get our paycheck on bi-weekly basis but our expenses are on monthly schedule so that can make budgeting tricky. In my template I have split both expenses and income into monthly and bi-weekly columns. The monthly expenses are calculated into bi-weekly so you know how much you need to save from your paychecks.</p>
<p>Now another hurdle many people have with their budget is that they don’t actually know how much they are spending in many of the categories like groceries, dining out etc. That’s where <a href="http://www.mint.com/" data-cke-saved-href="http://www.mint.com/">Mint.com</a> comes in really handy. It pulls all your credit card transactions and bank account transactions and automatically categorizes most of them. You can use their mobile app to check your account balances and see what’s happening with your finances. Mint also supports budgeting but I like my spredsheet more for that purpose. I’ve setup some budget just because it will alert me when I’m over those.</p>
<p>Now when you are creating your budget don’t obsess about listing every little thing in it in too great detail but try to list everything in your budget that you pay for regularly even if it’s just once a year. That way you aren’t hiding any expenses and it’s easier for you to see where you are actually spending your money and if you have some expenses you really don’t need. If are spending a lot on groceries for example you might want to dig a little deeper to see what are you actually buying. I’ve really only done that few times to cut out bad habbits. The easiest way to do it is to save all your receipts for a month and then at the end of the month look through them what you’ve bought and record them in a spreedsheet categorized. For groceries the categories could be: food, sweets, alcohol, pet foods etc. Knowing where you are spending money helps a lot in modifying your behavior. a Dollar here or there might not sound much but it easily adds up if you are not careful.</p>
<p>Many personal finance gurus suggest that every cent you earn should have a purpose. I really don’t like that and my budget doesn’t account for every cent I earn. What ‘s not in my budget is my discressionary fund. Some months it goes into extra loan payments or saving and some months I just use to buy things I want. Now if money is tight for you then you might want to budget them as savings goal. If I didn’t have extra wiggle room in my budget I would be really stressed out and couldn’t really enjoy life but having a budget also helps cut those impulse buys because when you are aware of your finances you know what you can afford and when you do give in to those urges to buy something it doesn’t get you into trouble because you knew you can afford it.</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2013/02/the-importance-of-budget-and-tracking-spending/">The Importance of Budget and Tracking Spending</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">43200</post-id>	</item>
		<item>
		<title>Escort Passport 9500ix Radar and Laser Detector</title>
		<link>https://mikakoivisto.fi/blog/2012/12/escort-passport-9500ix-radar-and-laser-detector/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=escort-passport-9500ix-radar-and-laser-detector</link>
					<comments>https://mikakoivisto.fi/blog/2012/12/escort-passport-9500ix-radar-and-laser-detector/#respond</comments>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Mon, 17 Dec 2012 20:28:57 +0000</pubDate>
				<category><![CDATA[Reviews]]></category>
		<category><![CDATA[detector]]></category>
		<category><![CDATA[escort]]></category>
		<category><![CDATA[laser]]></category>
		<category><![CDATA[lidar]]></category>
		<category><![CDATA[radar]]></category>
		<category><![CDATA[Review]]></category>
		<category><![CDATA[veil]]></category>
		<guid isPermaLink="false">https://koivisto.me/?p=4</guid>

					<description><![CDATA[<p>So I finally bought a radar/laser detector. I wanted to buy one after my first ticket but never got around to doing the research on which ones are actually effective. Well now I really wish I had since I&#8217;d probably had already saved it&#8217;s price and I would have avoided the trouble of fighting a [&#8230;]</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2012/12/escort-passport-9500ix-radar-and-laser-detector/">Escort Passport 9500ix Radar and Laser Detector</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='150'%20height='150'%20viewBox=%270%200%20150%20150%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" decoding="async" class="tf_svg_lazy alignright wp-image-6 size-thumbnail" data-tf-src="https://koivisto.me/wp-content/uploads/2015/02/escort-9500ix-blue-150x150.jpg" alt="Escort 9500ix blue" width="150" height="150" /><noscript><img decoding="async" class="alignright wp-image-6 size-thumbnail" data-tf-not-load src="https://koivisto.me/wp-content/uploads/2015/02/escort-9500ix-blue-150x150.jpg" alt="Escort 9500ix blue" width="150" height="150" /></noscript>So I finally bought a radar/laser detector. I wanted to buy one after my first ticket but never got around to doing the research on which ones are actually effective. Well now I really wish I had since I&#8217;d probably had already saved it&#8217;s price and I would have avoided the trouble of fighting a ticket. A LIDAR detector doesn&#8217;t really help you beat a ticket if you were really speeding because it&#8217;s really fast and by the time your detector alerts you your speed was already clocked but what it does is to be more aware what speed you were going. The reason I&#8217;m fighting my last ticket is because I honestly thought I wasn&#8217;t speeding. Ever since I got my first ticket I&#8217;ve been paying attention to my speed and I use cruise control when ever possible. And when I was pulled over by CHP I was really surprised because I was certain I wasn&#8217;t going over the limit.</p>
<p>I think now a days most law enforcement uses laser radar or LIDAR or at least that&#8217;s what I&#8217;ve always been caught with. LIDAR uses light instead of microwaves or radio waves so it&#8217;s not really a radar in conventional sense.  LIDAR sends a laser beam to it&#8217;s target where it&#8217;s reflected back and then it uses time of flight principal to determine the speed. LIDAR allows speed enforcement in traffic also where as a regular radar can&#8217;t reliably measure your speed if there&#8217;s other cars around but they are still not infallible so getting pulled over by officer using one doesn&#8217;t mean you shouldn&#8217;t fight it. If the maintenance is neglected or the office using the LIDAR gun isn&#8217;t properly trained you might be able to show reasonable doubt for a judge to dismiss the case.</p>
<p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='150'%20height='150'%20viewBox=%270%200%20150%20150%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" decoding="async" class="tf_svg_lazy alignleft wp-image-5 size-thumbnail" data-tf-src="https://koivisto.me/wp-content/uploads/2015/02/laser-veil-150x150.jpg" alt="Laser veil" width="150" height="150" data-tf-srcset="https://mikakoivisto.fi/wp-content/uploads/2015/02/laser-veil-150x150.jpg 150w, https://mikakoivisto.fi/wp-content/uploads/2015/02/laser-veil.jpg 300w" data-tf-sizes="(max-width: 150px) 100vw, 150px" /><noscript><img decoding="async" class="alignleft wp-image-5 size-thumbnail" data-tf-not-load src="https://koivisto.me/wp-content/uploads/2015/02/laser-veil-150x150.jpg" alt="Laser veil" width="150" height="150" srcset="https://mikakoivisto.fi/wp-content/uploads/2015/02/laser-veil-150x150.jpg 150w, https://mikakoivisto.fi/wp-content/uploads/2015/02/laser-veil.jpg 300w" sizes="(max-width: 150px) 100vw, 150px" /></noscript>The <a href="http://www.amazon.com/dp/B001F0RPGG?_encoding=UTF8&amp;camp=15041&amp;creative=373501&amp;linkCode=as3&amp;tag=mskdesign-20" data-cke-saved-href="http://www.amazon.com/dp/B001F0RPGG?_encoding=UTF8&amp;camp=15041&amp;creative=373501&amp;linkCode=as3&amp;tag=mskdesign-20">Escort Passport 9500ix</a> is a top of the line detector that can detect not only all the conventional radars but also LIDAR. It also has a built-in GPS and it can warn you of any known speed traps, speed cameras and red light cameras. It will also announce your speed at every alert. One of the annoying things about radar detectors is all the false alerts. That&#8217;s where 9500ix shines as it can auto learn and eliminate them. False alerts are especially bad when driving in city. So now that I have a detector to alert me but like I said before it&#8217;s usually too late with LIDAR to slow down. There&#8217;s few solutions to that one is laser jammer but those are illegal in California so that&#8217;s out. The second solution is <a href="http://www.laserveil.com/" data-cke-saved-href="http://www.laserveil.com/">VEIL</a>. VEIL is a coating that you put in your primary targeting areas like head lamps and license plate. It makes it slightly more difficult for the LIDAR gun to get a reading giving you few extra seconds to react. VEIL is perfectly legal in California and in conjunction with a high end LIDAR detector it maximizes your changes of slowing down before the LIDAR gun gets a reading.</p>
<p>I&#8217;ve been now testing it for just over two weeks and pretty satisfied with it. It doesn&#8217;t give too many false alerts  and it learns false alerts after detecting the same signal at same location for 3 times and that has been working very well. I&#8217;ve gotten laser alert only 3 times once the cop was on the opposite side of the fwy, once on the airport and the last time I didn&#8217;t even see the cop at all. Each time it was very short alert so I really don&#8217;t know yet how effective VEIL is. The only huge annoyance is the red light camera alerts that I get on fwy even thought they are not even on my path but rather at some intersection close to the fwy. I&#8217;m sure I can turn it off completely since I&#8217;m not in the habit of running red lights and the cameras in Los Angeles are usually pretty visible. The alerts are really clear and I really like the fact that it almost instantly lowers the volume so that it doesn&#8217;t become irritating. This is so much better than the cheap detector I had when I was in college. It used to drive me nuts with the false alerts to the point that I kept ignoring it and when I got busted for speeding it was with LIDAR which the detector didn&#8217;t even support.</p>
<p>I scored both for under $500 with shipping with a coupon from <a href="http://www.radardetector.org/free-radar-detector-e-book/" data-cke-saved-href="http://www.radardetector.org/free-radar-detector-e-book/">Radar Detector Buyer&#8217;s Guide</a>. If this saves me from even one accidental speeding it&#8217;s paid itself off.</p>
<p>Here&#8217;s a video to show off how VEIL affects LIDAR guns ability to get your speed.</p>
<div class="post-video"><iframe loading="lazy" width="1165" height="655" src="https://www.youtube.com/embed/p_s3pA__1lI?feature=oembed" frameborder="0" gesture="media" allowfullscreen></iframe></div>
<p>The post <a href="https://mikakoivisto.fi/blog/2012/12/escort-passport-9500ix-radar-and-laser-detector/">Escort Passport 9500ix Radar and Laser Detector</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mikakoivisto.fi/blog/2012/12/escort-passport-9500ix-radar-and-laser-detector/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">43270</post-id>	</item>
		<item>
		<title>First impressions on Google Maps for iOS</title>
		<link>https://mikakoivisto.fi/blog/2012/12/first-impressions-on-google-maps-for-ios/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=first-impressions-on-google-maps-for-ios</link>
					<comments>https://mikakoivisto.fi/blog/2012/12/first-impressions-on-google-maps-for-ios/#respond</comments>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Wed, 12 Dec 2012 19:24:28 +0000</pubDate>
				<category><![CDATA[Reviews]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[ios]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[maps]]></category>
		<guid isPermaLink="false">https://koivisto.me/?p=10</guid>

					<description><![CDATA[<p>Google maps for iOS is finally available in Apple App Store. It has turn by turn navigation, live traffic information and public transit directions. The UI is very responsive and easy to use as always. I must say that I&#8217;m very impressed with it. The directions seem to account for current traffic conditions in calculating [&#8230;]</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2012/12/first-impressions-on-google-maps-for-ios/">First impressions on Google Maps for iOS</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='150'%20height='150'%20viewBox=%270%200%20150%20150%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" decoding="async" class="tf_svg_lazy alignleft wp-image-12 size-thumbnail" data-tf-src="https://koivisto.me/wp-content/uploads/2015/02/google-maps-icon-150x150.png" alt="google maps icon" width="150" height="150" /><noscript><img decoding="async" class="alignleft wp-image-12 size-thumbnail" data-tf-not-load src="https://koivisto.me/wp-content/uploads/2015/02/google-maps-icon-150x150.png" alt="google maps icon" width="150" height="150" /></noscript>Google maps for iOS is finally available in <a href="https://itunes.apple.com/us/app/google-maps/id585027354?mt=8" data-cke-saved-href="https://itunes.apple.com/us/app/google-maps/id585027354?mt=8">Apple App Store</a>. It has turn by turn navigation, live traffic information and public transit directions. The UI is very responsive and easy to use as always. I must say that I&#8217;m very impressed with it. The directions seem to account for current traffic conditions in calculating the route.</p>
<p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='592'%20height='592'%20viewBox=%270%200%20592%20592%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" decoding="async" class="tf_svg_lazy alignnone size-full wp-image-11" data-tf-src="https://koivisto.me/wp-content/uploads/2015/02/google-maps-for-ios-screenshot.jpg" alt="google maps for ios screenshot" width="592" height="500" /><noscript><img decoding="async" class="alignnone size-full wp-image-11" data-tf-not-load src="https://koivisto.me/wp-content/uploads/2015/02/google-maps-for-ios-screenshot.jpg" alt="google maps for ios screenshot" width="592" height="500" /></noscript></p>
<p>The post <a href="https://mikakoivisto.fi/blog/2012/12/first-impressions-on-google-maps-for-ios/">First impressions on Google Maps for iOS</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mikakoivisto.fi/blog/2012/12/first-impressions-on-google-maps-for-ios/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">10</post-id>	</item>
		<item>
		<title>iPhone Photography Accessories</title>
		<link>https://mikakoivisto.fi/blog/2012/11/iphone-photography-accessories/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=iphone-photography-accessories</link>
					<comments>https://mikakoivisto.fi/blog/2012/11/iphone-photography-accessories/#respond</comments>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Sun, 25 Nov 2012 20:20:59 +0000</pubDate>
				<category><![CDATA[Miscellaneous]]></category>
		<category><![CDATA[glif]]></category>
		<category><![CDATA[gorillapod]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[olloclip]]></category>
		<category><![CDATA[photography]]></category>
		<guid isPermaLink="false">https://koivisto.me/?p=15</guid>

					<description><![CDATA[<p>Smartphone cameras have come a long way and now with smartphones like iPhone 4S you can pretty much replace a regular compact camera with your smartphone. So far I&#8217;ve always had a compact camera like Samsung TL225 12.2Mpix camera but in the end I always end up using my iPhone for most photos since I [&#8230;]</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2012/11/iphone-photography-accessories/">iPhone Photography Accessories</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><a href="https://koivisto.me/wp-content/uploads/2015/02/iphone_olloclip_glif_gorillapod.jpg"><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='225'%20height='300'%20viewBox=%270%200%20225%20300%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" decoding="async" class="tf_svg_lazy alignright size-medium wp-image-16" data-tf-src="https://koivisto.me/wp-content/uploads/2015/02/iphone_olloclip_glif_gorillapod-225x300.jpg" alt="iphone olloclip glif gorillapod" width="225" height="300" /><noscript><img decoding="async" class="alignright size-medium wp-image-16" data-tf-not-load src="https://koivisto.me/wp-content/uploads/2015/02/iphone_olloclip_glif_gorillapod-225x300.jpg" alt="iphone olloclip glif gorillapod" width="225" height="300" /></noscript></a>Smartphone cameras have come a long way and now with smartphones like iPhone 4S you can pretty much replace a regular compact camera with your smartphone. So far I&#8217;ve always had a compact camera like Samsung TL225 12.2Mpix camera but in the end I always end up using my iPhone for most photos since I forget to take the other camera with me and I always have my iPhone. Now with iPhone 4S and 5 the came takes so good pictures in most conditions where I would use compact camera that I decided to completely replace it with my iPhone and I&#8217;ve since sold my compact camera. Since there isn&#8217;t any optical zoom on the iPhone and there really isn&#8217;t much adjustments you can do with the camera app so I&#8217;ve gotten some accessories to go with it.</p>
<h4>Olloclip</h4>
<p><a href="http://www.amazon.com/gp/product/B007WV5ORY/ref=as_li_qf_sp_asin_tl?ie=UTF8&amp;camp=1789&amp;creative=9325&amp;creativeASIN=B007WV5ORY&amp;linkCode=as2&amp;tag=mskdesign-20" data-cke-saved-href="http://www.amazon.com/gp/product/B007WV5ORY/ref=as_li_qf_sp_asin_tl?ie=UTF8&amp;camp=1789&amp;creative=9325&amp;creativeASIN=B007WV5ORY&amp;linkCode=as2&amp;tag=mskdesign-20">Olloclip</a> is a 3-in-1 lens add on to iPhone 4/4S and they have iPhone 5 model coming also. It&#8217;s high quality product and I really like the wide angle lens. With the wide angle lens you can get more in your picture. The other two lenses are macro and fisheye. With macro lens you can get amazingly close up. The lenses work with any camera app that uses the rear camera. You can&#8217;t use the lenses with the facetime camera. Also you can&#8217;t use any case when using the lens. The lens itself is very compact and lightweight and easily fits in your pocket. The lens retails at $70 but I got mine way cheaper from Ebay.</p>
<h4>Glif+</h4>
<p><a href="http://www.amazon.com/gp/product/B006W8Z4FK/ref=as_li_qf_sp_asin_tl?ie=UTF8&amp;camp=1789&amp;creative=9325&amp;creativeASIN=B006W8Z4FK&amp;linkCode=as2&amp;tag=mskdesign-20" data-cke-saved-href="http://www.amazon.com/gp/product/B006W8Z4FK/ref=as_li_qf_sp_asin_tl?ie=UTF8&amp;camp=1789&amp;creative=9325&amp;creativeASIN=B006W8Z4FK&amp;linkCode=as2&amp;tag=mskdesign-20">Glif+</a> is a iPhone tripod mount and stand all in one. It allows you to attach your iPhone securely into a tripod and it also has a D-ring or Ligature as they call it. With it you can attach Glif to a keychain so that it&#8217;s always with you or you can get creative where you hang your iphone. The only downside to Glif is that you can&#8217;t have any case with your phone. The Glif+ comes with Serif which provides extra support for your iphone so that it&#8217;s really securely attached to they mount and won&#8217;t fall of even if placed upside down. There&#8217;s some cheaper Chinese clones but I bought the real American made Glif from <a href="http://www.amazon.com/gp/product/B006W8Z4FK/ref=as_li_qf_sp_asin_tl?ie=UTF8&amp;camp=1789&amp;creative=9325&amp;creativeASIN=B006W8Z4FK&amp;linkCode=as2&amp;tag=mskdesign-20" data-cke-saved-href="http://www.amazon.com/gp/product/B006W8Z4FK/ref=as_li_qf_sp_asin_tl?ie=UTF8&amp;camp=1789&amp;creative=9325&amp;creativeASIN=B006W8Z4FK&amp;linkCode=as2&amp;tag=mskdesign-20">Amazon</a>.</p>
<h4>Joby GorillaPod</h4>
<p>I think everyone knows <a href="http://www.amazon.com/gp/product/B000EVSLRO/ref=as_li_qf_sp_asin_tl?ie=UTF8&amp;camp=1789&amp;creative=9325&amp;creativeASIN=B000EVSLRO&amp;linkCode=as2&amp;tag=mskdesign-20" data-cke-saved-href="http://www.amazon.com/gp/product/B000EVSLRO/ref=as_li_qf_sp_asin_tl?ie=UTF8&amp;camp=1789&amp;creative=9325&amp;creativeASIN=B000EVSLRO&amp;linkCode=as2&amp;tag=mskdesign-20">GorillaPod</a> it&#8217;s not really a iPhone accessory but it goes well with Glif so I thought I&#8217;d mention it.</p>
<h4>Camera+</h4>
<p>Camera+ isn&#8217;t really an accessory it&#8217;s a camera app that makes taking better photos easier. With it you can adjust where the focus is where the exposure is. I&#8217;m still learning to use the app but it&#8217;s much easier to get fairly well light picture with it. Camera+ also allows you to do some post processing to the photos.</p>
<p>I think it&#8217;s only right to end this post with a video I came across on tips on how to shoot amazing photos with iPhone. It&#8217;s from a pro photographer <a href="http://www.michaelthemaven.com/" data-cke-saved-href="http://www.michaelthemaven.com/">Michael Andrew</a>.</p>
<div class="post-video"><iframe loading="lazy" width="1165" height="874" src="https://www.youtube.com/embed/wV-p63Zz2Es?feature=oembed" frameborder="0" gesture="media" allowfullscreen></iframe></div>
<p>The post <a href="https://mikakoivisto.fi/blog/2012/11/iphone-photography-accessories/">iPhone Photography Accessories</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mikakoivisto.fi/blog/2012/11/iphone-photography-accessories/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">43271</post-id>	</item>
		<item>
		<title>Nokia’s HERE maps for iOS review</title>
		<link>https://mikakoivisto.fi/blog/2012/11/nokia-s-here-maps-for-ios-review/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=nokia-s-here-maps-for-ios-review</link>
					<comments>https://mikakoivisto.fi/blog/2012/11/nokia-s-here-maps-for-ios-review/#respond</comments>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Thu, 22 Nov 2012 15:43:58 +0000</pubDate>
				<category><![CDATA[Reviews]]></category>
		<category><![CDATA[here]]></category>
		<category><![CDATA[ios]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[maps]]></category>
		<category><![CDATA[nokia]]></category>
		<guid isPermaLink="false">https://koivisto.me/?p=18</guid>

					<description><![CDATA[<p>Nokia released it&#8217;s HERE maps for iOS recently so decided to give it go since it&#8217;s free. There&#8217;s not much good I can say about that application. The UI felt weird compared to Apple Maps or Google Maps. The map graphics are really ugly and the first route instructions I tried would have directed me [&#8230;]</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2012/11/nokia-s-here-maps-for-ios-review/">Nokia&#8217;s HERE maps for iOS review</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='150'%20height='150'%20viewBox=%270%200%20150%20150%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" decoding="async" class="tf_svg_lazy alignright size-thumbnail wp-image-20" data-tf-src="https://koivisto.me/wp-content/uploads/2015/02/Nokia_here_icon-150x150.png" alt="Nokia here icon" width="150" height="150" /><noscript><img decoding="async" class="alignright size-thumbnail wp-image-20" data-tf-not-load src="https://koivisto.me/wp-content/uploads/2015/02/Nokia_here_icon-150x150.png" alt="Nokia here icon" width="150" height="150" /></noscript>Nokia released it&#8217;s HERE maps for iOS recently so decided to give it go since it&#8217;s free. There&#8217;s not much good I can say about that application. The UI felt weird compared to Apple Maps or Google Maps. The map graphics are really ugly and the first route instructions I tried would have directed me close but still totally wrong place as the destination is not accessible from that street which is not even the street I used to look for the route. For voice instructions I had to wait it to load a audio file which I found weird. I didn&#8217;t try driving with the instructions and see if you could adapt to changes in route. To sign in it swiched to Safari to do it instead of doing it embedded in the app.</p>
<p>The over all experience was what I&#8217;m come to except from Nokia which was disappointing. I really hoped they had stepped up to deliver better quality and more intuitive products but I see that nothing has changed. I really can&#8217;t recommend this app to anyone.</p>
<p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='652'%20height='652'%20viewBox=%270%200%20652%20652%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" decoding="async" class="tf_svg_lazy alignnone size-full wp-image-19" data-tf-src="https://koivisto.me/wp-content/uploads/2015/02/nokia-maps-here-ios-screenshot.jpg" alt="nokia maps here ios screenshot" width="652" height="360" data-tf-srcset="https://mikakoivisto.fi/wp-content/uploads/2015/02/nokia-maps-here-ios-screenshot.jpg 652w, https://mikakoivisto.fi/wp-content/uploads/2015/02/nokia-maps-here-ios-screenshot-300x166.jpg 300w" data-tf-sizes="(max-width: 652px) 100vw, 652px" /><noscript><img decoding="async" class="alignnone size-full wp-image-19" data-tf-not-load src="https://koivisto.me/wp-content/uploads/2015/02/nokia-maps-here-ios-screenshot.jpg" alt="nokia maps here ios screenshot" width="652" height="360" srcset="https://mikakoivisto.fi/wp-content/uploads/2015/02/nokia-maps-here-ios-screenshot.jpg 652w, https://mikakoivisto.fi/wp-content/uploads/2015/02/nokia-maps-here-ios-screenshot-300x166.jpg 300w" sizes="(max-width: 652px) 100vw, 652px" /></noscript></p>
<p>The post <a href="https://mikakoivisto.fi/blog/2012/11/nokia-s-here-maps-for-ios-review/">Nokia&#8217;s HERE maps for iOS review</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mikakoivisto.fi/blog/2012/11/nokia-s-here-maps-for-ios-review/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">43272</post-id>	</item>
		<item>
		<title>Buying a gun as non resident alien in California</title>
		<link>https://mikakoivisto.fi/blog/2012/11/buying-a-gun-as-non-resident-alien-in-california/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=buying-a-gun-as-non-resident-alien-in-california</link>
					<comments>https://mikakoivisto.fi/blog/2012/11/buying-a-gun-as-non-resident-alien-in-california/#comments</comments>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Tue, 20 Nov 2012 16:40:02 +0000</pubDate>
				<category><![CDATA[Miscellaneous]]></category>
		<category><![CDATA[california]]></category>
		<category><![CDATA[gun]]></category>
		<category><![CDATA[license]]></category>
		<guid isPermaLink="false">https://koivisto.me/?p=22</guid>

					<description><![CDATA[<p>Most people would think that buying a gun is only limited to US citizens but many states that&#8217;s not the case. Non citizens have more requirements than citizens but it&#8217;s still possible to buy a gun legally in California even for us non resident aliens. It&#8217;s going to be harder to find a dealer that [&#8230;]</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2012/11/buying-a-gun-as-non-resident-alien-in-california/">Buying a gun as non resident alien in California</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Most people would think that buying a gun is only limited to US citizens but many states that&#8217;s not the case. Non citizens have more requirements than citizens but it&#8217;s still possible to buy a gun legally in California even for us non resident aliens. It&#8217;s going to be harder to find a dealer that knows exactly what is required from a non resident alien so to save you from the trouble I&#8217;ve faced I though I&#8217;d share what I&#8217;ve learned in the past year from my own experience of buying a gun.</p>
<p>The first thing is to know if you are a non resident alien. That&#8217;s pretty simple really if you don&#8217;t have a green card and you are here with a long term (more than 3 months) visa then you are a non resident alien. You could have a H1 visa for work or you could be a student with F1 visa. If you have a green card then you are treated pretty much the same as citizens.</p>
<p>The second thing you need to know is what type of gun you are buying, whether it&#8217;s going to be a long gun such as rifle or shotgun or a handgun. Handgun has some additional requirements not just non resident aliens but citizens as well. Generally to buy any gun as a non resident alien you&#8217;ll need to get a hunter&#8217;s safety certificate which you can get by taking a hunter&#8217;s safety class and passing the exam. This allows you to buy a hunting license which is a requirement for non resident aliens even if you are not going to hunt. Just buy the license without any tags and you&#8217;re good to go. Then you need a California Driver&#8217;s license or ID. That&#8217;s to provide proof that you are California resident. They&#8217;ll also need to take a copy of your visa and I-94. Your alian registration number is your I-94 number. Then the last common requirement is that you&#8217;ve had to been in the country continuously for 90 days from the beginning of D.R.O.S. and you can&#8217;t leave the country even for a quick visit until you&#8217;ve taken posession of your gun.</p>
<p>Summary for long gun (rifle or shotgun) requirements:</p>
<ul>
<li>Hunting license</li>
<li>California DL or ID</li>
<li>Copy of Visa and I-94</li>
<li>Must have been in country continuously last 90 days</li>
</ul>
<p>Now if you are buying a handgun then you need to complete Handgun Safety Certification in addition to the requiremetns for long gun. That is pretty simple if you have any common sense and have handled firearms before. You just read a booklet and take the test at any firearms dealer. Now if you haven&#8217;t handled a handgun before you should take a class on it or at least go to shooting range that allows you to rent a gun and try out different handguns to find what you like. Remember that many shooting ranges won&#8217;t allow you to rent a gun by yourself especially if you haven&#8217;t handled one before. The Target Range in Van Nuys is a really friendly place and they have good selection of standard and premium handguns. They also provide training and will let you rent by yourself if you&#8217;ve shot before. When buying a handgun you&#8217;ll also need additional proof of residency and for that you can use utility bill from past 3 months or a apartment lease agreement. They will also accept DMV car registration but they won&#8217;t accept bank statements.</p>
<p>Summary of handgun requirements:</p>
<ul>
<li>Hunting license</li>
<li>California DL or ID</li>
<li>Copy of Visa and I-94</li>
<li>Handgun Safety Certificate</li>
<li>Additional proof of residency such as utility bill or car registration</li>
<li>Must have been in country continuously last 90 days</li>
</ul>
<p>I&#8217;ve verified all of these requirements directly from<a href="http://oag.ca.gov/firearms" data-cke-saved-href="http://oag.ca.gov/firearms"> California Department of Justice Bureau of Firearms</a> but laws change and some requirements even changed this year so recheck them when you are thinking of buying a gun. If you are not in California make sure it&#8217;s even legal for you to poses firearms in your state.</p>
<p><strong>Remember that firearm safety starts with you. Shooting is a fun hobby if you treat guns with respect and handle them safely. </strong></p>
<p>The post <a href="https://mikakoivisto.fi/blog/2012/11/buying-a-gun-as-non-resident-alien-in-california/">Buying a gun as non resident alien in California</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mikakoivisto.fi/blog/2012/11/buying-a-gun-as-non-resident-alien-in-california/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">43273</post-id>	</item>
		<item>
		<title>The Diamond Resorts International Timeshare Scam</title>
		<link>https://mikakoivisto.fi/blog/2012/11/the-diamond-resorts-international-timeshare-scam/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=the-diamond-resorts-international-timeshare-scam</link>
					<comments>https://mikakoivisto.fi/blog/2012/11/the-diamond-resorts-international-timeshare-scam/#comments</comments>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Sun, 18 Nov 2012 08:43:51 +0000</pubDate>
				<category><![CDATA[Miscellaneous]]></category>
		<category><![CDATA[resort]]></category>
		<category><![CDATA[scam]]></category>
		<category><![CDATA[timeshare]]></category>
		<category><![CDATA[vacation]]></category>
		<guid isPermaLink="false">https://koivisto.me/?p=24</guid>

					<description><![CDATA[<p>A few months ago I signed up for a sweepstakes to win $100.000 or dream car at Camarillo Premium outlets. Then just this week I got a call from Diamond Resorts International that I was selected as the few finalists. They explained that even if I didn&#8217;t win the main price I would get a [&#8230;]</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2012/11/the-diamond-resorts-international-timeshare-scam/">The Diamond Resorts International Timeshare Scam</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>A few months ago I signed up for a sweepstakes to win $100.000 or dream car at Camarillo Premium outlets. Then just this week I got a call from Diamond Resorts International that I was selected as the few finalists. They explained that even if I didn&#8217;t win the main price I would get a free trip and I was also promised a bonus gift of 2 nights accommodations if I came to their showroom in Encino California to listen a 90 minute presentation of their timeshare offering. I also needed to bring my wife and two forms of identification and a credit card but I was under no obligation to buy anything.</p>
<p>At this point my scam alarm went off as I&#8217;ve heard about all these timeshare scams. Still I was interested to see it in action and see if I could actually get anything they promised to me so I agreed to go there with my wife to whom I explained that this is probably a scam but let&#8217;s see if we can actually get something out of it. I got my invitation which also had a one full letter size page full of small print with the terms and conditions. I actually read it and surprise surprise there was a lot of restrictions like they had to be used off season and a minimum 30 to 90 days prior had to be booked.</p>
<p>Before going there I did little bit of internet research on their timeshare and found out that there&#8217;s ridiculous maintenance fees and it&#8217;s nearly impossible to get the kind of vacations they promise. Armed with this information we arrived to their showroom to play the part of easily manipulated and unsuspecting mark. We registered at the front desk and waited for our agent.</p>
<p>Our agent Shannon started by explaining how the thing works that she would do a presentation of their offering and after that we could get our gifts. She also told us that they could give us a deal today and only today because they were &#8220;bribing&#8221; us to come there they were limited by law to get our business only today. After today we could get the same deal as anyone else and none of the perks. First we talked about our vacation habits and destinations we were interested in. She made it sound like they were taking a survey to learn more about their potential customers.</p>
<p>Then she gradually started showing how their system differs from a traditional timeshare how they had this point system and how those points could be redeemed for free nights at any of their resorts or steeply discounted rates at any Interval International resorts world wide. She painted a picture how we could stay in a penthouse suite and have private chefs cook for us. It all seemed so good a little too good to be true. We watched a video where paid actors eh members told how they love it. We saw some models of their resorts and pictures and floor plans. She appeal to the emotional side how it was good for our health and relationship etc.</p>
<p>For the rational side she played with the numbers she got from us as how much we spend yearly on travel and how much it would accumulate in 30 years and then some weird math how inflation would triple that number. Now that we were in the ballpark what their 15 000 point silver plan would cost at $6 per point. Next up was April who I suppose was supposed to close me with numbers. She told me that just today they have a deal where I don&#8217;t have to buy the full 15k points but I could start at lower number like 6k or 4k points. The 4k points was around $15k dollars to own. Also they would offer financing where I only pay a downpayment of $2500 and for the 4k it would be $250 per month. So wouldn&#8217;t it make sense to payoff something I own since I&#8217;d be spending that money anyways on vacation.</p>
<p>Of course she didn&#8217;t tell me until I asked that that $250 per month is a 10 yr loan with 16.99% interest. Now let&#8217;s calculate how much that will actually cost me. 120 x $250 + $2500 = $32500. That is over double the slightly less than $15k. Of course I could pay it off at any point.</p>
<p>I was hesitant with $250 dollars a month so she offered me a even lower option with 2k points at $150 per month. At that point she realized it wasn&#8217;t about the money. Because I was constantly saying I&#8217;d need to sleep on it and look at the papers. At that point she got a bit hostile saying that their boss Stephen J. Cloobeck the CEO of Diamond Resorts International had been in the Undercover boss and how Guggenheim had invested $1B dollars on them. Surely their lawyers would do better research that I would. I&#8217;m sure they would but I&#8217;m sure they didn&#8217;t buy points. I even asked if I could get papers on the anytime deal but they couldn&#8217;t even give those out since I could from their competition.</p>
<p>She got frustrated with me and gave up. Now here comes the manager to do quality assurance. I can&#8217;t remember his name but he was Armenian. He was very understanding to us that we don&#8217;t do impulse buys. Also at this point the maintenance fees finally come up. If I&#8217;m not mistaken it was around $2600 per year for the 15k points and at 4k points it was around $900. So let&#8217;s do a quick recalculation on the 4k points: 12 x $250 + $900 = $3900 per year.</p>
<p>He wasn&#8217;t done yet he had one more offer a 15k points trial for 18 months which would cost around $2800 or $166 per month for 16 months plus a $399 downpayment. This offer was limited to 16 of their best resorts. This was also the first time could see what the points actually get us. One example in driving distance from home was their Lake Tahoe resort. At the peak season you&#8217;d need 10k points for one week stay in one bedroom room. The 2k points wouldn&#8217;t have gotten us even a 4 day stay during low season.</p>
<p>After a while he realized that he wasn&#8217;t able to convert me either and thanked us for our time and directed us to our prize drawing. We got two gift cards that had to redeemed through Odenza Marketing Group. Redeeming them requires a $50 reservation deposit as bank draft or cashiers check on each. I will write about the later on how the process goes.</p>
<p>I went there thinking this is some kind of scam and surely enough that&#8217;s exactly what it is. When ever something sounds too good to be true it usually is. Especially when you have to make a decision right there and then without having possibility to review all the material and then ask the questions on anything that bothers you. The whole situation was very pressuring for me to sign up and it was like they were doing me a favor by inviting me to this opportunity.</p>
<p>I&#8217;m sure this works for those that can buy the minimum 15k points right there and then without financing and if you don&#8217;t care about paying the high maintenance fees. They prey on gullible people and this country has a lot of them and non existing customer protection. Even after several requests I couldn&#8217;t get any papers to take with me even on the anytime offer I&#8217;m able to participate at any time. I&#8217;m sure they&#8217;ve covered their ass with a ton of fine print that you can&#8217;t take home to review or to show a lawyer. The gifts also smell like scam but I&#8217;m going to find that out myself and report on it later.</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2012/11/the-diamond-resorts-international-timeshare-scam/">The Diamond Resorts International Timeshare Scam</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mikakoivisto.fi/blog/2012/11/the-diamond-resorts-international-timeshare-scam/feed/</wfw:commentRss>
			<slash:comments>12</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">43274</post-id>	</item>
		<item>
		<title>I love my AMEX</title>
		<link>https://mikakoivisto.fi/blog/2012/11/i-love-my-amex/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=i-love-my-amex</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Fri, 16 Nov 2012 17:24:41 +0000</pubDate>
				<category><![CDATA[Finance]]></category>
		<guid isPermaLink="false">http://mymoneymatters.co/?p=22</guid>

					<description><![CDATA[<p>Ever since I got my Costco TrueEarnings American Express my credit worthiness has climed up. What&#8217;s best with this card is all the perks and cash back. I already had costco membership so my AMEX doesn&#8217;t cost me anything extra on the contrary it pays for my costco membership and I get discounts and a [&#8230;]</p>
<p>The post <a rel="nofollow" href="http://mymoneymatters.co/i-love-my-amex.html">I love my AMEX</a> appeared first on <a rel="nofollow" href="http://mymoneymatters.co/">My Money Matters</a>.</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2012/11/i-love-my-amex/">I love my AMEX</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Ever since I got my Costco TrueEarnings American Express my credit worthiness has climed up. What’s best with this card is all the perks and cash back. I already had costco membership so my AMEX doesn’t cost me anything extra on the contrary it pays for my costco membership and I get discounts and a nice cash back bonus in February.</p>
<p>I’ve paired my card with my Facebook and Foursquare accounts so I get all sorts of deals on restaurants and other activities that I would already doing. When ever I go anywhere to eat I checkin in Foursqare and my times get $10 to $25 refunded to my account when I pay with my AMEX. I also check Facebook for any interesting deals and load them to my card just incase I happen to use them. That’s a nice added bonus to the cash back I get on all my purchases and I pay everything with my AMEX card. I don’t do that just for the cash back but also for the extended warranty and purchase protection I get on things I buy. You also get travel accident insurance, car rental loss and damage insurance just to name few things.</p>
<p>Amex also differs to other credit cards that you are a member and not just a customer. If you ever have to dispute a charge they are on your side and not the merchants side. There’s a lot of horror stories where you get charged a recurring fee and there’s no way for you to get rid of. Some banks like Chase will go to the extreme of allowing the merchant to charge you even after you close the credit card. Check out Michael Arringtons post: <a href="http://uncrunched.com/2012/08/26/my-undead-credit-card/" data-cke-saved-href="http://uncrunched.com/2012/08/26/my-undead-credit-card/">My Evil Undead Credit Card</a>.</p>
<p>Amex also allows you to increase your credit limit once every 6 months and it’s totally automated system. Just call the customer service number and select you want to increase your credit. I’ve been able to double it every time so now I have a credit limit that finally is starting to fit my income and monthly spending. To compare my Capital One card is still after 2 years stuck at $400 and they denied my last credit limit increase even though I have six figures yearly salary and credit score 730+. I would close that card if it didn’t hurt my credit score but since it’s my oldest card I can’t do it.</p>
<p>My only negative thing to say about this card is the foreign transaction fees. Without those this card would definately get A+ rating now it’s just A-. For foreign transactions which I do have some monthly recurring charges I use my Charles Schwab Debit card.</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2012/11/i-love-my-amex/">I love my AMEX</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">43202</post-id>	</item>
		<item>
		<title>TriggerTrap Mobile</title>
		<link>https://mikakoivisto.fi/blog/2012/11/triggertrap-mobile/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=triggertrap-mobile</link>
					<comments>https://mikakoivisto.fi/blog/2012/11/triggertrap-mobile/#respond</comments>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Wed, 07 Nov 2012 16:12:41 +0000</pubDate>
				<category><![CDATA[Reviews]]></category>
		<category><![CDATA[photography]]></category>
		<category><![CDATA[timelapse]]></category>
		<category><![CDATA[triggertrap]]></category>
		<guid isPermaLink="false">https://koivisto.me/?p=26</guid>

					<description><![CDATA[<p>I got a TriggerTrap Mobile for me and my wife some time ago from Jan at TriggerTrap and this review has been pending ever since. We were going to do a field test and see how TriggerTrap mobile stacks up against Trigger Happy. That how ever got didn&#8217;t happen because weather was against us on [&#8230;]</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2012/11/triggertrap-mobile/">TriggerTrap Mobile</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>I got a TriggerTrap Mobile for me and my wife some time ago from Jan at <a href="http://triggertrap.com" data-cke-saved-href="http://triggertrap.com">TriggerTrap</a> and this review has been pending ever since. We were going to do a field test and see how TriggerTrap mobile stacks up against Trigger Happy. That how ever got didn&#8217;t happen because weather was against us on our camping trip to Big Sur and we also had technical difficulties because of iOS 6 with both devices. So instead of doing a indepth review I&#8217;m going to write my initial thoughts on this product.</p>
<p>TriggerTrap Mobile consists of the dongle, camera spefic cable and the app. There&#8217;s two versions of the app: free and paid. I&#8217;ve tried them both. The paid version has much more functions than the free version. You can use the app also with iPhones built-in camera but pointing it is little hard because the app doesn&#8217;t show a preview like the regular camera app and there&#8217;s of course no view finder in iPhone. My only gripe about the app really is that it&#8217;s really hard to make out anything in bright daylight and some of the adjustments are too sensitive and hard to get the exact number you want.</p>
<p>I personally like this product more than Trigger Happy Remote. It&#8217;s more polished product and there&#8217;s much more documentation on triggertrap website. Also if you ever switch cameras or have multiple cameras you only need to get a new camera cable and can use the same dongle. Another great thing is that you can order your dongle and cable from <a href="http://www.amazon.com/gp/browse.html?ie=UTF8&amp;marketplaceID=ATVPDKIKX0DER&amp;me=A27DIUPFY5T7BD&amp;linkCode=as2&amp;tag=mskdesign-20" data-cke-saved-href="http://www.amazon.com/gp/browse.html?ie=UTF8&amp;marketplaceID=ATVPDKIKX0DER&amp;me=A27DIUPFY5T7BD&amp;linkCode=as2&amp;tag=mskdesign-20">Amazon</a>. Lastly big thanks to TriggerTrap for providing us review copies. We are going to continue to play with them as time allows. Check out also my wife&#8217;s blog <a href="http://greatuseofpixels.com" data-cke-saved-href="http://greatuseofpixels.com">Great use of Pixels</a>.</p>
<div class="post-video"><iframe loading="lazy" src="https://player.vimeo.com/video/40453214" width="1165" height="655" frameborder="0" title="Introducing Triggertrap Mobile" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe></div>
<p><a href="http://vimeo.com/40453214" data-cke-saved-href="http://vimeo.com/40453214">Introducing Triggertrap Mobile</a> from <a href="http://vimeo.com/triggertrap" data-cke-saved-href="http://vimeo.com/triggertrap">Triggertrap</a> on <a href="http://vimeo.com" data-cke-saved-href="http://vimeo.com">Vimeo</a></p>
<p>The post <a href="https://mikakoivisto.fi/blog/2012/11/triggertrap-mobile/">TriggerTrap Mobile</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mikakoivisto.fi/blog/2012/11/triggertrap-mobile/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">43275</post-id>	</item>
		<item>
		<title>Using your credit card actively without the negative impact on your creditscore</title>
		<link>https://mikakoivisto.fi/blog/2012/09/using-your-credit-card-actively-without-the-negative-impact-on-your-creditscore/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=using-your-credit-card-actively-without-the-negative-impact-on-your-creditscore</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Sat, 08 Sep 2012 09:08:05 +0000</pubDate>
				<category><![CDATA[Finance]]></category>
		<guid isPermaLink="false">http://mymoneymatters.co/?p=20</guid>

					<description><![CDATA[<p>When you have a rewards credit card you want to maximize those rewards and only way to do that is to use your credit card to pay for everything possible that will yield rewards. For my American Express that I get at least 1% on all payments including my phone bill and internet so I [&#8230;]</p>
<p>The post <a rel="nofollow" href="http://mymoneymatters.co/using-your-credit-card-actively-without-the-negative-impact-on-your-creditscore.html">Using your credit card actively without the negative impact on your creditscore</a> appeared first on <a rel="nofollow" href="http://mymoneymatters.co/">My Money Matters</a>.</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2012/09/using-your-credit-card-actively-without-the-negative-impact-on-your-creditscore/">Using your credit card actively without the negative impact on your creditscore</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>When you have a rewards credit card you want to maximize those rewards and only way to do that is to use your credit card to pay for everything possible that will yield rewards. For my American Express that I get at least 1% on all payments including my phone bill and internet so I use it to pay everything. The problem is that my monthly spending exceeds my credit limit and you are only supposed to use up 30% of your limit anyways so what to do?</p>
<p>Well what I do is I pay off my balance few times a month or right after a large purchase. I always reduce or even pay off completely my balance before my billing perion ends that way American Express only reports a small balance or no balance to the credit bureaus. That has also improved my ability to increase my credit limit. I’ve already dobled my credit limit to $4000 and I expect to increase it by another $2000 shortly. That would mean that I’ve tripled my available credit in less than 12 months.</p>
<p>Before you do this make sure your credit card company allows you to pay off your balance in advance. I’ve notice that Capital One doesn’t let you make advance payments. That’s why I only have one small recurring payment going on my Capital One secured credit card in hopes that some day they will increase my pathetic $400 credit limit to something more reasonable or at least convert it to a non secured one.</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2012/09/using-your-credit-card-actively-without-the-negative-impact-on-your-creditscore/">Using your credit card actively without the negative impact on your creditscore</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">43204</post-id>	</item>
		<item>
		<title>Installing MariaDB on Ubuntu</title>
		<link>https://mikakoivisto.fi/blog/2012/08/installing-mariadb-on-ubuntu/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=installing-mariadb-on-ubuntu</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Sun, 19 Aug 2012 08:33:56 +0000</pubDate>
				<category><![CDATA[Software & DevOps]]></category>
		<guid isPermaLink="false">http://javaguru.fi/?p=11</guid>

					<description><![CDATA[<p>I&#8217;ve been using MariaDB for some time now and it&#8217;s perfect replacement for MySQL especially with the latest news onOracle&#8217;s move to hinder MySQL developer community despite it&#8217;s promise to EU. Now is a perfect time to ditch MySQL and move to something that&#8217;s backed by the original authors of MySQL and that something is [&#8230;]</p>
<p>The post <a rel="nofollow" href="http://javaguru.fi/installing-mariadb-on-ubuntu.html">Installing MariaDB on Ubuntu</a> appeared first on <a rel="nofollow" href="http://javaguru.fi/">Javaguru</a>.</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2012/08/installing-mariadb-on-ubuntu/">Installing MariaDB on Ubuntu</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>I&#8217;ve been using MariaDB for some time now and it&#8217;s perfect replacement for MySQL especially with the latest news on<a href="http://techcrunch.com/2012/08/18/oracle-makes-more-moves-to-kill-open-source-mysql">Oracle&#8217;s move to hinder MySQL developer community</a> despite it&#8217;s promise to EU. Now is a perfect time to ditch MySQL and move to something that&#8217;s backed by the original authors of MySQL and that something is MariaDB.</p>
<p>1. First pick your Ubuntu version repository mirror close to you from <a href="http://downloads.mariadb.org/mariadb/repositories/">MariaDB downloads page</a>. Once you&#8217;ve picked up your mirror then add them to /etc/apt/source.list.d/mariadb.list. I&#8217;m still running 10.04 so here&#8217;s what I put in my mariadb.list:</p>
<pre><code class="code-snippet"># MariaDB repository list - created 2012-07-04 18:04 UTC
# http://downloads.mariadb.org/mariadb/repositories/
deb http://ftp.heanet.ie/mirrors/mariadb/repo/5.5/ubuntu lucid main
deb-src http://ftp.heanet.ie/mirrors/mariadb/repo/5.5/ubuntu lucid main</code></pre>
<p>2. Next you&#8217;ll need to import the signing key</p>
<pre><code class="code-snippet">sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xcbcb082a1bb943db</code></pre>
<p>3. Update</p>
<pre><code class="code-snippet">aptitude update</code></pre>
<p>4. Install</p>
<pre><code class="code-snippet">aptitude install mariadb-server-5.5</code></pre>
<p>Now you have MariaDB 5.5 installed and you can configure it exactly like you would configure MySQL.</p>
<p>The post <a rel="nofollow" href="http://javaguru.fi/installing-mariadb-on-ubuntu.html">Installing MariaDB on Ubuntu</a> appeared first on <a rel="nofollow" href="http://javaguru.fi/">Javaguru</a>.</p>
<!--themify_builder_content-->
<div id="themify_builder_content-148" data-postid="148" class="themify_builder_content themify_builder_content-148 themify_builder tf_clear">
    </div>
<!--/themify_builder_content-->
<p>The post <a href="https://mikakoivisto.fi/blog/2012/08/installing-mariadb-on-ubuntu/">Installing MariaDB on Ubuntu</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">148</post-id>	</item>
		<item>
		<title>How can I get credit?</title>
		<link>https://mikakoivisto.fi/blog/2012/08/how-can-i-get-credit/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=how-can-i-get-credit</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Sat, 18 Aug 2012 07:52:16 +0000</pubDate>
				<category><![CDATA[Finance]]></category>
		<guid isPermaLink="false">http://mymoneymatters.co/?p=16</guid>

					<description><![CDATA[<p>Getting credit in US might be difficult if you don&#8217;t already have credit. Even if you don&#8217;t want to get credit card it&#8217;s going to be expensive to not have any credit. There&#8217;s few things you need to start building your credit: Social Security number Bank account Credit card or a loan A lot of [&#8230;]</p>
<p>The post <a rel="nofollow" href="http://mymoneymatters.co/how-can-i-get-credit.html">How can I get credit?</a> appeared first on <a rel="nofollow" href="http://mymoneymatters.co/">My Money Matters</a>.</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2012/08/how-can-i-get-credit/">How can I get credit?</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Getting credit in US might be difficult if you don’t already have credit. Even if you don’t want to get credit card it’s going to be expensive to not have any credit. There’s few things you need to start building your credit:</p>
<ul>
<li>Social Security number</li>
<li>Bank account</li>
<li>Credit card or a loan</li>
<li>A lot of patience</li>
</ul>
<h4><strong>Social Security Number</strong></h4>
<p>This is how credit bureaus aggregate your information. Without social security number you can’t build credit history so getting it is essental. Even if you are a student with F-1 visa you can get a SSN. All you have to do is find a job on campus and that way you have a reason to apply for a social security number. It’s going to be a limited one that states that you can only work with DHS authorization but that is enough to be able to start building credit.</p>
<h4>Bank account</h4>
<p>You are going to need a bank account to be able to pay for your credit card bill. I would recommend getting a no fee, no minimum balance one from Bank of America. Do all your banking online or at the ATM and you’ll save a lot in fees.</p>
<h4>Credit card</h4>
<p>If you’ve gotten a Bank of America checking and savings account I would also try to apply a cash back credit card from them. If you have any income you might get one with low credit limit but that’s a good start. If they turn you down then you need to go and apply for a secured credit card. Bank of America has a secured credit card and Capital One is nother one you can try. For a secured credit card you’ll need to fork some cash that will be your credit limit. I personally started with $300 and Capital One quickly raised it to $400 without any additional deposit. My sister was able to get a credit card from BoA even though she only had a job out of the country. So it’s always worth to try but remember each application results in a hard query in your credit history and it will take 2 years before it drops from there so have patience.</p>
<h4>Patience</h4>
<p>There’s no quick short cut to building credit. You need to have a lot of patience as every time you get new credit your credit score will dip temporarily. It usually takes around 6 months before it bounces back to the level it was especially when you have short history. Once you have a credit card you need to use it but remember your statement balance can never go over 30% of your credit limit and you must pay it in full every month.</p>
<p>Check out my story how I have <a href="https://mikakoivisto.fi/blog/2012/03/establishing-credit-history/" data-cke-saved-href="http://mymoneymatters.co/blog/-/blogs/establishing-credit-history">established good credit</a>.</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2012/08/how-can-i-get-credit/">How can I get credit?</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">43206</post-id>	</item>
		<item>
		<title>Liferay 6.1 GA2 Maven release</title>
		<link>https://mikakoivisto.fi/blog/2012/08/liferay-6-1-ga2-maven-release/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=liferay-6-1-ga2-maven-release</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Wed, 08 Aug 2012 19:38:08 +0000</pubDate>
				<category><![CDATA[Software & DevOps]]></category>
		<guid isPermaLink="false">https://web.liferay.com/web/mika.koivisto/blog/-/blogs/liferay-6-1-ga2-maven-release</guid>

					<description><![CDATA[<p>I'm glad to announce that we have release maven artifacts for Liferay 6.1 GA2 for both EE and CE. The CE version of portal artficats are in currently in Sonatype's repository waiting to be synced to Central and EE artifacts are available for download...</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2012/08/liferay-6-1-ga2-maven-release/">Liferay 6.1 GA2 Maven release</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>I&#8217;m glad to announce that we have release maven artifacts for Liferay 6.1 GA2 for both EE and CE. The CE version of portal artficats are in currently in Sonatype&#8217;s repository waiting to be synced to Central and EE artifacts are available for download in customer portal like before. We&#8217;ve also released the Liferay Maven Support project that is the plugins sdk equivalent for Maven.  Both CE and EE compatible versions are being synced to Central. Please remember that this is not supported through your portal support contract. If you find any bugs in the Maven plugin or archetypes please file them to the <a href="http://issues.liferay.com/browse/MAVEN">MAVEN Jira project</a>. The CE GA2 version number is 6.1.1 and EE GA2 version number is 6.1.20. Remember to use a version corresponding to your running portal version as mixing versions might cause problems.<span id="more-268"></span></p>
<p>We&#8217;ve also added some new features and improvements.</p>
<h4>New features</h4>
<ul>
<li>DBBuilder &#8211; build-db goal allows you to execute the DBBuilder to generate SQL files</li>
<li>SassToCSSBuilder &#8211; build-css goal precompiles SASS in your css and this goal has been added to theme archetype</li>
<li>JSF Portlet Archetype</li>
<li>ICEFaces Portlet Archetype</li>
<li>PrimeFaces Portlet Archetype</li>
<li>Liferay Faces Alloy Portlet Archetype</li>
</ul>
<h4>Improvements</h4>
<ul>
<li>Allow setting service build number and turn off auto increment for ServiceBuilder.</li>
<li>Allow build-service and direct-deploy from the parent project for Service builder and Ext projects.</li>
</ul>
<p>&nbsp;</p>
<p>This post was originally published on <a href="https://web.liferay.com/web/mika.koivisto/blog/-/blogs/liferay-6-1-ga2-maven-release3">Liferay blog</a>.</p>
<div id="themify_builder_content-268" data-postid="268" class="themify_builder_content themify_builder_content-268 themify_builder themify_builder_front"></div>
<p><!-- /themify_builder_content --></p>
<p>The post <a href="https://mikakoivisto.fi/blog/2012/08/liferay-6-1-ga2-maven-release/">Liferay 6.1 GA2 Maven release</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">43256</post-id>	</item>
		<item>
		<title>Bose MIE2i mobile headset</title>
		<link>https://mikakoivisto.fi/blog/2012/08/bose-mie2i-mobile-headset/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=bose-mie2i-mobile-headset</link>
					<comments>https://mikakoivisto.fi/blog/2012/08/bose-mie2i-mobile-headset/#respond</comments>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Tue, 07 Aug 2012 05:10:13 +0000</pubDate>
				<category><![CDATA[Reviews]]></category>
		<category><![CDATA[bose]]></category>
		<category><![CDATA[headphone]]></category>
		<category><![CDATA[mie2i]]></category>
		<guid isPermaLink="false">https://koivisto.me/?p=28</guid>

					<description><![CDATA[<p>Had some frequent flier miles expiring and I am anyways stopping using Lufthansa completely but more on that on a later post so I spent my miles on something less exiting (Cusinart cookware) but my wife in turn spent her points to get me a Bose MIE2i mobile headset. I just love my Bose QC [&#8230;]</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2012/08/bose-mie2i-mobile-headset/">Bose MIE2i mobile headset</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><a href="https://koivisto.me/wp-content/uploads/2015/02/bose_mi2i_package.jpg"><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='235'%20height='300'%20viewBox=%270%200%20235%20300%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" decoding="async" class="tf_svg_lazy alignright wp-image-30 size-medium" data-tf-src="https://koivisto.me/wp-content/uploads/2015/02/bose_mi2i_package-235x300.jpg" alt="bose mi2i package" width="235" height="300" data-tf-srcset="https://mikakoivisto.fi/wp-content/uploads/2015/02/bose_mi2i_package-235x300.jpg 235w, https://mikakoivisto.fi/wp-content/uploads/2015/02/bose_mi2i_package-768x979.jpg 768w, https://mikakoivisto.fi/wp-content/uploads/2015/02/bose_mi2i_package.jpg 803w" data-tf-sizes="(max-width: 235px) 100vw, 235px" /><noscript><img decoding="async" class="alignright wp-image-30 size-medium" data-tf-not-load src="https://koivisto.me/wp-content/uploads/2015/02/bose_mi2i_package-235x300.jpg" alt="bose mi2i package" width="235" height="300" srcset="https://mikakoivisto.fi/wp-content/uploads/2015/02/bose_mi2i_package-235x300.jpg 235w, https://mikakoivisto.fi/wp-content/uploads/2015/02/bose_mi2i_package-768x979.jpg 768w, https://mikakoivisto.fi/wp-content/uploads/2015/02/bose_mi2i_package.jpg 803w" sizes="(max-width: 235px) 100vw, 235px" /></noscript></a>Had some frequent flier miles expiring and I am anyways stopping using Lufthansa completely but more on that on a later post so I spent my miles on something less exiting (Cusinart cookware) but my wife in turn spent her points to get me a <a href="http://www.amazon.com/gp/product/B0043WCH66/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;camp=1789&amp;creative=9325&amp;creativeASIN=B0043WCH66&amp;linkCode=as2&amp;tag=mskdesign-20" data-cke-saved-href="http://www.amazon.com/gp/product/B0043WCH66/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;camp=1789&amp;creative=9325&amp;creativeASIN=B0043WCH66&amp;linkCode=as2&amp;tag=mskdesign-20">Bose MIE2i mobile headset</a>.</p>
<p>I just love my <a href="http://www.amazon.com/gp/product/B0054JJ0QW/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;camp=1789&amp;creative=9325&amp;creativeASIN=B0054JJ0QW&amp;linkCode=as2&amp;tag=mskdesign-20" data-cke-saved-href="http://www.amazon.com/gp/product/B0054JJ0QW/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;camp=1789&amp;creative=9325&amp;creativeASIN=B0054JJ0QW&amp;linkCode=as2&amp;tag=mskdesign-20">Bose QC 15 noise cancelling headphones</a> so I was already pretty sure that these are going to be great.  The problem with regular Apple headphones is that they are pretty unconfortable and during any activity they often pop out of my ear. I have both the standard ones that came with my iPhone and the more expensive in-ear ones.</p>
<p>These Bose headphones fit very nicely in my ear and with the silicone tips they actually stay in my ear very confortably. It comes with three different sizes of those tips so they fit in anyones ear. The package also comes with a protective carrying case for the headphones just like my QC15 did. It&#8217;s pretty clear why Bose headphones are so expensive. They&#8217;ve thought of everything and everything is really high quality.</p>
<p><a href="https://koivisto.me/wp-content/uploads/2015/02/bose_mie2i.jpg"><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='300'%20height='240'%20viewBox=%270%200%20300%20240%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" decoding="async" class="tf_svg_lazy  size-medium wp-image-29 alignleft" data-tf-src="https://koivisto.me/wp-content/uploads/2015/02/bose_mie2i-300x240.jpg" alt="bose mie2i" width="300" height="240" data-tf-srcset="https://mikakoivisto.fi/wp-content/uploads/2015/02/bose_mie2i-300x240.jpg 300w, https://mikakoivisto.fi/wp-content/uploads/2015/02/bose_mie2i-768x614.jpg 768w, https://mikakoivisto.fi/wp-content/uploads/2015/02/bose_mie2i.jpg 1024w" data-tf-sizes="(max-width: 300px) 100vw, 300px" /><noscript><img decoding="async" class=" size-medium wp-image-29 alignleft" data-tf-not-load src="https://koivisto.me/wp-content/uploads/2015/02/bose_mie2i-300x240.jpg" alt="bose mie2i" width="300" height="240" srcset="https://mikakoivisto.fi/wp-content/uploads/2015/02/bose_mie2i-300x240.jpg 300w, https://mikakoivisto.fi/wp-content/uploads/2015/02/bose_mie2i-768x614.jpg 768w, https://mikakoivisto.fi/wp-content/uploads/2015/02/bose_mie2i.jpg 1024w" sizes="(max-width: 300px) 100vw, 300px" /></noscript></a>I tested them against my old Apple headphones and the sound quality is amazing. It&#8217;s rich and crisp. You can hear the smooth low frequences as well as the crisp high frequences well as well as my ears can hear them. I&#8217;m no audio snob that claims to hear the subtle differences but with these headphones you can clearly hear the difference.</p>
<p>Amazon and Apple are both selling these <a href="http://www.amazon.com/gp/search/ref=as_li_qf_sp_sr_il_tl?ie=UTF8&amp;camp=1789&amp;creative=9325&amp;index=aps&amp;keywords=B0043WCH66&amp;linkCode=as2&amp;tag=mskdesign-20" data-cke-saved-href="http://www.amazon.com/gp/search/ref=as_li_qf_sp_sr_il_tl?ie=UTF8&amp;camp=1789&amp;creative=9325&amp;index=aps&amp;keywords=B0043WCH66&amp;linkCode=as2&amp;tag=mskdesign-20">headphones</a> for $129.95 USD. That&#8217;s $50 more than the Apple in-ear headphones and I must say that they are worth every cent.</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2012/08/bose-mie2i-mobile-headset/">Bose MIE2i mobile headset</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mikakoivisto.fi/blog/2012/08/bose-mie2i-mobile-headset/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">43276</post-id>	</item>
		<item>
		<title>Trigger Happy Camera Remote has arrived</title>
		<link>https://mikakoivisto.fi/blog/2012/08/trigger-happy-camera-remote-has-arrived/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=trigger-happy-camera-remote-has-arrived</link>
					<comments>https://mikakoivisto.fi/blog/2012/08/trigger-happy-camera-remote-has-arrived/#respond</comments>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Mon, 06 Aug 2012 20:37:11 +0000</pubDate>
				<category><![CDATA[Miscellaneous]]></category>
		<category><![CDATA[photography]]></category>
		<category><![CDATA[trigger happy]]></category>
		<guid isPermaLink="false">https://koivisto.me/?p=32</guid>

					<description><![CDATA[<p>The Trigger Happy Camera remote I blogged about few weeks ago has finally arrived. The packaging was just a padded envelope with the trigger happy cable and a thank you note. Of course it didn&#8217;t work with my wife&#8217;s 4th gen iPod Touch so we had to check it with my iPhone with which it [&#8230;]</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2012/08/trigger-happy-camera-remote-has-arrived/">Trigger Happy Camera Remote has arrived</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><a href="https://koivisto.me/wp-content/uploads/2015/02/trigger_happy_cable.jpg"><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='300'%20height='224'%20viewBox=%270%200%20300%20224%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" decoding="async" class="tf_svg_lazy alignright size-medium wp-image-33" data-tf-src="https://koivisto.me/wp-content/uploads/2015/02/trigger_happy_cable-300x224.jpg" alt="trigger happy cable" width="300" height="224" data-tf-srcset="https://mikakoivisto.fi/wp-content/uploads/2015/02/trigger_happy_cable-300x224.jpg 300w, https://mikakoivisto.fi/wp-content/uploads/2015/02/trigger_happy_cable-768x574.jpg 768w, https://mikakoivisto.fi/wp-content/uploads/2015/02/trigger_happy_cable.jpg 1024w" data-tf-sizes="(max-width: 300px) 100vw, 300px" /><noscript><img decoding="async" class="alignright size-medium wp-image-33" data-tf-not-load src="https://koivisto.me/wp-content/uploads/2015/02/trigger_happy_cable-300x224.jpg" alt="trigger happy cable" width="300" height="224" srcset="https://mikakoivisto.fi/wp-content/uploads/2015/02/trigger_happy_cable-300x224.jpg 300w, https://mikakoivisto.fi/wp-content/uploads/2015/02/trigger_happy_cable-768x574.jpg 768w, https://mikakoivisto.fi/wp-content/uploads/2015/02/trigger_happy_cable.jpg 1024w" sizes="(max-width: 300px) 100vw, 300px" /></noscript></a>The Trigger Happy Camera remote I blogged about few weeks ago has finally arrived. The packaging was just a padded envelope with the trigger happy cable and a thank you note. Of course it didn&#8217;t work with my wife&#8217;s 4th gen iPod Touch so we had to check it with my iPhone with which it worked. Apparently there&#8217;s a software update coming soon so that it works with iPod touch.</p>
<p>Any way I&#8217;m glad it&#8217;s finally here but the whole process left a bit of bad taste. I&#8217;ll let my wife write a better review once she gets to play with it more. You can follow her blog at here website <a href="http://greatuseofpixels.com" data-cke-saved-href="http://greatuseofpixels.com">great use of pixels</a>.</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2012/08/trigger-happy-camera-remote-has-arrived/">Trigger Happy Camera Remote has arrived</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mikakoivisto.fi/blog/2012/08/trigger-happy-camera-remote-has-arrived/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">32</post-id>	</item>
		<item>
		<title>Tips for securing your Liferay installation</title>
		<link>https://mikakoivisto.fi/blog/2012/08/tips-for-securing-your-liferay-installation/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=tips-for-securing-your-liferay-installation</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Sun, 05 Aug 2012 19:07:02 +0000</pubDate>
				<category><![CDATA[Software & DevOps]]></category>
		<guid isPermaLink="false">http://javaguru.fi/?p=9</guid>

					<description><![CDATA[<p>There&#8217;s few security related things that I see people constantly doing wrong. The very first thing is assuming Liferay bundle with it&#8217;s default settings is secure for production. It is far from secure. Don&#8217;t get me wrong this doesn&#8217;t mean that Liferay isn&#8217;t secure it just means that shouldn&#8217;t deploy Liferay with it&#8217;s default settings [&#8230;]</p>
<p>The post <a rel="nofollow" href="http://javaguru.fi/tips-for-securing-your-liferay-installation.html">Tips for securing your Liferay installation</a> appeared first on <a rel="nofollow" href="http://javaguru.fi/">Javaguru</a>.</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2012/08/tips-for-securing-your-liferay-installation/">Tips for securing your Liferay installation</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>There&#8217;s few security related things that I see people constantly doing wrong. The very first thing is assuming Liferay bundle with it&#8217;s default settings is secure for production. It is far from secure. Don&#8217;t get me wrong this doesn&#8217;t mean that Liferay isn&#8217;t secure it just means that shouldn&#8217;t deploy Liferay with it&#8217;s default settings and assume it&#8217;s secure. So let&#8217;s go over some things you should consider.</p>
<h4>Default admin user</h4>
<p>Everyone knows the default admin user test@liferay.com and some attacks have taken advantage knowing this user and even it&#8217;s userid which is predictable. What I would suggest is not only to change the email address and screenname of this user but actually create a completely new admin user and remove this user.</p>
<h4>Portal instance web id</h4>
<p>The default company web id is liferay.com and it goes without saying you should change it unless you are actually deploying liferay.com. You can do this simply by setting company.default.web.id property in your portal-ext.properties. This must be done before you start your portal and let it generate the database.</p>
<h4>Encryption algorithm</h4>
<p>By default Liferay is configured to use 56bit DES encryption algorithm. I believe this legacy is due to US encryption export laws. The problem with 56bit DES is that it was cracked back in the 90s and is not considered secure encryption anymore. Liferay encrypts certaing things with this like your password in Remember Me cookie. If someone get&#8217;s a hold of that cookie they can crack your password. I would recommend using at least 128bit AES. To do that you&#8217;ll just need to set following properties before starting your portal against a clean database.</p>
<p class="code-snippet">company.encryption.algorithm=AES<br />
company.encryption.key.size=128</p>
<h4>Password hashing</h4>
<p>Recently there has been a lot of sites that have their passwords being compromised because they weren&#8217;t using salt with their password hash. Liferay by default uses SHA-1 to hash your password. That hash is a one way algorithm that doesn&#8217;t allow reversing the password from the hash but if someone gets a hold of your password hash it&#8217;s still possible to crack with brute force or by using rainbow tables. Rainbow tables are precalculated hashes that allow very easily and fast find unsalted passwords. Salt is something we add to the password before hashing it and it&#8217;s preferrable unique of each password so that even if two users have the same password their hash is different. Liferay comes with SSHA algorithm that salts the password before calculating the SHA-1 hash from it. You can enable it by setting following in your portal-ext.properties</p>
<p class="code-snippet">password.encryption.algorithm=SSHA</p>
<h4>Unused SSO hooks</h4>
<p>The default Liferay bundle comes with all SSO hooks included even thought they are not all enabled it&#8217;s a good idea to remove any hooks your are not using. There&#8217;s a property called auto.login.hooks and you should remove all hooks your are not using. Also remember to disable their associated filters.</p>
<h4>Unused Remote APIs</h4>
<p>Liferay has several different remote APIs such as JSON, JSONWS, Web service, Atom, WebDAV, Sharepoint etc. You should go through them and disable everything your site is not using. Please note that some Liferay builtin portlets rely on some of these APIs. All the APIs are accessible under /api URL.</p>
<h4>Mixed HTTP and HTTPS</h4>
<p>Everyone should by now know about Firesheep a firefox extension that allows an attacker to sniff a wifi network they are connected to and hijack a users authenticated session. This attack can compromise any website that doesn&#8217;t use all authenticated traffic over https. If you use https for just part of the site and your users can access rest of the site as authenticated user over http then your are vulnerable to Firesheep attack. This is especially bad with Liferay if you are using the default encryption and you use Remember me functionality because then the attacker could even compromise your password and use it login to any system where you use the same password. I&#8217;m sad to say that even Liferay.com is vulnerable to this attack.</p>
<h4>Shared Secrets</h4>
<p>Don&#8217;t forget to change any shared secrets. The <em>auth.token.shared.secret</em> has a default value that you want to change so that no-one can try to exploit it. This tip came from Jelmer who has found many vulnerabilities in Liferay.  Another one you don&#8217;t want to overlook is <em>auth.mac.shared.key </em>which has default value of blank. That one is relevant if you <em>auth.mac.allow</em>set to true.</p>
<p>This is not an exhaustive list but this should make your Liferay installation much more secure than it is by default. For more tips on what to configure before going to production check out <a href="http://www.liferay.com/documentation/additional-resources/whitepapers">Liferay whitepapers</a>. You should especially read the deployment checklist. If you can think of any other things that should be on this list comment them or tweet them to me <a href="http://twitter.com/koivimik">@koivimik</a></p>
<p><strong>Update:</strong> Added shared secret tip from Jelmer</p>
<p>The post <a rel="nofollow" href="http://javaguru.fi/tips-for-securing-your-liferay-installation.html">Tips for securing your Liferay installation</a> appeared first on <a rel="nofollow" href="http://javaguru.fi/">Javaguru</a>.</p>
<!--themify_builder_content-->
<div id="themify_builder_content-150" data-postid="150" class="themify_builder_content themify_builder_content-150 themify_builder tf_clear">
    </div>
<!--/themify_builder_content-->
<p>The post <a href="https://mikakoivisto.fi/blog/2012/08/tips-for-securing-your-liferay-installation/">Tips for securing your Liferay installation</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">150</post-id>	</item>
		<item>
		<title>Monitoring Liferay with Nagios, Jolokia and JMX4Perl</title>
		<link>https://mikakoivisto.fi/blog/2012/07/monitoring-liferay-with-nagios-jolokia-and-jmx4perl/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=monitoring-liferay-with-nagios-jolokia-and-jmx4perl</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Sun, 29 Jul 2012 19:15:04 +0000</pubDate>
				<category><![CDATA[Software & DevOps]]></category>
		<category><![CDATA[nagios]]></category>
		<category><![CDATA[tomcat]]></category>
		<guid isPermaLink="false">http://javaguru.fi/?p=7</guid>

					<description><![CDATA[<p>How do I monitor Liferay? That&#8217;s a question I&#8217;ve heard a lot lately. Well the standard way of getting some information about the application is by using JMX. The downside of JMX is that it&#8217;s a Java only standard and the only remote connection is by using RMI which doesn&#8217;t really sit well with non [&#8230;]</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2012/07/monitoring-liferay-with-nagios-jolokia-and-jmx4perl/">Monitoring Liferay with Nagios, Jolokia and JMX4Perl</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>How do I monitor Liferay? That&#8217;s a question I&#8217;ve heard a lot lately. Well the standard way of getting some information about the application is by using JMX. The downside of JMX is that it&#8217;s a Java only standard and the only remote connection is by using RMI which doesn&#8217;t really sit well with non Java monitoring software like very popular Nagios. Another hurdle might be that your network admin might not be inclined to open up RMI access to the jvm.</p>
<p>There&#8217;s a nice agent called Jolokia that can provide a http bridge to JMX. You can install it as java agent in pretty much any java app or deploy it as a webapp. With Jolokia installed you can query any MBeans for their values using a simple http GET and get the data as JSON objects. JMX4Perl is a perl module and scripts that provide a easy way to run those queries through Jolokia. One of those scripts is check_jmx4perl which can be used in nagios service checks.</p>
<p>Okay so now we know that we are going to need Nagios, Jolokia and JMX4Perl to monitor the Liferay JVM but what should we monitor? Well that depends on what information you are interested in but at minimum I would monitor ajp or http thread usage as well as heap utilization. Just by monitoring those values you&#8217;ll know when your JVM is becomes unresponsive and can also get some early warning that there&#8217;s issues for example heap usage goes over warning threashold and never returns to normal or keeps constantly going over the threshold which could indicate they you don&#8217;t have enough heap allocated.</p>
<p>I&#8217;m going to assume that you have  nagios installed and configured and I will only go through how to install Jolokia and configure some checks for threads and heap. So let&#8217;s start by installing JMX4Perl.</p>
<p>Installing JMX4Perl is pretty simple with cpan. You just launch cpan command line client and install it like this:</p>
<pre><code class="code-snippet">cpan&gt; install JMX::Jmx4Perl</code></pre>
<p>Next you&#8217;ll need to <a href="http://www.jolokia.org/download.html">download Jolokia</a> and deploy the jolokia.war to your app server. For this example I&#8217;m going to assume that you are using Tomcat 7. Once you&#8217;ve deployed Jolokia it&#8217;s usually good idea to restrict who can query it. For this example we are just going to restrict it to a certain IP address (the Nagios server) and limit it to read operations only. Since I don&#8217;t like modifying the war we are going to tell Jolokia where to find the policy file through a context parameter. Create a jolokia.xml in tomcat/conf/Catalina/localhost with following content:</p>
<pre><code class="code-snippet">&lt;Context path="/jolokia"&gt;
        &lt;Parameter name="policyLocation" value="file:///etc/jolokia/jolokia-access.xml" /&gt;
&lt;/Context&gt;</code></pre>
<p>That tells Jolokia to look for the policy file jolokia-access.xml from /etc/jolokia/jolokia-access.xml. This is great when you are running multiple tomcats in the same server and want them to share the jolokia policy file.</p>
<p>Now go ahead and create the jolokia-access.xml in /etc/jolokia</p>
<pre><code class="code-snippet">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;restrict&gt;
        &lt;remote&gt;
                &lt;host&gt;[YOUR NAGIOS SERVER IP]&lt;/host&gt;
        &lt;/remote&gt;
        &lt;http&gt;
                &lt;method&gt;get&lt;/method&gt;
                &lt;method&gt;post&lt;/method&gt;
        &lt;/http&gt;
        &lt;commands&gt;
                &lt;command&gt;read&lt;/command&gt;
        &lt;/commands&gt;
&lt;/restrict&gt;</code></pre>
<p>Next we need to create configuration for jmx4perl. In /etc/jmx4perl/jmx4perl.cfg we are going to include some preconfigured checks extend them. Tomcat 7 you need to add quotes around the thread pool name. We also need to set warning and critical levels for alerts. You&#8217;ll also need to add a Server for each tomcat you want to monitor.</p>
<pre><code class="code-snippet"># Default definitions
include default/memory.cfg
include default/tomcat.cfg

# ==========================
# Check definitions

&lt;Check tc7_connector_threads&gt;
	Use = relative_base($1,$2)
	Label = Connector $0 : $BASE
	Value = Catalina:name="$0",type=ThreadPool/currentThreadCount
	Base = Catalina:name="$0",type=ThreadPool/maxThreads
	Critical 95
	Warning 90
&lt;/Check&gt;

&lt;Check j4p_memory_heap&gt;
	Use memory_heap
	Critical 95
	Warning 90
&lt;/Check&gt;

&lt;Server tomcat&gt;
	Url http://MY_TOMCAT_HOSTNAME:8080/jolokia
&lt;/Server&gt;</code></pre>
<p>Then in /etc/nagios3/commands.cfg we&#8217;ll need to add a check command for jmx4perl and we&#8217;ll use the check_jmx4perl script to do that.</p>
<pre><code class="code-snippet">define command {
	command_name    check_j4p_cmd
	command_line    /usr/local/bin/check_jmx4perl --unknown-is-critical --config /etc/jmx4perl/jmx4perl.cfg --server $ARG1$ --check $ARG2$ $ARG3$
}</code></pre>
<p>Then we need to define a service to monitor in /etc/nagios3/conf.d/host-MY_TOMCAT_HOSTNAME.cfg</p>
<pre><code class="code-snippet">define service {
	use generic-service
	host_name MY_TOMCAT_HOSTNAME
	service_description Tomcat Heap Memory
	check_command check_j4p_cmd!tomcat!j4p_memory_heap!x
}

define service {
	use generic-service
	host_name MY_TOMCAT_HOSTNAME
	service_description Tomcat AJP Threads
	check_command check_j4p_cmd!tomcat!tc7_connector_threads!ajp-bio-8009
}</code></pre>
<p>The check above is for your tomcat heap and the other one is for Tomcat 7 AJP threads.</p>
<p>Now you should all the pieces to implement your own monitoring using Nagios, Jolokia and JMX4Perl. You should also remember that you can apply this to any JEE application not just Liferay.</p>
<!--themify_builder_content-->
<div id="themify_builder_content-261" data-postid="261" class="themify_builder_content themify_builder_content-261 themify_builder tf_clear">
    </div>
<!--/themify_builder_content-->
<p>The post <a href="https://mikakoivisto.fi/blog/2012/07/monitoring-liferay-with-nagios-jolokia-and-jmx4perl/">Monitoring Liferay with Nagios, Jolokia and JMX4Perl</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">261</post-id>	</item>
		<item>
		<title>Trigger Happy Camera Remote Kickstarter project</title>
		<link>https://mikakoivisto.fi/blog/2012/07/trigger-happy-camera-remote-kickstarter-project/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=trigger-happy-camera-remote-kickstarter-project</link>
					<comments>https://mikakoivisto.fi/blog/2012/07/trigger-happy-camera-remote-kickstarter-project/#respond</comments>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Fri, 20 Jul 2012 08:58:22 +0000</pubDate>
				<category><![CDATA[Miscellaneous]]></category>
		<category><![CDATA[kickstarter]]></category>
		<category><![CDATA[photography]]></category>
		<category><![CDATA[trigger happy]]></category>
		<guid isPermaLink="false">https://koivisto.me/?p=35</guid>

					<description><![CDATA[<p>In last March I discovered a cool Kickstarter project called Trigger Happy Camera Remote. It&#8217;s a DSLR camera remote that you control with a iOS or Android device. I immediately thought that it would be an excellent gift to my wife who is photographer. The project looked like it&#8217;s going to be funded well in [&#8230;]</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2012/07/trigger-happy-camera-remote-kickstarter-project/">Trigger Happy Camera Remote Kickstarter project</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><a href="https://koivisto.me/wp-content/uploads/2015/02/trigger-happy-remote.jpg.jpeg"><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='300'%20height='200'%20viewBox=%270%200%20300%20200%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" decoding="async" class="tf_svg_lazy alignright size-medium wp-image-36" data-tf-src="https://koivisto.me/wp-content/uploads/2015/02/trigger-happy-remote.jpg-300x200.jpeg" alt="trigger happy remote.jpg" width="300" height="200" data-tf-srcset="https://mikakoivisto.fi/wp-content/uploads/2015/02/trigger-happy-remote.jpg-300x200.jpeg 300w, https://mikakoivisto.fi/wp-content/uploads/2015/02/trigger-happy-remote.jpg.jpeg 400w" data-tf-sizes="(max-width: 300px) 100vw, 300px" /><noscript><img decoding="async" class="alignright size-medium wp-image-36" data-tf-not-load src="https://koivisto.me/wp-content/uploads/2015/02/trigger-happy-remote.jpg-300x200.jpeg" alt="trigger happy remote.jpg" width="300" height="200" srcset="https://mikakoivisto.fi/wp-content/uploads/2015/02/trigger-happy-remote.jpg-300x200.jpeg 300w, https://mikakoivisto.fi/wp-content/uploads/2015/02/trigger-happy-remote.jpg.jpeg 400w" sizes="(max-width: 300px) 100vw, 300px" /></noscript></a>In last March I discovered a cool Kickstarter project called <a href="http://www.kickstarter.com/projects/harrington/trigger-happy-camera-remote" data-cke-saved-href="http://www.kickstarter.com/projects/harrington/trigger-happy-camera-remote">Trigger Happy Camera Remote</a>. It&#8217;s a DSLR camera remote that you control with a iOS or Android device. I immediately thought that it would be an excellent gift to my wife who is photographer.</p>
<p>The project looked like it&#8217;s going to be funded well in advance of the May deadline and they were estimating shipping in June. Seemed like all was good and the project got funded with almost 10x what they were asking. After the funding goal was reached there were no updates for a month and a half and finally mid June got an update that it would be ready soon. Still no indication of when it would actually ship.</p>
<p>In beginning of July we finally got an update that there was a manufacturing defect and they would have to delay for few more weeks which is perfectly understandable. As I&#8217;m writing this another deadline went past without any updates on the progress. Another bad move they made is that they lowered the retail price to $49.95 even before shipping the product to their backers who paid a minimum of $50 + $5 for shipping. Some people even paid $100 to get dips on the first batch.</p>
<p>Now even if the final product is awesome I highly doubt I will ever back any projects by these guys due to their lack of good communication skills.</p>
<p><iframe loading="lazy" src="http://www.kickstarter.com/projects/harrington/trigger-happy-camera-remote/widget/video.html" width="640" height="480" frameborder="0"></iframe></p>
<p>The post <a href="https://mikakoivisto.fi/blog/2012/07/trigger-happy-camera-remote-kickstarter-project/">Trigger Happy Camera Remote Kickstarter project</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mikakoivisto.fi/blog/2012/07/trigger-happy-camera-remote-kickstarter-project/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">35</post-id>	</item>
		<item>
		<title>Configuring c3p0 connection pool for Liferay on Tomcat</title>
		<link>https://mikakoivisto.fi/blog/2012/07/configuring-c3p0-connection-pool-for-liferay-on-tomcat/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=configuring-c3p0-connection-pool-for-liferay-on-tomcat</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Wed, 18 Jul 2012 23:52:14 +0000</pubDate>
				<category><![CDATA[Software & DevOps]]></category>
		<category><![CDATA[c3p0]]></category>
		<category><![CDATA[connection pool]]></category>
		<category><![CDATA[jndi]]></category>
		<guid isPermaLink="false">http://javaguru.fi/?p=5</guid>

					<description><![CDATA[<p>There&#8217;s several ways you could configure a connection pool for Liferay on Tomcat but the way I&#8217;m going to show is the JEE way and the only one I consider correct. The first thing is to copy or move the c3p0.jar from webapps/ROOT/WEB-INF/lib/ to lib/. Also make sure you have your dabase driver there. In [&#8230;]</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2012/07/configuring-c3p0-connection-pool-for-liferay-on-tomcat/">Configuring c3p0 connection pool for Liferay on Tomcat</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>There&#8217;s several ways you could configure a connection pool for Liferay on Tomcat but the way I&#8217;m going to show is the JEE way and the only one I consider correct.</p>
<p>The first thing is to copy or move the c3p0.jar from webapps/ROOT/WEB-INF/lib/ to lib/. Also make sure you have your dabase driver there. In this example it would be mysql.jar.</p>
<p>Then we need to tell Liferay that you want to use a connection pool from JNDI and this you can do by adding following line to your portal-ext.properties which can be placed in Liferay Home directory (the directory above tomcat).</p>
<pre><code class="code-snippet">jdbc.default.jndi.name=jdbc/LiferayPool</code></pre>
<p>Add following snippet to conf/server.xml inside GlobalNamingResources. Adjust the pool size and idle time and connection test period according to your environment. They are particularly important when you have a firewall between your Liferay and database or when the database server drops connections after certain idle period.</p>
<pre><code class="code-snippet">&lt;Resource
    name="jdbc/LiferayPool"
    auth="Container"
    type="com.mchange.v2.c3p0.ComboPooledDataSource"
    factory="org.apache.naming.factory.BeanFactory"
    driverClass="com.mysql.jdbc.Driver"
    jdbcUrl="jdbc:mysql://localhost/lportaluseUnicode=true&amp;amp;characterEncoding=UTF-8&amp;amp;useFastDateParsing=false"
    user="lportal"
    password="test"
    minPoolSize="10"
    maxPoolSize="20"
    maxIdleTime="600"
    preferredTestQuery="select 1 from dual"
    idleConnectionTestPeriod="180"
    numHelperThreads="5"
    maxStatementsPerConnection="100"
/&gt;</code></pre>
<p>Now we need to link the jdbc/LiferayPool name defined in portal-ext.properties to the jdbc/LiferayPool defined in server.xml and this definition goes to conf/Catalina/localhost/ROOT.xml</p>
<pre><code class="code-snippet">&lt;ResourceLink name="jdbc/LiferayPool" global="jdbc/LiferayPool" type="javax.sql.DataSource"/&gt;</code></pre>
<p>Now we are done and you can start your tomcat with the new connection pool. Note you can follow similar process to configure MailSession from JNDI.</p>
<!--themify_builder_content-->
<div id="themify_builder_content-263" data-postid="263" class="themify_builder_content themify_builder_content-263 themify_builder tf_clear">
    </div>
<!--/themify_builder_content-->
<p>The post <a href="https://mikakoivisto.fi/blog/2012/07/configuring-c3p0-connection-pool-for-liferay-on-tomcat/">Configuring c3p0 connection pool for Liferay on Tomcat</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">263</post-id>	</item>
		<item>
		<title>Why is my java process taking more memory than I gave it?</title>
		<link>https://mikakoivisto.fi/blog/2012/06/why-is-my-java-process-taking-more-memory-than-i-gave-it/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=why-is-my-java-process-taking-more-memory-than-i-gave-it</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Wed, 06 Jun 2012 17:31:05 +0000</pubDate>
				<category><![CDATA[Software & DevOps]]></category>
		<category><![CDATA[heap]]></category>
		<category><![CDATA[jvm]]></category>
		<category><![CDATA[memory]]></category>
		<guid isPermaLink="false">http://javaguru.fi/?p=18</guid>

					<description><![CDATA[<p>It seems to be quite common misconseption that the memory you give to java process with -Xmx and -Xms command line arguments is the amount of memory the process will consume but in fact that is only the amount of memory your java object heap will have. The heap is just one factor in how [&#8230;]</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2012/06/why-is-my-java-process-taking-more-memory-than-i-gave-it/">Why is my java process taking more memory than I gave it?</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>It seems to be quite common misconseption that the memory you give to java process with -Xmx and -Xms command line arguments is the amount of memory the process will consume but in fact that is only the amount of memory your java object heap will have. The heap is just one factor in how much memory the java process will consume. To better understand how much memory your java application will consume from the system you need to understand all the factors that account for the memory usage. Those factors are:</p>
<ul>
<li>Objects</li>
<li>Classes</li>
<li>Threads</li>
<li>Native data structures</li>
<li>Native code</li>
</ul>
<p>The memory consumption associated with each item varies across applications, runtime environments and platforms.  So how do you calculate the total memory? Well, it&#8217;s not really all that easy to get accurate number because you have little control over the native part. The only parts you can really control is the amount of heap -Xmx, memory consumed by classes -XX:MaxPermSize and thread stack -Xss which controls the amount of memory each thread takes. Be careful when adjusting stack size as too low size will cause StackOverflow exceptions and your application won&#8217;t work correctly. So the formula is:</p>
<p>(-Xmx) + (-XX:MaxPermSize) + numberofthreads * (-Xss) + Other mem</p>
<p>The other mem part depends on how much native code is used like NIO, socket buffers, JNI etc. It&#8217;s anywhere from 5% of total jvm memory and up. So assume we have following JVM arguments and 100 threads</p>
<p>-Xmx1024m -XX:MaxPermSize=256m -Xss512k</p>
<p>That would mean that the jvm process would take at least: 1024m + 256m + 100*512k + (0.05 * 1330m) = 1396.5m.</p>
<p>I usually use a quick approximation rule of 1.5 * max heap to be the minimum amont of RAM a tomcat process will require. This can be higher if you have large application that requires you to increase MaxPermSize beyond 256m. If you use this to size how much memory your system will require remember that you need to leave memory for the OS and other applications running on the system otherwise you might end up using a lot of virtual memory that will affect your application performance negatively.</p>
<!--themify_builder_content-->
<div id="themify_builder_content-265" data-postid="265" class="themify_builder_content themify_builder_content-265 themify_builder tf_clear">
    </div>
<!--/themify_builder_content-->
<p>The post <a href="https://mikakoivisto.fi/blog/2012/06/why-is-my-java-process-taking-more-memory-than-i-gave-it/">Why is my java process taking more memory than I gave it?</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">265</post-id>	</item>
		<item>
		<title>What to Do When You Get “Error listerStart” with Tomcat</title>
		<link>https://mikakoivisto.fi/blog/2012/05/what-to-do-when-you-get-error-listerstart-with-tomcat/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=what-to-do-when-you-get-error-listerstart-with-tomcat</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Tue, 29 May 2012 13:58:41 +0000</pubDate>
				<category><![CDATA[Software & DevOps]]></category>
		<category><![CDATA[debugging]]></category>
		<guid isPermaLink="false">http://javaguru.fi/?p=20</guid>

					<description><![CDATA[<p>I&#8217;m sure many people other than me have banged their head in the wall trying to figure out an error like this: SEVERE: Error listenerStart 26-May-2012 13:44:27 org.apache.catalina.core.StandardContext startInternal SEVERE: Context [] startup failed due to previous errors That basically means that tomcat failed to start the webapp because there was an error with some [&#8230;]</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2012/05/what-to-do-when-you-get-error-listerstart-with-tomcat/">What to Do When You Get “Error listerStart” with Tomcat</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>I&#8217;m sure many people other than me have banged their head in the wall trying to figure out an error like this:</p>
<pre><code class="code-snippet">SEVERE: Error listenerStart 
26-May-2012 13:44:27 org.apache.catalina.core.StandardContext startInternal 
SEVERE: Context [] startup failed due to previous errors</code></pre>
<p>That basically means that tomcat failed to start the webapp because there was an error with some listener, quite often Spring context listener. The really annoying part is that it doesn&#8217;t actually show you what went wrong. There&#8217;s actually pretty simple way to get tomcat to log the actual error. You just need to create a logging.properties in WEB-INF/classes of the failing webapp and add following lines to it:</p>
<pre><code class="code-snippet">org.apache.catalina.core.ContainerBase.[Catalina].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].handlers = java.util.logging.ConsoleHandler</code></pre>
<p>Then just reload the webapp to see the error in tomcat console log. I hope this tip saves you a lot of hasle from trying to figure out the root cause of the problem.</p>
<!--themify_builder_content-->
<div id="themify_builder_content-267" data-postid="267" class="themify_builder_content themify_builder_content-267 themify_builder tf_clear">
    </div>
<!--/themify_builder_content-->
<p>The post <a href="https://mikakoivisto.fi/blog/2012/05/what-to-do-when-you-get-error-listerstart-with-tomcat/">What to Do When You Get “Error listerStart” with Tomcat</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">267</post-id>	</item>
		<item>
		<title>How to Create a Consistent Liferay Backup</title>
		<link>https://mikakoivisto.fi/blog/2012/05/how-to-create-a-consistent-liferay-backup/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=how-to-create-a-consistent-liferay-backup</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Mon, 28 May 2012 16:30:32 +0000</pubDate>
				<category><![CDATA[Software & DevOps]]></category>
		<category><![CDATA[backup]]></category>
		<guid isPermaLink="false">http://javaguru.fi/?p=22</guid>

					<description><![CDATA[<p>This is a question I&#8217;ve gotten asked in nearly all the Liferay System Administrator trainings I&#8217;ve given. Most people will just backup their database and Liferay data directory separately but any competent system admin will tell you that it&#8217;s not guaranteed to be consistent because someone could upload or delete files between the time you [&#8230;]</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2012/05/how-to-create-a-consistent-liferay-backup/">How to Create a Consistent Liferay Backup</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>This is a question I&#8217;ve gotten asked in nearly all the Liferay System Administrator trainings I&#8217;ve given. Most people will just backup their database and Liferay data directory separately but any competent system admin will tell you that it&#8217;s not guaranteed to be consistent because someone could upload or delete files between the time you took the database dump and the time you copied the data directory. Now I&#8217;m assuming that you are storing your document library binaries to filesystem instead of database.</p>
<p>Now to achieve a consistent backup with minimal interruption to your portal what you need to do is get a read lock on all your Liferay tables. This will prevent writes to the database. Then you dump the database to file with a tool like mysqldump and then you take a quick snapshot of the filesystem before you unlock the tables. You need to keep the connection that locked the tables open until this whole process is done. Once you have the database dump and filesystem snapshot ready only then you can release the lock and then you can backup the data directory using what ever method you would normally use.</p>
<p>For the PoC I&#8217;m using MySQL and my filesystem is on Linux LVM volume which supports taking snapshots. I&#8217;ve written a Perl script to execute all the commands. I&#8217;m sharing the script under GPL and it&#8217;s available in <a href="http://github.com/mikakoivisto/liferay-backup">Github</a>. Feel free to fork it and modify it to suit your needs and if you have good ideas send me a pull request.</p>
<p>The way the script works is you pass in bunch of parameters like database details, lvm volume location, source and target directories. Here&#8217;s an example:</p>
<pre><code class="code-snippet">backup_liferay.pl -u dba-backup -p mypassword -d lportal -h localhost 
--lvm-volume-path /dev/vg0/opt --lvm-snapshot-volume-path /dev/vg0/opt-snapshot 
--lvm-snapshot-volume-name opt-snapshot --lvm-snapshot-volume-size 50G 
--snapshot-mount-path /backups/snapshot 
--source-path /liferay-portal-6.1.0/data/document_library 
--db-target-path /backups/mysql/lportal.sql.gz 
--data-target-path /backups/liferay --compress</code></pre>
<p>Now even if that doesn&#8217;t exactly match your system I hope it gives you an idea how to roll your own Liferay backup.</p>
<!--themify_builder_content-->
<div id="themify_builder_content-269" data-postid="269" class="themify_builder_content themify_builder_content-269 themify_builder tf_clear">
    </div>
<!--/themify_builder_content-->
<p>The post <a href="https://mikakoivisto.fi/blog/2012/05/how-to-create-a-consistent-liferay-backup/">How to Create a Consistent Liferay Backup</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">269</post-id>	</item>
		<item>
		<title>Debugging Maven Plugins</title>
		<link>https://mikakoivisto.fi/blog/2012/05/debugging-maven-plugins/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=debugging-maven-plugins</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Sun, 27 May 2012 08:49:52 +0000</pubDate>
				<category><![CDATA[Software & DevOps]]></category>
		<category><![CDATA[maven]]></category>
		<guid isPermaLink="false">http://javaguru.fi/?p=24</guid>

					<description><![CDATA[<p>When developing maven plugins things don&#8217;t always work the way you expect so you need to debug the Mojo to see what&#8217;s really going on. I had a weird case where my plugin worked when I ran it independently but when I ran it with mvn clean package it always failed. First thing you can [&#8230;]</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2012/05/debugging-maven-plugins/">Debugging Maven Plugins</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>When developing maven plugins things don&#8217;t always work the way you expect so you need to debug the Mojo to see what&#8217;s really going on. I had a weird case where my plugin worked when I ran it independently but when I ran it with mvn clean package it always failed. First thing you can do is run in debug mode which produces a lot more output and shows all the plugin execution configuration. You can enable it with -X argument like this:</p>
<pre><code class="code-snippet">mvn -X clean package</code></pre>
<p>Now that didn&#8217;t quite help with my case so next thing I did was to run it with remote debugger. That way I could step through the code line by line and inspect all the variables. To do that you just modify the MAVEN_OPTS environment variable in the shell where you are executing you maven plugin and add java debugger agentlib config like this:</p>
<pre><code class="code-snippet">MAVEN_OPTS="-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=y"</code></pre>
<p>I used suspend=y so that it would wait for my debugger to attach before continuing the execution. Then you just add some breakpoints in you IDE and remote debug it like any java application. That by the way solved my issue as I realized each of my Liferay maven plugins were initialing Liferay configuration but since they were all run after each other in the same context only the first one mattered.</p>
<!--themify_builder_content-->
<div id="themify_builder_content-271" data-postid="271" class="themify_builder_content themify_builder_content-271 themify_builder tf_clear">
    </div>
<!--/themify_builder_content-->
<p>The post <a href="https://mikakoivisto.fi/blog/2012/05/debugging-maven-plugins/">Debugging Maven Plugins</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">271</post-id>	</item>
		<item>
		<title>Developing Liferay Plugins with Maven</title>
		<link>https://www.slideshare.net/koivimik/developing-liferay-plugins-with-maven?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=developing-liferay-plugins-with-maven-2</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Thu, 03 May 2012 19:31:26 +0000</pubDate>
				<guid isPermaLink="false">https://www.slideshare.net/koivimik/developing-liferay-plugins-with-maven</guid>

					<description><![CDATA[<p>         My Maven presentation on Liferay Nordic Symposium 2012</p>
<p>The post <a href="https://www.slideshare.net/koivimik/developing-liferay-plugins-with-maven">Developing Liferay Plugins with Maven</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[
        <br> My Maven presentation on Liferay Nordic Symposium 2012
      <p>The post <a href="https://www.slideshare.net/koivimik/developing-liferay-plugins-with-maven">Developing Liferay Plugins with Maven</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		<enclosure length="0" type="" url=""/>

		<post-id xmlns="com-wordpress:feed-additions:1">8357</post-id>	</item>
		<item>
		<title>Developing Liferay Plugins with Maven</title>
		<link>http://www.slideshare.net/koivimik/developing-liferay-plugins-with-maven?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=developing-liferay-plugins-with-maven</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Thu, 03 May 2012 19:31:26 +0000</pubDate>
				<guid isPermaLink="false">http://www.slideshare.net/koivimik/developing-liferay-plugins-with-maven</guid>

					<description><![CDATA[<p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='120'%20height='90'%20viewBox=%270%200%20120%2090%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" style="background:linear-gradient(to right,#9bb257 25%,#fcfcfc 25% 50%,#f8f8f8 50% 75%,#f0f0f0 75%),linear-gradient(to right,#f3f5f4 25%,#ffffff 25% 50%,#fbfbfb 50% 75%,#fafafa 75%),linear-gradient(to right,#ffffff 25%,#ffffff 25% 50%,#ffffff 50% 75%,#fafafa 75%),linear-gradient(to right,#f8f8f8 25%,#fcfcfc 25% 50%,#f8f8f8 50% 75%,#f0eceb 75%)" width="120" height="90" data-tf-src="https://mikakoivisto.fi/wp-content/uploads/2016/04/developingliferaypluginswithmaven-120503193128-phpapp01-thumbnail-2.jpg" class="tf_svg_lazy attachment-full size-full wp-post-image" alt="" decoding="async" data-tf-srcset="https://mikakoivisto.fi/wp-content/uploads/2016/04/developingliferaypluginswithmaven-120503193128-phpapp01-thumbnail-2.jpg 120w, https://mikakoivisto.fi/wp-content/uploads/2016/04/developingliferaypluginswithmaven-120503193128-phpapp01-thumbnail-2-666x500.jpg 666w, https://mikakoivisto.fi/wp-content/uploads/2016/04/developingliferaypluginswithmaven-120503193128-phpapp01-thumbnail-2-533x400.jpg 533w" data-tf-sizes="(max-width: 120px) 100vw, 120px" /><noscript><img width="120" height="90" data-tf-not-load src="https://mikakoivisto.fi/wp-content/uploads/2016/04/developingliferaypluginswithmaven-120503193128-phpapp01-thumbnail-2.jpg" class="attachment-full size-full wp-post-image" alt="" decoding="async" srcset="https://mikakoivisto.fi/wp-content/uploads/2016/04/developingliferaypluginswithmaven-120503193128-phpapp01-thumbnail-2.jpg 120w, https://mikakoivisto.fi/wp-content/uploads/2016/04/developingliferaypluginswithmaven-120503193128-phpapp01-thumbnail-2-666x500.jpg 666w, https://mikakoivisto.fi/wp-content/uploads/2016/04/developingliferaypluginswithmaven-120503193128-phpapp01-thumbnail-2-533x400.jpg 533w" sizes="(max-width: 120px) 100vw, 120px" /></noscript></p>
<p>         My Maven presentation on Liferay Nordic Symposium 2012</p>
<p>The post <a href="http://www.slideshare.net/koivimik/developing-liferay-plugins-with-maven">Developing Liferay Plugins with Maven</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='120'%20height='90'%20viewBox=%270%200%20120%2090%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" style="background:linear-gradient(to right,#9bb257 25%,#fcfcfc 25% 50%,#f8f8f8 50% 75%,#f0f0f0 75%),linear-gradient(to right,#f3f5f4 25%,#ffffff 25% 50%,#fbfbfb 50% 75%,#fafafa 75%),linear-gradient(to right,#ffffff 25%,#ffffff 25% 50%,#ffffff 50% 75%,#fafafa 75%),linear-gradient(to right,#f8f8f8 25%,#fcfcfc 25% 50%,#f8f8f8 50% 75%,#f0eceb 75%)" width="120" height="90" data-tf-src="https://mikakoivisto.fi/wp-content/uploads/2016/04/developingliferaypluginswithmaven-120503193128-phpapp01-thumbnail-2.jpg" class="tf_svg_lazy attachment-full size-full wp-post-image" alt="" decoding="async" data-tf-srcset="https://mikakoivisto.fi/wp-content/uploads/2016/04/developingliferaypluginswithmaven-120503193128-phpapp01-thumbnail-2.jpg 120w, https://mikakoivisto.fi/wp-content/uploads/2016/04/developingliferaypluginswithmaven-120503193128-phpapp01-thumbnail-2-666x500.jpg 666w, https://mikakoivisto.fi/wp-content/uploads/2016/04/developingliferaypluginswithmaven-120503193128-phpapp01-thumbnail-2-533x400.jpg 533w" data-tf-sizes="(max-width: 120px) 100vw, 120px" /><noscript><img width="120" height="90" data-tf-not-load src="https://mikakoivisto.fi/wp-content/uploads/2016/04/developingliferaypluginswithmaven-120503193128-phpapp01-thumbnail-2.jpg" class="attachment-full size-full wp-post-image" alt="" decoding="async" srcset="https://mikakoivisto.fi/wp-content/uploads/2016/04/developingliferaypluginswithmaven-120503193128-phpapp01-thumbnail-2.jpg 120w, https://mikakoivisto.fi/wp-content/uploads/2016/04/developingliferaypluginswithmaven-120503193128-phpapp01-thumbnail-2-666x500.jpg 666w, https://mikakoivisto.fi/wp-content/uploads/2016/04/developingliferaypluginswithmaven-120503193128-phpapp01-thumbnail-2-533x400.jpg 533w" sizes="(max-width: 120px) 100vw, 120px" /></noscript></p>
        <br> My Maven presentation on Liferay Nordic Symposium 2012
      <p>The post <a href="http://www.slideshare.net/koivimik/developing-liferay-plugins-with-maven">Developing Liferay Plugins with Maven</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		<enclosure length="0" type="" url=""/>

		<post-id xmlns="com-wordpress:feed-additions:1">214</post-id>	</item>
		<item>
		<title>SAML and Liferay</title>
		<link>https://www.slideshare.net/koivimik/saml-and-liferay?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=saml-and-liferay-2</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Wed, 25 Apr 2012 07:40:26 +0000</pubDate>
				<guid isPermaLink="false">https://www.slideshare.net/koivimik/saml-and-liferay</guid>

					<description><![CDATA[<p>         My presentation on SAML and Liferay in Liferay Nordic Symposium Warm-up Cruise.  </p>
<p>The post <a href="https://www.slideshare.net/koivimik/saml-and-liferay">SAML and Liferay</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[
        <br> My presentation on SAML and Liferay in Liferay Nordic Symposium Warm-up Cruise.  
      <p>The post <a href="https://www.slideshare.net/koivimik/saml-and-liferay">SAML and Liferay</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		<enclosure length="0" type="" url=""/>

		<post-id xmlns="com-wordpress:feed-additions:1">8360</post-id>	</item>
		<item>
		<title>SAML and Liferay</title>
		<link>http://www.slideshare.net/koivimik/saml-and-liferay?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=saml-and-liferay</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Wed, 25 Apr 2012 07:40:26 +0000</pubDate>
				<guid isPermaLink="false">http://www.slideshare.net/koivimik/saml-and-liferay</guid>

					<description><![CDATA[<p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='120'%20height='90'%20viewBox=%270%200%20120%2090%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" style="background:linear-gradient(to right,#9bb355 25%,#fcfcfc 25% 50%,#f9f9f9 50% 75%,#f0f0f0 75%),linear-gradient(to right,#f2f4f3 25%,#ffffff 25% 50%,#ffffff 50% 75%,#fafafa 75%),linear-gradient(to right,#ffffff 25%,#ffffff 25% 50%,#ffffff 50% 75%,#fafafa 75%),linear-gradient(to right,#f8f8f8 25%,#fcfcfc 25% 50%,#f8f8f8 50% 75%,#f0eceb 75%)" width="120" height="90" data-tf-src="https://mikakoivisto.fi/wp-content/uploads/2016/04/samlandliferay-120425074029-phpapp01-thumbnail-2.jpg" class="tf_svg_lazy attachment-full size-full wp-post-image" alt="" decoding="async" data-tf-srcset="https://mikakoivisto.fi/wp-content/uploads/2016/04/samlandliferay-120425074029-phpapp01-thumbnail-2.jpg 120w, https://mikakoivisto.fi/wp-content/uploads/2016/04/samlandliferay-120425074029-phpapp01-thumbnail-2-666x500.jpg 666w, https://mikakoivisto.fi/wp-content/uploads/2016/04/samlandliferay-120425074029-phpapp01-thumbnail-2-533x400.jpg 533w" data-tf-sizes="(max-width: 120px) 100vw, 120px" /><noscript><img width="120" height="90" data-tf-not-load src="https://mikakoivisto.fi/wp-content/uploads/2016/04/samlandliferay-120425074029-phpapp01-thumbnail-2.jpg" class="attachment-full size-full wp-post-image" alt="" decoding="async" srcset="https://mikakoivisto.fi/wp-content/uploads/2016/04/samlandliferay-120425074029-phpapp01-thumbnail-2.jpg 120w, https://mikakoivisto.fi/wp-content/uploads/2016/04/samlandliferay-120425074029-phpapp01-thumbnail-2-666x500.jpg 666w, https://mikakoivisto.fi/wp-content/uploads/2016/04/samlandliferay-120425074029-phpapp01-thumbnail-2-533x400.jpg 533w" sizes="(max-width: 120px) 100vw, 120px" /></noscript></p>
<p>         My presentation on SAML and Liferay in Liferay Nordic Symposium Warm-up Cruise.  </p>
<p>The post <a href="http://www.slideshare.net/koivimik/saml-and-liferay">SAML and Liferay</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='120'%20height='90'%20viewBox=%270%200%20120%2090%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" style="background:linear-gradient(to right,#9bb355 25%,#fcfcfc 25% 50%,#f9f9f9 50% 75%,#f0f0f0 75%),linear-gradient(to right,#f2f4f3 25%,#ffffff 25% 50%,#ffffff 50% 75%,#fafafa 75%),linear-gradient(to right,#ffffff 25%,#ffffff 25% 50%,#ffffff 50% 75%,#fafafa 75%),linear-gradient(to right,#f8f8f8 25%,#fcfcfc 25% 50%,#f8f8f8 50% 75%,#f0eceb 75%)" width="120" height="90" data-tf-src="https://mikakoivisto.fi/wp-content/uploads/2016/04/samlandliferay-120425074029-phpapp01-thumbnail-2.jpg" class="tf_svg_lazy attachment-full size-full wp-post-image" alt="" decoding="async" data-tf-srcset="https://mikakoivisto.fi/wp-content/uploads/2016/04/samlandliferay-120425074029-phpapp01-thumbnail-2.jpg 120w, https://mikakoivisto.fi/wp-content/uploads/2016/04/samlandliferay-120425074029-phpapp01-thumbnail-2-666x500.jpg 666w, https://mikakoivisto.fi/wp-content/uploads/2016/04/samlandliferay-120425074029-phpapp01-thumbnail-2-533x400.jpg 533w" data-tf-sizes="(max-width: 120px) 100vw, 120px" /><noscript><img width="120" height="90" data-tf-not-load src="https://mikakoivisto.fi/wp-content/uploads/2016/04/samlandliferay-120425074029-phpapp01-thumbnail-2.jpg" class="attachment-full size-full wp-post-image" alt="" decoding="async" srcset="https://mikakoivisto.fi/wp-content/uploads/2016/04/samlandliferay-120425074029-phpapp01-thumbnail-2.jpg 120w, https://mikakoivisto.fi/wp-content/uploads/2016/04/samlandliferay-120425074029-phpapp01-thumbnail-2-666x500.jpg 666w, https://mikakoivisto.fi/wp-content/uploads/2016/04/samlandliferay-120425074029-phpapp01-thumbnail-2-533x400.jpg 533w" sizes="(max-width: 120px) 100vw, 120px" /></noscript></p>
        <br> My presentation on SAML and Liferay in Liferay Nordic Symposium Warm-up Cruise.  
      <p>The post <a href="http://www.slideshare.net/koivimik/saml-and-liferay">SAML and Liferay</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		<enclosure length="0" type="" url=""/>

		<post-id xmlns="com-wordpress:feed-additions:1">217</post-id>	</item>
		<item>
		<title>The new 1080p HD Apple TV</title>
		<link>https://mikakoivisto.fi/blog/2012/03/the-new-1080p-hd-apple-tv/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=the-new-1080p-hd-apple-tv</link>
					<comments>https://mikakoivisto.fi/blog/2012/03/the-new-1080p-hd-apple-tv/#respond</comments>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Fri, 30 Mar 2012 12:45:04 +0000</pubDate>
				<category><![CDATA[Reviews]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[tv]]></category>
		<guid isPermaLink="false">https://koivisto.me/?p=38</guid>

					<description><![CDATA[<p>The new 1080p HD Apple TV package from Amazon was waiting for me yesterday when I came from work to home. The package looks the same as previous version and contains the same things: the sleek black apple tv, aluminium IR remote and power cord. When you put the old and new side by side [&#8230;]</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2012/03/the-new-1080p-hd-apple-tv/">The new 1080p HD Apple TV</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>The new 1080p HD <a href="http://www.amazon.com/gp/product/B007I5JT4S/ref=as_li_qf_sp_asin_tl?ie=UTF8&amp;tag=mskdesign-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=B007I5JT4S" data-cke-saved-href="http://www.amazon.com/gp/product/B007I5JT4S/ref=as_li_qf_sp_asin_tl?ie=UTF8&amp;tag=mskdesign-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=B007I5JT4S">Apple TV</a> package from <a href="http://www.amazon.com/gp/product/B007I5JT4S/ref=as_li_qf_sp_asin_tl?ie=UTF8&amp;tag=mskdesign-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=B007I5JT4S" data-cke-saved-href="http://www.amazon.com/gp/product/B007I5JT4S/ref=as_li_qf_sp_asin_tl?ie=UTF8&amp;tag=mskdesign-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=B007I5JT4S">Amazon</a> was waiting for me yesterday when I came from work to home.</p>
<p><a href="https://koivisto.me/wp-content/uploads/2015/02/apple_tv_hd.jpg"><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='300'%20height='199'%20viewBox=%270%200%20300%20199%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" decoding="async" class="tf_svg_lazy alignright size-medium wp-image-39" data-tf-src="https://koivisto.me/wp-content/uploads/2015/02/apple_tv_hd-300x199.jpg" alt="apple_tv_hd" width="300" height="199" data-tf-srcset="https://mikakoivisto.fi/wp-content/uploads/2015/02/apple_tv_hd-300x199.jpg 300w, https://mikakoivisto.fi/wp-content/uploads/2015/02/apple_tv_hd-768x510.jpg 768w, https://mikakoivisto.fi/wp-content/uploads/2015/02/apple_tv_hd.jpg 1024w" data-tf-sizes="(max-width: 300px) 100vw, 300px" /><noscript><img decoding="async" class="alignright size-medium wp-image-39" data-tf-not-load src="https://koivisto.me/wp-content/uploads/2015/02/apple_tv_hd-300x199.jpg" alt="apple_tv_hd" width="300" height="199" srcset="https://mikakoivisto.fi/wp-content/uploads/2015/02/apple_tv_hd-300x199.jpg 300w, https://mikakoivisto.fi/wp-content/uploads/2015/02/apple_tv_hd-768x510.jpg 768w, https://mikakoivisto.fi/wp-content/uploads/2015/02/apple_tv_hd.jpg 1024w" sizes="(max-width: 300px) 100vw, 300px" /></noscript></a></p>
<p>The package looks the same as previous version and contains the same things: the sleek black apple tv, aluminium IR remote and power cord. When you put the old and new side by side you can&#8217;t really tell which one is the new one though my old one was a bit dusty. The only other difference I noticed is the model number.</p>
<p><a href="https://koivisto.me/wp-content/uploads/2015/02/apple_tv_side_by_side.jpg"><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='300'%20height='156'%20viewBox=%270%200%20300%20156%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" decoding="async" class="tf_svg_lazy alignleft size-medium wp-image-40" data-tf-src="https://koivisto.me/wp-content/uploads/2015/02/apple_tv_side_by_side-300x156.jpg" alt="apple_tv_side_by_side" width="300" height="156" data-tf-srcset="https://mikakoivisto.fi/wp-content/uploads/2015/02/apple_tv_side_by_side-300x156.jpg 300w, https://mikakoivisto.fi/wp-content/uploads/2015/02/apple_tv_side_by_side-768x400.jpg 768w, https://mikakoivisto.fi/wp-content/uploads/2015/02/apple_tv_side_by_side.jpg 1024w" data-tf-sizes="(max-width: 300px) 100vw, 300px" /><noscript><img decoding="async" class="alignleft size-medium wp-image-40" data-tf-not-load src="https://koivisto.me/wp-content/uploads/2015/02/apple_tv_side_by_side-300x156.jpg" alt="apple_tv_side_by_side" width="300" height="156" srcset="https://mikakoivisto.fi/wp-content/uploads/2015/02/apple_tv_side_by_side-300x156.jpg 300w, https://mikakoivisto.fi/wp-content/uploads/2015/02/apple_tv_side_by_side-768x400.jpg 768w, https://mikakoivisto.fi/wp-content/uploads/2015/02/apple_tv_side_by_side.jpg 1024w" sizes="(max-width: 300px) 100vw, 300px" /></noscript></a></p>
<p>I really love Apple TV. I rent movies through it, stream music to my Harman Kardon home theater system and stream Finnish TV using TVKaista iPad app which also support AirPlay. I was going to buy a second Apple TV to my bedroom to connect to my <a href="http://www.amazon.com/gp/product/B004OOODOC/ref=as_li_qf_sp_asin_tl?ie=UTF8&amp;tag=mskdesign-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=B004OOODOC" data-cke-saved-href="http://www.amazon.com/gp/product/B004OOODOC/ref=as_li_qf_sp_asin_tl?ie=UTF8&amp;tag=mskdesign-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=B004OOODOC">32&#8243; LG LED TV</a> along with DirecTV HD DVR but since I heard there was a new version of Apple TV coming so I waited awhile for it. Now the 1080p gets it&#8217;s home in my living room next to my second DirecTV HD DVR and <a href="http://www.amazon.com/gp/product/B0036WT4JC/ref=as_li_qf_sp_asin_tl?ie=UTF8&amp;tag=mskdesign-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=B0036WT4JC" data-cke-saved-href="http://www.amazon.com/gp/product/B0036WT4JC/ref=as_li_qf_sp_asin_tl?ie=UTF8&amp;tag=mskdesign-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=B0036WT4JC">55&#8243; Samsung 1080p LED TV</a>.</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2012/03/the-new-1080p-hd-apple-tv/">The new 1080p HD Apple TV</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mikakoivisto.fi/blog/2012/03/the-new-1080p-hd-apple-tv/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">38</post-id>	</item>
		<item>
		<title>Don’t pay bank fees</title>
		<link>https://mikakoivisto.fi/blog/2012/03/dont-pay-bank-fees/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=dont-pay-bank-fees</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Fri, 30 Mar 2012 15:26:10 +0000</pubDate>
				<category><![CDATA[Finance]]></category>
		<guid isPermaLink="false">http://mymoneymatters.co/?p=9</guid>

					<description><![CDATA[<p>Bank fees will add up quickly and you really shouldn&#8217;t need to pay your bank any fees. I primarily bank at Chase and they charge $6 account maintenance fee if you don&#8217;t have at least 5 debit card transactions or a minimum $500 direct deposit on your account. Now I have two checking accounts one [&#8230;]</p>
<p>The post <a rel="nofollow" href="http://mymoneymatters.co/don-t-pay-bank-fees.html">Don&#8217;t pay bank fees</a> appeared first on <a rel="nofollow" href="http://mymoneymatters.co/">My Money Matters</a>.</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2012/03/dont-pay-bank-fees/">Don’t pay bank fees</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Bank fees will add up quickly and you really shouldn’t need to pay your bank any fees. I primarily bank at Chase and they charge $6 account maintenance fee if you don’t have at least 5 debit card transactions or a minimum $500 direct deposit on your account. Now I have two checking accounts one of which is a joint account with my girlfriend and ever since I got my AMEX I’ve been paying everything with it. I recently noticed that I had been charged $6 per month as a maintenence fee for several months so I called to Chase. I asked if there was any minimum balance requirements or maintenance fees associated with my accounts and the customer service rep explained the requirements and offered to reverse the charges for past 4 months just like that.</p>
<p>You should also not accept any overdraft charges especially if it’s your first time. Just call your bank and explain that you’ve been a good customer and it has been a mistake and you’d like them to reverse the charges. It never hurts to ask but make sure you’ve transferred money on your account so that it’s positive. I’ve set it up so that if I try to use my debit card and there’s not enough balance it gets rejected.</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2012/03/dont-pay-bank-fees/">Don’t pay bank fees</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">43210</post-id>	</item>
		<item>
		<title>Creating Liferay Themes with Maven</title>
		<link>https://mikakoivisto.fi/blog/2012/03/creating-liferay-themes-with-maven/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=creating-liferay-themes-with-maven</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Fri, 16 Mar 2012 00:37:18 +0000</pubDate>
				<category><![CDATA[Software & DevOps]]></category>
		<guid isPermaLink="false">https://web.liferay.com/web/mika.koivisto/blog/-/blogs/creating-liferay-themes-with-maven</guid>

					<description><![CDATA[<p>
	Some time ago I posted on how you can get started creating portlets with Liferay Maven SDK now I&#8217;m going to show how you can add themes to your project. If you need a refresher on how to get started check out <a href="http://www.liferay.com/web/mika.koivisto/blog/-/blogs/getting-started-with-liferay-maven-sdk">this post</a>.</p>
<p>
	1) Open command prompt or terminal and go to your project directory. Next we are going to create a theme using the Liferay theme template. Run:</p>
<div>
	mvn archetype:generate <br />
	&#160; &#160; -DarchetypeArtifactId=liferay-theme-archetype <br />
	&#160; &#160; -DarchetypeGroupId=com.liferay.maven.archetypes <br />
	&#160; &#160; -DarchetypeVersion=6.1.0 <br />
	&#160; &#160; -DartifactId=sample-theme <br />
	&#160; &#160; -DgroupId=com.liferay.sample <br />
	&#160; &#160; -Dversion=1.0-SNAPSHOT</div>
<div>
	For 6.1 EE ga1 use -DarchetypeVersion=6.1.10.&#160;</div>
<p>
	Now you have your theme project in sample-theme directory with following structure.</p>
<div>
	sample-theme<br />
	sample-theme/pom.xml<br />
	sample-theme/src<br />
	sample-theme/src/main<br />
	sample-theme/src/main/resources<br />
	sample-theme/src/main/webapp<br />
	sample-theme/src/main/webapp/WEB-INF<br />
	sample-theme/src/main/webapp/WEB-INF/liferay-plugin-package.properties<br />
	sample-theme/src/main/webapp/WEB-INF/web.xml</div>
<p>
	2) Open the theme pom.xml file. From the properties section remove <i>liferay.version</i> and <i>liferay.auto.deploy.dir</i> properties. These properties should be defined in the pom.xml in your project root just as we did with the portlet project.</p>
<p>
	You should also note that there&#8217;s two additional properties <i>liferay.theme.parent</i> and <i>liferay.theme.type</i>. These set the parent theme and the theme template language just like in ant based plugins sdk. The property <i>liferay.theme.parent</i> however allows you to define basically any war artifact as the parent. The syntax is <i>groupId:artifactId:version</i> or you can use the core themes: <i>_unstyled</i>, <i>_styled</i>, <i>classic</i> and <i>control_panel</i>.</p>
<p>
	3) Now you can add your customizations in src/main/webapp. Just follow the same structure as you would do in _diffs. So your custom.css would go to src/main/webapp/css/custom.css.</p>
<p>
	4) Once you&#8217;ve done your customizations and want to create the war file just run</p>
<div>
	mvn package</div>
<p>
	It will create the war file just like with any maven war type project. Another thing it will do is download and copy your parent theme and then overlay your changes on top of it. It will also create a thumbnail from src/main/webapp/images/screenshot.png just like ant based plugins sdk does. These are accomplished by adding the theme-merge and build-thumbnail goals into the generate-sources phase.</p>
<p>
	5) Now deploy the theme into your Liferay bundle by running:</p>
<div>
	mvn liferay:deploy</div>
<p>The post <a href="https://mikakoivisto.fi/blog/2012/03/creating-liferay-themes-with-maven/">Creating Liferay Themes with Maven</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<style type="text/css">
.blog-snippet {<br />
border: 1px solid #DEDEDE;<br />
font-family: Monaco, "Courier New", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", monospace;<br />
margin-bottom: 1em;<br />
overflow: auto;<br />
word-wrap: normal;<br />
background-color: ghostWhite;<br />
white-space:pre-line;<br />
}</style>
<p>Some time ago I posted on how you can get started creating portlets with Liferay Maven SDK now I’m going to show how you can add themes to your project. If you need a refresher on how to get started check out <a href="https://jguru.fi/getting-started-liferay-maven-sdk.html">this post</a>.<span id="more-270"></span></p>
<p>1) Open command prompt or terminal and go to your project directory. Next we are going to create a theme using the Liferay theme template. Run:</p>
<div class="blog-snippet">mvn archetype:generate<br />
-DarchetypeArtifactId=liferay-theme-archetype<br />
-DarchetypeGroupId=com.liferay.maven.archetypes<br />
-DarchetypeVersion=6.1.0<br />
-DartifactId=sample-theme<br />
-DgroupId=com.liferay.sample<br />
-Dversion=1.0-SNAPSHOT</div>
<div class="portlet-msg-info">For 6.1 EE ga1 use -DarchetypeVersion=6.1.10.</div>
<p>Now you have your theme project in sample-theme directory with following structure.</p>
<div class="blog-snippet">sample-theme<br />
sample-theme/pom.xml<br />
sample-theme/src<br />
sample-theme/src/main<br />
sample-theme/src/main/resources<br />
sample-theme/src/main/webapp<br />
sample-theme/src/main/webapp/WEB-INF<br />
sample-theme/src/main/webapp/WEB-INF/liferay-plugin-package.properties<br />
sample-theme/src/main/webapp/WEB-INF/web.xml</div>
<p>2) Open the theme pom.xml file. From the properties section remove <i>liferay.version</i> and <i>liferay.auto.deploy.dir</i> properties. These properties should be defined in the pom.xml in your project root just as we did with the portlet project.</p>
<p>You should also note that there’s two additional properties <i>liferay.theme.parent</i> and <i>liferay.theme.type</i>. These set the parent theme and the theme template language just like in ant based plugins sdk. The property <i>liferay.theme.parent</i> however allows you to define basically any war artifact as the parent. The syntax is <i>groupId:artifactId:version</i> or you can use the core themes: <i>_unstyled</i>, <i>_styled</i>, <i>classic</i> and <i>control_panel</i>.</p>
<p>3) Now you can add your customizations in src/main/webapp. Just follow the same structure as you would do in _diffs. So your custom.css would go to src/main/webapp/css/custom.css.</p>
<p>4) Once you’ve done your customizations and want to create the war file just run</p>
<div class="blog-snippet">mvn package</div>
<p>It will create the war file just like with any maven war type project. Another thing it will do is download and copy your parent theme and then overlay your changes on top of it. It will also create a thumbnail from src/main/webapp/images/screenshot.png just like ant based plugins sdk does. These are accomplished by adding the theme-merge and build-thumbnail goals into the generate-sources phase.</p>
<p>5) Now deploy the theme into your Liferay bundle by running:</p>
<div class="blog-snippet">mvn liferay:deploy</div>
<p>This post was originally published on <a href="https://web.liferay.com/web/mika.koivisto/blog/-/blogs/creating-liferay-themes-with-maven">Liferay blog</a>.</p>
<div id="themify_builder_content-270" data-postid="270" class="themify_builder_content themify_builder_content-270 themify_builder themify_builder_front"></div>
<p><!-- /themify_builder_content --></p>
<p>The post <a href="https://mikakoivisto.fi/blog/2012/03/creating-liferay-themes-with-maven/">Creating Liferay Themes with Maven</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">43258</post-id>	</item>
		<item>
		<title>LifeProof case for iPhone</title>
		<link>https://mikakoivisto.fi/blog/2012/03/lifeproof-case-for-iphone/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=lifeproof-case-for-iphone</link>
					<comments>https://mikakoivisto.fi/blog/2012/03/lifeproof-case-for-iphone/#respond</comments>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Wed, 07 Mar 2012 20:46:22 +0000</pubDate>
				<category><![CDATA[Reviews]]></category>
		<category><![CDATA[case]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[lifeproof]]></category>
		<guid isPermaLink="false">https://koivisto.me/?p=42</guid>

					<description><![CDATA[<p>My old iPhone case broke sometime ago and I need to protect my iPhone 4 so I thought I&#8217;d give LifeProof a try since it  is supposed to make it water, dirt, snow and shock resistant. Check out the video where the guy demonstrating it goes snorkling with his iPhone and even uses it to [&#8230;]</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2012/03/lifeproof-case-for-iphone/">LifeProof case for iPhone</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='221'%20height='300'%20viewBox=%270%200%20221%20300%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" decoding="async" class="tf_svg_lazy alignright size-medium wp-image-43" data-tf-src="https://koivisto.me/wp-content/uploads/2015/02/lifeproof-white-221x300.jpg" alt="lifeproof-white" width="221" height="300" data-tf-srcset="https://mikakoivisto.fi/wp-content/uploads/2015/02/lifeproof-white-221x300.jpg 221w, https://mikakoivisto.fi/wp-content/uploads/2015/02/lifeproof-white.jpg 400w" data-tf-sizes="(max-width: 221px) 100vw, 221px" /><noscript><img decoding="async" class="alignright size-medium wp-image-43" data-tf-not-load src="https://koivisto.me/wp-content/uploads/2015/02/lifeproof-white-221x300.jpg" alt="lifeproof-white" width="221" height="300" srcset="https://mikakoivisto.fi/wp-content/uploads/2015/02/lifeproof-white-221x300.jpg 221w, https://mikakoivisto.fi/wp-content/uploads/2015/02/lifeproof-white.jpg 400w" sizes="(max-width: 221px) 100vw, 221px" /></noscript>My old iPhone case broke sometime ago and I need to protect my iPhone 4 so I thought I&#8217;d give LifeProof a try since it  is supposed to make it water, dirt, snow and shock resistant.</p>
<p>Check out the video where the guy demonstrating it goes snorkling with his iPhone and even uses it to film underwater.</p>
<div class="post-video"><iframe loading="lazy" width="1165" height="655" src="https://www.youtube.com/embed/DuDerD9F3sQ?feature=oembed" frameborder="0" gesture="media" allowfullscreen></iframe></div>
<p>Before putting your iPhone in the case you need to do a 1 hour long water test to make sure there&#8217;s no defects in the case and you know how to properly seal it. After that&#8217;s done you need to clean your iPhone with the included microfiber cloth and make sure there not dust, hairs or anything extra in your iPhone or the case and then you can seal it.</p>
<p>After using it for a while it seems pretty responsive and sound quality seems okay. The only immediate downside I could detect is that it is quite a bit bulkier than my previous case but it does provide a lot of extra protection. I will post an update once I&#8217;ve actually used it for a while.</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2012/03/lifeproof-case-for-iphone/">LifeProof case for iPhone</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mikakoivisto.fi/blog/2012/03/lifeproof-case-for-iphone/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">42</post-id>	</item>
		<item>
		<title>Establishing credit history</title>
		<link>https://mikakoivisto.fi/blog/2012/03/establishing-credit-history/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=establishing-credit-history</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Mon, 05 Mar 2012 16:15:03 +0000</pubDate>
				<category><![CDATA[Finance]]></category>
		<guid isPermaLink="false">http://mymoneymatters.co/?p=7</guid>

					<description><![CDATA[<p>If you are a foreigner like me that has come to US to work you&#8217;ll very soon notice that you will be paying a lot extra for everything because you don&#8217;t any credit history. For example I had to pay extra security deposit on my apartment, gas, electricity and even get a non-prepaid phone. All [&#8230;]</p>
<p>The post <a rel="nofollow" href="http://mymoneymatters.co/establishing-credit-history.html">Establishing credit history</a> appeared first on <a rel="nofollow" href="http://mymoneymatters.co/">My Money Matters</a>.</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2012/03/establishing-credit-history/">Establishing credit history</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>If you are a foreigner like me that has come to US to work you’ll very soon notice that you will be paying a lot extra for everything because you don’t any credit history. For example I had to pay extra security deposit on my apartment, gas, electricity and even get a non-prepaid phone. All that totalled about $5000 which is a pretty huge chunck of cash that your not going to get any intrest on.</p>
<p>That wasn’t even the worst. The worst was when I wanted to get a car. First I thought about leasing but that was completely out of the question so my second choise was to buy but I wanted a new car as I had gotten used to driving only new cars. I found a dealer that was willing to work with me and got me a financing after I put down over $10.000.</p>
<p>Now doing all that and getting the financing did actually help me quickly raise my credit score to 720 which is considered good but not exellent. I’ve also taken a secured credit card from Capital One with $400 limit and about 6 months ago I took Costco True Rewards card from American Express and for that I got $2000 limit. That’s still far from my 10.000 EUR or about $13.000 USD limit Visa Gold that I’ve had for years from my bank back in my home country, Finland.</p>
<p>So here’s what I would recommend all immigrants and non-immigrants do as soon as you get your social security number. You should notice that you won’t be able to get any credit history without SSN. It doesn’t matter whether you are authorized to work or not with it as long as you have the number. So if you are a student with F-1 visa get a job on campus so that you can get a social security number.</p>
<ol>
<li>Apply for a secured credit card either from your bank or Capital One. (Don’t apply for any regular credit card or store cards as you will be declined and you’ll get a hard query in your credit report). Put what ever you can on the card such as $300. This will be your credit limit.</li>
<li>Use the card every month but never go over 30% of your credit limit (with $300 limit it would be $100)</li>
<li>Always pay the full balance on time every time no exceptions.</li>
<li>After 6 months to a year get your credit report from all three credit bureaus (Experian, Equifax and TransUnion). You can get this from Freecreditscore.com for instance but remember to cancel the subscription. You might also get this for free as part of your secured credit card so make sure before paying.</li>
<li>Once you have 700+ credit score and if you are shopping for a car or motorcycle take financing on it but pay a significant portion of it up front. Having different types of credit is important but the single most important thing is to always pay on time. Once you have that loan and you’ve made your first payment double check your score. It might take a small hit initially but it should bounce back in few months.</li>
<li>Once you have that stable 700+ credit score you should also take another credit card but this time a regular one. I recommend getting the Costco American Express because there’s no yearly fee other than your Costco membership and you get cash back even from Costco not to mention all the American Express benefits.</li>
</ol>
<p>The post <a href="https://mikakoivisto.fi/blog/2012/03/establishing-credit-history/">Establishing credit history</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">43212</post-id>	</item>
		<item>
		<title>Getting started with Liferay SAML 2.0 Identity Provider</title>
		<link>https://mikakoivisto.fi/blog/2012/02/getting-started-with-liferay-saml-2-0-identity-provider/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=getting-started-with-liferay-saml-2-0-identity-provider</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Tue, 28 Feb 2012 01:27:21 +0000</pubDate>
				<category><![CDATA[Software & DevOps]]></category>
		<guid isPermaLink="false">https://web.liferay.com/web/mika.koivisto/blog/-/blogs/getting-started-with-liferay-saml-2-0-identity-provider</guid>

					<description><![CDATA[<p>&#160;<br />
  Liferay 6.1 EE comes with SAML 2.0 Identity Provider and Service<br />
  Provider support via SAML plugin. If you are not familiar with SAML<br />
  check out my&#160;Introduction<br />
    to SAML presentation slides.<br />
  In this post we will configure Liferay...</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2012/02/getting-started-with-liferay-saml-2-0-identity-provider/">Getting started with Liferay SAML 2.0 Identity Provider</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Liferay 6.1 EE comes with SAML 2.0 Identity Provider and Service</p>
<p>Provider support via SAML plugin. If you are not familiar with SAML<br />
check out my <a href="http://slidesha.re/lrsaml20">Introduction to SAML presentation slides</a>.</p>
<p>In this post we will configure Liferay to be SAML Identity Provider<br />
and configure Salesforce to be a Service Provider. After we are done<br />
we have a user that can move from Liferay to Salesforce without<br />
requiring to authenticate on Salesforce.<span id="more-272"></span></p>
<p>You’ll need following things to complete this by yourself:</p>
<p>* Liferay Portal 6.1 EE GA1 Tomcat bundle<br />
* SAML Portlet WAR<br />
* Salesforce developer account. You can sign-up <a href="http://developer.force.com/">here</a> for free.</p>
<p>The first thing to do is download and install Liferay. If you need<br />
help configuring Liferay refer to Liferay 6.1 <a href="http://www.liferay.com/documentation/liferay-portal/6.1/user-guide">User<br />
Guide</a>. Once that is done you’ll need to configure the SAML<br />
identity provider before deploying the plugin. The IdP needs a private<br />
and public key pair for signing SAML messages. It uses Java keystore<br />
to store the them. We’ll create the keystore and they key pair<br />
using keytool that is part of the JDK. You need to pick a unique<br />
entity id for your IdP and a password that is used to protect keystore<br />
and the private key. In this example we’ll use<br />
liferaysamlidpdemo as the entity id and liferay as the password for<br />
both keystore and the key. The keystore is created in<br />
LIFERAY_HOME/data/keystore.jks as this is the default location SAML<br />
plugin will look for it. You can also configure the location and type<br />
of they keystore and will do it here just for reference.</p>
<div class="blog-snippet" style="border: 1.0px solid #dedede; font-family: Monaco , Courier New , DejaVu Sans Mono , Bitstream Vera Sans Mono , monospace; margin-bottom: 1.0em; overflow: auto; background-color: #f8f8ff;">keytool -genkeypair -alias liferaysamlidpdemo -keyalg RSA -keysize<br />
2048 -keypass liferay -storepass liferay -keystore data/keystore.jks</div>
<p>You’ll be asked to provide some information that will be in<br />
the certificate with the public key.</p>
<div class="blog-snippet" style="border: 1.0px solid #dedede; font-family: Monaco , Courier New , DejaVu Sans Mono , Bitstream Vera Sans Mono , monospace; margin-bottom: 1.0em; overflow: auto; background-color: #f8f8ff;">What is your first and last name?<br />
[Unknown]:<br />
Liferay SAML IdP Demo<br />
What is the name of your<br />
organization?<br />
[Unknown]:  Liferay SAML IdP<br />
Demo<br />
What is the name of your City or Locality?[Unknown]:<br />
What is the name of your State or<br />
Province?<br />
[Unknown]:<br />
What is the two-letter<br />
country code for this unit?<br />
[Unknown]:<br />
Is<br />
CN=Liferay SAML IdP Demo, OU=Unknown, O=Liferay SAML IdP Demo,<br />
L=Unknown, ST=Unknown, C=Unknown correct?<br />
[no]:  yes</div>
<p>Next step is to add SAML configuration to your portal-ext.properties.</p>
<div class="blog-snippet" style="border: 1.0px solid #dedede; font-family: Monaco , Courier New , DejaVu Sans Mono , Bitstream Vera Sans Mono , monospace; margin-bottom: 1.0em; overflow: auto; background-color: #f8f8ff;">saml.enabled=true<br />
saml.role=idp<br />
saml.entity.id=liferaysamlidpdemo<br />
saml.require.ssl=false<br />
saml.sign.metadata=truesaml.idp.authn.request.signature.required=truesaml.keystore.path=${liferay.home}/data/keystore.jks<br />
saml.keystore.password=liferay<br />
saml.keystore.type=jkssaml.keystore.credential.password[liferaysamlidpdemo]=liferay</p>
</div>
<p>Now you can deploy SAML plugin by copying it to LIFERAY_HOME/deploy<br />
and starting up tomcat. Wait for the saml-portlet to be deployed and<br />
available and then open http://localhost:8080/c/portal/saml/metadata.<br />
If you have configured everything correctly you should see the IdP<br />
metadata similar to below. I’ve just shortened the data on<br />
signature and certificate elements.</p>
<div class="blog-snippet" style="border: 1.0px solid #dedede; font-family: Monaco , Courier New , DejaVu Sans Mono , Bitstream Vera Sans Mono , monospace; margin-bottom: 1.0em; overflow: auto; background-color: #f8f8ff;">&lt;?xml version=“1.0”<br />
encoding=“UTF-8”?&gt;<br />
&lt;md:EntityDescriptor<br />
xmlns:md=“urn:oasis:names:tc:SAML:2.0:metadata”<br />
entityID=“liferaysamlidpdemo”&gt;<br />
&lt;ds:Signature<br />
xmlns:ds=“http://www.w3.org/2000/09/xmldsig#”&gt;<br />
&lt;ds:SignedInfo&gt;&lt;ds:CanonicalizationMethod<br />
Algorithm=“http://www.w3.org/2001/10/xml-exc-c14n#”/&gt;<br />
&lt;ds:SignatureMethod<br />
Algorithm=“http://www.w3.org/2000/09/xmldsig#rsa-sha1”/&gt;<br />
&lt;ds:Reference URI=“”&gt;<br />
&lt;ds:Transforms&gt;<br />
&lt;ds:Transform<br />
Algorithm=“http://www.w3.org/2000/09/xmldsig#enveloped-signature”/&gt;<br />
&lt;ds:Transform<br />
Algorithm=“http://www.w3.org/2001/10/xml-exc-c14n#”/&gt;<br />
&lt;/ds:Transforms&gt;&lt;ds:DigestMethod<br />
Algorithm=“http://www.w3.org/2000/09/xmldsig#sha1”/&gt;</p>
<p>&lt;ds:DigestValue&gt;mVKz/Tv6o40+SrEF595+Gedmoo8=&lt;/ds:DigestValue&gt;<br />
&lt;/ds:Reference&gt;</p>
<p>&lt;/ds:SignedInfo&gt;</p>
<p>&lt;ds:SignatureValue&gt;AAJsDF8dJv5XQw6Ty1MSg7 …<br />
OXvQw==&lt;/ds:SignatureValue&gt;</p>
<p>&lt;ds:KeyInfo&gt;<br />
&lt;ds:X509Data&gt;<br />
&lt;ds:X509Certificate&gt;MIIDjjCCAnagAwIB…<br />
&lt;/ds:X509Certificate&gt;</p>
<p>&lt;/ds:X509Data&gt;<br />
&lt;/ds:KeyInfo&gt;<br />
&lt;/ds:Signature&gt;<br />
&lt;md:IDPSSODescriptor<br />
ID=“liferaysamlidpdemo”</p>
<p>WantAuthnRequestsSigned=“true”<br />
protocolSupportEnumeration=“urn:oasis:names:tc:SAML:2.0:protocol”&gt;<br />
&lt;md:KeyDescriptor use=“signing”&gt;<br />
&lt;ds:KeyInfo<br />
xmlns:ds=“http://www.w3.org/2000/09/xmldsig#”&gt;<br />
&lt;ds:X509Data&gt;</p>
<p>&lt;ds:X509Certificate&gt;MIIDjj<br />
…&lt;/ds:X509Certificate&gt;</p>
<p>&lt;/ds:X509Data&gt;<br />
&lt;/ds:KeyInfo&gt;<br />
&lt;/md:KeyDescriptor&gt;</p>
<p>&lt;md:SingleLogoutService<br />
Binding=“urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect”</p>
<p>Location=“http://localhost:8080/c/portal/saml/slo_redirect”/&gt;<br />
&lt;md:SingleSignOnService<br />
Binding=“urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect”</p>
<p>Location=“http://localhost:8080/c/portal/saml/sso”/&gt;<br />
&lt;md:SingleSignOnService<br />
Binding=“urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST”</p>
<p>Location=“http://localhost:8080/c/portal/saml/sso”/&gt;<br />
&lt;/md:IDPSSODescriptor&gt;<br />
&lt;/md:EntityDescriptor&gt;</p>
</div>
<p>Even though the IdP is configured and functioning it’s not<br />
very useful because there’s no Service Providers configured. For<br />
this example we are going to use Salesforce developer account to<br />
demonstrate single sign-on between Liferay and Salesforce. If you<br />
haven’t already signed up for Salesforce developer account do it here.</p>
<p>We’ll need to export the certificate from keystore because<br />
Salesforce doesn’t know how to read SAML metadata.</p>
<div class="blog-snippet" style="border: 1.0px solid #dedede; font-family: Monaco , Courier New , DejaVu Sans Mono , Bitstream Vera Sans Mono , monospace; margin-bottom: 1.0em; overflow: auto; background-color: #f8f8ff;">keytool -export -alias liferaysamlidpdemo -file liferaysamlidpdemo.crt<br />
-keystore data/keystore.jks -storepass liferay -keypass liferay</div>
<p>Now login to your Salesforce developer account in here. On your<br />
dashboard click on Setup.</p>
<p><a href="https://jguru.fi/wp-content/uploads/2012/02/salesforce_setup.png"><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='526'%20height='209'%20viewBox=%270%200%20526%20209%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" decoding="async" class="tf_svg_lazy size-full wp-image-308 alignnone" data-tf-src="https://jguru.fi/wp-content/uploads/2012/02/salesforce_setup.png" alt="" width="526" height="209" data-tf-srcset="https://jguru.fi/wp-content/uploads/2012/02/salesforce_setup.png 526w, https://jguru.fi/wp-content/uploads/2012/02/salesforce_setup-300x119.png 300w" data-tf-sizes="(max-width: 526px) 100vw, 526px" /><noscript><img decoding="async" class="size-full wp-image-308 alignnone" data-tf-not-load src="https://jguru.fi/wp-content/uploads/2012/02/salesforce_setup.png" alt="" width="526" height="209" srcset="https://jguru.fi/wp-content/uploads/2012/02/salesforce_setup.png 526w, https://jguru.fi/wp-content/uploads/2012/02/salesforce_setup-300x119.png 300w" sizes="(max-width: 526px) 100vw, 526px" /></noscript></a></p>
<p>&nbsp;</p>
<p class="p1">Then click on Security Controls &gt; Single Sign-On<br />
Settings under Administration Setup.</p>
<p class="p1"><a href="https://jguru.fi/wp-content/uploads/2012/02/salesforce_sso_settings.png"><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='496'%20height='318'%20viewBox=%270%200%20496%20318%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" decoding="async" class="tf_svg_lazy size-full wp-image-307 alignnone" data-tf-src="https://jguru.fi/wp-content/uploads/2012/02/salesforce_sso_settings.png" alt="" width="496" height="318" data-tf-srcset="https://jguru.fi/wp-content/uploads/2012/02/salesforce_sso_settings.png 496w, https://jguru.fi/wp-content/uploads/2012/02/salesforce_sso_settings-300x192.png 300w" data-tf-sizes="(max-width: 496px) 100vw, 496px" /><noscript><img decoding="async" class="size-full wp-image-307 alignnone" data-tf-not-load src="https://jguru.fi/wp-content/uploads/2012/02/salesforce_sso_settings.png" alt="" width="496" height="318" srcset="https://jguru.fi/wp-content/uploads/2012/02/salesforce_sso_settings.png 496w, https://jguru.fi/wp-content/uploads/2012/02/salesforce_sso_settings-300x192.png 300w" sizes="(max-width: 496px) 100vw, 496px" /></noscript></a></p>
<p class="p1">Then click on Edit.</p>
<p class="p1"><a href="https://jguru.fi/wp-content/uploads/2012/02/salesforce_sso_settings_edit.png"><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='644'%20height='210'%20viewBox=%270%200%20644%20210%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" decoding="async" class="tf_svg_lazy size-full wp-image-306 alignnone" data-tf-src="https://jguru.fi/wp-content/uploads/2012/02/salesforce_sso_settings_edit.png" alt="" width="644" height="210" data-tf-srcset="https://jguru.fi/wp-content/uploads/2012/02/salesforce_sso_settings_edit.png 644w, https://jguru.fi/wp-content/uploads/2012/02/salesforce_sso_settings_edit-300x98.png 300w" data-tf-sizes="(max-width: 644px) 100vw, 644px" /><noscript><img decoding="async" class="size-full wp-image-306 alignnone" data-tf-not-load src="https://jguru.fi/wp-content/uploads/2012/02/salesforce_sso_settings_edit.png" alt="" width="644" height="210" srcset="https://jguru.fi/wp-content/uploads/2012/02/salesforce_sso_settings_edit.png 644w, https://jguru.fi/wp-content/uploads/2012/02/salesforce_sso_settings_edit-300x98.png 300w" sizes="(max-width: 644px) 100vw, 644px" /></noscript></a></p>
<p class="p1">Here’s the setting you need:</p>
<p>* SAML Enabled.<br />
* SAML Version: 2.0<br />
* Issuer:<br />
liferaysamlidpdemo (this is the entity id of the IdP)<br />
*<br />
Identity Provider Certificate: liferaysamlidpdemo.crt which you<br />
exported earlier.<br />
* Identity Provider Login URL:<br />
http://localhost:8080/c/portal/saml/sso<br />
* SAML User ID Type:<br />
Select Assetion contains User’s salesforce.com username<br />
*<br />
SAML User ID Location: Select User ID is in the NameIdentifier element<br />
of the Subject statement<br />
* Identity Provider Logout URL:<br />
http://localhost:8080/c/portal/logout (Salesforce does not support<br />
SAML Single Logout Profile)</p>
<p><a href="https://jguru.fi/wp-content/uploads/2012/02/salesforce_sso_saml.png"><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='629'%20height='345'%20viewBox=%270%200%20629%20345%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" decoding="async" class="tf_svg_lazy size-full wp-image-305 alignnone" data-tf-src="https://jguru.fi/wp-content/uploads/2012/02/salesforce_sso_saml.png" alt="" width="629" height="345" data-tf-srcset="https://jguru.fi/wp-content/uploads/2012/02/salesforce_sso_saml.png 629w, https://jguru.fi/wp-content/uploads/2012/02/salesforce_sso_saml-300x165.png 300w" data-tf-sizes="(max-width: 629px) 100vw, 629px" /><noscript><img decoding="async" class="size-full wp-image-305 alignnone" data-tf-not-load src="https://jguru.fi/wp-content/uploads/2012/02/salesforce_sso_saml.png" alt="" width="629" height="345" srcset="https://jguru.fi/wp-content/uploads/2012/02/salesforce_sso_saml.png 629w, https://jguru.fi/wp-content/uploads/2012/02/salesforce_sso_saml-300x165.png 300w" sizes="(max-width: 629px) 100vw, 629px" /></noscript></a></p>
<p>&nbsp;</p>
<p class="p1">Verify that your setting as correct and then click on<br />
Download Metadata. Also note the Entity Id as this will be needed on<br />
the IdP side.</p>
<p class="p1"><a href="https://jguru.fi/wp-content/uploads/2012/02/salesforce_sso_saml_download_metadata.png"><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='863'%20height='389'%20viewBox=%270%200%20863%20389%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" decoding="async" class="tf_svg_lazy size-full wp-image-304 alignnone" data-tf-src="https://jguru.fi/wp-content/uploads/2012/02/salesforce_sso_saml_download_metadata.png" alt="" width="863" height="389" data-tf-srcset="https://jguru.fi/wp-content/uploads/2012/02/salesforce_sso_saml_download_metadata.png 863w, https://jguru.fi/wp-content/uploads/2012/02/salesforce_sso_saml_download_metadata-300x135.png 300w, https://jguru.fi/wp-content/uploads/2012/02/salesforce_sso_saml_download_metadata-768x346.png 768w" data-tf-sizes="(max-width: 863px) 100vw, 863px" /><noscript><img decoding="async" class="size-full wp-image-304 alignnone" data-tf-not-load src="https://jguru.fi/wp-content/uploads/2012/02/salesforce_sso_saml_download_metadata.png" alt="" width="863" height="389" srcset="https://jguru.fi/wp-content/uploads/2012/02/salesforce_sso_saml_download_metadata.png 863w, https://jguru.fi/wp-content/uploads/2012/02/salesforce_sso_saml_download_metadata-300x135.png 300w, https://jguru.fi/wp-content/uploads/2012/02/salesforce_sso_saml_download_metadata-768x346.png 768w" sizes="(max-width: 863px) 100vw, 863px" /></noscript></a></p>
<p class="p1">Move the downloaded metadata xml to<br />
LIFERAY_HOME/data/saml/salesforce-metadata.xml. Now we need to<br />
configure the IdP to know about this Service Provider. This is done by<br />
telling saml plugin where to find the SAML metadata for Salesforce.</p>
<div class="blog-snippet" style="border: 1.0px solid #dedede; font-family: Monaco , Courier New , DejaVu Sans Mono , Bitstream Vera Sans Mono , monospace; margin-bottom: 1.0em; overflow: auto; background-color: #f8f8ff;">saml.metadata.paths=${liferay.home}/data/saml/salesforce-metadata.xml</div>
<p>If your Salesforce Entity Id is not https://saml.salesforce.com<br />
you’ll also need to add following lines to your<br />
portal-ext.properties. Note I’m using<br />
https://saml.salesforce.com as the entity id but you would replace it<br />
with what ever Salesforce reported it to be.</p>
<div class="blog-snippet" style="border: 1.0px solid #dedede; font-family: Monaco , Courier New , DejaVu Sans Mono , Bitstream Vera Sans Mono , monospace; margin-bottom: 1.0em; overflow: auto; background-color: #f8f8ff;">saml.idp.metadata.attributes.enabled[https://saml.salesforce.com]=true<br />
saml.idp.metadata.attribute.names[https://saml.salesforce.com]=<br />
saml.idp.metadata.name.id.format[https://saml.salesforce.com]=urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified<br />
saml.idp.metadata.salesforce.attributes.enabled[https://saml.salesforce.com]=true</div>
<p>If you had your tomcat still running just restart it so that the<br />
new property value is read. Then login as test@liferay.com / test. Now<br />
click on Manage &gt; Site Pages. Click on Add Page. Add following values:</p>
<p>Name: Salesforce<br />
Type: URL<br />
URL:  /c/portal/saml/sso?entityId=https://saml.salesforce.com</p>
<p><a href="https://jguru.fi/wp-content/uploads/2012/02/salesforce_liferay_saml_page_link.png"><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='650'%20height='366'%20viewBox=%270%200%20650%20366%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" decoding="async" class="tf_svg_lazy size-full wp-image-303 alignnone" data-tf-src="https://jguru.fi/wp-content/uploads/2012/02/salesforce_liferay_saml_page_link.png" alt="" width="650" height="366" data-tf-srcset="https://jguru.fi/wp-content/uploads/2012/02/salesforce_liferay_saml_page_link.png 650w, https://jguru.fi/wp-content/uploads/2012/02/salesforce_liferay_saml_page_link-300x169.png 300w" data-tf-sizes="(max-width: 650px) 100vw, 650px" /><noscript><img decoding="async" class="size-full wp-image-303 alignnone" data-tf-not-load src="https://jguru.fi/wp-content/uploads/2012/02/salesforce_liferay_saml_page_link.png" alt="" width="650" height="366" srcset="https://jguru.fi/wp-content/uploads/2012/02/salesforce_liferay_saml_page_link.png 650w, https://jguru.fi/wp-content/uploads/2012/02/salesforce_liferay_saml_page_link-300x169.png 300w" sizes="(max-width: 650px) 100vw, 650px" /></noscript></a></p>
<p>Notice the entityId is the same Entity Id that was shown as entity<br />
id on the Salesforce Single Sign-On configuration page.</p>
<p>Go to Control Panel and add a new user with same email address as<br />
your Salesforce developer account. Sign out and login with that new<br />
account. Now click on the Salesforce page link. If everything was<br />
configured correctly you are redirected to Salesforce and you are<br />
signed in with your developer account. If you want to be redirected to<br />
some other page than they home page you can add a URL parameter<br />
RelayState with the page URL you want to be redirected to as the<br />
value. For example the URL could look like this<br />
/c/portal/saml/sso?entityId=https://saml.salesforce.com&amp;RelayState=/006/o.<br />
This would take me to my Opportunities page directly.</p>
<p>Now sign out from Salesforce and you will be taken back to Liferay<br />
and logged out from Liferay. Now if you click on the Salesforce page<br />
it will take present you with Liferay login page and after login will<br />
take you to Salesforce.</p>
<p><strong>Update:</strong> If you need to setup Liferay as SP check<br />
out my collegues post <a href="http://www.liferay.com/web/armin.dahncke/blog/-/blogs/setting-up-liferay-portal-6-1-ee-as-a-sp">Setting up Liferay as Service Provider</a>.</p>
<p>This post was originally published on <a href="https://web.liferay.com/web/mika.koivisto/blog/-/blogs/getting-started-with-liferay-saml-2-0-identity-provider">Liferay blog</a>.</p>
<div id="themify_builder_content-272" data-postid="272" class="themify_builder_content themify_builder_content-272 themify_builder themify_builder_front"></div>
<p><!-- /themify_builder_content --></p>
<p>The post <a href="https://mikakoivisto.fi/blog/2012/02/getting-started-with-liferay-saml-2-0-identity-provider/">Getting started with Liferay SAML 2.0 Identity Provider</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		<enclosure length="0" type="" url=""/>

		<post-id xmlns="com-wordpress:feed-additions:1">43281</post-id>	</item>
		<item>
		<title>Deploying Liferay artifacts to your own maven repository</title>
		<link>https://mikakoivisto.fi/blog/2012/02/deploying-liferay-artifacts-to-your-own-maven-repository/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=deploying-liferay-artifacts-to-your-own-maven-repository</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Tue, 21 Feb 2012 22:12:38 +0000</pubDate>
				<category><![CDATA[Software & DevOps]]></category>
		<guid isPermaLink="false">https://web.liferay.com/web/mika.koivisto/blog/-/blogs/deploying-liferay-artifacts-to-your-own-maven-repository</guid>

					<description><![CDATA[<p>
	As part of Liferay 6.1 release we&#8217;ve created a new package that has a convenient&#160; script to install Liferay artifacts to your local repository or to a remote repository. This package is provide for both CE and EE releases but it is more useful for EE users because we don&#8217;t release EE versions of the artifacts to Maven Central repository.</p>
<p>
	You can download the 6.1 GA1 package from  <a href="http://sourceforge.net/projects/lportal/files/Liferay%20Portal/6.1.0%20GA1/liferay-portal-maven-6.1.0-ce-ga1-20120106155615760.zip/download">here</a> and 6.1 EE users can download it from Customer Portal. Once you have downloaded the zip file unzip it.&#160;</p>
<p>
	In the root of the package you&#8217;ll find build.properties. This file defines the remote repository location, repository id and optional gpg signing key and password. You can override settings in this file similarly to those in plugins sdk by creating a build.USERNAME.properties file and overriding the properties you want. If you are just deploying to you local repository there&#8217;s no need to override any settings.&#160;</p>
<p>
	Before you begin you should make sure you have mvn in your path. For remote deployment you should also increase the available memory for maven otherwise you might get a OutOfMemoryError. For windows you can use following in your cmd prompt or set MAVEN_OPTS environment variable.</p>
<div>
	set MAVEN_OPTS=-Xmx512m -XX:MaxPermSize=128m</div>
<p>
	For Unix-like systems such as Linux and Mac OS X use</p>
<div>
	export MAVEN_OPTS="-Xmx512m -XX:MaxPermSize=128m"</div>
<p>
	To deploy to your local maven repository you can just run:</p>
<div>
	ant install&#160;</div>
<p>
	To deploy to a remote repository such as Sonatype Nexus you need to set credential required to deploy to the repository in ${USER_HOME}/.m2/settings.xml like this:</p>
<div>
&#60;?xml version="1.0"?&#62;<br />
&#60;settings&#62;<br />
&#160; &#160; &#60;servers&#62;<br />
&#160; &#160; &#160; &#160; &#60;server&#62;<br />
&#160; &#160; &#160; &#160; &#160; &#160; &#60;id&#62;liferay&#60;/id&#62;<br />
&#160; &#160; &#160; &#160; &#160; &#160; &#60;username&#62;admin&#60;/username&#62;<br />
&#160; &#160; &#160; &#160; &#160; &#160; &#60;password&#62;password&#60;/password&#62;<br />
&#160; &#160; &#160; &#160; &#60;/server&#62;<br />
&#160; &#160; &#60;/servers&#62;<br />
&#60;/settings&#62;
</div>
<p>
	Then you need to add the repository id and repository location to your build.USERNAME.properties like this:</p>
<div>
lp.maven.repository.id=liferay<br />
lp.maven.repository.url=http://localhost/nexus/content/repositories/liferay-release</div>
<p>
	Notice that the repository id must match the one in your settings.xml so that correct credentials are picked up. You can also set gpg.keyname and gpg.passphrase if you want the artifacts signed. Check out <a href="https://docs.sonatype.org/display/Repository/How+To+Generate+PGP+Signatures+With+Maven">this blog post</a> on how to generate gpg key and distribute the public key.</p>
<p>
	Now you can deploy it just by running:</p>
<div>
	ant deploy</div>
<p>
	Now you have following Liferay artifacts at your disposal. Their groupId is com.liferay.portal and artifactId is one listed below and version is the Liferay release number such as 6.1.0 for 6.1 GA1 and 6.1.10 for 6.1 EE1.</p>
<ul>
<li>portal-client</li>
<li>portal-impl</li>
<li>portal-service</li>
<li>portal-web</li>
<li>support-tomcat</li>
<li>util-bridges</li>
<li>util-java</li>
<li>util-taglib</li>
</ul>
<p>The post <a href="https://mikakoivisto.fi/blog/2012/02/deploying-liferay-artifacts-to-your-own-maven-repository/">Deploying Liferay artifacts to your own maven repository</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<style>
.blog-snippet {<br />border: 1px solid #DEDEDE;<br />font-family: Monaco, "Courier New", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", monospace;<br />margin-bottom: 1em;<br />overflow: auto;<br />word-wrap: normal;<br />background-color: ghostWhite;<br />white-space:pre-line;<br />}<br /></style>
<p>As part of Liferay 6.1 release we’ve created a new package that has a convenient  script to install Liferay artifacts to your local repository or to a remote repository. This package is provide for both CE and EE releases but it is more useful for EE users because we don’t release EE versions of the artifacts to Maven Central repository.<span id="more-274"></span></p>
<p class="p1">You can download the 6.1 GA1 package from <a href="http://sourceforge.net/projects/lportal/files/Liferay%20Portal/6.1.0%20GA1/liferay-portal-maven-6.1.0-ce-ga1-20120106155615760.zip/download">here</a> and 6.1 EE users can download it from Customer Portal. Once you have downloaded the zip file unzip it.</p>
<p class="p1">In the root of the package you’ll find build.properties. This file defines the remote repository location, repository id and optional gpg signing key and password. You can override settings in this file similarly to those in plugins sdk by creating a build.USERNAME.properties file and overriding the properties you want. If you are just deploying to you local repository there’s no need to override any settings.</p>
<p class="p1">Before you begin you should make sure you have mvn in your path. For remote deployment you should also increase the available memory for maven otherwise you might get a OutOfMemoryError. For windows you can use following in your cmd prompt or set MAVEN_OPTS environment variable.</p>
<div class="blog-snippet">set MAVEN_OPTS=-Xmx512m -XX:MaxPermSize=128m</div>
<p class="p1">For Unix-like systems such as Linux and Mac OS X use</p>
<div class="blog-snippet">export MAVEN_OPTS=&#8221;-Xmx512m -XX:MaxPermSize=128m&#8221;</div>
<p class="p1">To deploy to your local maven repository you can just run:</p>
<div class="blog-snippet">ant install</div>
<p class="p1">To deploy to a remote repository such as Sonatype Nexus you need to set credential required to deploy to the repository in ${USER_HOME}/.m2/settings.xml like this:</p>
<div class="blog-snippet">&lt;?xml version=&#8221;1.0&#8243;?&gt;<br />
&lt;settings&gt;<br />
&lt;servers&gt;<br />
&lt;server&gt;<br />
&lt;id&gt;liferay&lt;/id&gt;<br />
&lt;username&gt;admin&lt;/username&gt;<br />
&lt;password&gt;password&lt;/password&gt;<br />
&lt;/server&gt;<br />
&lt;/servers&gt;<br />
&lt;/settings&gt;</div>
<p class="p1">Then you need to add the repository id and repository location to your build.USERNAME.properties like this:</p>
<div class="blog-snippet">lp.maven.repository.id=liferay<br />
lp.maven.repository.url=http://localhost/nexus/content/repositories/liferay-release</div>
<p class="p1">Notice that the repository id must match the one in your settings.xml so that correct credentials are picked up. You can also set gpg.keyname and gpg.passphrase if you want the artifacts signed. Check out <a href="https://docs.sonatype.org/display/Repository/How+To+Generate+PGP+Signatures+With+Maven">this blog post</a> on how to generate gpg key and distribute the public key.</p>
<p class="p1">Now you can deploy it just by running:</p>
<div class="blog-snippet">ant deploy</div>
<p class="p1">Now you have following Liferay artifacts at your disposal. Their groupId is com.liferay.portal and artifactId is one listed below and version is the Liferay release number such as 6.1.0 for 6.1 GA1 and 6.1.10 for 6.1 EE1.</p>
<ul>
<li class="p1">portal-client</li>
<li class="p1">portal-impl</li>
<li class="p1">portal-service</li>
<li class="p1">portal-web</li>
<li class="p1">support-tomcat</li>
<li class="p1">util-bridges</li>
<li class="p1">util-java</li>
<li class="p1">util-taglib</li>
</ul>
<p>This post was originally published on <a href="https://web.liferay.com/web/mika.koivisto/blog/-/blogs/deploying-liferay-artifacts-to-your-own-maven-repository">Liferay blog</a>.</p>
<div id="themify_builder_content-274" data-postid="274" class="themify_builder_content themify_builder_content-274 themify_builder themify_builder_front"></div>
<p><!-- /themify_builder_content --></p>
<p>The post <a href="https://mikakoivisto.fi/blog/2012/02/deploying-liferay-artifacts-to-your-own-maven-repository/">Deploying Liferay artifacts to your own maven repository</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		<enclosure length="0" type="" url=""/>

		<post-id xmlns="com-wordpress:feed-additions:1">43283</post-id>	</item>
		<item>
		<title>Getting started with Liferay Maven SDK</title>
		<link>https://mikakoivisto.fi/blog/2012/02/getting-started-with-liferay-maven-sdk/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=getting-started-with-liferay-maven-sdk</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Thu, 02 Feb 2012 01:53:39 +0000</pubDate>
				<category><![CDATA[Software & DevOps]]></category>
		<guid isPermaLink="false">https://web.liferay.com/web/mika.koivisto/blog/-/blogs/getting-started-with-liferay-maven-sdk</guid>

					<description><![CDATA[<p>This will be the first in series of posts on how to develop Liferay plugins with Maven. In this post we'll start by creating a new parent project for your plugins and add a portlet project to it. You need to have your maven environment setup with mav...</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2012/02/getting-started-with-liferay-maven-sdk/">Getting started with Liferay Maven SDK</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div>This will be the first in series of posts on how to develop Liferay plugins with Maven. In this post we&#8217;ll start by creating a new parent project for your plugins and add a portlet project to it. You need to have your maven environment setup with maven and java installed. If you don&#8217;t know how to do it I would recommend reading <a href="http://www.sonatype.com/books/mvnref-book/reference/">Maven: The Complete Reference</a> from Sonatype, Inc. The chapter 2 has good instructions on how to install maven.</div>
<p><span id="more-276"></span></p>
<div></div>
<div>1) Download and install Liferay 6.1.0 bundle. In these posts we assume it&#8217;s tomcat bundle but you can use any bundle. I&#8217;ll refer to the bundle install location is LIFERAY_HOME from now on. If you need instructions on how to install bundle please refer to <a href="http://www.liferay.com/documentation/liferay-portal/6.1/user-guide/-/ai/installing-liferay">Liferay 6.1 User Guide</a>.</div>
<div></div>
<div>2) Create a new directory which will be your project root. This is the location where you would extract Liferay plugins SDK if you were using Ant. Then in that directory create a pom.xml file.</div>
<div></div>
<div><script src="https://gist.github.com/1720897.js?file=pom.xml"></script></div>
<div>Now you should adjust groupId and artifactId to match you project. Also set the value of liferay.auto.deploy.dir to LIFERAY_HOME/deploy. This is where the plugin is copied for Liferay to deploy. The liferay.version property is set to version of Liferay you are using.</div>
<div></div>
<div>
<div>3) Open command prompt or terminal and go to your project directory. Next we&#8217;ll going to create a portlet project using a liferay portlet project template. Run</div>
<div></div>
<div>mvn archetype:generate</div>
<div></div>
<div>That command will create a list of available project templates like below:</div>
<div></div>
<div><script src="https://gist.github.com/1720897.js?file=templates%20snippet"></script></div>
<div></div>
<div>
<div>Choose number 24 or what ever the number you have for com.liferay.maven.archetypes:liferay-portlet-archetype</div>
<div></div>
<div>Next you will be asked to choose the template version:</div>
<div></div>
<div><script src="https://gist.github.com/1720897.js?file=version%20snippet"></script></div>
<div></div>
<div>
<div>Choose number 6 or what ever you have for 6.1.0 version.</div>
<div></div>
<div>Next you will be asked to provide groupId, artifactId and version:</div>
<div></div>
<div><script src="https://gist.github.com/1720897.js?file=template%20properties%20snippet"></script></div>
<div></div>
<div>
<div>For groupId use the same as in the first pom.xml. In my case it would be com.liferay.sample. For artifactId I chose sample-portlet as this is the directory it will create. Version should be the same as the project parent. Once you have confirmed the values maven will create the portlet project and add it to you parent project as module automatically.</div>
<div></div>
<div>Now you project structure should be something like this:</div>
<div></div>
<div><script src="https://gist.github.com/1720897.js?file=project%20file%20listing"></script></div>
<div></div>
</div>
<div>
<div>4) Go to sample-portlet directory and run</div>
<div></div>
<div>mvn package</div>
<div></div>
<div>This will compile any classes and packages the portlet war file in target directory.</div>
<div></div>
<div>5) To deploy the portlet into your Liferay bundle you can run</div>
<div></div>
<div>mvn liferay:deploy</div>
<div></div>
<div>Now you have created your first Liferay plugin project with maven and deployed it to your Liferay bundle.</div>
</div>
</div>
</div>
</div>
<p>This post was originally published on <a href="https://web.liferay.com/web/mika.koivisto/blog/-/blogs/getting-started-with-liferay-maven-sdk">Liferay blog</a>.</p>
<div id="themify_builder_content-276" data-postid="276" class="themify_builder_content themify_builder_content-276 themify_builder themify_builder_front"></div>
<p><!-- /themify_builder_content --></p>
<p>The post <a href="https://mikakoivisto.fi/blog/2012/02/getting-started-with-liferay-maven-sdk/">Getting started with Liferay Maven SDK</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		<enclosure length="0" type="" url=""/>

		<post-id xmlns="com-wordpress:feed-additions:1">43285</post-id>	</item>
		<item>
		<title>Liferay 6.1 GA1 Maven artifacts released</title>
		<link>https://mikakoivisto.fi/blog/2012/01/liferay-6-1-ga1-maven-artifacts-released/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=liferay-6-1-ga1-maven-artifacts-released</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Tue, 10 Jan 2012 00:54:55 +0000</pubDate>
				<guid isPermaLink="false">https://web.liferay.com/web/mika.koivisto/blog/-/blogs/liferay-6-1-ga1-maven-artifacts-released</guid>

					<description><![CDATA[<p>
	&#160;</p>
<p>
	I&#8217;m glad to announce that we have released Liferay maven artifacts to 6.1 GA1.&#160;</p>
<p>
	All the artifacts will be pushed into the central repository through <a href="http://oss.sonatype.org/">http://oss.sonatype.org</a> where they are already available.&#160;</p>
<p>
	This release includes following artifacts:</p>
<p>
	- portal-client<br />
	- portal-impl<br />
	- portal-service<br />
	- portal-web<br />
	- support-tomcat<br />
	- util-bridges<br />
	- util-java<br />
	- util-taglib</p>
<p>
	In addition to this we&#8217;ve packaged the Liferay artifacts into a convenient zip file called <a href="http://sourceforge.net/projects/lportal/files/Liferay%20Portal/6.1.0%20GA1/liferay-portal-maven-6.1.0-ce-ga1-20120106155615760.zip/download">/liferay-portal-maven-6.1.0-ce-ga1-20120106155615760.zip</a> with ant script to allow you to deploy them into your local repository easily. We will be providing this for EE releases as well since EE artifacts will not be available from Central. &#160;</p>
<p>
	We have also released the Liferay maven plugin and archetypes for all types of Liferay plugins:</p>
<p>
	- liferay-ext-archetype<br />
	- liferay-hook-archetype<br />
	- liferay-layouttpl-archetype<br />
	- liferay-portlet-archetype<br />
	- liferay-servicebuilder-archetype<br />
	- liferay-theme-archetype<br />
	- liferay-web-archetype</p>
<p>
	I will post later some instructions on how to use those archetypes. If you&#8217;ve used the snapshot version there was one last minute change that requires you to now manually set properties liferay.version and liferay.auto.deploy.dir in your pom.xml.&#160;</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2012/01/liferay-6-1-ga1-maven-artifacts-released/">Liferay 6.1 GA1 Maven artifacts released</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>
	&nbsp;</p>
<p class="p1">
	I’m glad to announce that we have released Liferay maven artifacts to 6.1 GA1.&nbsp;</p>
<p class="p1">
	All the artifacts will be pushed into the central repository through <a href="http://oss.sonatype.org/">http://oss.sonatype.org</a> where they are already available.&nbsp;</p>
<p class="p1">
	This release includes following artifacts:</p>
<p class="p1">
	&#8211; portal-client<br />
	&#8211; portal-impl<br />
	&#8211; portal-service<br />
	&#8211; portal-web<br />
	&#8211; support-tomcat<br />
	&#8211; util-bridges<br />
	&#8211; util-java<br />
	&#8211; util-taglib</p>
<p class="p1">
	In addition to this we’ve packaged the Liferay artifacts into a convenient zip file called <a href="http://sourceforge.net/projects/lportal/files/Liferay%20Portal/6.1.0%20GA1/liferay-portal-maven-6.1.0-ce-ga1-20120106155615760.zip/download">/liferay-portal-maven-6.1.0-ce-ga1-20120106155615760.zip</a> with ant script to allow you to deploy them into your local repository easily. We will be providing this for EE releases as well since EE artifacts will not be available from Central. &nbsp;</p>
<p class="p1">
	We have also released the Liferay maven plugin and archetypes for all types of Liferay plugins:</p>
<p class="p1">
	&#8211; liferay-ext-archetype<br />
	&#8211; liferay-hook-archetype<br />
	&#8211; liferay-layouttpl-archetype<br />
	&#8211; liferay-portlet-archetype<br />
	&#8211; liferay-servicebuilder-archetype<br />
	&#8211; liferay-theme-archetype<br />
	&#8211; liferay-web-archetype</p>
<p class="p1">
	I will post later some instructions on how to use those archetypes. If you’ve used the snapshot version there was one last minute change that requires you to now manually set properties liferay.version and liferay.auto.deploy.dir in your pom.xml.&nbsp;</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2012/01/liferay-6-1-ga1-maven-artifacts-released/">Liferay 6.1 GA1 Maven artifacts released</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">201</post-id>	</item>
		<item>
		<title>Liferay maven sdk</title>
		<link>https://www.slideshare.net/koivimik/liferay-maven-sdk?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=liferay-maven-sdk-3</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Thu, 20 Oct 2011 18:03:38 +0000</pubDate>
				<guid isPermaLink="false">https://www.slideshare.net/koivimik/liferay-maven-sdk</guid>

					<description><![CDATA[<p>         My tech talk about Liferay and maven.</p>
<p>The post <a href="https://www.slideshare.net/koivimik/liferay-maven-sdk">Liferay maven sdk</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[
        <br> My tech talk about Liferay and maven.
      <p>The post <a href="https://www.slideshare.net/koivimik/liferay-maven-sdk">Liferay maven sdk</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		<enclosure length="0" type="" url=""/>

		<post-id xmlns="com-wordpress:feed-additions:1">8363</post-id>	</item>
		<item>
		<title>Liferay maven sdk</title>
		<link>http://www.slideshare.net/koivimik/liferay-maven-sdk?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=liferay-maven-sdk-2</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Thu, 20 Oct 2011 18:03:38 +0000</pubDate>
				<guid isPermaLink="false">http://www.slideshare.net/koivimik/liferay-maven-sdk</guid>

					<description><![CDATA[<p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='120'%20height='90'%20viewBox=%270%200%20120%2090%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" style="background:linear-gradient(to right,#113253 25%,#113251 25% 50%,#143755 50% 75%,#133656 75%),linear-gradient(to right,#919aa9 25%,#c5cbd9 25% 50%,#0e1629 50% 75%,#0b162a 75%),linear-gradient(to right,#0a2745 25%,#0b233f 25% 50%,#0a2b4a 50% 75%,#12385c 75%),linear-gradient(to right,#275f90 25%,#21527d 25% 50%,#2c6fa6 50% 75%,#2a6ba1 75%)" width="120" height="90" data-tf-src="https://mikakoivisto.fi/wp-content/uploads/2016/04/liferaymavensdk-111020180339-phpapp01-thumbnail-2.jpg" class="tf_svg_lazy attachment-full size-full wp-post-image" alt="" decoding="async" data-tf-srcset="https://mikakoivisto.fi/wp-content/uploads/2016/04/liferaymavensdk-111020180339-phpapp01-thumbnail-2.jpg 120w, https://mikakoivisto.fi/wp-content/uploads/2016/04/liferaymavensdk-111020180339-phpapp01-thumbnail-2-666x500.jpg 666w, https://mikakoivisto.fi/wp-content/uploads/2016/04/liferaymavensdk-111020180339-phpapp01-thumbnail-2-533x400.jpg 533w" data-tf-sizes="(max-width: 120px) 100vw, 120px" /><noscript><img width="120" height="90" data-tf-not-load src="https://mikakoivisto.fi/wp-content/uploads/2016/04/liferaymavensdk-111020180339-phpapp01-thumbnail-2.jpg" class="attachment-full size-full wp-post-image" alt="" decoding="async" srcset="https://mikakoivisto.fi/wp-content/uploads/2016/04/liferaymavensdk-111020180339-phpapp01-thumbnail-2.jpg 120w, https://mikakoivisto.fi/wp-content/uploads/2016/04/liferaymavensdk-111020180339-phpapp01-thumbnail-2-666x500.jpg 666w, https://mikakoivisto.fi/wp-content/uploads/2016/04/liferaymavensdk-111020180339-phpapp01-thumbnail-2-533x400.jpg 533w" sizes="(max-width: 120px) 100vw, 120px" /></noscript></p>
<p>         My tech talk about Liferay and maven.</p>
<p>The post <a href="http://www.slideshare.net/koivimik/liferay-maven-sdk">Liferay maven sdk</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='120'%20height='90'%20viewBox=%270%200%20120%2090%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" style="background:linear-gradient(to right,#113253 25%,#113251 25% 50%,#143755 50% 75%,#133656 75%),linear-gradient(to right,#919aa9 25%,#c5cbd9 25% 50%,#0e1629 50% 75%,#0b162a 75%),linear-gradient(to right,#0a2745 25%,#0b233f 25% 50%,#0a2b4a 50% 75%,#12385c 75%),linear-gradient(to right,#275f90 25%,#21527d 25% 50%,#2c6fa6 50% 75%,#2a6ba1 75%)" width="120" height="90" data-tf-src="https://mikakoivisto.fi/wp-content/uploads/2016/04/liferaymavensdk-111020180339-phpapp01-thumbnail-2.jpg" class="tf_svg_lazy attachment-full size-full wp-post-image" alt="" decoding="async" data-tf-srcset="https://mikakoivisto.fi/wp-content/uploads/2016/04/liferaymavensdk-111020180339-phpapp01-thumbnail-2.jpg 120w, https://mikakoivisto.fi/wp-content/uploads/2016/04/liferaymavensdk-111020180339-phpapp01-thumbnail-2-666x500.jpg 666w, https://mikakoivisto.fi/wp-content/uploads/2016/04/liferaymavensdk-111020180339-phpapp01-thumbnail-2-533x400.jpg 533w" data-tf-sizes="(max-width: 120px) 100vw, 120px" /><noscript><img width="120" height="90" data-tf-not-load src="https://mikakoivisto.fi/wp-content/uploads/2016/04/liferaymavensdk-111020180339-phpapp01-thumbnail-2.jpg" class="attachment-full size-full wp-post-image" alt="" decoding="async" srcset="https://mikakoivisto.fi/wp-content/uploads/2016/04/liferaymavensdk-111020180339-phpapp01-thumbnail-2.jpg 120w, https://mikakoivisto.fi/wp-content/uploads/2016/04/liferaymavensdk-111020180339-phpapp01-thumbnail-2-666x500.jpg 666w, https://mikakoivisto.fi/wp-content/uploads/2016/04/liferaymavensdk-111020180339-phpapp01-thumbnail-2-533x400.jpg 533w" sizes="(max-width: 120px) 100vw, 120px" /></noscript></p>
        <br> My tech talk about Liferay and maven.
      <p>The post <a href="http://www.slideshare.net/koivimik/liferay-maven-sdk">Liferay maven sdk</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		<enclosure length="0" type="" url=""/>

		<post-id xmlns="com-wordpress:feed-additions:1">220</post-id>	</item>
		<item>
		<title>Introduction to SAML 2.0</title>
		<link>https://www.slideshare.net/koivimik/introduction-to-saml-20?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=introduction-to-saml-2-0-2</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Thu, 13 Oct 2011 18:05:59 +0000</pubDate>
				<guid isPermaLink="false">https://www.slideshare.net/koivimik/introduction-to-saml-20</guid>

					<description><![CDATA[<p>         Slides from a tech talk I gave about SAML 2.0 and Liferay</p>
<p>The post <a href="https://www.slideshare.net/koivimik/introduction-to-saml-20">Introduction to SAML 2.0</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[
        <br> Slides from a tech talk I gave about SAML 2.0 and Liferay
      <p>The post <a href="https://www.slideshare.net/koivimik/introduction-to-saml-20">Introduction to SAML 2.0</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		<enclosure length="0" type="" url=""/>

		<post-id xmlns="com-wordpress:feed-additions:1">8366</post-id>	</item>
		<item>
		<title>Introduction to SAML 2.0</title>
		<link>http://www.slideshare.net/koivimik/introduction-to-saml-20?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=introduction-to-saml-2-0</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Thu, 13 Oct 2011 18:05:59 +0000</pubDate>
				<guid isPermaLink="false">http://www.slideshare.net/koivimik/introduction-to-saml-20</guid>

					<description><![CDATA[<p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='120'%20height='90'%20viewBox=%270%200%20120%2090%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" style="background:linear-gradient(to right,#113253 25%,#113251 25% 50%,#133656 50% 75%,#133656 75%),linear-gradient(to right,#757d90 25%,#0e1623 25% 50%,#a5aebf 50% 75%,#0e162b 75%),linear-gradient(to right,#082543 25%,#0b233f 25% 50%,#092a49 50% 75%,#12395a 75%),linear-gradient(to right,#275f90 25%,#1e527a 25% 50%,#2d6ea4 50% 75%,#2a6ba1 75%)" width="120" height="90" data-tf-src="https://mikakoivisto.fi/wp-content/uploads/2016/04/introductiontosaml20-111013180601-phpapp01-thumbnail-2.jpg" class="tf_svg_lazy attachment-full size-full wp-post-image" alt="" decoding="async" data-tf-srcset="https://mikakoivisto.fi/wp-content/uploads/2016/04/introductiontosaml20-111013180601-phpapp01-thumbnail-2.jpg 120w, https://mikakoivisto.fi/wp-content/uploads/2016/04/introductiontosaml20-111013180601-phpapp01-thumbnail-2-666x500.jpg 666w, https://mikakoivisto.fi/wp-content/uploads/2016/04/introductiontosaml20-111013180601-phpapp01-thumbnail-2-533x400.jpg 533w" data-tf-sizes="(max-width: 120px) 100vw, 120px" /><noscript><img width="120" height="90" data-tf-not-load src="https://mikakoivisto.fi/wp-content/uploads/2016/04/introductiontosaml20-111013180601-phpapp01-thumbnail-2.jpg" class="attachment-full size-full wp-post-image" alt="" decoding="async" srcset="https://mikakoivisto.fi/wp-content/uploads/2016/04/introductiontosaml20-111013180601-phpapp01-thumbnail-2.jpg 120w, https://mikakoivisto.fi/wp-content/uploads/2016/04/introductiontosaml20-111013180601-phpapp01-thumbnail-2-666x500.jpg 666w, https://mikakoivisto.fi/wp-content/uploads/2016/04/introductiontosaml20-111013180601-phpapp01-thumbnail-2-533x400.jpg 533w" sizes="(max-width: 120px) 100vw, 120px" /></noscript></p>
<p>         Slides from a tech talk I gave about SAML 2.0 and Liferay</p>
<p>The post <a href="http://www.slideshare.net/koivimik/introduction-to-saml-20">Introduction to SAML 2.0</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='120'%20height='90'%20viewBox=%270%200%20120%2090%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" style="background:linear-gradient(to right,#113253 25%,#113251 25% 50%,#133656 50% 75%,#133656 75%),linear-gradient(to right,#757d90 25%,#0e1623 25% 50%,#a5aebf 50% 75%,#0e162b 75%),linear-gradient(to right,#082543 25%,#0b233f 25% 50%,#092a49 50% 75%,#12395a 75%),linear-gradient(to right,#275f90 25%,#1e527a 25% 50%,#2d6ea4 50% 75%,#2a6ba1 75%)" width="120" height="90" data-tf-src="https://mikakoivisto.fi/wp-content/uploads/2016/04/introductiontosaml20-111013180601-phpapp01-thumbnail-2.jpg" class="tf_svg_lazy attachment-full size-full wp-post-image" alt="" decoding="async" data-tf-srcset="https://mikakoivisto.fi/wp-content/uploads/2016/04/introductiontosaml20-111013180601-phpapp01-thumbnail-2.jpg 120w, https://mikakoivisto.fi/wp-content/uploads/2016/04/introductiontosaml20-111013180601-phpapp01-thumbnail-2-666x500.jpg 666w, https://mikakoivisto.fi/wp-content/uploads/2016/04/introductiontosaml20-111013180601-phpapp01-thumbnail-2-533x400.jpg 533w" data-tf-sizes="(max-width: 120px) 100vw, 120px" /><noscript><img width="120" height="90" data-tf-not-load src="https://mikakoivisto.fi/wp-content/uploads/2016/04/introductiontosaml20-111013180601-phpapp01-thumbnail-2.jpg" class="attachment-full size-full wp-post-image" alt="" decoding="async" srcset="https://mikakoivisto.fi/wp-content/uploads/2016/04/introductiontosaml20-111013180601-phpapp01-thumbnail-2.jpg 120w, https://mikakoivisto.fi/wp-content/uploads/2016/04/introductiontosaml20-111013180601-phpapp01-thumbnail-2-666x500.jpg 666w, https://mikakoivisto.fi/wp-content/uploads/2016/04/introductiontosaml20-111013180601-phpapp01-thumbnail-2-533x400.jpg 533w" sizes="(max-width: 120px) 100vw, 120px" /></noscript></p>
        <br> Slides from a tech talk I gave about SAML 2.0 and Liferay
      <p>The post <a href="http://www.slideshare.net/koivimik/introduction-to-saml-20">Introduction to SAML 2.0</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		<enclosure length="0" type="" url=""/>

		<post-id xmlns="com-wordpress:feed-additions:1">223</post-id>	</item>
		<item>
		<title>Overriding and adding struts actions from hook plugins</title>
		<link>https://mikakoivisto.fi/blog/2011/01/overriding-and-adding-struts-actions-from-hook-plugins/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=overriding-and-adding-struts-actions-from-hook-plugins</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Mon, 17 Jan 2011 22:23:27 +0000</pubDate>
				<category><![CDATA[Software & DevOps]]></category>
		<guid isPermaLink="false">https://web.liferay.com/web/mika.koivisto/blog/-/blogs/overriding-and-adding-struts-actions-from-hook-plugins</guid>

					<description><![CDATA[<p>This is a new cool feature I worked on with Brian and it&#8217;s coming on 6.1 as well as 6.0 EE SP2 and 5.2 EE SP6. With this feature you can add new struts actions to portal from a hook plugin and you can override any existing action with it.</p>
<p>There are two interfaces com.liferay.portal.kernel.struts.StrutsAction and com.liferay.portal.kernel.struts.StrutsPortletAction. The StrutsAction is used for regular struts actions like /c/portal/update_password and StrutsPortletAction is used for those that are used from portlets.</p>
<p>Let&#8217;s create a new simple hook to test it out. This hook will create a new struts path /c/portal/sample and wraps an existing struts action. Start by creating a new hook plugin in your plugins SDK. I&#8217;ll call it sample-struts-action.</p>
<pre><code>./create.sh sample-struts-action</code></pre>
<p>Next edit the liferay-hook.xml and add following fragment:</p>
<pre><code>&#60;?xml version="1.0"?&#62;
&#60;!DOCTYPE hook PUBLIC "-//Liferay//DTD Hook 6.1.0//EN" "http://www.liferay.com/dtd/liferay-hook_6_1_0.dtd"&#62;

&#60;hook&#62;
	&#60;portal-properties&#62;portal.properties&#60;/portal-properties&#62;
	&#60;custom-jsp-dir&#62;/META-INF/custom_jsps&#60;/custom-jsp-dir&#62;
	&#60;struts-action&#62;
		&#60;struts-action-path&#62;/portal/sample&#60;/struts-action-path&#62;
		&#60;struts-action-impl&#62;com.liferay.samplestrutsaction.hook.action.SampleStrutsAction&#60;/struts-action-impl&#62;
	&#60;/struts-action&#62;
	&#60;struts-action&#62;
		&#60;struts-action-path&#62;/message_boards/view&#60;/struts-action-path&#62;
		&#60;struts-action-impl&#62;com.liferay.samplestrutsaction.hook.action.SampleStrutsPortletAction&#60;/struts-action-impl&#62;
	&#60;/struts-action&#62;
&#60;/hook&#62;</code></pre>
<p>Next we need to create the struts action like below:</p>
<pre><code>package com.liferay.samplestrutsaction.hook.action;

import com.liferay.portal.kernel.struts.BaseStrutsAction;
import com.liferay.portal.kernel.util.ParamUtil;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author Mika Koivisto
 */
public class SampleStrutsAction extends BaseStrutsAction {

	public String execute(
		HttpServletRequest request, HttpServletResponse response)
		throws Exception {

		String name = ParamUtil.get(request, "name", "World");

		request.setAttribute("name", name);

		return "/portal/sample.jsp";
	}

}</code></pre>
<p>Next create the second Struts action. This one will actually wrap ViewAction of message boards portlet.</p>
<pre><code>package com.liferay.samplestrutsaction.hook.action;

import com.liferay.portal.kernel.struts.BaseStrutsPortletAction;
import com.liferay.portal.kernel.struts.StrutsPortletAction;

import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.PortletConfig;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
import javax.portlet.ResourceRequest;
import javax.portlet.ResourceResponse;

/**
 * @author Mika Koivisto
 */
public class SampleStrutsPortletAction extends BaseStrutsPortletAction {

	public void processAction(
			StrutsPortletAction originalStrutsPortletAction,
			PortletConfig portletConfig, ActionRequest actionRequest,
			ActionResponse actionResponse)
		throws Exception {

		originalStrutsPortletAction.processAction(
			originalStrutsPortletAction, portletConfig, actionRequest,
			actionResponse);
	}

	public String render(
			StrutsPortletAction originalStrutsPortletAction,
			PortletConfig portletConfig, RenderRequest renderRequest,
			RenderResponse renderResponse)
		throws Exception {

		System.out.println("Wrapped /message_boards/view action");

		return originalStrutsPortletAction.render(
			null, portletConfig, renderRequest, renderResponse);
	}

	public void serveResource(
			StrutsPortletAction originalStrutsPortletAction,
			PortletConfig portletConfig, ResourceRequest resourceRequest,
			ResourceResponse resourceResponse)
		throws Exception {

		originalStrutsPortletAction.serveResource(
			originalStrutsPortletAction, portletConfig, resourceRequest,
			resourceResponse);
	}

}</code></pre>
<p>Then we need to create the JSP in docroot/META-INF/custom_jsps/html/portal/sample.jsp</p>
<p>Hello !</p>
<p>And lastly we need to create portal.properties in docroot/WEB-INF/src</p>
<pre><code>auth.public.paths=/portal/sample</code></pre>
<p>Now we are ready to deploy the plugin and see if it works. Just run ant deploy in your plugins sdk to deploy it.</p>
<p>You should see following in your tomcat console:</p>
<pre><code>22:01:29,635 INFO  [AutoDeployDir:167] Processing sample-struts-action-hook-6.1.0.1.war
22:01:29,638 INFO  [HookAutoDeployListener:43] Copying web plugin for /Users/mika/Development/Liferay/git/bundles/deploy/sample-struts-action-hook-6.1.0.1.war
  Expanding: /Users/mika/Development/Liferay/git/bundles/deploy/sample-struts-action-hook-6.1.0.1.war into /Users/mika/Development/Liferay/git/bundles/tomcat-6.0.29/temp/20110117220130299
  Copying 1 file to /Users/mika/Development/Liferay/git/bundles/tomcat-6.0.29/temp/20110117220130299/WEB-INF/classes
  Copying 1 file to /Users/mika/Development/Liferay/git/bundles/tomcat-6.0.29/temp/20110117220130299/WEB-INF/classes
  Copying 1 file to /Users/mika/Development/Liferay/git/bundles/tomcat-6.0.29/temp/20110117220130299/WEB-INF
  Copying 1 file to /Users/mika/Development/Liferay/git/bundles/tomcat-6.0.29/temp/20110117220130299/META-INF
  Copying 12 files to /Users/mika/Development/Liferay/git/bundles/tomcat-6.0.29/webapps/sample-struts-action-hook
  Copying 1 file to /Users/mika/Development/Liferay/git/bundles/tomcat-6.0.29/webapps/sample-struts-action-hook
  Deleting directory /Users/mika/Development/Liferay/git/bundles/tomcat-6.0.29/temp/20110117220130299
22:01:30,486 INFO  [HookAutoDeployListener:49] Hook for /Users/mika/Development/Liferay/git/bundles/deploy/sample-struts-action-hook-6.1.0.1.war copied successfully. Deployment will start in a few seconds.
Jan 17, 2011 10:01:39 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory sample-struts-action-hook
22:01:39,727 INFO  [PluginPackageUtil:1080] Reading plugin package for sample-struts-action-hook
22:01:39,759 INFO  [HookHotDeployListener:432] Registering hook for sample-struts-action-hook
22:01:39,770 INFO  [HookHotDeployListener:717] Hook for sample-struts-action-hook is available for use</code></pre>
<p>Now try to access http://localhost:8080/c/portal/sample. It will ask you to sign in and once you sign in you should see the message Hello World! in your browser. You can add a paramer name to the url to change the message. If you access message boards it will print the message "Wrapped /message_boards/view action" in tomcat console and continue to render message boards as if nothing was changed.</p>
<p>Now our sample was really simple one. The return value from the execute method is the view where the request is dispatched next. This can be path to JSP, an existing struts forward or tiles definition. Returning null means that your action has handled the view already. Now you could try to return for instance portal.terms_of_use to display the terms of use.</p>
<p>You can download this sample plugin from svn://svn.liferay.com/repos/public/plugins/trunk/hooks/sample-struts-action-hook. The username is guest and password is empty.</p>
<p><b>UPDATE:</b> We changed the API so that the original action is passed in so that you can also wrap it with your own logic instead of replacing. I also added a new hook property auth.public.paths so it allows you to set new public paths from hooks. I also added a StrutsPortletAction into to the sample and that demonstrates wrapping an existing action.</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2011/01/overriding-and-adding-struts-actions-from-hook-plugins/">Overriding and adding struts actions from hook plugins</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>This is a new cool feature I worked on with Brian and it’s coming on 6.1 as well as 6.0 EE SP2 and 5.2 EE SP6. With this feature you can add new struts actions to portal from a hook plugin and you can override any existing action with it.</p>
<p>There are two interfaces com.liferay.portal.kernel.struts.StrutsAction and com.liferay.portal.kernel.struts.StrutsPortletAction. The StrutsAction is used for regular struts actions like /c/portal/update_password and StrutsPortletAction is used for those that are used from portlets.<span id="more-280"></span></p>
<p>Let’s create a new simple hook to test it out. This hook will create a new struts path /c/portal/sample and wraps an existing struts action. Start by creating a new hook plugin in your plugins SDK. I’ll call it sample-struts-action.</p>
<pre><code>./create.sh sample-struts-action</code></pre>
<p>Next edit the liferay-hook.xml and add following fragment:</p>
<pre><code>&lt;?xml version="1.0"?&gt;
&lt;!DOCTYPE hook PUBLIC "-//Liferay//DTD Hook 6.1.0//EN" "http://www.liferay.com/dtd/liferay-hook_6_1_0.dtd"&gt;

&lt;hook&gt;
	&lt;portal-properties&gt;portal.properties&lt;/portal-properties&gt;
	&lt;custom-jsp-dir&gt;/META-INF/custom_jsps&lt;/custom-jsp-dir&gt;
	&lt;struts-action&gt;
		&lt;struts-action-path&gt;/portal/sample&lt;/struts-action-path&gt;
		&lt;struts-action-impl&gt;com.liferay.samplestrutsaction.hook.action.SampleStrutsAction&lt;/struts-action-impl&gt;
	&lt;/struts-action&gt;
	&lt;struts-action&gt;
		&lt;struts-action-path&gt;/message_boards/view&lt;/struts-action-path&gt;
		&lt;struts-action-impl&gt;com.liferay.samplestrutsaction.hook.action.SampleStrutsPortletAction&lt;/struts-action-impl&gt;
	&lt;/struts-action&gt;
&lt;/hook&gt;</code></pre>
<p>Next we need to create the struts action like below:</p>
<pre><code>package com.liferay.samplestrutsaction.hook.action;

import com.liferay.portal.kernel.struts.BaseStrutsAction;
import com.liferay.portal.kernel.util.ParamUtil;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author Mika Koivisto
 */
public class SampleStrutsAction extends BaseStrutsAction {

	public String execute(
		HttpServletRequest request, HttpServletResponse response)
		throws Exception {

		String name = ParamUtil.get(request, "name", "World");

		request.setAttribute("name", name);

		return "/portal/sample.jsp";
	}

}</code></pre>
<p>Next create the second Struts action. This one will actually wrap ViewAction of message boards portlet.</p>
<pre><code>package com.liferay.samplestrutsaction.hook.action;

import com.liferay.portal.kernel.struts.BaseStrutsPortletAction;
import com.liferay.portal.kernel.struts.StrutsPortletAction;

import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.PortletConfig;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
import javax.portlet.ResourceRequest;
import javax.portlet.ResourceResponse;

/**
 * @author Mika Koivisto
 */
public class SampleStrutsPortletAction extends BaseStrutsPortletAction {

	public void processAction(
			StrutsPortletAction originalStrutsPortletAction,
			PortletConfig portletConfig, ActionRequest actionRequest,
			ActionResponse actionResponse)
		throws Exception {

		originalStrutsPortletAction.processAction(
			originalStrutsPortletAction, portletConfig, actionRequest,
			actionResponse);
	}

	public String render(
			StrutsPortletAction originalStrutsPortletAction,
			PortletConfig portletConfig, RenderRequest renderRequest,
			RenderResponse renderResponse)
		throws Exception {

		System.out.println("Wrapped /message_boards/view action");

		return originalStrutsPortletAction.render(
			null, portletConfig, renderRequest, renderResponse);
	}

	public void serveResource(
			StrutsPortletAction originalStrutsPortletAction,
			PortletConfig portletConfig, ResourceRequest resourceRequest,
			ResourceResponse resourceResponse)
		throws Exception {

		originalStrutsPortletAction.serveResource(
			originalStrutsPortletAction, portletConfig, resourceRequest,
			resourceResponse);
	}

}</code></pre>
<p>Then we need to create the JSP in docroot/META-INF/custom_jsps/html/portal/sample.jsp</p>
<p>Hello !</p>
<p>And lastly we need to create portal.properties in docroot/WEB-INF/src</p>
<pre><code>auth.public.paths=/portal/sample</code></pre>
<p>Now we are ready to deploy the plugin and see if it works. Just run ant deploy in your plugins sdk to deploy it.</p>
<p>You should see following in your tomcat console:</p>
<pre><code>22:01:29,635 INFO  [AutoDeployDir:167] Processing sample-struts-action-hook-6.1.0.1.war
22:01:29,638 INFO  [HookAutoDeployListener:43] Copying web plugin for /Users/mika/Development/Liferay/git/bundles/deploy/sample-struts-action-hook-6.1.0.1.war
  Expanding: /Users/mika/Development/Liferay/git/bundles/deploy/sample-struts-action-hook-6.1.0.1.war into /Users/mika/Development/Liferay/git/bundles/tomcat-6.0.29/temp/20110117220130299
  Copying 1 file to /Users/mika/Development/Liferay/git/bundles/tomcat-6.0.29/temp/20110117220130299/WEB-INF/classes
  Copying 1 file to /Users/mika/Development/Liferay/git/bundles/tomcat-6.0.29/temp/20110117220130299/WEB-INF/classes
  Copying 1 file to /Users/mika/Development/Liferay/git/bundles/tomcat-6.0.29/temp/20110117220130299/WEB-INF
  Copying 1 file to /Users/mika/Development/Liferay/git/bundles/tomcat-6.0.29/temp/20110117220130299/META-INF
  Copying 12 files to /Users/mika/Development/Liferay/git/bundles/tomcat-6.0.29/webapps/sample-struts-action-hook
  Copying 1 file to /Users/mika/Development/Liferay/git/bundles/tomcat-6.0.29/webapps/sample-struts-action-hook
  Deleting directory /Users/mika/Development/Liferay/git/bundles/tomcat-6.0.29/temp/20110117220130299
22:01:30,486 INFO  [HookAutoDeployListener:49] Hook for /Users/mika/Development/Liferay/git/bundles/deploy/sample-struts-action-hook-6.1.0.1.war copied successfully. Deployment will start in a few seconds.
Jan 17, 2011 10:01:39 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory sample-struts-action-hook
22:01:39,727 INFO  [PluginPackageUtil:1080] Reading plugin package for sample-struts-action-hook
22:01:39,759 INFO  [HookHotDeployListener:432] Registering hook for sample-struts-action-hook
22:01:39,770 INFO  [HookHotDeployListener:717] Hook for sample-struts-action-hook is available for use</code></pre>
<p>Now try to access http://localhost:8080/c/portal/sample. It will ask you to sign in and once you sign in you should see the message Hello World! in your browser. You can add a paramer name to the url to change the message. If you access message boards it will print the message &#8220;Wrapped /message_boards/view action&#8221; in tomcat console and continue to render message boards as if nothing was changed.</p>
<p>Now our sample was really simple one. The return value from the execute method is the view where the request is dispatched next. This can be path to JSP, an existing struts forward or tiles definition. Returning null means that your action has handled the view already. Now you could try to return for instance portal.terms_of_use to display the terms of use.</p>
<p>You can download this sample plugin from svn://svn.liferay.com/repos/public/plugins/trunk/hooks/sample-struts-action-hook. The username is guest and password is empty.</p>
<p><b>UPDATE:</b> We changed the API so that the original action is passed in so that you can also wrap it with your own logic instead of replacing. I also added a new hook property auth.public.paths so it allows you to set new public paths from hooks. I also added a StrutsPortletAction into to the sample and that demonstrates wrapping an existing action.</p>
<p>This post was originally published on <a href="https://web.liferay.com/web/mika.koivisto/blog/-/blogs/overriding-and-adding-struts-actions-from-hook-plugins">Liferay blog</a>.</p>
<div id="themify_builder_content-280" data-postid="280" class="themify_builder_content themify_builder_content-280 themify_builder themify_builder_front"></div>
<p><!-- /themify_builder_content --></p>
<p>The post <a href="https://mikakoivisto.fi/blog/2011/01/overriding-and-adding-struts-actions-from-hook-plugins/">Overriding and adding struts actions from hook plugins</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		<enclosure length="0" type="" url=""/>

		<post-id xmlns="com-wordpress:feed-additions:1">43288</post-id>	</item>
		<item>
		<title>How do I cluster Liferay with Terracotta?</title>
		<link>https://mikakoivisto.fi/blog/2010/09/how-do-i-cluster-liferay-with-terracotta/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=how-do-i-cluster-liferay-with-terracotta</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Wed, 01 Sep 2010 03:32:59 +0000</pubDate>
				<category><![CDATA[Software & DevOps]]></category>
		<guid isPermaLink="false">https://web.liferay.com/web/mika.koivisto/blog/-/blogs/how-do-i-cluster-liferay-with-terracotta-</guid>

					<description><![CDATA[<p>That's a question I've head many times and in this post I will show you &#160;just how to do that. These instructions are for Liferay 6 CE GA3 Tomcat 6.0 bundle however you can use any app server supported by Terracotta but the location and some configuration might be slightly different. So to get started you need to download:</p>
<ul>
<li><a href="http://www.liferay.com/downloads/liferay-portal/overview">Liferay Portal 6 GA3 bundled with Tomcat</a></li>
<li><a href="http://www.terracotta.org/dl">Terracotta 3.3.0 open source edition</a></li>
</ul>
<p>Next step is to install Liferay and Terracotta. For the purposes of this post I won't go into great detail with the installation as both Terracotta and Liferay has good documentation. Basically the installation consist of unpacking the packages to a directory. From now on I will refer to those locations as LIFERAY_HOME and TERRACOTTA_HOME and inside LIFERAY_HOME we will have tomcat directory which I will refer as TOMCAT_HOME. Normally you would also install Liferay and Terracotta in separate servers but I will post a separate post addressing the recommended architecture. For now we can install everything on the same machine and run Terracotta with default configuration for development purposes.</p>
<p>Normally when clustering Liferay you need to address following components: EhCache and Hibernate, Quartz Scheduler, Document Library, Search Engine and optionally Session Replication. For Document Library and Search Engine Terracotta doesn't offer anything new so you make those centrally available the same way as before. For example SAN for DL and SOLR for Search and Indexing. So we are left with EhCache and Hibernate, Quartz and Session Replication that we can address with Terracotta.&#160;</p>
<h4><strong>EhCache and Hibernate Second Level Cache</strong></h4>
<ol>
<li>&#160;Remove ehcache.jar&#160;that is bundled with Liferay (located in TOMCAT_HOME/webapps/ROOT/WEB-INF/lib)</li>
<li>Copy all jars in TERRACOTTA_HOME/ehcache/lib to TOMCAT_HOME/webapps/ROOT/WEB-INF/lib</li>
<li>Copy TERRACOTTA_HOME/common/terracotta-toolkit-1.0-runtime-&#60;version&#62;.jar to TOMCAT_HOME/webapps/ROOT/WEB-INF/lib</li>
<li>Create my-ehcache folder to TOMCAT_HOME/webapps/ROOT/WEB-INF/classes</li>
<li>Create a hibernate-terracotta.xml and a liferay-multi-vm-terracotta.xml.</li>
<li>Adjust terracottaConfig in <a href="https://web.liferay.com/c/document_library/get_file?uuid=cacbc0f0-acd8-429d-b245-08364daa2366&#38;groupId=25248">hibernate-terracotta.xml</a> and <a href="https://web.liferay.com/c/document_library/get_file?uuid=07bacc10-7331-4275-8a22-e307cab263c6&#38;groupId=25248">liferay-multi-vm-terracotta.xml</a> to point to your Terracotta servers. Like this: &#60;terracottaConfig url="localhost:9510"/&#62;</li>
<li>Add following properties to your portal-ext.properties file:
<pre>
ehcache.multi.vm.config.location=/my-ehcache/liferay-multi-vm-terracotta.xml
&#8232;net.sf.ehcache.configurationResourceName=/my-ehcache/hibernate-terracotta.xml
&#8232;hibernate.cache.region.factory_class=net.sf.ehcache.hibernate.EhCacheRegionFactory</pre>
</li>
</ol>
<h4><strong>Quartz</strong></h4>
<ol>
<li>Remove quartz.jar that is bundled with Liferay (located in TOMCAT_HOME/webapps/ROOT/WEB-INF/lib)</li>
<li>Copy TERRACOTTA_HOME/quartz/quartz-terracotta-&#60;version&#62;.jar and quartz-all-&#60;version&#62;.jar to TOMCAT_HOME/webapps/ROOT/WEB-INF/lib</li>
<li>Add following properties to your portal-ext.properties:
<pre>
org.quartz.jobStore.class = org.terracotta.quartz.TerracottaJobStore
&#8232;org.quartz.jobStore.tcConfigUrl = localhost:9510</pre>
</li>
<li>Extract portal.properties from portal-impl.jar and place it in TOMCAT_HOME/webapps/ROOT/WEB-INF/classes</li>
<li>Comment out following properties in portal.properties
<pre>
#org.quartz.jobStore.dataSource=ds&#8232;
#org.quartz.jobStore.isClustered=false
&#8232;#org.quartz.jobStore.misfireThreshold=60000
&#8232;#org.quartz.jobStore.tablePrefix=QUARTZ_
&#8232;#org.quartz.jobStore.useProperties=false</pre>
</li>
</ol>
<h4><strong>Session Replication</strong></h4>
<p>This is highly container specific so refer to Terracotta documentation for specific instructions. Following steps are for Tomcat 6.0.</p>
<ol>
<li>Copy TERRACOTTA_HOME/sessions/terracotta-session-&#60;version&#62;.jar to TOMCAT_HOME/lib</li>
<li>Copy TERRACOTTA_HOME/common/terracotta-toolkit-1.0-runtime-&#60;version&#62;.jar to TOMCAT_HOME/lib</li>
<li>Edit TOMCAT_HOME/conf/Catalina/localhost/ROOT.xml and add following line right after &#60;Context&#62;
<pre>
&#8232;&#60;Valve className="org.terracotta.session.TerracottaTomcat60xSessionValve" tcConfigUrl="localhost:9510"/&#62;</pre>
</li>
</ol>
<h4><strong>Testing The Configuration</strong></h4>
<p>Testing your configuration is simple:</p>
<ol>
<li>Startup your Terracotta Server
<pre>
TERRACOTTA_HOME/bin/start-tc-server.sh</pre>
</li>
<li>Startup your Tomcat
<pre>
TOMCAT_HOME/bin/startup.sh</pre>
</li>
<li>Before Tomcat has fully started you should see following lines in your Tomcat console log:
<pre>
2010-09-01 21:35:40,059 INFO - Terracotta 3.3.0, as of 20100716-140706 (Revision 15922 by cruise@rh5mo0 from 3.3)
2010-09-01 21:35:40,566 INFO - Successfully loaded base configuration from server at 'localhost:9510'.</pre>
</li>
<li>Now browse http://localhost:8080 to verify that your portal is running.&#160;</li>
<li>Now launch Terracotta Developer Console to verify that EhCache, Hibernate, Quartz and Sessions are seen by Terracotta. You can launch dev console with following command:
<pre>
TERRACOTTA_HOME/bin/dev-console.sh</pre>
</li>
<li>Once you are connected to your Terracotta you should see Ehcache, Hibernate, Quartz and Sessions under My application which indicates that all of them are connected and recognized by Terracotta. Now you can use Dev Console to see what's inside your cache or session.&#160;
</li>
</ol>
<h4><strong>Closing Remarks</strong></h4>
<p>Now as you can see it is quite easy the cluster Liferay with Terracotta express installation. Now if you want to use the DSO approach it is whole another beast as it involves tedious instrumentation. If you are a Liferay EE customer and want to get supported version of both Liferay and Terracotta contact your Liferay sales rep and ask about Liferay Terracotta Edition.&#160;</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2010/09/how-do-i-cluster-liferay-with-terracotta/">How do I cluster Liferay with Terracotta?</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>That&#8217;s a question I&#8217;ve head many times and in this post I will show you  just how to do that. These instructions are for Liferay 6 CE GA3 Tomcat 6.0 bundle however you can use any app server supported by Terracotta but the location and some configuration might be slightly different. So to get started you need to download:<span id="more-282"></span></p>
<ul>
<li><a href="http://www.liferay.com/downloads/liferay-portal/overview">Liferay Portal 6 GA3 bundled with Tomcat</a></li>
<li><a href="http://www.terracotta.org/dl">Terracotta 3.3.0 open source edition</a></li>
</ul>
<p>Next step is to install Liferay and Terracotta. For the purposes of this post I won&#8217;t go into great detail with the installation as both Terracotta and Liferay has good documentation. Basically the installation consist of unpacking the packages to a directory. From now on I will refer to those locations as LIFERAY_HOME and TERRACOTTA_HOME and inside LIFERAY_HOME we will have tomcat directory which I will refer as TOMCAT_HOME. Normally you would also install Liferay and Terracotta in separate servers but I will post a separate post addressing the recommended architecture. For now we can install everything on the same machine and run Terracotta with default configuration for development purposes.</p>
<p>Normally when clustering Liferay you need to address following components: EhCache and Hibernate, Quartz Scheduler, Document Library, Search Engine and optionally Session Replication. For Document Library and Search Engine Terracotta doesn&#8217;t offer anything new so you make those centrally available the same way as before. For example SAN for DL and SOLR for Search and Indexing. So we are left with EhCache and Hibernate, Quartz and Session Replication that we can address with Terracotta.</p>
<h4><strong>EhCache and Hibernate Second Level Cache</strong></h4>
<ol>
<li> Remove ehcache.jar that is bundled with Liferay (located in TOMCAT_HOME/webapps/ROOT/WEB-INF/lib)</li>
<li>Copy all jars in TERRACOTTA_HOME/ehcache/lib to TOMCAT_HOME/webapps/ROOT/WEB-INF/lib</li>
<li>Copy TERRACOTTA_HOME/common/terracotta-toolkit-1.0-runtime-&lt;version&gt;.jar to TOMCAT_HOME/webapps/ROOT/WEB-INF/lib</li>
<li>Create my-ehcache folder to TOMCAT_HOME/webapps/ROOT/WEB-INF/classes</li>
<li>Create a hibernate-terracotta.xml and a liferay-multi-vm-terracotta.xml.</li>
<li>Adjust terracottaConfig in <a href="https://web.liferay.com/c/document_library/get_file?uuid=cacbc0f0-acd8-429d-b245-08364daa2366&amp;groupId=25248">hibernate-terracotta.xml</a> and <a href="https://web.liferay.com/c/document_library/get_file?uuid=07bacc10-7331-4275-8a22-e307cab263c6&amp;groupId=25248">liferay-multi-vm-terracotta.xml</a> to point to your Terracotta servers. Like this: &lt;terracottaConfig url=&#8221;localhost:9510&#8243;/&gt;</li>
<li>Add following properties to your portal-ext.properties file:
<pre>ehcache.multi.vm.config.location=/my-ehcache/liferay-multi-vm-terracotta.xml
 net.sf.ehcache.configurationResourceName=/my-ehcache/hibernate-terracotta.xml
 hibernate.cache.region.factory_class=net.sf.ehcache.hibernate.EhCacheRegionFactory</pre>
</li>
</ol>
<h4><strong>Quartz</strong></h4>
<ol>
<li>Remove quartz.jar that is bundled with Liferay (located in TOMCAT_HOME/webapps/ROOT/WEB-INF/lib)</li>
<li>Copy TERRACOTTA_HOME/quartz/quartz-terracotta-&lt;version&gt;.jar and quartz-all-&lt;version&gt;.jar to TOMCAT_HOME/webapps/ROOT/WEB-INF/lib</li>
<li>Add following properties to your portal-ext.properties:
<pre>org.quartz.jobStore.class = org.terracotta.quartz.TerracottaJobStore
 org.quartz.jobStore.tcConfigUrl = localhost:9510</pre>
</li>
<li>Extract portal.properties from portal-impl.jar and place it in TOMCAT_HOME/webapps/ROOT/WEB-INF/classes</li>
<li>Comment out following properties in portal.properties
<pre>#org.quartz.jobStore.dataSource=ds 
#org.quartz.jobStore.isClustered=false
 #org.quartz.jobStore.misfireThreshold=60000
 #org.quartz.jobStore.tablePrefix=QUARTZ_
 #org.quartz.jobStore.useProperties=false</pre>
</li>
</ol>
<h4><strong>Session Replication</strong></h4>
<p>This is highly container specific so refer to Terracotta documentation for specific instructions. Following steps are for Tomcat 6.0.</p>
<ol>
<li>Copy TERRACOTTA_HOME/sessions/terracotta-session-&lt;version&gt;.jar to TOMCAT_HOME/lib</li>
<li>Copy TERRACOTTA_HOME/common/terracotta-toolkit-1.0-runtime-&lt;version&gt;.jar to TOMCAT_HOME/lib</li>
<li>Edit TOMCAT_HOME/conf/Catalina/localhost/ROOT.xml and add following line right after &lt;Context&gt;
<pre> &lt;Valve className="org.terracotta.session.TerracottaTomcat60xSessionValve" tcConfigUrl="localhost:9510"/&gt;</pre>
</li>
</ol>
<h4><strong>Testing The Configuration</strong></h4>
<p>Testing your configuration is simple:</p>
<ol>
<li>Startup your Terracotta Server
<pre>TERRACOTTA_HOME/bin/start-tc-server.sh</pre>
</li>
<li>Startup your Tomcat
<pre>TOMCAT_HOME/bin/startup.sh</pre>
</li>
<li>Before Tomcat has fully started you should see following lines in your Tomcat console log:
<pre>2010-09-01 21:35:40,059 INFO - Terracotta 3.3.0, as of 20100716-140706 (Revision 15922 by cruise@rh5mo0 from 3.3)
2010-09-01 21:35:40,566 INFO - Successfully loaded base configuration from server at 'localhost:9510'.</pre>
</li>
<li>Now browse http://localhost:8080 to verify that your portal is running.</li>
<li>Now launch Terracotta Developer Console to verify that EhCache, Hibernate, Quartz and Sessions are seen by Terracotta. You can launch dev console with following command:
<pre>TERRACOTTA_HOME/bin/dev-console.sh</pre>
</li>
<li>Once you are connected to your Terracotta you should see Ehcache, Hibernate, Quartz and Sessions under My application which indicates that all of them are connected and recognized by Terracotta. Now you can use Dev Console to see what&#8217;s inside your cache or session<br />
<a href="https://jguru.fi/wp-content/uploads/2010/09/terracotta_dev_console_sessions.png"><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='569'%20height='364'%20viewBox=%270%200%20569%20364%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" decoding="async" class="tf_svg_lazy size-full wp-image-326 alignnone" data-tf-src="https://jguru.fi/wp-content/uploads/2010/09/terracotta_dev_console_sessions.png" alt="" width="569" height="364" data-tf-srcset="https://jguru.fi/wp-content/uploads/2010/09/terracotta_dev_console_sessions.png 569w, https://jguru.fi/wp-content/uploads/2010/09/terracotta_dev_console_sessions-300x192.png 300w" data-tf-sizes="(max-width: 569px) 100vw, 569px" /><noscript><img decoding="async" class="size-full wp-image-326 alignnone" data-tf-not-load src="https://jguru.fi/wp-content/uploads/2010/09/terracotta_dev_console_sessions.png" alt="" width="569" height="364" srcset="https://jguru.fi/wp-content/uploads/2010/09/terracotta_dev_console_sessions.png 569w, https://jguru.fi/wp-content/uploads/2010/09/terracotta_dev_console_sessions-300x192.png 300w" sizes="(max-width: 569px) 100vw, 569px" /></noscript></a></li>
</ol>
<h4><strong>Closing Remarks</strong></h4>
<p>Now as you can see it is quite easy the cluster Liferay with Terracotta express installation. Now if you want to use the DSO approach it is whole another beast as it involves tedious instrumentation. If you are a Liferay EE customer and want to get supported version of both Liferay and Terracotta contact your Liferay sales rep and ask about Liferay Terracotta Edition.</p>
<p>This post was originally published on <a href="https://web.liferay.com/web/mika.koivisto/blog/-/blogs/how-do-i-cluster-liferay-with-terracotta-">Liferay blog</a>.</p>
<div id="themify_builder_content-282" data-postid="282" class="themify_builder_content themify_builder_content-282 themify_builder themify_builder_front"></div>
<p><!-- /themify_builder_content --></p>
<p>The post <a href="https://mikakoivisto.fi/blog/2010/09/how-do-i-cluster-liferay-with-terracotta/">How do I cluster Liferay with Terracotta?</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		<enclosure length="0" type="" url=""/>

		<post-id xmlns="com-wordpress:feed-additions:1">43290</post-id>	</item>
		<item>
		<title>Using Freemarker in your theme templates</title>
		<link>https://mikakoivisto.fi/blog/2010/08/using-freemarker-in-your-theme-templates/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=using-freemarker-in-your-theme-templates</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Tue, 24 Aug 2010 18:21:23 +0000</pubDate>
				<category><![CDATA[Software & DevOps]]></category>
		<guid isPermaLink="false">https://web.liferay.com/web/mika.koivisto/blog/-/blogs/using-freemarker-in-your-theme-templates</guid>

					<description><![CDATA[<p>Freemarker is a template language very similar to Velocity. Starting from Liferay 6.0 Liferay supports also Freemarker templates in themes and Web Content templates. In this post I will show how you can use Freemarker in your themes.</p>
<h4><strong>Getting started</strong></h4>
<p>To get started you'll need Liferay Portal 6.0 GA3 as well as corresponding Plugins SDK. Once you have setup your Portal and Plugins SDK we can start by creating a new theme plugin in PLUGINS_SDK_ROOT/themes folder.</p>
<p>To create the theme issue following command:</p>
<pre>
./create.[sh&#124;bat] my-freemarker "My Freemarker"</pre>
<p>Then go to my-freemarker-theme directory and open build.xml in your favorite editor.</p>
<p>In build.xml add theme.type property with value ftl above theme.parent property like this:</p>
<pre>
&#60;property name="theme.type" value="ftl"&#62;&#60;/property&#62;
&#60;property name="theme.parent" value="_styled"&#62;&#60;/property&#62;</pre>
<p>Then you need to create docroot/WEB-INF/liferay-look-and-feel.xml with following contents:</p>
<pre>
&#60;?xml version="1.0"?&#62;
&#60;!DOCTYPE look-and-feel PUBLIC "-//Liferay//DTD Look and Feel 6.0.0//EN" "http://www.liferay.com/dtd/liferay-look-and-feel_6_0_0.dtd"&#62;

&#60;look-and-feel&#62;
	&#60;compatibility&#62;
		&#60;version&#62;6.0.0+&#60;/version&#62;
	&#60;/compatibility&#62;
	&#60;theme id="my-freemarker-theme" name="My Freemarker"&#62;
		&#60;template-extension&#62;ftl&#60;/template-extension&#62;
	&#60;/theme&#62;
&#60;/look-and-feel&#62;</pre>
<p>Now you run:</p>
<pre>
ant deploy</pre>
<p>Congratulations you&#8217;ve just made your first Freemarker based theme. Now you can override base theme files in docroot/_diffs folder just as you would normally except template files now have extension .ftl instead of .vm.</p>
<h4><strong>Freemarker syntax</strong></h4>
<p>Freemarker syntax is slightly different from Velocity and it is much more strict. With Freemarker you won't be able to get a way with trying to use undefined variables and you should also note that null value means it's undefined. To test if value exists you can use double question mark after the variable name like this:</p>
<pre>
&#60;#if someVariableName??&#62;
Variable exists
&#60;/#if&#62;</pre>
<p>For full syntax reference check out <a href="http://www.freemarker.org/">Freemarker website</a>.</p>
<h4><strong>Pre-defined theme variables</strong></h4>
<p>Most of the variables present for Velocity templates are also available for Freemarker templates. Only Velocity specific tools were removed you can accomplish everything and more with Freemarker build-ins. Here's some examples how to format a java.util.Date type variable with Freemarker build-ins:</p>
<pre>
${lastUpdated?string("yyyy-MM-dd HH:mm:ss zzzz")}
${lastUpdated?string("EEE, MMM d, ''yy")}
${lastUpdated?string("EEEE, MMMM dd, yyyy, hh:mm:ss a '('zzz')'")}</pre>
<p>You can find all the variables available for Freemarker templates from com.liferay.portal.freemarker.FreeMarkerVariables class and docroot/html/themes/_unstyled/init.ftl</p>
<h4><strong>Macro libraries</strong></h4>
<p>Most of the macros available to Velocity templates are also available for Freemarker templates. The only difference is the syntax how they are used. We provide a macro library with namespace liferay so that it won't get mixed with your own macros. You can take a look at portal-impl/src/FTL_liferay.ftl to see full list of macros and use it as an example to build your own macros. Here are some commonly used macros:</p>
<pre>
&#60;@liferay.css file_name=&#8220;some.css&#8221; /&#62;

&#60;@liferay.js file_name=&#8220;some.js&#8221; /&#62;

&#60;@liferay.language key=&#8220;my-key&#8221; /&#62;

&#60;@liferay.breadcrumb /&#62;

&#60;@liferay.docbar /&#62; </pre>
<h4><strong>Tag libraries</strong></h4>
<p>Yes, you read it correctly. You can use taglibs in your Freemarker templates. This is something unique to Freemarker and it is limited to only templates in themes. To import a portal taglib to your template just add following line to your template:</p>
<pre>
&#60;#assign aui=PortalJspTagLibs["/WEB-INF/tld/liferay-aui.tld"]&#62;</pre>
<p>Now you can use any tag within that taglib just if it was a macro library. Here's an example how to add a Alloy UI input field:</p>
<pre>
&#60;@aui.input name=&#8220;aStringLiteral&#8221; label=&#8220;Test&#8221; /&#62;</pre>
<p>Have fun trying this out and if you find any glitches do report them to our <a href="http://issues.liferay.com/browse/LPS">issue tracker</a>.</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2010/08/using-freemarker-in-your-theme-templates/">Using Freemarker in your theme templates</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Freemarker is a template language very similar to Velocity. Starting from Liferay 6.0 Liferay supports also Freemarker templates in themes and Web Content templates. In this post I will show how you can use Freemarker in your themes.<span id="more-284"></span></p>
<h4><strong>Getting started</strong></h4>
<p>To get started you&#8217;ll need Liferay Portal 6.0 GA3 as well as corresponding Plugins SDK. Once you have setup your Portal and Plugins SDK we can start by creating a new theme plugin in PLUGINS_SDK_ROOT/themes folder.</p>
<p>To create the theme issue following command:</p>
<pre>./create.[sh|bat] my-freemarker "My Freemarker"</pre>
<p>Then go to my-freemarker-theme directory and open build.xml in your favorite editor.</p>
<p>In build.xml add theme.type property with value ftl above theme.parent property like this:</p>
<pre>&lt;property name="theme.type" value="ftl"&gt;&lt;/property&gt;
&lt;property name="theme.parent" value="_styled"&gt;&lt;/property&gt;</pre>
<p>Then you need to create docroot/WEB-INF/liferay-look-and-feel.xml with following contents:</p>
<pre>&lt;?xml version="1.0"?&gt;
&lt;!DOCTYPE look-and-feel PUBLIC "-//Liferay//DTD Look and Feel 6.0.0//EN" "http://www.liferay.com/dtd/liferay-look-and-feel_6_0_0.dtd"&gt;

&lt;look-and-feel&gt;
	&lt;compatibility&gt;
		&lt;version&gt;6.0.0+&lt;/version&gt;
	&lt;/compatibility&gt;
	&lt;theme id="my-freemarker-theme" name="My Freemarker"&gt;
		&lt;template-extension&gt;ftl&lt;/template-extension&gt;
	&lt;/theme&gt;
&lt;/look-and-feel&gt;</pre>
<p>Now you run:</p>
<pre>ant deploy</pre>
<p>Congratulations you’ve just made your first Freemarker based theme. Now you can override base theme files in docroot/_diffs folder just as you would normally except template files now have extension .ftl instead of .vm.</p>
<h4><strong>Freemarker syntax</strong></h4>
<p>Freemarker syntax is slightly different from Velocity and it is much more strict. With Freemarker you won&#8217;t be able to get a way with trying to use undefined variables and you should also note that null value means it&#8217;s undefined. To test if value exists you can use double question mark after the variable name like this:</p>
<pre>&lt;#if someVariableName??&gt;
Variable exists
&lt;/#if&gt;</pre>
<p>For full syntax reference check out <a href="http://www.freemarker.org/">Freemarker website</a>.</p>
<h4><strong>Pre-defined theme variables</strong></h4>
<p>Most of the variables present for Velocity templates are also available for Freemarker templates. Only Velocity specific tools were removed you can accomplish everything and more with Freemarker build-ins. Here&#8217;s some examples how to format a java.util.Date type variable with Freemarker build-ins:</p>
<pre>${lastUpdated?string("yyyy-MM-dd HH:mm:ss zzzz")}
${lastUpdated?string("EEE, MMM d, ''yy")}
${lastUpdated?string("EEEE, MMMM dd, yyyy, hh:mm:ss a '('zzz')'")}</pre>
<p>You can find all the variables available for Freemarker templates from com.liferay.portal.freemarker.FreeMarkerVariables class and docroot/html/themes/_unstyled/init.ftl</p>
<h4><strong>Macro libraries</strong></h4>
<p>Most of the macros available to Velocity templates are also available for Freemarker templates. The only difference is the syntax how they are used. We provide a macro library with namespace liferay so that it won&#8217;t get mixed with your own macros. You can take a look at portal-impl/src/FTL_liferay.ftl to see full list of macros and use it as an example to build your own macros. Here are some commonly used macros:</p>
<pre>&lt;@liferay.css file_name=“some.css” /&gt;

&lt;@liferay.js file_name=“some.js” /&gt;

&lt;@liferay.language key=“my-key” /&gt;

&lt;@liferay.breadcrumb /&gt;

&lt;@liferay.docbar /&gt;</pre>
<h4><strong>Tag libraries</strong></h4>
<p>Yes, you read it correctly. You can use taglibs in your Freemarker templates. This is something unique to Freemarker and it is limited to only templates in themes. To import a portal taglib to your template just add following line to your template:</p>
<pre>&lt;#assign aui=PortalJspTagLibs["/WEB-INF/tld/liferay-aui.tld"]&gt;</pre>
<p>Now you can use any tag within that taglib just if it was a macro library. Here&#8217;s an example how to add a Alloy UI input field:</p>
<pre>&lt;@aui.input name=“aStringLiteral” label=“Test” /&gt;</pre>
<p>Have fun trying this out and if you find any glitches do report them to our <a href="http://issues.liferay.com/browse/LPS">issue tracker</a>.</p>
<p>This post was originally published on <a href="https://web.liferay.com/web/mika.koivisto/blog/-/blogs/using-freemarker-in-your-theme-templates">Liferay blog</a>.</p>
<div id="themify_builder_content-284" data-postid="284" class="themify_builder_content themify_builder_content-284 themify_builder themify_builder_front"></div>
<p><!-- /themify_builder_content --></p>
<p>The post <a href="https://mikakoivisto.fi/blog/2010/08/using-freemarker-in-your-theme-templates/">Using Freemarker in your theme templates</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		<enclosure length="0" type="" url=""/>

		<post-id xmlns="com-wordpress:feed-additions:1">43292</post-id>	</item>
		<item>
		<title>Liferay Maven SDK</title>
		<link>https://web.liferay.com/web/mika.koivisto/blog/-/blogs/liferay-maven-sdk_1?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=liferay-maven-sdk</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Tue, 15 Dec 2009 11:16:53 +0000</pubDate>
				<guid isPermaLink="false">https://web.liferay.com/web/mika.koivisto/blog/-/blogs/liferay-maven-sdk_1</guid>

					<description><![CDATA[<p>Starting to recover from jetlag after a two week trip Los Angeles and Liferay retreat. One of the things we finally made some progress during the developer retreat &#160;is providing official maven artifacts for Liferay as well as porting our plugins sdk to Maven. Things are not quite completed but I will provide some instructions here for all early adopters.</p>
<p>So our goal is to provide our CE releases through our own public repository as well as provide means for our EE customers to install the EE versions artifacts to their local maven repository.</p>
<p>If you have ever worked with enterprise projects using maven you already know how important a local maven repository and proxy is. For those not so familiar with Maven a proxy is a server that proxies your requests to public Maven repositories and caches the artifacts locally for faster and more reliable access. Most maven proxies can also host private repositories used for hosting your company's private artifacts. Having a local proxy / repository makes your maven builds much faster and more reliable than accessing remote repositories that might even sometimes be unavailable.</p>
<h4>1. Installing a maven proxy / repository</h4>
<p>First step is to install and setup Nexus. Nexus is a open source maven repository manager that can proxy to other repositories as well as host repositories. If you just want to try things locally you can skip this step.</p>
<ol>
<li>Download latest <a href="http://nexus.sonatype.org/download-nexus.html">Nexus</a> such as nexus-webapp-1.4.0-bundle.zip</li>
<li>Follow the installation directions of the Nexus book http://nexus.sonatype.org/documentation.html</li>
<li>Startup nexus</li>
<li>Open your browser to your newly created nexus (if you installed it locally it could be accessed by opening http://localhost:8080/nexus)</li>
<li>Login as administrator (default login is admin / admin123)</li>
<li>Go to Repositories and click Add -&#62; Hosted Repository</li>
<li>Give the repository following information and click save
<ul>
<li>Repository ID: liferay-ce-releases</li>
<li>Repostory Name: Liferay CE Release Repository</li>
<li>Provider: Maven2 Repository</li>
<li>Repository Policy: Release</li>
</ul>
</li>
<li>Create another hosted repository with following information
<ul>
<li>Repository ID: liferay-ce-snapshots</li>
<li>Repository Name: Liferay CE Snapshot Repository</li>
<li>Provider: Maven2 Repository</li>
<li>Repository Policy: Snapshot</li>
</ul>
</li>
</ol>
<p>Now you have a repository ready for Liferay's Maven artifacts. Next step is to configure your maven to be able to upload artifacts to that repository.</p>
<h4>&#160;2. Configuring Maven Settings</h4>
<p>Open your $HOME/.m2/settings.xml (if the file does not exist create it). Add the servers segment to your settings.xml</p>
<pre>
&#60;?xml version="1.0" encoding="UTF-8"?&#62;
&#60;settings&#62;
     &#60;servers&#62;
          &#60;server&#62;
               &#60;id&#62;liferay&#60;/id&#62;
               &#60;username&#62;admin&#60;/username&#62;
               &#60;password&#62;admin123&#60;/password&#62;
          &#60;/server&#62;
     &#60;/servers&#62;
&#60;/settings&#62;</pre>
<p>You might also want to make your Nexus as your maven proxy. To do that just add following xml segment to your settings.xml right before servers element.</p>
<pre>
&#60;mirrors&#62;
     &#60;mirror&#62;
          &#60;id&#62;local&#60;/id&#62;
          &#60;name&#62;Local mirror repository&#60;/name&#62;
          &#60;url&#62;http://localhost:8080/nexus/content/groups/public&#60;/url&#62;
          &#60;mirrorOf&#62;*&#60;/mirrorOf&#62;
     &#60;/mirror&#62;
&#60;/mirrors&#62;
</pre>
<h4>3. Installing Liferay Artifacts to Repository</h4>
<p>Next we will install the Liferay Maven artifacts to your repository. First you need to checkout Liferay code from the SVN.&#160;</p>
<p><code>svn --username guest co svn://svn.liferay.com/repos/public/portal/trunk portal-trunk</code></p>
<p>Guest user does not require password.</p>
<p>Then create a release.${username}.properties file and add</p>
<p><code>maven.url=http://localhost:8080/nexus/content/repositories/liferay-ce-snapshots</code></p>
<p>Build Liferay artifacts by running</p>
<p><code>ant clean start jar</code></p>
<p>Now you can deploy the Liferay artifacts to your maven repository by running</p>
<p><code>ant -f build-maven.xml deploy-artifacts</code></p>
<p>If you only want to have them locally without a maven repository you can run the install task instead of deploy</p>
<p><code>ant -f build-maven.xml install-artifacts</code></p>
<p>Now you can add Liferay dependencies to your maven project. Following artifacts are available:</p>
<pre>
&#60;dependency&#62;
	&#60;groupId&#62;com.liferay.portal&#60;/groupId&#62;
	&#60;artifactId&#62;portal-client&#60;/artifactId&#62;
	&#60;version&#62;5.3.0-SNAPSHOT&#60;/version&#62;
&#60;/dependency&#62;
&#60;dependency&#62;
	&#60;groupId&#62;com.liferay.portal&#60;/groupId&#62;
	&#60;artifactId&#62;portal-impl&#60;/artifactId&#62;
	&#60;version&#62;5.3.0-SNAPSHOT&#60;/version&#62;
	&#60;scope&#62;provided&#60;/scope&#62;
&#60;/dependency&#62;
&#60;dependency&#62;
	&#60;groupId&#62;com.liferay.portal&#60;/groupId&#62;
	&#60;artifactId&#62;portal-kernel&#60;/artifactId&#62;
	&#60;version&#62;5.3.0-SNAPSHOT&#60;/version&#62;
	&#60;scope&#62;provided&#60;/scope&#62;
&#60;/dependency&#62;
&#60;dependency&#62;
	&#60;groupId&#62;com.liferay.portal&#60;/groupId&#62;
	&#60;artifactId&#62;portal-service&#60;/artifactId&#62;
	&#60;version&#62;5.3.0-SNAPSHOT&#60;/version&#62;
	&#60;scope&#62;provided&#60;/scope&#62;
&#60;/dependency&#62;
&#60;dependency&#62;
	&#60;groupId&#62;com.liferay.portal&#60;/groupId&#62;
	&#60;artifactId&#62;portal-web&#60;/artifactId&#62;
	&#60;version&#62;5.3.0-SNAPSHOT&#60;/version&#62;
	&#60;scope&#62;provided&#60;/scope&#62;
&#60;/dependency&#62;
&#60;dependency&#62;
	&#60;groupId&#62;com.liferay.portal&#60;/groupId&#62;
	&#60;artifactId&#62;util-bridges&#60;/artifactId&#62;
	&#60;version&#62;5.3.0-SNAPSHOT&#60;/version&#62;
&#60;/dependency&#62;
&#60;dependency&#62;
	&#60;groupId&#62;com.liferay.portal&#60;/groupId&#62;
	&#60;artifactId&#62;util-java&#60;/artifactId&#62;
	&#60;version&#62;5.3.0-SNAPSHOT&#60;/version&#62;
&#60;/dependency&#62;
&#60;dependency&#62;
	&#60;groupId&#62;com.liferay.portal&#60;/groupId&#62;
	&#60;artifactId&#62;util-taglib&#60;/artifactId&#62;
	&#60;version&#62;5.3.0-SNAPSHOT&#60;/version&#62;
&#60;/dependency&#62;</pre>
<div>NOTE portal-impl and portal-web are provided for maven plugins and should never be added as dependency to your Liferay plugins.</div>
<h4>&#160;4. Installing the Liferay Maven SDK</h4>
<p>To take full advantage of Maven we are porting the functionality of out ant based Plugins SDK to Maven. To use it you need to install it locally.&#160;To install the Liferay maven plugins and archetypes go into support-maven folder and run</p>
<p><code>mvn install</code></p>
<p>Now the Liferay Maven SDK is installed and ready to use. We've implemented a portlet archetype and deployer plugin.</p>
<h4>5. Creating a Portlet Plugin</h4>
<p>Move to the folder where you want to create your portlet and run</p>
<p><code>mvn archetype:generate</code></p>
<p>From the list select liferay-portlet-archetype and provide your project groupId, artifactId and version for the portlet project.</p>
<p>You're portlet project's pom.xml has two properties liferay.auto.deploy.dir and liferay.version. These properties are usually moved to your parent pom.xml or settings.xml so that you don't have to adjust them for every single plugin you create. Set the liferay.auto.deploy.dir to point to the Liferay autodeploy directory of your Liferay bundle. This is where the deploy plugin will copy your portlet. Now you are ready deploy your newly created portlet. You can deploy it by running</p>
<p><code>mvn liferay:deploy</code></p>
<h4>6. Future Plans</h4>
<p>We are also in the process of adding archetypes for themes, hooks and layouts as well as providing portlet archetypes for different types of portlets like JSP, Spring MVC, JSF etc. I will blog about it once they are done.</p>
<p>A special thanks goes to Thiago Moreira and Brian Chan for making this possible. Also for the community and customers for putting pressure to have this done.</p>
<p>If you are using 5.2.3 CE and want to take advantage of Maven for building Liferay portlets Milen Dyankov a Liferay community member has done also great work on a Maven SDK for 5.2.3 CE. You can find more about it from <a href="http://wiki.github.com/azzazzel/liferay-maven-sdk">GitHub</a></p>
<p>The post <a href="https://web.liferay.com/web/mika.koivisto/blog/-/blogs/liferay-maven-sdk_1">Liferay Maven SDK</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Starting to recover from jetlag after a two week trip Los Angeles and Liferay retreat. One of the things we finally made some progress during the developer retreat &nbsp;is providing official maven artifacts for Liferay as well as porting our plugins sdk to Maven. Things are not quite completed but I will provide some instructions here for all early adopters.</p> <p>So our goal is to provide our CE releases through our own public repository as well as provide means for our EE customers to install the EE versions artifacts to their local maven repository.</p> <p>If you have ever worked with enterprise projects using maven you already know how important a local maven repository and proxy is. For those not so familiar with Maven a proxy is a server that proxies your requests to public Maven repositories and caches the artifacts locally for faster and more reliable access. Most maven proxies can also host private repositories used for hosting your company's private artifacts. Having a local proxy / repository makes your maven builds much faster and more reliable than accessing remote repositories that might even sometimes be unavailable.</p> <h4>1. Installing a maven proxy / repository</h4> <p>First step is to install and setup Nexus. Nexus is a open source maven repository manager that can proxy to other repositories as well as host repositories. If you just want to try things locally you can skip this step.</p> <ol>     <li>Download latest <a href="http://nexus.sonatype.org/download-nexus.html">Nexus</a> such as nexus-webapp-1.4.0-bundle.zip</li>     <li>Follow the installation directions of the Nexus book http://nexus.sonatype.org/documentation.html</li>     <li>Startup nexus</li>     <li>Open your browser to your newly created nexus (if you installed it locally it could be accessed by opening http://localhost:8080/nexus)</li>     <li>Login as administrator (default login is admin / admin123)</li>     <li>Go to Repositories and click Add -&gt; Hosted Repository</li>     <li>Give the repository following information and click save     <ul>         <li>Repository ID: liferay-ce-releases</li>         <li>Repostory Name: Liferay CE Release Repository</li>         <li>Provider: Maven2 Repository</li>         <li>Repository Policy: Release</li>     </ul></li>     <li>Create another hosted repository with following information     <ul>         <li>Repository ID: liferay-ce-snapshots</li>         <li>Repository Name: Liferay CE Snapshot Repository</li>         <li>Provider: Maven2 Repository</li>         <li>Repository Policy: Snapshot</li>     </ul></li> </ol> <p>Now you have a repository ready for Liferay's Maven artifacts. Next step is to configure your maven to be able to upload artifacts to that repository.</p> <h4>&nbsp;2. Configuring Maven Settings</h4> <p>Open your $HOME/.m2/settings.xml (if the file does not exist create it). Add the servers segment to your settings.xml</p> <pre>
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;settings&gt;
     &lt;servers&gt;
          &lt;server&gt;
               &lt;id&gt;liferay&lt;/id&gt;
               &lt;username&gt;admin&lt;/username&gt;
               &lt;password&gt;admin123&lt;/password&gt;
          &lt;/server&gt;
     &lt;/servers&gt;
&lt;/settings&gt;</pre> <p>You might also want to make your Nexus as your maven proxy. To do that just add following xml segment to your settings.xml right before servers element.</p> <pre>
&lt;mirrors&gt;
     &lt;mirror&gt;
          &lt;id&gt;local&lt;/id&gt;
          &lt;name&gt;Local mirror repository&lt;/name&gt;
          &lt;url&gt;http://localhost:8080/nexus/content/groups/public&lt;/url&gt;
          &lt;mirrorOf&gt;*&lt;/mirrorOf&gt;
     &lt;/mirror&gt;
&lt;/mirrors&gt;
</pre> <h4>3. Installing Liferay Artifacts to Repository</h4> <p>Next we will install the Liferay Maven artifacts to your repository. First you need to checkout Liferay code from the SVN.&nbsp;</p> <p><code>svn --username guest co svn://svn.liferay.com/repos/public/portal/trunk portal-trunk</code></p> <p>Guest user does not require password.</p><p>Then create a release.${username}.properties file and add</p> <p><code>maven.url=http://localhost:8080/nexus/content/repositories/liferay-ce-snapshots</code></p> <p>Build Liferay artifacts by running</p><p><code>ant clean start jar</code></p> <p>Now you can deploy the Liferay artifacts to your maven repository by running</p> <p><code>ant -f build-maven.xml deploy-artifacts</code></p> <p>If you only want to have them locally without a maven repository you can run the install task instead of deploy</p> <p><code>ant -f build-maven.xml install-artifacts</code></p> <p>Now you can add Liferay dependencies to your maven project. Following artifacts are available:</p> <pre>
&lt;dependency&gt;
	&lt;groupId&gt;com.liferay.portal&lt;/groupId&gt;
	&lt;artifactId&gt;portal-client&lt;/artifactId&gt;
	&lt;version&gt;5.3.0-SNAPSHOT&lt;/version&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
	&lt;groupId&gt;com.liferay.portal&lt;/groupId&gt;
	&lt;artifactId&gt;portal-impl&lt;/artifactId&gt;
	&lt;version&gt;5.3.0-SNAPSHOT&lt;/version&gt;
	&lt;scope&gt;provided&lt;/scope&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
	&lt;groupId&gt;com.liferay.portal&lt;/groupId&gt;
	&lt;artifactId&gt;portal-kernel&lt;/artifactId&gt;
	&lt;version&gt;5.3.0-SNAPSHOT&lt;/version&gt;
	&lt;scope&gt;provided&lt;/scope&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
	&lt;groupId&gt;com.liferay.portal&lt;/groupId&gt;
	&lt;artifactId&gt;portal-service&lt;/artifactId&gt;
	&lt;version&gt;5.3.0-SNAPSHOT&lt;/version&gt;
	&lt;scope&gt;provided&lt;/scope&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
	&lt;groupId&gt;com.liferay.portal&lt;/groupId&gt;
	&lt;artifactId&gt;portal-web&lt;/artifactId&gt;
	&lt;version&gt;5.3.0-SNAPSHOT&lt;/version&gt;
	&lt;scope&gt;provided&lt;/scope&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
	&lt;groupId&gt;com.liferay.portal&lt;/groupId&gt;
	&lt;artifactId&gt;util-bridges&lt;/artifactId&gt;
	&lt;version&gt;5.3.0-SNAPSHOT&lt;/version&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
	&lt;groupId&gt;com.liferay.portal&lt;/groupId&gt;
	&lt;artifactId&gt;util-java&lt;/artifactId&gt;
	&lt;version&gt;5.3.0-SNAPSHOT&lt;/version&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
	&lt;groupId&gt;com.liferay.portal&lt;/groupId&gt;
	&lt;artifactId&gt;util-taglib&lt;/artifactId&gt;
	&lt;version&gt;5.3.0-SNAPSHOT&lt;/version&gt;
&lt;/dependency&gt;</pre> <div class="portlet-msg-alert">NOTE portal-impl and portal-web are provided for maven plugins and should never be added as dependency to your Liferay plugins.</div> <h4>&nbsp;4. Installing the Liferay Maven SDK</h4> <p>To take full advantage of Maven we are porting the functionality of out ant based Plugins SDK to Maven. To use it you need to install it locally.&nbsp;To install the Liferay maven plugins and archetypes go into support-maven folder and run</p> <p><code>mvn install</code></p> <p>Now the Liferay Maven SDK is installed and ready to use. We've implemented a portlet archetype and deployer plugin.</p> <h4>5. Creating a Portlet Plugin</h4> <p>Move to the folder where you want to create your portlet and run</p> <p><code>mvn archetype:generate</code></p> <p>From the list select liferay-portlet-archetype and provide your project groupId, artifactId and version for the portlet project.</p> <p>You're portlet project's pom.xml has two properties liferay.auto.deploy.dir and liferay.version. These properties are usually moved to your parent pom.xml or settings.xml so that you don't have to adjust them for every single plugin you create. Set the liferay.auto.deploy.dir to point to the Liferay autodeploy directory of your Liferay bundle. This is where the deploy plugin will copy your portlet. Now you are ready deploy your newly created portlet. You can deploy it by running</p> <p><code>mvn liferay:deploy</code></p> <h4>6. Future Plans</h4> <p>We are also in the process of adding archetypes for themes, hooks and layouts as well as providing portlet archetypes for different types of portlets like JSP, Spring MVC, JSF etc. I will blog about it once they are done.</p> <p>A special thanks goes to Thiago Moreira and Brian Chan for making this possible. Also for the community and customers for putting pressure to have this done.</p> <p>If you are using 5.2.3 CE and want to take advantage of Maven for building Liferay portlets Milen Dyankov a Liferay community member has done also great work on a Maven SDK for 5.2.3 CE. You can find more about it from <a href="http://wiki.github.com/azzazzel/liferay-maven-sdk">GitHub</a></p><p>The post <a href="https://web.liferay.com/web/mika.koivisto/blog/-/blogs/liferay-maven-sdk_1">Liferay Maven SDK</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		<enclosure length="0" type="" url=""/>

		<post-id xmlns="com-wordpress:feed-additions:1">209</post-id>	</item>
		<item>
		<title>SiteMinder integration is here</title>
		<link>https://mikakoivisto.fi/blog/2008/10/siteminder-integration-is-here/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=siteminder-integration-is-here</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Fri, 03 Oct 2008 21:37:15 +0000</pubDate>
				<category><![CDATA[Software & DevOps]]></category>
		<guid isPermaLink="false">https://web.liferay.com/web/mika.koivisto/blog/-/blogs/siteminder-integration-is-here</guid>

					<description><![CDATA[<p>You've been heard! Out of box SiteMinder integration is here.</p>
<p><a href="http://www.ca.com/us/internet-access-control.aspx">Computer Associate&#8217;s (CA) SiteMinder</a> is a centralized web access management system that enables user authentication and single sign-on, policy-based authorization, identity federation, and auditing of access to Web applications and portals.</p>
<p>Liferay has out of box SiteMinder integration as of recent Liferay 5.1.2 release. The integration is based on CAS integration and only supports authenticating with screenName. It also knows how to properly terminate SiteMinder session. SiteMinder is usually connected to a LDAP so this integration is also able to import users from LDAP.</p>
<p>You can enable it either throught portal-ext.properties or UI just like with CAS or OpenSSO.</p>
<p>Enabling from portal-ext.properties:</p>
<pre>
##
## SiteMinder
##

    #
    # Set this to true to enable CA SiteMinder single sign on. If set to true,
    # then the property "auto.login.hooks" must contain a reference to the class
    # com.liferay.portal.security.auth.SiteMinderAutoLogin and the
    # "logout.events.post" must have a reference to
    # com.liferay.portal.events.SiteMinderLogoutAction for logout to work.
    #
    siteminder.auth.enabled=true

    #
    # A user may be authenticated from SiteMinder and not yet exist in the
    # portal. Set this to true to automatically import users from LDAP if they
    # do not exist in the portal.
    #
    siteminder.import.from.ldap=true

    #
    # Set this to the name of the user header that SiteMinder passes to the
    # portal.
    #
    siteminder.user.header=SM_USER
</pre>
<p>Enabling from Liferay UI:</p></p>
<p>The post <a href="https://mikakoivisto.fi/blog/2008/10/siteminder-integration-is-here/">SiteMinder integration is here</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>You&#8217;ve been heard! Out of box SiteMinder integration is here.</p>
<p><a class="external" href="http://www.ca.com/us/internet-access-control.aspx">Computer Associate’s (CA) SiteMinder</a> is a centralized web access management system that enables user authentication and single sign-on, policy-based authorization, identity federation, and auditing of access to Web applications and portals.</p>
<p>Liferay has out of box SiteMinder integration as of recent Liferay 5.1.2 release. The integration is based on CAS integration and only supports authenticating with screenName. It also knows how to properly terminate SiteMinder session. SiteMinder is usually connected to a LDAP so this integration is also able to import users from LDAP.<span id="more-288"></span></p>
<p>You can enable it either throught portal-ext.properties or UI just like with CAS or OpenSSO.</p>
<p>Enabling from portal-ext.properties:</p>
<pre>##
## SiteMinder
##

    #
    # Set this to true to enable CA SiteMinder single sign on. If set to true,
    # then the property "auto.login.hooks" must contain a reference to the class
    # com.liferay.portal.security.auth.SiteMinderAutoLogin and the
    # "logout.events.post" must have a reference to
    # com.liferay.portal.events.SiteMinderLogoutAction for logout to work.
    #
    siteminder.auth.enabled=true

    #
    # A user may be authenticated from SiteMinder and not yet exist in the
    # portal. Set this to true to automatically import users from LDAP if they
    # do not exist in the portal.
    #
    siteminder.import.from.ldap=true

    #
    # Set this to the name of the user header that SiteMinder passes to the
    # portal.
    #
    siteminder.user.header=SM_USER
</pre>
<p>Enabling from Liferay UI:</p>
<p><a href="https://jguru.fi/wp-content/uploads/2008/10/liferay_siteminder_sso.jpeg"><img src="data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width='500'%20height='222'%20viewBox=%270%200%20500%20222%27%3E%3C/svg%3E" loading="lazy" data-lazy="1" decoding="async" class="tf_svg_lazy size-full wp-image-337 alignnone" data-tf-src="https://jguru.fi/wp-content/uploads/2008/10/liferay_siteminder_sso.jpeg" alt="" width="500" height="222" data-tf-srcset="https://jguru.fi/wp-content/uploads/2008/10/liferay_siteminder_sso.jpeg 500w, https://jguru.fi/wp-content/uploads/2008/10/liferay_siteminder_sso-300x133.jpeg 300w" data-tf-sizes="(max-width: 500px) 100vw, 500px" /><noscript><img decoding="async" class="size-full wp-image-337 alignnone" data-tf-not-load src="https://jguru.fi/wp-content/uploads/2008/10/liferay_siteminder_sso.jpeg" alt="" width="500" height="222" srcset="https://jguru.fi/wp-content/uploads/2008/10/liferay_siteminder_sso.jpeg 500w, https://jguru.fi/wp-content/uploads/2008/10/liferay_siteminder_sso-300x133.jpeg 300w" sizes="(max-width: 500px) 100vw, 500px" /></noscript></a></p>
<p>This post was originally published on <a href="https://web.liferay.com/web/mika.koivisto/blog/-/blogs/siteminder-integration-is-here">Liferay blog</a>.</p>
<div id="themify_builder_content-288" data-postid="288" class="themify_builder_content themify_builder_content-288 themify_builder themify_builder_front"></div>
<p><!-- /themify_builder_content --></p>
<p>The post <a href="https://mikakoivisto.fi/blog/2008/10/siteminder-integration-is-here/">SiteMinder integration is here</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		<enclosure length="0" type="" url=""/>

		<post-id xmlns="com-wordpress:feed-additions:1">43295</post-id>	</item>
		<item>
		<title>Configuring ActiveMQ 5 jms topic in Tomcat 6</title>
		<link>https://mikakoivisto.fi/blog/2007/12/configuring-activemq-5-jms-topic-in-tomcat-6/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=configuring-activemq-5-jms-topic-in-tomcat-6</link>
		
		<dc:creator><![CDATA[mika]]></dc:creator>
		<pubDate>Tue, 11 Dec 2007 14:15:27 +0000</pubDate>
				<category><![CDATA[Software & DevOps]]></category>
		<category><![CDATA[activemq]]></category>
		<category><![CDATA[jms]]></category>
		<category><![CDATA[spring]]></category>
		<guid isPermaLink="false">http://javaguru.fi/?p=26</guid>

					<description><![CDATA[<p>For some reason it is quite difficult to find a clear instruction on howto configure ActiveMQ jms topic in tomcat as a JNDI reference and the consume message from it into message driven pojo. I chose to use ActiveMQ 5 since it requires less dependent libraries to run than previous versions. Start by downloading ActiveMQ [&#8230;]</p>
<p>The post <a href="https://mikakoivisto.fi/blog/2007/12/configuring-activemq-5-jms-topic-in-tomcat-6/">Configuring ActiveMQ 5 jms topic in Tomcat 6</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>For some reason it is quite difficult to find a clear instruction on howto configure ActiveMQ jms topic in tomcat as a JNDI reference and the consume message from it into message driven pojo. I chose to use ActiveMQ 5 since it requires less dependent libraries to run than previous versions.</p>
<p>Start by downloading ActiveMQ 5.0.0 from <a href="http://activemq.apache.org/download.html">Apache ActiveMQ site</a></p>
<p>You need following jars to be located under CATALINA_HOME/lib:<br />
&#8211; activemq-core-5.0.0.jar<br />
&#8211; commons-logging-1.1.jar<br />
&#8211; geronimo-j2ee-management_1.0_spec-1.0.jar (or another jar that has javax.management apis)<br />
&#8211; geronimo-jms_1.1_spec-1.0.jar (or another jar that has javax.jms apis)<br />
&#8211; geronimo-jta_1.0.1B_spec-1.0.jar (or another jar that has javax.transaction apis)</p>
<p>You can find above libraries from ACTIVEMQ_HOME/lib</p>
<p>That configure the topic and connection factory to CATALINA_HOME/conf/server.xml</p>
<pre><code>&lt;Resource 
	name="jms/ConnectionFactory" 
	auth="Container" 
	type="org.apache.activemq.ActiveMQConnectionFactory" 
	description="JMS Connection Factory"
	factory="org.apache.activemq.jndi.JNDIReferenceFactory" 
	brokerURL="vm://localhost" brokerName="LocalActiveMQBroker"/&gt;

&lt;Resource 
	name="jms/SampleTopic" 
	auth="Container" 
	type="org.apache.activemq.command.ActiveMQTopic" 
	description="my Topic"
	factory="org.apache.activemq.jndi.JNDIReferenceFactory" 
	physicalName="SAMPLE.TOPIC"/&gt;</code></pre>
<p>Then you need to add resource-link to either CATALINA_HOME/conf/context.xml or webapps META-INF/context.xml</p>
<pre><code>&lt;Context&gt;
....
	&lt;ResourceLink global="jms/ConnectionFactory" name="jms/ConnectionFactory" type="javax.jms.ConnectionFactory"/&gt;
	&lt;ResourceLink global="jms/SampleTopic" name="jms/SampleTopic" type="javax.jms.Topic"/&gt;
&lt;/context&gt;
</code></pre>
<p>You also need to add a resource-ref to your webapps web.xml</p>
<pre><code>&lt;resource-ref&gt;
	&lt;res-ref-name&gt;jms/ConnectionFactory&lt;/res-ref-name&gt;
	&lt;res-type&gt;javax.jms.ConnectionFactory&lt;/res-type&gt;
	&lt;res-auth&gt;Container&lt;/res-auth&gt;
	&lt;res-sharing-scope&gt;Shareable&lt;/res-sharing-scope&gt;
&lt;/resource-ref&gt;	
&lt;resource-ref&gt;
	&lt;res-ref-name&gt;jms/SampleTopic&lt;/res-ref-name&gt;
	&lt;res-type&gt;javax.jms.Topic&lt;/res-type&gt;
	&lt;res-auth&gt;Container&lt;/res-auth&gt;
	&lt;res-sharing-scope&gt;Shareable&lt;/res-sharing-scope&gt;
&lt;/resource-ref&gt;</code></pre>
<p>Then configure message driven pojo with spring. You should notice that this is really a pojo that does not know anything about jms.</p>
<p>&nbsp;</p>
<pre><code>package fi.javaguru.mdp;

public class SamplePojo {

    public void doSomething(final String msg) {

        System.out.println("Got message: " + msg);
    }
}</code></pre>
<p>Spring configuration for consuming messages</p>
<pre><code>&lt;beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:jee="http://www.springframework.org/schema/jee"
	xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd"&gt;

    &lt;jee:jndi-lookup id="jmsConnectionFactory" jndi-name="jms/ConnectionFactory" resource-ref="true"/&gt;
    &lt;jee:jndi-lookup id="jmsTopic" jndi-name="jms/SampleTopic"
		resource-ref="true" proxy-interface="javax.jms.Topic"/&gt;

    &lt;bean id="pojo" class="fi.javaguru.mdp.SamplePojo" /&gt;
	
    &lt;bean id="listener" class="org.springframework.jms.listener.adapter.MessageListenerAdapter"&gt;
        &lt;property name="delegate" ref="pojo"/&gt;
        &lt;property name="defaultListenerMethod" value="doSomething"/&gt;
    &lt;/bean&gt;

    &lt;bean id="container" class="org.springframework.jms.listener.SimpleMessageListenerContainer"&gt;
        &lt;property name="connectionFactory" ref="jmsConnectionFactory"/&gt;
        &lt;property name="messageListener" ref="listener"/&gt;
        &lt;property name="destination" ref="jmsTopic"/&gt;
    &lt;/bean&gt;

&lt;/beans&gt;</code></pre>
<p>This sample assumes you are sending String messages to the topic. You could also send other objects as long as the consumer knows about those objects. Thats it for now. I will write another post later that will continue this sample with producing messages to a topic.</p>
<!--themify_builder_content-->
<div id="themify_builder_content-273" data-postid="273" class="themify_builder_content themify_builder_content-273 themify_builder tf_clear">
    </div>
<!--/themify_builder_content-->
<p>The post <a href="https://mikakoivisto.fi/blog/2007/12/configuring-activemq-5-jms-topic-in-tomcat-6/">Configuring ActiveMQ 5 jms topic in Tomcat 6</a> appeared first on <a href="https://mikakoivisto.fi">Mika Koivisto</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">273</post-id>	</item>
	</channel>
</rss>